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::TestSuite
;
45 using ::testing::TestEventListener
;
46 using ::testing::TestInfo
;
47 using ::testing::TestPartResult
;
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")
69 << "(" << 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")
116 << "(" << 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
) {
126 return name_
+ "." + name
;
132 // This listener is using OnTestSuiteStart, OnTestSuiteEnd API
133 class EventRecordingListener2
: public TestEventListener
{
135 explicit EventRecordingListener2(const char* name
) : name_(name
) {}
138 void OnTestProgramStart(const UnitTest
& /*unit_test*/) override
{
139 g_events
->push_back(GetFullMethodName("OnTestProgramStart"));
142 void OnTestIterationStart(const UnitTest
& /*unit_test*/,
143 int iteration
) override
{
145 message
<< GetFullMethodName("OnTestIterationStart") << "(" << iteration
147 g_events
->push_back(message
.GetString());
150 void OnEnvironmentsSetUpStart(const UnitTest
& /*unit_test*/) override
{
151 g_events
->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
154 void OnEnvironmentsSetUpEnd(const UnitTest
& /*unit_test*/) override
{
155 g_events
->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
158 void OnTestSuiteStart(const TestSuite
& /*test_suite*/) override
{
159 g_events
->push_back(GetFullMethodName("OnTestSuiteStart"));
162 void OnTestStart(const TestInfo
& /*test_info*/) override
{
163 g_events
->push_back(GetFullMethodName("OnTestStart"));
166 void OnTestPartResult(const TestPartResult
& /*test_part_result*/) override
{
167 g_events
->push_back(GetFullMethodName("OnTestPartResult"));
170 void OnTestEnd(const TestInfo
& /*test_info*/) override
{
171 g_events
->push_back(GetFullMethodName("OnTestEnd"));
174 void OnTestSuiteEnd(const TestSuite
& /*test_suite*/) override
{
175 g_events
->push_back(GetFullMethodName("OnTestSuiteEnd"));
178 void OnEnvironmentsTearDownStart(const UnitTest
& /*unit_test*/) override
{
179 g_events
->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
182 void OnEnvironmentsTearDownEnd(const UnitTest
& /*unit_test*/) override
{
183 g_events
->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
186 void OnTestIterationEnd(const UnitTest
& /*unit_test*/,
187 int iteration
) override
{
189 message
<< GetFullMethodName("OnTestIterationEnd") << "(" << iteration
191 g_events
->push_back(message
.GetString());
194 void OnTestProgramEnd(const UnitTest
& /*unit_test*/) override
{
195 g_events
->push_back(GetFullMethodName("OnTestProgramEnd"));
199 std::string
GetFullMethodName(const char* name
) { return name_
+ "." + name
; }
204 class EnvironmentInvocationCatcher
: public Environment
{
206 void SetUp() override
{ g_events
->push_back("Environment::SetUp"); }
208 void TearDown() override
{ g_events
->push_back("Environment::TearDown"); }
211 class ListenerTest
: public Test
{
213 static void SetUpTestSuite() {
214 g_events
->push_back("ListenerTest::SetUpTestSuite");
217 static void TearDownTestSuite() {
218 g_events
->push_back("ListenerTest::TearDownTestSuite");
221 void SetUp() override
{ g_events
->push_back("ListenerTest::SetUp"); }
223 void TearDown() override
{ g_events
->push_back("ListenerTest::TearDown"); }
226 TEST_F(ListenerTest
, DoesFoo
) {
227 // Test execution order within a test case is not guaranteed so we are not
228 // recording the test name.
229 g_events
->push_back("ListenerTest::* Test Body");
230 SUCCEED(); // Triggers OnTestPartResult.
233 TEST_F(ListenerTest
, DoesBar
) {
234 g_events
->push_back("ListenerTest::* Test Body");
235 SUCCEED(); // Triggers OnTestPartResult.
238 } // namespace internal
240 } // namespace testing
242 using ::testing::internal::EnvironmentInvocationCatcher
;
243 using ::testing::internal::EventRecordingListener
;
244 using ::testing::internal::EventRecordingListener2
;
246 void VerifyResults(const std::vector
<std::string
>& data
,
247 const char* const* expected_data
,
248 size_t expected_data_size
) {
249 const size_t actual_size
= data
.size();
250 // If the following assertion fails, a new entry will be appended to
251 // data. Hence we save data.size() first.
252 EXPECT_EQ(expected_data_size
, actual_size
);
254 // Compares the common prefix.
255 const size_t shorter_size
= expected_data_size
<= actual_size
?
256 expected_data_size
: actual_size
;
258 for (; i
< shorter_size
; ++i
) {
259 ASSERT_STREQ(expected_data
[i
], data
[i
].c_str())
260 << "at position " << i
;
263 // Prints extra elements in the actual data.
264 for (; i
< actual_size
; ++i
) {
265 printf(" Actual event #%lu: %s\n",
266 static_cast<unsigned long>(i
), data
[i
].c_str());
270 int main(int argc
, char **argv
) {
271 std::vector
<std::string
> events
;
273 InitGoogleTest(&argc
, argv
);
275 UnitTest::GetInstance()->listeners().Append(
276 new EventRecordingListener("1st"));
277 UnitTest::GetInstance()->listeners().Append(
278 new EventRecordingListener("2nd"));
279 UnitTest::GetInstance()->listeners().Append(
280 new EventRecordingListener2("3rd"));
282 AddGlobalTestEnvironment(new EnvironmentInvocationCatcher
);
284 GTEST_CHECK_(events
.size() == 0)
285 << "AddGlobalTestEnvironment should not generate any events itself.";
287 ::testing::GTEST_FLAG(repeat
) = 2;
288 int ret_val
= RUN_ALL_TESTS();
290 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
292 // The deprecated OnTestSuiteStart/OnTestCaseStart events are included
293 const char* const expected_events
[] = {"1st.OnTestProgramStart",
294 "2nd.OnTestProgramStart",
295 "3rd.OnTestProgramStart",
296 "1st.OnTestIterationStart(0)",
297 "2nd.OnTestIterationStart(0)",
298 "3rd.OnTestIterationStart(0)",
299 "1st.OnEnvironmentsSetUpStart",
300 "2nd.OnEnvironmentsSetUpStart",
301 "3rd.OnEnvironmentsSetUpStart",
302 "Environment::SetUp",
303 "3rd.OnEnvironmentsSetUpEnd",
304 "2nd.OnEnvironmentsSetUpEnd",
305 "1st.OnEnvironmentsSetUpEnd",
306 "3rd.OnTestSuiteStart",
307 "1st.OnTestCaseStart",
308 "2nd.OnTestCaseStart",
309 "ListenerTest::SetUpTestSuite",
313 "ListenerTest::SetUp",
314 "ListenerTest::* Test Body",
315 "1st.OnTestPartResult",
316 "2nd.OnTestPartResult",
317 "3rd.OnTestPartResult",
318 "ListenerTest::TearDown",
325 "ListenerTest::SetUp",
326 "ListenerTest::* Test Body",
327 "1st.OnTestPartResult",
328 "2nd.OnTestPartResult",
329 "3rd.OnTestPartResult",
330 "ListenerTest::TearDown",
334 "ListenerTest::TearDownTestSuite",
335 "3rd.OnTestSuiteEnd",
338 "1st.OnEnvironmentsTearDownStart",
339 "2nd.OnEnvironmentsTearDownStart",
340 "3rd.OnEnvironmentsTearDownStart",
341 "Environment::TearDown",
342 "3rd.OnEnvironmentsTearDownEnd",
343 "2nd.OnEnvironmentsTearDownEnd",
344 "1st.OnEnvironmentsTearDownEnd",
345 "3rd.OnTestIterationEnd(0)",
346 "2nd.OnTestIterationEnd(0)",
347 "1st.OnTestIterationEnd(0)",
348 "1st.OnTestIterationStart(1)",
349 "2nd.OnTestIterationStart(1)",
350 "3rd.OnTestIterationStart(1)",
351 "1st.OnEnvironmentsSetUpStart",
352 "2nd.OnEnvironmentsSetUpStart",
353 "3rd.OnEnvironmentsSetUpStart",
354 "Environment::SetUp",
355 "3rd.OnEnvironmentsSetUpEnd",
356 "2nd.OnEnvironmentsSetUpEnd",
357 "1st.OnEnvironmentsSetUpEnd",
358 "3rd.OnTestSuiteStart",
359 "1st.OnTestCaseStart",
360 "2nd.OnTestCaseStart",
361 "ListenerTest::SetUpTestSuite",
365 "ListenerTest::SetUp",
366 "ListenerTest::* Test Body",
367 "1st.OnTestPartResult",
368 "2nd.OnTestPartResult",
369 "3rd.OnTestPartResult",
370 "ListenerTest::TearDown",
377 "ListenerTest::SetUp",
378 "ListenerTest::* Test Body",
379 "1st.OnTestPartResult",
380 "2nd.OnTestPartResult",
381 "3rd.OnTestPartResult",
382 "ListenerTest::TearDown",
386 "ListenerTest::TearDownTestSuite",
387 "3rd.OnTestSuiteEnd",
390 "1st.OnEnvironmentsTearDownStart",
391 "2nd.OnEnvironmentsTearDownStart",
392 "3rd.OnEnvironmentsTearDownStart",
393 "Environment::TearDown",
394 "3rd.OnEnvironmentsTearDownEnd",
395 "2nd.OnEnvironmentsTearDownEnd",
396 "1st.OnEnvironmentsTearDownEnd",
397 "3rd.OnTestIterationEnd(1)",
398 "2nd.OnTestIterationEnd(1)",
399 "1st.OnTestIterationEnd(1)",
400 "3rd.OnTestProgramEnd",
401 "2nd.OnTestProgramEnd",
402 "1st.OnTestProgramEnd"};
404 const char* const expected_events
[] = {"1st.OnTestProgramStart",
405 "2nd.OnTestProgramStart",
406 "3rd.OnTestProgramStart",
407 "1st.OnTestIterationStart(0)",
408 "2nd.OnTestIterationStart(0)",
409 "3rd.OnTestIterationStart(0)",
410 "1st.OnEnvironmentsSetUpStart",
411 "2nd.OnEnvironmentsSetUpStart",
412 "3rd.OnEnvironmentsSetUpStart",
413 "Environment::SetUp",
414 "3rd.OnEnvironmentsSetUpEnd",
415 "2nd.OnEnvironmentsSetUpEnd",
416 "1st.OnEnvironmentsSetUpEnd",
417 "3rd.OnTestSuiteStart",
418 "ListenerTest::SetUpTestSuite",
422 "ListenerTest::SetUp",
423 "ListenerTest::* Test Body",
424 "1st.OnTestPartResult",
425 "2nd.OnTestPartResult",
426 "3rd.OnTestPartResult",
427 "ListenerTest::TearDown",
434 "ListenerTest::SetUp",
435 "ListenerTest::* Test Body",
436 "1st.OnTestPartResult",
437 "2nd.OnTestPartResult",
438 "3rd.OnTestPartResult",
439 "ListenerTest::TearDown",
443 "ListenerTest::TearDownTestSuite",
444 "3rd.OnTestSuiteEnd",
445 "1st.OnEnvironmentsTearDownStart",
446 "2nd.OnEnvironmentsTearDownStart",
447 "3rd.OnEnvironmentsTearDownStart",
448 "Environment::TearDown",
449 "3rd.OnEnvironmentsTearDownEnd",
450 "2nd.OnEnvironmentsTearDownEnd",
451 "1st.OnEnvironmentsTearDownEnd",
452 "3rd.OnTestIterationEnd(0)",
453 "2nd.OnTestIterationEnd(0)",
454 "1st.OnTestIterationEnd(0)",
455 "1st.OnTestIterationStart(1)",
456 "2nd.OnTestIterationStart(1)",
457 "3rd.OnTestIterationStart(1)",
458 "1st.OnEnvironmentsSetUpStart",
459 "2nd.OnEnvironmentsSetUpStart",
460 "3rd.OnEnvironmentsSetUpStart",
461 "Environment::SetUp",
462 "3rd.OnEnvironmentsSetUpEnd",
463 "2nd.OnEnvironmentsSetUpEnd",
464 "1st.OnEnvironmentsSetUpEnd",
465 "3rd.OnTestSuiteStart",
466 "ListenerTest::SetUpTestSuite",
470 "ListenerTest::SetUp",
471 "ListenerTest::* Test Body",
472 "1st.OnTestPartResult",
473 "2nd.OnTestPartResult",
474 "3rd.OnTestPartResult",
475 "ListenerTest::TearDown",
482 "ListenerTest::SetUp",
483 "ListenerTest::* Test Body",
484 "1st.OnTestPartResult",
485 "2nd.OnTestPartResult",
486 "3rd.OnTestPartResult",
487 "ListenerTest::TearDown",
491 "ListenerTest::TearDownTestSuite",
492 "3rd.OnTestSuiteEnd",
493 "1st.OnEnvironmentsTearDownStart",
494 "2nd.OnEnvironmentsTearDownStart",
495 "3rd.OnEnvironmentsTearDownStart",
496 "Environment::TearDown",
497 "3rd.OnEnvironmentsTearDownEnd",
498 "2nd.OnEnvironmentsTearDownEnd",
499 "1st.OnEnvironmentsTearDownEnd",
500 "3rd.OnTestIterationEnd(1)",
501 "2nd.OnTestIterationEnd(1)",
502 "1st.OnTestIterationEnd(1)",
503 "3rd.OnTestProgramEnd",
504 "2nd.OnTestProgramEnd",
505 "1st.OnTestProgramEnd"};
506 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
508 VerifyResults(events
,
510 sizeof(expected_events
)/sizeof(expected_events
[0]));
512 // We need to check manually for ad hoc test failures that happen after
513 // RUN_ALL_TESTS finishes.
514 if (UnitTest::GetInstance()->Failed())