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