https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5132d26c4c4a1f6d368da…
commit 5132d26c4c4a1f6d368da5ca296f169fee2de81e
Author: winesync <ros-dev(a)reactos.org>
AuthorDate: Sun Jan 16 21:08:22 2022 +0100
Commit: Thomas Csovcsity <thc.fr13nd(a)gmail.com>
CommitDate: Sun Jun 19 13:06:32 2022 +0200
[WINESYNC] reg/tests: Compare 'query'test output with expected output.
Signed-off-by: Hugh McMaster <hugh.mcmaster(a)outlook.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
wine commit id 5983247c3a5a7b5b64498a2cdff0eadf5edc47b5 by Hugh McMaster
<hugh.mcmaster(a)outlook.com>
---
modules/rostests/winetests/reg/add.c | 4 -
modules/rostests/winetests/reg/export.c | 2 -
modules/rostests/winetests/reg/query.c | 120 ++++++++++++++++++++++++++++--
modules/rostests/winetests/reg/reg_test.h | 5 ++
sdk/tools/winesync/reg.cfg | 2 +-
5 files changed, 121 insertions(+), 12 deletions(-)
diff --git a/modules/rostests/winetests/reg/add.c b/modules/rostests/winetests/reg/add.c
index 2c5a8f34ce2..30e5fe55667 100644
--- a/modules/rostests/winetests/reg/add.c
+++ b/modules/rostests/winetests/reg/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/modules/rostests/winetests/reg/export.c
b/modules/rostests/winetests/reg/export.c
index 5296ebb1e06..4e5ac4c71d9 100644
--- a/modules/rostests/winetests/reg/export.c
+++ b/modules/rostests/winetests/reg/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/modules/rostests/winetests/reg/query.c
b/modules/rostests/winetests/reg/query.c
index d397f36fc09..af0cc3848a4 100644
--- a/modules/rostests/winetests/reg/query.c
+++ b/modules/rostests/winetests/reg/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/modules/rostests/winetests/reg/reg_test.h
b/modules/rostests/winetests/reg/reg_test.h
index 14afa02930c..6718e91096f 100644
--- a/modules/rostests/winetests/reg/reg_test.h
+++ b/modules/rostests/winetests/reg/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);
diff --git a/sdk/tools/winesync/reg.cfg b/sdk/tools/winesync/reg.cfg
index 20b00b1e23e..38d5fe033b8 100644
--- a/sdk/tools/winesync/reg.cfg
+++ b/sdk/tools/winesync/reg.cfg
@@ -4,4 +4,4 @@ directories:
files:
programs/reg/resource.h: base/applications/cmdutils/reg/resource.h
tags:
- wine: 5bc2af7b1cf2e4e56311dad77acd8f67b3b7a13f
+ wine: 5983247c3a5a7b5b64498a2cdff0eadf5edc47b5