OLD | NEW |
| (Empty) |
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 } | |
OLD | NEW |