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: 53 explicit EventRecordingListener(const char* name) : name_(name) {} 54 55 protected: 56 void OnTestProgramStart(const UnitTest& /*unit_test*/) override { 57 g_events->push_back(GetFullMethodName("OnTestProgramStart")); 58 } 59 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 68 void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override { 69 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart")); 70 } 71 72 void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override { 73 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd")); 74 } 75 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 76 void OnTestCaseStart(const TestCase& /*test_case*/) override { 77 g_events->push_back(GetFullMethodName("OnTestCaseStart")); 78 } 79 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 80 81 void OnTestStart(const TestInfo& /*test_info*/) override { 82 g_events->push_back(GetFullMethodName("OnTestStart")); 83 } 84 85 void OnTestPartResult(const TestPartResult& /*test_part_result*/) override { 86 g_events->push_back(GetFullMethodName("OnTestPartResult")); 87 } 88 89 void OnTestEnd(const TestInfo& /*test_info*/) override { 90 g_events->push_back(GetFullMethodName("OnTestEnd")); 91 } 92 93 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 94 void OnTestCaseEnd(const TestCase& /*test_case*/) override { 95 g_events->push_back(GetFullMethodName("OnTestCaseEnd")); 96 } 97 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 98 99 void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override { 100 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart")); 101 } 102 103 void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override { 104 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd")); 105 } 106 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 115 void OnTestProgramEnd(const UnitTest& /*unit_test*/) override { 116 g_events->push_back(GetFullMethodName("OnTestProgramEnd")); 117 } 118 119 private: 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: 128 explicit EventRecordingListener2(const char* name) : name_(name) {} 129 130 protected: 131 void OnTestProgramStart(const UnitTest& /*unit_test*/) override { 132 g_events->push_back(GetFullMethodName("OnTestProgramStart")); 133 } 134 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 143 void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override { 144 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart")); 145 } 146 147 void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override { 148 g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd")); 149 } 150 151 void OnTestSuiteStart(const TestSuite& /*test_suite*/) override { 152 g_events->push_back(GetFullMethodName("OnTestSuiteStart")); 153 } 154 155 void OnTestStart(const TestInfo& /*test_info*/) override { 156 g_events->push_back(GetFullMethodName("OnTestStart")); 157 } 158 159 void OnTestPartResult(const TestPartResult& /*test_part_result*/) override { 160 g_events->push_back(GetFullMethodName("OnTestPartResult")); 161 } 162 163 void OnTestEnd(const TestInfo& /*test_info*/) override { 164 g_events->push_back(GetFullMethodName("OnTestEnd")); 165 } 166 167 void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override { 168 g_events->push_back(GetFullMethodName("OnTestSuiteEnd")); 169 } 170 171 void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override { 172 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart")); 173 } 174 175 void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override { 176 g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd")); 177 } 178 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 187 void OnTestProgramEnd(const UnitTest& /*unit_test*/) override { 188 g_events->push_back(GetFullMethodName("OnTestProgramEnd")); 189 } 190 191 private: 192 std::string GetFullMethodName(const char* name) { return name_ + "." + name; } 193 194 std::string name_; 195 }; 196 197 class EnvironmentInvocationCatcher : public Environment { 198 protected: 199 void SetUp() override { g_events->push_back("Environment::SetUp"); } 200 201 void TearDown() override { g_events->push_back("Environment::TearDown"); } 202 }; 203 204 class ListenerTest : public Test { 205 protected: 206 static void SetUpTestSuite() { 207 g_events->push_back("ListenerTest::SetUpTestSuite"); 208 } 209 210 static void TearDownTestSuite() { 211 g_events->push_back("ListenerTest::TearDownTestSuite"); 212 } 213 214 void SetUp() override { g_events->push_back("ListenerTest::SetUp"); } 215 216 void TearDown() override { g_events->push_back("ListenerTest::TearDown"); } 217 }; 218 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 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 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 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