Stefan Leichter : setupapi: Added tests for SetupDiGetINFClassA.

Alexandre Julliard julliard at winehq.org
Tue Sep 14 17:35:27 CDT 2010


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

Author: Stefan Leichter <Stefan.Leichter at camline.com>
Date:   Sat Sep 11 23:15:19 2010 +0200

setupapi: Added tests for SetupDiGetINFClassA.

---

 dlls/setupapi/stubs.c         |    1 +
 dlls/setupapi/tests/devinst.c |  149 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 150 insertions(+), 0 deletions(-)

diff --git a/dlls/setupapi/stubs.c b/dlls/setupapi/stubs.c
index fd40343..643d2df 100644
--- a/dlls/setupapi/stubs.c
+++ b/dlls/setupapi/stubs.c
@@ -236,6 +236,7 @@ BOOL WINAPI SetupDiGetINFClassA(PCSTR inf, LPGUID class_guid, PSTR class_name,
         DWORD size, PDWORD required_size)
 {
     FIXME("%s %p %p %d %p\n", debugstr_a(inf), class_guid, class_name, size, required_size);
+    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
 
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 1ae0720..21fbb01 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -40,6 +40,7 @@ static BOOL     (WINAPI *pSetupDiCallClassInstaller)(DI_FUNCTION, HDEVINFO, PSP_
 static BOOL     (WINAPI *pSetupDiDestroyDeviceInfoList)(HDEVINFO);
 static BOOL     (WINAPI *pSetupDiEnumDeviceInfo)(HDEVINFO, DWORD, PSP_DEVINFO_DATA);
 static BOOL     (WINAPI *pSetupDiEnumDeviceInterfaces)(HDEVINFO, PSP_DEVINFO_DATA, const GUID *, DWORD, PSP_DEVICE_INTERFACE_DATA);
+static BOOL     (WINAPI *pSetupDiGetINFClassA)(PCSTR, LPGUID, PSTR, DWORD, PDWORD);
 static BOOL     (WINAPI *pSetupDiInstallClassA)(HWND, PCSTR, DWORD, HSPFILEQ);
 static HKEY     (WINAPI *pSetupDiOpenClassRegKeyExA)(GUID*,REGSAM,DWORD,PCSTR,PVOID);
 static HKEY     (WINAPI *pSetupDiOpenDevRegKey)(HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM);
@@ -83,6 +84,7 @@ static void init_function_pointers(void)
     pSetupDiRegisterDeviceInfo = (void *)GetProcAddress(hSetupAPI, "SetupDiRegisterDeviceInfo");
     pSetupDiGetClassDevsA = (void *)GetProcAddress(hSetupAPI, "SetupDiGetClassDevsA");
     pSetupDiGetClassDevsW = (void *)GetProcAddress(hSetupAPI, "SetupDiGetClassDevsW");
+    pSetupDiGetINFClassA = (void *)GetProcAddress(hSetupAPI, "SetupDiGetINFClassA");
     pSetupDiSetDeviceRegistryPropertyA = (void *)GetProcAddress(hSetupAPI, "SetupDiSetDeviceRegistryPropertyA");
     pSetupDiSetDeviceRegistryPropertyW = (void *)GetProcAddress(hSetupAPI, "SetupDiSetDeviceRegistryPropertyW");
     pSetupDiGetDeviceRegistryPropertyA = (void *)GetProcAddress(hSetupAPI, "SetupDiGetDeviceRegistryPropertyA");
@@ -1343,6 +1345,152 @@ static void testDeviceRegistryPropertyW(void)
     }
 }
 
+static void testSetupDiGetINFClassA(void)
+{
+    static const char inffile[] = "winetest.inf";
+    static const char content[] = "[Version]\r\n\r\n";
+
+    char cn[MAX_PATH];
+    char filename[MAX_PATH];
+    DWORD count;
+    BOOL retval;
+    GUID guid;
+    HANDLE h;
+
+    if(!pSetupDiGetINFClassA)
+    {
+        win_skip("SetupDiGetINFClassA not present\n");
+        return;
+    }
+
+    count = GetTempPathA(MAX_PATH, filename);
+    if(!count)
+    {
+        win_skip("GetTempPathA failed\n");
+        return;
+    }
+
+    strcat(filename, inffile);
+    DeleteFileA(filename);
+
+    /* not existing file */
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    if (ERROR_CALL_NOT_IMPLEMENTED == GetLastError())
+    {
+        skip("SetupDiGetINFClassA is not implemented\n");
+        return;
+    }
+    ok(ERROR_FILE_NOT_FOUND == GetLastError(),
+        "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
+
+    /* missing file wins against other invalid parameter */
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, NULL, cn, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    ok(ERROR_FILE_NOT_FOUND == GetLastError(),
+        "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, &guid, NULL, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    ok(ERROR_FILE_NOT_FOUND == GetLastError(),
+        "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, &guid, cn, 0, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    ok(ERROR_FILE_NOT_FOUND == GetLastError(),
+        "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, NULL);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    ok(ERROR_FILE_NOT_FOUND == GetLastError(),
+        "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
+
+    /* test file content */
+    h = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
+                    FILE_ATTRIBUTE_NORMAL, NULL);
+    if(h == INVALID_HANDLE_VALUE)
+    {
+        win_skip("failed to create file %s (error %u)\n", filename, GetLastError());
+        return;
+    }
+    CloseHandle( h);
+
+    retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+
+    h = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
+                    FILE_ATTRIBUTE_NORMAL, NULL);
+    if(h == INVALID_HANDLE_VALUE)
+    {
+        win_skip("failed to create file %s (error %u)\n", filename, GetLastError());
+        return;
+    }
+    WriteFile( h, content, sizeof(content), &count, NULL);
+    CloseHandle( h);
+
+    retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+
+    WritePrivateProfileStringA("Version", "Signature", "\"$CHICAGO$\"", filename);
+
+    retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+
+    WritePrivateProfileStringA("Version", "Class", "WINE", filename);
+
+    retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, &count);
+    ok(retval, "expected SetupDiGetINFClassA to succeed! error %u\n", GetLastError());
+
+    /* invalid parameter */
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, NULL, cn, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    ok(ERROR_INVALID_PARAMETER == GetLastError(),
+        "expected error ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, &guid, NULL, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    ok(ERROR_INVALID_PARAMETER == GetLastError(),
+        "expected error ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, &guid, cn, 0, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    ok(ERROR_INSUFFICIENT_BUFFER == GetLastError() ||
+       ERROR_INVALID_PARAMETER == GetLastError(),
+        "expected error ERROR_INSUFFICIENT_BUFFER or ERROR_INVALID_PARAMETER, "
+        "got %u\n", GetLastError());
+
+    DeleteFileA(filename);
+
+    WritePrivateProfileStringA("Version", "Signature", "\"$CHICAGO$\"", filename);
+    WritePrivateProfileStringA("Version", "ClassGUID", "WINE", filename);
+
+    SetLastError(0xdeadbeef);
+    retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, &count);
+    ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
+    ok(RPC_S_INVALID_STRING_UUID == GetLastError() ||
+       ERROR_INVALID_PARAMETER == GetLastError(),
+        "expected error RPC_S_INVALID_STRING_UUID or ERROR_INVALID_PARAMETER, "
+        "got %u\n", GetLastError());
+
+    /* network adapter guid */
+    WritePrivateProfileStringA("Version", "ClassGUID",
+                               "{4d36e972-e325-11ce-bfc1-08002be10318}", filename);
+
+    /* this test succeeds only if the guid is known to the system */
+    retval = SetupDiGetINFClassA(filename, &guid, cn, MAX_PATH, &count);
+    ok(retval, "expected SetupDiGetINFClassA to succeed! error %u\n", GetLastError());
+
+    DeleteFileA(filename);
+}
+
 START_TEST(devinst)
 {
     HDEVINFO set;
@@ -1381,4 +1529,5 @@ START_TEST(devinst)
     testRegisterAndGetDetail();
     testDeviceRegistryPropertyA();
     testDeviceRegistryPropertyW();
+    testSetupDiGetINFClassA();
 }




More information about the wine-cvs mailing list