From: Amine Khaldi Date: Sat, 21 Nov 2015 16:45:05 +0000 (+0000) Subject: [MSI_WINETEST] Sync with Wine Staging 1.7.55. CORE-10536 X-Git-Tag: ReactOS-0.4.0~64 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=86345c31fe41589ae0679a94274f8dfee51e7d9e;ds=sidebyside [MSI_WINETEST] Sync with Wine Staging 1.7.55. CORE-10536 svn path=/trunk/; revision=69996 --- diff --git a/rostests/winetests/msi/action.c b/rostests/winetests/msi/action.c index 4ff1ab8e951..281245aff71 100644 --- a/rostests/winetests/msi/action.c +++ b/rostests/winetests/msi/action.c @@ -214,7 +214,8 @@ static const char environment_dat[] = "Var23\t+-MSITESTVAR19\t1\tOne\n" "Var24\t+-MSITESTVAR19\t[~]2\tOne\n" "Var25\t+-MSITESTVAR20\t1\tOne\n" - "Var26\t+-MSITESTVAR20\t2[~]\tOne\n"; + "Var26\t+-MSITESTVAR20\t2[~]\tOne\n" + "Var27\t+-MSITESTVAR21\t[~];1\tOne\n"; static const char service_install_dat[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t" @@ -1201,7 +1202,13 @@ static const char res_environment_dat[] = "var2\t=+-MSITESTVAR2\t1\tenvvar\n" "var3\t=MSITESTVAR3\t1\tenvvar\n" "var4\t=-MSITESTVAR4\t\tenvvar\n" - "var5\t=MSITESTVAR5\t\tenvvar\n"; + "var5\t=MSITESTVAR5\t\tenvvar\n" + "Var6\t-MSITESTVAR6\t1;[~]\tenvvar\n" + "Var7\t-MSITESTVAR7\t[~];1\tenvvar\n" + "Var8\t-MSITESTVAR8\t1;[~]\tenvvar\n" + "Var9\t-MSITESTVAR9\t[~];1\tenvvar\n" + "Var10\t-MSITESTVAR10\t1\tenvvar\n" + "Var11\t-MSITESTVAR11\t2\tenvvar\n"; static const char res_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" @@ -5135,6 +5142,7 @@ static void test_envvar(void) "1;;2;;", /* MSITESTVAR18 */ "1", /* MSITESTVAR19 */ "1", /* MSITESTVAR20 */ + "1", /* MSITESTVAR21 */ NULL }; UINT r; @@ -5162,6 +5170,9 @@ static void test_envvar(void) res = RegSetValueExA(env, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"0", 2); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegSetValueExA(env, "MSITESTVAR21", 0, REG_SZ, (const BYTE *)"1", 2); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); @@ -5254,6 +5265,7 @@ static void test_envvar(void) error: RegDeleteValueA(env, "MSITESTVAR1"); RegDeleteValueA(env, "MSITESTVAR2"); + RegDeleteValueA(env, "MSITESTVAR21"); RegCloseKey(env); delete_test_files(); @@ -5838,10 +5850,14 @@ static void test_publish_components(void) { static const char keypath[] = "Software\\Microsoft\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA"; + static const char keypath2[] = + "Software\\Classes\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA"; UINT r; LONG res; HKEY key; + BYTE *data; + DWORD size; if (is_process_limited()) { @@ -5863,11 +5879,49 @@ static void test_publish_components(void) } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + size = 0; + r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}", + "english.txt", INSTALLMODE_DEFAULT, NULL, &size); + ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r); + res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key); ok(res == ERROR_SUCCESS, "components key not created %d\n", res); - res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, NULL); + res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, &size); ok(res == ERROR_SUCCESS, "value not found %d\n", res); + + data = HeapAlloc(GetProcessHeap(), 0, size); + res = RegQueryValueExA(key, "english.txt", NULL, NULL, data, &size); + ok(res == ERROR_SUCCESS, "value not found %d\n", res); + RegCloseKey(key); + + res = RegDeleteKeyA(HKEY_CURRENT_USER, keypath); + ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res); + + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath2, 0, NULL, REG_OPTION_NON_VOLATILE, + MAXIMUM_ALLOWED | KEY_WOW64_64KEY, NULL, &key, NULL ); + ok(res == ERROR_SUCCESS, "RegCreateKeyEx failed %d\n", res); + res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size); + ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res); + RegCloseKey(key); + + size = 0; + r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}", + "english.txt", INSTALLMODE_DEFAULT, NULL, &size); + ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r); + + if (pRegDeleteKeyExA) + res = pRegDeleteKeyExA(HKEY_LOCAL_MACHINE, keypath2, KEY_WOW64_64KEY, 0); + else + res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, keypath2); + ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res); + + res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &key); + ok(res == ERROR_SUCCESS, "RegCreateKey failed %d\n", res); + + res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size); + ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res); + HeapFree(GetProcessHeap(), 0, data); RegCloseKey(key); r = MsiInstallProductA(msifile, "REMOVE=ALL"); @@ -6188,6 +6242,12 @@ static void test_remove_env_strings(void) RegSetValueExA(key, "MSITESTVAR3", 0, REG_SZ, (const BYTE *)"1", 2); RegSetValueExA(key, "MSITESTVAR4", 0, REG_SZ, (const BYTE *)"1", 2); RegSetValueExA(key, "MSITESTVAR5", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR6", 0, REG_SZ, (const BYTE *)"1;2", 4); + RegSetValueExA(key, "MSITESTVAR7", 0, REG_SZ, (const BYTE *)"1;2", 4); + RegSetValueExA(key, "MSITESTVAR8", 0, REG_SZ, (const BYTE *)"2;1;0", 6); + RegSetValueExA(key, "MSITESTVAR9", 0, REG_SZ, (const BYTE *)"0;1;2", 6); + RegSetValueExA(key, "MSITESTVAR10", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR11", 0, REG_SZ, (const BYTE *)"1", 2); RegCloseKey(key); @@ -6277,6 +6337,57 @@ static void test_remove_env_strings(void) ok(!lstrcmpA(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); RegDeleteValueA(key, "MSITESTVAR5"); + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR6", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmpA(buffer, "2"), "expected \"2\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR6"); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR7", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmpA(buffer, "2"), "expected \"2\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR7"); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR8", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmpA(buffer, "2;0"), "expected \"2;0\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR8"); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR9", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmpA(buffer, "0;2"), "expected \"0;2\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR9"); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR10", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR11", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmpA(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR11"); + ok(!delete_pf("msitest\\envvar.txt", TRUE), "file not removed\n"); ok(!delete_pf("msitest", FALSE), "directory not removed\n"); @@ -6286,6 +6397,12 @@ error: RegDeleteValueA(key, "MSITESTVAR3"); RegDeleteValueA(key, "MSITESTVAR4"); RegDeleteValueA(key, "MSITESTVAR5"); + RegDeleteValueA(key, "MSITESTVAR6"); + RegDeleteValueA(key, "MSITESTVAR7"); + RegDeleteValueA(key, "MSITESTVAR8"); + RegDeleteValueA(key, "MSITESTVAR9"); + RegDeleteValueA(key, "MSITESTVAR10"); + RegDeleteValueA(key, "MSITESTVAR11"); RegCloseKey(key); DeleteFileA("msitest\\envvar.txt"); diff --git a/rostests/winetests/msi/automation.c b/rostests/winetests/msi/automation.c index 0ddf1d9ff1b..b034789c7a5 100644 --- a/rostests/winetests/msi/automation.c +++ b/rostests/winetests/msi/automation.c @@ -1127,6 +1127,25 @@ static HRESULT Installer_UILevelPut(int level) return invoke(pInstaller, "UILevel", DISPATCH_PROPERTYPUT, &dispparams, &varresult, VT_EMPTY); } +static HRESULT Installer_SummaryInformation(BSTR PackagePath, int UpdateCount, IDispatch **pSumInfo) +{ + VARIANT varresult; + VARIANTARG vararg[2]; + DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0}; + HRESULT hr; + + VariantInit(&vararg[1]); + V_VT(&vararg[1]) = VT_BSTR; + V_BSTR(&vararg[1]) = SysAllocString(PackagePath); + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_I4; + V_I4(&vararg[0]) = UpdateCount; + + hr = invoke(pInstaller, "SummaryInformation", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_DISPATCH); + *pSumInfo = V_DISPATCH(&varresult); + return hr; +} + static HRESULT Session_Installer(IDispatch *pSession, IDispatch **pInst) { VARIANT varresult; @@ -1184,7 +1203,7 @@ static HRESULT Session_LanguageGet(IDispatch *pSession, UINT *pLangId) return hr; } -static HRESULT Session_ModeGet(IDispatch *pSession, int iFlag, BOOL *pMode) +static HRESULT Session_ModeGet(IDispatch *pSession, int iFlag, VARIANT_BOOL *mode) { VARIANT varresult; VARIANTARG vararg[1]; @@ -1196,12 +1215,12 @@ static HRESULT Session_ModeGet(IDispatch *pSession, int iFlag, BOOL *pMode) V_I4(&vararg[0]) = iFlag; hr = invoke(pSession, "Mode", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_BOOL); - *pMode = V_BOOL(&varresult); + *mode = V_BOOL(&varresult); VariantClear(&varresult); return hr; } -static HRESULT Session_ModePut(IDispatch *pSession, int iFlag, BOOL bMode) +static HRESULT Session_ModePut(IDispatch *pSession, int iFlag, VARIANT_BOOL mode) { VARIANT varresult; VARIANTARG vararg[2]; @@ -1213,7 +1232,7 @@ static HRESULT Session_ModePut(IDispatch *pSession, int iFlag, BOOL bMode) V_I4(&vararg[1]) = iFlag; VariantInit(&vararg[0]); V_VT(&vararg[0]) = VT_BOOL; - V_BOOL(&vararg[0]) = bMode; + V_BOOL(&vararg[0]) = mode; return invoke(pSession, "Mode", DISPATCH_PROPERTYPUT, &dispparams, &varresult, VT_EMPTY); } @@ -1856,7 +1875,7 @@ static void test_Session(IDispatch *pSession) WCHAR stringw[MAX_PATH]; CHAR string[MAX_PATH]; UINT len; - BOOL bool; + VARIANT_BOOL bool; int myint; IDispatch *pDatabase = NULL, *pInst = NULL, *record = NULL; ULONG refs_before, refs_after; @@ -1924,15 +1943,15 @@ static void test_Session(IDispatch *pSession) ok(!bool, "Maintenance mode is %d\n", bool); /* Session::Mode, put */ - hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTATEND, TRUE); + hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTATEND, VARIANT_TRUE); ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr); hr = Session_ModeGet(pSession, MSIRUNMODE_REBOOTATEND, &bool); ok(hr == S_OK, "Session_ModeGet failed, hresult 0x%08x\n", hr); ok(bool, "Reboot at end session mode is %d, expected 1\n", bool); - hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTATEND, FALSE); /* set it again so we don't reboot */ + hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTATEND, VARIANT_FALSE); /* set it again so we don't reboot */ ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr); - hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, TRUE); + hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, VARIANT_TRUE); ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr); ok_exception(hr, szModeFlag); @@ -1940,11 +1959,11 @@ static void test_Session(IDispatch *pSession) ok(hr == S_OK, "Session_ModeGet failed, hresult 0x%08x\n", hr); ok(bool, "Reboot now mode is %d, expected 1\n", bool); - hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, FALSE); /* set it again so we don't reboot */ + hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, VARIANT_FALSE); /* set it again so we don't reboot */ ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr); ok_exception(hr, szModeFlag); - hr = Session_ModePut(pSession, MSIRUNMODE_MAINTENANCE, TRUE); + hr = Session_ModePut(pSession, MSIRUNMODE_MAINTENANCE, VARIANT_TRUE); ok(hr == DISP_E_EXCEPTION, "Session_ModePut failed, hresult 0x%08x\n", hr); ok_exception(hr, szModeFlag); @@ -2601,7 +2620,7 @@ static void test_Installer(void) static const WCHAR szIntegerDataException[] = { 'I','n','t','e','g','e','r','D','a','t','a',',','F','i','e','l','d',0 }; WCHAR szPath[MAX_PATH]; HRESULT hr; - IDispatch *pSession = NULL, *pDatabase = NULL, *pRecord = NULL, *pStringList = NULL; + IDispatch *pSession = NULL, *pDatabase = NULL, *pRecord = NULL, *pStringList = NULL, *pSumInfo = NULL; int iValue, iCount; if (!pInstaller) return; @@ -2677,6 +2696,18 @@ static void test_Installer(void) IDispatch_Release(pDatabase); } + /* Installer::SummaryInformation */ + hr = Installer_SummaryInformation(szPath, 0, &pSumInfo); + ok(hr == S_OK, "Installer_SummaryInformation failed, hresult 0x%08x\n", hr); + if (hr == S_OK) + { + test_SummaryInfo(pSumInfo, summary_info, sizeof(summary_info)/sizeof(msi_summary_info), TRUE); + IDispatch_Release(pSumInfo); + } + + hr = Installer_SummaryInformation(NULL, 0, &pSumInfo); + ok(hr == DISP_E_EXCEPTION, "Installer_SummaryInformation failed, hresult 0x%08x\n", hr); + /* Installer::RegistryValue */ test_Installer_RegistryValue(); diff --git a/rostests/winetests/msi/install.c b/rostests/winetests/msi/install.c index c60e01fefdc..1385a2b3692 100644 --- a/rostests/winetests/msi/install.c +++ b/rostests/winetests/msi/install.c @@ -1110,10 +1110,16 @@ static const char vp_custom_action_dat[] = "CustomAction\tAction\n" "TestPrimaryVolumePath0\t19\t\tPrimaryVolumePath set before CostFinalize\t\n" "TestPrimaryVolumeSpaceAvailable0\t19\t\tPrimaryVolumeSpaceAvailable set before CostFinalize\t\n" + "TestPrimaryVolumeSpaceRequired0\t19\t\tPrimaryVolumeSpaceRequired set before CostFinalize\t\n" + "TestPrimaryVolumeSpaceRemaining0\t19\t\tPrimaryVolumeSpaceRemaining set before CostFinalize\t\n" "TestPrimaryVolumePath1\t19\t\tPrimaryVolumePath set before InstallValidate\t\n" "TestPrimaryVolumeSpaceAvailable1\t19\t\tPrimaryVolumeSpaceAvailable not set before InstallValidate\t\n" + "TestPrimaryVolumeSpaceRequired1\t19\t\tPrimaryVolumeSpaceRequired not set before InstallValidate\t\n" + "TestPrimaryVolumeSpaceRemaining1\t19\t\tPrimaryVolumeSpaceRemaining not set before InstallValidate\t\n" "TestPrimaryVolumePath2\t19\t\tPrimaryVolumePath not set after InstallValidate\t\n" - "TestPrimaryVolumeSpaceAvailable2\t19\t\tPrimaryVolumeSpaceAvailable not set after InstallValidate\t\n"; + "TestPrimaryVolumeSpaceAvailable2\t19\t\tPrimaryVolumeSpaceAvailable not set after InstallValidate\t\n" + "TestPrimaryVolumeSpaceRequired2\t19\t\tPrimaryVolumeSpaceRequired not set after InstallValidate\t\n" + "TestPrimaryVolumeSpaceRemaining2\t19\t\tPrimaryVolumeSpaceRemaining not set after InstallValidate\t\n"; static const char vp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" @@ -1124,12 +1130,18 @@ static const char vp_install_exec_seq_dat[] = "FileCost\t\t300\n" "TestPrimaryVolumePath0\tPrimaryVolumePath AND NOT REMOVE\t400\n" "TestPrimaryVolumeSpaceAvailable0\tPrimaryVolumeSpaceAvailable AND NOT REMOVE\t500\n" + "TestPrimaryVolumeSpaceRequired0\tPrimaryVolumeSpaceRequired AND NOT REMOVE\t510\n" + "TestPrimaryVolumeSpaceRemaining0\tPrimaryVolumeSpaceRemaining AND NOT REMOVE\t520\n" "CostFinalize\t\t600\n" "TestPrimaryVolumePath1\tPrimaryVolumePath AND NOT REMOVE\t600\n" "TestPrimaryVolumeSpaceAvailable1\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t800\n" + "TestPrimaryVolumeSpaceRequired1\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t810\n" + "TestPrimaryVolumeSpaceRemaining1\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t820\n" "InstallValidate\t\t900\n" "TestPrimaryVolumePath2\tNOT PrimaryVolumePath AND NOT REMOVE\t1000\n" "TestPrimaryVolumeSpaceAvailable2\tNOT PrimaryVolumeSpaceAvailable AND NOT REMOVE\t1100\n" + "TestPrimaryVolumeSpaceRequired2\tNOT PrimaryVolumeSpaceRequired AND NOT REMOVE\t1110\n" + "TestPrimaryVolumeSpaceRemaining2\tNOT PrimaryVolumeSpaceRemaining AND NOT REMOVE\t1120\n" "InstallInitialize\t\t1200\n" "ProcessComponents\t\t1300\n" "RemoveFiles\t\t1400\n" @@ -3157,6 +3169,11 @@ static void test_samesequence(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_FAILURE) + { + win_skip("unprivileged user?\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); if (r == ERROR_SUCCESS) { @@ -3165,6 +3182,8 @@ static void test_samesequence(void) ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "Directory not created\n"); } + +error: delete_cab_files(); DeleteFileA(msifile); } @@ -3179,6 +3198,12 @@ static void test_uiLevelFlags(void) MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_FAILURE) + { + win_skip("unprivileged user?\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); if (r == ERROR_SUCCESS) { @@ -3187,6 +3212,8 @@ static void test_uiLevelFlags(void) ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "Directory not created\n"); } + +error: delete_cab_files(); DeleteFileA(msifile); } @@ -4687,6 +4714,16 @@ static void test_propcase(void) ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "Directory not created\n"); + r = MsiInstallProductA(msifile, "Prop1=\"Copyright \"\"My Company\"\" 2015\" MyProp=42"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + r = MsiInstallProductA(msifile, "Prop1=\"\"\"install.exe\"\" /Install\" MyProp=\"42\""); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + error: DeleteFileA(msifile); DeleteFileA("msitest\\augustus"); diff --git a/rostests/winetests/msi/msi.c b/rostests/winetests/msi/msi.c index f4d6db0c706..be9d6d8265c 100644 --- a/rostests/winetests/msi/msi.c +++ b/rostests/winetests/msi/msi.c @@ -48,6 +48,8 @@ static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); static INSTALLSTATE (WINAPI *pMsiGetComponentPathA) (LPCSTR, LPCSTR, LPSTR, DWORD*); +static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA) + (LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD); static INSTALLSTATE (WINAPI *pMsiProvideComponentA) (LPCSTR, LPCSTR, LPCSTR, DWORD, LPSTR, LPDWORD); static INSTALLSTATE (WINAPI *pMsiProvideComponentW) @@ -90,6 +92,7 @@ static void init_functionpointers(void) trace("GetProcAddress(%s) failed\n", #func); GET_PROC(hmsi, MsiGetComponentPathA) + GET_PROC(hmsi, MsiGetComponentPathExA); GET_PROC(hmsi, MsiProvideComponentA) GET_PROC(hmsi, MsiProvideComponentW) GET_PROC(hmsi, MsiGetFileHashA) @@ -4224,12 +4227,11 @@ static void test_MsiGetFileVersion(void) ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz); /* pcchLangBuf not big enough */ - langsz = 3; + langsz = 4; lstrcpyA(lang, "lang"); r = MsiGetFileVersionA(path, NULL, NULL, lang, &langsz); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); - ok(!strncmp(lang, langcheck, 2), - "Expected first character of \"%s\", got \"%s\"\n", langcheck, lang); + ok(lstrcmpA(lang, "lang"), "lang not set\n"); ok(langsz >= langchecksz, "Expected %d >= %d\n", langsz, langchecksz); /* pcchVersionBuf big enough, pcchLangBuf not big enough */ @@ -4250,7 +4252,7 @@ static void test_MsiGetFileVersion(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz); ok(langsz >= langchecksz && langsz < MAX_PATH, "Expected %d >= %d\n", langsz, langchecksz); - ok(lstrcmpA(lang, "lang"), "lang buffer not modified\n"); + ok(strstr(lang, langcheck) != NULL, "expected %s in %s\n", langcheck, lang); /* NULL pcchVersionBuf and pcchLangBuf */ r = MsiGetFileVersionA(path, version, NULL, lang, NULL); @@ -14432,7 +14434,8 @@ START_TEST(msi) test_lastusedsource(); test_setpropertyfolder(); test_sourcedir_props(); - test_concurrentinstall(); + if (pMsiGetComponentPathExA) + test_concurrentinstall(); test_command_line_parsing(); SetCurrentDirectoryA(prev_path); diff --git a/rostests/winetests/msi/package.c b/rostests/winetests/msi/package.c index 28d3e54f989..41f0f9f763e 100644 --- a/rostests/winetests/msi/package.c +++ b/rostests/winetests/msi/package.c @@ -3414,7 +3414,7 @@ static void test_states(void) /* reinstall the product */ r = MsiInstallProductA(msifile3, "REINSTALL=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(r == ERROR_SUCCESS || broken(r == ERROR_INSTALL_FAILURE) /* win2k3 */, "Expected ERROR_SUCCESS, got %d\n", r); state = MsiQueryFeatureStateA("{7262AC98-EEBD-4364-8CE3-D654F6A425B9}", "five"); ok(state == INSTALLSTATE_UNKNOWN, "state = %d\n", state);