14b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Copyright 2005, Google Inc.
24b6829f0d28990dd645e16386eb226d0f10c8731shiqian// All rights reserved.
34b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
44b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Redistribution and use in source and binary forms, with or without
54b6829f0d28990dd645e16386eb226d0f10c8731shiqian// modification, are permitted provided that the following conditions are
64b6829f0d28990dd645e16386eb226d0f10c8731shiqian// met:
74b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
84b6829f0d28990dd645e16386eb226d0f10c8731shiqian//     * Redistributions of source code must retain the above copyright
94b6829f0d28990dd645e16386eb226d0f10c8731shiqian// notice, this list of conditions and the following disclaimer.
104b6829f0d28990dd645e16386eb226d0f10c8731shiqian//     * Redistributions in binary form must reproduce the above
114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// copyright notice, this list of conditions and the following disclaimer
124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in the documentation and/or other materials provided with the
134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// distribution.
144b6829f0d28990dd645e16386eb226d0f10c8731shiqian//     * Neither the name of Google Inc. nor the names of its
154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// contributors may be used to endorse or promote products derived from
164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// this software without specific prior written permission.
174b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
294b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
306b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan// The purpose of this file is to generate Google Test output under
316b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan// various conditions.  The output will then be verified by
326b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan// gtest_output_test.py to ensure that Google Test generates the
336b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan// desired messages.  Therefore, most tests in this file are MEANT TO
346b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan// FAIL.
354b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Author: wan@google.com (Zhanyong Wan)
374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
382620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest-spi.h"
392620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest.h"
404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Indicates that this translation unit is part of Google Test's
424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// implementation.  It must come before gtest-internal-inl.h is
434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// included, or there will be a compiler error.  This trick is to
444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// prevent a user from accidentally including gtest-internal-inl.h in
454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// his code.
464cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#define GTEST_IMPLEMENTATION_ 1
474b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "src/gtest-internal-inl.h"
484cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#undef GTEST_IMPLEMENTATION_
494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
504b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <stdlib.h>
514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#if GTEST_IS_THREADSAFE
53e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianusing testing::ScopedFakeTestPartResultReporter;
54e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianusing testing::TestPartResultArray;
55e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
56f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanusing testing::internal::Notification;
57f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanusing testing::internal::ThreadWithParam;
58f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#endif
59f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
60a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wannamespace posix = ::testing::internal::posix;
61f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanusing testing::internal::scoped_ptr;
62e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests catching fatal failures.
644b6829f0d28990dd645e16386eb226d0f10c8731shiqian
654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A subroutine used by the following test.
664b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestEq1(int x) {
674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(1, x);
684b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
694b6829f0d28990dd645e16386eb226d0f10c8731shiqian
704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This function calls a test subroutine, catches the fatal failure it
714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// generates, and then returns early.
724b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TryTestSubroutine() {
734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Calls a subrountine that yields a fatal failure.
744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestEq1(2);
754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Catches the fatal failure and aborts the test.
774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  //
784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // The testing::Test:: prefix is necessary when calling
794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // HasFatalFailure() outside of a TEST, TEST_F, or test fixture.
804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  if (testing::Test::HasFatalFailure()) return;
814b6829f0d28990dd645e16386eb226d0f10c8731shiqian
824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // If we get here, something is wrong.
834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "This should never be reached.";
844b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
86905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST(PassingTest, PassingTest1) {
87905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
88905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
89905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST(PassingTest, PassingTest2) {
90905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
91905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
923a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev// Tests that parameters of failing parameterized tests are printed in the
933a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev// failing test summary.
943a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosevclass FailingParamTest : public testing::TestWithParam<int> {};
953a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev
963a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosevTEST_P(FailingParamTest, Fails) {
973a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev  EXPECT_EQ(1, GetParam());
983a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev}
993a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev
1003a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev// This generates a test which will fail. Google Test is expected to print
1013a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev// its parameter when it outputs the list of all failed tests.
1023a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosevINSTANTIATE_TEST_CASE_P(PrintingFailingParams,
1033a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev                        FailingParamTest,
1043a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev                        testing::Values(2));
1053a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev
1066b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wanstatic const char kGoldenString[] = "\"Line\0 1\"\nLine 2";
1076b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan
1086b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wanTEST(NonfatalFailureTest, EscapesStringOperands) {
1096b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan  std::string actual = "actual \"string\"";
1106b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan  EXPECT_EQ(kGoldenString, actual);
1116b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan
1126b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan  const char* golden = kGoldenString;
1136b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan  EXPECT_EQ(golden, actual);
1146b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan}
1156b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan
116d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comTEST(NonfatalFailureTest, DiffForLongStrings) {
117d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  std::string golden_str(kGoldenString, sizeof(kGoldenString) - 1);
118d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  EXPECT_EQ(golden_str, "Line 2");
119d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com}
120d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com
1214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests catching a fatal failure in a subroutine.
1224b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(FatalFailureTest, FatalFailureInSubroutine) {
1234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure that x should be 1)\n");
1244b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TryTestSubroutine();
1264b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests catching a fatal failure in a nested subroutine.
1294b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(FatalFailureTest, FatalFailureInNestedSubroutine) {
1304b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure that x should be 1)\n");
1314b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Calls a subrountine that yields a fatal failure.
1334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TryTestSubroutine();
1344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Catches the fatal failure and aborts the test.
1364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  //
1374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // When calling HasFatalFailure() inside a TEST, TEST_F, or test
1384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // fixture, the testing::Test:: prefix is not needed.
1394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  if (HasFatalFailure()) return;
1404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // If we get here, something is wrong.
1424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "This should never be reached.";
1434b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests HasFatalFailure() after a failed EXPECT check.
1464b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(FatalFailureTest, NonfatalFailureInSubroutine) {
1474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure on false)\n");
1484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(false);  // Generates a nonfatal failure
1494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_FALSE(HasFatalFailure());  // This should succeed.
1504b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests interleaving user logging and Google Test assertions.
1534b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(LoggingTest, InterleavingLoggingAndAssertions) {
1544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const int a[4] = {
1554b6829f0d28990dd645e16386eb226d0f10c8731shiqian    3, 9, 2, 6
1564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
1574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting 2 failures on (3) >= (a[i]))\n");
1594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) {
1604b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("i == %d\n", i);
1614b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_GE(3, a[i]);
1624b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
1634b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1644b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the SCOPED_TRACE macro.
1664b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A helper function for testing SCOPED_TRACE.
1684b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid SubWithoutTrace(int n) {
1694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n);
1704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(2, n);
1714b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Another helper function for testing SCOPED_TRACE.
1744b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid SubWithTrace(int n) {
1754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SCOPED_TRACE(testing::Message() << "n = " << n);
1764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SubWithoutTrace(n);
1784b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1794b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that SCOPED_TRACE() obeys lexical scopes.
1814b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SCOPED_TRACETest, ObeysScopes) {
1824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expected to fail)\n");
1834b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // There should be no trace before SCOPED_TRACE() is invoked.
1854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
1864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  {
1884b6829f0d28990dd645e16386eb226d0f10c8731shiqian    SCOPED_TRACE("Expected trace");
1894b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // After SCOPED_TRACE(), a failure in the current scope should contain
1904b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // the trace.
1914b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "This failure is expected, and should have a trace.";
1924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
1934b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1944b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Once the control leaves the scope of the SCOPED_TRACE(), there
1954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // should be no trace again.
1964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
1974b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1984b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1994b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that SCOPED_TRACE works inside a loop.
2004b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SCOPED_TRACETest, WorksInLoop) {
2014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expected to fail)\n");
2024b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  for (int i = 1; i <= 2; i++) {
2044b6829f0d28990dd645e16386eb226d0f10c8731shiqian    SCOPED_TRACE(testing::Message() << "i = " << i);
2054b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2064b6829f0d28990dd645e16386eb226d0f10c8731shiqian    SubWithoutTrace(i);
2074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
2084b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
2094b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that SCOPED_TRACE works in a subroutine.
2114b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SCOPED_TRACETest, WorksInSubroutine) {
2124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expected to fail)\n");
2134b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SubWithTrace(1);
2154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SubWithTrace(2);
2164b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
2174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that SCOPED_TRACE can be nested.
2194b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SCOPED_TRACETest, CanBeNested) {
2204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expected to fail)\n");
2214b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SCOPED_TRACE("");  // A trace without a message.
2234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SubWithTrace(2);
2254b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
2264b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that multiple SCOPED_TRACEs can be used in the same scope.
2284b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SCOPED_TRACETest, CanBeRepeated) {
2294b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expected to fail)\n");
2304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SCOPED_TRACE("A");
2324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ADD_FAILURE()
2334b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << "This failure is expected, and should contain trace point A.";
2344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SCOPED_TRACE("B");
2364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ADD_FAILURE()
2374b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << "This failure is expected, and should contain trace point A and B.";
2384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  {
2404b6829f0d28990dd645e16386eb226d0f10c8731shiqian    SCOPED_TRACE("C");
2417a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com    ADD_FAILURE() << "This failure is expected, and should "
2427a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                  << "contain trace point A, B, and C.";
2434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
2444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SCOPED_TRACE("D");
2467a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ADD_FAILURE() << "This failure is expected, and should "
2477a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                << "contain trace point A, B, and D.";
2484b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
2494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
250f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#if GTEST_IS_THREADSAFE
251f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// Tests that SCOPED_TRACE()s can be used concurrently from multiple
252f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// threads.  Namely, an assertion should be affected by
253f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// SCOPED_TRACE()s in its own thread only.
254f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
255f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// Here's the sequence of actions that happen in the test:
256f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//
257f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   Thread A (main)                | Thread B (spawned)
258f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   ===============================|================================
259f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   spawns thread B                |
260f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   -------------------------------+--------------------------------
261f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   waits for n1                   | SCOPED_TRACE("Trace B");
262f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//                                  | generates failure #1
263f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//                                  | notifies n1
264f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   -------------------------------+--------------------------------
265f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   SCOPED_TRACE("Trace A");       | waits for n2
266f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   generates failure #2           |
267f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   notifies n2                    |
268f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   -------------------------------|--------------------------------
269f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   waits for n3                   | generates failure #3
270f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//                                  | trace B dies
271f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//                                  | generates failure #4
272f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//                                  | notifies n3
273f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   -------------------------------|--------------------------------
274f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   generates failure #5           | finishes
275f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   trace A dies                   |
276f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   generates failure #6           |
277f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   -------------------------------|--------------------------------
278f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan//   waits for thread B to finish   |
279f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
280f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanstruct CheckPoints {
281f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  Notification n1;
282f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  Notification n2;
283f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  Notification n3;
284f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan};
285f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
286f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanstatic void ThreadWithScopedTrace(CheckPoints* check_points) {
287f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  {
288f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    SCOPED_TRACE("Trace B");
289f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    ADD_FAILURE()
290f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan        << "Expected failure #1 (in thread B, only trace B alive).";
291f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    check_points->n1.Notify();
292f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    check_points->n2.WaitForNotification();
293f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
294f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    ADD_FAILURE()
295f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan        << "Expected failure #3 (in thread B, trace A & B both alive).";
296f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  }  // Trace B dies here.
297f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  ADD_FAILURE()
298f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan      << "Expected failure #4 (in thread B, only trace A alive).";
299f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  check_points->n3.Notify();
300f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan}
301f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
302f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanTEST(SCOPED_TRACETest, WorksConcurrently) {
303f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  printf("(expecting 6 failures)\n");
304f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
305f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  CheckPoints check_points;
306f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  ThreadWithParam<CheckPoints*> thread(&ThreadWithScopedTrace,
307f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan                                       &check_points,
308f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan                                       NULL);
309f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  check_points.n1.WaitForNotification();
310f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
311f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  {
312f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    SCOPED_TRACE("Trace A");
313f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    ADD_FAILURE()
314f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan        << "Expected failure #2 (in thread A, trace A & B both alive).";
315f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    check_points.n2.Notify();
316f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    check_points.n3.WaitForNotification();
317f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
318f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    ADD_FAILURE()
319f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan        << "Expected failure #5 (in thread A, only trace A alive).";
320f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  }  // Trace A dies here.
321f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  ADD_FAILURE()
322f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan      << "Expected failure #6 (in thread A, no trace alive).";
323f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  thread.Join();
324f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan}
325f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#endif  // GTEST_IS_THREADSAFE
326f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
327ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqianTEST(DisabledTestsWarningTest,
328ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian     DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) {
329ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  // This test body is intentionally empty.  Its sole purpose is for
330ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  // verifying that the --gtest_also_run_disabled_tests flag
331ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  // suppresses the "YOU HAVE 12 DISABLED TESTS" warning at the end of
332ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  // the test output.
333ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian}
334ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
3354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using assertions outside of TEST and TEST_F.
3364b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
3374b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This function creates two failures intentionally.
3384b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid AdHocTest() {
3394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("The non-test part of the code is expected to have 2 failures.\n\n");
3404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(false);
3414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(2, 3);
3424b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
3434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Runs all TESTs, all TEST_Fs, and the ad hoc test.
3454b6829f0d28990dd645e16386eb226d0f10c8731shiqianint RunAllTests() {
3464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  AdHocTest();
3474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return RUN_ALL_TESTS();
3484b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
3494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests non-fatal failures in the fixture constructor.
3514b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass NonFatalFailureInFixtureConstructorTest : public testing::Test {
3524b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
3534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  NonFatalFailureInFixtureConstructorTest() {
3544b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("(expecting 5 failures)\n");
3554b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected failure #1, in the test fixture c'tor.";
3564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
3574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ~NonFatalFailureInFixtureConstructorTest() {
3594b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected failure #5, in the test fixture d'tor.";
3604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
3614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3624b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
3634b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected failure #2, in SetUp().";
3644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
3654b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void TearDown() {
3674b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected failure #4, in TearDown.";
3684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
3694b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
3704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3714b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) {
3724b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ADD_FAILURE() << "Expected failure #3, in the test body.";
3734b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
3744b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests fatal failures in the fixture constructor.
3764b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass FatalFailureInFixtureConstructorTest : public testing::Test {
3774b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
3784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FatalFailureInFixtureConstructorTest() {
3794b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("(expecting 2 failures)\n");
3804b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Init();
3814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
3824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ~FatalFailureInFixtureConstructorTest() {
3844b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected failure #2, in the test fixture d'tor.";
3854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
3864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
3884b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "UNEXPECTED failure in SetUp().  "
3894b6829f0d28990dd645e16386eb226d0f10c8731shiqian                  << "We should never get here, as the test fixture c'tor "
3904b6829f0d28990dd645e16386eb226d0f10c8731shiqian                  << "had a fatal failure.";
3914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
3924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void TearDown() {
3944b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "UNEXPECTED failure in TearDown().  "
3954b6829f0d28990dd645e16386eb226d0f10c8731shiqian                  << "We should never get here, as the test fixture c'tor "
3964b6829f0d28990dd645e16386eb226d0f10c8731shiqian                  << "had a fatal failure.";
3974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
39893fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev
3994b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
4004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void Init() {
4014b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected failure #1, in the test fixture c'tor.";
4024b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4034b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
4044b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4054b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) {
4064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ADD_FAILURE() << "UNEXPECTED failure in the test body.  "
4074b6829f0d28990dd645e16386eb226d0f10c8731shiqian                << "We should never get here, as the test fixture c'tor "
4084b6829f0d28990dd645e16386eb226d0f10c8731shiqian                << "had a fatal failure.";
4094b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
4104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests non-fatal failures in SetUp().
4124b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass NonFatalFailureInSetUpTest : public testing::Test {
4134b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
4144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual ~NonFatalFailureInSetUpTest() {
4154b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Deinit();
4164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
4194b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("(expecting 4 failures)\n");
4204b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected failure #1, in SetUp().";
4214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void TearDown() {
4244b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected failure #3, in TearDown().";
4254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4264b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
4274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void Deinit() {
4284b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected failure #4, in the test fixture d'tor.";
4294b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4304b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
4314b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4324b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) {
4334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "Expected failure #2, in the test function.";
4344b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
4354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests fatal failures in SetUp().
4374b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass FatalFailureInSetUpTest : public testing::Test {
4384b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
4394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual ~FatalFailureInSetUpTest() {
4404b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Deinit();
4414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
4444b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("(expecting 3 failures)\n");
4454b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected failure #1, in SetUp().";
4464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void TearDown() {
4494b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected failure #2, in TearDown().";
4504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4514b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
4524b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void Deinit() {
4534b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected failure #3, in the test fixture d'tor.";
4544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
4554b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
4564b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4574b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FatalFailureInSetUpTest, FailureInSetUp) {
4584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "UNEXPECTED failure in the test function.  "
4594b6829f0d28990dd645e16386eb226d0f10c8731shiqian         << "We should never get here, as SetUp() failed.";
4604b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
4614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
462d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wanTEST(AddFailureAtTest, MessageContainsSpecifiedFileAndLineNumber) {
463d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  ADD_FAILURE_AT("foo.cc", 42) << "Expected failure in foo.cc";
464d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan}
465d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan
466f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#if GTEST_IS_THREADSAFE
467f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
468f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// A unary function that may die.
469f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanvoid DieIf(bool should_die) {
470f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  GTEST_CHECK_(!should_die) << " - death inside DieIf().";
471f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan}
472f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
473f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// Tests running death tests in a multi-threaded context.
474f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
475f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// Used for coordination between the main and the spawn thread.
476f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanstruct SpawnThreadNotifications {
477f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  SpawnThreadNotifications() {}
478f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
479f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  Notification spawn_thread_started;
480f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  Notification spawn_thread_ok_to_terminate;
481f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
482f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan private:
483f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications);
484f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan};
485f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
486f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// The function to be executed in the thread spawn by the
487f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// MultipleThreads test (below).
488f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanstatic void ThreadRoutine(SpawnThreadNotifications* notifications) {
489f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  // Signals the main thread that this thread has started.
490f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  notifications->spawn_thread_started.Notify();
491f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
492f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  // Waits for permission to finish from the main thread.
493f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  notifications->spawn_thread_ok_to_terminate.WaitForNotification();
494f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan}
495f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
496f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// This is a death-test test, but it's not named with a DeathTest
497f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// suffix.  It starts threads which might interfere with later
498f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan// death tests, so it must run after all other death tests.
499f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanclass DeathTestAndMultiThreadsTest : public testing::Test {
500f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan protected:
501f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  // Starts a thread and waits for it to begin.
502f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  virtual void SetUp() {
503f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    thread_.reset(new ThreadWithParam<SpawnThreadNotifications*>(
504f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan        &ThreadRoutine, &notifications_, NULL));
505f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    notifications_.spawn_thread_started.WaitForNotification();
506f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  }
507f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  // Tells the thread to finish, and reaps it.
508f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  // Depending on the version of the thread library in use,
509f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  // a manager thread might still be left running that will interfere
510f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  // with later death tests.  This is unfortunate, but this class
511f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  // cleans up after itself as best it can.
512f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  virtual void TearDown() {
513f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    notifications_.spawn_thread_ok_to_terminate.Notify();
514f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  }
515f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
516f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan private:
517f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  SpawnThreadNotifications notifications_;
518f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan  scoped_ptr<ThreadWithParam<SpawnThreadNotifications*> > thread_;
519f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan};
520f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
521f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#endif  // GTEST_IS_THREADSAFE
522f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
5234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The MixedUpTestCaseTest test case verifies that Google Test will fail a
5244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test if it uses a different fixture class than what other tests in
5254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the same test case use.  It deliberately contains two fixture
5264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// classes with the same name but defined in different namespaces.
5274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The MixedUpTestCaseWithSameTestNameTest test case verifies that
5294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// when the user defines two tests with the same test case name AND
5304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// same test name (but in different namespaces), the second test will
5314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// fail.
5324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5334b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace foo {
5344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5354b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MixedUpTestCaseTest : public testing::Test {
5364b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
5374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5384b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {}
5394b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {}
5404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5414b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MixedUpTestCaseWithSameTestNameTest : public testing::Test {
5424b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
5434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5444b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MixedUpTestCaseWithSameTestNameTest,
5454b6829f0d28990dd645e16386eb226d0f10c8731shiqian       TheSecondTestWithThisNameShouldFail) {}
5464b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5474b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace foo
5484b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5494b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace bar {
5504b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5514b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MixedUpTestCaseTest : public testing::Test {
5524b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
5534b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5544b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The following two tests are expected to fail.  We rely on the
5554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// golden file to check that Google Test generates the right error message.
5564b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MixedUpTestCaseTest, ThisShouldFail) {}
5574b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {}
5584b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5594b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MixedUpTestCaseWithSameTestNameTest : public testing::Test {
5604b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
5614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Expected to fail.  We rely on the golden file to check that Google Test
5634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// generates the right error message.
5644b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MixedUpTestCaseWithSameTestNameTest,
5654b6829f0d28990dd645e16386eb226d0f10c8731shiqian       TheSecondTestWithThisNameShouldFail) {}
5664b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5674b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace bar
5684b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The following two test cases verify that Google Test catches the user
5704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// error of mixing TEST and TEST_F in the same test case.  The first
5714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test case checks the scenario where TEST_F appears before TEST, and
5724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the second one checks where TEST appears before TEST_F.
5734b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5744b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass TEST_F_before_TEST_in_same_test_case : public testing::Test {
5754b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
5764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5774b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {}
5784b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Expected to fail.  We rely on the golden file to check that Google Test
5804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// generates the right error message.
5814b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {}
5824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5834b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass TEST_before_TEST_F_in_same_test_case : public testing::Test {
5844b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
5854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5864b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {}
5874b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Expected to fail.  We rely on the golden file to check that Google Test
5894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// generates the right error message.
5904b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) {
5914b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
5924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE().
5944b6829f0d28990dd645e16386eb226d0f10c8731shiqianint global_integer = 0;
5954b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables.
5974b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) {
5984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  global_integer = 0;
5994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({
6004b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(1, global_integer) << "Expected non-fatal failure.";
6014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "Expected non-fatal failure.");
6024b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables
6054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (static or not).
6064b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) {
6074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int m = 0;
6084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static int n;
6094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  n = 1;
6104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({
6114b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(m, n) << "Expected non-fatal failure.";
6124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "Expected non-fatal failure.");
6134b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6144b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly
6164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// one non-fatal failure and no fatal failure.
6174b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) {
6184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({
6194b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected non-fatal failure.";
6204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "Expected non-fatal failure.");
6214b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no
6244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// non-fatal failure.
6254b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) {
6264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
6274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({
6284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
6294b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two
6324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// non-fatal failures.
6334b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) {
6344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
6354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({
6364b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected non-fatal failure 1.";
6374b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected non-fatal failure 2.";
6384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
6394b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal
6424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// failure.
6434b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) {
6444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
6454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({
6464b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected fatal failure.";
6474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
6484b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
6514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// tested returns.
6524b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) {
6534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
6544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({
6554b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return;
6564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
6574b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6584b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6594b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_EXCEPTIONS
6604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
6624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// tested throws.
6634b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) {
6644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
6654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  try {
6664b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_NONFATAL_FAILURE({
6674b6829f0d28990dd645e16386eb226d0f10c8731shiqian      throw 0;
6684b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }, "");
6694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  } catch(int) {  // NOLINT
6704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
6714b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6734b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_HAS_EXCEPTIONS
6744b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_FATAL_FAILURE() can reference global variables.
6764b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) {
6774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  global_integer = 0;
6784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({
6794b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_EQ(1, global_integer) << "Expected fatal failure.";
6804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "Expected fatal failure.");
6814b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_FATAL_FAILURE() can reference local static
6844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// variables.
6854b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) {
6864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static int n;
6874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  n = 1;
6884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({
6894b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_EQ(0, n) << "Expected fatal failure.";
6904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "Expected fatal failure.");
6914b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly
6944b6829f0d28990dd645e16386eb226d0f10c8731shiqian// one fatal failure and no non-fatal failure.
6954b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) {
6964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({
6974b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected fatal failure.";
6984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "Expected fatal failure.");
6994b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
7004b6829f0d28990dd645e16386eb226d0f10c8731shiqian
7014b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal
7024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// failure.
7034b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) {
7044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
7054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({
7064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
7074b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
7084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
7094b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A helper for generating a fatal failure.
7104b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid FatalFailure() {
7114b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "Expected fatal failure.";
7124b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
7134b6829f0d28990dd645e16386eb226d0f10c8731shiqian
7144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_FATAL_FAILURE() fails when there are two
7154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// fatal failures.
7164b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) {
7174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
7184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({
7194b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FatalFailure();
7204b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FatalFailure();
7214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
7224b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
7234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
7244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal
7254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// failure.
7264b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) {
7274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
7284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({
7294b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected non-fatal failure.";
7304b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
7314b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
7324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
7334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
7344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// tested returns.
7354b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectFatalFailureTest, FailsWhenStatementReturns) {
7364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
7374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({
7384b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return;
7394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
7404b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
7414b6829f0d28990dd645e16386eb226d0f10c8731shiqian
7424b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_EXCEPTIONS
7434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
7444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
7454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// tested throws.
7464b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {
7474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting a failure)\n");
7484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  try {
7494b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_FATAL_FAILURE({
7504b6829f0d28990dd645e16386eb226d0f10c8731shiqian      throw 0;
7514b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }, "");
7524b6829f0d28990dd645e16386eb226d0f10c8731shiqian  } catch(int) {  // NOLINT
7534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
7544b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
7554b6829f0d28990dd645e16386eb226d0f10c8731shiqian
7564b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_HAS_EXCEPTIONS
7574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
758e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// This #ifdef block tests the output of typed tests.
7594cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_TYPED_TEST
760e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
761e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <typename T>
762e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass TypedTest : public testing::Test {
763e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian};
764e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
765e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_CASE(TypedTest, testing::Types<int>);
766e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
767e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST(TypedTest, Success) {
768e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  EXPECT_EQ(0, TypeParam());
769e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
770e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
771e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST(TypedTest, Failure) {
772e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  EXPECT_EQ(1, TypeParam()) << "Expected failure";
773e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
774e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
775e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#endif  // GTEST_HAS_TYPED_TEST
776e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
777e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// This #ifdef block tests the output of type-parameterized tests.
7784cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_TYPED_TEST_P
779e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
780e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <typename T>
781e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass TypedTestP : public testing::Test {
782e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian};
783e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
784e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_CASE_P(TypedTestP);
785e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
786e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_P(TypedTestP, Success) {
787a773ef8a3b70936450c94bdcba1e6345a980244ezhanyong.wan  EXPECT_EQ(0U, TypeParam());
788e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
789e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
790e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_P(TypedTestP, Failure) {
791a773ef8a3b70936450c94bdcba1e6345a980244ezhanyong.wan  EXPECT_EQ(1U, TypeParam()) << "Expected failure";
792e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
793e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
794e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianREGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure);
795e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
796e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantypedef testing::Types<unsigned char, unsigned int> UnsignedTypes;
797e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianINSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes);
798e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
799e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#endif  // GTEST_HAS_TYPED_TEST_P
800e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
8014cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_DEATH_TEST
802e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
803e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// We rely on the golden file to verify that tests whose test case
804e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// name ends with DeathTest are run first.
805e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
806e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTEST(ADeathTest, ShouldRunFirst) {
807e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
808e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
809733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_HAS_TYPED_TEST
810e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
811e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// We rely on the golden file to verify that typed tests whose test
812e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// case name ends with DeathTest are run first.
813e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
814e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <typename T>
815e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass ATypedDeathTest : public testing::Test {
816e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian};
817e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
818e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantypedef testing::Types<int, double> NumericTypes;
819e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_CASE(ATypedDeathTest, NumericTypes);
820e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
821e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST(ATypedDeathTest, ShouldRunFirst) {
822e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
823e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
824733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif  // GTEST_HAS_TYPED_TEST
825e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
826733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_HAS_TYPED_TEST_P
827e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
828e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
829e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// We rely on the golden file to verify that type-parameterized tests
830e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// whose test case name ends with DeathTest are run first.
831e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
832e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <typename T>
833e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass ATypeParamDeathTest : public testing::Test {
834e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian};
835e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
836e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_CASE_P(ATypeParamDeathTest);
837e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
838e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) {
839e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
840e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
841e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianREGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst);
842e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
843e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianINSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes);
844e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
845733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif  // GTEST_HAS_TYPED_TEST_P
846e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
847e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#endif  // GTEST_HAS_DEATH_TEST
848e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
849e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Tests various failure conditions of
850e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}.
851e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianclass ExpectFailureTest : public testing::Test {
852acd0f32c50622ace5eb0c62b38820981c1ecd1e9tsunanet public:  // Must be public and not protected due to a bug in g++ 3.4.2.
853e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  enum FailureMode {
854e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    FATAL_FAILURE,
855e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    NONFATAL_FAILURE
856e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  };
857e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  static void AddFailure(FailureMode failure) {
858e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    if (failure == FATAL_FAILURE) {
859e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      FAIL() << "Expected fatal failure.";
860e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    } else {
861e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      ADD_FAILURE() << "Expected non-fatal failure.";
862e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    }
863e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
864e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian};
865e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
866e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ExpectFailureTest, ExpectFatalFailure) {
867e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Expected fatal failure, but succeeds.
868e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
869e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE(SUCCEED(), "Expected fatal failure.");
870e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Expected fatal failure, but got a non-fatal failure.
871e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
872e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Expected non-fatal "
873e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                       "failure.");
874e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Wrong message.
875e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
876e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Some other fatal failure "
877e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                       "expected.");
878e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
879e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
880e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ExpectFailureTest, ExpectNonFatalFailure) {
881e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Expected non-fatal failure, but succeeds.
882e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
883e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE(SUCCEED(), "Expected non-fatal failure.");
884e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Expected non-fatal failure, but got a fatal failure.
885e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
886e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure.");
887e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Wrong message.
888e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
889e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Some other non-fatal "
890e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                          "failure.");
891e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
892e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
893f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#if GTEST_IS_THREADSAFE
894e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
895e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianclass ExpectFailureWithThreadsTest : public ExpectFailureTest {
896e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian protected:
897e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  static void AddFailureInOtherThread(FailureMode failure) {
898f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
899f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    thread.Join();
900e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
901e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian};
902e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
903e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) {
904e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // We only intercept the current thread.
905e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 2 failures)\n");
906e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE),
907e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                       "Expected fatal failure.");
908e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
909e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
910e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) {
911e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // We only intercept the current thread.
912e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 2 failures)\n");
913e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE),
914e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                          "Expected non-fatal failure.");
915e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
916e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
917e44602ec83c65102035ce5304ae8de0cb16e9e56shiqiantypedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest;
918e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
919e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Tests that the ScopedFakeTestPartResultReporter only catches failures from
920e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD.
921e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) {
922e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 2 failures)\n");
923e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  TestPartResultArray results;
924e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  {
925e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ScopedFakeTestPartResultReporter reporter(
926e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
927e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        &results);
928e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailureInOtherThread(FATAL_FAILURE);
929e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailureInOtherThread(NONFATAL_FAILURE);
930e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
931e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // The two failures should not have been intercepted.
932e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_EQ(0, results.size()) << "This shouldn't fail.";
933e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
934e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
935f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#endif  // GTEST_IS_THREADSAFE
936e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
937e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {
938e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Expected fatal failure, but succeeds.
939e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
940e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected fatal failure.");
941e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Expected fatal failure, but got a non-fatal failure.
942e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
943e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
944e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                                      "Expected non-fatal failure.");
945e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Wrong message.
946e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
947e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
948e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                                      "Some other fatal failure expected.");
949e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
950e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
951e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {
952e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Expected non-fatal failure, but succeeds.
953e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
954e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected non-fatal "
955e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                                         "failure.");
956e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Expected non-fatal failure, but got a fatal failure.
957e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
958e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
959e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                                         "Expected fatal failure.");
960e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Wrong message.
961e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  printf("(expecting 1 failure)\n");
962e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
963e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                                         "Some other non-fatal failure.");
964e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
965e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
966e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
9674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Two test environments for testing testing::AddGlobalTestEnvironment().
9684b6829f0d28990dd645e16386eb226d0f10c8731shiqian
9694b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass FooEnvironment : public testing::Environment {
9704b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
9714b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
9724b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("%s", "FooEnvironment::SetUp() called.\n");
9734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
9744b6829f0d28990dd645e16386eb226d0f10c8731shiqian
9754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void TearDown() {
9764b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("%s", "FooEnvironment::TearDown() called.\n");
9774b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Expected fatal failure.";
9784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
9794b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
9804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
9814b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass BarEnvironment : public testing::Environment {
9824b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
9834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
9844b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("%s", "BarEnvironment::SetUp() called.\n");
9854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
9864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
9874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void TearDown() {
9884b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("%s", "BarEnvironment::TearDown() called.\n");
9894b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ADD_FAILURE() << "Expected non-fatal failure.";
9904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
9914b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
9924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
9932c2e3bb07ff5bfef9b90617c9eaa6003fb482e6fvladlosevbool GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = false;
994e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
9954b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The main function.
9964b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
9974b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The idea is to use Google Test to run all the tests we have defined (some
9984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// of them are intended to fail), and then compare the test results
9994b6829f0d28990dd645e16386eb226d0f10c8731shiqian// with the "golden" file.
10004b6829f0d28990dd645e16386eb226d0f10c8731shiqianint main(int argc, char **argv) {
100173ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan  testing::GTEST_FLAG(print_time) = false;
100273ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan
10034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // We just run the tests, knowing some of them are intended to fail.
10044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // We will use a separate Python script to compare the output of
10054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // this program with the golden file.
1006cfdfeeb3964b84f6e248b84a259aaee54cde14f3zhanyong.wan
1007cfdfeeb3964b84f6e248b84a259aaee54cde14f3zhanyong.wan  // It's hard to test InitGoogleTest() directly, as it has many
1008cfdfeeb3964b84f6e248b84a259aaee54cde14f3zhanyong.wan  // global side effects.  The following line serves as a sanity test
1009cfdfeeb3964b84f6e248b84a259aaee54cde14f3zhanyong.wan  // for it.
10104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  testing::InitGoogleTest(&argc, argv);
1011e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  if (argc >= 2 &&
101203c314931649a999b0cf5deb0a434a1009157416jgm@google.com      (std::string(argv[1]) ==
101303c314931649a999b0cf5deb0a434a1009157416jgm@google.com       "--gtest_internal_skip_environment_and_ad_hoc_tests"))
1014e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan    GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true;
10154b6829f0d28990dd645e16386eb226d0f10c8731shiqian
10164cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_DEATH_TEST
10174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") {
10184b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Skip the usual output capturing if we're running as the child
10194b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // process of an threadsafe-style death test.
1020733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS
1021c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan    posix::FReopen("nul:", "w", stdout);
1022733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else
1023c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan    posix::FReopen("/dev/null", "w", stdout);
1024733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif  // GTEST_OS_WINDOWS
10254b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return RUN_ALL_TESTS();
10264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
10274b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_HAS_DEATH_TEST
10284b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1029e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests))
1030e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan    return RUN_ALL_TESTS();
1031e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
10324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Registers two global test environments.
10334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // The golden file verifies that they are set up in the order they
10344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // are registered, and torn down in the reverse order.
10354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  testing::AddGlobalTestEnvironment(new FooEnvironment);
10364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  testing::AddGlobalTestEnvironment(new BarEnvironment);
10374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
10384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return RunAllTests();
10394b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1040