[MSI_WINETEST] Sync with Wine Staging 1.7.55. CORE-10536
authorAmine Khaldi <amine.khaldi@reactos.org>
Sat, 21 Nov 2015 16:45:05 +0000 (16:45 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sat, 21 Nov 2015 16:45:05 +0000 (16:45 +0000)
svn path=/trunk/; revision=69996

rostests/winetests/msi/action.c
rostests/winetests/msi/automation.c
rostests/winetests/msi/install.c
rostests/winetests/msi/msi.c
rostests/winetests/msi/package.c

index 4ff1ab8..281245a 100644 (file)
@@ -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");
index 0ddf1d9..b034789 100644 (file)
@@ -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();
 
index c60e01f..1385a2b 100644 (file)
@@ -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");
index f4d6db0..be9d6d8 100644 (file)
@@ -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);
index 28d3e54..41f0f9f 100644 (file)
@@ -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);