[12746] | 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@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 (::testing::internal::IsTrue(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 | ::testing::internal::posix::Abort();\
|
---|
| 73 | }\
|
---|
| 74 | } while (::testing::internal::AlwaysFalse())
|
---|
| 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 | GTEST_FLAG(death_test_style) = "threadsafe";
|
---|
| 116 | EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
|
---|
| 117 |
|
---|
| 118 | GTEST_FLAG(death_test_style) = "fast";
|
---|
| 119 | EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
|
---|
| 120 | }
|
---|
| 121 |
|
---|
| 122 | #if GTEST_HAS_PARAM_TEST
|
---|
| 123 | int g_param_test_count = 0;
|
---|
| 124 |
|
---|
| 125 | const int kNumberOfParamTests = 10;
|
---|
| 126 |
|
---|
| 127 | class MyParamTest : public testing::TestWithParam<int> {};
|
---|
| 128 |
|
---|
| 129 | TEST_P(MyParamTest, ShouldPass) {
|
---|
| 130 | // TODO(vladl@google.com): Make parameter value checking robust
|
---|
| 131 | // WRT order of tests.
|
---|
| 132 | GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());
|
---|
| 133 | g_param_test_count++;
|
---|
| 134 | }
|
---|
| 135 | INSTANTIATE_TEST_CASE_P(MyParamSequence,
|
---|
| 136 | MyParamTest,
|
---|
| 137 | testing::Range(0, kNumberOfParamTests));
|
---|
| 138 | #endif // GTEST_HAS_PARAM_TEST
|
---|
| 139 |
|
---|
| 140 | // Resets the count for each test.
|
---|
| 141 | void ResetCounts() {
|
---|
| 142 | g_environment_set_up_count = 0;
|
---|
| 143 | g_environment_tear_down_count = 0;
|
---|
| 144 | g_should_fail_count = 0;
|
---|
| 145 | g_should_pass_count = 0;
|
---|
| 146 | g_death_test_count = 0;
|
---|
| 147 | #if GTEST_HAS_PARAM_TEST
|
---|
| 148 | g_param_test_count = 0;
|
---|
| 149 | #endif // GTEST_HAS_PARAM_TEST
|
---|
| 150 | }
|
---|
| 151 |
|
---|
| 152 | // Checks that the count for each test is expected.
|
---|
| 153 | void CheckCounts(int expected) {
|
---|
| 154 | GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);
|
---|
| 155 | GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);
|
---|
| 156 | GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);
|
---|
| 157 | GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);
|
---|
| 158 | GTEST_CHECK_INT_EQ_(expected, g_death_test_count);
|
---|
| 159 | #if GTEST_HAS_PARAM_TEST
|
---|
| 160 | GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);
|
---|
| 161 | #endif // GTEST_HAS_PARAM_TEST
|
---|
| 162 | }
|
---|
| 163 |
|
---|
| 164 | // Tests the behavior of Google Test when --gtest_repeat is not specified.
|
---|
| 165 | void TestRepeatUnspecified() {
|
---|
| 166 | ResetCounts();
|
---|
| 167 | GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
|
---|
| 168 | CheckCounts(1);
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | // Tests the behavior of Google Test when --gtest_repeat has the given value.
|
---|
| 172 | void TestRepeat(int repeat) {
|
---|
| 173 | GTEST_FLAG(repeat) = repeat;
|
---|
| 174 |
|
---|
| 175 | ResetCounts();
|
---|
| 176 | GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());
|
---|
| 177 | CheckCounts(repeat);
|
---|
| 178 | }
|
---|
| 179 |
|
---|
| 180 | // Tests using --gtest_repeat when --gtest_filter specifies an empty
|
---|
| 181 | // set of tests.
|
---|
| 182 | void TestRepeatWithEmptyFilter(int repeat) {
|
---|
| 183 | GTEST_FLAG(repeat) = repeat;
|
---|
| 184 | GTEST_FLAG(filter) = "None";
|
---|
| 185 |
|
---|
| 186 | ResetCounts();
|
---|
| 187 | GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
|
---|
| 188 | CheckCounts(0);
|
---|
| 189 | }
|
---|
| 190 |
|
---|
| 191 | // Tests using --gtest_repeat when --gtest_filter specifies a set of
|
---|
| 192 | // successful tests.
|
---|
| 193 | void TestRepeatWithFilterForSuccessfulTests(int repeat) {
|
---|
| 194 | GTEST_FLAG(repeat) = repeat;
|
---|
| 195 | GTEST_FLAG(filter) = "*-*ShouldFail";
|
---|
| 196 |
|
---|
| 197 | ResetCounts();
|
---|
| 198 | GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
|
---|
| 199 | GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
|
---|
| 200 | GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
|
---|
| 201 | GTEST_CHECK_INT_EQ_(0, g_should_fail_count);
|
---|
| 202 | GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);
|
---|
| 203 | GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);
|
---|
| 204 | #if GTEST_HAS_PARAM_TEST
|
---|
| 205 | GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);
|
---|
| 206 | #endif // GTEST_HAS_PARAM_TEST
|
---|
| 207 | }
|
---|
| 208 |
|
---|
| 209 | // Tests using --gtest_repeat when --gtest_filter specifies a set of
|
---|
| 210 | // failed tests.
|
---|
| 211 | void TestRepeatWithFilterForFailedTests(int repeat) {
|
---|
| 212 | GTEST_FLAG(repeat) = repeat;
|
---|
| 213 | GTEST_FLAG(filter) = "*ShouldFail";
|
---|
| 214 |
|
---|
| 215 | ResetCounts();
|
---|
| 216 | GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
|
---|
| 217 | GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
|
---|
| 218 | GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
|
---|
| 219 | GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);
|
---|
| 220 | GTEST_CHECK_INT_EQ_(0, g_should_pass_count);
|
---|
| 221 | GTEST_CHECK_INT_EQ_(0, g_death_test_count);
|
---|
| 222 | #if GTEST_HAS_PARAM_TEST
|
---|
| 223 | GTEST_CHECK_INT_EQ_(0, g_param_test_count);
|
---|
| 224 | #endif // GTEST_HAS_PARAM_TEST
|
---|
| 225 | }
|
---|
| 226 |
|
---|
| 227 | } // namespace
|
---|
| 228 |
|
---|
| 229 | int main(int argc, char **argv) {
|
---|
| 230 | testing::InitGoogleTest(&argc, argv);
|
---|
| 231 | testing::AddGlobalTestEnvironment(new MyEnvironment);
|
---|
| 232 |
|
---|
| 233 | TestRepeatUnspecified();
|
---|
| 234 | TestRepeat(0);
|
---|
| 235 | TestRepeat(1);
|
---|
| 236 | TestRepeat(5);
|
---|
| 237 |
|
---|
| 238 | TestRepeatWithEmptyFilter(2);
|
---|
| 239 | TestRepeatWithEmptyFilter(3);
|
---|
| 240 |
|
---|
| 241 | TestRepeatWithFilterForSuccessfulTests(3);
|
---|
| 242 |
|
---|
| 243 | TestRepeatWithFilterForFailedTests(4);
|
---|
| 244 |
|
---|
| 245 | // It would be nice to verify that the tests indeed loop forever
|
---|
| 246 | // when GTEST_FLAG(repeat) is negative, but this test will be quite
|
---|
| 247 | // complicated to write. Since this flag is for interactive
|
---|
| 248 | // debugging only and doesn't affect the normal test result, such a
|
---|
| 249 | // test would be an overkill.
|
---|
| 250 |
|
---|
| 251 | printf("PASS\n");
|
---|
| 252 | return 0;
|
---|
| 253 | }
|
---|