James Hawkins : msi: Add tests for MsiEnumClients.

Alexandre Julliard julliard at winehq.org
Mon Dec 17 06:41:46 CST 2007


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

Author: James Hawkins <truiken at gmail.com>
Date:   Sun Dec 16 20:26:42 2007 -0600

msi: Add tests for MsiEnumClients.

---

 dlls/msi/registry.c  |    3 +
 dlls/msi/tests/msi.c |  232 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 235 insertions(+), 0 deletions(-)

diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index 834eda0..1bee58d 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -1311,6 +1311,9 @@ UINT WINAPI MsiEnumClientsW(LPCWSTR szComponent, DWORD index, LPWSTR szProduct)
 
     TRACE("%s %d %p\n", debugstr_w(szComponent), index, szProduct);
 
+    if (!szComponent || !szProduct)
+        return ERROR_INVALID_PARAMETER;
+
     r = MSIREG_OpenComponentsKey(szComponent,&hkeyComp,FALSE);
     if( r != ERROR_SUCCESS )
         return ERROR_NO_MORE_ITEMS;
diff --git a/dlls/msi/tests/msi.c b/dlls/msi/tests/msi.c
index a6eaa21..e987884 100644
--- a/dlls/msi/tests/msi.c
+++ b/dlls/msi/tests/msi.c
@@ -1588,6 +1588,237 @@ static void test_MsiGetProductCode(void)
     RegCloseKey(compkey);
 }
 
+static void test_MsiEnumClients(void)
+{
+    HKEY compkey;
+    CHAR prodcode[MAX_PATH];
+    CHAR prod_squashed[MAX_PATH];
+    CHAR prodcode2[MAX_PATH];
+    CHAR prod2_squashed[MAX_PATH];
+    CHAR component[MAX_PATH];
+    CHAR comp_base85[MAX_PATH];
+    CHAR comp_squashed[MAX_PATH];
+    CHAR product[MAX_PATH];
+    CHAR keypath[MAX_PATH];
+    LPSTR usersid;
+    LONG res;
+    UINT r;
+
+    create_test_guid(prodcode, prod_squashed);
+    create_test_guid(prodcode2, prod2_squashed);
+    compose_base85_guid(component, comp_base85, comp_squashed);
+    get_user_sid(&usersid);
+
+    /* NULL szComponent */
+    product[0] = '\0';
+    r = MsiEnumClientsA(NULL, 0, product);
+    ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    /* empty szComponent */
+    product[0] = '\0';
+    r = MsiEnumClientsA("", 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    }
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    /* NULL lpProductBuf */
+    r = MsiEnumClientsA(component, 0, NULL);
+    todo_wine
+    {
+        ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    }
+
+    /* all params correct, component missing */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
+    }
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\");
+    lstrcatA(keypath, "Installer\\UserData\\");
+    lstrcatA(keypath, usersid);
+    lstrcatA(keypath, "\\Components\\");
+    lstrcatA(keypath, comp_squashed);
+
+    res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    /* user unmanaged component key exists */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
+    }
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    /* index > 0, no products exist */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 1, product);
+    todo_wine
+    {
+        ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    }
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"C:\\imapath", 10);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    /* product value exists */
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(product, prodcode), "Expected %s, got %s\n", prodcode, product);
+    }
+
+    /* try index 0 again */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(product, prodcode), "Expected %s, got %s\n", prodcode, product);
+    }
+
+    /* try index 1, second product value does not exist */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 1, product);
+    ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    res = RegSetValueExA(compkey, prod2_squashed, 0, REG_SZ, (const BYTE *)"C:\\another", 10);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    /* try index 1, second product value does exist */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 1, product);
+    todo_wine
+    {
+        ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    }
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    /* start the enumeration over */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(product, prodcode) || !lstrcmpA(product, prodcode2),
+           "Expected %s or %s, got %s\n", prodcode, prodcode2, product);
+    }
+    /* correctly query second product */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 1, product);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(product, prodcode) || !lstrcmpA(product, prodcode2),
+           "Expected %s or %s, got %s\n", prodcode, prodcode2, product);
+    }
+
+    RegDeleteValueA(compkey, prod_squashed);
+    RegDeleteValueA(compkey, prod2_squashed);
+    RegDeleteKeyA(compkey, "");
+    RegCloseKey(compkey);
+
+    lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\");
+    lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Components\\");
+    lstrcatA(keypath, comp_squashed);
+
+    res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    /* user local component key exists */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r);
+    }
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    /* index > 0, no products exist */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 1, product);
+    todo_wine
+    {
+        ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    }
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"C:\\imapath", 10);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    /* product value exists */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(product, prodcode), "Expected %s, got %s\n", prodcode, product);
+    }
+
+    /* try index 0 again */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(product, prodcode), "Expected %s, got %s\n", prodcode, product);
+    }
+
+    /* try index 1, second product value does not exist */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 1, product);
+    ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    res = RegSetValueExA(compkey, prod2_squashed, 0, REG_SZ, (const BYTE *)"C:\\another", 10);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    /* try index 1, second product value does exist */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 1, product);
+    todo_wine
+    {
+        ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    }
+    ok(!lstrcmpA(product, ""), "Expected product to be unchanged, got %s\n", product);
+
+    /* start the enumeration over */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 0, product);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(product, prodcode) || !lstrcmpA(product, prodcode2),
+           "Expected %s or %s, got %s\n", prodcode, prodcode2, product);
+    }
+
+    /* correctly query second product */
+    product[0] = '\0';
+    r = MsiEnumClientsA(component, 1, product);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(product, prodcode) || !lstrcmpA(product, prodcode2),
+           "Expected %s or %s, got %s\n", prodcode, prodcode2, product);
+    }
+
+    RegDeleteValueA(compkey, prod_squashed);
+    RegDeleteValueA(compkey, prod2_squashed);
+    RegDeleteKeyA(compkey, "");
+    RegCloseKey(compkey);
+}
+
 START_TEST(msi)
 {
     init_functionpointers();
@@ -1601,4 +1832,5 @@ START_TEST(msi)
     test_MsiQueryComponentState();
     test_MsiGetComponentPath();
     test_MsiGetProductCode();
+    test_MsiEnumClients();
 }




More information about the wine-cvs mailing list