From 45b66285c38462bb57e8ab8a577f8df2dba15363 Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Thu, 15 Apr 2021 23:14:59 +1000 Subject: [PATCH] reg/tests: Refactor 'add' tests into registry types, keys and syntax checks. Signed-off-by: Hugh McMaster Signed-off-by: Alexandre Julliard --- programs/reg/tests/add.c | 253 ++++++++++++++++++++++++++------------- 1 file changed, 167 insertions(+), 86 deletions(-) diff --git a/programs/reg/tests/add.c b/programs/reg/tests/add.c index 30e5fe55667..8357e9ad0bc 100644 --- a/programs/reg/tests/add.c +++ b/programs/reg/tests/add.c @@ -204,12 +204,9 @@ void delete_value_(const char *file, unsigned line, const HKEY hkey, const char /* Unit tests */ -static void test_add(void) +static void test_command_syntax(void) { - HKEY hkey, hsubkey; - LONG err; - DWORD r, dword, type, size; - char buffer[22]; + DWORD r; delete_tree(HKEY_CURRENT_USER, KEY_BASE); verify_key_nonexist(HKEY_CURRENT_USER, KEY_BASE); @@ -226,19 +223,56 @@ static void test_add(void) run_reg_exe("reg add -H", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); - run_reg_exe("reg add HKCU\\" KEY_BASE " /f", &r); - ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + /* Duplicate switches */ + run_reg_exe("reg add HKCU\\" KEY_BASE " /v Wine /t REG_DWORD /d 0x1 /v Test /f", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg add HKCU\\" KEY_BASE " /v dup1 /t REG_DWORD /d 123 /f /t REG_SZ", &r); + ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), + "got exit code %d, expected 1\n", r); + + run_reg_exe("reg add HKCU\\" KEY_BASE " /v dup2 /t REG_DWORD /d 123 /f /d 456", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); run_reg_exe("reg add HKCU\\" KEY_BASE " /f /f", &r); ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - open_key(HKEY_CURRENT_USER, KEY_BASE, 0, &hkey); + run_reg_exe("reg add HKCU\\" KEY_BASE " /v Wine /ve", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + /* No /v argument */ + run_reg_exe("reg add HKCU\\" KEY_BASE " /v", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg add HKCU\\" KEY_BASE " /d Test /f /v", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + /* Test invalid switches */ + run_reg_exe("reg add HKCU\\" KEY_BASE " /v invalid1 /a", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg add HKCU\\" KEY_BASE " /v invalid2 /ae", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg add HKCU\\" KEY_BASE " /v invalid3 /", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg add HKCU\\" KEY_BASE " /v invalid4 -", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); /* Test empty type */ run_reg_exe("reg add HKCU\\" KEY_BASE " /v emptyType /t \"\" /d WineTest /f", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); +} + +static void test_key_formats(void) +{ + HKEY hkey; + DWORD r; + LONG err; + + add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey); - /* Test input key formats */ run_reg_exe("reg add \\HKCU\\" KEY_BASE "\\keytest0 /f", &r); ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r); verify_key_nonexist(hkey, "keytest0"); @@ -257,13 +291,19 @@ static void test_add(void) run_reg_exe("reg add HKCU\\" KEY_BASE "\\keytest3\\ /f", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_key(hkey, "keytest3"); - delete_key(hkey, "keytest3"); run_reg_exe("reg add HKCU\\" KEY_BASE "\\keytest4 /f", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_key(hkey, "keytest4"); - delete_key(hkey, "keytest4"); + run_reg_exe("reg add HKCU\\" KEY_BASE "\\https://winehq.org /f", &r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + verify_key(hkey, "https://winehq.org"); + + close_key(hkey); + delete_tree(HKEY_CURRENT_USER, KEY_BASE); + + /* Test validity of trailing backslash after system key */ run_reg_exe("reg add HKCU\\ /v Value1 /t REG_SZ /d foo /f", &r); todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); todo_wine verify_reg_nonexist(HKEY_CURRENT_USER, "Value1"); @@ -271,8 +311,44 @@ static void test_add(void) run_reg_exe("reg add HKEY_CURRENT_USER\\ /v Value2 /t REG_SZ /d bar /f", &r); todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); todo_wine verify_reg_nonexist(HKEY_CURRENT_USER, "Value2"); +} + +static void test_add(void) +{ + HKEY hkey, hsubkey; + DWORD r, dword; + + run_reg_exe("reg add HKCU\\" KEY_BASE " /f", &r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + + open_key(HKEY_CURRENT_USER, KEY_BASE, KEY_WRITE, &hkey); + + /* Test whether overwriting a registry key modifies existing keys and values */ + add_key(hkey, "Subkey", &hsubkey); + close_key(hsubkey); + add_value(hkey, "Test1", REG_SZ, "Value1", 7); + dword = 0x123; + add_value(hkey, "Test2", REG_DWORD, &dword, sizeof(dword)); + + run_reg_exe("reg add HKCU\\" KEY_BASE " /f", &r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + + verify_key(HKEY_CURRENT_USER, KEY_BASE); + verify_key(hkey, "Subkey"); + verify_reg(hkey, "Test1", REG_SZ, "Value1", 7, 0); + verify_reg(hkey, "Test2", REG_DWORD, &dword, sizeof(dword), 0); + + close_key(hkey); + delete_tree(HKEY_CURRENT_USER, KEY_BASE); +} + +static void test_reg_none(void) +{ + HKEY hkey; + DWORD r; + + add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey); - /* REG_NONE */ run_reg_exe("reg add HKCU\\" KEY_BASE " /v none0 /d deadbeef /t REG_NONE /f", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); verify_reg(hkey, "none0", REG_NONE, "d\0e\0a\0d\0b\0e\0e\0f\0\0", 18, 0); @@ -285,7 +361,17 @@ static void test_add(void) ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_reg(hkey, NULL, REG_NONE, "\0", 2, 0); - /* REG_SZ */ + close_key(hkey); + delete_key(HKEY_CURRENT_USER, KEY_BASE); +} + +static void test_reg_sz(void) +{ + HKEY hkey; + DWORD r; + + add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey); + run_reg_exe("reg add HKCU\\" KEY_BASE " /d WineTest /f", &r); ok(r == REG_EXIT_SUCCESS || broken(r == REG_EXIT_FAILURE /* WinXP */), "got exit code %d, expected 0\n", r); @@ -340,7 +426,26 @@ static void test_add(void) ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_reg(hkey, "\\0", REG_SZ, "Value", 6, 0); - /* REG_EXPAND_SZ */ + /* Test support for forward and back slashes in value names */ + run_reg_exe("reg add HKCU\\" KEY_BASE " /v count/up /d one/two/three /f", &r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + verify_reg(hkey, "count/up", REG_SZ, "one/two/three", 14, 0); + + run_reg_exe("reg add HKCU\\" KEY_BASE " /v \\foo\\bar /f", &r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + verify_reg(hkey, "\\foo\\bar", REG_SZ, "", 1, 0); + + close_key(hkey); + delete_key(HKEY_CURRENT_USER, KEY_BASE); +} + +static void test_reg_expand_sz(void) +{ + HKEY hkey; + DWORD r; + + add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey); + run_reg_exe("reg add HKCU\\" KEY_BASE " /v expand0 /t REG_EXpand_sz /d \"dead%PATH%beef\" /f", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_reg(hkey, "expand0", REG_EXPAND_SZ, "dead%PATH%beef", 15, 0); @@ -365,7 +470,19 @@ static void test_add(void) ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_reg(hkey, NULL, REG_EXPAND_SZ, "", 1, 0); - /* REG_BINARY */ + close_key(hkey); + delete_key(HKEY_CURRENT_USER, KEY_BASE); +} + +static void test_reg_binary(void) +{ + HKEY hkey; + DWORD r, dword, type, size; + char buffer[22]; + LONG err; + + add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey); + run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin0 /f", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_reg(hkey, "bin0", REG_BINARY, buffer, 0, 0); @@ -389,7 +506,7 @@ static void test_add(void) /* Remaining nibble prefixed */ buffer[0] = 0x0d; buffer[1] = 0xea; buffer[2] = 0xdb; buffer[3] = 0xee; buffer[4] = 0xf0; buffer[5] = 0xdd; - /* Remaining nibble suffixed on winXP */ + /* Remaining nibble suffixed on WinXP */ buffer[6] = 0xde; buffer[7] = 0xad; buffer[8] = 0xbe; buffer[9] = 0xef; buffer[10] = 0x0d; buffer[11] = 0xd0; size = 6; @@ -411,7 +528,18 @@ static void test_add(void) ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_reg(hkey, NULL, REG_BINARY, buffer, 0, 0); - /* REG_DWORD */ + close_key(hkey); + delete_key(HKEY_CURRENT_USER, KEY_BASE); +} + +static void test_reg_dword(void) +{ + HKEY hkey; + DWORD r, dword, type, size; + LONG err; + + add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey); + run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_DWORD /f /d 12345678", &r); ok(r == REG_EXIT_SUCCESS || broken(r == REG_EXIT_FAILURE /* WinXP */), "got exit code %d, expected 0\n", r); @@ -510,7 +638,18 @@ static void test_add(void) run_reg_exe("reg add HKCU\\" KEY_BASE " /ve /t REG_DWORD_BIG_ENDIAN /f", &r); ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %u, expected 1\n", r); - /* REG_MULTI_SZ */ + close_key(hkey); + delete_key(HKEY_CURRENT_USER, KEY_BASE); +} + +static void test_reg_multi_sz(void) +{ + HKEY hkey; + DWORD r; + char buffer[22]; + + add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey); + run_reg_exe("reg add HKCU\\" KEY_BASE " /v multi0 /t REG_MULTI_SZ /d \"three\\0little\\0strings\" /f", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); memcpy(buffer, "three\0little\0strings\0", 22); @@ -596,74 +735,8 @@ static void test_add(void) ok(r == REG_EXIT_SUCCESS, "got exit code %u, expected 0\n", r); verify_reg(hkey, NULL, REG_MULTI_SZ, buffer, 1, 0); - /* Test forward and back slashes */ - run_reg_exe("reg add HKCU\\" KEY_BASE "\\https://winehq.org /f", &r); - ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); - verify_key(hkey, "https://winehq.org"); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /v count/up /d one/two/three /f", &r); - ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); - verify_reg(hkey, "count/up", REG_SZ, "one/two/three", 14, 0); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /v \\foo\\bar /f", &r); - ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); - verify_reg(hkey, "\\foo\\bar", REG_SZ, "", 1, 0); - close_key(hkey); - delete_tree(HKEY_CURRENT_USER, KEY_BASE); - - /* Test duplicate switches */ - run_reg_exe("reg add HKCU\\" KEY_BASE " /v Wine /t REG_DWORD /d 0x1 /v Test /f", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /v dup1 /t REG_DWORD /d 123 /f /t REG_SZ", &r); - ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), - "got exit code %u, expected 1\n", r); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /v dup2 /t REG_DWORD /d 123 /f /d 456", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r); - - /* Multiple /v* switches */ - run_reg_exe("reg add HKCU\\" KEY_BASE " /v Wine /ve", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - - /* No /v argument */ - run_reg_exe("reg add HKCU\\" KEY_BASE " /v", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /d Test /f /v", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - - /* Test invalid switches */ - run_reg_exe("reg add HKCU\\" KEY_BASE " /v invalid1 /a", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /v invalid2 /ae", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /v invalid3 /", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /v invalid4 -", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %u, expected 1\n", r); - - /* Test whether overwriting a registry key modifies existing keys and values */ - add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey); - add_key(hkey, "Subkey", &hsubkey); - close_key(hsubkey); - add_value(hkey, "Test1", REG_SZ, "Value1", 7); - dword = 0x123; - add_value(hkey, "Test2", REG_DWORD, &dword, sizeof(dword)); - - run_reg_exe("reg add HKCU\\" KEY_BASE " /f", &r); - ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); - - verify_key(HKEY_CURRENT_USER, KEY_BASE); - verify_key(hkey, "Subkey"); - verify_reg(hkey, "Test1", REG_SZ, "Value1", 7, 0); - verify_reg(hkey, "Test2", REG_DWORD, &dword, sizeof(dword), 0); - - delete_tree(HKEY_CURRENT_USER, KEY_BASE); + delete_key(HKEY_CURRENT_USER, KEY_BASE); } START_TEST(add) @@ -675,5 +748,13 @@ START_TEST(add) return; } + test_command_syntax(); + test_key_formats(); test_add(); + test_reg_none(); + test_reg_sz(); + test_reg_expand_sz(); + test_reg_binary(); + test_reg_dword(); + test_reg_multi_sz(); }