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