2010-07-12 Maciej Stachowiak <mjs@apple.com>
[WebKit-https.git] / WebKitTools / WebKitTestRunner / TestController.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 "TestController.h"
27
28 #include "PlatformWebView.h"
29 #include "TestInvocation.h"
30 #include <getopt.h>
31
32 namespace WTR {
33
34 TestController& TestController::shared()
35 {
36     static TestController& shared = *new TestController;
37     return shared;
38 }
39
40 TestController::TestController()
41     : m_dumpTree(false)
42     , m_dumpPixels(false)
43     , m_threaded(false)
44     , m_forceComplexText(false)    
45     , m_verbose(false)
46     , m_printSeparators(false)
47     , m_usingServerMode(false)
48 {
49 }
50
51 void TestController::initialize(int argc, const char *argv[])
52 {
53     int dumpTree = 0;
54     int dumpPixels = 0;
55     int threaded = 0;
56     int forceComplexText = 0;
57     int useHTML5Parser = 0;
58     int verbose = 0;
59
60     struct option options[] = {
61         {"notree", no_argument, &dumpTree, false},
62         {"pixel-tests", no_argument, &dumpPixels, true},
63         {"tree", no_argument, &dumpTree, true},
64         {"threaded", no_argument, &threaded, true},
65         {"complex-text", no_argument, &forceComplexText, true},
66         {"legacy-parser", no_argument, &useHTML5Parser, false},
67         {"verbose", no_argument, &verbose, true},
68         {0, 0, 0, 0}
69     };
70     
71     int option;
72     while ((option = getopt_long(argc, (char * const *)argv, "", options, 0)) != -1) {
73         switch (option) {
74             case '?':   // unknown or ambiguous option
75             case ':':   // missing argument
76                 exit(1);
77                 break;
78         }
79     }
80
81     m_dumpTree = dumpTree;
82     m_dumpPixels = dumpPixels;
83     m_threaded = threaded;
84     m_forceComplexText = forceComplexText;
85     m_verbose = verbose;
86
87     m_usingServerMode = (argc == optind + 1 && strcmp(argv[optind], "-") == 0);
88     if (m_usingServerMode)
89         m_printSeparators = true;
90     else {
91         m_printSeparators = (optind < argc - 1 || (m_dumpPixels && m_dumpTree));
92         for (int i = optind; i != argc; ++i)
93             m_paths.push_back(std::string(argv[i]));
94     }
95
96     initializeInjectedBundlePath();
97
98     m_context.adopt(WKContextCreateWithInjectedBundlePath(injectedBundlePath()));
99
100     WKContextInjectedBundleClient injectedBundlePathClient = {
101         0,
102         this,
103         _didRecieveMessageFromInjectedBundle
104     };
105     WKContextSetInjectedBundleClient(m_context.get(), &injectedBundlePathClient);
106
107     m_pageNamespace.adopt(WKPageNamespaceCreate(m_context.get()));
108     m_mainWebView = new PlatformWebView(m_pageNamespace.get());
109 }
110
111 void TestController::runTest(const char* test)
112 {
113     m_currentInvocation.set(new TestInvocation(test));
114     m_currentInvocation->invoke();
115     m_currentInvocation.clear();
116 }
117
118 void TestController::runTestingServerLoop()
119 {
120     char filenameBuffer[2048];
121     while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) {
122         char *newLineCharacter = strchr(filenameBuffer, '\n');
123         if (newLineCharacter)
124             *newLineCharacter = '\0';
125
126         if (strlen(filenameBuffer) == 0)
127             continue;
128
129         runTest(filenameBuffer);
130     }
131 }
132
133 bool TestController::run()
134 {
135     if (m_usingServerMode)
136         runTestingServerLoop();
137     else {
138         for (size_t i = 0; i < m_paths.size(); ++i)
139             runTest(m_paths[i].c_str());
140     }
141
142     return true;
143 }
144
145 void TestController::_didRecieveMessageFromInjectedBundle(WKContextRef context, WKStringRef message, const void *clientInfo)
146 {
147     static_cast<TestController*>(const_cast<void*>(clientInfo))->didRecieveMessageFromInjectedBundle(message);
148 }
149
150 void TestController::didRecieveMessageFromInjectedBundle(WKStringRef message)
151 {
152     m_currentInvocation->didRecieveMessageFromInjectedBundle(message);
153 }
154
155 } // namespace WTR