[PATCH 1/9] reg/tests: Split 'delete' tests from reg.c

Hugh McMaster hugh.mcmaster at outlook.com
Sun Feb 28 21:16:45 CST 2021


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/reg/tests/Makefile.in |   3 +-
 programs/reg/tests/delete.c    | 123 ++++++++++++++++++++++++++++++++
 programs/reg/tests/reg.c       | 125 +++------------------------------
 programs/reg/tests/reg_test.h  |  56 +++++++++++++++
 4 files changed, 191 insertions(+), 116 deletions(-)
 create mode 100644 programs/reg/tests/delete.c
 create mode 100644 programs/reg/tests/reg_test.h

diff --git a/programs/reg/tests/Makefile.in b/programs/reg/tests/Makefile.in
index c5ce9f3a06b..791a8cfc4e3 100644
--- a/programs/reg/tests/Makefile.in
+++ b/programs/reg/tests/Makefile.in
@@ -2,4 +2,5 @@ TESTDLL   = reg.exe
 IMPORTS   = advapi32
 
 C_SRCS = \
-	reg.c
+	reg.c \
+	delete.c
diff --git a/programs/reg/tests/delete.c b/programs/reg/tests/delete.c
new file mode 100644
index 00000000000..fff3c5348b8
--- /dev/null
+++ b/programs/reg/tests/delete.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2014 Akihiro Sagawa
+ * Copyright 2016-2018, 2021 Hugh McMaster
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "reg_test.h"
+
+static void test_delete(void)
+{
+    HKEY hkey, hsubkey;
+    DWORD r;
+    const DWORD deadbeef = 0xdeadbeef;
+
+    delete_tree(HKEY_CURRENT_USER, KEY_BASE);
+    verify_key_nonexist(HKEY_CURRENT_USER, KEY_BASE);
+
+    run_reg_exe("reg delete", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    run_reg_exe("reg delete /?", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    run_reg_exe("reg delete /h", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    run_reg_exe("reg delete -H", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    /* Multiple /v* switches */
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v Wine /ve", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v Wine /va", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /ve /va", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v Wine /v Test /f", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    /* No /v argument */
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /f /v", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    /* Create a test key */
+    add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey);
+    add_value(hkey, "foo", REG_DWORD, &deadbeef, sizeof(deadbeef));
+    add_value(hkey, "bar", REG_DWORD, &deadbeef, sizeof(deadbeef));
+    add_value(hkey, NULL, REG_DWORD, &deadbeef, sizeof(deadbeef));
+
+    add_key(hkey, "subkey", &hsubkey);
+    close_key(hsubkey);
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v bar /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+    verify_reg_nonexist(hkey, "bar");
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /ve /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+    verify_reg_nonexist(hkey, "");
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /va /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+    verify_reg_nonexist(hkey, "foo");
+    verify_key(hkey, "subkey");
+
+    /* Test forward and back slashes */
+    add_key(hkey, "https://winehq.org", &hsubkey);
+    close_key(hsubkey);
+    add_value(hkey, "count/up", REG_SZ, "one/two/three", 14);
+    add_value(hkey, "\\foo\\bar", REG_SZ, "", 1);
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE "\\https://winehq.org /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+    verify_key_nonexist(hkey, "https://winehq.org");
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v count/up /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+    verify_reg_nonexist(hkey, "count/up");
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v \\foo\\bar /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+    verify_reg_nonexist(hkey, "\\foo\\bar");
+
+    close_key(hkey);
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+    verify_key_nonexist(HKEY_CURRENT_USER, KEY_BASE);
+
+    run_reg_exe("reg delete HKCU\\" KEY_BASE " /f", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+}
+
+START_TEST(delete)
+{
+    DWORD r;
+
+    if (!run_reg_exe("reg.exe /?", &r)) {
+        win_skip("reg.exe not available, skipping 'delete' tests\n");
+        return;
+    }
+
+    test_delete();
+}
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index 538a274d54f..97766e191fa 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -16,22 +16,15 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <stdio.h>
-#include <windows.h>
-#include "wine/test.h"
+#include "reg_test.h"
 
 #define lok ok_(__FILE__,line)
-#define KEY_WINE "Software\\Wine"
-#define KEY_BASE KEY_WINE "\\reg_test"
-#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)
 
-#define run_reg_exe(c,r) run_reg_exe_(__LINE__,c,r)
-static BOOL run_reg_exe_(unsigned line, const char *cmd, DWORD *rc)
+BOOL run_reg_exe_(unsigned line, const char *cmd, DWORD *rc)
 {
     STARTUPINFOA si = {sizeof(STARTUPINFOA)};
     PROCESS_INFORMATION pi;
@@ -86,8 +79,7 @@ static void verify_reg_(unsigned line, HKEY hkey, const char* value,
     }
 }
 
-#define verify_reg_nonexist(k,v) verify_reg_nonexist_(__LINE__,k,v)
-static void verify_reg_nonexist_(unsigned line, HKEY hkey, const char *value)
+void verify_reg_nonexist_(unsigned line, HKEY hkey, const char *value)
 {
     LONG err;
 
@@ -105,8 +97,7 @@ static void open_key_(unsigned line, const HKEY base, const char *path, const DW
     lok(err == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", err);
 }
 
-#define close_key(k) close_key_(__LINE__,k)
-static void close_key_(unsigned line, HKEY hkey)
+void close_key_(unsigned line, HKEY hkey)
 {
     LONG err;
 
@@ -114,8 +105,7 @@ static void close_key_(unsigned line, HKEY hkey)
     lok(err == ERROR_SUCCESS, "RegCloseKey failed: %d\n", err);
 }
 
-#define verify_key(k,s) verify_key_(__LINE__,k,s)
-static void verify_key_(unsigned line, HKEY key_base, const char *subkey)
+void verify_key_(unsigned line, HKEY key_base, const char *subkey)
 {
     HKEY hkey;
     LONG err;
@@ -127,8 +117,7 @@ static void verify_key_(unsigned line, HKEY key_base, const char *subkey)
         RegCloseKey(hkey);
 }
 
-#define verify_key_nonexist(k,s) verify_key_nonexist_(__LINE__,k,s)
-static void verify_key_nonexist_(unsigned line, HKEY key_base, const char *subkey)
+void verify_key_nonexist_(unsigned line, HKEY key_base, const char *subkey)
 {
     HKEY hkey;
     LONG err;
@@ -141,8 +130,7 @@ static void verify_key_nonexist_(unsigned line, HKEY key_base, const char *subke
         RegCloseKey(hkey);
 }
 
-#define add_key(k,p,s) add_key_(__LINE__,k,p,s)
-static void add_key_(unsigned line, const HKEY hkey, const char *path, HKEY *subkey)
+void add_key_(unsigned line, const HKEY hkey, const char *path, HKEY *subkey)
 {
     LONG err;
 
@@ -163,7 +151,7 @@ static void delete_key_(unsigned line, const HKEY hkey, const char *path)
     }
 }
 
-static LONG delete_tree(const HKEY key, const char *subkey)
+LONG delete_tree(const HKEY key, const char *subkey)
 {
     HKEY hkey;
     LONG ret;
@@ -205,9 +193,7 @@ cleanup:
     return ret;
 }
 
-#define add_value(k,n,t,d,s) add_value_(__LINE__,k,n,t,d,s)
-static void add_value_(unsigned line, HKEY hkey, const char *name, DWORD type,
-                       const void *data, size_t size)
+void add_value_(unsigned line, HKEY hkey, const char *name, DWORD type, const void *data, size_t size)
 {
     LONG err;
 
@@ -631,97 +617,6 @@ static void test_add(void)
     delete_tree(HKEY_CURRENT_USER, KEY_BASE);
 }
 
-static void test_delete(void)
-{
-    HKEY hkey, hsubkey;
-    DWORD r;
-    const DWORD deadbeef = 0xdeadbeef;
-
-    delete_tree(HKEY_CURRENT_USER, KEY_BASE);
-    verify_key_nonexist(HKEY_CURRENT_USER, KEY_BASE);
-
-    run_reg_exe("reg delete", &r);
-    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
-
-    run_reg_exe("reg delete /?", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-
-    run_reg_exe("reg delete /h", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-
-    run_reg_exe("reg delete -H", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-
-    /* Multiple /v* switches */
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v Wine /ve", &r);
-    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v Wine /va", &r);
-    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /ve /va", &r);
-    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v Wine /v Test /f", &r);
-    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
-
-    /* No /v argument */
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v", &r);
-    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /f /v", &r);
-    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
-
-    /* Create a test key */
-    add_key(HKEY_CURRENT_USER, KEY_BASE, &hkey);
-    add_value(hkey, "foo", REG_DWORD, &deadbeef, sizeof(deadbeef));
-    add_value(hkey, "bar", REG_DWORD, &deadbeef, sizeof(deadbeef));
-    add_value(hkey, NULL, REG_DWORD, &deadbeef, sizeof(deadbeef));
-
-    add_key(hkey, "subkey", &hsubkey);
-    close_key(hsubkey);
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v bar /f", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg_nonexist(hkey, "bar");
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /ve /f", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg_nonexist(hkey, "");
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /va /f", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg_nonexist(hkey, "foo");
-    verify_key(hkey, "subkey");
-
-    /* Test forward and back slashes */
-    add_key(hkey, "https://winehq.org", &hsubkey);
-    close_key(hsubkey);
-    add_value(hkey, "count/up", REG_SZ, "one/two/three", 14);
-    add_value(hkey, "\\foo\\bar", REG_SZ, "", 1);
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE "\\https://winehq.org /f", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_key_nonexist(hkey, "https://winehq.org");
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v count/up /f", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg_nonexist(hkey, "count/up");
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /v \\foo\\bar /f", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg_nonexist(hkey, "\\foo\\bar");
-
-    close_key(hkey);
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /f", &r);
-    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_key_nonexist(HKEY_CURRENT_USER, KEY_BASE);
-
-    run_reg_exe("reg delete HKCU\\" KEY_BASE " /f", &r);
-    ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
-}
-
 static void test_query(void)
 {
     DWORD r;
@@ -4851,13 +4746,13 @@ static void test_copy(void)
 START_TEST(reg)
 {
     DWORD r;
+
     if (!run_reg_exe("reg.exe /?", &r)) {
         win_skip("reg.exe not available, skipping reg.exe tests\n");
         return;
     }
 
     test_add();
-    test_delete();
     test_query();
     test_import();
     test_unicode_import();
diff --git a/programs/reg/tests/reg_test.h b/programs/reg/tests/reg_test.h
new file mode 100644
index 00000000000..78d1098499a
--- /dev/null
+++ b/programs/reg/tests/reg_test.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2021 Hugh McMaster
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __REG_TEST_H__
+#define __REG_TEST_H__
+
+#include <stdio.h>
+#include <windows.h>
+#include "wine/test.h"
+
+/* Common #defines */
+#define KEY_WINE "Software\\Wine"
+#define KEY_BASE KEY_WINE "\\reg_test"
+#define REG_EXIT_SUCCESS 0
+#define REG_EXIT_FAILURE 1
+
+/* Helper functions */
+#define run_reg_exe(c,r) run_reg_exe_(__LINE__,c,r)
+BOOL run_reg_exe_(unsigned line, const char *cmd, DWORD *rc);
+
+#define verify_reg_nonexist(k,v) verify_reg_nonexist_(__LINE__,k,v)
+void verify_reg_nonexist_(unsigned line, HKEY hkey, const char *value);
+
+#define close_key(k) close_key_(__LINE__,k)
+void close_key_(unsigned line, HKEY hkey);
+
+#define verify_key(k,s) verify_key_(__LINE__,k,s)
+void verify_key_(unsigned line, HKEY key_base, const char *subkey);
+
+#define verify_key_nonexist(k,s) verify_key_nonexist_(__LINE__,k,s)
+void verify_key_nonexist_(unsigned line, HKEY key_base, const char *subkey);
+
+#define add_key(k,p,s) add_key_(__LINE__,k,p,s)
+void add_key_(unsigned line, const HKEY hkey, const char *path, HKEY *subkey);
+
+LONG delete_tree(const HKEY key, const char *subkey);
+
+#define add_value(k,n,t,d,s) add_value_(__LINE__,k,n,t,d,s)
+void add_value_(unsigned line, HKEY hkey, const char *name, DWORD type, const void *data, size_t size);
+
+#endif /* __REG_TEST_H__ */
-- 
2.30.1




More information about the wine-devel mailing list