1 // Copyright 2009 Google Inc. All rights reserved.
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are
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
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.
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.
30 // The Google C++ Testing and Mocking Framework (Google Test)
32 // This file verifies Google Test event listeners receive events at the
37 #include "gtest/gtest.h"
38 #include "gtest/internal/custom/gtest.h"
40 using ::testing::AddGlobalTestEnvironment;
41 using ::testing::Environment;
42 using ::testing::InitGoogleTest;
43 using ::testing::Test;
44 using ::testing::TestEventListener;
45 using ::testing::TestInfo;
46 using ::testing::TestPartResult;
47 using ::testing::TestSuite;
48 using ::testing::UnitTest;
50 // Used by tests to register their events.
51 std::vector<std::string>* g_events = nullptr;
56 class EventRecordingListener : public TestEventListener {
58 explicit EventRecordingListener(const char* name) : name_(name) {}
61 void OnTestProgramStart(const UnitTest& /*unit_test*/) override {
62 g_events->push_back(GetFullMethodName("OnTestProgramStart"));
65 void OnTestIterationStart(const UnitTest& /*unit_test*/,
66 int iteration) override {
68 message << GetFullMethodName("OnTestIterationStart") << "(" << iteration
70 g_events->push_back(message.GetString());
73 void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {
74 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
77 void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {
78 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
80 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
81 void OnTestCaseStart(const TestCase& /*test_case*/) override {
82 g_events->push_back(GetFullMethodName("OnTestCaseStart"));
84 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
86 void OnTestStart(const TestInfo& /*test_info*/) override {
87 g_events->push_back(GetFullMethodName("OnTestStart"));
90 void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {
91 g_events->push_back(GetFullMethodName("OnTestPartResult"));
94 void OnTestEnd(const TestInfo& /*test_info*/) override {
95 g_events->push_back(GetFullMethodName("OnTestEnd"));
98 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
99 void OnTestCaseEnd(const TestCase& /*test_case*/) override {
100 g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
102 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
104 void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {
105 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
108 void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {
109 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
112 void OnTestIterationEnd(const UnitTest& /*unit_test*/,
113 int iteration) override {
115 message << GetFullMethodName("OnTestIterationEnd") << "(" << iteration
117 g_events->push_back(message.GetString());
120 void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {
121 g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
125 std::string GetFullMethodName(const char* name) { return name_ + "." + name; }
130 // This listener is using OnTestSuiteStart, OnTestSuiteEnd API
131 class EventRecordingListener2 : public TestEventListener {
133 explicit EventRecordingListener2(const char* name) : name_(name) {}
136 void OnTestProgramStart(const UnitTest& /*unit_test*/) override {
137 g_events->push_back(GetFullMethodName("OnTestProgramStart"));
140 void OnTestIterationStart(const UnitTest& /*unit_test*/,
141 int iteration) override {
143 message << GetFullMethodName("OnTestIterationStart") << "(" << iteration
145 g_events->push_back(message.GetString());
148 void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {
149 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
152 void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {
153 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
156 void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {
157 g_events->push_back(GetFullMethodName("OnTestSuiteStart"));
160 void OnTestStart(const TestInfo& /*test_info*/) override {
161 g_events->push_back(GetFullMethodName("OnTestStart"));
164 void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {
165 g_events->push_back(GetFullMethodName("OnTestPartResult"));
168 void OnTestEnd(const TestInfo& /*test_info*/) override {
169 g_events->push_back(GetFullMethodName("OnTestEnd"));
172 void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {
173 g_events->push_back(GetFullMethodName("OnTestSuiteEnd"));
176 void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {
177 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
180 void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {
181 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
184 void OnTestIterationEnd(const UnitTest& /*unit_test*/,
185 int iteration) override {
187 message << GetFullMethodName("OnTestIterationEnd") << "(" << iteration
189 g_events->push_back(message.GetString());
192 void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {
193 g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
197 std::string GetFullMethodName(const char* name) { return name_ + "." + name; }
202 class EnvironmentInvocationCatcher : public Environment {
204 void SetUp() override { g_events->push_back("Environment::SetUp"); }
206 void TearDown() override { g_events->push_back("Environment::TearDown"); }
209 class ListenerTest : public Test {
211 static void SetUpTestSuite() {
212 g_events->push_back("ListenerTest::SetUpTestSuite");
215 static void TearDownTestSuite() {
216 g_events->push_back("ListenerTest::TearDownTestSuite");
219 void SetUp() override { g_events->push_back("ListenerTest::SetUp"); }
221 void TearDown() override { g_events->push_back("ListenerTest::TearDown"); }
224 TEST_F(ListenerTest, DoesFoo) {
225 // Test execution order within a test case is not guaranteed so we are not
226 // recording the test name.
227 g_events->push_back("ListenerTest::* Test Body");
228 SUCCEED(); // Triggers OnTestPartResult.
231 TEST_F(ListenerTest, DoesBar) {
232 g_events->push_back("ListenerTest::* Test Body");
233 SUCCEED(); // Triggers OnTestPartResult.
236 } // namespace internal
238 } // namespace testing
240 using ::testing::internal::EnvironmentInvocationCatcher;
241 using ::testing::internal::EventRecordingListener;
242 using ::testing::internal::EventRecordingListener2;
244 void VerifyResults(const std::vector<std::string>& data,
245 const char* const* expected_data,
246 size_t expected_data_size) {
247 const size_t actual_size = data.size();
248 // If the following assertion fails, a new entry will be appended to
249 // data. Hence we save data.size() first.
250 EXPECT_EQ(expected_data_size, actual_size);
252 // Compares the common prefix.
253 const size_t shorter_size =
254 expected_data_size <= actual_size ? expected_data_size : actual_size;
256 for (; i < shorter_size; ++i) {
257 ASSERT_STREQ(expected_data[i], data[i].c_str()) << "at position " << i;
260 // Prints extra elements in the actual data.
261 for (; i < actual_size; ++i) {
262 printf(" Actual event #%lu: %s\n", static_cast<unsigned long>(i),
267 int main(int argc, char** argv) {
268 std::vector<std::string> events;
270 InitGoogleTest(&argc, argv);
272 UnitTest::GetInstance()->listeners().Append(
273 new EventRecordingListener("1st"));
274 UnitTest::GetInstance()->listeners().Append(
275 new EventRecordingListener("2nd"));
276 UnitTest::GetInstance()->listeners().Append(
277 new EventRecordingListener2("3rd"));
279 AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
281 GTEST_CHECK_(events.size() == 0)
282 << "AddGlobalTestEnvironment should not generate any events itself.";
284 GTEST_FLAG_SET(repeat, 2);
285 GTEST_FLAG_SET(recreate_environments_when_repeating, true);
286 int ret_val = RUN_ALL_TESTS();
288 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
290 // The deprecated OnTestSuiteStart/OnTestCaseStart events are included
291 const char* const expected_events[] = {"1st.OnTestProgramStart",
292 "2nd.OnTestProgramStart",
293 "3rd.OnTestProgramStart",
294 "1st.OnTestIterationStart(0)",
295 "2nd.OnTestIterationStart(0)",
296 "3rd.OnTestIterationStart(0)",
297 "1st.OnEnvironmentsSetUpStart",
298 "2nd.OnEnvironmentsSetUpStart",
299 "3rd.OnEnvironmentsSetUpStart",
300 "Environment::SetUp",
301 "3rd.OnEnvironmentsSetUpEnd",
302 "2nd.OnEnvironmentsSetUpEnd",
303 "1st.OnEnvironmentsSetUpEnd",
304 "3rd.OnTestSuiteStart",
305 "1st.OnTestCaseStart",
306 "2nd.OnTestCaseStart",
307 "ListenerTest::SetUpTestSuite",
311 "ListenerTest::SetUp",
312 "ListenerTest::* Test Body",
313 "1st.OnTestPartResult",
314 "2nd.OnTestPartResult",
315 "3rd.OnTestPartResult",
316 "ListenerTest::TearDown",
323 "ListenerTest::SetUp",
324 "ListenerTest::* Test Body",
325 "1st.OnTestPartResult",
326 "2nd.OnTestPartResult",
327 "3rd.OnTestPartResult",
328 "ListenerTest::TearDown",
332 "ListenerTest::TearDownTestSuite",
333 "3rd.OnTestSuiteEnd",
336 "1st.OnEnvironmentsTearDownStart",
337 "2nd.OnEnvironmentsTearDownStart",
338 "3rd.OnEnvironmentsTearDownStart",
339 "Environment::TearDown",
340 "3rd.OnEnvironmentsTearDownEnd",
341 "2nd.OnEnvironmentsTearDownEnd",
342 "1st.OnEnvironmentsTearDownEnd",
343 "3rd.OnTestIterationEnd(0)",
344 "2nd.OnTestIterationEnd(0)",
345 "1st.OnTestIterationEnd(0)",
346 "1st.OnTestIterationStart(1)",
347 "2nd.OnTestIterationStart(1)",
348 "3rd.OnTestIterationStart(1)",
349 "1st.OnEnvironmentsSetUpStart",
350 "2nd.OnEnvironmentsSetUpStart",
351 "3rd.OnEnvironmentsSetUpStart",
352 "Environment::SetUp",
353 "3rd.OnEnvironmentsSetUpEnd",
354 "2nd.OnEnvironmentsSetUpEnd",
355 "1st.OnEnvironmentsSetUpEnd",
356 "3rd.OnTestSuiteStart",
357 "1st.OnTestCaseStart",
358 "2nd.OnTestCaseStart",
359 "ListenerTest::SetUpTestSuite",
363 "ListenerTest::SetUp",
364 "ListenerTest::* Test Body",
365 "1st.OnTestPartResult",
366 "2nd.OnTestPartResult",
367 "3rd.OnTestPartResult",
368 "ListenerTest::TearDown",
375 "ListenerTest::SetUp",
376 "ListenerTest::* Test Body",
377 "1st.OnTestPartResult",
378 "2nd.OnTestPartResult",
379 "3rd.OnTestPartResult",
380 "ListenerTest::TearDown",
384 "ListenerTest::TearDownTestSuite",
385 "3rd.OnTestSuiteEnd",
388 "1st.OnEnvironmentsTearDownStart",
389 "2nd.OnEnvironmentsTearDownStart",
390 "3rd.OnEnvironmentsTearDownStart",
391 "Environment::TearDown",
392 "3rd.OnEnvironmentsTearDownEnd",
393 "2nd.OnEnvironmentsTearDownEnd",
394 "1st.OnEnvironmentsTearDownEnd",
395 "3rd.OnTestIterationEnd(1)",
396 "2nd.OnTestIterationEnd(1)",
397 "1st.OnTestIterationEnd(1)",
398 "3rd.OnTestProgramEnd",
399 "2nd.OnTestProgramEnd",
400 "1st.OnTestProgramEnd"};
402 const char* const expected_events[] = {"1st.OnTestProgramStart",
403 "2nd.OnTestProgramStart",
404 "3rd.OnTestProgramStart",
405 "1st.OnTestIterationStart(0)",
406 "2nd.OnTestIterationStart(0)",
407 "3rd.OnTestIterationStart(0)",
408 "1st.OnEnvironmentsSetUpStart",
409 "2nd.OnEnvironmentsSetUpStart",
410 "3rd.OnEnvironmentsSetUpStart",
411 "Environment::SetUp",
412 "3rd.OnEnvironmentsSetUpEnd",
413 "2nd.OnEnvironmentsSetUpEnd",
414 "1st.OnEnvironmentsSetUpEnd",
415 "3rd.OnTestSuiteStart",
416 "ListenerTest::SetUpTestSuite",
420 "ListenerTest::SetUp",
421 "ListenerTest::* Test Body",
422 "1st.OnTestPartResult",
423 "2nd.OnTestPartResult",
424 "3rd.OnTestPartResult",
425 "ListenerTest::TearDown",
432 "ListenerTest::SetUp",
433 "ListenerTest::* Test Body",
434 "1st.OnTestPartResult",
435 "2nd.OnTestPartResult",
436 "3rd.OnTestPartResult",
437 "ListenerTest::TearDown",
441 "ListenerTest::TearDownTestSuite",
442 "3rd.OnTestSuiteEnd",
443 "1st.OnEnvironmentsTearDownStart",
444 "2nd.OnEnvironmentsTearDownStart",
445 "3rd.OnEnvironmentsTearDownStart",
446 "Environment::TearDown",
447 "3rd.OnEnvironmentsTearDownEnd",
448 "2nd.OnEnvironmentsTearDownEnd",
449 "1st.OnEnvironmentsTearDownEnd",
450 "3rd.OnTestIterationEnd(0)",
451 "2nd.OnTestIterationEnd(0)",
452 "1st.OnTestIterationEnd(0)",
453 "1st.OnTestIterationStart(1)",
454 "2nd.OnTestIterationStart(1)",
455 "3rd.OnTestIterationStart(1)",
456 "1st.OnEnvironmentsSetUpStart",
457 "2nd.OnEnvironmentsSetUpStart",
458 "3rd.OnEnvironmentsSetUpStart",
459 "Environment::SetUp",
460 "3rd.OnEnvironmentsSetUpEnd",
461 "2nd.OnEnvironmentsSetUpEnd",
462 "1st.OnEnvironmentsSetUpEnd",
463 "3rd.OnTestSuiteStart",
464 "ListenerTest::SetUpTestSuite",
468 "ListenerTest::SetUp",
469 "ListenerTest::* Test Body",
470 "1st.OnTestPartResult",
471 "2nd.OnTestPartResult",
472 "3rd.OnTestPartResult",
473 "ListenerTest::TearDown",
480 "ListenerTest::SetUp",
481 "ListenerTest::* Test Body",
482 "1st.OnTestPartResult",
483 "2nd.OnTestPartResult",
484 "3rd.OnTestPartResult",
485 "ListenerTest::TearDown",
489 "ListenerTest::TearDownTestSuite",
490 "3rd.OnTestSuiteEnd",
491 "1st.OnEnvironmentsTearDownStart",
492 "2nd.OnEnvironmentsTearDownStart",
493 "3rd.OnEnvironmentsTearDownStart",
494 "Environment::TearDown",
495 "3rd.OnEnvironmentsTearDownEnd",
496 "2nd.OnEnvironmentsTearDownEnd",
497 "1st.OnEnvironmentsTearDownEnd",
498 "3rd.OnTestIterationEnd(1)",
499 "2nd.OnTestIterationEnd(1)",
500 "1st.OnTestIterationEnd(1)",
501 "3rd.OnTestProgramEnd",
502 "2nd.OnTestProgramEnd",
503 "1st.OnTestProgramEnd"};
504 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
506 VerifyResults(events, expected_events,
507 sizeof(expected_events) / sizeof(expected_events[0]));
509 // We need to check manually for ad hoc test failures that happen after
510 // RUN_ALL_TESTS finishes.
511 if (UnitTest::GetInstance()->Failed()) ret_val = 1;