mirror of
https://github.com/reactos/reactos.git
synced 2025-07-29 08:31:57 +00:00
sync kernel32 profile winetest with wine 1.1.19
svn path=/trunk/; revision=40489
This commit is contained in:
parent
75d63be3e0
commit
e08b53f9de
1 changed files with 363 additions and 34 deletions
|
@ -174,13 +174,17 @@ static void test_profile_sections(void)
|
|||
SetLastError(0xdeadbeef);
|
||||
ret = GetPrivateProfileSectionA( NULL, buf, sizeof(buf), testfile4 );
|
||||
ok( ret == 0, "expected return size 0, got %d\n", ret );
|
||||
ok( GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
|
||||
ok( GetLastError() == ERROR_INVALID_PARAMETER ||
|
||||
broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */
|
||||
"expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = GetPrivateProfileSectionA( "section1", buf, sizeof(buf), NULL );
|
||||
ok( ret == 0, "expected return size 0, got %d\n", ret );
|
||||
todo_wine
|
||||
ok( GetLastError() == ERROR_FILE_NOT_FOUND, "expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
|
||||
ok( GetLastError() == ERROR_FILE_NOT_FOUND ||
|
||||
broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */
|
||||
"expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
|
||||
|
||||
/* And a real one */
|
||||
SetLastError(0xdeadbeef);
|
||||
|
@ -190,7 +194,9 @@ static void test_profile_sections(void)
|
|||
ok( ret == 35 && !strcmp( buf, "name1=val1,name2=,name3,name4=val4"), "wrong section returned(%d): %s\n",
|
||||
ret, buf);
|
||||
ok( buf[ret-1] == 0 && buf[ret] == 0, "returned buffer not terminated with double-null\n" );
|
||||
ok( GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", GetLastError());
|
||||
ok( GetLastError() == ERROR_SUCCESS ||
|
||||
broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */
|
||||
"expected ERROR_SUCCESS, got %d\n", GetLastError());
|
||||
|
||||
DeleteFileA( testfile4 );
|
||||
}
|
||||
|
@ -215,33 +221,54 @@ static void test_profile_sections_names(void)
|
|||
CloseHandle( h);
|
||||
|
||||
/* Test with sufficiently large buffer */
|
||||
memset(buf, 0xc, sizeof(buf));
|
||||
ret = GetPrivateProfileSectionNamesA( buf, 29, testfile3 );
|
||||
ok( ret == 27, "expected return size 27, got %d\n", ret );
|
||||
ok( buf[ret-1] == 0 && buf[ret] == 0, "returned buffer not terminated with double-null\n" );
|
||||
|
||||
ok( ret == 27 ||
|
||||
broken(ret == 28), /* Win9x, WinME */
|
||||
"expected return size 27, got %d\n", ret );
|
||||
ok( (buf[ret-1] == 0 && buf[ret] == 0) ||
|
||||
broken(buf[ret-1] == 0 && buf[ret-2] == 0), /* Win9x, WinME */
|
||||
"returned buffer not terminated with double-null\n" );
|
||||
|
||||
/* Test with exactly fitting buffer */
|
||||
memset(buf, 0xc, sizeof(buf));
|
||||
ret = GetPrivateProfileSectionNamesA( buf, 28, testfile3 );
|
||||
ok( ret == 26, "expected return size 26, got %d\n", ret );
|
||||
ok( buf[ret+1] == 0 && buf[ret] == 0, "returned buffer not terminated with double-null\n" );
|
||||
|
||||
ok( ret == 26 ||
|
||||
broken(ret == 28), /* Win9x, WinME */
|
||||
"expected return size 26, got %d\n", ret );
|
||||
todo_wine
|
||||
ok( (buf[ret+1] == 0 && buf[ret] == 0) || /* W2K3 and higher */
|
||||
broken(buf[ret+1] == 0xc && buf[ret] == 0) || /* NT4, W2K, WinXP */
|
||||
broken(buf[ret-1] == 0 && buf[ret-2] == 0), /* Win9x, WinME */
|
||||
"returned buffer not terminated with double-null\n" );
|
||||
|
||||
/* Test with a buffer too small */
|
||||
memset(buf, 0xc, sizeof(buf));
|
||||
ret = GetPrivateProfileSectionNamesA( buf, 27, testfile3 );
|
||||
ok( ret == 25, "expected return size 25, got %d\n", ret );
|
||||
ok( buf[ret+1] == 0 && buf[ret] == 0, "returned buffer not terminated with double-null\n" );
|
||||
|
||||
/* Win9x and WinME only fills the buffer with complete section names (double-null terminated) */
|
||||
count = strlen("section1") + sizeof(CHAR) + strlen("section2");
|
||||
todo_wine
|
||||
ok( (buf[ret+1] == 0 && buf[ret] == 0) ||
|
||||
broken(buf[count] == 0 && buf[count+1] == 0), /* Win9x, WinME */
|
||||
"returned buffer not terminated with double-null\n" );
|
||||
|
||||
/* Tests on nonexistent file */
|
||||
memset(buf, 0xcc, sizeof(buf));
|
||||
memset(buf, 0xc, sizeof(buf));
|
||||
ret = GetPrivateProfileSectionNamesA( buf, 10, ".\\not_here.ini" );
|
||||
ok( ret == 0, "expected return size 0, got %d\n", ret );
|
||||
ok( ret == 0 ||
|
||||
broken(ret == 1), /* Win9x, WinME */
|
||||
"expected return size 0, got %d\n", ret );
|
||||
ok( buf[0] == 0, "returned buffer not terminated with null\n" );
|
||||
ok( buf[1] != 0, "returned buffer terminated with double-null\n" );
|
||||
|
||||
/* Test with sufficiently large buffer */
|
||||
SetLastError(0xdeadbeef);
|
||||
memset(bufW, 0xcc, sizeof(bufW));
|
||||
ret = GetPrivateProfileSectionNamesW( bufW, 29, testfile3W );
|
||||
if (ret == 0 && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED))
|
||||
{
|
||||
skip("GetPrivateProfileSectionNamesW is not implemented\n");
|
||||
win_skip("GetPrivateProfileSectionNamesW is not implemented\n");
|
||||
DeleteFileA( testfile3 );
|
||||
return;
|
||||
}
|
||||
|
@ -249,11 +276,15 @@ static void test_profile_sections_names(void)
|
|||
ok( bufW[ret-1] == 0 && bufW[ret] == 0, "returned buffer not terminated with double-null\n" );
|
||||
|
||||
/* Test with exactly fitting buffer */
|
||||
memset(bufW, 0xcc, sizeof(bufW));
|
||||
ret = GetPrivateProfileSectionNamesW( bufW, 28, testfile3W );
|
||||
ok( ret == 26, "expected return size 26, got %d\n", ret );
|
||||
ok( bufW[ret+1] == 0 && bufW[ret] == 0, "returned buffer not terminated with double-null\n" );
|
||||
|
||||
ok( (bufW[ret+1] == 0 && bufW[ret] == 0) || /* W2K3 and higher */
|
||||
broken(bufW[ret+1] == 0xcccc && bufW[ret] == 0), /* NT4, W2K, WinXP */
|
||||
"returned buffer not terminated with double-null\n" );
|
||||
|
||||
/* Test with a buffer too small */
|
||||
memset(bufW, 0xcc, sizeof(bufW));
|
||||
ret = GetPrivateProfileSectionNamesW( bufW, 27, testfile3W );
|
||||
ok( ret == 25, "expected return size 25, got %d\n", ret );
|
||||
ok( bufW[ret+1] == 0 && bufW[ret] == 0, "returned buffer not terminated with double-null\n" );
|
||||
|
@ -346,8 +377,11 @@ static void test_profile_existing(void)
|
|||
ok(INVALID_HANDLE_VALUE != h, "%d: CreateFile failed\n",i);
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = GetPrivateProfileStringA(SECTION, KEY, NULL, buffer, MAX_PATH, testfile2);
|
||||
/* Win9x and WinME returns 0 for all cases except the first one */
|
||||
if (!pe[i].read_error)
|
||||
ok( ret, "%d: GetPrivateProfileString failed with error %u\n", i, GetLastError() );
|
||||
ok( ret ||
|
||||
broken(!ret && GetLastError() == 0xdeadbeef), /* Win9x, WinME */
|
||||
"%d: GetPrivateProfileString failed with error %u\n", i, GetLastError() );
|
||||
else
|
||||
ok( !ret, "%d: GetPrivateProfileString succeeded\n", i );
|
||||
CloseHandle(h);
|
||||
|
@ -355,7 +389,7 @@ static void test_profile_existing(void)
|
|||
ok( DeleteFile(testfile2), "delete failed\n" );
|
||||
}
|
||||
|
||||
static void test_profile_delete_on_close()
|
||||
static void test_profile_delete_on_close(void)
|
||||
{
|
||||
static CHAR testfile[] = ".\\testwine5.ini";
|
||||
HANDLE h;
|
||||
|
@ -368,8 +402,11 @@ static void test_profile_delete_on_close()
|
|||
"Cannot write test file: %x\n", GetLastError() );
|
||||
ok( size == sizeof contents - 1, "Test file: partial write\n");
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
res = GetPrivateProfileInt(SECTION, KEY, 0, testfile);
|
||||
ok( res == 123, "Got %d instead of 123\n", res);
|
||||
ok( res == 123 ||
|
||||
broken(res == 0 && GetLastError() == ERROR_SHARING_VIOLATION), /* Win9x, WinME */
|
||||
"Got %d instead of 123\n", res);
|
||||
|
||||
/* This also deletes the file */
|
||||
CloseHandle(h);
|
||||
|
@ -389,8 +426,11 @@ static void test_profile_refresh(void)
|
|||
"Cannot write test file: %x\n", GetLastError() );
|
||||
ok( size == sizeof contents1 - 1, "Test file: partial write\n");
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
res = GetPrivateProfileInt(SECTION, KEY, 0, testfile);
|
||||
ok( res == 123, "Got %d instead of 123\n", res);
|
||||
ok( res == 123 ||
|
||||
broken(res == 0 && GetLastError() == ERROR_SHARING_VIOLATION), /* Win9x, WinME */
|
||||
"Got %d instead of 123\n", res);
|
||||
|
||||
CloseHandle(h);
|
||||
|
||||
|
@ -402,8 +442,11 @@ static void test_profile_refresh(void)
|
|||
"Cannot write test file: %x\n", GetLastError() );
|
||||
ok( size == sizeof contents2 - 1, "Test file: partial write\n");
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
res = GetPrivateProfileInt(SECTION, KEY, 0, testfile);
|
||||
ok( res == 124, "Got %d instead of 124\n", res);
|
||||
ok( res == 124 ||
|
||||
broken(res == 0 && GetLastError() == 0xdeadbeef), /* Win9x, WinME */
|
||||
"Got %d instead of 124\n", res);
|
||||
|
||||
/* This also deletes the file */
|
||||
CloseHandle(h);
|
||||
|
@ -436,7 +479,7 @@ static BOOL emptystr_ok(CHAR emptystr[MAX_PATH])
|
|||
|
||||
static void test_GetPrivateProfileString(const char *content, const char *descript)
|
||||
{
|
||||
DWORD ret;
|
||||
DWORD ret, len;
|
||||
CHAR buf[MAX_PATH];
|
||||
CHAR def_val[MAX_PATH];
|
||||
CHAR path[MAX_PATH];
|
||||
|
@ -450,6 +493,18 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
|
||||
trace("test_GetPrivateProfileStringA: %s\n", descript);
|
||||
|
||||
if(!lstrcmpA(descript, "CR only"))
|
||||
{
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = GetPrivateProfileStringW(NULL, NULL, NULL,
|
||||
NULL, 0, NULL);
|
||||
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
|
||||
{
|
||||
win_skip("Win9x and WinME don't handle 'CR only' correctly\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
create_test_file(filename, content, lstrlenA(content));
|
||||
|
||||
/* Run this test series with caching. Wine won't cache profile
|
||||
|
@ -457,14 +512,19 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
Sleep(2500);
|
||||
|
||||
/* lpAppName is NULL */
|
||||
memset(buf, 0xc, sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA(NULL, "name1", "default",
|
||||
buf, MAX_PATH, filename);
|
||||
ok(ret == 18, "Expected 18, got %d\n", ret);
|
||||
ok(!memcmp(buf, "section1\0section2\0", ret + 1),
|
||||
"Expected \"section1\\0section2\\0\", got \"%s\"\n", buf);
|
||||
ok(ret == 18 ||
|
||||
broken(ret == 19), /* Win9x and WinME */
|
||||
"Expected 18, got %d\n", ret);
|
||||
len = lstrlenA("section1") + sizeof(CHAR) + lstrlenA("section2") + 2 * sizeof(CHAR);
|
||||
ok(!memcmp(buf, "section1\0section2\0\0", len),
|
||||
"Expected \"section1\\0section2\\0\\0\", got \"%s\"\n", buf);
|
||||
|
||||
/* lpAppName is empty */
|
||||
memset(buf, 0xc, sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA(emptystr, "name1", "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -473,6 +533,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(emptystr_ok(emptystr), "AppName modified\n");
|
||||
|
||||
/* lpAppName is missing */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("notasection", "name1", "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -480,14 +541,18 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
|
||||
|
||||
/* lpAppName is empty, lpDefault is NULL */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA(emptystr, "name1", NULL,
|
||||
buf, MAX_PATH, filename);
|
||||
ok(ret == 0, "Expected 0, got %d\n", ret);
|
||||
ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
|
||||
ok(!lstrcmpA(buf, "") ||
|
||||
broken(!lstrcmpA(buf, "kumquat")), /* Win9x, WinME */
|
||||
"Expected \"\", got \"%s\"\n", buf);
|
||||
ok(emptystr_ok(emptystr), "AppName modified\n");
|
||||
|
||||
/* lpAppName is empty, lpDefault is empty */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA(emptystr, "name1", "",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -496,6 +561,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(emptystr_ok(emptystr), "AppName modified\n");
|
||||
|
||||
/* lpAppName is empty, lpDefault has trailing blank characters */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
/* lpDefault must be writable (trailing blanks are removed inplace in win9x) */
|
||||
lstrcpyA(def_val, "default ");
|
||||
|
@ -506,6 +572,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(emptystr_ok(emptystr), "AppName modified\n");
|
||||
|
||||
/* lpAppName is empty, many blank characters in lpDefault */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
/* lpDefault must be writable (trailing blanks are removed inplace in win9x) */
|
||||
lstrcpyA(def_val, "one two ");
|
||||
|
@ -516,6 +583,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(emptystr_ok(emptystr), "AppName modified\n");
|
||||
|
||||
/* lpAppName is empty, blank character but not trailing in lpDefault */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA(emptystr, "name1", "one two",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -524,6 +592,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(emptystr_ok(emptystr), "AppName modified\n");
|
||||
|
||||
/* lpKeyName is NULL */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", NULL, "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -532,6 +601,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
"Expected \"name1\\0name2\\0name4\\0\", got \"%s\"\n", buf);
|
||||
|
||||
/* lpKeyName is empty */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", emptystr, "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -540,6 +610,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(emptystr_ok(emptystr), "KeyName modified\n");
|
||||
|
||||
/* lpKeyName is missing */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "notakey", "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -547,14 +618,18 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
|
||||
|
||||
/* lpKeyName is empty, lpDefault is NULL */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", emptystr, NULL,
|
||||
buf, MAX_PATH, filename);
|
||||
ok(ret == 0, "Expected 0, got %d\n", ret);
|
||||
ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
|
||||
ok(!lstrcmpA(buf, "") ||
|
||||
broken(!lstrcmpA(buf, "kumquat")), /* Win9x, WinME */
|
||||
"Expected \"\", got \"%s\"\n", buf);
|
||||
ok(emptystr_ok(emptystr), "KeyName modified\n");
|
||||
|
||||
/* lpKeyName is empty, lpDefault is empty */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", emptystr, "",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -563,6 +638,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(emptystr_ok(emptystr), "KeyName modified\n");
|
||||
|
||||
/* lpKeyName is empty, lpDefault has trailing blank characters */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
/* lpDefault must be writable (trailing blanks are removed inplace in win9x) */
|
||||
lstrcpyA(def_val, "default ");
|
||||
|
@ -580,13 +656,19 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
}
|
||||
|
||||
/* lpFileName is NULL */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name1", "default",
|
||||
buf, MAX_PATH, NULL);
|
||||
ok(ret == 7, "Expected 7, got %d\n", ret);
|
||||
ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
|
||||
ok(ret == 7 ||
|
||||
broken(ret == 0), /* Win9x, WinME */
|
||||
"Expected 7, got %d\n", ret);
|
||||
ok(!lstrcmpA(buf, "default") ||
|
||||
broken(!lstrcmpA(buf, "kumquat")), /* Win9x, WinME */
|
||||
"Expected \"default\", got \"%s\"\n", buf);
|
||||
|
||||
/* lpFileName is empty */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name1", "default",
|
||||
buf, MAX_PATH, "");
|
||||
|
@ -594,6 +676,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
|
||||
|
||||
/* lpFileName is nonexistent */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name1", "default",
|
||||
buf, MAX_PATH, "nonexistent");
|
||||
|
@ -601,6 +684,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
|
||||
|
||||
/* nSize is 0 */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name1", "default",
|
||||
buf, 0, filename);
|
||||
|
@ -608,6 +692,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "kumquat"), "Expected buf to be unchanged, got \"%s\"\n", buf);
|
||||
|
||||
/* nSize is exact size of output */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name1", "default",
|
||||
buf, 4, filename);
|
||||
|
@ -615,6 +700,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "val"), "Expected \"val\", got \"%s\"\n", buf);
|
||||
|
||||
/* nSize has room for NULL terminator */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name1", "default",
|
||||
buf, 5, filename);
|
||||
|
@ -622,6 +708,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf);
|
||||
|
||||
/* output is 1 character */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name4", "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -629,6 +716,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "a"), "Expected \"a\", got \"%s\"\n", buf);
|
||||
|
||||
/* output is 1 character, no room for NULL terminator */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name4", "default",
|
||||
buf, 1, filename);
|
||||
|
@ -636,22 +724,30 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
|
||||
|
||||
/* lpAppName is NULL, not enough room for final section name */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA(NULL, "name1", "default",
|
||||
buf, 16, filename);
|
||||
ok(ret == 14, "Expected 14, got %d\n", ret);
|
||||
ok(!memcmp(buf, "section1\0secti\0", ret + 1),
|
||||
"Expected \"section1\\0secti\\0\", got \"%s\"\n", buf);
|
||||
len = lstrlenA("section1") + 2 * sizeof(CHAR);
|
||||
todo_wine
|
||||
ok(!memcmp(buf, "section1\0secti\0\0", ret + 2) ||
|
||||
broken(!memcmp(buf, "section1\0\0", len)), /* Win9x, WinME */
|
||||
"Expected \"section1\\0secti\\0\\0\", got \"%s\"\n", buf);
|
||||
|
||||
/* lpKeyName is NULL, not enough room for final key name */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", NULL, "default",
|
||||
buf, 16, filename);
|
||||
ok(ret == 14, "Expected 14, got %d\n", ret);
|
||||
ok(!memcmp(buf, "name1\0name2\0na\0", ret + 1),
|
||||
"Expected \"name1\\0name2\\0na\\0\", got \"%s\"\n", buf);
|
||||
todo_wine
|
||||
ok(!memcmp(buf, "name1\0name2\0na\0\0", ret + 2) ||
|
||||
broken(!memcmp(buf, "name1\0name2\0n\0\0", ret + 1)), /* Win9x, WinME */
|
||||
"Expected \"name1\\0name2\\0na\\0\\0\", got \"%s\"\n", buf);
|
||||
|
||||
/* key value has quotation marks which are stripped */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name2", "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -659,6 +755,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "val2"), "Expected \"val2\", got \"%s\"\n", buf);
|
||||
|
||||
/* case does not match */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "NaMe1", "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -666,6 +763,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf);
|
||||
|
||||
/* only filename is used */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "NaMe1", "default",
|
||||
buf, MAX_PATH, "winetest.ini");
|
||||
|
@ -673,11 +771,19 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
|
||||
|
||||
GetWindowsDirectoryA(windir, MAX_PATH);
|
||||
GetTempFileNameA(windir, "pre", 0, path);
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = GetTempFileNameA(windir, "pre", 0, path);
|
||||
if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
|
||||
{
|
||||
skip("Not allowed to create a file in the Windows directory\n");
|
||||
DeleteFileA(filename);
|
||||
return;
|
||||
}
|
||||
tempfile = strrchr(path, '\\') + 1;
|
||||
create_test_file(path, content, lstrlenA(content));
|
||||
|
||||
/* only filename is used, file exists in windows directory */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "NaMe1", "default",
|
||||
buf, MAX_PATH, tempfile);
|
||||
|
@ -685,6 +791,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf);
|
||||
|
||||
/* successful case */
|
||||
memset(buf, 0xc,sizeof(buf));
|
||||
lstrcpyA(buf, "kumquat");
|
||||
ret = GetPrivateProfileStringA("section1", "name1", "default",
|
||||
buf, MAX_PATH, filename);
|
||||
|
@ -695,6 +802,227 @@ static void test_GetPrivateProfileString(const char *content, const char *descri
|
|||
DeleteFileA(filename);
|
||||
}
|
||||
|
||||
static DWORD timeout = 0;
|
||||
|
||||
static BOOL check_file_data(LPCSTR path, LPCSTR data)
|
||||
{
|
||||
HANDLE file;
|
||||
CHAR buf[MAX_PATH];
|
||||
DWORD size;
|
||||
BOOL ret;
|
||||
|
||||
/* Sleep() is needed on Win9x and WinME */
|
||||
if (timeout)
|
||||
Sleep(timeout);
|
||||
|
||||
file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
|
||||
if (file == INVALID_HANDLE_VALUE)
|
||||
return FALSE;
|
||||
|
||||
size = GetFileSize(file, NULL);
|
||||
buf[size] = '\0';
|
||||
ret = ReadFile(file, buf, size, &size, NULL);
|
||||
CloseHandle(file);
|
||||
if (!ret)
|
||||
return FALSE;
|
||||
|
||||
if (!*data && size != 0)
|
||||
return FALSE;
|
||||
|
||||
return !lstrcmpA(buf, data);
|
||||
}
|
||||
|
||||
static void test_WritePrivateProfileString(void)
|
||||
{
|
||||
BOOL ret;
|
||||
LPCSTR data;
|
||||
CHAR path[MAX_PATH];
|
||||
CHAR temp[MAX_PATH];
|
||||
|
||||
GetTempPathA(MAX_PATH, temp);
|
||||
GetTempFileNameA(temp, "wine", 0, path);
|
||||
DeleteFileA(path);
|
||||
|
||||
/* path is not created yet */
|
||||
|
||||
/* NULL lpAppName */
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = WritePrivateProfileStringA(NULL, "key", "string", path);
|
||||
ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
|
||||
broken(GetLastError() == ERROR_INVALID_PARAMETER) || /* NT4 */
|
||||
broken(GetLastError() == 0xdeadbeef), /* Win9x and WinME */
|
||||
"Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
|
||||
if (GetLastError() == 0xdeadbeef)
|
||||
timeout = 1000;
|
||||
ok(GetFileAttributesA(path) == INVALID_FILE_ATTRIBUTES,
|
||||
"Expected path to not exist\n");
|
||||
|
||||
GetTempFileNameA(temp, "wine", 0, path);
|
||||
|
||||
/* NULL lpAppName, path exists */
|
||||
data = "";
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = WritePrivateProfileStringA(NULL, "key", "string", path);
|
||||
ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
|
||||
broken(GetLastError() == ERROR_INVALID_PARAMETER) || /* NT4 */
|
||||
broken(GetLastError() == 0xdeadbeef), /* Win9x and WinME */
|
||||
"Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
DeleteFileA(path);
|
||||
|
||||
if (0)
|
||||
{
|
||||
/* empty lpAppName, crashes on NT4 and higher */
|
||||
data = "[]\r\n"
|
||||
"key=string\r\n";
|
||||
ret = WritePrivateProfileStringA("", "key", "string", path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
DeleteFileA(path);
|
||||
}
|
||||
|
||||
/* NULL lpKeyName */
|
||||
data = "";
|
||||
ret = WritePrivateProfileStringA("App", NULL, "string", path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
todo_wine
|
||||
{
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
}
|
||||
DeleteFileA(path);
|
||||
|
||||
if (0)
|
||||
{
|
||||
/* empty lpKeyName, crashes on NT4 and higher */
|
||||
data = "[App]\r\n"
|
||||
"=string\r\n";
|
||||
ret = WritePrivateProfileStringA("App", "", "string", path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
todo_wine
|
||||
{
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
}
|
||||
DeleteFileA(path);
|
||||
}
|
||||
|
||||
/* NULL lpString */
|
||||
data = "";
|
||||
ret = WritePrivateProfileStringA("App", "key", NULL, path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
todo_wine
|
||||
{
|
||||
ok(check_file_data(path, data) ||
|
||||
(broken(GetFileAttributesA(path) == INVALID_FILE_ATTRIBUTES)), /* Win9x and WinME */
|
||||
"File doesn't match\n");
|
||||
}
|
||||
DeleteFileA(path);
|
||||
|
||||
/* empty lpString */
|
||||
data = "[App]\r\n"
|
||||
"key=\r\n";
|
||||
ret = WritePrivateProfileStringA("App", "key", "", path);
|
||||
ok(ret == TRUE ||
|
||||
broken(!ret), /* Win9x and WinME */
|
||||
"Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data) ||
|
||||
(broken(GetFileAttributesA(path) == INVALID_FILE_ATTRIBUTES)), /* Win9x and WinME */
|
||||
"File doesn't match\n");
|
||||
DeleteFileA(path);
|
||||
|
||||
/* empty lpFileName */
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = WritePrivateProfileStringA("App", "key", "string", "");
|
||||
ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_ACCESS_DENIED ||
|
||||
broken(GetLastError() == ERROR_PATH_NOT_FOUND), /* Win9x and WinME */
|
||||
"Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
|
||||
|
||||
/* The resulting file will be X:\\%WINDIR%\\win1.tmp */
|
||||
GetWindowsDirectoryA(temp, MAX_PATH);
|
||||
GetTempFileNameA(temp, "win", 1, path);
|
||||
DeleteFileA(path);
|
||||
|
||||
/* relative path in lpFileName */
|
||||
data = "[App]\r\n"
|
||||
"key=string\r\n";
|
||||
ret = WritePrivateProfileStringA("App", "key", "string", "win1.tmp");
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
DeleteFileA(path);
|
||||
|
||||
GetTempPathA(MAX_PATH, temp);
|
||||
GetTempFileNameA(temp, "wine", 0, path);
|
||||
|
||||
/* build up an INI file */
|
||||
WritePrivateProfileStringA("App1", "key1", "string1", path);
|
||||
WritePrivateProfileStringA("App1", "key2", "string2", path);
|
||||
WritePrivateProfileStringA("App1", "key3", "string3", path);
|
||||
WritePrivateProfileStringA("App2", "key4", "string4", path);
|
||||
|
||||
/* make an addition and verify the INI */
|
||||
data = "[App1]\r\n"
|
||||
"key1=string1\r\n"
|
||||
"key2=string2\r\n"
|
||||
"key3=string3\r\n"
|
||||
"[App2]\r\n"
|
||||
"key4=string4\r\n"
|
||||
"[App3]\r\n"
|
||||
"key5=string5\r\n";
|
||||
ret = WritePrivateProfileStringA("App3", "key5", "string5", path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
|
||||
/* lpString is NULL, key2 key is deleted */
|
||||
data = "[App1]\r\n"
|
||||
"key1=string1\r\n"
|
||||
"key3=string3\r\n"
|
||||
"[App2]\r\n"
|
||||
"key4=string4\r\n"
|
||||
"[App3]\r\n"
|
||||
"key5=string5\r\n";
|
||||
ret = WritePrivateProfileStringA("App1", "key2", NULL, path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
|
||||
/* try to delete key2 again */
|
||||
data = "[App1]\r\n"
|
||||
"key1=string1\r\n"
|
||||
"key3=string3\r\n"
|
||||
"[App2]\r\n"
|
||||
"key4=string4\r\n"
|
||||
"[App3]\r\n"
|
||||
"key5=string5\r\n";
|
||||
ret = WritePrivateProfileStringA("App1", "key2", NULL, path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
|
||||
/* lpKeyName is NULL, App1 section is deleted */
|
||||
data = "[App2]\r\n"
|
||||
"key4=string4\r\n"
|
||||
"[App3]\r\n"
|
||||
"key5=string5\r\n";
|
||||
ret = WritePrivateProfileStringA("App1", NULL, "string1", path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
|
||||
/* lpString is not needed to delete a section */
|
||||
data = "[App3]\r\n"
|
||||
"key5=string5\r\n";
|
||||
ret = WritePrivateProfileStringA("App2", NULL, NULL, path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
|
||||
/* leave just the section */
|
||||
data = "[App3]\r\n";
|
||||
ret = WritePrivateProfileStringA("App3", "key5", NULL, path);
|
||||
ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
|
||||
ok(check_file_data(path, data), "File doesn't match\n");
|
||||
|
||||
DeleteFileA(path);
|
||||
}
|
||||
|
||||
START_TEST(profile)
|
||||
{
|
||||
test_profile_int();
|
||||
|
@ -720,4 +1048,5 @@ START_TEST(profile)
|
|||
"name4=a\r"
|
||||
"[section2]\r",
|
||||
"CR only");
|
||||
test_WritePrivateProfileString();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue