[GTK] Some unit tests fail when using the network process
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 22 Nov 2015 09:00:45 +0000 (09:00 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 22 Nov 2015 09:00:45 +0000 (09:00 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151490

Reviewed by Martin Robinson.

Run the soup server in a separate thread in TestResources test to
avoid deadlocks.

This fixes /webkit2/WebKitWebView/sync-request-on-max-conns and
/webkit2/WebKitWebResource/get-data when using the network process.

* TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp:
(beforeAll): Create the WebKitTestServer with ServerRunInThread flag.
* TestWebKitAPI/gtk/WebKit2Gtk/WebKitTestServer.cpp:
(WebKitTestServer::WebKitTestServer): When ServerRunInThread is
present, create a WorkQueue to run the server.
(WebKitTestServer::run): Run the server in the work queue if it
has been created.
* TestWebKitAPI/gtk/WebKit2Gtk/WebKitTestServer.h: Convert server
type into server options as flags.

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

Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp
Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebKitTestServer.cpp
Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebKitTestServer.h

index ddc363d..4188fbc 100644 (file)
@@ -1,5 +1,28 @@
 2015-11-22  Carlos Garcia Campos  <cgarcia@igalia.com>
 
 2015-11-22  Carlos Garcia Campos  <cgarcia@igalia.com>
 
+        [GTK] Some unit tests fail when using the network process
+        https://bugs.webkit.org/show_bug.cgi?id=151490
+
+        Reviewed by Martin Robinson.
+
+        Run the soup server in a separate thread in TestResources test to
+        avoid deadlocks.
+
+        This fixes /webkit2/WebKitWebView/sync-request-on-max-conns and
+        /webkit2/WebKitWebResource/get-data when using the network process.
+
+        * TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp:
+        (beforeAll): Create the WebKitTestServer with ServerRunInThread flag.
+        * TestWebKitAPI/gtk/WebKit2Gtk/WebKitTestServer.cpp:
+        (WebKitTestServer::WebKitTestServer): When ServerRunInThread is
+        present, create a WorkQueue to run the server.
+        (WebKitTestServer::run): Run the server in the work queue if it
+        has been created.
+        * TestWebKitAPI/gtk/WebKit2Gtk/WebKitTestServer.h: Convert server
+        type into server options as flags.
+
+2015-11-22  Carlos Garcia Campos  <cgarcia@igalia.com>
+
         [GTK] ImageDiff should normalize the diff image
         https://bugs.webkit.org/show_bug.cgi?id=151261
 
         [GTK] ImageDiff should normalize the diff image
         https://bugs.webkit.org/show_bug.cgi?id=151261
 
index 47f666a..9f97b5f 100644 (file)
@@ -835,7 +835,7 @@ static void serverCallback(SoupServer* server, SoupMessage* message, const char*
 
 void beforeAll()
 {
 
 void beforeAll()
 {
-    kServer = new WebKitTestServer();
+    kServer = new WebKitTestServer(WebKitTestServer::ServerOptions::ServerRunInThread);
     kServer->run(serverCallback);
 
     ResourcesTest::add("WebKitWebView", "resources", testWebViewResources);
     kServer->run(serverCallback);
 
     ResourcesTest::add("WebKitWebView", "resources", testWebViewResources);
index 5c75143..de9466c 100644 (file)
 #include "WebKitTestServer.h"
 
 #include "TestMain.h"
 #include "WebKitTestServer.h"
 
 #include "TestMain.h"
+#include <wtf/Threading.h>
 #include <wtf/glib/GUniquePtr.h>
 
 #include <wtf/glib/GUniquePtr.h>
 
-WebKitTestServer::WebKitTestServer(ServerType type)
+WebKitTestServer::WebKitTestServer(ServerOptions options)
 {
 {
+    if (options & ServerRunInThread) {
+        WTF::initializeThreading();
+        m_queue = WorkQueue::create("WebKitTestServer");
+    }
+
     GUniquePtr<char> sslCertificateFile;
     GUniquePtr<char> sslKeyFile;
     GUniquePtr<char> sslCertificateFile;
     GUniquePtr<char> sslKeyFile;
-    if (type == ServerHTTPS) {
+    if (options & ServerHTTPS) {
         CString resourcesDir = Test::getResourcesDir();
         sslCertificateFile.reset(g_build_filename(resourcesDir.data(), "test-cert.pem", NULL));
         sslKeyFile.reset(g_build_filename(resourcesDir.data(), "test-key.pem", NULL));
         CString resourcesDir = Test::getResourcesDir();
         sslCertificateFile.reset(g_build_filename(resourcesDir.data(), "test-cert.pem", NULL));
         sslKeyFile.reset(g_build_filename(resourcesDir.data(), "test-key.pem", NULL));
@@ -37,9 +43,10 @@ WebKitTestServer::WebKitTestServer(ServerType type)
     soup_address_resolve_sync(address.get(), 0);
 
     m_soupServer = adoptGRef(soup_server_new(SOUP_SERVER_INTERFACE, address.get(),
     soup_address_resolve_sync(address.get(), 0);
 
     m_soupServer = adoptGRef(soup_server_new(SOUP_SERVER_INTERFACE, address.get(),
+        SOUP_SERVER_ASYNC_CONTEXT, m_queue ? m_queue->runLoop().mainContext() : nullptr,
         SOUP_SERVER_SSL_CERT_FILE, sslCertificateFile.get(),
         SOUP_SERVER_SSL_KEY_FILE, sslKeyFile.get(), nullptr));
         SOUP_SERVER_SSL_CERT_FILE, sslCertificateFile.get(),
         SOUP_SERVER_SSL_KEY_FILE, sslKeyFile.get(), nullptr));
-    m_baseURI = type == ServerHTTPS ? soup_uri_new("https://127.0.0.1/") : soup_uri_new("http://127.0.0.1/");
+    m_baseURI = options & ServerHTTPS ? soup_uri_new("https://127.0.0.1/") : soup_uri_new("http://127.0.0.1/");
     soup_uri_set_port(m_baseURI, soup_server_get_port(m_soupServer.get()));
 }
 
     soup_uri_set_port(m_baseURI, soup_server_get_port(m_soupServer.get()));
 }
 
@@ -50,8 +57,15 @@ WebKitTestServer::~WebKitTestServer()
 
 void WebKitTestServer::run(SoupServerCallback serverCallback)
 {
 
 void WebKitTestServer::run(SoupServerCallback serverCallback)
 {
-    soup_server_run_async(m_soupServer.get());
-    soup_server_add_handler(m_soupServer.get(), 0, serverCallback, 0, 0);
+    if (m_queue) {
+        m_queue->dispatch([this, serverCallback] {
+            soup_server_run_async(m_soupServer.get());
+            soup_server_add_handler(m_soupServer.get(), nullptr, serverCallback, nullptr, nullptr);
+        });
+    } else {
+        soup_server_run_async(m_soupServer.get());
+        soup_server_add_handler(m_soupServer.get(), nullptr, serverCallback, nullptr, nullptr);
+    }
 }
 
 CString WebKitTestServer::getURIForPath(const char* path)
 }
 
 CString WebKitTestServer::getURIForPath(const char* path)
index 235d6c9..58f019f 100644 (file)
 
 #include <libsoup/soup.h>
 #include <webkit2/webkit2.h>
 
 #include <libsoup/soup.h>
 #include <webkit2/webkit2.h>
+#include <wtf/WorkQueue.h>
 #include <wtf/glib/GRefPtr.h>
 #include <wtf/text/CString.h>
 
 class WebKitTestServer {
 public:
 
 #include <wtf/glib/GRefPtr.h>
 #include <wtf/text/CString.h>
 
 class WebKitTestServer {
 public:
 
-    enum ServerType {
-        ServerHTTP,
-        ServerHTTPS
+    enum ServerOptions {
+        ServerHTTP = 0,
+        ServerHTTPS = 1 << 1,
+        ServerRunInThread = 1 << 2,
     };
 
     };
 
-    WebKitTestServer(ServerType = ServerHTTP);
+    WebKitTestServer(ServerOptions = ServerHTTP);
     virtual ~WebKitTestServer();
 
     SoupURI* baseURI() { return m_baseURI; }
     virtual ~WebKitTestServer();
 
     SoupURI* baseURI() { return m_baseURI; }
@@ -44,6 +46,7 @@ public:
 private:
     GRefPtr<SoupServer> m_soupServer;
     SoupURI* m_baseURI;
 private:
     GRefPtr<SoupServer> m_soupServer;
     SoupURI* m_baseURI;
+    RefPtr<WorkQueue> m_queue;
 };
 
 #endif // WebKitTestServer_h
 };
 
 #endif // WebKitTestServer_h