Greg Geldorp : winmm/tests: Skip some tests on VMware.

Alexandre Julliard julliard at winehq.org
Fri Jan 28 12:30:16 CST 2011


Module: wine
Branch: master
Commit: e45caf5d6b89599fb13e906492c50aa9d1ed945d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e45caf5d6b89599fb13e906492c50aa9d1ed945d

Author: Greg Geldorp <ggeldorp at vmware.com>
Date:   Fri Jan 28 13:30:21 2011 +0100

winmm/tests: Skip some tests on VMware.

---

 dlls/winmm/tests/Makefile.in |    2 +-
 dlls/winmm/tests/midi.c      |   82 +++++++++++++++++++++++++++++++++++++++---
 2 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/dlls/winmm/tests/Makefile.in b/dlls/winmm/tests/Makefile.in
index 4a74bdf..fcd8ece 100644
--- a/dlls/winmm/tests/Makefile.in
+++ b/dlls/winmm/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = winmm.dll
-IMPORTS   = winmm user32
+IMPORTS   = winmm user32 advapi32
 
 C_SRCS = \
 	capture.c \
diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c
index 01055e3..e40e1d7 100644
--- a/dlls/winmm/tests/midi.c
+++ b/dlls/winmm/tests/midi.c
@@ -625,6 +625,72 @@ static void test_midiStream(UINT udev, HWND hwnd)
     }
 }
 
+static BOOL scan_subkeys(HKEY parent, const LPCSTR *sub_keys)
+{
+    char name[64];
+    DWORD index = 0;
+    DWORD name_len = sizeof(name);
+    BOOL found_vmware = FALSE;
+
+    if (sub_keys[0] == NULL)
+    {
+       /* We're at the deepest level, check "Identifier" value now */
+       char *test;
+       if (RegQueryValueExA(parent, "Identifier", NULL, NULL, (LPBYTE) name, &name_len) != ERROR_SUCCESS)
+           return FALSE;
+       for (test = name; test < name + lstrlenA(name) - 6 && ! found_vmware; test++)
+       {
+           char c = test[6];
+           test[6] = '\0';
+           found_vmware = (lstrcmpiA(test, "VMware") == 0);
+           test[6] = c;
+       }
+       return found_vmware;
+    }
+
+    while (RegEnumKeyExA(parent, index, name, &name_len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS &&
+           ! found_vmware) {
+        char c = name[lstrlenA(sub_keys[0])];
+        name[lstrlenA(sub_keys[0])] = '\0';
+        if (lstrcmpiA(name, sub_keys[0]) == 0) {
+            HKEY sub_key;
+            name[lstrlenA(sub_keys[0])] = c;
+            if (RegOpenKeyExA(parent, name, 0, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &sub_key) == ERROR_SUCCESS) {
+                found_vmware = scan_subkeys(sub_key, sub_keys + 1);
+                RegCloseKey(sub_key);
+            }
+        }
+
+        name_len = sizeof(name);
+        index++;
+    }
+
+    return found_vmware;
+}
+
+/*
+ * Usual method to detect whether running inside a VMware virtual machine involves direct port I/O requiring
+ * some assembly and an exception handler. Can't do that in Wine tests. Alternative method of querying WMI
+ * is not available on NT4. So instead we look at the device map and check the Identifier value in the
+ * registry keys HKLM\HARDWARE\DEVICEMAP\SCSI\Scsi Port x\Scsi Bus x\Target Id x\Logical Unit Id x (where
+ * x is some number). If the Identifier value contains the string "VMware" we assume running in a VMware VM.
+ */
+static BOOL on_vmware(void)
+{
+    static const LPCSTR sub_keys[] = { "Scsi Port ", "Scsi Bus ", "Target Id ", "Logical Unit Id ", NULL };
+    HKEY scsi;
+    BOOL found_vmware = FALSE;
+
+    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\Scsi", 0, KEY_ENUMERATE_SUB_KEYS, &scsi) != ERROR_SUCCESS)
+        return FALSE;
+
+    found_vmware = scan_subkeys(scsi, sub_keys);
+
+    RegCloseKey(scsi);
+
+    return found_vmware;
+}
+
 static void test_midi_outfns(HWND hwnd)
 {
     HMIDIOUT hm;
@@ -662,11 +728,17 @@ static void test_midi_outfns(HWND hwnd)
     test_midi_mci(hwnd);
 
     for (udev=0; udev < ndevs; udev++) {
-        trace("** Testing device %d\n", udev);
-        test_midiOut_device(udev, hwnd);
-        Sleep(800); /* Let the synth rest */
-        test_midiStream(udev, hwnd);
-        Sleep(800);
+        MIDIOUTCAPSA capsA;
+        rc = midiOutGetDevCapsA(udev, &capsA, sizeof(capsA));
+        if (rc || strcmp(capsA.szPname, "Creative Sound Blaster MPU-401") != 0 || ! on_vmware()) {
+            trace("** Testing device %d\n", udev);
+            test_midiOut_device(udev, hwnd);
+            Sleep(800); /* Let the synth rest */
+            test_midiStream(udev, hwnd);
+            Sleep(800);
+        }
+        else
+            win_skip("Skipping this device on VMware, driver problem\n");
     }
     trace("** Testing MIDI mapper\n");
     test_midiOut_device(MIDIMAPPER, hwnd);




More information about the wine-cvs mailing list