[PATCH 8/8] user32/tests: Add display device interface tests.

Zhiyi Zhang zzhang at codeweavers.com
Thu Sep 16 02:11:25 CDT 2021


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/user32/tests/Makefile.in |  2 +-
 dlls/user32/tests/monitor.c   | 90 +++++++++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+), 1 deletion(-)

diff --git a/dlls/user32/tests/Makefile.in b/dlls/user32/tests/Makefile.in
index dd101d69f3c..abe340403f4 100644
--- a/dlls/user32/tests/Makefile.in
+++ b/dlls/user32/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = user32.dll
-IMPORTS   = user32 gdi32 advapi32 hid
+IMPORTS   = user32 gdi32 advapi32 hid setupapi
 
 C_SRCS = \
 	broadcast.c \
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index bd348576726..de460187fbf 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -3,6 +3,7 @@
  *
  * Copyright 2005 Huw Davies
  * Copyright 2008 Dmitry Timoshkov
+ * Copyright 2021 Zhiyi Zhang for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -28,6 +29,11 @@
 #include "winuser.h"
 #include "winreg.h"
 #include "winternl.h"
+#include "cfgmgr32.h"
+#include "initguid.h"
+#include "devguid.h"
+#include "ntddvdeo.h"
+#include "setupapi.h"
 #include "ddk/d3dkmthk.h"
 #include "wine/heap.h"
 #include <stdio.h>
@@ -2353,6 +2359,89 @@ static void test_display_dc(void)
     }
 }
 
+#define check_device_interface(a, b) _check_device_interface(__LINE__, a, b)
+static void _check_device_interface(int line, const char *instance_id, const GUID *guid)
+{
+    SP_DEVICE_INTERFACE_DATA iface_data = {sizeof(iface_data)};
+    SP_DEVINFO_DATA device_data = {sizeof(device_data)};
+    HDEVINFO devinfo;
+    BOOL ret;
+
+    devinfo = SetupDiGetClassDevsA(guid, instance_id, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
+    ret = SetupDiEnumDeviceInfo(devinfo, 0, &device_data);
+    ok_(__FILE__, line)(ret || broken(!ret) /* <= Win7 */,
+            "SetupDiEnumDeviceInfo failed, error %u.\n", GetLastError());
+    if (!ret)
+    {
+        SetupDiDestroyDeviceInfoList(devinfo);
+        return;
+    }
+    ret = SetupDiEnumDeviceInterfaces(devinfo, &device_data, guid, 0, &iface_data);
+    ok_(__FILE__, line)(ret, "SetupDiEnumDeviceInterfaces failed, error %u.\n", GetLastError());
+    ok_(__FILE__, line)(IsEqualGUID(&iface_data.InterfaceClassGuid, guid),
+            "Expected guid %s, got %s.\n", wine_dbgstr_guid(guid),
+            wine_dbgstr_guid(&iface_data.InterfaceClassGuid));
+
+    SetupDiDestroyDeviceInfoList(devinfo);
+}
+
+static void test_display_device_interfaces(void)
+{
+    SP_DEVICE_INTERFACE_DATA iface_data = {sizeof(iface_data)};
+    SP_DEVINFO_DATA device_data = {sizeof(device_data)};
+    char instance_id[MAX_DEVICE_ID_LEN];
+    DWORD device_idx = 0, size, error;
+    HDEVINFO devinfo;
+    BOOL ret;
+
+    /* GPUs */
+    devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_DISPLAY, NULL, NULL, DIGCF_PRESENT);
+    ok(devinfo != INVALID_HANDLE_VALUE, "SetupDiGetClassDevsW failed, error %u.\n", GetLastError());
+    while ((ret = SetupDiEnumDeviceInfo(devinfo, device_idx, &device_data)))
+    {
+        ret = SetupDiGetDeviceInstanceIdA(devinfo, &device_data, instance_id,
+                ARRAY_SIZE(instance_id), &size);
+        ok(ret, "SetupDiGetDeviceInstanceIdA failed, error %u.\n", GetLastError());
+
+        winetest_push_context("GPU %d", device_idx);
+
+        check_device_interface(instance_id, &GUID_DEVINTERFACE_DISPLAY_ADAPTER);
+        check_device_interface(instance_id, &GUID_DISPLAY_DEVICE_ARRIVAL);
+
+        winetest_pop_context();
+        ++device_idx;
+    }
+    error = GetLastError();
+    ok(!ret, "SetupDiEnumDeviceInfo succeeded.\n");
+    ok(error == ERROR_NO_MORE_ITEMS, "Expected error %u, got %u.\n", ERROR_NO_MORE_ITEMS, error);
+    ok(device_idx > 0, "Expected at least one GPU.\n");
+    SetupDiDestroyDeviceInfoList(devinfo);
+
+    /* Monitors */
+    device_idx = 0;
+    devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_MONITOR, L"DISPLAY", NULL, DIGCF_PRESENT);
+    ok(devinfo != INVALID_HANDLE_VALUE, "SetupDiGetClassDevsW failed, error %u.\n", GetLastError());
+    while ((ret = SetupDiEnumDeviceInfo(devinfo, device_idx, &device_data)))
+    {
+        ret = SetupDiGetDeviceInstanceIdA(devinfo, &device_data, instance_id,
+                ARRAY_SIZE(instance_id), &size);
+        ok(ret, "SetupDiGetDeviceInstanceIdA failed, error %u.\n", GetLastError());
+
+        winetest_push_context("Monitor %d", device_idx);
+
+        check_device_interface(instance_id, &GUID_DEVINTERFACE_MONITOR);
+
+        winetest_pop_context();
+        ++device_idx;
+    }
+    error = GetLastError();
+    ok(!ret, "SetupDiEnumDeviceInfo succeeded.\n");
+    ok(error == ERROR_NO_MORE_ITEMS, "Expected error %u, got %u.\n", ERROR_NO_MORE_ITEMS, error);
+    ok(device_idx > 0 || broken(device_idx == 0) /* w7u_2qxl TestBot */,
+            "Expected at least one monitor.\n");
+    SetupDiDestroyDeviceInfoList(devinfo);
+}
+
 START_TEST(monitor)
 {
     init_function_pointers();
@@ -2365,4 +2454,5 @@ START_TEST(monitor)
     test_display_config();
     test_handles();
     test_display_dc();
+    test_display_device_interfaces();
 }
-- 
2.30.2



More information about the wine-devel mailing list