[MSI_WINETEST] Sync with Wine Staging 1.7.37. CORE-9246

svn path=/trunk/; revision=66633
This commit is contained in:
Amine Khaldi 2015-03-09 20:28:54 +00:00
parent 102b741c7e
commit 8ffd0f2576
7 changed files with 243 additions and 75 deletions

View file

@ -182,7 +182,8 @@ static const char property_dat[] =
"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 @@ static const char sss_service_control_dat[] =
"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 @@ static const char sss_install_exec_seq_dat[] =
"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 @@ static const char wrv_registry_dat[] =
"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 @@ static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase
}
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 @@ static void test_write_registry_values(void)
HKEY hkey;
DWORD type, size;
CHAR path[MAX_PATH];
BYTE buf[8];
if (is_process_limited())
{
@ -5051,6 +5064,42 @@ static void test_write_registry_values(void)
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");
RegDeleteValueA(hkey, "Value2");
@ -5059,6 +5108,10 @@ static void test_write_registry_values(void)
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 @@ error:
DeleteFileA(msifile);
}
static void test_start_services(void)
static void test_start_stop_services(void)
{
UINT r;
SC_HANDLE scm, service;
@ -5309,6 +5362,23 @@ static void test_start_services(void)
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");
ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n");
ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
@ -5323,9 +5393,6 @@ static void test_start_services(void)
ok(delete_pf("msitest\\service2.exe", TRUE), "File not installed\n");
ok(delete_pf("msitest", FALSE), "Directory not created\n");
delete_test_files();
DeleteFileA(msifile);
if (error == ERROR_SUCCESS)
{
SERVICE_STATUS status;
@ -5339,6 +5406,9 @@ static void test_start_services(void)
CloseServiceHandle(service);
CloseServiceHandle(scm);
}
delete_test_files();
DeleteFileA(msifile);
}
static void test_delete_services(void)
@ -6819,7 +6889,7 @@ START_TEST(action)
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();

View file

@ -1934,7 +1934,7 @@ static void test_Session(IDispatch *pSession)
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 @@ static void test_Session(IDispatch *pSession)
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);

View file

@ -1670,6 +1670,28 @@ static void test_streamtable(void)
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 @@ static void test_streamtable(void)
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,10 +1813,41 @@ static void test_binary(void)
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 @@ static void test_update(void)
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 @@ static void test_update(void)
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);

View file

@ -561,35 +561,11 @@ static const CHAR cie_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\t
"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"
"FeatureComponents\tFeature_\tComponent_\n"
@ -657,13 +633,6 @@ static const CHAR amp_component_dat[] = "Component\tComponentId\tDirectory_\tAtt
"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"
"InstallExecuteSequence\tAction\n"
@ -1541,31 +1510,6 @@ static const msi_table cie_tables[] =
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),
};
static const msi_table tp_tables[] =
{
ADD_TABLE(tp_component),
@ -5723,7 +5667,7 @@ static void test_mixed_package(void)
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 @@ static void test_mixed_package(void)
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);

View file

@ -48,6 +48,10 @@ static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
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 @@ static void init_functionpointers(void)
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 @@ static void test_MsiGetComponentPath(void)
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 @@ START_TEST(msi)
test_MsiQueryFeatureState();
test_MsiQueryComponentState();
test_MsiGetComponentPath();
test_MsiProvideComponent();
test_MsiGetProductCode();
test_MsiEnumClients();
test_MsiGetProductInfo();

View file

@ -2194,7 +2194,7 @@ static void test_props(void)
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 @@ static void test_property_table(void)
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);

View file

@ -175,7 +175,7 @@ static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase
}
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)