msi: Test installing over in-use files.
This commit is contained in:
parent
46ac59f988
commit
c0c6daeb5a
|
@ -1539,6 +1539,18 @@ static const msi_table ip_tables[] =
|
||||||
ADD_TABLE(property)
|
ADD_TABLE(property)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const msi_table fiu_tables[] =
|
||||||
|
{
|
||||||
|
ADD_TABLE(rof_component),
|
||||||
|
ADD_TABLE(directory),
|
||||||
|
ADD_TABLE(rof_feature),
|
||||||
|
ADD_TABLE(rof_feature_comp),
|
||||||
|
ADD_TABLE(rof_file),
|
||||||
|
ADD_TABLE(pp_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 */
|
||||||
|
@ -6677,6 +6689,84 @@ static void test_installed_prop(void)
|
||||||
delete_test_files();
|
delete_test_files();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_file_in_use(void)
|
||||||
|
{
|
||||||
|
UINT r;
|
||||||
|
DWORD size;
|
||||||
|
HANDLE file;
|
||||||
|
HKEY hkey;
|
||||||
|
LONG ret;
|
||||||
|
char path[MAX_PATH], *buf, *src, *dst;
|
||||||
|
|
||||||
|
static char key[] = "System\\CurrentControlSet\\Control\\Session Manager";
|
||||||
|
static char value[] = "PendingFileRenameOperations";
|
||||||
|
|
||||||
|
RegOpenKeyExA(HKEY_LOCAL_MACHINE, key, 0, KEY_ALL_ACCESS, &hkey);
|
||||||
|
if (!RegQueryValueExA(hkey, value, NULL, NULL, NULL, &size))
|
||||||
|
{
|
||||||
|
skip("Pending file rename operations, skipping test\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateDirectoryA("msitest", NULL);
|
||||||
|
create_file("msitest\\maximus", 500);
|
||||||
|
create_database(msifile, fiu_tables, sizeof(fiu_tables) / sizeof(msi_table));
|
||||||
|
|
||||||
|
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
|
||||||
|
|
||||||
|
lstrcpy(path, PROG_FILES_DIR);
|
||||||
|
lstrcat(path, "\\msitest");
|
||||||
|
CreateDirectoryA(path, NULL);
|
||||||
|
|
||||||
|
lstrcat(path, "\\maximus");
|
||||||
|
file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
|
||||||
|
r = MsiInstallProductA(msifile, "REBOOT=ReallySuppress FULL=1");
|
||||||
|
todo_wine ok(r == ERROR_SUCCESS_REBOOT_REQUIRED, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r);
|
||||||
|
ok(!file_matches(path), "Expected file not to match\n");
|
||||||
|
CloseHandle(file);
|
||||||
|
|
||||||
|
ret = RegQueryValueExA(hkey, value, NULL, NULL, NULL, &size);
|
||||||
|
buf = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
|
||||||
|
buf[0] = 0;
|
||||||
|
ret = RegQueryValueExA(hkey, value, NULL, NULL, (LPBYTE)buf, &size);
|
||||||
|
todo_wine ok(!ret, "RegQueryValueExA failed %d (%u)\n", ret, GetLastError());
|
||||||
|
todo_wine ok(strstr(buf, "msitest\\maximus") != NULL, "Unexpected value \"%s\"\n", buf);
|
||||||
|
|
||||||
|
for (src = buf; *src; src = dst + strlen(dst) + 1)
|
||||||
|
{
|
||||||
|
DWORD flags = MOVEFILE_COPY_ALLOWED;
|
||||||
|
|
||||||
|
dst = src + strlen(src) + 1;
|
||||||
|
if (*dst == '!')
|
||||||
|
{
|
||||||
|
flags |= MOVEFILE_REPLACE_EXISTING;
|
||||||
|
dst++;
|
||||||
|
}
|
||||||
|
src += strlen("\\??\\");
|
||||||
|
if (*dst)
|
||||||
|
{
|
||||||
|
dst += strlen("\\??\\");
|
||||||
|
ok(MoveFileExA(src, dst, flags), "Failed to move file %s -> %s (%u)\n", src, dst, GetLastError());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ok(DeleteFileA(src), "Failed to delete file %s (%u)\n", src, GetLastError());
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, buf);
|
||||||
|
RegDeleteValueA(hkey, value);
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
|
||||||
|
todo_wine ok(file_matches(path), "Expected file to match\n");
|
||||||
|
ok(delete_pf("msitest\\maximus", TRUE), "File not present\n");
|
||||||
|
ok(delete_pf("msitest", FALSE), "Directory not present\n");
|
||||||
|
|
||||||
|
r = MsiInstallProductA(msifile, "REMOVE=ALL");
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
||||||
|
|
||||||
|
delete_test_files();
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(install)
|
START_TEST(install)
|
||||||
{
|
{
|
||||||
DWORD len;
|
DWORD len;
|
||||||
|
@ -6763,6 +6853,7 @@ START_TEST(install)
|
||||||
test_lastusedsource();
|
test_lastusedsource();
|
||||||
test_preselected();
|
test_preselected();
|
||||||
test_installed_prop();
|
test_installed_prop();
|
||||||
|
test_file_in_use();
|
||||||
|
|
||||||
DeleteFileA(log_file);
|
DeleteFileA(log_file);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue