[4/4] msi: Test installing over in-use files.

Hans Leidekker hans at codeweavers.com
Tue Sep 29 07:57:42 CDT 2009


diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index f2ddccb..2ae22c2 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -1539,6 +1539,18 @@ static const msi_table ip_tables[] =
     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 */
 
 /* 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();
 }
 
+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)
 {
     DWORD len;
@@ -6763,6 +6853,7 @@ START_TEST(install)
     test_lastusedsource();
     test_preselected();
     test_installed_prop();
+    test_file_in_use();
 
     DeleteFileA(log_file);
 



More information about the wine-patches mailing list