[Win] Clipboard tests are flaky.
authorpvollan@apple.com <pvollan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Jan 2017 13:00:51 +0000 (13:00 +0000)
committerpvollan@apple.com <pvollan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Jan 2017 13:00:51 +0000 (13:00 +0000)
https://bugs.webkit.org/show_bug.cgi?id=167088

Reviewed by Brent Fulgham.

Tests involving the clipboard are flaky when running with multiple DRTs, since the clipboard is global.
We can fix this by assigning each DRT a separate window station (each window station has its own clipboard).

* DumpRenderTree/win/DumpRenderTree.cpp:
(main):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@210850 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/DumpRenderTree/win/DumpRenderTree.cpp

index 792f535..6d66529 100644 (file)
@@ -1,3 +1,16 @@
+2017-01-18  Per Arne Vollan  <pvollan@apple.com>
+
+        [Win] Clipboard tests are flaky.
+        https://bugs.webkit.org/show_bug.cgi?id=167088
+
+        Reviewed by Brent Fulgham.
+
+        Tests involving the clipboard are flaky when running with multiple DRTs, since the clipboard is global. 
+        We can fix this by assigning each DRT a separate window station (each window station has its own clipboard).
+
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (main):
+
 2017-01-18  Antoine Quint  <graouts@apple.com>
 
         [Modern Media Controls] Turn modern media controls on by default
index 38026e2..a8f0479 100644 (file)
@@ -1471,6 +1471,28 @@ int main(int argc, const char* argv[])
     // Redirect stdout to stderr.
     int result = _dup2(_fileno(stderr), 1);
 
+    // Tests involving the clipboard are flaky when running with multiple DRTs, since the clipboard is global.
+    // We can fix this by assigning each DRT a separate window station (each window station has its own clipboard).
+    DWORD processId = ::GetCurrentProcessId();
+    String windowStationName = String::format("windowStation%d", processId);
+    String desktopName = String::format("desktop%d", processId);
+    HDESK desktop = nullptr;
+
+    auto windowsStation = ::CreateWindowStation(windowStationName.charactersWithNullTermination().data(), CWF_CREATE_ONLY, WINSTA_ALL_ACCESS, nullptr);
+    if (windowsStation) {
+        if (!::SetProcessWindowStation(windowsStation))
+            fprintf(stderr, "SetProcessWindowStation failed with error %d\n", ::GetLastError());
+
+        desktop = ::CreateDesktop(desktopName.charactersWithNullTermination().data(), nullptr, nullptr, 0, GENERIC_ALL, nullptr);
+        if (!desktop)
+            fprintf(stderr, "Failed to create desktop with error %d\n", ::GetLastError());
+    } else {
+        DWORD error = ::GetLastError();
+        fprintf(stderr, "Failed to create window station with error %d\n", error);
+        if (error == ERROR_ACCESS_DENIED)
+            fprintf(stderr, "DumpRenderTree should be run as Administrator!\n");
+    }
+
     initialize();
 
     setDefaultsToConsistentValuesForTesting();
@@ -1573,6 +1595,11 @@ int main(int argc, const char* argv[])
     _CrtDumpMemoryLeaks();
 #endif
 
+    if (desktop)
+        ::CloseDesktop(desktop);
+    if (windowsStation)
+        ::CloseWindowStation(windowsStation);
+
     ::OleUninitialize();
 
     return 0;