1 // Copyright 2009 Google Inc. All rights reserved.
2 //
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are
5 // met:
6 //
7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 // * Redistributions in binary form must reproduce the above
10 // copyright notice, this list of conditions and the following disclaimer
11 // in the documentation and/or other materials provided with the
12 // distribution.
13 // * Neither the name of Google Inc. nor the names of its
14 // contributors may be used to endorse or promote products derived from
15 // this software without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 //
30 // The Google C++ Testing and Mocking Framework (Google Test)
31 //
32 // This file verifies Google Test event listeners receive events at the
33 // right times.
34
35 #include <string>
36 #include <vector>
37
38 #include "gtest/gtest.h"
39 #include "gtest/internal/custom/gtest.h"
40
41 using ::testing::AddGlobalTestEnvironment;
42 using ::testing::InitGoogleTest;
43 using ::testing::UnitTest;
44
45 // Used by tests to register their events.
46 std::vector<std::string>* g_events = nullptr;
47
48 namespace testing {
49 namespace internal {
50
51 class EventRecordingListener : public TestEventListener {
52 public:
EventRecordingListener(const char * name)53 explicit EventRecordingListener(const char* name) : name_(name) {}
54
55 protected:
OnTestProgramStart(const UnitTest &)56 void OnTestProgramStart(const UnitTest& /*unit_test*/) override {
57 g_events->push_back(GetFullMethodName("OnTestProgramStart"));
58 }
59
OnTestIterationStart(const UnitTest &,int iteration)60 void OnTestIterationStart(const UnitTest& /*unit_test*/,
61 int iteration) override {
62 Message message;
63 message << GetFullMethodName("OnTestIterationStart") << "(" << iteration
64 << ")";
65 g_events->push_back(message.GetString());
66 }
67
OnEnvironmentsSetUpStart(const UnitTest &)68 void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {
69 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
70 }
71
OnEnvironmentsSetUpEnd(const UnitTest &)72 void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {
73 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
74 }
75 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
OnTestCaseStart(const TestCase &)76 void OnTestCaseStart(const TestCase& /*test_case*/) override {
77 g_events->push_back(GetFullMethodName("OnTestCaseStart"));
78 }
79 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
80
OnTestStart(const TestInfo &)81 void OnTestStart(const TestInfo& /*test_info*/) override {
82 g_events->push_back(GetFullMethodName("OnTestStart"));
83 }
84
OnTestPartResult(const TestPartResult &)85 void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {
86 g_events->push_back(GetFullMethodName("OnTestPartResult"));
87 }
88
OnTestEnd(const TestInfo &)89 void OnTestEnd(const TestInfo& /*test_info*/) override {
90 g_events->push_back(GetFullMethodName("OnTestEnd"));
91 }
92
93 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
OnTestCaseEnd(const TestCase &)94 void OnTestCaseEnd(const TestCase& /*test_case*/) override {
95 g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
96 }
97 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
98
OnEnvironmentsTearDownStart(const UnitTest &)99 void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {
100 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
101 }
102
OnEnvironmentsTearDownEnd(const UnitTest &)103 void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {
104 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
105 }
106
OnTestIterationEnd(const UnitTest &,int iteration)107 void OnTestIterationEnd(const UnitTest& /*unit_test*/,
108 int iteration) override {
109 Message message;
110 message << GetFullMethodName("OnTestIterationEnd") << "(" << iteration
111 << ")";
112 g_events->push_back(message.GetString());
113 }
114
OnTestProgramEnd(const UnitTest &)115 void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {
116 g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
117 }
118
119 private:
GetFullMethodName(const char * name)120 std::string GetFullMethodName(const char* name) { return name_ + "." + name; }
121
122 std::string name_;
123 };
124
125 // This listener is using OnTestSuiteStart, OnTestSuiteEnd API
126 class EventRecordingListener2 : public TestEventListener {
127 public:
EventRecordingListener2(const char * name)128 explicit EventRecordingListener2(const char* name) : name_(name) {}
129
130 protected:
OnTestProgramStart(const UnitTest &)131 void OnTestProgramStart(const UnitTest& /*unit_test*/) override {
132 g_events->push_back(GetFullMethodName("OnTestProgramStart"));
133 }
134
OnTestIterationStart(const UnitTest &,int iteration)135 void OnTestIterationStart(const UnitTest& /*unit_test*/,
136 int iteration) override {
137 Message message;
138 message << GetFullMethodName("OnTestIterationStart") << "(" << iteration
139 << ")";
140 g_events->push_back(message.GetString());
141 }
142
OnEnvironmentsSetUpStart(const UnitTest &)143 void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {
144 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
145 }
146
OnEnvironmentsSetUpEnd(const UnitTest &)147 void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {
148 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
149 }
150
OnTestSuiteStart(const TestSuite &)151 void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {
152 g_events->push_back(GetFullMethodName("OnTestSuiteStart"));
153 }
154
OnTestStart(const TestInfo &)155 void OnTestStart(const TestInfo& /*test_info*/) override {
156 g_events->push_back(GetFullMethodName("OnTestStart"));
157 }
158
OnTestPartResult(const TestPartResult &)159 void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {
160 g_events->push_back(GetFullMethodName("OnTestPartResult"));
161 }
162
OnTestEnd(const TestInfo &)163 void OnTestEnd(const TestInfo& /*test_info*/) override {
164 g_events->push_back(GetFullMethodName("OnTestEnd"));
165 }
166
OnTestSuiteEnd(const TestSuite &)167 void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {
168 g_events->push_back(GetFullMethodName("OnTestSuiteEnd"));
169 }
170
OnEnvironmentsTearDownStart(const UnitTest &)171 void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {
172 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
173 }
174
OnEnvironmentsTearDownEnd(const UnitTest &)175 void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {
176 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
177 }
178
OnTestIterationEnd(const UnitTest &,int iteration)179 void OnTestIterationEnd(const UnitTest& /*unit_test*/,
180 int iteration) override {
181 Message message;
182 message << GetFullMethodName("OnTestIterationEnd") << "(" << iteration
183 << ")";
184 g_events->push_back(message.GetString());
185 }
186
OnTestProgramEnd(const UnitTest &)187 void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {
188 g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
189 }
190
191 private:
GetFullMethodName(const char * name)192 std::string GetFullMethodName(const char* name) { return name_ + "." + name; }
193
194 std::string name_;
195 };
196
197 class EnvironmentInvocationCatcher : public Environment {
198 protected:
SetUp()199 void SetUp() override { g_events->push_back("Environment::SetUp"); }
200
TearDown()201 void TearDown() override { g_events->push_back("Environment::TearDown"); }
202 };
203
204 class ListenerTest : public Test {
205 protected:
SetUpTestSuite()206 static void SetUpTestSuite() {
207 g_events->push_back("ListenerTest::SetUpTestSuite");
208 }
209
TearDownTestSuite()210 static void TearDownTestSuite() {
211 g_events->push_back("ListenerTest::TearDownTestSuite");
212 }
213
SetUp()214 void SetUp() override { g_events->push_back("ListenerTest::SetUp"); }
215
TearDown()216 void TearDown() override { g_events->push_back("ListenerTest::TearDown"); }
217 };
218
TEST_F(ListenerTest,DoesFoo)219 TEST_F(ListenerTest, DoesFoo) {
220 // Test execution order within a test case is not guaranteed so we are not
221 // recording the test name.
222 g_events->push_back("ListenerTest::* Test Body");
223 SUCCEED(); // Triggers OnTestPartResult.
224 }
225
TEST_F(ListenerTest,DoesBar)226 TEST_F(ListenerTest, DoesBar) {
227 g_events->push_back("ListenerTest::* Test Body");
228 SUCCEED(); // Triggers OnTestPartResult.
229 }
230
231 } // namespace internal
232
233 } // namespace testing
234
235 using ::testing::internal::EnvironmentInvocationCatcher;
236 using ::testing::internal::EventRecordingListener;
237 using ::testing::internal::EventRecordingListener2;
238
VerifyResults(const std::vector<std::string> & data,const char * const * expected_data,size_t expected_data_size)239 void VerifyResults(const std::vector<std::string>& data,
240 const char* const* expected_data,
241 size_t expected_data_size) {
242 const size_t actual_size = data.size();
243 // If the following assertion fails, a new entry will be appended to
244 // data. Hence we save data.size() first.
245 EXPECT_EQ(expected_data_size, actual_size);
246
247 // Compares the common prefix.
248 const size_t shorter_size =
249 expected_data_size <= actual_size ? expected_data_size : actual_size;
250 size_t i = 0;
251 for (; i < shorter_size; ++i) {
252 ASSERT_STREQ(expected_data[i], data[i].c_str()) << "at position " << i;
253 }
254
255 // Prints extra elements in the actual data.
256 for (; i < actual_size; ++i) {
257 printf(" Actual event #%lu: %s\n", static_cast<unsigned long>(i),
258 data[i].c_str());
259 }
260 }
261
main(int argc,char ** argv)262 int main(int argc, char** argv) {
263 std::vector<std::string> events;
264 g_events = &events;
265 InitGoogleTest(&argc, argv);
266
267 UnitTest::GetInstance()->listeners().Append(
268 new EventRecordingListener("1st"));
269 UnitTest::GetInstance()->listeners().Append(
270 new EventRecordingListener("2nd"));
271 UnitTest::GetInstance()->listeners().Append(
272 new EventRecordingListener2("3rd"));
273
274 AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
275
276 GTEST_CHECK_(events.empty())
277 << "AddGlobalTestEnvironment should not generate any events itself.";
278
279 GTEST_FLAG_SET(repeat, 2);
280 GTEST_FLAG_SET(recreate_environments_when_repeating, true);
281 int ret_val = RUN_ALL_TESTS();
282
283 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
284
285 // The deprecated OnTestSuiteStart/OnTestCaseStart events are included
286 const char* const expected_events[] = {"1st.OnTestProgramStart",
287 "2nd.OnTestProgramStart",
288 "3rd.OnTestProgramStart",
289 "1st.OnTestIterationStart(0)",
290 "2nd.OnTestIterationStart(0)",
291 "3rd.OnTestIterationStart(0)",
292 "1st.OnEnvironmentsSetUpStart",
293 "2nd.OnEnvironmentsSetUpStart",
294 "3rd.OnEnvironmentsSetUpStart",
295 "Environment::SetUp",
296 "3rd.OnEnvironmentsSetUpEnd",
297 "2nd.OnEnvironmentsSetUpEnd",
298 "1st.OnEnvironmentsSetUpEnd",
299 "3rd.OnTestSuiteStart",
300 "1st.OnTestCaseStart",
301 "2nd.OnTestCaseStart",
302 "ListenerTest::SetUpTestSuite",
303 "1st.OnTestStart",
304 "2nd.OnTestStart",
305 "3rd.OnTestStart",
306 "ListenerTest::SetUp",
307 "ListenerTest::* Test Body",
308 "1st.OnTestPartResult",
309 "2nd.OnTestPartResult",
310 "3rd.OnTestPartResult",
311 "ListenerTest::TearDown",
312 "3rd.OnTestEnd",
313 "2nd.OnTestEnd",
314 "1st.OnTestEnd",
315 "1st.OnTestStart",
316 "2nd.OnTestStart",
317 "3rd.OnTestStart",
318 "ListenerTest::SetUp",
319 "ListenerTest::* Test Body",
320 "1st.OnTestPartResult",
321 "2nd.OnTestPartResult",
322 "3rd.OnTestPartResult",
323 "ListenerTest::TearDown",
324 "3rd.OnTestEnd",
325 "2nd.OnTestEnd",
326 "1st.OnTestEnd",
327 "ListenerTest::TearDownTestSuite",
328 "3rd.OnTestSuiteEnd",
329 "2nd.OnTestCaseEnd",
330 "1st.OnTestCaseEnd",
331 "1st.OnEnvironmentsTearDownStart",
332 "2nd.OnEnvironmentsTearDownStart",
333 "3rd.OnEnvironmentsTearDownStart",
334 "Environment::TearDown",
335 "3rd.OnEnvironmentsTearDownEnd",
336 "2nd.OnEnvironmentsTearDownEnd",
337 "1st.OnEnvironmentsTearDownEnd",
338 "3rd.OnTestIterationEnd(0)",
339 "2nd.OnTestIterationEnd(0)",
340 "1st.OnTestIterationEnd(0)",
341 "1st.OnTestIterationStart(1)",
342 "2nd.OnTestIterationStart(1)",
343 "3rd.OnTestIterationStart(1)",
344 "1st.OnEnvironmentsSetUpStart",
345 "2nd.OnEnvironmentsSetUpStart",
346 "3rd.OnEnvironmentsSetUpStart",
347 "Environment::SetUp",
348 "3rd.OnEnvironmentsSetUpEnd",
349 "2nd.OnEnvironmentsSetUpEnd",
350 "1st.OnEnvironmentsSetUpEnd",
351 "3rd.OnTestSuiteStart",
352 "1st.OnTestCaseStart",
353 "2nd.OnTestCaseStart",
354 "ListenerTest::SetUpTestSuite",
355 "1st.OnTestStart",
356 "2nd.OnTestStart",
357 "3rd.OnTestStart",
358 "ListenerTest::SetUp",
359 "ListenerTest::* Test Body",
360 "1st.OnTestPartResult",
361 "2nd.OnTestPartResult",
362 "3rd.OnTestPartResult",
363 "ListenerTest::TearDown",
364 "3rd.OnTestEnd",
365 "2nd.OnTestEnd",
366 "1st.OnTestEnd",
367 "1st.OnTestStart",
368 "2nd.OnTestStart",
369 "3rd.OnTestStart",
370 "ListenerTest::SetUp",
371 "ListenerTest::* Test Body",
372 "1st.OnTestPartResult",
373 "2nd.OnTestPartResult",
374 "3rd.OnTestPartResult",
375 "ListenerTest::TearDown",
376 "3rd.OnTestEnd",
377 "2nd.OnTestEnd",
378 "1st.OnTestEnd",
379 "ListenerTest::TearDownTestSuite",
380 "3rd.OnTestSuiteEnd",
381 "2nd.OnTestCaseEnd",
382 "1st.OnTestCaseEnd",
383 "1st.OnEnvironmentsTearDownStart",
384 "2nd.OnEnvironmentsTearDownStart",
385 "3rd.OnEnvironmentsTearDownStart",
386 "Environment::TearDown",
387 "3rd.OnEnvironmentsTearDownEnd",
388 "2nd.OnEnvironmentsTearDownEnd",
389 "1st.OnEnvironmentsTearDownEnd",
390 "3rd.OnTestIterationEnd(1)",
391 "2nd.OnTestIterationEnd(1)",
392 "1st.OnTestIterationEnd(1)",
393 "3rd.OnTestProgramEnd",
394 "2nd.OnTestProgramEnd",
395 "1st.OnTestProgramEnd"};
396 #else
397 const char* const expected_events[] = {"1st.OnTestProgramStart",
398 "2nd.OnTestProgramStart",
399 "3rd.OnTestProgramStart",
400 "1st.OnTestIterationStart(0)",
401 "2nd.OnTestIterationStart(0)",
402 "3rd.OnTestIterationStart(0)",
403 "1st.OnEnvironmentsSetUpStart",
404 "2nd.OnEnvironmentsSetUpStart",
405 "3rd.OnEnvironmentsSetUpStart",
406 "Environment::SetUp",
407 "3rd.OnEnvironmentsSetUpEnd",
408 "2nd.OnEnvironmentsSetUpEnd",
409 "1st.OnEnvironmentsSetUpEnd",
410 "3rd.OnTestSuiteStart",
411 "ListenerTest::SetUpTestSuite",
412 "1st.OnTestStart",
413 "2nd.OnTestStart",
414 "3rd.OnTestStart",
415 "ListenerTest::SetUp",
416 "ListenerTest::* Test Body",
417 "1st.OnTestPartResult",
418 "2nd.OnTestPartResult",
419 "3rd.OnTestPartResult",
420 "ListenerTest::TearDown",
421 "3rd.OnTestEnd",
422 "2nd.OnTestEnd",
423 "1st.OnTestEnd",
424 "1st.OnTestStart",
425 "2nd.OnTestStart",
426 "3rd.OnTestStart",
427 "ListenerTest::SetUp",
428 "ListenerTest::* Test Body",
429 "1st.OnTestPartResult",
430 "2nd.OnTestPartResult",
431 "3rd.OnTestPartResult",
432 "ListenerTest::TearDown",
433 "3rd.OnTestEnd",
434 "2nd.OnTestEnd",
435 "1st.OnTestEnd",
436 "ListenerTest::TearDownTestSuite",
437 "3rd.OnTestSuiteEnd",
438 "1st.OnEnvironmentsTearDownStart",
439 "2nd.OnEnvironmentsTearDownStart",
440 "3rd.OnEnvironmentsTearDownStart",
441 "Environment::TearDown",
442 "3rd.OnEnvironmentsTearDownEnd",
443 "2nd.OnEnvironmentsTearDownEnd",
444 "1st.OnEnvironmentsTearDownEnd",
445 "3rd.OnTestIterationEnd(0)",
446 "2nd.OnTestIterationEnd(0)",
447 "1st.OnTestIterationEnd(0)",
448 "1st.OnTestIterationStart(1)",
449 "2nd.OnTestIterationStart(1)",
450 "3rd.OnTestIterationStart(1)",
451 "1st.OnEnvironmentsSetUpStart",
452 "2nd.OnEnvironmentsSetUpStart",
453 "3rd.OnEnvironmentsSetUpStart",
454 "Environment::SetUp",
455 "3rd.OnEnvironmentsSetUpEnd",
456 "2nd.OnEnvironmentsSetUpEnd",
457 "1st.OnEnvironmentsSetUpEnd",
458 "3rd.OnTestSuiteStart",
459 "ListenerTest::SetUpTestSuite",
460 "1st.OnTestStart",
461 "2nd.OnTestStart",
462 "3rd.OnTestStart",
463 "ListenerTest::SetUp",
464 "ListenerTest::* Test Body",
465 "1st.OnTestPartResult",
466 "2nd.OnTestPartResult",
467 "3rd.OnTestPartResult",
468 "ListenerTest::TearDown",
469 "3rd.OnTestEnd",
470 "2nd.OnTestEnd",
471 "1st.OnTestEnd",
472 "1st.OnTestStart",
473 "2nd.OnTestStart",
474 "3rd.OnTestStart",
475 "ListenerTest::SetUp",
476 "ListenerTest::* Test Body",
477 "1st.OnTestPartResult",
478 "2nd.OnTestPartResult",
479 "3rd.OnTestPartResult",
480 "ListenerTest::TearDown",
481 "3rd.OnTestEnd",
482 "2nd.OnTestEnd",
483 "1st.OnTestEnd",
484 "ListenerTest::TearDownTestSuite",
485 "3rd.OnTestSuiteEnd",
486 "1st.OnEnvironmentsTearDownStart",
487 "2nd.OnEnvironmentsTearDownStart",
488 "3rd.OnEnvironmentsTearDownStart",
489 "Environment::TearDown",
490 "3rd.OnEnvironmentsTearDownEnd",
491 "2nd.OnEnvironmentsTearDownEnd",
492 "1st.OnEnvironmentsTearDownEnd",
493 "3rd.OnTestIterationEnd(1)",
494 "2nd.OnTestIterationEnd(1)",
495 "1st.OnTestIterationEnd(1)",
496 "3rd.OnTestProgramEnd",
497 "2nd.OnTestProgramEnd",
498 "1st.OnTestProgramEnd"};
499 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
500
501 VerifyResults(events, expected_events,
502 sizeof(expected_events) / sizeof(expected_events[0]));
503
504 // We need to check manually for ad hoc test failures that happen after
505 // RUN_ALL_TESTS finishes.
506 if (UnitTest::GetInstance()->Failed()) ret_val = 1;
507
508 return ret_val;
509 }
510