Failing to upload to flakiness dashboard should not be a hard error
[WebKit-https.git] / Tools / WebKitTestRunner / Options.cpp
1 /*
2  * Copyright (C) 2013 University of Szeged. All rights reserved.
3  * Copyright (C) 2013 Samsung Electronics. All rights reserved.
4  * Copyright (C) 2015 Apple Inc. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include "config.h"
29 #include "Options.h"
30
31 #include <string.h>
32
33 namespace WTR {
34
35 Options::Options()
36     : useWaitToDumpWatchdogTimer(true)
37     , forceNoTimeout(false)
38     , verbose(false)
39     , gcBetweenTests(false)
40     , shouldDumpPixelsForAllTests(false)
41     , printSupportedFeatures(false)
42     , forceComplexText(false)
43     , shouldUseAcceleratedDrawing(false)
44     , shouldUseRemoteLayerTree(false)
45     , shouldShowWebView(false)
46 {
47 }
48
49 bool handleOptionNoTimeout(Options& options, const char*, const char*)
50 {
51     options.useWaitToDumpWatchdogTimer = false;
52     options.forceNoTimeout = true;
53     return true;
54 }
55
56 bool handleOptionVerbose(Options& options, const char*, const char*)
57 {
58     options.verbose = true;
59     return true;
60 }
61
62 bool handleOptionGcBetweenTests(Options& options, const char*, const char*)
63 {
64     options.gcBetweenTests = true;
65     return true;
66 }
67
68 bool handleOptionPixelTests(Options& options, const char*, const char*)
69 {
70     options.shouldDumpPixelsForAllTests = true;
71     return true;
72 }
73
74 bool handleOptionPrintSupportedFeatures(Options& options, const char*, const char*)
75 {
76     options.printSupportedFeatures = true;
77     return true;
78 }
79
80 bool handleOptionComplexText(Options& options, const char*, const char*)
81 {
82     options.forceComplexText = true;
83     return true;
84 }
85
86 bool handleOptionAcceleratedDrawing(Options& options, const char*, const char*)
87 {
88     options.shouldUseAcceleratedDrawing = true;
89     return true;
90 }
91
92 bool handleOptionRemoteLayerTree(Options& options, const char*, const char*)
93 {
94     options.shouldUseRemoteLayerTree = true;
95     return true;
96 }
97
98 bool handleOptionShowWebView(Options& options, const char*, const char*)
99 {
100     options.shouldShowWebView = true;
101     return true;
102 }
103
104 bool handleOptionAllowedHost(Options& options, const char*, const char* host)
105 {
106     options.allowedHosts.push_back(host);
107     return true;
108 }
109
110 bool handleOptionUnmatched(Options& options, const char* option, const char*)
111 {
112     if (option[0] && option[1] && option[0] == '-' && option[1] == '-')
113         return true;
114     options.paths.push_back(option);
115     return true;
116 }
117
118 OptionsHandler::OptionsHandler(Options& o)
119     : options(o)
120 {
121     optionList.append(Option("--no-timeout", "Disables all timeouts.", handleOptionNoTimeout));
122     optionList.append(Option("--verbose", "Turns on messages.", handleOptionVerbose));
123     optionList.append(Option("--gc-between-tests", "Garbage collection between tests.", handleOptionGcBetweenTests));
124     optionList.append(Option("--pixel-tests", "Check pixels.", handleOptionPixelTests));
125     optionList.append(Option("-p", "Check pixels.", handleOptionPixelTests));
126     optionList.append(Option("--print-supported-features", "For DumpRenderTree compatibility.", handleOptionPrintSupportedFeatures));
127     optionList.append(Option("--complex-text", "Force complex tests.", handleOptionComplexText));
128     optionList.append(Option("--accelerated-drawing", "Use accelerated drawing.", handleOptionAcceleratedDrawing));
129     optionList.append(Option("--remote-layer-tree", "Use remote layer tree.", handleOptionRemoteLayerTree));
130     optionList.append(Option("--allowed-host", "Allows access to the specified host from tests.", handleOptionAllowedHost, true));
131     optionList.append(Option("--show-webview", "Show the WebView during test runs (for Debugging)", handleOptionShowWebView));
132
133     optionList.append(Option(0, 0, handleOptionUnmatched));
134 }
135
136 const char * OptionsHandler::usage = "Usage: WebKitTestRunner [options] filename [filename2..n]";
137 const char * OptionsHandler::help = "Displays this help.";
138
139 Option::Option(const char* name, const char* description, std::function<bool(Options&, const char*, const char*)> parameterHandler, bool hasArgument)
140     : name(name), description(description), parameterHandler(parameterHandler), hasArgument(hasArgument) { };
141
142 bool Option::matches(const char* option)
143 {
144     return !name || !strcmp(name, option);
145 }
146
147 bool OptionsHandler::parse(int argc, const char* argv[])
148 {
149     bool status = true;
150     for (int argCounter = 1; argCounter < argc; ++argCounter) {
151         if (!strcmp(argv[argCounter], "--help") || !strcmp(argv[argCounter], "-h")) {
152             printHelp();
153             return false;
154         }
155         const char* currentOption = argv[argCounter];
156         for (Option& option : optionList) {
157             if (option.matches(currentOption)) {
158                 if (!option.parameterHandler)
159                     status = false;
160                 else if (option.hasArgument) {
161                     const char * currentArgument = argv[++argCounter];
162                     if (currentArgument)
163                         status &= option.parameterHandler(options, currentOption, currentArgument);
164                     else
165                         status = false;
166                 } else
167                     status &= option.parameterHandler(options, currentOption, 0);
168                 break;
169             }
170         }
171     }
172     return status;
173 }
174
175 void OptionsHandler::printHelp(FILE* channel)
176 {
177     fputs(usage, channel);
178     fputs("\n\n    -h|--help\n\t", channel);
179     fputs(help, channel);
180     fputs("\n\n", channel);
181     for (Option& option : optionList) {
182         if (!option.name)
183             continue;
184         fputs("    ", channel);
185         fputs(option.name, channel);
186         fputs((option.hasArgument ? " <param>\n\t" : "\n\t"), channel);
187         fputs(option.description, channel);
188         fputs("\n\n", channel);
189     }
190 }
191
192 } // namespace WTR