1// Copyright 2005, Google Inc. 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: 7// 8// * Redistributions of source code must retain the above copyright 9// notice, this list of conditions and the following disclaimer. 10// * Redistributions in binary form must reproduce the above 11// copyright notice, this list of conditions and the following disclaimer 12// in the documentation and/or other materials provided with the 13// distribution. 14// * Neither the name of Google Inc. nor the names of its 15// contributors may be used to endorse or promote products derived from 16// this software without specific prior written permission. 17// 18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29// 30// A unit test for Google Test itself. This verifies that the basic 31// constructs of Google Test work. 32// 33// Author: wan@google.com (Zhanyong Wan) 34 35#include "gtest/gtest-spi.h" 36#include "gtest/gtest.h" 37 38// Indicates that this translation unit is part of Google Test's 39// implementation. It must come before gtest-internal-inl.h is 40// included, or there will be a compiler error. This trick is to 41// prevent a user from accidentally including gtest-internal-inl.h in 42// his code. 43#define GTEST_IMPLEMENTATION_ 1 44#include "src/gtest-internal-inl.h" 45#undef GTEST_IMPLEMENTATION_ 46 47#include <stdlib.h> 48 49#if GTEST_IS_THREADSAFE 50using testing::ScopedFakeTestPartResultReporter; 51using testing::TestPartResultArray; 52 53using testing::internal::Notification; 54using testing::internal::ThreadWithParam; 55#endif 56 57namespace posix = ::testing::internal::posix; 58using testing::internal::String; 59using testing::internal::scoped_ptr; 60 61// Tests catching fatal failures. 62 63// A subroutine used by the following test. 64void TestEq1(int x) { 65 ASSERT_EQ(1, x); 66} 67 68// This function calls a test subroutine, catches the fatal failure it 69// generates, and then returns early. 70void TryTestSubroutine() { 71 // Calls a subrountine that yields a fatal failure. 72 TestEq1(2); 73 74 // Catches the fatal failure and aborts the test. 75 // 76 // The testing::Test:: prefix is necessary when calling 77 // HasFatalFailure() outside of a TEST, TEST_F, or test fixture. 78 if (testing::Test::HasFatalFailure()) return; 79 80 // If we get here, something is wrong. 81 FAIL() << "This should never be reached."; 82} 83 84TEST(PassingTest, PassingTest1) { 85} 86 87TEST(PassingTest, PassingTest2) { 88} 89 90// Tests that parameters of failing parameterized tests are printed in the 91// failing test summary. 92class FailingParamTest : public testing::TestWithParam<int> {}; 93 94TEST_P(FailingParamTest, Fails) { 95 EXPECT_EQ(1, GetParam()); 96} 97 98// This generates a test which will fail. Google Test is expected to print 99// its parameter when it outputs the list of all failed tests. 100INSTANTIATE_TEST_CASE_P(PrintingFailingParams, 101 FailingParamTest, 102 testing::Values(2)); 103 104// Tests catching a fatal failure in a subroutine. 105TEST(FatalFailureTest, FatalFailureInSubroutine) { 106 printf("(expecting a failure that x should be 1)\n"); 107 108 TryTestSubroutine(); 109} 110 111// Tests catching a fatal failure in a nested subroutine. 112TEST(FatalFailureTest, FatalFailureInNestedSubroutine) { 113 printf("(expecting a failure that x should be 1)\n"); 114 115 // Calls a subrountine that yields a fatal failure. 116 TryTestSubroutine(); 117 118 // Catches the fatal failure and aborts the test. 119 // 120 // When calling HasFatalFailure() inside a TEST, TEST_F, or test 121 // fixture, the testing::Test:: prefix is not needed. 122 if (HasFatalFailure()) return; 123 124 // If we get here, something is wrong. 125 FAIL() << "This should never be reached."; 126} 127 128// Tests HasFatalFailure() after a failed EXPECT check. 129TEST(FatalFailureTest, NonfatalFailureInSubroutine) { 130 printf("(expecting a failure on false)\n"); 131 EXPECT_TRUE(false); // Generates a nonfatal failure 132 ASSERT_FALSE(HasFatalFailure()); // This should succeed. 133} 134 135// Tests interleaving user logging and Google Test assertions. 136TEST(LoggingTest, InterleavingLoggingAndAssertions) { 137 static const int a[4] = { 138 3, 9, 2, 6 139 }; 140 141 printf("(expecting 2 failures on (3) >= (a[i]))\n"); 142 for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) { 143 printf("i == %d\n", i); 144 EXPECT_GE(3, a[i]); 145 } 146} 147 148// Tests the SCOPED_TRACE macro. 149 150// A helper function for testing SCOPED_TRACE. 151void SubWithoutTrace(int n) { 152 EXPECT_EQ(1, n); 153 ASSERT_EQ(2, n); 154} 155 156// Another helper function for testing SCOPED_TRACE. 157void SubWithTrace(int n) { 158 SCOPED_TRACE(testing::Message() << "n = " << n); 159 160 SubWithoutTrace(n); 161} 162 163// Tests that SCOPED_TRACE() obeys lexical scopes. 164TEST(SCOPED_TRACETest, ObeysScopes) { 165 printf("(expected to fail)\n"); 166 167 // There should be no trace before SCOPED_TRACE() is invoked. 168 ADD_FAILURE() << "This failure is expected, and shouldn't have a trace."; 169 170 { 171 SCOPED_TRACE("Expected trace"); 172 // After SCOPED_TRACE(), a failure in the current scope should contain 173 // the trace. 174 ADD_FAILURE() << "This failure is expected, and should have a trace."; 175 } 176 177 // Once the control leaves the scope of the SCOPED_TRACE(), there 178 // should be no trace again. 179 ADD_FAILURE() << "This failure is expected, and shouldn't have a trace."; 180} 181 182// Tests that SCOPED_TRACE works inside a loop. 183TEST(SCOPED_TRACETest, WorksInLoop) { 184 printf("(expected to fail)\n"); 185 186 for (int i = 1; i <= 2; i++) { 187 SCOPED_TRACE(testing::Message() << "i = " << i); 188 189 SubWithoutTrace(i); 190 } 191} 192 193// Tests that SCOPED_TRACE works in a subroutine. 194TEST(SCOPED_TRACETest, WorksInSubroutine) { 195 printf("(expected to fail)\n"); 196 197 SubWithTrace(1); 198 SubWithTrace(2); 199} 200 201// Tests that SCOPED_TRACE can be nested. 202TEST(SCOPED_TRACETest, CanBeNested) { 203 printf("(expected to fail)\n"); 204 205 SCOPED_TRACE(""); // A trace without a message. 206 207 SubWithTrace(2); 208} 209 210// Tests that multiple SCOPED_TRACEs can be used in the same scope. 211TEST(SCOPED_TRACETest, CanBeRepeated) { 212 printf("(expected to fail)\n"); 213 214 SCOPED_TRACE("A"); 215 ADD_FAILURE() 216 << "This failure is expected, and should contain trace point A."; 217 218 SCOPED_TRACE("B"); 219 ADD_FAILURE() 220 << "This failure is expected, and should contain trace point A and B."; 221 222 { 223 SCOPED_TRACE("C"); 224 ADD_FAILURE() << "This failure is expected, and should contain " 225 << "trace point A, B, and C."; 226 } 227 228 SCOPED_TRACE("D"); 229 ADD_FAILURE() << "This failure is expected, and should contain " 230 << "trace point A, B, and D."; 231} 232 233#if GTEST_IS_THREADSAFE 234// Tests that SCOPED_TRACE()s can be used concurrently from multiple 235// threads. Namely, an assertion should be affected by 236// SCOPED_TRACE()s in its own thread only. 237 238// Here's the sequence of actions that happen in the test: 239// 240// Thread A (main) | Thread B (spawned) 241// ===============================|================================ 242// spawns thread B | 243// -------------------------------+-------------------------------- 244// waits for n1 | SCOPED_TRACE("Trace B"); 245// | generates failure #1 246// | notifies n1 247// -------------------------------+-------------------------------- 248// SCOPED_TRACE("Trace A"); | waits for n2 249// generates failure #2 | 250// notifies n2 | 251// -------------------------------|-------------------------------- 252// waits for n3 | generates failure #3 253// | trace B dies 254// | generates failure #4 255// | notifies n3 256// -------------------------------|-------------------------------- 257// generates failure #5 | finishes 258// trace A dies | 259// generates failure #6 | 260// -------------------------------|-------------------------------- 261// waits for thread B to finish | 262 263struct CheckPoints { 264 Notification n1; 265 Notification n2; 266 Notification n3; 267}; 268 269static void ThreadWithScopedTrace(CheckPoints* check_points) { 270 { 271 SCOPED_TRACE("Trace B"); 272 ADD_FAILURE() 273 << "Expected failure #1 (in thread B, only trace B alive)."; 274 check_points->n1.Notify(); 275 check_points->n2.WaitForNotification(); 276 277 ADD_FAILURE() 278 << "Expected failure #3 (in thread B, trace A & B both alive)."; 279 } // Trace B dies here. 280 ADD_FAILURE() 281 << "Expected failure #4 (in thread B, only trace A alive)."; 282 check_points->n3.Notify(); 283} 284 285TEST(SCOPED_TRACETest, WorksConcurrently) { 286 printf("(expecting 6 failures)\n"); 287 288 CheckPoints check_points; 289 ThreadWithParam<CheckPoints*> thread(&ThreadWithScopedTrace, 290 &check_points, 291 NULL); 292 check_points.n1.WaitForNotification(); 293 294 { 295 SCOPED_TRACE("Trace A"); 296 ADD_FAILURE() 297 << "Expected failure #2 (in thread A, trace A & B both alive)."; 298 check_points.n2.Notify(); 299 check_points.n3.WaitForNotification(); 300 301 ADD_FAILURE() 302 << "Expected failure #5 (in thread A, only trace A alive)."; 303 } // Trace A dies here. 304 ADD_FAILURE() 305 << "Expected failure #6 (in thread A, no trace alive)."; 306 thread.Join(); 307} 308#endif // GTEST_IS_THREADSAFE 309 310TEST(DisabledTestsWarningTest, 311 DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) { 312 // This test body is intentionally empty. Its sole purpose is for 313 // verifying that the --gtest_also_run_disabled_tests flag 314 // suppresses the "YOU HAVE 12 DISABLED TESTS" warning at the end of 315 // the test output. 316} 317 318// Tests using assertions outside of TEST and TEST_F. 319// 320// This function creates two failures intentionally. 321void AdHocTest() { 322 printf("The non-test part of the code is expected to have 2 failures.\n\n"); 323 EXPECT_TRUE(false); 324 EXPECT_EQ(2, 3); 325} 326 327// Runs all TESTs, all TEST_Fs, and the ad hoc test. 328int RunAllTests() { 329 AdHocTest(); 330 return RUN_ALL_TESTS(); 331} 332 333// Tests non-fatal failures in the fixture constructor. 334class NonFatalFailureInFixtureConstructorTest : public testing::Test { 335 protected: 336 NonFatalFailureInFixtureConstructorTest() { 337 printf("(expecting 5 failures)\n"); 338 ADD_FAILURE() << "Expected failure #1, in the test fixture c'tor."; 339 } 340 341 ~NonFatalFailureInFixtureConstructorTest() { 342 ADD_FAILURE() << "Expected failure #5, in the test fixture d'tor."; 343 } 344 345 virtual void SetUp() { 346 ADD_FAILURE() << "Expected failure #2, in SetUp()."; 347 } 348 349 virtual void TearDown() { 350 ADD_FAILURE() << "Expected failure #4, in TearDown."; 351 } 352}; 353 354TEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) { 355 ADD_FAILURE() << "Expected failure #3, in the test body."; 356} 357 358// Tests fatal failures in the fixture constructor. 359class FatalFailureInFixtureConstructorTest : public testing::Test { 360 protected: 361 FatalFailureInFixtureConstructorTest() { 362 printf("(expecting 2 failures)\n"); 363 Init(); 364 } 365 366 ~FatalFailureInFixtureConstructorTest() { 367 ADD_FAILURE() << "Expected failure #2, in the test fixture d'tor."; 368 } 369 370 virtual void SetUp() { 371 ADD_FAILURE() << "UNEXPECTED failure in SetUp(). " 372 << "We should never get here, as the test fixture c'tor " 373 << "had a fatal failure."; 374 } 375 376 virtual void TearDown() { 377 ADD_FAILURE() << "UNEXPECTED failure in TearDown(). " 378 << "We should never get here, as the test fixture c'tor " 379 << "had a fatal failure."; 380 } 381 private: 382 void Init() { 383 FAIL() << "Expected failure #1, in the test fixture c'tor."; 384 } 385}; 386 387TEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) { 388 ADD_FAILURE() << "UNEXPECTED failure in the test body. " 389 << "We should never get here, as the test fixture c'tor " 390 << "had a fatal failure."; 391} 392 393// Tests non-fatal failures in SetUp(). 394class NonFatalFailureInSetUpTest : public testing::Test { 395 protected: 396 virtual ~NonFatalFailureInSetUpTest() { 397 Deinit(); 398 } 399 400 virtual void SetUp() { 401 printf("(expecting 4 failures)\n"); 402 ADD_FAILURE() << "Expected failure #1, in SetUp()."; 403 } 404 405 virtual void TearDown() { 406 FAIL() << "Expected failure #3, in TearDown()."; 407 } 408 private: 409 void Deinit() { 410 FAIL() << "Expected failure #4, in the test fixture d'tor."; 411 } 412}; 413 414TEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) { 415 FAIL() << "Expected failure #2, in the test function."; 416} 417 418// Tests fatal failures in SetUp(). 419class FatalFailureInSetUpTest : public testing::Test { 420 protected: 421 virtual ~FatalFailureInSetUpTest() { 422 Deinit(); 423 } 424 425 virtual void SetUp() { 426 printf("(expecting 3 failures)\n"); 427 FAIL() << "Expected failure #1, in SetUp()."; 428 } 429 430 virtual void TearDown() { 431 FAIL() << "Expected failure #2, in TearDown()."; 432 } 433 private: 434 void Deinit() { 435 FAIL() << "Expected failure #3, in the test fixture d'tor."; 436 } 437}; 438 439TEST_F(FatalFailureInSetUpTest, FailureInSetUp) { 440 FAIL() << "UNEXPECTED failure in the test function. " 441 << "We should never get here, as SetUp() failed."; 442} 443 444TEST(AddFailureAtTest, MessageContainsSpecifiedFileAndLineNumber) { 445 ADD_FAILURE_AT("foo.cc", 42) << "Expected failure in foo.cc"; 446} 447 448#if GTEST_IS_THREADSAFE 449 450// A unary function that may die. 451void DieIf(bool should_die) { 452 GTEST_CHECK_(!should_die) << " - death inside DieIf()."; 453} 454 455// Tests running death tests in a multi-threaded context. 456 457// Used for coordination between the main and the spawn thread. 458struct SpawnThreadNotifications { 459 SpawnThreadNotifications() {} 460 461 Notification spawn_thread_started; 462 Notification spawn_thread_ok_to_terminate; 463 464 private: 465 GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications); 466}; 467 468// The function to be executed in the thread spawn by the 469// MultipleThreads test (below). 470static void ThreadRoutine(SpawnThreadNotifications* notifications) { 471 // Signals the main thread that this thread has started. 472 notifications->spawn_thread_started.Notify(); 473 474 // Waits for permission to finish from the main thread. 475 notifications->spawn_thread_ok_to_terminate.WaitForNotification(); 476} 477 478// This is a death-test test, but it's not named with a DeathTest 479// suffix. It starts threads which might interfere with later 480// death tests, so it must run after all other death tests. 481class DeathTestAndMultiThreadsTest : public testing::Test { 482 protected: 483 // Starts a thread and waits for it to begin. 484 virtual void SetUp() { 485 thread_.reset(new ThreadWithParam<SpawnThreadNotifications*>( 486 &ThreadRoutine, ¬ifications_, NULL)); 487 notifications_.spawn_thread_started.WaitForNotification(); 488 } 489 // Tells the thread to finish, and reaps it. 490 // Depending on the version of the thread library in use, 491 // a manager thread might still be left running that will interfere 492 // with later death tests. This is unfortunate, but this class 493 // cleans up after itself as best it can. 494 virtual void TearDown() { 495 notifications_.spawn_thread_ok_to_terminate.Notify(); 496 } 497 498 private: 499 SpawnThreadNotifications notifications_; 500 scoped_ptr<ThreadWithParam<SpawnThreadNotifications*> > thread_; 501}; 502 503#endif // GTEST_IS_THREADSAFE 504 505// The MixedUpTestCaseTest test case verifies that Google Test will fail a 506// test if it uses a different fixture class than what other tests in 507// the same test case use. It deliberately contains two fixture 508// classes with the same name but defined in different namespaces. 509 510// The MixedUpTestCaseWithSameTestNameTest test case verifies that 511// when the user defines two tests with the same test case name AND 512// same test name (but in different namespaces), the second test will 513// fail. 514 515namespace foo { 516 517class MixedUpTestCaseTest : public testing::Test { 518}; 519 520TEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {} 521TEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {} 522 523class MixedUpTestCaseWithSameTestNameTest : public testing::Test { 524}; 525 526TEST_F(MixedUpTestCaseWithSameTestNameTest, 527 TheSecondTestWithThisNameShouldFail) {} 528 529} // namespace foo 530 531namespace bar { 532 533class MixedUpTestCaseTest : public testing::Test { 534}; 535 536// The following two tests are expected to fail. We rely on the 537// golden file to check that Google Test generates the right error message. 538TEST_F(MixedUpTestCaseTest, ThisShouldFail) {} 539TEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {} 540 541class MixedUpTestCaseWithSameTestNameTest : public testing::Test { 542}; 543 544// Expected to fail. We rely on the golden file to check that Google Test 545// generates the right error message. 546TEST_F(MixedUpTestCaseWithSameTestNameTest, 547 TheSecondTestWithThisNameShouldFail) {} 548 549} // namespace bar 550 551// The following two test cases verify that Google Test catches the user 552// error of mixing TEST and TEST_F in the same test case. The first 553// test case checks the scenario where TEST_F appears before TEST, and 554// the second one checks where TEST appears before TEST_F. 555 556class TEST_F_before_TEST_in_same_test_case : public testing::Test { 557}; 558 559TEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {} 560 561// Expected to fail. We rely on the golden file to check that Google Test 562// generates the right error message. 563TEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {} 564 565class TEST_before_TEST_F_in_same_test_case : public testing::Test { 566}; 567 568TEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {} 569 570// Expected to fail. We rely on the golden file to check that Google Test 571// generates the right error message. 572TEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) { 573} 574 575// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE(). 576int global_integer = 0; 577 578// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables. 579TEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) { 580 global_integer = 0; 581 EXPECT_NONFATAL_FAILURE({ 582 EXPECT_EQ(1, global_integer) << "Expected non-fatal failure."; 583 }, "Expected non-fatal failure."); 584} 585 586// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables 587// (static or not). 588TEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) { 589 int m = 0; 590 static int n; 591 n = 1; 592 EXPECT_NONFATAL_FAILURE({ 593 EXPECT_EQ(m, n) << "Expected non-fatal failure."; 594 }, "Expected non-fatal failure."); 595} 596 597// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly 598// one non-fatal failure and no fatal failure. 599TEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) { 600 EXPECT_NONFATAL_FAILURE({ 601 ADD_FAILURE() << "Expected non-fatal failure."; 602 }, "Expected non-fatal failure."); 603} 604 605// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no 606// non-fatal failure. 607TEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) { 608 printf("(expecting a failure)\n"); 609 EXPECT_NONFATAL_FAILURE({ 610 }, ""); 611} 612 613// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two 614// non-fatal failures. 615TEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) { 616 printf("(expecting a failure)\n"); 617 EXPECT_NONFATAL_FAILURE({ 618 ADD_FAILURE() << "Expected non-fatal failure 1."; 619 ADD_FAILURE() << "Expected non-fatal failure 2."; 620 }, ""); 621} 622 623// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal 624// failure. 625TEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) { 626 printf("(expecting a failure)\n"); 627 EXPECT_NONFATAL_FAILURE({ 628 FAIL() << "Expected fatal failure."; 629 }, ""); 630} 631 632// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being 633// tested returns. 634TEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) { 635 printf("(expecting a failure)\n"); 636 EXPECT_NONFATAL_FAILURE({ 637 return; 638 }, ""); 639} 640 641#if GTEST_HAS_EXCEPTIONS 642 643// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being 644// tested throws. 645TEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) { 646 printf("(expecting a failure)\n"); 647 try { 648 EXPECT_NONFATAL_FAILURE({ 649 throw 0; 650 }, ""); 651 } catch(int) { // NOLINT 652 } 653} 654 655#endif // GTEST_HAS_EXCEPTIONS 656 657// Tests that EXPECT_FATAL_FAILURE() can reference global variables. 658TEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) { 659 global_integer = 0; 660 EXPECT_FATAL_FAILURE({ 661 ASSERT_EQ(1, global_integer) << "Expected fatal failure."; 662 }, "Expected fatal failure."); 663} 664 665// Tests that EXPECT_FATAL_FAILURE() can reference local static 666// variables. 667TEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) { 668 static int n; 669 n = 1; 670 EXPECT_FATAL_FAILURE({ 671 ASSERT_EQ(0, n) << "Expected fatal failure."; 672 }, "Expected fatal failure."); 673} 674 675// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly 676// one fatal failure and no non-fatal failure. 677TEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) { 678 EXPECT_FATAL_FAILURE({ 679 FAIL() << "Expected fatal failure."; 680 }, "Expected fatal failure."); 681} 682 683// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal 684// failure. 685TEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) { 686 printf("(expecting a failure)\n"); 687 EXPECT_FATAL_FAILURE({ 688 }, ""); 689} 690 691// A helper for generating a fatal failure. 692void FatalFailure() { 693 FAIL() << "Expected fatal failure."; 694} 695 696// Tests that EXPECT_FATAL_FAILURE() fails when there are two 697// fatal failures. 698TEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) { 699 printf("(expecting a failure)\n"); 700 EXPECT_FATAL_FAILURE({ 701 FatalFailure(); 702 FatalFailure(); 703 }, ""); 704} 705 706// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal 707// failure. 708TEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) { 709 printf("(expecting a failure)\n"); 710 EXPECT_FATAL_FAILURE({ 711 ADD_FAILURE() << "Expected non-fatal failure."; 712 }, ""); 713} 714 715// Tests that EXPECT_FATAL_FAILURE() fails when the statement being 716// tested returns. 717TEST(ExpectFatalFailureTest, FailsWhenStatementReturns) { 718 printf("(expecting a failure)\n"); 719 EXPECT_FATAL_FAILURE({ 720 return; 721 }, ""); 722} 723 724#if GTEST_HAS_EXCEPTIONS 725 726// Tests that EXPECT_FATAL_FAILURE() fails when the statement being 727// tested throws. 728TEST(ExpectFatalFailureTest, FailsWhenStatementThrows) { 729 printf("(expecting a failure)\n"); 730 try { 731 EXPECT_FATAL_FAILURE({ 732 throw 0; 733 }, ""); 734 } catch(int) { // NOLINT 735 } 736} 737 738#endif // GTEST_HAS_EXCEPTIONS 739 740// This #ifdef block tests the output of typed tests. 741#if GTEST_HAS_TYPED_TEST 742 743template <typename T> 744class TypedTest : public testing::Test { 745}; 746 747TYPED_TEST_CASE(TypedTest, testing::Types<int>); 748 749TYPED_TEST(TypedTest, Success) { 750 EXPECT_EQ(0, TypeParam()); 751} 752 753TYPED_TEST(TypedTest, Failure) { 754 EXPECT_EQ(1, TypeParam()) << "Expected failure"; 755} 756 757#endif // GTEST_HAS_TYPED_TEST 758 759// This #ifdef block tests the output of type-parameterized tests. 760#if GTEST_HAS_TYPED_TEST_P 761 762template <typename T> 763class TypedTestP : public testing::Test { 764}; 765 766TYPED_TEST_CASE_P(TypedTestP); 767 768TYPED_TEST_P(TypedTestP, Success) { 769 EXPECT_EQ(0U, TypeParam()); 770} 771 772TYPED_TEST_P(TypedTestP, Failure) { 773 EXPECT_EQ(1U, TypeParam()) << "Expected failure"; 774} 775 776REGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure); 777 778typedef testing::Types<unsigned char, unsigned int> UnsignedTypes; 779INSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes); 780 781#endif // GTEST_HAS_TYPED_TEST_P 782 783#if GTEST_HAS_DEATH_TEST 784 785// We rely on the golden file to verify that tests whose test case 786// name ends with DeathTest are run first. 787 788TEST(ADeathTest, ShouldRunFirst) { 789} 790 791# if GTEST_HAS_TYPED_TEST 792 793// We rely on the golden file to verify that typed tests whose test 794// case name ends with DeathTest are run first. 795 796template <typename T> 797class ATypedDeathTest : public testing::Test { 798}; 799 800typedef testing::Types<int, double> NumericTypes; 801TYPED_TEST_CASE(ATypedDeathTest, NumericTypes); 802 803TYPED_TEST(ATypedDeathTest, ShouldRunFirst) { 804} 805 806# endif // GTEST_HAS_TYPED_TEST 807 808# if GTEST_HAS_TYPED_TEST_P 809 810 811// We rely on the golden file to verify that type-parameterized tests 812// whose test case name ends with DeathTest are run first. 813 814template <typename T> 815class ATypeParamDeathTest : public testing::Test { 816}; 817 818TYPED_TEST_CASE_P(ATypeParamDeathTest); 819 820TYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) { 821} 822 823REGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst); 824 825INSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes); 826 827# endif // GTEST_HAS_TYPED_TEST_P 828 829#endif // GTEST_HAS_DEATH_TEST 830 831// Tests various failure conditions of 832// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}. 833class ExpectFailureTest : public testing::Test { 834 public: // Must be public and not protected due to a bug in g++ 3.4.2. 835 enum FailureMode { 836 FATAL_FAILURE, 837 NONFATAL_FAILURE 838 }; 839 static void AddFailure(FailureMode failure) { 840 if (failure == FATAL_FAILURE) { 841 FAIL() << "Expected fatal failure."; 842 } else { 843 ADD_FAILURE() << "Expected non-fatal failure."; 844 } 845 } 846}; 847 848TEST_F(ExpectFailureTest, ExpectFatalFailure) { 849 // Expected fatal failure, but succeeds. 850 printf("(expecting 1 failure)\n"); 851 EXPECT_FATAL_FAILURE(SUCCEED(), "Expected fatal failure."); 852 // Expected fatal failure, but got a non-fatal failure. 853 printf("(expecting 1 failure)\n"); 854 EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Expected non-fatal " 855 "failure."); 856 // Wrong message. 857 printf("(expecting 1 failure)\n"); 858 EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Some other fatal failure " 859 "expected."); 860} 861 862TEST_F(ExpectFailureTest, ExpectNonFatalFailure) { 863 // Expected non-fatal failure, but succeeds. 864 printf("(expecting 1 failure)\n"); 865 EXPECT_NONFATAL_FAILURE(SUCCEED(), "Expected non-fatal failure."); 866 // Expected non-fatal failure, but got a fatal failure. 867 printf("(expecting 1 failure)\n"); 868 EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure."); 869 // Wrong message. 870 printf("(expecting 1 failure)\n"); 871 EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Some other non-fatal " 872 "failure."); 873} 874 875#if GTEST_IS_THREADSAFE 876 877class ExpectFailureWithThreadsTest : public ExpectFailureTest { 878 protected: 879 static void AddFailureInOtherThread(FailureMode failure) { 880 ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL); 881 thread.Join(); 882 } 883}; 884 885TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) { 886 // We only intercept the current thread. 887 printf("(expecting 2 failures)\n"); 888 EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE), 889 "Expected fatal failure."); 890} 891 892TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) { 893 // We only intercept the current thread. 894 printf("(expecting 2 failures)\n"); 895 EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE), 896 "Expected non-fatal failure."); 897} 898 899typedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest; 900 901// Tests that the ScopedFakeTestPartResultReporter only catches failures from 902// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD. 903TEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) { 904 printf("(expecting 2 failures)\n"); 905 TestPartResultArray results; 906 { 907 ScopedFakeTestPartResultReporter reporter( 908 ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD, 909 &results); 910 AddFailureInOtherThread(FATAL_FAILURE); 911 AddFailureInOtherThread(NONFATAL_FAILURE); 912 } 913 // The two failures should not have been intercepted. 914 EXPECT_EQ(0, results.size()) << "This shouldn't fail."; 915} 916 917#endif // GTEST_IS_THREADSAFE 918 919TEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) { 920 // Expected fatal failure, but succeeds. 921 printf("(expecting 1 failure)\n"); 922 EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected fatal failure."); 923 // Expected fatal failure, but got a non-fatal failure. 924 printf("(expecting 1 failure)\n"); 925 EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE), 926 "Expected non-fatal failure."); 927 // Wrong message. 928 printf("(expecting 1 failure)\n"); 929 EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE), 930 "Some other fatal failure expected."); 931} 932 933TEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) { 934 // Expected non-fatal failure, but succeeds. 935 printf("(expecting 1 failure)\n"); 936 EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected non-fatal " 937 "failure."); 938 // Expected non-fatal failure, but got a fatal failure. 939 printf("(expecting 1 failure)\n"); 940 EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE), 941 "Expected fatal failure."); 942 // Wrong message. 943 printf("(expecting 1 failure)\n"); 944 EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE), 945 "Some other non-fatal failure."); 946} 947 948 949// Two test environments for testing testing::AddGlobalTestEnvironment(). 950 951class FooEnvironment : public testing::Environment { 952 public: 953 virtual void SetUp() { 954 printf("%s", "FooEnvironment::SetUp() called.\n"); 955 } 956 957 virtual void TearDown() { 958 printf("%s", "FooEnvironment::TearDown() called.\n"); 959 FAIL() << "Expected fatal failure."; 960 } 961}; 962 963class BarEnvironment : public testing::Environment { 964 public: 965 virtual void SetUp() { 966 printf("%s", "BarEnvironment::SetUp() called.\n"); 967 } 968 969 virtual void TearDown() { 970 printf("%s", "BarEnvironment::TearDown() called.\n"); 971 ADD_FAILURE() << "Expected non-fatal failure."; 972 } 973}; 974 975bool GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = false; 976 977// The main function. 978// 979// The idea is to use Google Test to run all the tests we have defined (some 980// of them are intended to fail), and then compare the test results 981// with the "golden" file. 982int main(int argc, char **argv) { 983 testing::GTEST_FLAG(print_time) = false; 984 985 // We just run the tests, knowing some of them are intended to fail. 986 // We will use a separate Python script to compare the output of 987 // this program with the golden file. 988 989 // It's hard to test InitGoogleTest() directly, as it has many 990 // global side effects. The following line serves as a sanity test 991 // for it. 992 testing::InitGoogleTest(&argc, argv); 993 if (argc >= 2 && 994 String(argv[1]) == "--gtest_internal_skip_environment_and_ad_hoc_tests") 995 GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true; 996 997#if GTEST_HAS_DEATH_TEST 998 if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") { 999 // Skip the usual output capturing if we're running as the child 1000 // process of an threadsafe-style death test. 1001# if GTEST_OS_WINDOWS 1002 posix::FReopen("nul:", "w", stdout); 1003# else 1004 posix::FReopen("/dev/null", "w", stdout); 1005# endif // GTEST_OS_WINDOWS 1006 return RUN_ALL_TESTS(); 1007 } 1008#endif // GTEST_HAS_DEATH_TEST 1009 1010 if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests)) 1011 return RUN_ALL_TESTS(); 1012 1013 // Registers two global test environments. 1014 // The golden file verifies that they are set up in the order they 1015 // are registered, and torn down in the reverse order. 1016 testing::AddGlobalTestEnvironment(new FooEnvironment); 1017 testing::AddGlobalTestEnvironment(new BarEnvironment); 1018 1019 return RunAllTests(); 1020} 1021