Author: akhaldi Date: Mon Mar 9 20:28:54 2015 New Revision: 66633
URL: http://svn.reactos.org/svn/reactos?rev=66633&view=rev Log: [MSI_WINETEST] Sync with Wine Staging 1.7.37. CORE-9246
Modified: trunk/rostests/winetests/msi/action.c trunk/rostests/winetests/msi/automation.c trunk/rostests/winetests/msi/db.c trunk/rostests/winetests/msi/install.c trunk/rostests/winetests/msi/msi.c trunk/rostests/winetests/msi/package.c trunk/rostests/winetests/msi/source.c
Modified: trunk/rostests/winetests/msi/action.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/action.c?rev... ============================================================================== --- trunk/rostests/winetests/msi/action.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msi/action.c [iso-8859-1] Mon Mar 9 20:28:54 2015 @@ -182,7 +182,8 @@ "SERVNAME2\tTestService2\n" "SERVDISP\tTestServiceDisp\n" "SERVDISP2\tTestServiceDisp2\n" - "MSIFASTINSTALL\t1\n"; + "MSIFASTINSTALL\t1\n" + "regdata15\t#x01\n";
static const char environment_dat[] = "Environment\tName\tValue\tComponent_\n" @@ -242,7 +243,10 @@ "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n" "s72\tl255\ti2\tL255\tI2\ts72\n" "ServiceControl\tServiceControl\n" - "ServiceControl\tSpooler\t1\t\t0\tservice_comp"; + "ServiceControl\tSpooler\t1\t\t1\tservice_comp\n" + "ServiceControl2\tSpooler\t2\t\t1\tservice_comp\n" + "ServiceControl3\tSpooler\t16\t\t1\tservice_comp\n" + "ServiceControl4\tSpooler\t32\t\t1\tservice_comp\n";
static const char sss_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" @@ -255,11 +259,15 @@ "CostFinalize\t\t1000\n" "InstallValidate\t\t1400\n" "InstallInitialize\t\t1500\n" + "StopServices\t\t4000\n" "DeleteServices\t\t5000\n" "MoveFiles\t\t5100\n" "InstallFiles\t\t5200\n" "DuplicateFiles\t\t5300\n" "StartServices\t\t5400\n" + "RegisterProduct\t\t5500\n" + "PublishFeatures\t\t5600\n" + "PublishProduct\t\t5700\n" "InstallFinalize\t\t6000\n";
static const char sds_install_exec_seq_dat[] = @@ -510,7 +518,11 @@ "regdata8\t2\tSOFTWARE\Wine\msitest\tValue4\tone[~]two\taugustus\n" "regdata9\t2\tSOFTWARE\Wine\msitest\tValue5\t[~]one[~]two[~]three\taugustus\n" "regdata10\t2\tSOFTWARE\Wine\msitest\tValue6\t[~]\taugustus\n" - "regdata11\t2\tSOFTWARE\Wine\msitest\tValue7\t[~]two\taugustus\n"; + "regdata11\t2\tSOFTWARE\Wine\msitest\tValue7\t[~]two\taugustus\n" + "regdata12\t2\tSOFTWARE\Wine\msitest\tValue8\t#1\taugustus\n" + "regdata13\t2\tSOFTWARE\Wine\msitest\tValue9\t#x1\taugustus\n" + "regdata14\t2\tSOFTWARE\Wine\msitest\tValue10\t#x01\taugustus\n" + "regdata15\t2\tSOFTWARE\Wine\msitest\tValue11\t[regdata15]\taugustus\n";
static const char cf_directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n" @@ -2706,7 +2718,7 @@ }
if (!expected) - ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val); + ok_(__FILE__, line)(!val[0], "Expected empty string, got %s\n", val); else { if (bcase) @@ -4919,6 +4931,7 @@ HKEY hkey; DWORD type, size; CHAR path[MAX_PATH]; + BYTE buf[8];
if (is_process_limited()) { @@ -5050,6 +5063,42 @@ ok(!memcmp(path, "two\0", size), "Wrong multi-sz data\n"); ok(size == 5, "Expected 5, got %d\n", size); ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type); + + size = sizeof(buf); + type = 0xdeadbeef; + memset(buf, 0, size); + res = RegQueryValueExA(hkey, "Value8", NULL, &type, buf, &size); + ok(res == ERROR_SUCCESS, "got %u\n", res); + ok(*(DWORD *)buf == 1, "got %u\n", *(DWORD *)buf); + ok(size == 4, "got %u\n", size); + ok(type == REG_DWORD, "got %u\n", type); + + size = sizeof(buf); + type = 0xdeadbeef; + memset(buf, 0, size); + res = RegQueryValueExA(hkey, "Value9", NULL, &type, buf, &size); + ok(res == ERROR_SUCCESS, "got %u\n", res); + ok(buf[0] == 1, "got %u\n", buf[0]); + ok(size == 1, "got %u\n", size); + ok(type == REG_BINARY, "got %u\n", type); + + size = sizeof(buf); + type = 0xdeadbeef; + memset(buf, 0, size); + res = RegQueryValueExA(hkey, "Value10", NULL, &type, buf, &size); + ok(res == ERROR_SUCCESS, "got %u\n", res); + ok(buf[0] == 1, "got %u\n", buf[0]); + ok(size == 1, "got %u\n", size); + ok(type == REG_BINARY, "got %u\n", type); + + size = sizeof(buf); + type = 0xdeadbeef; + memset(buf, 0, size); + res = RegQueryValueExA(hkey, "Value11", NULL, &type, buf, &size); + ok(res == ERROR_SUCCESS, "got %u\n", res); + ok(buf[0] == 1, "got %u\n", buf[0]); + ok(size == 1, "got %u\n", size); + ok(type == REG_BINARY, "got %u\n", type);
RegDeleteValueA(hkey, "Value"); RegDeleteValueA(hkey, "Value1"); @@ -5059,6 +5108,10 @@ RegDeleteValueA(hkey, "Value5"); RegDeleteValueA(hkey, "Value6"); RegDeleteValueA(hkey, "Value7"); + RegDeleteValueA(hkey, "Value8"); + RegDeleteValueA(hkey, "Value9"); + RegDeleteValueA(hkey, "Value10"); + RegDeleteValueA(hkey, "Value11"); RegCloseKey(hkey); RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\Wine\msitest");
@@ -5260,7 +5313,7 @@ DeleteFileA(msifile); }
-static void test_start_services(void) +static void test_start_stop_services(void) { UINT r; SC_HANDLE scm, service; @@ -5307,6 +5360,23 @@ MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + if (error == ERROR_SUCCESS) + { + SERVICE_STATUS status; + + scm = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); + service = OpenServiceA(scm, "Spooler", SC_MANAGER_ALL_ACCESS); + + ret = ControlService(service, SERVICE_CONTROL_STOP, &status); + ok(ret, "ControlService failed %u\n", GetLastError()); + + CloseServiceHandle(service); + CloseServiceHandle(scm); + } + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\cabout\new\five.txt", TRUE), "File not installed\n"); @@ -5323,22 +5393,22 @@ ok(delete_pf("msitest\service2.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "Directory not created\n");
+ if (error == ERROR_SUCCESS) + { + SERVICE_STATUS status; + + scm = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); + service = OpenServiceA(scm, "Spooler", SC_MANAGER_ALL_ACCESS); + + ret = ControlService(service, SERVICE_CONTROL_STOP, &status); + ok(ret, "ControlService failed %u\n", GetLastError()); + + CloseServiceHandle(service); + CloseServiceHandle(scm); + } + delete_test_files(); DeleteFileA(msifile); - - if (error == ERROR_SUCCESS) - { - SERVICE_STATUS status; - - scm = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); - service = OpenServiceA(scm, "Spooler", SC_MANAGER_ALL_ACCESS); - - ret = ControlService(service, SERVICE_CONTROL_STOP, &status); - ok(ret, "ControlService failed %u\n", GetLastError()); - - CloseServiceHandle(service); - CloseServiceHandle(scm); - } }
static void test_delete_services(void) @@ -6819,7 +6889,7 @@ test_write_registry_values(); test_envvar(); test_create_remove_folder(); - test_start_services(); + test_start_stop_services(); test_delete_services(); test_install_services(); test_self_registration();
Modified: trunk/rostests/winetests/msi/automation.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/automation.c... ============================================================================== --- trunk/rostests/winetests/msi/automation.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msi/automation.c [iso-8859-1] Mon Mar 9 20:28:54 2015 @@ -1934,7 +1934,7 @@
hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, TRUE); ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr); - if (hr == DISP_E_EXCEPTION) ok_exception(hr, szModeFlag); + ok_exception(hr, szModeFlag);
hr = Session_ModeGet(pSession, MSIRUNMODE_REBOOTNOW, &bool); ok(hr == S_OK, "Session_ModeGet failed, hresult 0x%08x\n", hr); @@ -1942,7 +1942,7 @@
hr = Session_ModePut(pSession, MSIRUNMODE_REBOOTNOW, FALSE); /* set it again so we don't reboot */ ok(hr == S_OK, "Session_ModePut failed, hresult 0x%08x\n", hr); - if (hr == DISP_E_EXCEPTION) ok_exception(hr, szModeFlag); + ok_exception(hr, szModeFlag);
hr = Session_ModePut(pSession, MSIRUNMODE_MAINTENANCE, TRUE); ok(hr == DISP_E_EXCEPTION, "Session_ModePut failed, hresult 0x%08x\n", hr);
Modified: trunk/rostests/winetests/msi/db.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/db.c?rev=666... ============================================================================== --- trunk/rostests/winetests/msi/db.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msi/db.c [iso-8859-1] Mon Mar 9 20:28:54 2015 @@ -1670,6 +1670,28 @@ MsiViewClose( view ); MsiCloseHandle( view );
+ /* try again */ + create_file( "test1.txt" ); + + rec = MsiCreateRecord( 2 ); + MsiRecordSetStringA( rec, 1, "data1" ); + + r = MsiRecordSetStreamA( rec, 2, "test1.txt" ); + ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r ); + + DeleteFileA( "test1.txt" ); + + r = MsiDatabaseOpenViewA( hdb, + "INSERT INTO `_Streams` ( `Name`, `Data` ) VALUES ( ?, ? )", &view ); + ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r ); + + r = MsiViewExecute( view, rec ); + ok( r == ERROR_FUNCTION_FAILED, "got %u\n", r ); + + MsiCloseHandle( rec ); + MsiViewClose( view ); + MsiCloseHandle( view ); + r = MsiDatabaseOpenViewA( hdb, "SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = 'data'", &view ); ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r); @@ -1759,7 +1781,7 @@ memset(buf, 0, MAX_PATH); r = MsiRecordReadStream( rec, 2, buf, &size ); ok( r == ERROR_SUCCESS, "Failed to get stream: %d\n", r); - todo_wine ok( !lstrcmpA(buf, "test2.txt\n"), "Expected 'test2.txt\n', got %s\n", buf); + ok( !lstrcmpA(buf, "test2.txt\n"), "Expected 'test2.txt\n', got %s\n", buf);
MsiCloseHandle( rec ); MsiViewClose( view ); @@ -1791,9 +1813,40 @@ ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r); DeleteFileA( "test.txt" );
+ /* try a name that exceeds maximum OLE stream name length */ + query = "INSERT INTO `Binary` ( `Name`, `ID`, `Data` ) VALUES ( 'encryption.dll.CB4E6205_F99A_4C51_ADD4_184506EFAB87', 10000, ? )"; + r = run_query( hdb, rec, query ); + ok( r == ERROR_SUCCESS, "Insert into Binary table failed: %d\n", r ); + + r = MsiCloseHandle( rec ); + ok( r == ERROR_SUCCESS , "Failed to close record handle\n" ); + + r = MsiDatabaseCommit( hdb ); + ok( r == ERROR_FUNCTION_FAILED , "got %u\n", r ); + + r = MsiCloseHandle( hdb ); + ok( r == ERROR_SUCCESS , "Failed to close database\n" ); + + r = MsiOpenDatabaseW(msifileW, MSIDBOPEN_CREATE, &hdb ); + ok( r == ERROR_SUCCESS , "Failed to open database\n" ); + + query = "CREATE TABLE `Binary` ( `Name` CHAR(72) NOT NULL, `ID` INT NOT NULL, `Data` OBJECT PRIMARY KEY `Name`, `ID`)"; + r = run_query( hdb, 0, query ); + ok( r == ERROR_SUCCESS, "Cannot create Binary table: %d\n", r ); + + create_file( "test.txt" ); + rec = MsiCreateRecord( 1 ); + r = MsiRecordSetStreamA( rec, 1, "test.txt" ); + ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r ); + DeleteFileA( "test.txt" ); + query = "INSERT INTO `Binary` ( `Name`, `ID`, `Data` ) VALUES ( 'filename1', 1, ? )"; r = run_query( hdb, rec, query ); ok( r == ERROR_SUCCESS, "Insert into Binary table failed: %d\n", r ); + + query = "INSERT INTO `Binary` ( `Name`, `ID`, `Data` ) VALUES ( 'filename1', 1, ? )"; + r = run_query( hdb, rec, query ); + ok( r == ERROR_FUNCTION_FAILED, "got %u\n", r );
r = MsiCloseHandle( rec ); ok( r == ERROR_SUCCESS , "Failed to close record handle\n" ); @@ -4535,7 +4588,7 @@ size = MAX_PATH; r = MsiRecordGetStringA(rec, 1, result, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrlenA(result), "Expected an empty string, got %s\n", result); + ok(!result[0], "Expected an empty string, got %s\n", result);
MsiCloseHandle(rec);
@@ -4581,7 +4634,7 @@ size = MAX_PATH; r = MsiRecordGetStringA(rec, 1, result, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrlenA(result), "Expected an empty string, got %s\n", result); + ok(!result[0], "Expected an empty string, got %s\n", result);
MsiCloseHandle(rec);
Modified: trunk/rostests/winetests/msi/install.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/install.c?re... ============================================================================== --- trunk/rostests/winetests/msi/install.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msi/install.c [iso-8859-1] Mon Mar 9 20:28:54 2015 @@ -561,34 +561,10 @@ "2\t2\t\ttest2.cab\tDISK2\t\n" "3\t12\t\ttest3.cab\tDISK3\t\n";
-static const CHAR ci_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "CostFinalize\t\t1000\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "InstallFiles\t\t4000\n" - "InstallServices\t\t5000\n" - "InstallFinalize\t\t6600\n" - "InstallInitialize\t\t1500\n" - "RunInstall\t\t1600\n" - "InstallValidate\t\t1400\n" - "LaunchConditions\t\t100"; - -static const CHAR ci_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" - "s72\ti2\tS64\tS0\tS255\n" - "CustomAction\tAction\n" - "RunInstall\t87\tmsitest\concurrent.msi\tMYPROP=[UILevel]\t\n"; - static const CHAR ci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n"; - -static const CHAR ci2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "augustus\t\tMSITESTDIR\t0\tUILevel=3 AND MYPROP=5\taugustus\n";
static const CHAR ci2_feature_comp_dat[] = "Feature_\tComponent_\n" "s38\ts72\n" @@ -656,13 +632,6 @@ "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" "augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n"; - -static const CHAR rem_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n" - "helium\thelium\thelium\t0\t\t\t8192\t1\n" - "lithium\tlithium\tlithium\t0\t\t\t8192\t1";
static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "s72\tS255\tI2\n" @@ -1538,31 +1507,6 @@ ADD_TABLE(cie_file), ADD_TABLE(install_exec_seq), ADD_TABLE(cie_media), - ADD_TABLE(property), -}; - -static const msi_table ci_tables[] = -{ - ADD_TABLE(ci_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(rof_feature_comp), - ADD_TABLE(rof_file), - ADD_TABLE(ci_install_exec_seq), - ADD_TABLE(rof_media), - ADD_TABLE(property), - ADD_TABLE(ci_custom_action), -}; - -static const msi_table ci2_tables[] = -{ - ADD_TABLE(ci2_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(ci2_feature_comp), - ADD_TABLE(ci2_file), - ADD_TABLE(install_exec_seq), - ADD_TABLE(rof_media), ADD_TABLE(property), };
@@ -5723,7 +5667,7 @@ res = RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID\{8dfef911-6885-41eb-b280-8f0304728e8b}\InProcServer32", 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); - todo_wine ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res); + ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res); if (res == ERROR_SUCCESS) { size = sizeof(value); res = RegQueryValueExA(hkey, "", NULL, NULL, (LPBYTE)value, &size); @@ -5786,7 +5730,7 @@ res = RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID\{8dfef911-6885-41eb-b280-8f0304728e8b}\InProcServer32", 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hkey); - todo_wine ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res); + ok(res == ERROR_SUCCESS, "can't open 32-bit CLSID key, got %d\n", res); if (res == ERROR_SUCCESS) { size = sizeof(value); res = RegQueryValueExA(hkey, "", NULL, NULL, (LPBYTE)value, &size);
Modified: trunk/rostests/winetests/msi/msi.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/msi.c?rev=66... ============================================================================== --- trunk/rostests/winetests/msi/msi.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msi/msi.c [iso-8859-1] Mon Mar 9 20:28:54 2015 @@ -48,6 +48,10 @@
static INSTALLSTATE (WINAPI *pMsiGetComponentPathA) (LPCSTR, LPCSTR, LPSTR, DWORD*); +static INSTALLSTATE (WINAPI *pMsiProvideComponentA) + (LPCSTR, LPCSTR, LPCSTR, DWORD, LPSTR, LPDWORD); +static INSTALLSTATE (WINAPI *pMsiProvideComponentW) + (LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPWSTR, LPDWORD); static UINT (WINAPI *pMsiGetFileHashA) (LPCSTR, DWORD, PMSIFILEHASHINFO); static UINT (WINAPI *pMsiGetProductInfoExA) @@ -86,6 +90,8 @@ trace("GetProcAddress(%s) failed\n", #func);
GET_PROC(hmsi, MsiGetComponentPathA) + GET_PROC(hmsi, MsiProvideComponentA) + GET_PROC(hmsi, MsiProvideComponentW) GET_PROC(hmsi, MsiGetFileHashA) GET_PROC(hmsi, MsiGetProductInfoExA) GET_PROC(hmsi, MsiOpenPackageExA) @@ -3402,6 +3408,100 @@ LocalFree(usersid); }
+static void test_MsiProvideComponent(void) +{ + static const WCHAR sourcedirW[] = + {'s','o','u','r','c','e','d','i','r',0}; + static const WCHAR productW[] = + {'{','3','8','8','4','7','3','3','8','-','1','B','B','C','-','4','1','0','4','-', + '8','1','A','C','-','2','F','A','A','C','7','E','C','D','D','C','D','}',0}; + static const WCHAR componentW[] = + {'{','D','D','4','2','2','F','9','2','-','3','E','D','8','-','4','9','B','5','-', + 'A','0','B','7','-','F','2','6','6','F','9','8','3','5','7','D','F','}',0}; + INSTALLSTATE state; + char buf[0x100]; + WCHAR bufW[0x100]; + DWORD len, len2; + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\sourcedir.txt", "msitest\sourcedir.txt", 1000); + create_database(msifile, sd_tables, sizeof(sd_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + buf[0] = 0; + len = sizeof(buf); + r = pMsiProvideComponentA("{90120000-0070-0000-0000-4000000FF1CE}", + "{17961602-C4E2-482E-800A-DF6E627549CF}", + "ProductFiles", INSTALLMODE_NODETECTION, buf, &len); + ok(r == ERROR_INVALID_PARAMETER, "got %u\n", r); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + state = MsiQueryFeatureStateA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}", "sourcedir"); + ok(state == INSTALLSTATE_LOCAL, "got %d\n", state); + + buf[0] = 0; + len = sizeof(buf); + r = pMsiProvideComponentA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}", "sourcedir", + "{DD422F92-3ED8-49B5-A0B7-F266F98357DF}", + INSTALLMODE_NODETECTION, buf, &len); + ok(r == ERROR_SUCCESS, "got %u\n", r); + ok(buf[0], "empty path\n"); + ok(len == lstrlenA(buf), "got %u\n", len); + + len2 = 0; + r = pMsiProvideComponentA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}", "sourcedir", + "{DD422F92-3ED8-49B5-A0B7-F266F98357DF}", + INSTALLMODE_NODETECTION, NULL, &len2); + ok(r == ERROR_SUCCESS, "got %u\n", r); + ok(len2 == len, "got %u\n", len2); + + len2 = 0; + r = pMsiProvideComponentA("{38847338-1BBC-4104-81AC-2FAAC7ECDDCD}", "sourcedir", + "{DD422F92-3ED8-49B5-A0B7-F266F98357DF}", + INSTALLMODE_NODETECTION, buf, &len2); + ok(r == ERROR_MORE_DATA, "got %u\n", r); + ok(len2 == len, "got %u\n", len2); + + /* wide version */ + + bufW[0] = 0; + len = sizeof(buf); + r = pMsiProvideComponentW(productW, sourcedirW, componentW, + INSTALLMODE_NODETECTION, bufW, &len); + ok(r == ERROR_SUCCESS, "got %u\n", r); + ok(bufW[0], "empty path\n"); + ok(len == lstrlenW(bufW), "got %u\n", len); + + len2 = 0; + r = pMsiProvideComponentW(productW, sourcedirW, componentW, + INSTALLMODE_NODETECTION, NULL, &len2); + ok(r == ERROR_SUCCESS, "got %u\n", r); + ok(len2 == len, "got %u\n", len2); + + len2 = 0; + r = pMsiProvideComponentW(productW, sourcedirW, componentW, + INSTALLMODE_NODETECTION, bufW, &len2); + ok(r == ERROR_MORE_DATA, "got %u\n", r); + ok(len2 == len, "got %u\n", len2); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "got %u\n", r); + + DeleteFileA("msitest\sourcedir.txt"); + delete_test_files(); + DeleteFileA(msifile); +} + static void test_MsiGetProductCode(void) { HKEY compkey, prodkey; @@ -14298,6 +14398,7 @@ test_MsiQueryFeatureState(); test_MsiQueryComponentState(); test_MsiGetComponentPath(); + test_MsiProvideComponent(); test_MsiGetProductCode(); test_MsiEnumClients(); test_MsiGetProductInfo();
Modified: trunk/rostests/winetests/msi/package.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/package.c?re... ============================================================================== --- trunk/rostests/winetests/msi/package.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msi/package.c [iso-8859-1] Mon Mar 9 20:28:54 2015 @@ -2194,7 +2194,7 @@ sz = 6; r = MsiGetPropertyA(hpkg, "property", buffer, &sz); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok( !strlen(buffer), "Expected empty string, got %s\n", buffer); + ok(!buffer[0], "Expected empty string, got %s\n", buffer);
MsiCloseHandle( hpkg ); DeleteFileA(msifile); @@ -2347,7 +2347,7 @@ lstrcpyA(buffer, "aaa"); r = MsiGetPropertyA(hpkg, "dantes", buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(lstrlenA(buffer) == 0, "Expected empty string, got %s\n", buffer); + ok(!buffer[0], "Expected empty string, got %s\n", buffer);
r = MsiSetPropertyA(hpkg, "dantes", "mercedes"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
Modified: trunk/rostests/winetests/msi/source.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/source.c?rev... ============================================================================== --- trunk/rostests/winetests/msi/source.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msi/source.c [iso-8859-1] Mon Mar 9 20:28:54 2015 @@ -175,7 +175,7 @@ }
if (!expected) - ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val); + ok_(__FILE__, line)(!val[0], "Expected empty string, got %s\n", val); else { if (bcase)