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 | }
|
---|