advapi32/tests: Fix copy&paste typo
Guo Jian
orzhvs at gmail.com
Thu May 23 00:13:30 CDT 2013
Hi Andre,
According to my test plan of the registry merging project, I will add
new tests for HKCR. At first I tried to add them to the old code but I
find it become too long and hard-reading. I had to rewrite them to a
series of strict and neat tests, classified as read/write operations,
including keys & values enumerating and deleting. I used many
pre-definitions which make the test look fluent, but I'm not sure if
the code is acceptable.
http://newtestbot.winehq.org/JobDetails.pl?Key=942
static void test_classesroot(void)
{
DWORD res, len, i;
HKEY hkey;
char name[32];
#define CREATE_KEY(key, path) \
{ \
HKEY tmp; \
if ((res = RegCreateKeyExA( key, path, 0, NULL, 0, \
KEY_ENUMERATE_SUB_KEYS|KEY_SET_VALUE|KEY_QUERY_VALUE|KEY_CREATE_SUB_KEY,
\
NULL, &tmp, NULL )) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegCreateKeyExA %p\\%s failed with %08X\n", key,
path, res); \
return; \
} \
else \
{ \
RegCloseKey(tmp); \
} \
}
#define DELETE_KEY(key, path) \
{ \
DWORD res; \
if ((res = RegDeleteKey(key, path)) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegDeleteKey %p\\%s failed with %08X\n", key, path, res); \
return; \
} \
}
#define SET_VALUE(key, path, name, value) \
{ \
HKEY tmp; \
if ((res = RegOpenKeyExA( key, path, 0, \
KEY_SET_VALUE, &tmp )) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegOpenKeyExA %p\\%s failed with %08X\n", key, path, res); \
return; \
} \
else \
{ \
if ((res = RegSetValueEx( tmp, name, 0, REG_SZ, \
(CONST BYTE*)value, strlen(value) ))
!= ERROR_SUCCESS) \
{ \
ok(FALSE, "RegSetValueEx %p\\%s failed with %08X\n", tmp,
name, res); \
return; \
} \
RegCloseKey(tmp); \
} \
}
#define CHECK_EXIST_KEY(key, path) \
ok(exist_key(key, path), "key %p\\%s should exist\n", key, path);
#define CHECK_NOT_EXIST_KEY(key, path) \
ok(!exist_key(key, path), "key %p\\%s should exist\n", key, path);
#define CHECK_VALUE(key, path, name, value) \
{ \
HKEY tmp; \
if ((res = RegOpenKeyExA( key, path, 0, \
KEY_QUERY_VALUE, &tmp )) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegOpenKeyExA %p\\%s failed with %08X\n", key, path, res); \
return; \
} \
else \
{ \
char buf[32]; \
DWORD type = REG_SZ, size = sizeof(buf); \
if ((res = RegQueryValueEx( tmp, name, 0, &type, \
(BYTE*)buf, &size )) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegQueryValueEx %p\\%s failed with %08X\n",
tmp, name, res); \
return; \
} \
ok(!strcmp(value, buf), "%s expected '%s' but got '%s' in
%p\\%s\n", name, value, buf, key, path); \
RegCloseKey(tmp); \
} \
}
#define CHECK_NON_VALUE(key, path, name) \
{ \
HKEY tmp; \
if ((res = RegOpenKeyExA( key, path, 0, \
KEY_QUERY_VALUE, &tmp )) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegOpenKeyExA %p\\%s failed with %08X\n", key, path, res); \
return; \
} \
else \
{ \
char buf[32]; \
DWORD type = REG_SZ, size = sizeof(buf); \
if ((res = RegQueryValueEx( tmp, name, 0, &type, \
(BYTE*)buf, &size )) == ERROR_SUCCESS) \
{ \
ok(FALSE, "%s should not exist in %p\\%s\n", name, key, path); \
} \
else if (res != ERROR_FILE_NOT_FOUND) \
{ \
ok(FALSE, "RegQueryValueEx %p\\%s failed with %08X\n",
tmp, name, res); \
return; \
} \
RegCloseKey(tmp); \
} \
}
#define DELETE_VALUE(key, path, name) \
{ \
HKEY tmp; \
if ((res = RegOpenKeyExA( key, path, 0, \
KEY_SET_VALUE, &tmp )) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegOpenKeyExA %p\\%s failed with %08X\n", key, path, res); \
return; \
} \
else \
{ \
if ((res = RegDeleteValueA(tmp, name)) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegDeleteValue %s in %p\\%s failed with
%08X\n", name, key, path, res); \
return; \
} \
RegCloseKey(tmp); \
} \
}
#define CHECK_KEY_INFO(key, path, c1, c2) \
{ \
HKEY tmp; \
if ((res = RegOpenKeyExA( key, path, 0, \
KEY_QUERY_VALUE, &tmp )) != ERROR_SUCCESS) \
{ \
ok(FALSE, "RegOpenKeyExA %p\\%s failed with %08X\n", key, path, res); \
return; \
} \
else \
{ \
DWORD n1, n2; \
if (ERROR_SUCCESS != (res = RegQueryInfoKeyA( tmp, NULL, NULL, NULL, \
&n1, NULL, NULL,
&n2, NULL, NULL, NULL, NULL ))) \
{ \
ok(FALSE, "RegQueryInfoKeyA failed with %08X\n\n", res); \
return; \
} \
ok(n1 == c1, "subkey count expected %d but got %d in
%p\\%s\n", c1, n1, key, path); \
ok(n2 == c2, "value count expected %d but got %d in %p\\%s\n",
c2, n2, key, path); \
RegCloseKey(tmp); \
} \
}
/* test create_key priority */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
if ((res = RegOpenKeyExA( HKEY_CLASSES_ROOT, "WineTestCls", 0,
STANDARD_RIGHTS_READ, &hkey )) != ERROR_SUCCESS)
{
skip("classes merging not supported\n");
cleanup_classes();
return;
}
/* test create_key priority */
/* create from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CLASSES_ROOT, "WineTestCls");
CHECK_EXIST_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
/* create from hklm then hkcr */
cleanup_classes();
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_CLASSES_ROOT, "WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
/* create from hkcu then hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_CLASSES_ROOT, "WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
/* further test based on the below */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
if ((res = RegOpenKeyExA( HKEY_CLASSES_ROOT, "WineTestCls", 0,
KEY_CREATE_SUB_KEY, &hkey )) != ERROR_SUCCESS)
{
ok(FALSE, "RegOpenKeyExA %p\\%s failed with %08X\n", hkey,
"WineTestCls", res);
return;
}
/* create subkey under the handle opened from the key that exists
only in hkcu but not hklm */
CREATE_KEY(hkey, "subkey1");
RegCloseKey(hkey);
/* check that subkey is created in hklm,
proving that the handle from hkcr is not same as opened in hkcu,
even when it does not conflict with hklm */
CHECK_EXIST_KEY(HKEY_LOCAL_MACHINE,
"Software\\Classes\\WineTestCls\\subkey1");
CHECK_NOT_EXIST_KEY(HKEY_CURRENT_USER,
"Software\\Classes\\WineTestCls\\subkey1");
/* test delete_key priority */
/* create from hkcu and delete from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
DELETE_KEY(HKEY_CLASSES_ROOT, "WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
/* create from hklm and delete from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
DELETE_KEY(HKEY_CLASSES_ROOT, "WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
/* create from hkcu and hklm and delete twice from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
DELETE_KEY(HKEY_CLASSES_ROOT, "WineTestCls");
CHECK_EXIST_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
/* delete again */
DELETE_KEY(HKEY_CLASSES_ROOT, "WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CHECK_NOT_EXIST_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
/* test set_value priority */
/* set new value from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hkcr");
CHECK_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcr");
CHECK_NON_VALUE(HKEY_LOCAL_MACHINE,
"Software\\Classes\\WineTestCls", "val1");
/* set value from hkcu and reset value from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
SET_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hkcr");
CHECK_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcr");
CHECK_NON_VALUE(HKEY_LOCAL_MACHINE,
"Software\\Classes\\WineTestCls", "val1");
/* set value from hklm and reset value from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
SET_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hkcr");
CHECK_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcr");
CHECK_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
/* set value from hkcu and hklm and reset value from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
SET_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hkcr");
CHECK_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcr");
CHECK_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
/* set value from hklm in a key not conflict with hkcu and reset
value from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
SET_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hkcr");
CHECK_NOT_EXIST_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CHECK_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hkcr");
/* test delete_value priority, no need to test when not conflict */
/* set value from hkcu and hklm then delete twice from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
DELETE_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1");
CHECK_NON_VALUE(HKEY_CURRENT_USER,
"Software\\Classes\\WineTestCls", "val1");
CHECK_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
/* delete again */
DELETE_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1");
CHECK_NON_VALUE(HKEY_LOCAL_MACHINE,
"Software\\Classes\\WineTestCls", "val1");
/* test query_value priority, noneed to test when not conflict */
/* set value to hkcu and create the key in hklm then query from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CHECK_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hkcu");
/* set value to hklm and create the key in hkcu then query from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CHECK_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hklm");
/* set conflict value both to hkcu and hklm then query from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hklm");
CHECK_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hkcu");
/* set non conflict value both to hkcu and hklm then query from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val2", "hklm");
CHECK_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val1", "hkcu");
CHECK_VALUE(HKEY_CLASSES_ROOT, "WineTestCls", "val2", "hklm");
/* test query_info_key priority, no need to test when queried key
does not conflict */
/* check subkey and value count for conflict subkeys from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls\\subkey1");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls\\subkey1");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
CHECK_KEY_INFO(HKEY_CLASSES_ROOT, "WineTestCls", 1, 1);
/* check subkey and value count for non conflict subkeys from hkcr */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls\\subkey1");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls\\subkey2");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val2", "hkcu");
CHECK_KEY_INFO(HKEY_CLASSES_ROOT, "WineTestCls", 2, 2);
/* test enum_key priority, no need to test when enumerated key
does not conflict */
/* create subkeys and values in hkcu and hklm */
cleanup_classes();
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls\\subkey1");
CREATE_KEY(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls\\subkey3");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val1", "hkcu");
SET_VALUE(HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls",
"val3", "hkcu");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls\\subkey3");
CREATE_KEY(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls\\subkey2");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val3", "hkcu");
SET_VALUE(HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls",
"val2", "hkcu");
/* check the count */
CHECK_KEY_INFO(HKEY_CLASSES_ROOT, "WineTestCls", 3, 3);
if ((res = RegOpenKeyExA( HKEY_CLASSES_ROOT, "WineTestCls", 0,
KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE,
&hkey )) != ERROR_SUCCESS)
{
ok(FALSE, "RegOpenKeyExA %p\\%s failed with %08X\n", hkey,
"WineTestCls", res);
return;
}
/* check the names and order of subkeys when enumerating */
i = 0;
len = sizeof(name);
while (ERROR_SUCCESS == (res = RegEnumKeyExA(hkey, i, name, &len,
NULL, NULL, NULL, NULL)))
{
++ i;
if (i > 3)
{
ok(FALSE, "got extra subkey name %s\n", name);
}
else if (strncmp(name, "subkey", 6) || name[6] != (i + '0') || name[7])
{
ok(FALSE, "got unexpected subkey name or order %s at index
%d\n", name, i);
}
len = sizeof(name);
}
if (res != ERROR_NO_MORE_ITEMS)
{
ok(FALSE, "RegEnumKeyExA failed with %08X\n", res);
return;
}
if (i < 3)
{
ok(FALSE, "expected 3 subkeys but got only %d\n", i);
}
/* check the names and order of values when enumerating */
i = 0;
len = sizeof(name);
while (ERROR_SUCCESS == (res = RegEnumValueA(hkey, i, name, &len,
NULL, NULL, NULL, NULL)))
{
++ i;
if (i > 3)
{
ok(FALSE, "got extra value name %s\n", name);
}
else if (strncmp(name, "val", 3) || name[3] != (i + '0') || name[4])
{
ok(FALSE, "got unexpected value name or order %s at index
%d\n", name, i);
}
len = sizeof(name);
}
if (res != ERROR_NO_MORE_ITEMS)
{
ok(FALSE, "RegEnumValueA failed with %08X\n", res);
return;
}
if (i < 3)
{
ok(FALSE, "expected 3 value but got only %d\n", i);
}
RegCloseKey(hkey);
cleanup_classes();
}
--
Regards,
Guo Jian
More information about the wine-devel
mailing list