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