From 1fced5cc1d244c5f954ad962d409c7e0177e97c3 Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Sun, 24 Feb 2008 20:06:28 -0600 Subject: [PATCH] msi: Add tests for MsiSourceListAddMediaDisk. --- dlls/msi/msi.spec | 2 +- dlls/msi/source.c | 33 +++- dlls/msi/tests/automation.c | 7 +- dlls/msi/tests/source.c | 324 ++++++++++++++++++++++++++++++++++++ 4 files changed, 357 insertions(+), 9 deletions(-) diff --git a/dlls/msi/msi.spec b/dlls/msi/msi.spec index 2810b82159b..b510de7c8d2 100644 --- a/dlls/msi/msi.spec +++ b/dlls/msi/msi.spec @@ -266,7 +266,7 @@ 270 stub MsiEnumPatchesExW 271 stub MsiSourceListEnumMediaDisksA 272 stub MsiSourceListEnumMediaDisksW -273 stub MsiSourceListAddMediaDiskA +273 stdcall MsiSourceListAddMediaDiskA(str str long long long str str) 274 stdcall MsiSourceListAddMediaDiskW(wstr wstr long long long wstr wstr) 275 stub MsiSourceListClearMediaDiskA 276 stub MsiSourceListClearMediaDiskW diff --git a/dlls/msi/source.c b/dlls/msi/source.c index 184ea2b60a2..b2a45b185ec 100644 --- a/dlls/msi/source.c +++ b/dlls/msi/source.c @@ -939,7 +939,36 @@ done: } /****************************************************************** - * MsiSourceListAddMediaDisk(MSI.@) + * MsiSourceListAddMediaDiskA (MSI.@) + */ +UINT WINAPI MsiSourceListAddMediaDiskA(LPCSTR szProduct, LPCSTR szUserSid, + MSIINSTALLCONTEXT dwContext, DWORD dwOptions, DWORD dwDiskId, + LPCSTR szVolumeLabel, LPCSTR szDiskPrompt) +{ + UINT r; + LPWSTR product = NULL; + LPWSTR usersid = NULL; + LPWSTR volume = NULL; + LPWSTR prompt = NULL; + + if (szProduct) product = strdupAtoW(szProduct); + if (szUserSid) usersid = strdupAtoW(szUserSid); + if (szVolumeLabel) volume = strdupAtoW(szVolumeLabel); + if (szDiskPrompt) prompt = strdupAtoW(szDiskPrompt); + + r = MsiSourceListAddMediaDiskW(product, usersid, dwContext, dwOptions, + dwDiskId, volume, prompt); + + msi_free(product); + msi_free(usersid); + msi_free(volume); + msi_free(prompt); + + return r; +} + +/****************************************************************** + * MsiSourceListAddMediaDiskW (MSI.@) */ UINT WINAPI MsiSourceListAddMediaDiskW(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINSTALLCONTEXT dwContext, DWORD dwOptions, DWORD dwDiskId, @@ -975,7 +1004,7 @@ UINT WINAPI MsiSourceListAddMediaDiskW(LPCWSTR szProduct, LPCWSTR szUserSid, if (dwContext == MSIINSTALLCONTEXT_USERUNMANAGED) FIXME("Unknown context MSIINSTALLCONTEXT_USERUNMANAGED\n"); - rc = OpenSourceKey(szProduct, &sourcekey, MSICODE_PRODUCT, dwContext, TRUE); + rc = OpenSourceKey(szProduct, &sourcekey, MSICODE_PRODUCT, dwContext, FALSE); if (rc != ERROR_SUCCESS) return ERROR_UNKNOWN_PRODUCT; diff --git a/dlls/msi/tests/automation.c b/dlls/msi/tests/automation.c index 11d952aec6c..358d1bc97eb 100644 --- a/dlls/msi/tests/automation.c +++ b/dlls/msi/tests/automation.c @@ -2139,7 +2139,7 @@ static void test_Installer_InstallProduct(void) /* Package name */ memset(szString, 0, sizeof(szString)); hr = Installer_ProductInfo(szProductCode, WINE_INSTALLPROPERTY_PACKAGENAMEW, szString); - todo_wine ok(hr == S_OK, "Installer_ProductInfo failed, hresult 0x%08x\n", hr); + ok(hr == S_OK, "Installer_ProductInfo failed, hresult 0x%08x\n", hr); todo_wine ok_w2("Installer_ProductInfo returned %s but expected %s\n", szString, szMsifile); /* Product name */ @@ -2248,11 +2248,6 @@ static void test_Installer_InstallProduct(void) res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products\\05FA3C1F65B896A40AC00077F34EF203"); todo_wine ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_SUCCESS, got %d\n", res); - res = delete_registry_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\" - "CurrentVersion\\Installer\\Managed\\S-1-5-4\\" - "Installer\\Products\\05FA3C1F65B896A40AC00077F34EF203"); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - /* Delete installation files we installed */ delete_test_files(); } diff --git a/dlls/msi/tests/source.c b/dlls/msi/tests/source.c index 7c8b4d70e1b..c11b3f1ff49 100644 --- a/dlls/msi/tests/source.c +++ b/dlls/msi/tests/source.c @@ -1940,6 +1940,329 @@ static void test_MsiSourceListSetInfo(void) RegCloseKey(prodkey); } +static void test_MsiSourceListAddMediaDisk(void) +{ + CHAR prodcode[MAX_PATH]; + CHAR prod_squashed[MAX_PATH]; + CHAR keypath[MAX_PATH*2]; + HKEY prodkey, userkey; + HKEY media, source; + LPSTR usersid; + LONG res; + UINT r; + + create_test_guid(prodcode, prod_squashed); + get_user_sid(&usersid); + + /* GetLastError is not set by the function */ + + /* NULL szProductCodeOrPatchCode */ + r = MsiSourceListAddMediaDiskA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + + /* empty szProductCodeOrPatchCode */ + r = MsiSourceListAddMediaDiskA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + /* garbage szProductCodeOrPatchCode */ + r = MsiSourceListAddMediaDiskA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + /* guid without brackets */ + r = MsiSourceListAddMediaDiskA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", + usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + /* guid with brackets */ + r = MsiSourceListAddMediaDiskA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", + usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + ok(r == ERROR_UNKNOWN_PRODUCT, + "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + + /* dwOptions has MSISOURCETYPE_NETWORK */ + r = MsiSourceListAddMediaDiskA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", + usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, + 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + /* dwOptions has MSISOURCETYPE_URL */ + r = MsiSourceListAddMediaDiskA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", + usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_URL, + 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + /* dwOptions has MSISOURCETYPE_MEDIA */ + r = MsiSourceListAddMediaDiskA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", + usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_MEDIA, + 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + /* MSIINSTALLCONTEXT_USERUNMANAGED */ + + lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); + lstrcatA(keypath, prod_squashed); + + res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + /* user product key exists */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_BAD_CONFIGURATION, + "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); + } + + res = RegCreateKeyA(userkey, "SourceList", &source); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + /* SourceList key exists */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* Media subkey is created by MsiSourceListAddMediaDisk */ + res = RegOpenKeyA(source, "Media", &media); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(media, "1", "label;prompt"); + + /* dwDiskId is random */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 42, "label42", "prompt42"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + CHECK_REG_STR(media, "1", "label;prompt"); + CHECK_REG_STR(media, "42", "label42;prompt42"); + + /* dwDiskId is 0 */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 0, "label0", "prompt0"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + CHECK_REG_STR(media, "0", "label0;prompt0"); + CHECK_REG_STR(media, "1", "label;prompt"); + CHECK_REG_STR(media, "42", "label42;prompt42"); + + /* dwDiskId is < 0 */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, -1, "label-1", "prompt-1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + CHECK_REG_STR(media, "-1", "label-1;prompt-1"); + CHECK_REG_STR(media, "0", "label0;prompt0"); + CHECK_REG_STR(media, "1", "label;prompt"); + CHECK_REG_STR(media, "42", "label42;prompt42"); + + /* update dwDiskId 1 */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "newlabel", "newprompt"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + CHECK_REG_STR(media, "-1", "label-1;prompt-1"); + CHECK_REG_STR(media, "0", "label0;prompt0"); + CHECK_REG_STR(media, "1", "newlabel;newprompt"); + CHECK_REG_STR(media, "42", "label42;prompt42"); + + /* update dwDiskId 1, szPrompt is NULL */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "etiqueta", NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + CHECK_REG_STR(media, "-1", "label-1;prompt-1"); + CHECK_REG_STR(media, "0", "label0;prompt0"); + CHECK_REG_STR(media, "1", "etiqueta;"); + CHECK_REG_STR(media, "42", "label42;prompt42"); + + /* update dwDiskId 1, szPrompt is empty */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "etikett", ""); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + /* update dwDiskId 1, szVolumeLable is NULL */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, NULL, "provocar"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + CHECK_REG_STR(media, "-1", "label-1;prompt-1"); + CHECK_REG_STR(media, "0", "label0;prompt0"); + CHECK_REG_STR(media, "1", ";provocar"); + CHECK_REG_STR(media, "42", "label42;prompt42"); + + /* update dwDiskId 1, szVolumeLable is empty */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, "", "provoquer"); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + /* szUserSid is NULL */ + r = MsiSourceListAddMediaDiskA(prodcode, NULL, + MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, 1, NULL, "provoquer"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + CHECK_REG_STR(media, "-1", "label-1;prompt-1"); + CHECK_REG_STR(media, "0", "label0;prompt0"); + CHECK_REG_STR(media, "1", ";provoquer"); + CHECK_REG_STR(media, "42", "label42;prompt42"); + + RegDeleteValueA(media, "-1"); + RegDeleteValueA(media, "0"); + RegDeleteValueA(media, "1"); + RegDeleteValueA(media, "42"); + RegDeleteKeyA(media, ""); + RegCloseKey(media); + RegDeleteKeyA(source, ""); + RegCloseKey(source); + RegDeleteKeyA(userkey, ""); + RegCloseKey(userkey); + + /* MSIINSTALLCONTEXT_USERMANAGED */ + + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); + lstrcatA(keypath, usersid); + lstrcatA(keypath, "\\Installer\\Products\\"); + lstrcatA(keypath, prod_squashed); + + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + /* user product key exists */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_BAD_CONFIGURATION, + "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); + } + + res = RegCreateKeyA(userkey, "SourceList", &source); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + /* SourceList key exists */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_USERMANAGED, + MSICODE_PRODUCT, 1, "label", "prompt"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* Media subkey is created by MsiSourceListAddMediaDisk */ + res = RegOpenKeyA(source, "Media", &media); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(media, "1", "label;prompt"); + + RegDeleteValueA(media, "1"); + RegDeleteKeyA(media, ""); + RegCloseKey(media); + RegDeleteKeyA(source, ""); + RegCloseKey(source); + RegDeleteKeyA(userkey, ""); + RegCloseKey(userkey); + + /* MSIINSTALLCONTEXT_MACHINE */ + + lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); + lstrcatA(keypath, prod_squashed); + + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + /* machine product key exists */ + r = MsiSourceListAddMediaDiskA(prodcode, NULL, + MSIINSTALLCONTEXT_MACHINE, + MSICODE_PRODUCT, 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_BAD_CONFIGURATION, + "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); + } + + res = RegCreateKeyA(prodkey, "SourceList", &source); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + /* SourceList key exists */ + r = MsiSourceListAddMediaDiskA(prodcode, NULL, + MSIINSTALLCONTEXT_MACHINE, + MSICODE_PRODUCT, 1, "label", "prompt"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* Media subkey is created by MsiSourceListAddMediaDisk */ + res = RegOpenKeyA(source, "Media", &media); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(media, "1", "label;prompt"); + + /* szUserSid is non-NULL */ + r = MsiSourceListAddMediaDiskA(prodcode, usersid, + MSIINSTALLCONTEXT_MACHINE, + MSICODE_PRODUCT, 1, "label", "prompt"); + todo_wine + { + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + } + + RegDeleteValueA(media, "1"); + RegDeleteKeyA(media, ""); + RegCloseKey(media); + RegDeleteKeyA(source, ""); + RegCloseKey(source); + RegDeleteKeyA(prodkey, ""); + RegCloseKey(prodkey); +} + START_TEST(source) { init_functionpointers(); @@ -1948,4 +2271,5 @@ START_TEST(source) test_MsiSourceListAddSourceEx(); test_MsiSourceListEnumSources(); test_MsiSourceListSetInfo(); + test_MsiSourceListAddMediaDisk(); }