Home | History | Annotate | Download | only in expectations
      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   virtual void EmitExpectation(
     19       const test_expectations::Expectation& expectation) OVERRIDE {
     20     expectations_.push_back(expectation);
     21   }
     22 
     23   virtual void OnSyntaxError(const std::string& message) OVERRIDE {
     24     syntax_error_ = message;
     25   }
     26 
     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 
     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* 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* 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