113481Sgiacomo.travaglini@arm.com// Copyright 2005, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// The purpose of this file is to generate Google Test output under
3113481Sgiacomo.travaglini@arm.com// various conditions.  The output will then be verified by
3213481Sgiacomo.travaglini@arm.com// gtest_output_test.py to ensure that Google Test generates the
3313481Sgiacomo.travaglini@arm.com// desired messages.  Therefore, most tests in this file are MEANT TO
3413481Sgiacomo.travaglini@arm.com// FAIL.
3513481Sgiacomo.travaglini@arm.com//
3613481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h"
3913481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
4013481Sgiacomo.travaglini@arm.com
4113481Sgiacomo.travaglini@arm.com// Indicates that this translation unit is part of Google Test's
4213481Sgiacomo.travaglini@arm.com// implementation.  It must come before gtest-internal-inl.h is
4313481Sgiacomo.travaglini@arm.com// included, or there will be a compiler error.  This trick is to
4413481Sgiacomo.travaglini@arm.com// prevent a user from accidentally including gtest-internal-inl.h in
4513481Sgiacomo.travaglini@arm.com// his code.
4613481Sgiacomo.travaglini@arm.com#define GTEST_IMPLEMENTATION_ 1
4713481Sgiacomo.travaglini@arm.com#include "src/gtest-internal-inl.h"
4813481Sgiacomo.travaglini@arm.com#undef GTEST_IMPLEMENTATION_
4913481Sgiacomo.travaglini@arm.com
5013481Sgiacomo.travaglini@arm.com#include <stdlib.h>
5113481Sgiacomo.travaglini@arm.com
5213481Sgiacomo.travaglini@arm.com#if GTEST_IS_THREADSAFE
5313481Sgiacomo.travaglini@arm.comusing testing::ScopedFakeTestPartResultReporter;
5413481Sgiacomo.travaglini@arm.comusing testing::TestPartResultArray;
5513481Sgiacomo.travaglini@arm.com
5613481Sgiacomo.travaglini@arm.comusing testing::internal::Notification;
5713481Sgiacomo.travaglini@arm.comusing testing::internal::ThreadWithParam;
5813481Sgiacomo.travaglini@arm.com#endif
5913481Sgiacomo.travaglini@arm.com
6013481Sgiacomo.travaglini@arm.comnamespace posix = ::testing::internal::posix;
6113481Sgiacomo.travaglini@arm.com
6213481Sgiacomo.travaglini@arm.com// Tests catching fatal failures.
6313481Sgiacomo.travaglini@arm.com
6413481Sgiacomo.travaglini@arm.com// A subroutine used by the following test.
6513481Sgiacomo.travaglini@arm.comvoid TestEq1(int x) {
6613481Sgiacomo.travaglini@arm.com  ASSERT_EQ(1, x);
6713481Sgiacomo.travaglini@arm.com}
6813481Sgiacomo.travaglini@arm.com
6913481Sgiacomo.travaglini@arm.com// This function calls a test subroutine, catches the fatal failure it
7013481Sgiacomo.travaglini@arm.com// generates, and then returns early.
7113481Sgiacomo.travaglini@arm.comvoid TryTestSubroutine() {
7213481Sgiacomo.travaglini@arm.com  // Calls a subrountine that yields a fatal failure.
7313481Sgiacomo.travaglini@arm.com  TestEq1(2);
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.com  // Catches the fatal failure and aborts the test.
7613481Sgiacomo.travaglini@arm.com  //
7713481Sgiacomo.travaglini@arm.com  // The testing::Test:: prefix is necessary when calling
7813481Sgiacomo.travaglini@arm.com  // HasFatalFailure() outside of a TEST, TEST_F, or test fixture.
7913481Sgiacomo.travaglini@arm.com  if (testing::Test::HasFatalFailure()) return;
8013481Sgiacomo.travaglini@arm.com
8113481Sgiacomo.travaglini@arm.com  // If we get here, something is wrong.
8213481Sgiacomo.travaglini@arm.com  FAIL() << "This should never be reached.";
8313481Sgiacomo.travaglini@arm.com}
8413481Sgiacomo.travaglini@arm.com
8513481Sgiacomo.travaglini@arm.comTEST(PassingTest, PassingTest1) {
8613481Sgiacomo.travaglini@arm.com}
8713481Sgiacomo.travaglini@arm.com
8813481Sgiacomo.travaglini@arm.comTEST(PassingTest, PassingTest2) {
8913481Sgiacomo.travaglini@arm.com}
9013481Sgiacomo.travaglini@arm.com
9113481Sgiacomo.travaglini@arm.com// Tests that parameters of failing parameterized tests are printed in the
9213481Sgiacomo.travaglini@arm.com// failing test summary.
9313481Sgiacomo.travaglini@arm.comclass FailingParamTest : public testing::TestWithParam<int> {};
9413481Sgiacomo.travaglini@arm.com
9513481Sgiacomo.travaglini@arm.comTEST_P(FailingParamTest, Fails) {
9613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, GetParam());
9713481Sgiacomo.travaglini@arm.com}
9813481Sgiacomo.travaglini@arm.com
9913481Sgiacomo.travaglini@arm.com// This generates a test which will fail. Google Test is expected to print
10013481Sgiacomo.travaglini@arm.com// its parameter when it outputs the list of all failed tests.
10113481Sgiacomo.travaglini@arm.comINSTANTIATE_TEST_CASE_P(PrintingFailingParams,
10213481Sgiacomo.travaglini@arm.com                        FailingParamTest,
10313481Sgiacomo.travaglini@arm.com                        testing::Values(2));
10413481Sgiacomo.travaglini@arm.com
10513481Sgiacomo.travaglini@arm.comstatic const char kGoldenString[] = "\"Line\0 1\"\nLine 2";
10613481Sgiacomo.travaglini@arm.com
10713481Sgiacomo.travaglini@arm.comTEST(NonfatalFailureTest, EscapesStringOperands) {
10813481Sgiacomo.travaglini@arm.com  std::string actual = "actual \"string\"";
10913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(kGoldenString, actual);
11013481Sgiacomo.travaglini@arm.com
11113481Sgiacomo.travaglini@arm.com  const char* golden = kGoldenString;
11213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(golden, actual);
11313481Sgiacomo.travaglini@arm.com}
11413481Sgiacomo.travaglini@arm.com
11513481Sgiacomo.travaglini@arm.comTEST(NonfatalFailureTest, DiffForLongStrings) {
11613481Sgiacomo.travaglini@arm.com  std::string golden_str(kGoldenString, sizeof(kGoldenString) - 1);
11713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(golden_str, "Line 2");
11813481Sgiacomo.travaglini@arm.com}
11913481Sgiacomo.travaglini@arm.com
12013481Sgiacomo.travaglini@arm.com// Tests catching a fatal failure in a subroutine.
12113481Sgiacomo.travaglini@arm.comTEST(FatalFailureTest, FatalFailureInSubroutine) {
12213481Sgiacomo.travaglini@arm.com  printf("(expecting a failure that x should be 1)\n");
12313481Sgiacomo.travaglini@arm.com
12413481Sgiacomo.travaglini@arm.com  TryTestSubroutine();
12513481Sgiacomo.travaglini@arm.com}
12613481Sgiacomo.travaglini@arm.com
12713481Sgiacomo.travaglini@arm.com// Tests catching a fatal failure in a nested subroutine.
12813481Sgiacomo.travaglini@arm.comTEST(FatalFailureTest, FatalFailureInNestedSubroutine) {
12913481Sgiacomo.travaglini@arm.com  printf("(expecting a failure that x should be 1)\n");
13013481Sgiacomo.travaglini@arm.com
13113481Sgiacomo.travaglini@arm.com  // Calls a subrountine that yields a fatal failure.
13213481Sgiacomo.travaglini@arm.com  TryTestSubroutine();
13313481Sgiacomo.travaglini@arm.com
13413481Sgiacomo.travaglini@arm.com  // Catches the fatal failure and aborts the test.
13513481Sgiacomo.travaglini@arm.com  //
13613481Sgiacomo.travaglini@arm.com  // When calling HasFatalFailure() inside a TEST, TEST_F, or test
13713481Sgiacomo.travaglini@arm.com  // fixture, the testing::Test:: prefix is not needed.
13813481Sgiacomo.travaglini@arm.com  if (HasFatalFailure()) return;
13913481Sgiacomo.travaglini@arm.com
14013481Sgiacomo.travaglini@arm.com  // If we get here, something is wrong.
14113481Sgiacomo.travaglini@arm.com  FAIL() << "This should never be reached.";
14213481Sgiacomo.travaglini@arm.com}
14313481Sgiacomo.travaglini@arm.com
14413481Sgiacomo.travaglini@arm.com// Tests HasFatalFailure() after a failed EXPECT check.
14513481Sgiacomo.travaglini@arm.comTEST(FatalFailureTest, NonfatalFailureInSubroutine) {
14613481Sgiacomo.travaglini@arm.com  printf("(expecting a failure on false)\n");
14713481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(false);  // Generates a nonfatal failure
14813481Sgiacomo.travaglini@arm.com  ASSERT_FALSE(HasFatalFailure());  // This should succeed.
14913481Sgiacomo.travaglini@arm.com}
15013481Sgiacomo.travaglini@arm.com
15113481Sgiacomo.travaglini@arm.com// Tests interleaving user logging and Google Test assertions.
15213481Sgiacomo.travaglini@arm.comTEST(LoggingTest, InterleavingLoggingAndAssertions) {
15313481Sgiacomo.travaglini@arm.com  static const int a[4] = {
15413481Sgiacomo.travaglini@arm.com    3, 9, 2, 6
15513481Sgiacomo.travaglini@arm.com  };
15613481Sgiacomo.travaglini@arm.com
15713481Sgiacomo.travaglini@arm.com  printf("(expecting 2 failures on (3) >= (a[i]))\n");
15813481Sgiacomo.travaglini@arm.com  for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) {
15913481Sgiacomo.travaglini@arm.com    printf("i == %d\n", i);
16013481Sgiacomo.travaglini@arm.com    EXPECT_GE(3, a[i]);
16113481Sgiacomo.travaglini@arm.com  }
16213481Sgiacomo.travaglini@arm.com}
16313481Sgiacomo.travaglini@arm.com
16413481Sgiacomo.travaglini@arm.com// Tests the SCOPED_TRACE macro.
16513481Sgiacomo.travaglini@arm.com
16613481Sgiacomo.travaglini@arm.com// A helper function for testing SCOPED_TRACE.
16713481Sgiacomo.travaglini@arm.comvoid SubWithoutTrace(int n) {
16813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, n);
16913481Sgiacomo.travaglini@arm.com  ASSERT_EQ(2, n);
17013481Sgiacomo.travaglini@arm.com}
17113481Sgiacomo.travaglini@arm.com
17213481Sgiacomo.travaglini@arm.com// Another helper function for testing SCOPED_TRACE.
17313481Sgiacomo.travaglini@arm.comvoid SubWithTrace(int n) {
17413481Sgiacomo.travaglini@arm.com  SCOPED_TRACE(testing::Message() << "n = " << n);
17513481Sgiacomo.travaglini@arm.com
17613481Sgiacomo.travaglini@arm.com  SubWithoutTrace(n);
17713481Sgiacomo.travaglini@arm.com}
17813481Sgiacomo.travaglini@arm.com
17913481Sgiacomo.travaglini@arm.com// Tests that SCOPED_TRACE() obeys lexical scopes.
18013481Sgiacomo.travaglini@arm.comTEST(SCOPED_TRACETest, ObeysScopes) {
18113481Sgiacomo.travaglini@arm.com  printf("(expected to fail)\n");
18213481Sgiacomo.travaglini@arm.com
18313481Sgiacomo.travaglini@arm.com  // There should be no trace before SCOPED_TRACE() is invoked.
18413481Sgiacomo.travaglini@arm.com  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
18513481Sgiacomo.travaglini@arm.com
18613481Sgiacomo.travaglini@arm.com  {
18713481Sgiacomo.travaglini@arm.com    SCOPED_TRACE("Expected trace");
18813481Sgiacomo.travaglini@arm.com    // After SCOPED_TRACE(), a failure in the current scope should contain
18913481Sgiacomo.travaglini@arm.com    // the trace.
19013481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "This failure is expected, and should have a trace.";
19113481Sgiacomo.travaglini@arm.com  }
19213481Sgiacomo.travaglini@arm.com
19313481Sgiacomo.travaglini@arm.com  // Once the control leaves the scope of the SCOPED_TRACE(), there
19413481Sgiacomo.travaglini@arm.com  // should be no trace again.
19513481Sgiacomo.travaglini@arm.com  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
19613481Sgiacomo.travaglini@arm.com}
19713481Sgiacomo.travaglini@arm.com
19813481Sgiacomo.travaglini@arm.com// Tests that SCOPED_TRACE works inside a loop.
19913481Sgiacomo.travaglini@arm.comTEST(SCOPED_TRACETest, WorksInLoop) {
20013481Sgiacomo.travaglini@arm.com  printf("(expected to fail)\n");
20113481Sgiacomo.travaglini@arm.com
20213481Sgiacomo.travaglini@arm.com  for (int i = 1; i <= 2; i++) {
20313481Sgiacomo.travaglini@arm.com    SCOPED_TRACE(testing::Message() << "i = " << i);
20413481Sgiacomo.travaglini@arm.com
20513481Sgiacomo.travaglini@arm.com    SubWithoutTrace(i);
20613481Sgiacomo.travaglini@arm.com  }
20713481Sgiacomo.travaglini@arm.com}
20813481Sgiacomo.travaglini@arm.com
20913481Sgiacomo.travaglini@arm.com// Tests that SCOPED_TRACE works in a subroutine.
21013481Sgiacomo.travaglini@arm.comTEST(SCOPED_TRACETest, WorksInSubroutine) {
21113481Sgiacomo.travaglini@arm.com  printf("(expected to fail)\n");
21213481Sgiacomo.travaglini@arm.com
21313481Sgiacomo.travaglini@arm.com  SubWithTrace(1);
21413481Sgiacomo.travaglini@arm.com  SubWithTrace(2);
21513481Sgiacomo.travaglini@arm.com}
21613481Sgiacomo.travaglini@arm.com
21713481Sgiacomo.travaglini@arm.com// Tests that SCOPED_TRACE can be nested.
21813481Sgiacomo.travaglini@arm.comTEST(SCOPED_TRACETest, CanBeNested) {
21913481Sgiacomo.travaglini@arm.com  printf("(expected to fail)\n");
22013481Sgiacomo.travaglini@arm.com
22113481Sgiacomo.travaglini@arm.com  SCOPED_TRACE("");  // A trace without a message.
22213481Sgiacomo.travaglini@arm.com
22313481Sgiacomo.travaglini@arm.com  SubWithTrace(2);
22413481Sgiacomo.travaglini@arm.com}
22513481Sgiacomo.travaglini@arm.com
22613481Sgiacomo.travaglini@arm.com// Tests that multiple SCOPED_TRACEs can be used in the same scope.
22713481Sgiacomo.travaglini@arm.comTEST(SCOPED_TRACETest, CanBeRepeated) {
22813481Sgiacomo.travaglini@arm.com  printf("(expected to fail)\n");
22913481Sgiacomo.travaglini@arm.com
23013481Sgiacomo.travaglini@arm.com  SCOPED_TRACE("A");
23113481Sgiacomo.travaglini@arm.com  ADD_FAILURE()
23213481Sgiacomo.travaglini@arm.com      << "This failure is expected, and should contain trace point A.";
23313481Sgiacomo.travaglini@arm.com
23413481Sgiacomo.travaglini@arm.com  SCOPED_TRACE("B");
23513481Sgiacomo.travaglini@arm.com  ADD_FAILURE()
23613481Sgiacomo.travaglini@arm.com      << "This failure is expected, and should contain trace point A and B.";
23713481Sgiacomo.travaglini@arm.com
23813481Sgiacomo.travaglini@arm.com  {
23913481Sgiacomo.travaglini@arm.com    SCOPED_TRACE("C");
24013481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "This failure is expected, and should "
24113481Sgiacomo.travaglini@arm.com                  << "contain trace point A, B, and C.";
24213481Sgiacomo.travaglini@arm.com  }
24313481Sgiacomo.travaglini@arm.com
24413481Sgiacomo.travaglini@arm.com  SCOPED_TRACE("D");
24513481Sgiacomo.travaglini@arm.com  ADD_FAILURE() << "This failure is expected, and should "
24613481Sgiacomo.travaglini@arm.com                << "contain trace point A, B, and D.";
24713481Sgiacomo.travaglini@arm.com}
24813481Sgiacomo.travaglini@arm.com
24913481Sgiacomo.travaglini@arm.com#if GTEST_IS_THREADSAFE
25013481Sgiacomo.travaglini@arm.com// Tests that SCOPED_TRACE()s can be used concurrently from multiple
25113481Sgiacomo.travaglini@arm.com// threads.  Namely, an assertion should be affected by
25213481Sgiacomo.travaglini@arm.com// SCOPED_TRACE()s in its own thread only.
25313481Sgiacomo.travaglini@arm.com
25413481Sgiacomo.travaglini@arm.com// Here's the sequence of actions that happen in the test:
25513481Sgiacomo.travaglini@arm.com//
25613481Sgiacomo.travaglini@arm.com//   Thread A (main)                | Thread B (spawned)
25713481Sgiacomo.travaglini@arm.com//   ===============================|================================
25813481Sgiacomo.travaglini@arm.com//   spawns thread B                |
25913481Sgiacomo.travaglini@arm.com//   -------------------------------+--------------------------------
26013481Sgiacomo.travaglini@arm.com//   waits for n1                   | SCOPED_TRACE("Trace B");
26113481Sgiacomo.travaglini@arm.com//                                  | generates failure #1
26213481Sgiacomo.travaglini@arm.com//                                  | notifies n1
26313481Sgiacomo.travaglini@arm.com//   -------------------------------+--------------------------------
26413481Sgiacomo.travaglini@arm.com//   SCOPED_TRACE("Trace A");       | waits for n2
26513481Sgiacomo.travaglini@arm.com//   generates failure #2           |
26613481Sgiacomo.travaglini@arm.com//   notifies n2                    |
26713481Sgiacomo.travaglini@arm.com//   -------------------------------|--------------------------------
26813481Sgiacomo.travaglini@arm.com//   waits for n3                   | generates failure #3
26913481Sgiacomo.travaglini@arm.com//                                  | trace B dies
27013481Sgiacomo.travaglini@arm.com//                                  | generates failure #4
27113481Sgiacomo.travaglini@arm.com//                                  | notifies n3
27213481Sgiacomo.travaglini@arm.com//   -------------------------------|--------------------------------
27313481Sgiacomo.travaglini@arm.com//   generates failure #5           | finishes
27413481Sgiacomo.travaglini@arm.com//   trace A dies                   |
27513481Sgiacomo.travaglini@arm.com//   generates failure #6           |
27613481Sgiacomo.travaglini@arm.com//   -------------------------------|--------------------------------
27713481Sgiacomo.travaglini@arm.com//   waits for thread B to finish   |
27813481Sgiacomo.travaglini@arm.com
27913481Sgiacomo.travaglini@arm.comstruct CheckPoints {
28013481Sgiacomo.travaglini@arm.com  Notification n1;
28113481Sgiacomo.travaglini@arm.com  Notification n2;
28213481Sgiacomo.travaglini@arm.com  Notification n3;
28313481Sgiacomo.travaglini@arm.com};
28413481Sgiacomo.travaglini@arm.com
28513481Sgiacomo.travaglini@arm.comstatic void ThreadWithScopedTrace(CheckPoints* check_points) {
28613481Sgiacomo.travaglini@arm.com  {
28713481Sgiacomo.travaglini@arm.com    SCOPED_TRACE("Trace B");
28813481Sgiacomo.travaglini@arm.com    ADD_FAILURE()
28913481Sgiacomo.travaglini@arm.com        << "Expected failure #1 (in thread B, only trace B alive).";
29013481Sgiacomo.travaglini@arm.com    check_points->n1.Notify();
29113481Sgiacomo.travaglini@arm.com    check_points->n2.WaitForNotification();
29213481Sgiacomo.travaglini@arm.com
29313481Sgiacomo.travaglini@arm.com    ADD_FAILURE()
29413481Sgiacomo.travaglini@arm.com        << "Expected failure #3 (in thread B, trace A & B both alive).";
29513481Sgiacomo.travaglini@arm.com  }  // Trace B dies here.
29613481Sgiacomo.travaglini@arm.com  ADD_FAILURE()
29713481Sgiacomo.travaglini@arm.com      << "Expected failure #4 (in thread B, only trace A alive).";
29813481Sgiacomo.travaglini@arm.com  check_points->n3.Notify();
29913481Sgiacomo.travaglini@arm.com}
30013481Sgiacomo.travaglini@arm.com
30113481Sgiacomo.travaglini@arm.comTEST(SCOPED_TRACETest, WorksConcurrently) {
30213481Sgiacomo.travaglini@arm.com  printf("(expecting 6 failures)\n");
30313481Sgiacomo.travaglini@arm.com
30413481Sgiacomo.travaglini@arm.com  CheckPoints check_points;
30513481Sgiacomo.travaglini@arm.com  ThreadWithParam<CheckPoints*> thread(&ThreadWithScopedTrace,
30613481Sgiacomo.travaglini@arm.com                                       &check_points,
30713481Sgiacomo.travaglini@arm.com                                       NULL);
30813481Sgiacomo.travaglini@arm.com  check_points.n1.WaitForNotification();
30913481Sgiacomo.travaglini@arm.com
31013481Sgiacomo.travaglini@arm.com  {
31113481Sgiacomo.travaglini@arm.com    SCOPED_TRACE("Trace A");
31213481Sgiacomo.travaglini@arm.com    ADD_FAILURE()
31313481Sgiacomo.travaglini@arm.com        << "Expected failure #2 (in thread A, trace A & B both alive).";
31413481Sgiacomo.travaglini@arm.com    check_points.n2.Notify();
31513481Sgiacomo.travaglini@arm.com    check_points.n3.WaitForNotification();
31613481Sgiacomo.travaglini@arm.com
31713481Sgiacomo.travaglini@arm.com    ADD_FAILURE()
31813481Sgiacomo.travaglini@arm.com        << "Expected failure #5 (in thread A, only trace A alive).";
31913481Sgiacomo.travaglini@arm.com  }  // Trace A dies here.
32013481Sgiacomo.travaglini@arm.com  ADD_FAILURE()
32113481Sgiacomo.travaglini@arm.com      << "Expected failure #6 (in thread A, no trace alive).";
32213481Sgiacomo.travaglini@arm.com  thread.Join();
32313481Sgiacomo.travaglini@arm.com}
32413481Sgiacomo.travaglini@arm.com#endif  // GTEST_IS_THREADSAFE
32513481Sgiacomo.travaglini@arm.com
32613481Sgiacomo.travaglini@arm.comTEST(DisabledTestsWarningTest,
32713481Sgiacomo.travaglini@arm.com     DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) {
32813481Sgiacomo.travaglini@arm.com  // This test body is intentionally empty.  Its sole purpose is for
32913481Sgiacomo.travaglini@arm.com  // verifying that the --gtest_also_run_disabled_tests flag
33013481Sgiacomo.travaglini@arm.com  // suppresses the "YOU HAVE 12 DISABLED TESTS" warning at the end of
33113481Sgiacomo.travaglini@arm.com  // the test output.
33213481Sgiacomo.travaglini@arm.com}
33313481Sgiacomo.travaglini@arm.com
33413481Sgiacomo.travaglini@arm.com// Tests using assertions outside of TEST and TEST_F.
33513481Sgiacomo.travaglini@arm.com//
33613481Sgiacomo.travaglini@arm.com// This function creates two failures intentionally.
33713481Sgiacomo.travaglini@arm.comvoid AdHocTest() {
33813481Sgiacomo.travaglini@arm.com  printf("The non-test part of the code is expected to have 2 failures.\n\n");
33913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(false);
34013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, 3);
34113481Sgiacomo.travaglini@arm.com}
34213481Sgiacomo.travaglini@arm.com
34313481Sgiacomo.travaglini@arm.com// Runs all TESTs, all TEST_Fs, and the ad hoc test.
34413481Sgiacomo.travaglini@arm.comint RunAllTests() {
34513481Sgiacomo.travaglini@arm.com  AdHocTest();
34613481Sgiacomo.travaglini@arm.com  return RUN_ALL_TESTS();
34713481Sgiacomo.travaglini@arm.com}
34813481Sgiacomo.travaglini@arm.com
34913481Sgiacomo.travaglini@arm.com// Tests non-fatal failures in the fixture constructor.
35013481Sgiacomo.travaglini@arm.comclass NonFatalFailureInFixtureConstructorTest : public testing::Test {
35113481Sgiacomo.travaglini@arm.com protected:
35213481Sgiacomo.travaglini@arm.com  NonFatalFailureInFixtureConstructorTest() {
35313481Sgiacomo.travaglini@arm.com    printf("(expecting 5 failures)\n");
35413481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected failure #1, in the test fixture c'tor.";
35513481Sgiacomo.travaglini@arm.com  }
35613481Sgiacomo.travaglini@arm.com
35713481Sgiacomo.travaglini@arm.com  ~NonFatalFailureInFixtureConstructorTest() {
35813481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected failure #5, in the test fixture d'tor.";
35913481Sgiacomo.travaglini@arm.com  }
36013481Sgiacomo.travaglini@arm.com
36113481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
36213481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected failure #2, in SetUp().";
36313481Sgiacomo.travaglini@arm.com  }
36413481Sgiacomo.travaglini@arm.com
36513481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
36613481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected failure #4, in TearDown.";
36713481Sgiacomo.travaglini@arm.com  }
36813481Sgiacomo.travaglini@arm.com};
36913481Sgiacomo.travaglini@arm.com
37013481Sgiacomo.travaglini@arm.comTEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) {
37113481Sgiacomo.travaglini@arm.com  ADD_FAILURE() << "Expected failure #3, in the test body.";
37213481Sgiacomo.travaglini@arm.com}
37313481Sgiacomo.travaglini@arm.com
37413481Sgiacomo.travaglini@arm.com// Tests fatal failures in the fixture constructor.
37513481Sgiacomo.travaglini@arm.comclass FatalFailureInFixtureConstructorTest : public testing::Test {
37613481Sgiacomo.travaglini@arm.com protected:
37713481Sgiacomo.travaglini@arm.com  FatalFailureInFixtureConstructorTest() {
37813481Sgiacomo.travaglini@arm.com    printf("(expecting 2 failures)\n");
37913481Sgiacomo.travaglini@arm.com    Init();
38013481Sgiacomo.travaglini@arm.com  }
38113481Sgiacomo.travaglini@arm.com
38213481Sgiacomo.travaglini@arm.com  ~FatalFailureInFixtureConstructorTest() {
38313481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected failure #2, in the test fixture d'tor.";
38413481Sgiacomo.travaglini@arm.com  }
38513481Sgiacomo.travaglini@arm.com
38613481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
38713481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "UNEXPECTED failure in SetUp().  "
38813481Sgiacomo.travaglini@arm.com                  << "We should never get here, as the test fixture c'tor "
38913481Sgiacomo.travaglini@arm.com                  << "had a fatal failure.";
39013481Sgiacomo.travaglini@arm.com  }
39113481Sgiacomo.travaglini@arm.com
39213481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
39313481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "UNEXPECTED failure in TearDown().  "
39413481Sgiacomo.travaglini@arm.com                  << "We should never get here, as the test fixture c'tor "
39513481Sgiacomo.travaglini@arm.com                  << "had a fatal failure.";
39613481Sgiacomo.travaglini@arm.com  }
39713481Sgiacomo.travaglini@arm.com
39813481Sgiacomo.travaglini@arm.com private:
39913481Sgiacomo.travaglini@arm.com  void Init() {
40013481Sgiacomo.travaglini@arm.com    FAIL() << "Expected failure #1, in the test fixture c'tor.";
40113481Sgiacomo.travaglini@arm.com  }
40213481Sgiacomo.travaglini@arm.com};
40313481Sgiacomo.travaglini@arm.com
40413481Sgiacomo.travaglini@arm.comTEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) {
40513481Sgiacomo.travaglini@arm.com  ADD_FAILURE() << "UNEXPECTED failure in the test body.  "
40613481Sgiacomo.travaglini@arm.com                << "We should never get here, as the test fixture c'tor "
40713481Sgiacomo.travaglini@arm.com                << "had a fatal failure.";
40813481Sgiacomo.travaglini@arm.com}
40913481Sgiacomo.travaglini@arm.com
41013481Sgiacomo.travaglini@arm.com// Tests non-fatal failures in SetUp().
41113481Sgiacomo.travaglini@arm.comclass NonFatalFailureInSetUpTest : public testing::Test {
41213481Sgiacomo.travaglini@arm.com protected:
41313481Sgiacomo.travaglini@arm.com  virtual ~NonFatalFailureInSetUpTest() {
41413481Sgiacomo.travaglini@arm.com    Deinit();
41513481Sgiacomo.travaglini@arm.com  }
41613481Sgiacomo.travaglini@arm.com
41713481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
41813481Sgiacomo.travaglini@arm.com    printf("(expecting 4 failures)\n");
41913481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected failure #1, in SetUp().";
42013481Sgiacomo.travaglini@arm.com  }
42113481Sgiacomo.travaglini@arm.com
42213481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
42313481Sgiacomo.travaglini@arm.com    FAIL() << "Expected failure #3, in TearDown().";
42413481Sgiacomo.travaglini@arm.com  }
42513481Sgiacomo.travaglini@arm.com private:
42613481Sgiacomo.travaglini@arm.com  void Deinit() {
42713481Sgiacomo.travaglini@arm.com    FAIL() << "Expected failure #4, in the test fixture d'tor.";
42813481Sgiacomo.travaglini@arm.com  }
42913481Sgiacomo.travaglini@arm.com};
43013481Sgiacomo.travaglini@arm.com
43113481Sgiacomo.travaglini@arm.comTEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) {
43213481Sgiacomo.travaglini@arm.com  FAIL() << "Expected failure #2, in the test function.";
43313481Sgiacomo.travaglini@arm.com}
43413481Sgiacomo.travaglini@arm.com
43513481Sgiacomo.travaglini@arm.com// Tests fatal failures in SetUp().
43613481Sgiacomo.travaglini@arm.comclass FatalFailureInSetUpTest : public testing::Test {
43713481Sgiacomo.travaglini@arm.com protected:
43813481Sgiacomo.travaglini@arm.com  virtual ~FatalFailureInSetUpTest() {
43913481Sgiacomo.travaglini@arm.com    Deinit();
44013481Sgiacomo.travaglini@arm.com  }
44113481Sgiacomo.travaglini@arm.com
44213481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
44313481Sgiacomo.travaglini@arm.com    printf("(expecting 3 failures)\n");
44413481Sgiacomo.travaglini@arm.com    FAIL() << "Expected failure #1, in SetUp().";
44513481Sgiacomo.travaglini@arm.com  }
44613481Sgiacomo.travaglini@arm.com
44713481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
44813481Sgiacomo.travaglini@arm.com    FAIL() << "Expected failure #2, in TearDown().";
44913481Sgiacomo.travaglini@arm.com  }
45013481Sgiacomo.travaglini@arm.com private:
45113481Sgiacomo.travaglini@arm.com  void Deinit() {
45213481Sgiacomo.travaglini@arm.com    FAIL() << "Expected failure #3, in the test fixture d'tor.";
45313481Sgiacomo.travaglini@arm.com  }
45413481Sgiacomo.travaglini@arm.com};
45513481Sgiacomo.travaglini@arm.com
45613481Sgiacomo.travaglini@arm.comTEST_F(FatalFailureInSetUpTest, FailureInSetUp) {
45713481Sgiacomo.travaglini@arm.com  FAIL() << "UNEXPECTED failure in the test function.  "
45813481Sgiacomo.travaglini@arm.com         << "We should never get here, as SetUp() failed.";
45913481Sgiacomo.travaglini@arm.com}
46013481Sgiacomo.travaglini@arm.com
46113481Sgiacomo.travaglini@arm.comTEST(AddFailureAtTest, MessageContainsSpecifiedFileAndLineNumber) {
46213481Sgiacomo.travaglini@arm.com  ADD_FAILURE_AT("foo.cc", 42) << "Expected failure in foo.cc";
46313481Sgiacomo.travaglini@arm.com}
46413481Sgiacomo.travaglini@arm.com
46513481Sgiacomo.travaglini@arm.com#if GTEST_IS_THREADSAFE
46613481Sgiacomo.travaglini@arm.com
46713481Sgiacomo.travaglini@arm.com// A unary function that may die.
46813481Sgiacomo.travaglini@arm.comvoid DieIf(bool should_die) {
46913481Sgiacomo.travaglini@arm.com  GTEST_CHECK_(!should_die) << " - death inside DieIf().";
47013481Sgiacomo.travaglini@arm.com}
47113481Sgiacomo.travaglini@arm.com
47213481Sgiacomo.travaglini@arm.com// Tests running death tests in a multi-threaded context.
47313481Sgiacomo.travaglini@arm.com
47413481Sgiacomo.travaglini@arm.com// Used for coordination between the main and the spawn thread.
47513481Sgiacomo.travaglini@arm.comstruct SpawnThreadNotifications {
47613481Sgiacomo.travaglini@arm.com  SpawnThreadNotifications() {}
47713481Sgiacomo.travaglini@arm.com
47813481Sgiacomo.travaglini@arm.com  Notification spawn_thread_started;
47913481Sgiacomo.travaglini@arm.com  Notification spawn_thread_ok_to_terminate;
48013481Sgiacomo.travaglini@arm.com
48113481Sgiacomo.travaglini@arm.com private:
48213481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications);
48313481Sgiacomo.travaglini@arm.com};
48413481Sgiacomo.travaglini@arm.com
48513481Sgiacomo.travaglini@arm.com// The function to be executed in the thread spawn by the
48613481Sgiacomo.travaglini@arm.com// MultipleThreads test (below).
48713481Sgiacomo.travaglini@arm.comstatic void ThreadRoutine(SpawnThreadNotifications* notifications) {
48813481Sgiacomo.travaglini@arm.com  // Signals the main thread that this thread has started.
48913481Sgiacomo.travaglini@arm.com  notifications->spawn_thread_started.Notify();
49013481Sgiacomo.travaglini@arm.com
49113481Sgiacomo.travaglini@arm.com  // Waits for permission to finish from the main thread.
49213481Sgiacomo.travaglini@arm.com  notifications->spawn_thread_ok_to_terminate.WaitForNotification();
49313481Sgiacomo.travaglini@arm.com}
49413481Sgiacomo.travaglini@arm.com
49513481Sgiacomo.travaglini@arm.com// This is a death-test test, but it's not named with a DeathTest
49613481Sgiacomo.travaglini@arm.com// suffix.  It starts threads which might interfere with later
49713481Sgiacomo.travaglini@arm.com// death tests, so it must run after all other death tests.
49813481Sgiacomo.travaglini@arm.comclass DeathTestAndMultiThreadsTest : public testing::Test {
49913481Sgiacomo.travaglini@arm.com protected:
50013481Sgiacomo.travaglini@arm.com  // Starts a thread and waits for it to begin.
50113481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
50213481Sgiacomo.travaglini@arm.com    thread_.reset(new ThreadWithParam<SpawnThreadNotifications*>(
50313481Sgiacomo.travaglini@arm.com        &ThreadRoutine, &notifications_, NULL));
50413481Sgiacomo.travaglini@arm.com    notifications_.spawn_thread_started.WaitForNotification();
50513481Sgiacomo.travaglini@arm.com  }
50613481Sgiacomo.travaglini@arm.com  // Tells the thread to finish, and reaps it.
50713481Sgiacomo.travaglini@arm.com  // Depending on the version of the thread library in use,
50813481Sgiacomo.travaglini@arm.com  // a manager thread might still be left running that will interfere
50913481Sgiacomo.travaglini@arm.com  // with later death tests.  This is unfortunate, but this class
51013481Sgiacomo.travaglini@arm.com  // cleans up after itself as best it can.
51113481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
51213481Sgiacomo.travaglini@arm.com    notifications_.spawn_thread_ok_to_terminate.Notify();
51313481Sgiacomo.travaglini@arm.com  }
51413481Sgiacomo.travaglini@arm.com
51513481Sgiacomo.travaglini@arm.com private:
51613481Sgiacomo.travaglini@arm.com  SpawnThreadNotifications notifications_;
51713481Sgiacomo.travaglini@arm.com  testing::internal::scoped_ptr<ThreadWithParam<SpawnThreadNotifications*> >
51813481Sgiacomo.travaglini@arm.com      thread_;
51913481Sgiacomo.travaglini@arm.com};
52013481Sgiacomo.travaglini@arm.com
52113481Sgiacomo.travaglini@arm.com#endif  // GTEST_IS_THREADSAFE
52213481Sgiacomo.travaglini@arm.com
52313481Sgiacomo.travaglini@arm.com// The MixedUpTestCaseTest test case verifies that Google Test will fail a
52413481Sgiacomo.travaglini@arm.com// test if it uses a different fixture class than what other tests in
52513481Sgiacomo.travaglini@arm.com// the same test case use.  It deliberately contains two fixture
52613481Sgiacomo.travaglini@arm.com// classes with the same name but defined in different namespaces.
52713481Sgiacomo.travaglini@arm.com
52813481Sgiacomo.travaglini@arm.com// The MixedUpTestCaseWithSameTestNameTest test case verifies that
52913481Sgiacomo.travaglini@arm.com// when the user defines two tests with the same test case name AND
53013481Sgiacomo.travaglini@arm.com// same test name (but in different namespaces), the second test will
53113481Sgiacomo.travaglini@arm.com// fail.
53213481Sgiacomo.travaglini@arm.com
53313481Sgiacomo.travaglini@arm.comnamespace foo {
53413481Sgiacomo.travaglini@arm.com
53513481Sgiacomo.travaglini@arm.comclass MixedUpTestCaseTest : public testing::Test {
53613481Sgiacomo.travaglini@arm.com};
53713481Sgiacomo.travaglini@arm.com
53813481Sgiacomo.travaglini@arm.comTEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {}
53913481Sgiacomo.travaglini@arm.comTEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {}
54013481Sgiacomo.travaglini@arm.com
54113481Sgiacomo.travaglini@arm.comclass MixedUpTestCaseWithSameTestNameTest : public testing::Test {
54213481Sgiacomo.travaglini@arm.com};
54313481Sgiacomo.travaglini@arm.com
54413481Sgiacomo.travaglini@arm.comTEST_F(MixedUpTestCaseWithSameTestNameTest,
54513481Sgiacomo.travaglini@arm.com       TheSecondTestWithThisNameShouldFail) {}
54613481Sgiacomo.travaglini@arm.com
54713481Sgiacomo.travaglini@arm.com}  // namespace foo
54813481Sgiacomo.travaglini@arm.com
54913481Sgiacomo.travaglini@arm.comnamespace bar {
55013481Sgiacomo.travaglini@arm.com
55113481Sgiacomo.travaglini@arm.comclass MixedUpTestCaseTest : public testing::Test {
55213481Sgiacomo.travaglini@arm.com};
55313481Sgiacomo.travaglini@arm.com
55413481Sgiacomo.travaglini@arm.com// The following two tests are expected to fail.  We rely on the
55513481Sgiacomo.travaglini@arm.com// golden file to check that Google Test generates the right error message.
55613481Sgiacomo.travaglini@arm.comTEST_F(MixedUpTestCaseTest, ThisShouldFail) {}
55713481Sgiacomo.travaglini@arm.comTEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {}
55813481Sgiacomo.travaglini@arm.com
55913481Sgiacomo.travaglini@arm.comclass MixedUpTestCaseWithSameTestNameTest : public testing::Test {
56013481Sgiacomo.travaglini@arm.com};
56113481Sgiacomo.travaglini@arm.com
56213481Sgiacomo.travaglini@arm.com// Expected to fail.  We rely on the golden file to check that Google Test
56313481Sgiacomo.travaglini@arm.com// generates the right error message.
56413481Sgiacomo.travaglini@arm.comTEST_F(MixedUpTestCaseWithSameTestNameTest,
56513481Sgiacomo.travaglini@arm.com       TheSecondTestWithThisNameShouldFail) {}
56613481Sgiacomo.travaglini@arm.com
56713481Sgiacomo.travaglini@arm.com}  // namespace bar
56813481Sgiacomo.travaglini@arm.com
56913481Sgiacomo.travaglini@arm.com// The following two test cases verify that Google Test catches the user
57013481Sgiacomo.travaglini@arm.com// error of mixing TEST and TEST_F in the same test case.  The first
57113481Sgiacomo.travaglini@arm.com// test case checks the scenario where TEST_F appears before TEST, and
57213481Sgiacomo.travaglini@arm.com// the second one checks where TEST appears before TEST_F.
57313481Sgiacomo.travaglini@arm.com
57413481Sgiacomo.travaglini@arm.comclass TEST_F_before_TEST_in_same_test_case : public testing::Test {
57513481Sgiacomo.travaglini@arm.com};
57613481Sgiacomo.travaglini@arm.com
57713481Sgiacomo.travaglini@arm.comTEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {}
57813481Sgiacomo.travaglini@arm.com
57913481Sgiacomo.travaglini@arm.com// Expected to fail.  We rely on the golden file to check that Google Test
58013481Sgiacomo.travaglini@arm.com// generates the right error message.
58113481Sgiacomo.travaglini@arm.comTEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {}
58213481Sgiacomo.travaglini@arm.com
58313481Sgiacomo.travaglini@arm.comclass TEST_before_TEST_F_in_same_test_case : public testing::Test {
58413481Sgiacomo.travaglini@arm.com};
58513481Sgiacomo.travaglini@arm.com
58613481Sgiacomo.travaglini@arm.comTEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {}
58713481Sgiacomo.travaglini@arm.com
58813481Sgiacomo.travaglini@arm.com// Expected to fail.  We rely on the golden file to check that Google Test
58913481Sgiacomo.travaglini@arm.com// generates the right error message.
59013481Sgiacomo.travaglini@arm.comTEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) {
59113481Sgiacomo.travaglini@arm.com}
59213481Sgiacomo.travaglini@arm.com
59313481Sgiacomo.travaglini@arm.com// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE().
59413481Sgiacomo.travaglini@arm.comint global_integer = 0;
59513481Sgiacomo.travaglini@arm.com
59613481Sgiacomo.travaglini@arm.com// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables.
59713481Sgiacomo.travaglini@arm.comTEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) {
59813481Sgiacomo.travaglini@arm.com  global_integer = 0;
59913481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
60013481Sgiacomo.travaglini@arm.com    EXPECT_EQ(1, global_integer) << "Expected non-fatal failure.";
60113481Sgiacomo.travaglini@arm.com  }, "Expected non-fatal failure.");
60213481Sgiacomo.travaglini@arm.com}
60313481Sgiacomo.travaglini@arm.com
60413481Sgiacomo.travaglini@arm.com// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables
60513481Sgiacomo.travaglini@arm.com// (static or not).
60613481Sgiacomo.travaglini@arm.comTEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) {
60713481Sgiacomo.travaglini@arm.com  int m = 0;
60813481Sgiacomo.travaglini@arm.com  static int n;
60913481Sgiacomo.travaglini@arm.com  n = 1;
61013481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
61113481Sgiacomo.travaglini@arm.com    EXPECT_EQ(m, n) << "Expected non-fatal failure.";
61213481Sgiacomo.travaglini@arm.com  }, "Expected non-fatal failure.");
61313481Sgiacomo.travaglini@arm.com}
61413481Sgiacomo.travaglini@arm.com
61513481Sgiacomo.travaglini@arm.com// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly
61613481Sgiacomo.travaglini@arm.com// one non-fatal failure and no fatal failure.
61713481Sgiacomo.travaglini@arm.comTEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) {
61813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
61913481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected non-fatal failure.";
62013481Sgiacomo.travaglini@arm.com  }, "Expected non-fatal failure.");
62113481Sgiacomo.travaglini@arm.com}
62213481Sgiacomo.travaglini@arm.com
62313481Sgiacomo.travaglini@arm.com// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no
62413481Sgiacomo.travaglini@arm.com// non-fatal failure.
62513481Sgiacomo.travaglini@arm.comTEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) {
62613481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
62713481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
62813481Sgiacomo.travaglini@arm.com  }, "");
62913481Sgiacomo.travaglini@arm.com}
63013481Sgiacomo.travaglini@arm.com
63113481Sgiacomo.travaglini@arm.com// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two
63213481Sgiacomo.travaglini@arm.com// non-fatal failures.
63313481Sgiacomo.travaglini@arm.comTEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) {
63413481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
63513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
63613481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected non-fatal failure 1.";
63713481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected non-fatal failure 2.";
63813481Sgiacomo.travaglini@arm.com  }, "");
63913481Sgiacomo.travaglini@arm.com}
64013481Sgiacomo.travaglini@arm.com
64113481Sgiacomo.travaglini@arm.com// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal
64213481Sgiacomo.travaglini@arm.com// failure.
64313481Sgiacomo.travaglini@arm.comTEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) {
64413481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
64513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
64613481Sgiacomo.travaglini@arm.com    FAIL() << "Expected fatal failure.";
64713481Sgiacomo.travaglini@arm.com  }, "");
64813481Sgiacomo.travaglini@arm.com}
64913481Sgiacomo.travaglini@arm.com
65013481Sgiacomo.travaglini@arm.com// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
65113481Sgiacomo.travaglini@arm.com// tested returns.
65213481Sgiacomo.travaglini@arm.comTEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) {
65313481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
65413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
65513481Sgiacomo.travaglini@arm.com    return;
65613481Sgiacomo.travaglini@arm.com  }, "");
65713481Sgiacomo.travaglini@arm.com}
65813481Sgiacomo.travaglini@arm.com
65913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_EXCEPTIONS
66013481Sgiacomo.travaglini@arm.com
66113481Sgiacomo.travaglini@arm.com// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
66213481Sgiacomo.travaglini@arm.com// tested throws.
66313481Sgiacomo.travaglini@arm.comTEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) {
66413481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
66513481Sgiacomo.travaglini@arm.com  try {
66613481Sgiacomo.travaglini@arm.com    EXPECT_NONFATAL_FAILURE({
66713481Sgiacomo.travaglini@arm.com      throw 0;
66813481Sgiacomo.travaglini@arm.com    }, "");
66913481Sgiacomo.travaglini@arm.com  } catch(int) {  // NOLINT
67013481Sgiacomo.travaglini@arm.com  }
67113481Sgiacomo.travaglini@arm.com}
67213481Sgiacomo.travaglini@arm.com
67313481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_EXCEPTIONS
67413481Sgiacomo.travaglini@arm.com
67513481Sgiacomo.travaglini@arm.com// Tests that EXPECT_FATAL_FAILURE() can reference global variables.
67613481Sgiacomo.travaglini@arm.comTEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) {
67713481Sgiacomo.travaglini@arm.com  global_integer = 0;
67813481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE({
67913481Sgiacomo.travaglini@arm.com    ASSERT_EQ(1, global_integer) << "Expected fatal failure.";
68013481Sgiacomo.travaglini@arm.com  }, "Expected fatal failure.");
68113481Sgiacomo.travaglini@arm.com}
68213481Sgiacomo.travaglini@arm.com
68313481Sgiacomo.travaglini@arm.com// Tests that EXPECT_FATAL_FAILURE() can reference local static
68413481Sgiacomo.travaglini@arm.com// variables.
68513481Sgiacomo.travaglini@arm.comTEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) {
68613481Sgiacomo.travaglini@arm.com  static int n;
68713481Sgiacomo.travaglini@arm.com  n = 1;
68813481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE({
68913481Sgiacomo.travaglini@arm.com    ASSERT_EQ(0, n) << "Expected fatal failure.";
69013481Sgiacomo.travaglini@arm.com  }, "Expected fatal failure.");
69113481Sgiacomo.travaglini@arm.com}
69213481Sgiacomo.travaglini@arm.com
69313481Sgiacomo.travaglini@arm.com// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly
69413481Sgiacomo.travaglini@arm.com// one fatal failure and no non-fatal failure.
69513481Sgiacomo.travaglini@arm.comTEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) {
69613481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE({
69713481Sgiacomo.travaglini@arm.com    FAIL() << "Expected fatal failure.";
69813481Sgiacomo.travaglini@arm.com  }, "Expected fatal failure.");
69913481Sgiacomo.travaglini@arm.com}
70013481Sgiacomo.travaglini@arm.com
70113481Sgiacomo.travaglini@arm.com// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal
70213481Sgiacomo.travaglini@arm.com// failure.
70313481Sgiacomo.travaglini@arm.comTEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) {
70413481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
70513481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE({
70613481Sgiacomo.travaglini@arm.com  }, "");
70713481Sgiacomo.travaglini@arm.com}
70813481Sgiacomo.travaglini@arm.com
70913481Sgiacomo.travaglini@arm.com// A helper for generating a fatal failure.
71013481Sgiacomo.travaglini@arm.comvoid FatalFailure() {
71113481Sgiacomo.travaglini@arm.com  FAIL() << "Expected fatal failure.";
71213481Sgiacomo.travaglini@arm.com}
71313481Sgiacomo.travaglini@arm.com
71413481Sgiacomo.travaglini@arm.com// Tests that EXPECT_FATAL_FAILURE() fails when there are two
71513481Sgiacomo.travaglini@arm.com// fatal failures.
71613481Sgiacomo.travaglini@arm.comTEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) {
71713481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
71813481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE({
71913481Sgiacomo.travaglini@arm.com    FatalFailure();
72013481Sgiacomo.travaglini@arm.com    FatalFailure();
72113481Sgiacomo.travaglini@arm.com  }, "");
72213481Sgiacomo.travaglini@arm.com}
72313481Sgiacomo.travaglini@arm.com
72413481Sgiacomo.travaglini@arm.com// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal
72513481Sgiacomo.travaglini@arm.com// failure.
72613481Sgiacomo.travaglini@arm.comTEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) {
72713481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
72813481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE({
72913481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected non-fatal failure.";
73013481Sgiacomo.travaglini@arm.com  }, "");
73113481Sgiacomo.travaglini@arm.com}
73213481Sgiacomo.travaglini@arm.com
73313481Sgiacomo.travaglini@arm.com// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
73413481Sgiacomo.travaglini@arm.com// tested returns.
73513481Sgiacomo.travaglini@arm.comTEST(ExpectFatalFailureTest, FailsWhenStatementReturns) {
73613481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
73713481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE({
73813481Sgiacomo.travaglini@arm.com    return;
73913481Sgiacomo.travaglini@arm.com  }, "");
74013481Sgiacomo.travaglini@arm.com}
74113481Sgiacomo.travaglini@arm.com
74213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_EXCEPTIONS
74313481Sgiacomo.travaglini@arm.com
74413481Sgiacomo.travaglini@arm.com// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
74513481Sgiacomo.travaglini@arm.com// tested throws.
74613481Sgiacomo.travaglini@arm.comTEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {
74713481Sgiacomo.travaglini@arm.com  printf("(expecting a failure)\n");
74813481Sgiacomo.travaglini@arm.com  try {
74913481Sgiacomo.travaglini@arm.com    EXPECT_FATAL_FAILURE({
75013481Sgiacomo.travaglini@arm.com      throw 0;
75113481Sgiacomo.travaglini@arm.com    }, "");
75213481Sgiacomo.travaglini@arm.com  } catch(int) {  // NOLINT
75313481Sgiacomo.travaglini@arm.com  }
75413481Sgiacomo.travaglini@arm.com}
75513481Sgiacomo.travaglini@arm.com
75613481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_EXCEPTIONS
75713481Sgiacomo.travaglini@arm.com
75813481Sgiacomo.travaglini@arm.com// This #ifdef block tests the output of value-parameterized tests.
75913481Sgiacomo.travaglini@arm.com
76013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
76113481Sgiacomo.travaglini@arm.com
76213481Sgiacomo.travaglini@arm.comstd::string ParamNameFunc(const testing::TestParamInfo<std::string>& info) {
76313481Sgiacomo.travaglini@arm.com  return info.param;
76413481Sgiacomo.travaglini@arm.com}
76513481Sgiacomo.travaglini@arm.com
76613481Sgiacomo.travaglini@arm.comclass ParamTest : public testing::TestWithParam<std::string> {
76713481Sgiacomo.travaglini@arm.com};
76813481Sgiacomo.travaglini@arm.com
76913481Sgiacomo.travaglini@arm.comTEST_P(ParamTest, Success) {
77013481Sgiacomo.travaglini@arm.com  EXPECT_EQ("a", GetParam());
77113481Sgiacomo.travaglini@arm.com}
77213481Sgiacomo.travaglini@arm.com
77313481Sgiacomo.travaglini@arm.comTEST_P(ParamTest, Failure) {
77413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("b", GetParam()) << "Expected failure";
77513481Sgiacomo.travaglini@arm.com}
77613481Sgiacomo.travaglini@arm.com
77713481Sgiacomo.travaglini@arm.comINSTANTIATE_TEST_CASE_P(PrintingStrings,
77813481Sgiacomo.travaglini@arm.com                        ParamTest,
77913481Sgiacomo.travaglini@arm.com                        testing::Values(std::string("a")),
78013481Sgiacomo.travaglini@arm.com                        ParamNameFunc);
78113481Sgiacomo.travaglini@arm.com
78213481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_PARAM_TEST
78313481Sgiacomo.travaglini@arm.com
78413481Sgiacomo.travaglini@arm.com// This #ifdef block tests the output of typed tests.
78513481Sgiacomo.travaglini@arm.com#if GTEST_HAS_TYPED_TEST
78613481Sgiacomo.travaglini@arm.com
78713481Sgiacomo.travaglini@arm.comtemplate <typename T>
78813481Sgiacomo.travaglini@arm.comclass TypedTest : public testing::Test {
78913481Sgiacomo.travaglini@arm.com};
79013481Sgiacomo.travaglini@arm.com
79113481Sgiacomo.travaglini@arm.comTYPED_TEST_CASE(TypedTest, testing::Types<int>);
79213481Sgiacomo.travaglini@arm.com
79313481Sgiacomo.travaglini@arm.comTYPED_TEST(TypedTest, Success) {
79413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, TypeParam());
79513481Sgiacomo.travaglini@arm.com}
79613481Sgiacomo.travaglini@arm.com
79713481Sgiacomo.travaglini@arm.comTYPED_TEST(TypedTest, Failure) {
79813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, TypeParam()) << "Expected failure";
79913481Sgiacomo.travaglini@arm.com}
80013481Sgiacomo.travaglini@arm.com
80113481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_TYPED_TEST
80213481Sgiacomo.travaglini@arm.com
80313481Sgiacomo.travaglini@arm.com// This #ifdef block tests the output of type-parameterized tests.
80413481Sgiacomo.travaglini@arm.com#if GTEST_HAS_TYPED_TEST_P
80513481Sgiacomo.travaglini@arm.com
80613481Sgiacomo.travaglini@arm.comtemplate <typename T>
80713481Sgiacomo.travaglini@arm.comclass TypedTestP : public testing::Test {
80813481Sgiacomo.travaglini@arm.com};
80913481Sgiacomo.travaglini@arm.com
81013481Sgiacomo.travaglini@arm.comTYPED_TEST_CASE_P(TypedTestP);
81113481Sgiacomo.travaglini@arm.com
81213481Sgiacomo.travaglini@arm.comTYPED_TEST_P(TypedTestP, Success) {
81313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0U, TypeParam());
81413481Sgiacomo.travaglini@arm.com}
81513481Sgiacomo.travaglini@arm.com
81613481Sgiacomo.travaglini@arm.comTYPED_TEST_P(TypedTestP, Failure) {
81713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1U, TypeParam()) << "Expected failure";
81813481Sgiacomo.travaglini@arm.com}
81913481Sgiacomo.travaglini@arm.com
82013481Sgiacomo.travaglini@arm.comREGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure);
82113481Sgiacomo.travaglini@arm.com
82213481Sgiacomo.travaglini@arm.comtypedef testing::Types<unsigned char, unsigned int> UnsignedTypes;
82313481Sgiacomo.travaglini@arm.comINSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes);
82413481Sgiacomo.travaglini@arm.com
82513481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_TYPED_TEST_P
82613481Sgiacomo.travaglini@arm.com
82713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_DEATH_TEST
82813481Sgiacomo.travaglini@arm.com
82913481Sgiacomo.travaglini@arm.com// We rely on the golden file to verify that tests whose test case
83013481Sgiacomo.travaglini@arm.com// name ends with DeathTest are run first.
83113481Sgiacomo.travaglini@arm.com
83213481Sgiacomo.travaglini@arm.comTEST(ADeathTest, ShouldRunFirst) {
83313481Sgiacomo.travaglini@arm.com}
83413481Sgiacomo.travaglini@arm.com
83513481Sgiacomo.travaglini@arm.com# if GTEST_HAS_TYPED_TEST
83613481Sgiacomo.travaglini@arm.com
83713481Sgiacomo.travaglini@arm.com// We rely on the golden file to verify that typed tests whose test
83813481Sgiacomo.travaglini@arm.com// case name ends with DeathTest are run first.
83913481Sgiacomo.travaglini@arm.com
84013481Sgiacomo.travaglini@arm.comtemplate <typename T>
84113481Sgiacomo.travaglini@arm.comclass ATypedDeathTest : public testing::Test {
84213481Sgiacomo.travaglini@arm.com};
84313481Sgiacomo.travaglini@arm.com
84413481Sgiacomo.travaglini@arm.comtypedef testing::Types<int, double> NumericTypes;
84513481Sgiacomo.travaglini@arm.comTYPED_TEST_CASE(ATypedDeathTest, NumericTypes);
84613481Sgiacomo.travaglini@arm.com
84713481Sgiacomo.travaglini@arm.comTYPED_TEST(ATypedDeathTest, ShouldRunFirst) {
84813481Sgiacomo.travaglini@arm.com}
84913481Sgiacomo.travaglini@arm.com
85013481Sgiacomo.travaglini@arm.com# endif  // GTEST_HAS_TYPED_TEST
85113481Sgiacomo.travaglini@arm.com
85213481Sgiacomo.travaglini@arm.com# if GTEST_HAS_TYPED_TEST_P
85313481Sgiacomo.travaglini@arm.com
85413481Sgiacomo.travaglini@arm.com
85513481Sgiacomo.travaglini@arm.com// We rely on the golden file to verify that type-parameterized tests
85613481Sgiacomo.travaglini@arm.com// whose test case name ends with DeathTest are run first.
85713481Sgiacomo.travaglini@arm.com
85813481Sgiacomo.travaglini@arm.comtemplate <typename T>
85913481Sgiacomo.travaglini@arm.comclass ATypeParamDeathTest : public testing::Test {
86013481Sgiacomo.travaglini@arm.com};
86113481Sgiacomo.travaglini@arm.com
86213481Sgiacomo.travaglini@arm.comTYPED_TEST_CASE_P(ATypeParamDeathTest);
86313481Sgiacomo.travaglini@arm.com
86413481Sgiacomo.travaglini@arm.comTYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) {
86513481Sgiacomo.travaglini@arm.com}
86613481Sgiacomo.travaglini@arm.com
86713481Sgiacomo.travaglini@arm.comREGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst);
86813481Sgiacomo.travaglini@arm.com
86913481Sgiacomo.travaglini@arm.comINSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes);
87013481Sgiacomo.travaglini@arm.com
87113481Sgiacomo.travaglini@arm.com# endif  // GTEST_HAS_TYPED_TEST_P
87213481Sgiacomo.travaglini@arm.com
87313481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_DEATH_TEST
87413481Sgiacomo.travaglini@arm.com
87513481Sgiacomo.travaglini@arm.com// Tests various failure conditions of
87613481Sgiacomo.travaglini@arm.com// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}.
87713481Sgiacomo.travaglini@arm.comclass ExpectFailureTest : public testing::Test {
87813481Sgiacomo.travaglini@arm.com public:  // Must be public and not protected due to a bug in g++ 3.4.2.
87913481Sgiacomo.travaglini@arm.com  enum FailureMode {
88013481Sgiacomo.travaglini@arm.com    FATAL_FAILURE,
88113481Sgiacomo.travaglini@arm.com    NONFATAL_FAILURE
88213481Sgiacomo.travaglini@arm.com  };
88313481Sgiacomo.travaglini@arm.com  static void AddFailure(FailureMode failure) {
88413481Sgiacomo.travaglini@arm.com    if (failure == FATAL_FAILURE) {
88513481Sgiacomo.travaglini@arm.com      FAIL() << "Expected fatal failure.";
88613481Sgiacomo.travaglini@arm.com    } else {
88713481Sgiacomo.travaglini@arm.com      ADD_FAILURE() << "Expected non-fatal failure.";
88813481Sgiacomo.travaglini@arm.com    }
88913481Sgiacomo.travaglini@arm.com  }
89013481Sgiacomo.travaglini@arm.com};
89113481Sgiacomo.travaglini@arm.com
89213481Sgiacomo.travaglini@arm.comTEST_F(ExpectFailureTest, ExpectFatalFailure) {
89313481Sgiacomo.travaglini@arm.com  // Expected fatal failure, but succeeds.
89413481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
89513481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE(SUCCEED(), "Expected fatal failure.");
89613481Sgiacomo.travaglini@arm.com  // Expected fatal failure, but got a non-fatal failure.
89713481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
89813481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Expected non-fatal "
89913481Sgiacomo.travaglini@arm.com                       "failure.");
90013481Sgiacomo.travaglini@arm.com  // Wrong message.
90113481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
90213481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Some other fatal failure "
90313481Sgiacomo.travaglini@arm.com                       "expected.");
90413481Sgiacomo.travaglini@arm.com}
90513481Sgiacomo.travaglini@arm.com
90613481Sgiacomo.travaglini@arm.comTEST_F(ExpectFailureTest, ExpectNonFatalFailure) {
90713481Sgiacomo.travaglini@arm.com  // Expected non-fatal failure, but succeeds.
90813481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
90913481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(SUCCEED(), "Expected non-fatal failure.");
91013481Sgiacomo.travaglini@arm.com  // Expected non-fatal failure, but got a fatal failure.
91113481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
91213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure.");
91313481Sgiacomo.travaglini@arm.com  // Wrong message.
91413481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
91513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Some other non-fatal "
91613481Sgiacomo.travaglini@arm.com                          "failure.");
91713481Sgiacomo.travaglini@arm.com}
91813481Sgiacomo.travaglini@arm.com
91913481Sgiacomo.travaglini@arm.com#if GTEST_IS_THREADSAFE
92013481Sgiacomo.travaglini@arm.com
92113481Sgiacomo.travaglini@arm.comclass ExpectFailureWithThreadsTest : public ExpectFailureTest {
92213481Sgiacomo.travaglini@arm.com protected:
92313481Sgiacomo.travaglini@arm.com  static void AddFailureInOtherThread(FailureMode failure) {
92413481Sgiacomo.travaglini@arm.com    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
92513481Sgiacomo.travaglini@arm.com    thread.Join();
92613481Sgiacomo.travaglini@arm.com  }
92713481Sgiacomo.travaglini@arm.com};
92813481Sgiacomo.travaglini@arm.com
92913481Sgiacomo.travaglini@arm.comTEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) {
93013481Sgiacomo.travaglini@arm.com  // We only intercept the current thread.
93113481Sgiacomo.travaglini@arm.com  printf("(expecting 2 failures)\n");
93213481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE),
93313481Sgiacomo.travaglini@arm.com                       "Expected fatal failure.");
93413481Sgiacomo.travaglini@arm.com}
93513481Sgiacomo.travaglini@arm.com
93613481Sgiacomo.travaglini@arm.comTEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) {
93713481Sgiacomo.travaglini@arm.com  // We only intercept the current thread.
93813481Sgiacomo.travaglini@arm.com  printf("(expecting 2 failures)\n");
93913481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE),
94013481Sgiacomo.travaglini@arm.com                          "Expected non-fatal failure.");
94113481Sgiacomo.travaglini@arm.com}
94213481Sgiacomo.travaglini@arm.com
94313481Sgiacomo.travaglini@arm.comtypedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest;
94413481Sgiacomo.travaglini@arm.com
94513481Sgiacomo.travaglini@arm.com// Tests that the ScopedFakeTestPartResultReporter only catches failures from
94613481Sgiacomo.travaglini@arm.com// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD.
94713481Sgiacomo.travaglini@arm.comTEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) {
94813481Sgiacomo.travaglini@arm.com  printf("(expecting 2 failures)\n");
94913481Sgiacomo.travaglini@arm.com  TestPartResultArray results;
95013481Sgiacomo.travaglini@arm.com  {
95113481Sgiacomo.travaglini@arm.com    ScopedFakeTestPartResultReporter reporter(
95213481Sgiacomo.travaglini@arm.com        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
95313481Sgiacomo.travaglini@arm.com        &results);
95413481Sgiacomo.travaglini@arm.com    AddFailureInOtherThread(FATAL_FAILURE);
95513481Sgiacomo.travaglini@arm.com    AddFailureInOtherThread(NONFATAL_FAILURE);
95613481Sgiacomo.travaglini@arm.com  }
95713481Sgiacomo.travaglini@arm.com  // The two failures should not have been intercepted.
95813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, results.size()) << "This shouldn't fail.";
95913481Sgiacomo.travaglini@arm.com}
96013481Sgiacomo.travaglini@arm.com
96113481Sgiacomo.travaglini@arm.com#endif  // GTEST_IS_THREADSAFE
96213481Sgiacomo.travaglini@arm.com
96313481Sgiacomo.travaglini@arm.comTEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {
96413481Sgiacomo.travaglini@arm.com  // Expected fatal failure, but succeeds.
96513481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
96613481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected fatal failure.");
96713481Sgiacomo.travaglini@arm.com  // Expected fatal failure, but got a non-fatal failure.
96813481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
96913481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
97013481Sgiacomo.travaglini@arm.com                                      "Expected non-fatal failure.");
97113481Sgiacomo.travaglini@arm.com  // Wrong message.
97213481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
97313481Sgiacomo.travaglini@arm.com  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
97413481Sgiacomo.travaglini@arm.com                                      "Some other fatal failure expected.");
97513481Sgiacomo.travaglini@arm.com}
97613481Sgiacomo.travaglini@arm.com
97713481Sgiacomo.travaglini@arm.comTEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {
97813481Sgiacomo.travaglini@arm.com  // Expected non-fatal failure, but succeeds.
97913481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
98013481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected non-fatal "
98113481Sgiacomo.travaglini@arm.com                                         "failure.");
98213481Sgiacomo.travaglini@arm.com  // Expected non-fatal failure, but got a fatal failure.
98313481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
98413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
98513481Sgiacomo.travaglini@arm.com                                         "Expected fatal failure.");
98613481Sgiacomo.travaglini@arm.com  // Wrong message.
98713481Sgiacomo.travaglini@arm.com  printf("(expecting 1 failure)\n");
98813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
98913481Sgiacomo.travaglini@arm.com                                         "Some other non-fatal failure.");
99013481Sgiacomo.travaglini@arm.com}
99113481Sgiacomo.travaglini@arm.com
99213481Sgiacomo.travaglini@arm.com
99313481Sgiacomo.travaglini@arm.com// Two test environments for testing testing::AddGlobalTestEnvironment().
99413481Sgiacomo.travaglini@arm.com
99513481Sgiacomo.travaglini@arm.comclass FooEnvironment : public testing::Environment {
99613481Sgiacomo.travaglini@arm.com public:
99713481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
99813481Sgiacomo.travaglini@arm.com    printf("%s", "FooEnvironment::SetUp() called.\n");
99913481Sgiacomo.travaglini@arm.com  }
100013481Sgiacomo.travaglini@arm.com
100113481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
100213481Sgiacomo.travaglini@arm.com    printf("%s", "FooEnvironment::TearDown() called.\n");
100313481Sgiacomo.travaglini@arm.com    FAIL() << "Expected fatal failure.";
100413481Sgiacomo.travaglini@arm.com  }
100513481Sgiacomo.travaglini@arm.com};
100613481Sgiacomo.travaglini@arm.com
100713481Sgiacomo.travaglini@arm.comclass BarEnvironment : public testing::Environment {
100813481Sgiacomo.travaglini@arm.com public:
100913481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
101013481Sgiacomo.travaglini@arm.com    printf("%s", "BarEnvironment::SetUp() called.\n");
101113481Sgiacomo.travaglini@arm.com  }
101213481Sgiacomo.travaglini@arm.com
101313481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
101413481Sgiacomo.travaglini@arm.com    printf("%s", "BarEnvironment::TearDown() called.\n");
101513481Sgiacomo.travaglini@arm.com    ADD_FAILURE() << "Expected non-fatal failure.";
101613481Sgiacomo.travaglini@arm.com  }
101713481Sgiacomo.travaglini@arm.com};
101813481Sgiacomo.travaglini@arm.com
101913481Sgiacomo.travaglini@arm.com// The main function.
102013481Sgiacomo.travaglini@arm.com//
102113481Sgiacomo.travaglini@arm.com// The idea is to use Google Test to run all the tests we have defined (some
102213481Sgiacomo.travaglini@arm.com// of them are intended to fail), and then compare the test results
102313481Sgiacomo.travaglini@arm.com// with the "golden" file.
102413481Sgiacomo.travaglini@arm.comint main(int argc, char **argv) {
102513481Sgiacomo.travaglini@arm.com  testing::GTEST_FLAG(print_time) = false;
102613481Sgiacomo.travaglini@arm.com
102713481Sgiacomo.travaglini@arm.com  // We just run the tests, knowing some of them are intended to fail.
102813481Sgiacomo.travaglini@arm.com  // We will use a separate Python script to compare the output of
102913481Sgiacomo.travaglini@arm.com  // this program with the golden file.
103013481Sgiacomo.travaglini@arm.com
103113481Sgiacomo.travaglini@arm.com  // It's hard to test InitGoogleTest() directly, as it has many
103213481Sgiacomo.travaglini@arm.com  // global side effects.  The following line serves as a sanity test
103313481Sgiacomo.travaglini@arm.com  // for it.
103413481Sgiacomo.travaglini@arm.com  testing::InitGoogleTest(&argc, argv);
103513481Sgiacomo.travaglini@arm.com  bool internal_skip_environment_and_ad_hoc_tests =
103613481Sgiacomo.travaglini@arm.com      std::count(argv, argv + argc,
103713481Sgiacomo.travaglini@arm.com                 std::string("internal_skip_environment_and_ad_hoc_tests")) > 0;
103813481Sgiacomo.travaglini@arm.com
103913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_DEATH_TEST
104013481Sgiacomo.travaglini@arm.com  if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") {
104113481Sgiacomo.travaglini@arm.com    // Skip the usual output capturing if we're running as the child
104213481Sgiacomo.travaglini@arm.com    // process of an threadsafe-style death test.
104313481Sgiacomo.travaglini@arm.com# if GTEST_OS_WINDOWS
104413481Sgiacomo.travaglini@arm.com    posix::FReopen("nul:", "w", stdout);
104513481Sgiacomo.travaglini@arm.com# else
104613481Sgiacomo.travaglini@arm.com    posix::FReopen("/dev/null", "w", stdout);
104713481Sgiacomo.travaglini@arm.com# endif  // GTEST_OS_WINDOWS
104813481Sgiacomo.travaglini@arm.com    return RUN_ALL_TESTS();
104913481Sgiacomo.travaglini@arm.com  }
105013481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_DEATH_TEST
105113481Sgiacomo.travaglini@arm.com
105213481Sgiacomo.travaglini@arm.com  if (internal_skip_environment_and_ad_hoc_tests)
105313481Sgiacomo.travaglini@arm.com    return RUN_ALL_TESTS();
105413481Sgiacomo.travaglini@arm.com
105513481Sgiacomo.travaglini@arm.com  // Registers two global test environments.
105613481Sgiacomo.travaglini@arm.com  // The golden file verifies that they are set up in the order they
105713481Sgiacomo.travaglini@arm.com  // are registered, and torn down in the reverse order.
105813481Sgiacomo.travaglini@arm.com  testing::AddGlobalTestEnvironment(new FooEnvironment);
105913481Sgiacomo.travaglini@arm.com  testing::AddGlobalTestEnvironment(new BarEnvironment);
106013481Sgiacomo.travaglini@arm.com
106113481Sgiacomo.travaglini@arm.com  return RunAllTests();
106213481Sgiacomo.travaglini@arm.com}
1063