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
38 #include "gtest/gtest.h"
39 #include "gtest/internal/custom/gtest.h"
41 using ::testing::AddGlobalTestEnvironment;
42 using ::testing::InitGoogleTest;
43 using ::testing::UnitTest;
45 // Used by tests to register their events.
46 std::vector<std::string>* g_events = nullptr;
51 class EventRecordingListener : public TestEventListener {
53 explicit EventRecordingListener(const char* name) : name_(name) {}
56 void OnTestProgramStart(const UnitTest& /*unit_test*/) override {
57 g_events->push_back(GetFullMethodName("OnTestProgramStart"));
60 void OnTestIterationStart(const UnitTest& /*unit_test*/,
61 int iteration) override {
63 message << GetFullMethodName("OnTestIterationStart") << "(" << iteration
65 g_events->push_back(message.GetString());
68 void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {
69 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
72 void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {
73 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
75 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
76 void OnTestCaseStart(const TestCase& /*test_case*/) override {
77 g_events->push_back(GetFullMethodName("OnTestCaseStart"));
79 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
81 void OnTestStart(const TestInfo& /*test_info*/) override {
82 g_events->push_back(GetFullMethodName("OnTestStart"));
85 void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {
86 g_events->push_back(GetFullMethodName("OnTestPartResult"));
89 void OnTestEnd(const TestInfo& /*test_info*/) override {
90 g_events->push_back(GetFullMethodName("OnTestEnd"));
93 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
94 void OnTestCaseEnd(const TestCase& /*test_case*/) override {
95 g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
97 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
99 void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {
100 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
103 void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {
104 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
107 void OnTestIterationEnd(const UnitTest& /*unit_test*/,
108 int iteration) override {
110 message << GetFullMethodName("OnTestIterationEnd") << "(" << iteration
112 g_events->push_back(message.GetString());
115 void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {
116 g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
120 std::string GetFullMethodName(const char* name) { return name_ + "." + name; }
125 // This listener is using OnTestSuiteStart, OnTestSuiteEnd API
126 class EventRecordingListener2 : public TestEventListener {
128 explicit EventRecordingListener2(const char* name) : name_(name) {}
131 void OnTestProgramStart(const UnitTest& /*unit_test*/) override {
132 g_events->push_back(GetFullMethodName("OnTestProgramStart"));
135 void OnTestIterationStart(const UnitTest& /*unit_test*/,
136 int iteration) override {
138 message << GetFullMethodName("OnTestIterationStart") << "(" << iteration
140 g_events->push_back(message.GetString());
143 void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {
144 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
147 void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {
148 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
151 void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {
152 g_events->push_back(GetFullMethodName("OnTestSuiteStart"));
155 void OnTestStart(const TestInfo& /*test_info*/) override {
156 g_events->push_back(GetFullMethodName("OnTestStart"));
159 void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {
160 g_events->push_back(GetFullMethodName("OnTestPartResult"));
163 void OnTestEnd(const TestInfo& /*test_info*/) override {
164 g_events->push_back(GetFullMethodName("OnTestEnd"));
167 void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {
168 g_events->push_back(GetFullMethodName("OnTestSuiteEnd"));
171 void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {
172 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
175 void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {
176 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
179 void OnTestIterationEnd(const UnitTest& /*unit_test*/,
180 int iteration) override {
182 message << GetFullMethodName("OnTestIterationEnd") << "(" << iteration
184 g_events->push_back(message.GetString());
187 void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {
188 g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
192 std::string GetFullMethodName(const char* name) { return name_ + "." + name; }
197 class EnvironmentInvocationCatcher : public Environment {
199 void SetUp() override { g_events->push_back("Environment::SetUp"); }
201 void TearDown() override { g_events->push_back("Environment::TearDown"); }
204 class ListenerTest : public Test {
206 static void SetUpTestSuite() {
207 g_events->push_back("ListenerTest::SetUpTestSuite");
210 static void TearDownTestSuite() {
211 g_events->push_back("ListenerTest::TearDownTestSuite");
214 void SetUp() override { g_events->push_back("ListenerTest::SetUp"); }
216 void TearDown() override { g_events->push_back("ListenerTest::TearDown"); }
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.
226 TEST_F(ListenerTest, DoesBar) {
227 g_events->push_back("ListenerTest::* Test Body");
228 SUCCEED(); // Triggers OnTestPartResult.
231 } // namespace internal
233 } // namespace testing
235 using ::testing::internal::EnvironmentInvocationCatcher;
236 using ::testing::internal::EventRecordingListener;
237 using ::testing::internal::EventRecordingListener2;
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);
247 // Compares the common prefix.
248 const size_t shorter_size =
249 expected_data_size <= actual_size ? expected_data_size : actual_size;
251 for (; i < shorter_size; ++i) {
252 ASSERT_STREQ(expected_data[i], data[i].c_str()) << "at position " << i;
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),
262 int main(int argc, char** argv) {
263 std::vector<std::string> events;
265 InitGoogleTest(&argc, argv);
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"));
274 AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
276 GTEST_CHECK_(events.empty())
277 << "AddGlobalTestEnvironment should not generate any events itself.";
279 GTEST_FLAG_SET(repeat, 2);
280 GTEST_FLAG_SET(recreate_environments_when_repeating, true);
281 int ret_val = RUN_ALL_TESTS();
283 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
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",
306 "ListenerTest::SetUp",
307 "ListenerTest::* Test Body",
308 "1st.OnTestPartResult",
309 "2nd.OnTestPartResult",
310 "3rd.OnTestPartResult",
311 "ListenerTest::TearDown",
318 "ListenerTest::SetUp",
319 "ListenerTest::* Test Body",
320 "1st.OnTestPartResult",
321 "2nd.OnTestPartResult",
322 "3rd.OnTestPartResult",
323 "ListenerTest::TearDown",
327 "ListenerTest::TearDownTestSuite",
328 "3rd.OnTestSuiteEnd",
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",
358 "ListenerTest::SetUp",
359 "ListenerTest::* Test Body",
360 "1st.OnTestPartResult",
361 "2nd.OnTestPartResult",
362 "3rd.OnTestPartResult",
363 "ListenerTest::TearDown",
370 "ListenerTest::SetUp",
371 "ListenerTest::* Test Body",
372 "1st.OnTestPartResult",
373 "2nd.OnTestPartResult",
374 "3rd.OnTestPartResult",
375 "ListenerTest::TearDown",
379 "ListenerTest::TearDownTestSuite",
380 "3rd.OnTestSuiteEnd",
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"};
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",
415 "ListenerTest::SetUp",
416 "ListenerTest::* Test Body",
417 "1st.OnTestPartResult",
418 "2nd.OnTestPartResult",
419 "3rd.OnTestPartResult",
420 "ListenerTest::TearDown",
427 "ListenerTest::SetUp",
428 "ListenerTest::* Test Body",
429 "1st.OnTestPartResult",
430 "2nd.OnTestPartResult",
431 "3rd.OnTestPartResult",
432 "ListenerTest::TearDown",
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",
463 "ListenerTest::SetUp",
464 "ListenerTest::* Test Body",
465 "1st.OnTestPartResult",
466 "2nd.OnTestPartResult",
467 "3rd.OnTestPartResult",
468 "ListenerTest::TearDown",
475 "ListenerTest::SetUp",
476 "ListenerTest::* Test Body",
477 "1st.OnTestPartResult",
478 "2nd.OnTestPartResult",
479 "3rd.OnTestPartResult",
480 "ListenerTest::TearDown",
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_
501 VerifyResults(events, expected_events,
502 sizeof(expected_events) / sizeof(expected_events[0]));
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;