[PATCH 4/4] newdev/tests: Add tests for UpdateDriverForPlugAndPlayDevices().
Zebediah Figura
z.figura12 at gmail.com
Tue May 28 19:14:15 CDT 2019
---
configure | 1 +
configure.ac | 1 +
dlls/newdev/tests/Makefile.in | 7 ++
dlls/newdev/tests/coinst.c | 61 +++++++++++++++
dlls/newdev/tests/coinst.spec | 2 +
dlls/newdev/tests/newdev.c | 136 ++++++++++++++++++++++++++++++++++
6 files changed, 208 insertions(+)
create mode 100644 dlls/newdev/tests/Makefile.in
create mode 100644 dlls/newdev/tests/coinst.c
create mode 100644 dlls/newdev/tests/coinst.spec
create mode 100644 dlls/newdev/tests/newdev.c
diff --git a/configure b/configure
index dc1d02e0ab8..4aadcc7e029 100755
--- a/configure
+++ b/configure
@@ -20437,6 +20437,7 @@ wine_fn_config_makefile dlls/netcfgx/tests enable_tests
wine_fn_config_makefile dlls/netprofm enable_netprofm
wine_fn_config_makefile dlls/netprofm/tests enable_tests
wine_fn_config_makefile dlls/newdev enable_newdev
+wine_fn_config_makefile dlls/newdev/tests enable_tests
wine_fn_config_makefile dlls/ninput enable_ninput
wine_fn_config_makefile dlls/ninput/tests enable_tests
wine_fn_config_makefile dlls/normaliz enable_normaliz
diff --git a/configure.ac b/configure.ac
index 426dea30e74..50b5ccc2c5e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3484,6 +3484,7 @@ WINE_CONFIG_MAKEFILE(dlls/netcfgx/tests)
WINE_CONFIG_MAKEFILE(dlls/netprofm)
WINE_CONFIG_MAKEFILE(dlls/netprofm/tests)
WINE_CONFIG_MAKEFILE(dlls/newdev)
+WINE_CONFIG_MAKEFILE(dlls/newdev/tests)
WINE_CONFIG_MAKEFILE(dlls/ninput)
WINE_CONFIG_MAKEFILE(dlls/ninput/tests)
WINE_CONFIG_MAKEFILE(dlls/normaliz)
diff --git a/dlls/newdev/tests/Makefile.in b/dlls/newdev/tests/Makefile.in
new file mode 100644
index 00000000000..73e5367fae8
--- /dev/null
+++ b/dlls/newdev/tests/Makefile.in
@@ -0,0 +1,7 @@
+TESTDLL = newdev.dll
+IMPORTS = advapi32 newdev setupapi
+
+SOURCES = \
+ coinst.c \
+ coinst.spec \
+ newdev.c
diff --git a/dlls/newdev/tests/coinst.c b/dlls/newdev/tests/coinst.c
new file mode 100644
index 00000000000..32df62c16fe
--- /dev/null
+++ b/dlls/newdev/tests/coinst.c
@@ -0,0 +1,61 @@
+/*
+ * Test class installer DLL
+ *
+ * Copyright 2018 Zebediah Figura
+ *
+ * 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 <stdio.h>
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "setupapi.h"
+
+void (*ok_callback)(const char *file, int line, int condition, const char *msg);
+
+static void ok_(const char *file, int line, int condition, const char *format, ...)
+{
+ va_list args;
+ char buffer[300];
+ va_start(args, format);
+ vsnprintf(buffer, sizeof(buffer), format, args);
+ (*ok_callback)(file, line, condition, buffer);
+ va_end(args);
+}
+#define ok(condition, ...) ok_(__FILE__, __LINE__, condition, __VA_ARGS__)
+
+static const DWORD msg_list[] =
+{
+ DIF_SELECTBESTCOMPATDRV,
+ DIF_ALLOW_INSTALL,
+ DIF_INSTALLDEVICEFILES,
+ DIF_REGISTER_COINSTALLERS,
+ DIF_INSTALLINTERFACES,
+ DIF_INSTALLDEVICE,
+ DIF_NEWDEVICEWIZARD_FINISHINSTALL,
+ DIF_DESTROYPRIVATEDATA,
+};
+
+static unsigned int msg_index;
+
+DWORD WINAPI ClassInstall(DI_FUNCTION msg, HDEVINFO set, SP_DEVINFO_DATA *device)
+{
+ ok(msg == msg_list[msg_index], "%d: Expected message %#x, got %#x.\n", msg_index, msg_list[msg_index], msg);
+ msg_index++;
+ return ERROR_DI_DO_DEFAULT;
+}
diff --git a/dlls/newdev/tests/coinst.spec b/dlls/newdev/tests/coinst.spec
new file mode 100644
index 00000000000..a5272ec3c70
--- /dev/null
+++ b/dlls/newdev/tests/coinst.spec
@@ -0,0 +1,2 @@
+@ stdcall ClassInstall(long ptr ptr)
+@ extern ok_callback
diff --git a/dlls/newdev/tests/newdev.c b/dlls/newdev/tests/newdev.c
new file mode 100644
index 00000000000..5c49b272761
--- /dev/null
+++ b/dlls/newdev/tests/newdev.c
@@ -0,0 +1,136 @@
+/*
+ * Unit tests for newdev.dll
+ *
+ * Copyright 2019 Zebediah Figura
+ *
+ * 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 <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "newdev.h"
+#include "wine/test.h"
+
+static void load_resource(const char *name, const char *filename)
+{
+ DWORD written;
+ HANDLE file;
+ HRSRC res;
+ void *ptr;
+
+ file = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
+ ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %d\n", filename, GetLastError());
+
+ res = FindResourceA(NULL, name, "TESTDLL");
+ ok( res != 0, "couldn't find resource\n" );
+ ptr = LockResource( LoadResource( GetModuleHandleA(NULL), res ));
+ WriteFile( file, ptr, SizeofResource( GetModuleHandleA(NULL), res ), &written, NULL );
+ ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" );
+ CloseHandle( file );
+}
+
+static void ok_callback(const char *file, int line, int condition, const char *msg)
+{
+ ok_(file, line)(condition, msg);
+}
+
+static const GUID device_class = {0x12344321};
+
+static void test_update_driver(void)
+{
+ static const char inf_data[] = "[Version]\n"
+ "Signature=\"$Chicago$\"\n"
+ "ClassGuid={12344321-0000-0000-0000-000000000000}\n"
+ "[Manufacturer]\n"
+ "mfg1=mfg1_key\n"
+ "[mfg1_key]\n"
+ "desc1=dev1,bogus_hardware_id\n"
+ "[mfg1_key]\n"
+ "desc1=dev1,bogus_hardware_id\n"
+ "[dev1]\n"
+ "[dev1.Services]\n"
+ "AddService=,2\n";
+ static const char hardware_id[] = "bogus_hardware_id\0";
+ static const char regdata[] = "winetest_coinst.dll\0";
+ void (**pok_callback)(const char *file, int line, int condition, const char *msg);
+ SP_DEVINFO_DATA device = {sizeof(device)};
+ char inf_path[MAX_PATH];
+ BOOL ret, reboot;
+ HMODULE coinst;
+ HKEY class_key;
+ HDEVINFO set;
+ HANDLE file;
+ DWORD size;
+ LONG res;
+
+ GetTempPathA(MAX_PATH, inf_path);
+ strcat(inf_path, "newdev_test.inf");
+ file = CreateFileA(inf_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
+ ok(file != INVALID_HANDLE_VALUE, "Failed to create %s, error %u.\n", inf_path, GetLastError());
+ ret = WriteFile(file, inf_data, strlen(inf_data), &size, NULL);
+ ok(ret && size == strlen(inf_data), "Failed to write INF file, error %u.\n", GetLastError());
+ CloseHandle(file);
+
+ load_resource("coinst.dll", "C:\\windows\\system32\\winetest_coinst.dll");
+
+ coinst = LoadLibraryA("winetest_coinst.dll");
+ pok_callback = (void *)GetProcAddress(coinst, "ok_callback");
+ *pok_callback = ok_callback;
+
+ res = RegCreateKeyA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Class"
+ "\\{12344321-0000-0000-0000-000000000000}", &class_key);
+ ok(!res, "Failed to create class key, error %u.\n", res);
+ res = RegSetValueExA(class_key, "Installer32", 0, REG_SZ, (BYTE *)regdata, sizeof(regdata));
+ ok(!res, "Failed to set registry value, error %u.\n", res);
+
+ set = SetupDiCreateDeviceInfoList(&device_class, NULL);
+ ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
+
+ ret = SetupDiCreateDeviceInfoA(set, "root\\bogus\\0000", &device_class, NULL, NULL, 0, &device);
+ ok(ret, "Failed to create device, error %#x.\n", GetLastError());
+
+ ret = SetupDiSetDeviceRegistryPropertyA(set, &device, SPDRP_HARDWAREID, (const BYTE *)hardware_id, sizeof(hardware_id));
+ ok(ret, "Failed to set hardware ID, error %#x.\n", GetLastError());
+
+ ret = SetupDiRegisterDeviceInfo(set, &device, 0, NULL, NULL, NULL);
+ ok(ret, "Failed to register device, error %#x.\n", GetLastError());
+
+ ret = UpdateDriverForPlugAndPlayDevicesA(NULL, hardware_id, inf_path, 0, &reboot);
+ ok(ret, "UpdateDriverForPlugAndPlayDevices() failed, error %#x.\n", GetLastError());
+
+ ret = SetupDiRemoveDevice(set, &device);
+ ok(ret, "Failed to remove device, error %#x.\n", GetLastError());
+
+ SetupDiDestroyDeviceInfoList(set);
+
+ FreeLibrary(coinst);
+
+ ret = DeleteFileA("C:\\windows\\system32\\winetest_coinst.dll");
+ ok(ret, "Failed to delete file, error %u.\n", GetLastError());
+ ret = DeleteFileA(inf_path);
+ ok(ret, "Failed to delete %s, error %u.\n", inf_path, GetLastError());
+ res = RegDeleteKeyA(class_key, "");
+ ok(!res, "Failed to delete class key, error %u.\n", res);
+ RegCloseKey(class_key);
+}
+
+START_TEST(newdev)
+{
+ test_update_driver();
+}
--
2.21.0
More information about the wine-devel
mailing list