Home | History | Annotate | Download | only in test
      1 // Copyright 2008, Google Inc.
      2 // 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 are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 //
     30 // Author: wan (at) google.com (Zhanyong Wan)
     31 
     32 // Tests the --gtest_repeat=number flag.
     33 
     34 #include <stdlib.h>
     35 #include <iostream>
     36 #include <gtest/gtest.h>
     37 
     38 // Indicates that this translation unit is part of Google Test's
     39 // implementation.  It must come before gtest-internal-inl.h is
     40 // included, or there will be a compiler error.  This trick is to
     41 // prevent a user from accidentally including gtest-internal-inl.h in
     42 // his code.
     43 #define GTEST_IMPLEMENTATION_ 1
     44 #include "src/gtest-internal-inl.h"
     45 #undef GTEST_IMPLEMENTATION_
     46 
     47 namespace testing {
     48 
     49 GTEST_DECLARE_string_(death_test_style);
     50 GTEST_DECLARE_string_(filter);
     51 GTEST_DECLARE_int32_(repeat);
     52 
     53 }  // namespace testing
     54 
     55 using testing::GTEST_FLAG(death_test_style);
     56 using testing::GTEST_FLAG(filter);
     57 using testing::GTEST_FLAG(repeat);
     58 
     59 namespace {
     60 
     61 // We need this when we are testing Google Test itself and therefore
     62 // cannot use Google Test assertions.
     63 #define GTEST_CHECK_INT_EQ_(expected, actual) \
     64   do {\
     65     const int expected_val = (expected);\
     66     const int actual_val = (actual);\
     67     if (expected_val != actual_val) {\
     68       ::std::cout << "Value of: " #actual "\n"\
     69                   << "  Actual: " << actual_val << "\n"\
     70                   << "Expected: " #expected "\n"\
     71                   << "Which is: " << expected_val << "\n";\
     72       abort();\
     73     }\
     74   } while(false)
     75 
     76 
     77 // Used for verifying that global environment set-up and tear-down are
     78 // inside the gtest_repeat loop.
     79 
     80 int g_environment_set_up_count = 0;
     81 int g_environment_tear_down_count = 0;
     82 
     83 class MyEnvironment : public testing::Environment {
     84  public:
     85   MyEnvironment() {}
     86   virtual void SetUp() { g_environment_set_up_count++; }
     87   virtual void TearDown() { g_environment_tear_down_count++; }
     88 };
     89 
     90 // A test that should fail.
     91 
     92 int g_should_fail_count = 0;
     93 
     94 TEST(FooTest, ShouldFail) {
     95   g_should_fail_count++;
     96   EXPECT_EQ(0, 1) << "Expected failure.";
     97 }
     98 
     99 // A test that should pass.
    100 
    101 int g_should_pass_count = 0;
    102 
    103 TEST(FooTest, ShouldPass) {
    104   g_should_pass_count++;
    105 }
    106 
    107 // A test that contains a thread-safe death test and a fast death
    108 // test.  It should pass.
    109 
    110 int g_death_test_count = 0;
    111 
    112 TEST(BarDeathTest, ThreadSafeAndFast) {
    113   g_death_test_count++;
    114 
    115 #if GTEST_HAS_DEATH_TEST
    116   GTEST_FLAG(death_test_style) = "threadsafe";
    117   EXPECT_DEATH(abort(), "");
    118 
    119   GTEST_FLAG(death_test_style) = "fast";
    120   EXPECT_DEATH(abort(), "");
    121 #endif  // GTEST_HAS_DEATH_TEST
    122 }
    123 
    124 #if GTEST_HAS_PARAM_TEST
    125 int g_param_test_count = 0;
    126 
    127 const int kNumberOfParamTests = 10;
    128 
    129 class MyParamTest : public testing::TestWithParam<int> {};
    130 
    131 TEST_P(MyParamTest, ShouldPass) {
    132   // TODO(vladl (at) google.com): Make parameter value checking robust
    133   //                         WRT order of tests.
    134   GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());
    135   g_param_test_count++;
    136 }
    137 INSTANTIATE_TEST_CASE_P(MyParamSequence,
    138                         MyParamTest,
    139                         testing::Range(0, kNumberOfParamTests));
    140 #endif  // GTEST_HAS_PARAM_TEST
    141 
    142 // Resets the count for each test.
    143 void ResetCounts() {
    144   g_environment_set_up_count = 0;
    145   g_environment_tear_down_count = 0;
    146   g_should_fail_count = 0;
    147   g_should_pass_count = 0;
    148   g_death_test_count = 0;
    149 #if GTEST_HAS_PARAM_TEST
    150   g_param_test_count = 0;
    151 #endif  // GTEST_HAS_PARAM_TEST
    152 }
    153 
    154 // Checks that the count for each test is expected.
    155 void CheckCounts(int expected) {
    156   GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);
    157   GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);
    158   GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);
    159   GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);
    160   GTEST_CHECK_INT_EQ_(expected, g_death_test_count);
    161 #if GTEST_HAS_PARAM_TEST
    162   GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);
    163 #endif  // GTEST_HAS_PARAM_TEST
    164 }
    165 
    166 // Tests the behavior of Google Test when --gtest_repeat is not specified.
    167 void TestRepeatUnspecified() {
    168   ResetCounts();
    169   GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
    170   CheckCounts(1);
    171 }
    172 
    173 // Tests the behavior of Google Test when --gtest_repeat has the given value.
    174 void TestRepeat(int repeat) {
    175   GTEST_FLAG(repeat) = repeat;
    176 
    177   ResetCounts();
    178   GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());
    179   CheckCounts(repeat);
    180 }
    181 
    182 // Tests using --gtest_repeat when --gtest_filter specifies an empty
    183 // set of tests.
    184 void TestRepeatWithEmptyFilter(int repeat) {
    185   GTEST_FLAG(repeat) = repeat;
    186   GTEST_FLAG(filter) = "None";
    187 
    188   ResetCounts();
    189   GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
    190   CheckCounts(0);
    191 }
    192 
    193 // Tests using --gtest_repeat when --gtest_filter specifies a set of
    194 // successful tests.
    195 void TestRepeatWithFilterForSuccessfulTests(int repeat) {
    196   GTEST_FLAG(repeat) = repeat;
    197   GTEST_FLAG(filter) = "*-*ShouldFail";
    198 
    199   ResetCounts();
    200   GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
    201   GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
    202   GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
    203   GTEST_CHECK_INT_EQ_(0, g_should_fail_count);
    204   GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);
    205   GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);
    206 #if GTEST_HAS_PARAM_TEST
    207   GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);
    208 #endif  // GTEST_HAS_PARAM_TEST
    209 }
    210 
    211 // Tests using --gtest_repeat when --gtest_filter specifies a set of
    212 // failed tests.
    213 void TestRepeatWithFilterForFailedTests(int repeat) {
    214   GTEST_FLAG(repeat) = repeat;
    215   GTEST_FLAG(filter) = "*ShouldFail";
    216 
    217   ResetCounts();
    218   GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
    219   GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
    220   GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
    221   GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);
    222   GTEST_CHECK_INT_EQ_(0, g_should_pass_count);
    223   GTEST_CHECK_INT_EQ_(0, g_death_test_count);
    224 #if GTEST_HAS_PARAM_TEST
    225   GTEST_CHECK_INT_EQ_(0, g_param_test_count);
    226 #endif  // GTEST_HAS_PARAM_TEST
    227 }
    228 
    229 }  // namespace
    230 
    231 int main(int argc, char **argv) {
    232   testing::InitGoogleTest(&argc, argv);
    233   testing::AddGlobalTestEnvironment(new MyEnvironment);
    234 
    235   TestRepeatUnspecified();
    236   TestRepeat(0);
    237   TestRepeat(1);
    238   TestRepeat(5);
    239 
    240   TestRepeatWithEmptyFilter(2);
    241   TestRepeatWithEmptyFilter(3);
    242 
    243   TestRepeatWithFilterForSuccessfulTests(3);
    244 
    245   TestRepeatWithFilterForFailedTests(4);
    246 
    247   // It would be nice to verify that the tests indeed loop forever
    248   // when GTEST_FLAG(repeat) is negative, but this test will be quite
    249   // complicated to write.  Since this flag is for interactive
    250   // debugging only and doesn't affect the normal test result, such a
    251   // test would be an overkill.
    252 
    253   printf("PASS\n");
    254   return 0;
    255 }
    256