Test gardening for GTK.
[WebKit-https.git] / Tools / DumpRenderTree / DumpRenderTreeCommon.cpp
1 /*
2  * Copyright (C) 2016 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "DumpRenderTree.h"
28
29 #include <algorithm>
30 #include <ctype.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string>
34
35 class CommandTokenizer {
36 public:
37     explicit CommandTokenizer(const std::string& input)
38         : m_input(input)
39         , m_posNextSeparator(0)
40     {
41         pump();
42     }
43
44     bool hasNext() const;
45     std::string next();
46
47 private:
48     void pump();
49     static const char kSeparator = '\'';
50     const std::string& m_input;
51     std::string m_next;
52     size_t m_posNextSeparator;
53 };
54
55 void CommandTokenizer::pump()
56 {
57     if (m_posNextSeparator == std::string::npos || m_posNextSeparator == m_input.size()) {
58         m_next = std::string();
59         return;
60     }
61     size_t start = m_posNextSeparator ? m_posNextSeparator + 1 : 0;
62     m_posNextSeparator = m_input.find(kSeparator, start);
63     size_t size = m_posNextSeparator == std::string::npos ? std::string::npos : m_posNextSeparator - start;
64     m_next = std::string(m_input, start, size);
65 }
66
67 std::string CommandTokenizer::next()
68 {
69     ASSERT(hasNext());
70
71     std::string oldNext = m_next;
72     pump();
73     return oldNext;
74 }
75
76 bool CommandTokenizer::hasNext() const
77 {
78     return !m_next.empty();
79 }
80
81 NO_RETURN static void die(const std::string& inputLine)
82 {
83     fprintf(stderr, "Unexpected input line: %s\n", inputLine.c_str());
84     exit(1);
85 }
86
87 TestCommand parseInputLine(const std::string& inputLine)
88 {
89     TestCommand result;
90     CommandTokenizer tokenizer(inputLine);
91     if (!tokenizer.hasNext())
92         die(inputLine);
93
94     std::string arg = tokenizer.next();
95     result.pathOrURL = arg;
96     while (tokenizer.hasNext()) {
97         arg = tokenizer.next();
98         if (arg == "--timeout") {
99             std::string timeoutToken = tokenizer.next();
100             result.timeout = atoi(timeoutToken.c_str());
101         } else if (arg == "-p" || arg == "--pixel-test") {
102             result.shouldDumpPixels = true;
103             if (tokenizer.hasNext())
104                 result.expectedPixelHash = tokenizer.next();
105         } else if (arg == "--dump-jsconsolelog-in-stderr")
106             result.dumpJSConsoleLogInStdErr = true;
107         else if (arg == std::string("--absolutePath"))
108             result.absolutePath = tokenizer.next();
109         else
110             die(inputLine);
111     }
112
113     return result;
114 }