2010-10-06 Balazs Kelemen <kbalazs@webkit.org>
[WebKit-https.git] / WebKitTools / WebKitTestRunner / TestInvocation.cpp
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "TestInvocation.h"
27
28 #include "PlatformWebView.h"
29 #include "StringFunctions.h"
30 #include "TestController.h"
31 #include <WebKit2/WKContextPrivate.h>
32 #include <WebKit2/WKRetainPtr.h>
33 #include <wtf/OwnArrayPtr.h>
34 #include <wtf/PassOwnArrayPtr.h>
35
36 using namespace WebKit;
37 using namespace std;
38
39 namespace WTR {
40
41 TestInvocation::TestInvocation(const char* pathOrURL)
42     : m_url(AdoptWK, createWKURL(pathOrURL))
43     , m_pathOrURL(fastStrDup(pathOrURL))
44     , m_gotInitialResponse(false)
45     , m_gotFinalMessage(false)
46     , m_error(false)
47 {
48 }
49
50 TestInvocation::~TestInvocation()
51 {
52     fastFree(m_pathOrURL);
53 }
54
55 static const unsigned w3cSVGWidth = 480;
56 static const unsigned w3cSVGHeight = 360;
57 static const unsigned normalWidth = 800;
58 static const unsigned normalHeight = 600;
59
60 static void sizeWebViewForCurrentTest(char* pathOrURL)
61 {
62     bool isSVGW3CTest = strstr(pathOrURL, "svg/W3C-SVG-1.1") || strstr(pathOrURL, "svg\\W3C-SVG-1.1");
63
64     if (isSVGW3CTest)
65         TestController::shared().mainWebView()->resizeTo(w3cSVGWidth, w3cSVGHeight);
66     else
67         TestController::shared().mainWebView()->resizeTo(normalWidth, normalHeight);
68 }
69
70 void TestInvocation::invoke()
71 {
72     sizeWebViewForCurrentTest(m_pathOrURL);
73
74     WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("BeginTest"));
75     WKContextPostMessageToInjectedBundle(TestController::shared().context(), messageName.get(), 0);
76
77     TestController::runUntil(m_gotInitialResponse);
78     if (m_error) {
79         dump("FAIL\n");
80         return;
81     }
82
83     WKPageLoadURL(TestController::shared().mainWebView()->page(), m_url.get());
84
85     TestController::runUntil(m_gotFinalMessage);
86     if (m_error) {
87         dump("FAIL\n");
88         return;
89     }
90 }
91
92 void TestInvocation::dump(const char* stringToDump)
93 {
94     printf("Content-Type: text/plain\n");
95     printf("%s", stringToDump);
96
97     fputs("#EOF\n", stdout);
98     fputs("#EOF\n", stdout);
99     fputs("#EOF\n", stderr);
100
101     fflush(stdout);
102     fflush(stderr);
103 }
104
105 void TestInvocation::didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody)
106 {
107     if (WKStringIsEqualToUTF8CString(messageName, "Error")) {
108         // Set all states to true to stop spinning the runloop.
109         m_gotInitialResponse = true;
110         m_gotFinalMessage = true;
111         m_error = true;
112         return;
113     }
114
115     if (WKStringIsEqualToUTF8CString(messageName, "Ack")) {
116         ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID());
117         WKStringRef messageBodyString = static_cast<WKStringRef>(messageBody);
118         if (WKStringIsEqualToUTF8CString(messageBodyString, "BeginTest")) {
119             m_gotInitialResponse = true;
120             return;
121         }
122
123         ASSERT_NOT_REACHED();
124     }
125
126     if (WKStringIsEqualToUTF8CString(messageName, "Done")) {
127         ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID());
128         WKStringRef messageBodyString = static_cast<WKStringRef>(messageBody);
129
130         dump(toSTD(messageBodyString).c_str());
131
132         m_gotFinalMessage = true;
133         return;
134     }
135
136     ASSERT_NOT_REACHED();
137 }
138
139 } // namespace WTR