TestInspectorServer.cpp [plain text]
#include "config.h"
#include "WebViewTest.h"
#include <wtf/gobject/GRefPtr.h>
#include <wtf/text/WTFString.h>
static const char* gTestServerAppName = "InspectorTestServer";
static const int gMaxWaitForChild = 5;
static GPid gChildProcessPid = 0;
static bool gChildIsReady = false;
static void stopTestServer()
{
if (!gChildProcessPid)
return;
g_spawn_close_pid(gChildProcessPid);
kill(gChildProcessPid, SIGTERM);
gChildProcessPid = 0;
}
static void sigAbortHandler(int sigNum)
{
stopTestServer();
}
static gpointer testServerMonitorThreadFunc(gpointer)
{
g_usleep(gMaxWaitForChild * G_USEC_PER_SEC);
if (!gChildIsReady)
stopTestServer();
g_thread_exit(0);
return 0;
}
static void startTestServerMonitor()
{
gChildIsReady = false;
g_thread_new("TestServerMonitor", testServerMonitorThreadFunc, 0);
}
static void startTestServer()
{
GOwnPtr<char> testServerPath(g_build_filename(WEBKIT_EXEC_PATH, "WebKit2APITests", gTestServerAppName, NULL));
signal(SIGABRT, sigAbortHandler);
char* testServerArgv[2];
testServerArgv[0] = testServerPath.get();
testServerArgv[1] = 0;
int childStdout = 0;
g_assert(g_spawn_async_with_pipes(0, testServerArgv, 0, static_cast<GSpawnFlags>(0), 0, 0,
&gChildProcessPid, 0, &childStdout, 0, 0));
startTestServerMonitor();
char msg[2];
GIOChannel* ioChannel = g_io_channel_unix_new(childStdout);
if (g_io_channel_read_chars(ioChannel, msg, 2, 0, 0) == G_IO_STATUS_NORMAL) {
gChildIsReady = msg[0] == 'O' && msg[1] == 'K';
}
g_io_channel_unref(ioChannel);
close(childStdout);
if (!gChildIsReady)
stopTestServer();
}
class InspectorServerTest: public WebViewTest {
public:
MAKE_GLIB_TEST_FIXTURE(InspectorServerTest);
InspectorServerTest()
: WebViewTest()
{
}
bool getPageList()
{
loadHtml("<script type=\"text/javascript\">\n"
"var pages;\n"
"var xhr = new XMLHttpRequest;\n"
"xhr.open(\"GET\", \"/pagelist.json\");\n"
"xhr.onload = function(e) {\n"
"if (xhr.status == 200) {\n"
"pages = JSON.parse(xhr.responseText);\n"
"document.title = \"OK\";\n"
"} else \n"
"document.title = \"FAIL\";\n"
"}\n"
"xhr.send();\n"
"</script>\n",
"http://127.0.0.1:2999/");
waitUntilTitleChanged();
if (!strcmp(webkit_web_view_get_title(m_webView), "OK"))
return true;
return false;
}
~InspectorServerTest()
{
}
};
static void testInspectorServerPageList(InspectorServerTest* test, gconstpointer)
{
GOwnPtr<GError> error;
test->showInWindowAndWaitUntilMapped(GTK_WINDOW_TOPLEVEL);
g_assert(test->getPageList());
WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished("pages.length;", &error.outPtr());
g_assert(javascriptResult);
g_assert(!error.get());
g_assert_cmpint(WebViewTest::javascriptResultToNumber(javascriptResult), ==, 1);
javascriptResult = test->runJavaScriptAndWaitUntilFinished("pages[0].id;", &error.outPtr());
g_assert(javascriptResult);
g_assert(!error.get());
int pageId = WebViewTest::javascriptResultToNumber(javascriptResult);
GOwnPtr<char> valueString;
javascriptResult = test->runJavaScriptAndWaitUntilFinished("pages[0].url;", &error.outPtr());
g_assert(javascriptResult);
g_assert(!error.get());
valueString.set(WebViewTest::javascriptResultToCString(javascriptResult));
g_assert_cmpstr(valueString.get(), ==, "http://127.0.0.1:2999/");
javascriptResult = test->runJavaScriptAndWaitUntilFinished("pages[0].inspectorUrl;", &error.outPtr());
g_assert(javascriptResult);
g_assert(!error.get());
valueString.set(WebViewTest::javascriptResultToCString(javascriptResult));
String validInspectorURL = String("/webinspector/inspector.html?page=") + String::number(pageId);
ASSERT_CMP_CSTRING(valueString.get(), ==, validInspectorURL.utf8());
}
static void testRemoteDebuggingMessage(InspectorServerTest* test, gconstpointer)
{
test->showInWindowAndWaitUntilMapped(GTK_WINDOW_TOPLEVEL);
test->loadHtml("<script type=\"text/javascript\">\n"
"var socket = new WebSocket('ws://127.0.0.1:2999/devtools/page/1');\n"
"socket.onmessage = function(message) {\n"
"var response = JSON.parse(message.data);\n"
"if (response.id === 1)\n"
"document.title = response.result.result.value;\n"
"else\n"
"document.title = \"FAIL\";\n"
"}\n"
"socket.onopen = function() {\n"
"socket.send('{\"id\": 1, \"method\": \"Runtime.evaluate\", \"params\": {\"expression\": \"2 + 2\" } }');\n"
"}\n"
"</script>",
"http://127.0.0.1:2999/");
test->waitUntilTitleChanged();
g_assert_cmpstr(webkit_web_view_get_title(test->m_webView), ==, "4");
}
static void openRemoteDebuggingSession(InspectorServerTest* test, gconstpointer)
{
test->showInWindowAndWaitUntilMapped(GTK_WINDOW_TOPLEVEL);
g_assert(test->getPageList());
GOwnPtr<GError> error;
WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished("pages[0].inspectorUrl;", &error.outPtr());
g_assert(javascriptResult);
g_assert(!error.get());
String resolvedURL = String("http://127.0.0.1:2999/") + String::fromUTF8(WebViewTest::javascriptResultToCString(javascriptResult));
test->loadURI(resolvedURL.utf8().data());
test->waitUntilTitleChanged();
g_assert_cmpstr(webkit_web_view_get_title(test->m_webView), ==, "Web Inspector - http://127.0.0.1:2999/");
}
void beforeAll()
{
g_setenv("WEBKIT_INSPECTOR_SERVER", "127.0.0.1:2998", TRUE);
startTestServer();
InspectorServerTest::add("WebKitWebInspectorServer", "test-page-list", testInspectorServerPageList);
InspectorServerTest::add("WebKitWebInspectorServer", "test-remote-debugging-message", testRemoteDebuggingMessage);
InspectorServerTest::add("WebKitWebInspectorServer", "test-open-debugging-session", openRemoteDebuggingSession);
}
void afterAll()
{
stopTestServer();
}