Merge branch 'master' into disabled-rtti
This commit is contained in:
		
						commit
						9db942a6b7
					
				| @ -198,7 +198,7 @@ class GTEST_API_ ExitedWithCode { | ||||
|   const int exit_code_; | ||||
| }; | ||||
| 
 | ||||
| # if !GTEST_OS_WINDOWS | ||||
| # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA | ||||
| // Tests that an exit code describes an exit due to termination by a
 | ||||
| // given signal.
 | ||||
| class GTEST_API_ KilledBySignal { | ||||
|  | ||||
| @ -172,6 +172,7 @@ class TestEventListenersAccessor; | ||||
| class TestEventRepeater; | ||||
| class UnitTestRecordPropertyTestHelper; | ||||
| class WindowsDeathTest; | ||||
| class FuchsiaDeathTest; | ||||
| class UnitTestImpl* GetUnitTestImpl(); | ||||
| void ReportFailureInUnknownLocation(TestPartResult::Type result_type, | ||||
|                                     const std::string& message); | ||||
| @ -593,6 +594,7 @@ class GTEST_API_ TestResult { | ||||
|   friend class internal::TestResultAccessor; | ||||
|   friend class internal::UnitTestImpl; | ||||
|   friend class internal::WindowsDeathTest; | ||||
|   friend class internal::FuchsiaDeathTest; | ||||
| 
 | ||||
|   // Gets the vector of TestPartResults.
 | ||||
|   const std::vector<TestPartResult>& test_part_results() const { | ||||
|  | ||||
| @ -813,7 +813,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; | ||||
|      (GTEST_OS_MAC && !GTEST_OS_IOS) ||                         \ | ||||
|      (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) ||          \ | ||||
|      GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \ | ||||
|      GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || GTEST_OS_NETBSD) | ||||
|      GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD ||    \ | ||||
|      GTEST_OS_NETBSD || GTEST_OS_FUCHSIA) | ||||
| # define GTEST_HAS_DEATH_TEST 1 | ||||
| #endif | ||||
| 
 | ||||
|  | ||||
| @ -62,6 +62,12 @@ | ||||
| #  include <spawn.h> | ||||
| # endif  // GTEST_OS_QNX
 | ||||
| 
 | ||||
| # if GTEST_OS_FUCHSIA | ||||
| #  include <fdio/io.h> | ||||
| #  include <launchpad/launchpad.h> | ||||
| #  include <zircon/syscalls.h> | ||||
| # endif  // GTEST_OS_FUCHSIA
 | ||||
| 
 | ||||
| #endif  // GTEST_HAS_DEATH_TEST
 | ||||
| 
 | ||||
| #include "gtest/gtest-message.h" | ||||
| @ -127,10 +133,10 @@ static bool g_in_fast_death_test_child = false; | ||||
| // tests.  IMPORTANT: This is an internal utility.  Using it may break the
 | ||||
| // implementation of death tests.  User code MUST NOT use it.
 | ||||
| bool InDeathTestChild() { | ||||
| # if GTEST_OS_WINDOWS | ||||
| # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA | ||||
| 
 | ||||
|   // On Windows, death tests are thread-safe regardless of the value of the
 | ||||
|   // death_test_style flag.
 | ||||
|   // On Windows and Fuchsia, death tests are thread-safe regardless of the value
 | ||||
|   // of the death_test_style flag.
 | ||||
|   return !GTEST_FLAG(internal_run_death_test).empty(); | ||||
| 
 | ||||
| # else | ||||
| @ -150,7 +156,7 @@ ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) { | ||||
| 
 | ||||
| // ExitedWithCode function-call operator.
 | ||||
| bool ExitedWithCode::operator()(int exit_status) const { | ||||
| # if GTEST_OS_WINDOWS | ||||
| # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA | ||||
| 
 | ||||
|   return exit_status == exit_code_; | ||||
| 
 | ||||
| @ -158,10 +164,10 @@ bool ExitedWithCode::operator()(int exit_status) const { | ||||
| 
 | ||||
|   return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_; | ||||
| 
 | ||||
| # endif  // GTEST_OS_WINDOWS
 | ||||
| # endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
 | ||||
| } | ||||
| 
 | ||||
| # if !GTEST_OS_WINDOWS | ||||
| # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA | ||||
| // KilledBySignal constructor.
 | ||||
| KilledBySignal::KilledBySignal(int signum) : signum_(signum) { | ||||
| } | ||||
| @ -189,7 +195,7 @@ namespace internal { | ||||
| static std::string ExitSummary(int exit_code) { | ||||
|   Message m; | ||||
| 
 | ||||
| # if GTEST_OS_WINDOWS | ||||
| # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA | ||||
| 
 | ||||
|   m << "Exited with exit status " << exit_code; | ||||
| 
 | ||||
| @ -205,7 +211,7 @@ static std::string ExitSummary(int exit_code) { | ||||
|     m << " (core dumped)"; | ||||
|   } | ||||
| #  endif | ||||
| # endif  // GTEST_OS_WINDOWS
 | ||||
| # endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
 | ||||
| 
 | ||||
|   return m.GetString(); | ||||
| } | ||||
| @ -216,7 +222,7 @@ bool ExitedUnsuccessfully(int exit_status) { | ||||
|   return !ExitedWithCode(0)(exit_status); | ||||
| } | ||||
| 
 | ||||
| # if !GTEST_OS_WINDOWS | ||||
| # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA | ||||
| // Generates a textual failure message when a death test finds more than
 | ||||
| // one thread running, or cannot determine the number of threads, prior
 | ||||
| // to executing the given statement.  It is the responsibility of the
 | ||||
| @ -231,7 +237,7 @@ static std::string DeathTestThreadWarning(size_t thread_count) { | ||||
|     msg << "detected " << thread_count << " threads."; | ||||
|   return msg.GetString(); | ||||
| } | ||||
| # endif  // !GTEST_OS_WINDOWS
 | ||||
| # endif  // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
 | ||||
| 
 | ||||
| // Flag characters for reporting a death test that did not die.
 | ||||
| static const char kDeathTestLived = 'L'; | ||||
| @ -239,6 +245,13 @@ static const char kDeathTestReturned = 'R'; | ||||
| static const char kDeathTestThrew = 'T'; | ||||
| static const char kDeathTestInternalError = 'I'; | ||||
| 
 | ||||
| #if GTEST_OS_FUCHSIA | ||||
| 
 | ||||
| // File descriptor used for the pipe in the child process.
 | ||||
| static const int kFuchsiaReadPipeFd = 3; | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| // An enumeration describing all of the possible ways that a death test can
 | ||||
| // conclude.  DIED means that the process died while executing the test
 | ||||
| // code; LIVED means that process lived beyond the end of the test code;
 | ||||
| @ -781,7 +794,168 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() { | ||||
|   set_spawned(true); | ||||
|   return OVERSEE_TEST; | ||||
| } | ||||
| # else  // We are not on Windows.
 | ||||
| 
 | ||||
| # elif GTEST_OS_FUCHSIA | ||||
| 
 | ||||
| class FuchsiaDeathTest : public DeathTestImpl { | ||||
|  public: | ||||
|   FuchsiaDeathTest(const char* a_statement, | ||||
|                    const RE* a_regex, | ||||
|                    const char* file, | ||||
|                    int line) | ||||
|       : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {} | ||||
| 
 | ||||
|   // All of these virtual functions are inherited from DeathTest.
 | ||||
|   virtual int Wait(); | ||||
|   virtual TestRole AssumeRole(); | ||||
| 
 | ||||
|  private: | ||||
|   // The name of the file in which the death test is located.
 | ||||
|   const char* const file_; | ||||
|   // The line number on which the death test is located.
 | ||||
|   const int line_; | ||||
| 
 | ||||
|   zx_handle_t child_process_; | ||||
| }; | ||||
| 
 | ||||
| // Utility class for accumulating command-line arguments.
 | ||||
| class Arguments { | ||||
|  public: | ||||
|   Arguments() { | ||||
|     args_.push_back(NULL); | ||||
|   } | ||||
| 
 | ||||
|   ~Arguments() { | ||||
|     for (std::vector<char*>::iterator i = args_.begin(); i != args_.end(); | ||||
|          ++i) { | ||||
|       free(*i); | ||||
|     } | ||||
|   } | ||||
|   void AddArgument(const char* argument) { | ||||
|     args_.insert(args_.end() - 1, posix::StrDup(argument)); | ||||
|   } | ||||
| 
 | ||||
|   template <typename Str> | ||||
|   void AddArguments(const ::std::vector<Str>& arguments) { | ||||
|     for (typename ::std::vector<Str>::const_iterator i = arguments.begin(); | ||||
|          i != arguments.end(); | ||||
|          ++i) { | ||||
|       args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); | ||||
|     } | ||||
|   } | ||||
|   char* const* Argv() { | ||||
|     return &args_[0]; | ||||
|   } | ||||
| 
 | ||||
|   int size() { | ||||
|     return args_.size() - 1; | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   std::vector<char*> args_; | ||||
| }; | ||||
| 
 | ||||
| // Waits for the child in a death test to exit, returning its exit
 | ||||
| // status, or 0 if no child process exists.  As a side effect, sets the
 | ||||
| // outcome data member.
 | ||||
| int FuchsiaDeathTest::Wait() { | ||||
|   if (!spawned()) | ||||
|     return 0; | ||||
| 
 | ||||
|   // Wait for child process to terminate.
 | ||||
|   zx_status_t status_zx; | ||||
|   zx_signals_t signals; | ||||
|   status_zx = zx_object_wait_one( | ||||
|       child_process_, | ||||
|       ZX_PROCESS_TERMINATED, | ||||
|       ZX_TIME_INFINITE, | ||||
|       &signals); | ||||
|   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); | ||||
| 
 | ||||
|   ReadAndInterpretStatusByte(); | ||||
| 
 | ||||
|   zx_info_process_t buffer; | ||||
|   status_zx = zx_object_get_info( | ||||
|       child_process_, | ||||
|       ZX_INFO_PROCESS, | ||||
|       &buffer, | ||||
|       sizeof(buffer), | ||||
|       nullptr, | ||||
|       nullptr); | ||||
|   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); | ||||
| 
 | ||||
|   GTEST_DEATH_TEST_CHECK_(buffer.exited); | ||||
|   set_status(buffer.return_code); | ||||
|   return status(); | ||||
| } | ||||
| 
 | ||||
| // The AssumeRole process for a Fuchsia death test.  It creates a child
 | ||||
| // process with the same executable as the current process to run the
 | ||||
| // death test.  The child process is given the --gtest_filter and
 | ||||
| // --gtest_internal_run_death_test flags such that it knows to run the
 | ||||
| // current death test only.
 | ||||
| DeathTest::TestRole FuchsiaDeathTest::AssumeRole() { | ||||
|   const UnitTestImpl* const impl = GetUnitTestImpl(); | ||||
|   const InternalRunDeathTestFlag* const flag = | ||||
|       impl->internal_run_death_test_flag(); | ||||
|   const TestInfo* const info = impl->current_test_info(); | ||||
|   const int death_test_index = info->result()->death_test_count(); | ||||
| 
 | ||||
|   if (flag != NULL) { | ||||
|     // ParseInternalRunDeathTestFlag() has performed all the necessary
 | ||||
|     // processing.
 | ||||
|     set_write_fd(kFuchsiaReadPipeFd); | ||||
|     return EXECUTE_TEST; | ||||
|   } | ||||
| 
 | ||||
|   CaptureStderr(); | ||||
|   // Flush the log buffers since the log streams are shared with the child.
 | ||||
|   FlushInfoLog(); | ||||
| 
 | ||||
|   // Build the child process command line.
 | ||||
|   const std::string filter_flag = | ||||
|       std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" | ||||
|       + info->test_case_name() + "." + info->name(); | ||||
|   const std::string internal_flag = | ||||
|       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "=" | ||||
|       + file_ + "|" | ||||
|       + StreamableToString(line_) + "|" | ||||
|       + StreamableToString(death_test_index); | ||||
|   Arguments args; | ||||
|   args.AddArguments(GetInjectableArgvs()); | ||||
|   args.AddArgument(filter_flag.c_str()); | ||||
|   args.AddArgument(internal_flag.c_str()); | ||||
| 
 | ||||
|   // Build the child process launcher.
 | ||||
|   zx_status_t status; | ||||
|   launchpad_t* lp; | ||||
|   status = launchpad_create(ZX_HANDLE_INVALID, args.Argv()[0], &lp); | ||||
|   GTEST_DEATH_TEST_CHECK_(status == ZX_OK); | ||||
| 
 | ||||
|   // Build the pipe for communication with the child.
 | ||||
|   int read_fd; | ||||
|   status = launchpad_add_pipe(lp, &read_fd, kFuchsiaReadPipeFd); | ||||
|   GTEST_DEATH_TEST_CHECK_(status == ZX_OK); | ||||
|   set_read_fd(read_fd); | ||||
| 
 | ||||
|   // Set the command line arguments.
 | ||||
|   status = launchpad_load_from_file(lp, args.Argv()[0]); | ||||
|   GTEST_DEATH_TEST_CHECK_(status == ZX_OK); | ||||
|   status = launchpad_set_args(lp, args.size(), args.Argv()); | ||||
|   GTEST_DEATH_TEST_CHECK_(status == ZX_OK); | ||||
| 
 | ||||
|   // Clone all the things (environment, stdio, namespace, ...).
 | ||||
|   launchpad_clone(lp, LP_CLONE_ALL); | ||||
| 
 | ||||
|   // Launch the child process.
 | ||||
|   status = launchpad_go(lp, &child_process_, nullptr); | ||||
|   GTEST_DEATH_TEST_CHECK_(status == ZX_OK); | ||||
| 
 | ||||
|   set_spawned(true); | ||||
|   return OVERSEE_TEST; | ||||
| } | ||||
| 
 | ||||
| #else  // We are neither on Windows, nor on Fuchsia.
 | ||||
| 
 | ||||
| // ForkingDeathTest provides implementations for most of the abstract
 | ||||
| // methods of the DeathTest interface.  Only the AssumeRole method is
 | ||||
| @ -1204,6 +1378,13 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex, | ||||
|     *test = new WindowsDeathTest(statement, regex, file, line); | ||||
|   } | ||||
| 
 | ||||
| # elif GTEST_OS_FUCHSIA | ||||
| 
 | ||||
|   if (GTEST_FLAG(death_test_style) == "threadsafe" || | ||||
|       GTEST_FLAG(death_test_style) == "fast") { | ||||
|     *test = new FuchsiaDeathTest(statement, regex, file, line); | ||||
|   } | ||||
| 
 | ||||
| # else | ||||
| 
 | ||||
|   if (GTEST_FLAG(death_test_style) == "threadsafe") { | ||||
| @ -1324,6 +1505,16 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() { | ||||
|   write_fd = GetStatusFileDescriptor(parent_process_id, | ||||
|                                      write_handle_as_size_t, | ||||
|                                      event_handle_as_size_t); | ||||
| 
 | ||||
| # elif GTEST_OS_FUCHSIA | ||||
| 
 | ||||
|   if (fields.size() != 3 | ||||
|       || !ParseNaturalNumber(fields[1], &line) | ||||
|       || !ParseNaturalNumber(fields[2], &index)) { | ||||
|     DeathTestAbort("Bad --gtest_internal_run_death_test flag: " | ||||
|         + GTEST_FLAG(internal_run_death_test)); | ||||
|   } | ||||
| 
 | ||||
| # else | ||||
| 
 | ||||
|   if (fields.size() != 4 | ||||
|  | ||||
| @ -63,6 +63,11 @@ | ||||
| # include <sys/types.h> | ||||
| #endif  // GTEST_OS_AIX
 | ||||
| 
 | ||||
| #if GTEST_OS_FUCHSIA | ||||
| # include <zircon/process.h> | ||||
| # include <zircon/syscalls.h> | ||||
| #endif  // GTEST_OS_FUCHSIA
 | ||||
| 
 | ||||
| #include "gtest/gtest-spi.h" | ||||
| #include "gtest/gtest-message.h" | ||||
| #include "gtest/internal/gtest-internal.h" | ||||
| @ -156,6 +161,25 @@ size_t GetThreadCount() { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| #elif GTEST_OS_FUCHSIA | ||||
| 
 | ||||
| size_t GetThreadCount() { | ||||
|   int dummy_buffer; | ||||
|   size_t avail; | ||||
|   zx_status_t status = zx_object_get_info( | ||||
|       zx_process_self(), | ||||
|       ZX_INFO_PROCESS_THREADS, | ||||
|       &dummy_buffer, | ||||
|       0, | ||||
|       nullptr, | ||||
|       &avail); | ||||
|   if (status == ZX_OK) { | ||||
|     return avail; | ||||
|   } else { | ||||
|     return 0; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| size_t GetThreadCount() { | ||||
|  | ||||
| @ -5340,11 +5340,15 @@ OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { | ||||
|   return os_stack_trace_getter_; | ||||
| } | ||||
| 
 | ||||
| // Returns the TestResult for the test that's currently running, or
 | ||||
| // the TestResult for the ad hoc test if no test is running.
 | ||||
| // Returns the most specific TestResult currently running.
 | ||||
| TestResult* UnitTestImpl::current_test_result() { | ||||
|   return current_test_info_ ? | ||||
|       &(current_test_info_->result_) : &ad_hoc_test_result_; | ||||
|   if (current_test_info_ != NULL) { | ||||
|     return ¤t_test_info_->result_; | ||||
|   } | ||||
|   if (current_test_case_ != NULL) { | ||||
|     return ¤t_test_case_->ad_hoc_test_result_; | ||||
|   } | ||||
|   return &ad_hoc_test_result_; | ||||
| } | ||||
| 
 | ||||
| // Shuffles all test cases, and the tests within each test case,
 | ||||
|  | ||||
| @ -200,7 +200,7 @@ int DieInDebugElse12(int* sideeffect) { | ||||
|   return 12; | ||||
| } | ||||
| 
 | ||||
| # if GTEST_OS_WINDOWS | ||||
| # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA | ||||
| 
 | ||||
| // Tests the ExitedWithCode predicate.
 | ||||
| TEST(ExitStatusPredicateTest, ExitedWithCode) { | ||||
| @ -272,7 +272,7 @@ TEST(ExitStatusPredicateTest, KilledBySignal) { | ||||
|   EXPECT_FALSE(pred_kill(status_segv)); | ||||
| } | ||||
| 
 | ||||
| # endif  // GTEST_OS_WINDOWS
 | ||||
| # endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
 | ||||
| 
 | ||||
| // Tests that the death test macros expand to code which may or may not
 | ||||
| // be followed by operator<<, and that in either case the complete text
 | ||||
| @ -787,8 +787,9 @@ static void TestExitMacros() { | ||||
|   // See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx.
 | ||||
|   EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "") << "b_ar"; | ||||
| 
 | ||||
| # else | ||||
| # elif !GTEST_OS_FUCHSIA | ||||
| 
 | ||||
|   // Fuchsia has no unix signals.
 | ||||
|   EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo"; | ||||
|   ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar"; | ||||
| 
 | ||||
|  | ||||
| @ -103,6 +103,8 @@ TEST(OutputFileHelpersTest, GetCurrentExecutableName) { | ||||
|       _strcmpi("gtest-options-ex_test", exe_str.c_str()) == 0 || | ||||
|       _strcmpi("gtest_all_test", exe_str.c_str()) == 0 || | ||||
|       _strcmpi("gtest_dll_test", exe_str.c_str()) == 0; | ||||
| #elif GTEST_OS_FUCHSIA | ||||
|   const bool success = exe_str == "app"; | ||||
| #else | ||||
|   // TODO(wan@google.com): remove the hard-coded "lt-" prefix when
 | ||||
|   //   Chandler Carruth's libtool replacement is ready.
 | ||||
| @ -116,6 +118,8 @@ TEST(OutputFileHelpersTest, GetCurrentExecutableName) { | ||||
|     FAIL() << "GetCurrentExecutableName() returns " << exe_str; | ||||
| } | ||||
| 
 | ||||
| #if !GTEST_OS_FUCHSIA | ||||
| 
 | ||||
| class XmlOutputChangeDirTest : public Test { | ||||
|  protected: | ||||
|   virtual void SetUp() { | ||||
| @ -202,6 +206,8 @@ TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) { | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| #endif  // !GTEST_OS_FUCHSIA
 | ||||
| 
 | ||||
| }  // namespace
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
|  | ||||
| @ -296,7 +296,7 @@ TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) { | ||||
|   EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(NULL, -1)); | ||||
| } | ||||
| 
 | ||||
| #if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_QNX | ||||
| #if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_QNX || GTEST_OS_FUCHSIA | ||||
| void* ThreadFunc(void* data) { | ||||
|   internal::Mutex* mutex = static_cast<internal::Mutex*>(data); | ||||
|   mutex->Lock(); | ||||
| @ -340,7 +340,7 @@ TEST(GetThreadCountTest, ReturnsCorrectValue) { | ||||
| TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) { | ||||
|   EXPECT_EQ(0U, GetThreadCount()); | ||||
| } | ||||
| #endif  // GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_QNX
 | ||||
| #endif  // GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_QNX || GTEST_OS_FUCHSIA
 | ||||
| 
 | ||||
| TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) { | ||||
|   const bool a_false_condition = false; | ||||
|  | ||||
| @ -7748,3 +7748,25 @@ TEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) { | ||||
|   EXPECT_FALSE(SkipPrefix("world!", &p)); | ||||
|   EXPECT_EQ(str, p); | ||||
| } | ||||
| 
 | ||||
| // Tests ad_hoc_test_result().
 | ||||
| 
 | ||||
| class AdHocTestResultTest : public testing::Test { | ||||
|  protected: | ||||
|   static void SetUpTestCase() { | ||||
|     FAIL() << "A failure happened inside SetUpTestCase()."; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| TEST_F(AdHocTestResultTest, AdHocTestResultForTestCaseShowsFailure) { | ||||
|   const testing::TestResult& test_result = testing::UnitTest::GetInstance() | ||||
|                                                ->current_test_case() | ||||
|                                                ->ad_hoc_test_result(); | ||||
|   EXPECT_TRUE(test_result.Failed()); | ||||
| } | ||||
| 
 | ||||
| TEST_F(AdHocTestResultTest, AdHocTestResultTestForUnitTestDoesNotShowFailure) { | ||||
|   const testing::TestResult& test_result = | ||||
|       testing::UnitTest::GetInstance()->ad_hoc_test_result(); | ||||
|   EXPECT_FALSE(test_result.Failed()); | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user