• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/test/expectations/parser.h"
6 
7 #include <string>
8 #include <vector>
9 
10 #include "base/compiler_specific.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 
13 using test_expectations::Parser;
14 
15 class TestExpectationParserTest : public testing::Test,
16                                   public Parser::Delegate {
17  public:
EmitExpectation(const test_expectations::Expectation & expectation)18   virtual void EmitExpectation(
19       const test_expectations::Expectation& expectation) OVERRIDE {
20     expectations_.push_back(expectation);
21   }
22 
OnSyntaxError(const std::string & message)23   virtual void OnSyntaxError(const std::string& message) OVERRIDE {
24     syntax_error_ = message;
25   }
26 
OnDataError(const std::string & error)27   virtual void OnDataError(const std::string& error) OVERRIDE {
28     data_errors_.push_back(error);
29   }
30 
31  protected:
32   std::vector<test_expectations::Expectation> expectations_;
33   std::string syntax_error_;
34   std::vector<std::string> data_errors_;
35 };
36 
TEST_F(TestExpectationParserTest,Basic)37 TEST_F(TestExpectationParserTest, Basic) {
38   Parser(this,
39       "http://crbug.com/1234 [ Win-8 ] DouglasTest.PoopsOk = Timeout").
40           Parse();
41   EXPECT_TRUE(syntax_error_.empty());
42   EXPECT_EQ(0u, data_errors_.size());
43 
44   ASSERT_EQ(1u, expectations_.size());
45   EXPECT_EQ("DouglasTest.PoopsOk", expectations_[0].test_name);
46   EXPECT_EQ(test_expectations::RESULT_TIMEOUT, expectations_[0].result);
47   EXPECT_EQ(test_expectations::CONFIGURATION_UNSPECIFIED,
48             expectations_[0].configuration);
49 
50   ASSERT_EQ(1u, expectations_[0].platforms.size());
51   EXPECT_EQ("Win", expectations_[0].platforms[0].name);
52   EXPECT_EQ("8", expectations_[0].platforms[0].variant);
53 }
54 
TEST_F(TestExpectationParserTest,MultiModifier)55 TEST_F(TestExpectationParserTest, MultiModifier) {
56   Parser(this, "BUG [ Win-XP Mac ] OhMy.MeOhMy = Failure").Parse();
57   EXPECT_TRUE(syntax_error_.empty());
58   EXPECT_EQ(0u, data_errors_.size());
59 
60   ASSERT_EQ(1u, expectations_.size());
61   EXPECT_EQ("OhMy.MeOhMy", expectations_[0].test_name);
62   EXPECT_EQ(test_expectations::RESULT_FAILURE,
63             expectations_[0].result);
64   EXPECT_EQ(test_expectations::CONFIGURATION_UNSPECIFIED,
65             expectations_[0].configuration);
66 
67   ASSERT_EQ(2u, expectations_[0].platforms.size());
68 
69   EXPECT_EQ("Win", expectations_[0].platforms[0].name);
70   EXPECT_EQ("XP", expectations_[0].platforms[0].variant);
71 
72   EXPECT_EQ("Mac", expectations_[0].platforms[1].name);
73   EXPECT_EQ("", expectations_[0].platforms[1].variant);
74 }
75 
TEST_F(TestExpectationParserTest,EmptyModifier)76 TEST_F(TestExpectationParserTest, EmptyModifier) {
77   Parser(this,
78       "BUG [] First.Test = Failure\n"
79       "BUG2 [   ] Second.Test = Crash").Parse();
80   EXPECT_EQ(0u, data_errors_.size());
81 
82   ASSERT_EQ(2u, expectations_.size());
83 
84   EXPECT_EQ("First.Test", expectations_[0].test_name);
85   EXPECT_EQ(test_expectations::RESULT_FAILURE,
86             expectations_[0].result);
87   EXPECT_EQ(test_expectations::CONFIGURATION_UNSPECIFIED,
88             expectations_[0].configuration);
89   EXPECT_EQ(0u, expectations_[0].platforms.size());
90 
91   EXPECT_EQ("Second.Test", expectations_[1].test_name);
92   EXPECT_EQ(test_expectations::RESULT_CRASH,
93             expectations_[1].result);
94   EXPECT_EQ(test_expectations::CONFIGURATION_UNSPECIFIED,
95             expectations_[1].configuration);
96   EXPECT_EQ(0u, expectations_[1].platforms.size());
97 }
98 
TEST_F(TestExpectationParserTest,MultiLine)99 TEST_F(TestExpectationParserTest, MultiLine) {
100   Parser(this,
101       "BUG [ Linux ] Line.First = Failure\n"
102       "\n"
103       "# A test comment.\n"
104       "BUG2 [ Release ] Line.Second = Skip").Parse();
105   EXPECT_TRUE(syntax_error_.empty());
106   EXPECT_EQ(0u, data_errors_.size());
107 
108   ASSERT_EQ(2u, expectations_.size());
109   EXPECT_EQ("Line.First", expectations_[0].test_name);
110   EXPECT_EQ(test_expectations::RESULT_FAILURE, expectations_[0].result);
111   EXPECT_EQ(test_expectations::CONFIGURATION_UNSPECIFIED,
112             expectations_[0].configuration);
113 
114   ASSERT_EQ(1u, expectations_[0].platforms.size());
115   EXPECT_EQ("Linux", expectations_[0].platforms[0].name);
116   EXPECT_EQ("", expectations_[0].platforms[0].variant);
117 
118   EXPECT_EQ("Line.Second", expectations_[1].test_name);
119   EXPECT_EQ(test_expectations::RESULT_SKIP, expectations_[1].result);
120   EXPECT_EQ(test_expectations::CONFIGURATION_RELEASE,
121             expectations_[1].configuration);
122   EXPECT_EQ(0u, expectations_[1].platforms.size());
123 }
124 
TEST_F(TestExpectationParserTest,MultiLineWithComments)125 TEST_F(TestExpectationParserTest, MultiLineWithComments) {
126   Parser(this,
127       "  # Comment for your thoughts\n"
128       "  \t \n"
129       "BUG [ Mac-10.8 Debug] Foo=Bar =Skip   # Why not another comment?\n"
130       "BUG2 [Win-XP\tWin-Vista ] Cow.GoesMoo   =\tTimeout\n\n").Parse();
131   EXPECT_TRUE(syntax_error_.empty()) << syntax_error_;
132   EXPECT_EQ(0u, data_errors_.size());
133 
134   ASSERT_EQ(2u, expectations_.size());
135   EXPECT_EQ("Foo=Bar", expectations_[0].test_name);
136   EXPECT_EQ(test_expectations::RESULT_SKIP, expectations_[0].result);
137   EXPECT_EQ(test_expectations::CONFIGURATION_DEBUG,
138             expectations_[0].configuration);
139 
140   ASSERT_EQ(1u, expectations_[0].platforms.size());
141   EXPECT_EQ("Mac", expectations_[0].platforms[0].name);
142   EXPECT_EQ("10.8", expectations_[0].platforms[0].variant);
143 
144   EXPECT_EQ("Cow.GoesMoo", expectations_[1].test_name);
145   EXPECT_EQ(test_expectations::RESULT_TIMEOUT, expectations_[1].result);
146   EXPECT_EQ(test_expectations::CONFIGURATION_UNSPECIFIED,
147             expectations_[1].configuration);
148 
149   ASSERT_EQ(2u, expectations_[1].platforms.size());
150   EXPECT_EQ("Win", expectations_[1].platforms[0].name);
151   EXPECT_EQ("XP", expectations_[1].platforms[0].variant);
152   EXPECT_EQ("Win", expectations_[1].platforms[0].name);
153   EXPECT_EQ("Vista", expectations_[1].platforms[1].variant);
154 }
155 
TEST_F(TestExpectationParserTest,WeirdSpaces)156 TEST_F(TestExpectationParserTest, WeirdSpaces) {
157   Parser(this, "   BUG       [Linux]        Weird  = Skip    ").Parse();
158   EXPECT_EQ(1u, expectations_.size());
159   EXPECT_TRUE(syntax_error_.empty());
160   EXPECT_EQ(0u, data_errors_.size());
161 }
162 
TEST_F(TestExpectationParserTest,SyntaxErrors)163 TEST_F(TestExpectationParserTest, SyntaxErrors) {
164   const char* kErrors[] = {
165     "Foo [ dfasd",
166     "Foo [Linux] # This is an illegal comment",
167     "Foo [Linux] Bar # Another illegal comment.",
168     "Foo [Linux] Bar = # Another illegal comment.",
169     "Foo[Linux]Bar=Failure",
170     "Foo\n[Linux] Bar = Failure",
171     "Foo [\nLinux] Bar = Failure",
172     "Foo [Linux\n] Bar = Failure",
173     "Foo [ Linux ] \n Bar = Failure",
174     "Foo [ Linux ] Bar =\nFailure",
175     "Foo [ Linux \n ] Bar =\nFailure",
176   };
177 
178   for (size_t i = 0; i < arraysize(kErrors); ++i) {
179     Parser(this, kErrors[i]).Parse();
180     EXPECT_FALSE(syntax_error_.empty())
181         << "Should have error for #" << i << ": " << kErrors[i];
182     syntax_error_.clear();
183   }
184 }
185 
TEST_F(TestExpectationParserTest,DataErrors)186 TEST_F(TestExpectationParserTest, DataErrors) {
187   const char* kOneError[] = {
188     "http://crbug.com/1234 [MagicBrowzR] BadModifier = Timeout",
189     "________ [Linux] BadResult = WhatNow",
190     "http://wkb.ug/1234 [Debug Release Win-7] MultipleConfigs = Skip",
191   };
192 
193   for (size_t i = 0; i < arraysize(kOneError); ++i) {
194     Parser(this, kOneError[i]).Parse();
195     EXPECT_EQ(1u, data_errors_.size()) << kOneError[i];
196     data_errors_.clear();
197   }
198 
199   const char* kTwoErrors[] = {
200     ". [Mac-TurningIntoiOS] BadModifierVariant.BadResult = Foobar",
201     "1234 [ Debug Release OS/2 ] MultipleConfigs.BadModifier = Pass",
202   };
203 
204   for (size_t i = 0; i < arraysize(kTwoErrors); ++i) {
205     Parser(this, kTwoErrors[i]).Parse();
206     EXPECT_EQ(2u, data_errors_.size()) << kTwoErrors[i];
207     data_errors_.clear();
208   }
209 }
210