Hugh McMaster : reg/tests: Compare 'query'test output with expected output.

Alexandre Julliard julliard at winehq.org
Wed Apr 14 16:01:19 CDT 2021


Module: wine
Branch: master
Commit: 5983247c3a5a7b5b64498a2cdff0eadf5edc47b5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5983247c3a5a7b5b64498a2cdff0eadf5edc47b5

Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date:   Wed Apr 14 22:47:41 2021 +1000

reg/tests: Compare 'query'test output with expected output.

Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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);




More information about the wine-cvs mailing list