Module: wine Branch: master Commit: 64c75d1e02929fae877e8b8e9209405f41e127e7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=64c75d1e02929fae877e8b8e92...
Author: James Hawkins truiken@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(); }