Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/tests/query.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/programs/reg/tests/query.c b/programs/reg/tests/query.c index e2b438f8c92..3ae79d05524 100644 --- a/programs/reg/tests/query.c +++ b/programs/reg/tests/query.c @@ -47,24 +47,33 @@ static void test_query(void)
/* Create a test key */ add_key(HKEY_CURRENT_USER, KEY_BASE, &key); + add_value(key, "Test", REG_SZ, hello, sizeof(hello)); + add_value(key, "Wine", REG_DWORD, &dword1, sizeof(dword1)); + + run_reg_exe("reg query HKCU\" KEY_BASE " /v", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg query HKCU\" KEY_BASE " /v Missing", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg query HKCU\" KEY_BASE " /v Test /v Wine", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg query HKCU\" KEY_BASE " /v Test /ve", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + + run_reg_exe("reg query HKCU\" KEY_BASE " /s /s", &r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
run_reg_exe("reg query HKCU\" KEY_BASE " /ve", &r); ok(r == REG_EXIT_SUCCESS || broken(r == REG_EXIT_FAILURE /* WinXP */), "got exit code %d, expected 0\n", r);
- add_value(key, "Test", REG_SZ, hello, sizeof(hello)); - add_value(key, "Wine", REG_DWORD, &dword1, sizeof(dword1)); add_value(key, NULL, REG_SZ, empty1, sizeof(empty1));
run_reg_exe("reg query HKCU\" KEY_BASE, &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /v", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - - run_reg_exe("reg query HKCU\" KEY_BASE " /v Missing", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - run_reg_exe("reg query HKCU\" KEY_BASE " /v Test", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
@@ -74,12 +83,6 @@ static void test_query(void) run_reg_exe("reg query HKCU\" KEY_BASE " /ve", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /v Test /v Wine", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - - run_reg_exe("reg query HKCU\" KEY_BASE " /v Test /ve", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - /* Create a test subkey */ add_key(key, "Subkey", &subkey); add_value(subkey, "Test", REG_SZ, world, sizeof(world)); @@ -116,9 +119,6 @@ static void test_query(void) ok(r == REG_EXIT_SUCCESS || r == REG_EXIT_FAILURE /* WinXP */, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /s /s", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); - /* Clean-up, then query */ delete_key(key, "subkey"); close_key(key);
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/tests/query.c | 57 ++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 33 deletions(-)
diff --git a/programs/reg/tests/query.c b/programs/reg/tests/query.c index 3ae79d05524..d397f36fc09 100644 --- a/programs/reg/tests/query.c +++ b/programs/reg/tests/query.c @@ -21,14 +21,8 @@
static void test_query(void) { - DWORD r; + DWORD r, dword = 0x123; HKEY key, subkey; - const char hello[] = "Hello"; - const char world[] = "World"; - const char empty1[] = "Empty1"; - const char empty2[] = "Empty2"; - const DWORD dword1 = 0x123; - const DWORD dword2 = 0xabc;
delete_tree(HKEY_CURRENT_USER, KEY_BASE); verify_key_nonexist(HKEY_CURRENT_USER, KEY_BASE); @@ -47,8 +41,8 @@ static void test_query(void)
/* Create a test key */ add_key(HKEY_CURRENT_USER, KEY_BASE, &key); - add_value(key, "Test", REG_SZ, hello, sizeof(hello)); - add_value(key, "Wine", REG_DWORD, &dword1, sizeof(dword1)); + add_value(key, "Test1", REG_SZ, "Hello, World", 13); + add_value(key, "Test2", REG_DWORD, &dword, sizeof(dword));
run_reg_exe("reg query HKCU\" KEY_BASE " /v", &r); ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); @@ -56,65 +50,62 @@ static void test_query(void) run_reg_exe("reg query HKCU\" KEY_BASE " /v Missing", &r); ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /v Test /v Wine", &r); + run_reg_exe("reg query HKCU\" KEY_BASE " /v Test1 /v Test2", &r); ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /v Test /ve", &r); + run_reg_exe("reg query HKCU\" KEY_BASE " /v Test1 /ve", &r); ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
run_reg_exe("reg query HKCU\" KEY_BASE " /s /s", &r); ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+ run_reg_exe("reg query HKCU\" KEY_BASE, &r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + run_reg_exe("reg query HKCU\" KEY_BASE " /ve", &r); ok(r == REG_EXIT_SUCCESS || broken(r == REG_EXIT_FAILURE /* WinXP */), "got exit code %d, expected 0\n", r);
- add_value(key, NULL, REG_SZ, empty1, sizeof(empty1)); - - run_reg_exe("reg query HKCU\" KEY_BASE, &r); + run_reg_exe("reg query HKCU\" KEY_BASE " /v Test1", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /v Test", &r); + run_reg_exe("reg query HKCU\" KEY_BASE " /v Test2", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /v Wine", &r); - ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); - - run_reg_exe("reg query HKCU\" KEY_BASE " /ve", &r); - ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + add_value(key, "Wine", REG_SZ, "First instance", 15);
/* Create a test subkey */ add_key(key, "Subkey", &subkey); - add_value(subkey, "Test", REG_SZ, world, sizeof(world)); - add_value(subkey, "Wine", REG_DWORD, &dword2, sizeof(dword2)); - add_value(subkey, NULL, REG_SZ, empty2, sizeof(empty2)); - - close_key(subkey); + add_value(subkey, "Test3", REG_SZ, "Some string data", 16); + dword = 0xabc; + add_value(subkey, "Test4", REG_DWORD, &dword, sizeof(dword));
run_reg_exe("reg query HKCU\" KEY_BASE "\subkey", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE "\subkey /v Test", &r); + run_reg_exe("reg query HKCU\" KEY_BASE "\subkey /v Test3", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE "\subkey /v Wine", &r); + run_reg_exe("reg query HKCU\" KEY_BASE "\subkey /v Test4", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE "\subkey /ve", &r); - ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + add_value(subkey, "Wine", REG_SZ, "Second instance", 16);
/* Test recursion */ run_reg_exe("reg query HKCU\" KEY_BASE " /s", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /v Test /s", &r); - ok(r == REG_EXIT_SUCCESS || r == REG_EXIT_FAILURE /* WinXP */, - "got exit code %d, expected 0\n", r); - run_reg_exe("reg query HKCU\" KEY_BASE " /v Wine /s", &r); ok(r == REG_EXIT_SUCCESS || r == REG_EXIT_FAILURE /* WinXP */, "got exit code %d, expected 0\n", r);
+ add_value(key, NULL, REG_SZ, "Empty", 6); + add_value(subkey, NULL, REG_SZ, "Empty", 6); + close_key(subkey); + + run_reg_exe("reg query HKCU\" KEY_BASE "\subkey /ve", &r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + run_reg_exe("reg query HKCU\" KEY_BASE " /ve /s", &r); ok(r == REG_EXIT_SUCCESS || r == REG_EXIT_FAILURE /* WinXP */, "got exit code %d, expected 0\n", r);
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/tests/add.c | 4 -- programs/reg/tests/export.c | 2 - programs/reg/tests/query.c | 120 ++++++++++++++++++++++++++++++++-- programs/reg/tests/reg_test.h | 5 ++ 4 files changed, 120 insertions(+), 11 deletions(-)
diff --git a/programs/reg/tests/add.c b/programs/reg/tests/add.c index 2c5a8f34ce2..30e5fe55667 100644 --- a/programs/reg/tests/add.c +++ b/programs/reg/tests/add.c @@ -18,10 +18,6 @@
#include "reg_test.h"
-#define TODO_REG_TYPE (0x0001u) -#define TODO_REG_SIZE (0x0002u) -#define TODO_REG_DATA (0x0004u) - BOOL run_reg_exe_(const char *file, unsigned line, const char *cmd, DWORD *rc) { STARTUPINFOA si = {sizeof(STARTUPINFOA)}; diff --git a/programs/reg/tests/export.c b/programs/reg/tests/export.c index 5296ebb1e06..4e5ac4c71d9 100644 --- a/programs/reg/tests/export.c +++ b/programs/reg/tests/export.c @@ -18,8 +18,6 @@
#include "reg_test.h"
-#define TODO_REG_COMPARE (0x0008u) - #define compare_export(f,e,todo) compare_export_(__FILE__,__LINE__,f,e,todo) static BOOL compare_export_(const char *file, unsigned line, const char *filename, const char *expected, DWORD todo) diff --git a/programs/reg/tests/query.c b/programs/reg/tests/query.c index d397f36fc09..af0cc3848a4 100644 --- a/programs/reg/tests/query.c +++ b/programs/reg/tests/query.c @@ -19,10 +19,111 @@
#include "reg_test.h"
+static void read_from_pipe(HANDLE child_proc_stdout, BYTE *buf, DWORD buf_size) +{ + DWORD read, len = 0; + BOOL ret; + + while (1) + { + ret = ReadFile(child_proc_stdout, buf + len, buf_size - len, &read, NULL); + if (!ret || !read) break; + + len += read; + } + + buf[len] = 0; +} + +#define read_reg_output(c,b,s,r) read_reg_output_(__FILE__,__LINE__,c,b,s,r) +static BOOL read_reg_output_(const char *file, unsigned line, const char *cmd, + BYTE *buf, DWORD buf_size, DWORD *rc) +{ + SECURITY_ATTRIBUTES sa; + HANDLE pipe_stdout_rd, pipe_stdout_wr; + STARTUPINFOA si = {0}; + PROCESS_INFORMATION pi; + char cmdline[256]; + BOOL bret; + DWORD ret; + + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + + if (!CreatePipe(&pipe_stdout_rd, &pipe_stdout_wr, &sa, 0)) + return FALSE; + + if (!SetHandleInformation(pipe_stdout_rd, HANDLE_FLAG_INHERIT, 0)) + return FALSE; + + si.cb = sizeof(si); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = INVALID_HANDLE_VALUE; + si.hStdOutput = pipe_stdout_wr; + si.hStdError = INVALID_HANDLE_VALUE; + + strcpy(cmdline, cmd); + if (!CreateProcessA(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) + return FALSE; + + CloseHandle(pipe_stdout_wr); + + read_from_pipe(pipe_stdout_rd, buf, buf_size); + + ret = WaitForSingleObject(pi.hProcess, 10000); + if (ret == WAIT_TIMEOUT) + TerminateProcess(pi.hProcess, 1); + + bret = GetExitCodeProcess(pi.hProcess, rc); + lok(bret, "GetExitCodeProcess failed: %d\n", GetLastError()); + + CloseHandle(pipe_stdout_rd); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + return bret; +} + +#define compare_query(b,e,todo) compare_query_(__FILE__,__LINE__,b,e,todo) +static void compare_query_(const char *file, unsigned line, const BYTE *buf, + const char *expected, DWORD todo) +{ + todo_wine_if (todo & TODO_REG_COMPARE) + lok(!strcmp((char *)buf, expected), "query output does not match expected output\n"); +} + +/* Unit tests */ + static void test_query(void) { + const char *test1 = "\r\n" + "HKEY_CURRENT_USER\" KEY_BASE "\r\n" + " Test1 REG_SZ Hello, World\r\n" + " Test2 REG_DWORD 0x123\r\n\r\n"; + + const char *test2 = "\r\n" + "HKEY_CURRENT_USER\" KEY_BASE "\r\n" + " Test1 REG_SZ Hello, World\r\n\r\n"; + + const char *test3 = "\r\n" + "HKEY_CURRENT_USER\" KEY_BASE "\r\n" + " Test1 REG_SZ Hello, World\r\n" + " Test2 REG_DWORD 0x123\r\n" + " Wine REG_SZ First instance\r\n\r\n" + "HKEY_CURRENT_USER\" KEY_BASE "\subkey\r\n"; + + const char *test4 = "\r\n" + "HKEY_CURRENT_USER\" KEY_BASE "\subkey\r\n" + " Test3 REG_SZ Some string data\r\n" + " Test4 REG_DWORD 0xabc\r\n\r\n"; + + const char *test5 = "\r\n" + "HKEY_CURRENT_USER\" KEY_BASE "\subkey\r\n" + " Test4 REG_DWORD 0xabc\r\n\r\n"; + DWORD r, dword = 0x123; HKEY key, subkey; + BYTE buf[512];
delete_tree(HKEY_CURRENT_USER, KEY_BASE); verify_key_nonexist(HKEY_CURRENT_USER, KEY_BASE); @@ -59,15 +160,17 @@ static void test_query(void) run_reg_exe("reg query HKCU\" KEY_BASE " /s /s", &r); ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE, &r); + read_reg_output("reg query HKCU\" KEY_BASE, buf, sizeof(buf), &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + compare_query(buf, test1, 0);
run_reg_exe("reg query HKCU\" KEY_BASE " /ve", &r); ok(r == REG_EXIT_SUCCESS || broken(r == REG_EXIT_FAILURE /* WinXP */), "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE " /v Test1", &r); + read_reg_output("reg query HKCU\" KEY_BASE " /v Test1", buf, sizeof(buf), &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + compare_query(buf, test2, 0);
run_reg_exe("reg query HKCU\" KEY_BASE " /v Test2", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); @@ -75,19 +178,26 @@ static void test_query(void) add_value(key, "Wine", REG_SZ, "First instance", 15);
/* Create a test subkey */ - add_key(key, "Subkey", &subkey); + add_key(key, "subkey", &subkey); + + read_reg_output("reg query HKCU\" KEY_BASE, buf, sizeof(buf), &r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + compare_query(buf, test3, TODO_REG_COMPARE); + add_value(subkey, "Test3", REG_SZ, "Some string data", 16); dword = 0xabc; add_value(subkey, "Test4", REG_DWORD, &dword, sizeof(dword));
- run_reg_exe("reg query HKCU\" KEY_BASE "\subkey", &r); + read_reg_output("reg query HKCU\" KEY_BASE "\subkey", buf, sizeof(buf), &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + compare_query(buf, test4, 0);
run_reg_exe("reg query HKCU\" KEY_BASE "\subkey /v Test3", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- run_reg_exe("reg query HKCU\" KEY_BASE "\subkey /v Test4", &r); + read_reg_output("reg query HKCU\" KEY_BASE "\subkey /v Test4", buf, sizeof(buf), &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + compare_query(buf, test5, 0);
add_value(subkey, "Wine", REG_SZ, "Second instance", 16);
diff --git a/programs/reg/tests/reg_test.h b/programs/reg/tests/reg_test.h index 14afa02930c..6718e91096f 100644 --- a/programs/reg/tests/reg_test.h +++ b/programs/reg/tests/reg_test.h @@ -30,6 +30,11 @@ #define REG_EXIT_SUCCESS 0 #define REG_EXIT_FAILURE 1
+#define TODO_REG_TYPE (0x0001u) +#define TODO_REG_SIZE (0x0002u) +#define TODO_REG_DATA (0x0004u) +#define TODO_REG_COMPARE (0x0008u) + /* add.c */ #define run_reg_exe(c,r) run_reg_exe_(__FILE__,__LINE__,c,r) BOOL run_reg_exe_(const char *file, unsigned line, const char *cmd, DWORD *rc);