Commit a9c3195e authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

msi: Add package validation tests.

parent ca7cd1bf
...@@ -61,6 +61,7 @@ static const char *msifile2 = "winetest2.msi"; ...@@ -61,6 +61,7 @@ static const char *msifile2 = "winetest2.msi";
static const char *mstfile = "winetest.mst"; static const char *mstfile = "winetest.mst";
static CHAR CURR_DIR[MAX_PATH]; static CHAR CURR_DIR[MAX_PATH];
static CHAR PROG_FILES_DIR[MAX_PATH]; static CHAR PROG_FILES_DIR[MAX_PATH];
static CHAR PROG_FILES_DIR_NATIVE[MAX_PATH];
static CHAR COMMON_FILES_DIR[MAX_PATH]; static CHAR COMMON_FILES_DIR[MAX_PATH];
static CHAR APP_DATA_DIR[MAX_PATH]; static CHAR APP_DATA_DIR[MAX_PATH];
static CHAR WINDOWS_DIR[MAX_PATH]; static CHAR WINDOWS_DIR[MAX_PATH];
...@@ -590,6 +591,18 @@ static const CHAR sdp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISCom ...@@ -590,6 +591,18 @@ static const CHAR sdp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISCom
"CustomAction\tAction\n" "CustomAction\tAction\n"
"SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n"; "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n";
static const CHAR pv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"InstallFiles\t\t4000\n"
"InstallFinalize\t\t6600\n";
static const CHAR cie_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" static const CHAR cie_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n" "s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n" "Component\tComponent\n"
...@@ -3102,6 +3115,18 @@ static const msi_table icon_base_tables[] = ...@@ -3102,6 +3115,18 @@ static const msi_table icon_base_tables[] =
ADD_TABLE(icon_property), ADD_TABLE(icon_property),
}; };
static const msi_table pv_tables[] =
{
ADD_TABLE(rof_component),
ADD_TABLE(directory),
ADD_TABLE(rof_feature),
ADD_TABLE(rof_feature_comp),
ADD_TABLE(rof_file),
ADD_TABLE(pv_install_exec_seq),
ADD_TABLE(rof_media),
ADD_TABLE(property)
};
/* cabinet definitions */ /* cabinet definitions */
/* make the max size large so there is only one cab file */ /* make the max size large so there is only one cab file */
...@@ -3455,6 +3480,12 @@ static BOOL get_system_dirs(void) ...@@ -3455,6 +3480,12 @@ static BOOL get_system_dirs(void)
return FALSE; return FALSE;
} }
size = MAX_PATH;
if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR_NATIVE, &size)) {
RegCloseKey(hkey);
return FALSE;
}
RegCloseKey(hkey); RegCloseKey(hkey);
if(GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH) != ERROR_SUCCESS) if(GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH) != ERROR_SUCCESS)
...@@ -3519,6 +3550,20 @@ static BOOL delete_pf(const CHAR *rel_path, BOOL is_file) ...@@ -3519,6 +3550,20 @@ static BOOL delete_pf(const CHAR *rel_path, BOOL is_file)
return RemoveDirectoryA(path); return RemoveDirectoryA(path);
} }
static BOOL delete_pf_native(const CHAR *rel_path, BOOL is_file)
{
CHAR path[MAX_PATH];
lstrcpyA(path, PROG_FILES_DIR_NATIVE);
lstrcatA(path, "\\");
lstrcatA(path, rel_path);
if (is_file)
return DeleteFileA(path);
else
return RemoveDirectoryA(path);
}
static BOOL delete_cf(const CHAR *rel_path, BOOL is_file) static BOOL delete_cf(const CHAR *rel_path, BOOL is_file)
{ {
CHAR path[MAX_PATH]; CHAR path[MAX_PATH];
...@@ -3558,7 +3603,7 @@ static void write_file(const CHAR *filename, const char *data, int data_size) ...@@ -3558,7 +3603,7 @@ static void write_file(const CHAR *filename, const char *data, int data_size)
CloseHandle(hf); CloseHandle(hf);
} }
static void write_msi_summary_info(MSIHANDLE db, INT wordcount) static void write_msi_summary_info(MSIHANDLE db, INT version, INT wordcount, const char *template)
{ {
MSIHANDLE summary; MSIHANDLE summary;
UINT r; UINT r;
...@@ -3566,14 +3611,14 @@ static void write_msi_summary_info(MSIHANDLE db, INT wordcount) ...@@ -3566,14 +3611,14 @@ static void write_msi_summary_info(MSIHANDLE db, INT wordcount)
r = MsiGetSummaryInformationA(db, NULL, 5, &summary); r = MsiGetSummaryInformationA(db, NULL, 5, &summary);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, ";1033"); r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, template);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL, r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL,
"{004757CA-5092-49c2-AD20-28E1CE0DF5F2}"); "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, 100, NULL, NULL); r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, version, NULL, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL); r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL);
...@@ -3590,10 +3635,14 @@ static void write_msi_summary_info(MSIHANDLE db, INT wordcount) ...@@ -3590,10 +3635,14 @@ static void write_msi_summary_info(MSIHANDLE db, INT wordcount)
} }
#define create_database(name, tables, num_tables) \ #define create_database(name, tables, num_tables) \
create_database_wordcount(name, tables, num_tables, 0); create_database_wordcount(name, tables, num_tables, 100, 0, ";1033");
#define create_database_template(name, tables, num_tables, version, template) \
create_database_wordcount(name, tables, num_tables, version, 0, template);
static void create_database_wordcount(const CHAR *name, const msi_table *tables, static void create_database_wordcount(const CHAR *name, const msi_table *tables,
int num_tables, INT wordcount) int num_tables, INT version, INT wordcount,
const char *template)
{ {
MSIHANDLE db; MSIHANDLE db;
UINT r; UINT r;
...@@ -3615,7 +3664,7 @@ static void create_database_wordcount(const CHAR *name, const msi_table *tables, ...@@ -3615,7 +3664,7 @@ static void create_database_wordcount(const CHAR *name, const msi_table *tables,
DeleteFileA(table->filename); DeleteFileA(table->filename);
} }
write_msi_summary_info(db, wordcount); write_msi_summary_info(db, version, wordcount, template);
r = MsiDatabaseCommit(db); r = MsiDatabaseCommit(db);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
...@@ -8509,7 +8558,7 @@ static void test_adminimage(void) ...@@ -8509,7 +8558,7 @@ static void test_adminimage(void)
create_database_wordcount(msifile, ai_tables, create_database_wordcount(msifile, ai_tables,
sizeof(ai_tables) / sizeof(msi_table), sizeof(ai_tables) / sizeof(msi_table),
msidbSumInfoSourceTypeAdminImage); 100, msidbSumInfoSourceTypeAdminImage, ";1033");
r = MsiInstallProductA(msifile, NULL); r = MsiInstallProductA(msifile, NULL);
if (r == ERROR_INSTALL_PACKAGE_REJECTED) if (r == ERROR_INSTALL_PACKAGE_REJECTED)
...@@ -10706,6 +10755,138 @@ static void test_sourcedir_props(void) ...@@ -10706,6 +10755,138 @@ static void test_sourcedir_props(void)
DeleteFile(msifile); DeleteFile(msifile);
} }
static void test_package_validation(void)
{
UINT r;
BOOL wow64 = FALSE;
if (is_process_limited())
{
skip("process is limited\n");
return;
}
if (pIsWow64Process)
pIsWow64Process(GetCurrentProcess(), &wow64);
CreateDirectoryA("msitest", NULL);
create_file("msitest\\maximus", 500);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1033");
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
r = MsiInstallProductA(msifile, NULL);
if (r == ERROR_INSTALL_PACKAGE_REJECTED)
{
skip("Not enough rights to perform tests\n");
goto error;
}
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9999");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r);
ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
ok(!delete_pf("msitest", FALSE), "directory exists\n");
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel32;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
ok(!delete_pf("msitest", FALSE), "directory exists\n");
if (is_64bit && !wow64)
{
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r);
ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
ok(!delete_pf("msitest", FALSE), "directory exists\n");
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
}
else if (wow64)
{
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID,, got %u\n", r);
ok(!delete_pf_native("msitest\\maximus", TRUE), "file exists\n");
ok(!delete_pf_native("msitest", FALSE), "directory exists\n");
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf_native("msitest\\maximus", TRUE), "file exists\n");
ok(delete_pf_native("msitest", FALSE), "directory exists\n");
}
else
{
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n");
ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
ok(!delete_pf("msitest", FALSE), "directory exists\n");
DeleteFile(msifile);
create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0");
r = MsiInstallProductA(msifile, NULL);
ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r);
ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n");
ok(!delete_pf("msitest", FALSE), "directory exists\n");
}
error:
/* Delete the files in the temp (current) folder */
DeleteFile(msifile);
DeleteFile("msitest\\maximus");
RemoveDirectory("msitest");
}
START_TEST(install) START_TEST(install)
{ {
DWORD len; DWORD len;
...@@ -10819,6 +11000,7 @@ START_TEST(install) ...@@ -10819,6 +11000,7 @@ START_TEST(install)
test_register_mime_info(); test_register_mime_info();
test_icon_table(); test_icon_table();
test_sourcedir_props(); test_sourcedir_props();
test_package_validation();
DeleteFileA(log_file); DeleteFileA(log_file);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment