| OLD | NEW |
| (Empty) |
| 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: | |
| 18 void EmitExpectation( | |
| 19 const test_expectations::Expectation& expectation) override { | |
| 20 expectations_.push_back(expectation); | |
| 21 } | |
| 22 | |
| 23 void OnSyntaxError(const std::string& message) override { | |
| 24 syntax_error_ = message; | |
| 25 } | |
| 26 | |
| 27 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 163 TEST_F(TestExpectationParserTest, SyntaxErrors) { | |
| 164 const char* const 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 | |
| 186 TEST_F(TestExpectationParserTest, DataErrors) { | |
| 187 const char* const 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* const 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 } | |
| OLD | NEW |