diff options
Diffstat (limited to 'gtest/test/gtest-death-test_test.cc')
-rw-r--r-- | gtest/test/gtest-death-test_test.cc | 82 |
1 files changed, 32 insertions, 50 deletions
diff --git a/gtest/test/gtest-death-test_test.cc b/gtest/test/gtest-death-test_test.cc index 288c70a..ed5b53b 100644 --- a/gtest/test/gtest-death-test_test.cc +++ b/gtest/test/gtest-death-test_test.cc @@ -103,6 +103,21 @@ class ReplaceDeathTestFactory { } // namespace internal } // namespace testing +void DieInside(const char* function) { + fprintf(stderr, "death inside %s().", function); + fflush(stderr); + // We call _exit() instead of exit(), as the former is a direct + // system call and thus safer in the presence of threads. exit() + // will invoke user-defined exit-hooks, which may do dangerous + // things that conflict with death tests. + // + // Some compilers can recognize that _exit() never returns and issue the + // 'unreachable code' warning for code following this function, unless + // fooled by a fake condition. + if (AlwaysTrue()) + _exit(1); +} + // Tests that death tests work. class TestForDeathTest : public testing::Test { @@ -114,23 +129,12 @@ class TestForDeathTest : public testing::Test { } // A static member function that's expected to die. - static void StaticMemberFunction() { - fprintf(stderr, "%s", "death inside StaticMemberFunction()."); - fflush(stderr); - // We call _exit() instead of exit(), as the former is a direct - // system call and thus safer in the presence of threads. exit() - // will invoke user-defined exit-hooks, which may do dangerous - // things that conflict with death tests. - _exit(1); - } + static void StaticMemberFunction() { DieInside("StaticMemberFunction"); } // A method of the test fixture that may die. void MemberFunction() { - if (should_die_) { - fprintf(stderr, "%s", "death inside MemberFunction()."); - fflush(stderr); - _exit(1); - } + if (should_die_) + DieInside("MemberFunction"); } // True iff MemberFunction() should die. @@ -145,9 +149,8 @@ class MayDie { // A member function that may die. void MemberFunction() const { - if (should_die_) { - GTEST_LOG_(FATAL) << "death inside MayDie::MemberFunction()."; - } + if (should_die_) + DieInside("MayDie::MemberFunction"); } private: @@ -156,27 +159,24 @@ class MayDie { }; // A global function that's expected to die. -void GlobalFunction() { - GTEST_LOG_(FATAL) << "death inside GlobalFunction()."; -} +void GlobalFunction() { DieInside("GlobalFunction"); } // A non-void function that's expected to die. int NonVoidFunction() { - GTEST_LOG_(FATAL) << "death inside NonVoidFunction()."; + DieInside("NonVoidFunction"); return 1; } // A unary function that may die. void DieIf(bool should_die) { - if (should_die) { - GTEST_LOG_(FATAL) << "death inside DieIf()."; - } + if (should_die) + DieInside("DieIf"); } // A binary function that may die. bool DieIfLessThan(int x, int y) { if (x < y) { - GTEST_LOG_(FATAL) << "death inside DieIfLessThan()."; + DieInside("DieIfLessThan"); } return true; } @@ -191,7 +191,7 @@ void DeathTestSubroutine() { int DieInDebugElse12(int* sideeffect) { if (sideeffect) *sideeffect = 12; #ifndef NDEBUG - GTEST_LOG_(FATAL) << "debug death inside DieInDebugElse12()"; + DieInside("DieInDebugElse12"); #endif // NDEBUG return 12; } @@ -410,7 +410,7 @@ void SetPthreadFlag() { } // namespace -#if GTEST_HAS_CLONE +#if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) { if (!testing::GTEST_FLAG(death_test_use_fork)) { @@ -422,7 +422,7 @@ TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) { } } -#endif // GTEST_HAS_CLONE +#endif // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD // Tests that a method of another class can be used in a death test. TEST_F(TestForDeathTest, MethodOfAnotherClass) { @@ -449,10 +449,8 @@ TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) { EXPECT_DEATH(GlobalFunction(), regex_str); #endif // GTEST_HAS_GLOBAL_STRING -#if GTEST_HAS_STD_STRING const ::std::string regex_std_str(regex_c_str); EXPECT_DEATH(GlobalFunction(), regex_std_str); -#endif // GTEST_HAS_STD_STRING } // Tests that a non-void function can be used in a death test. @@ -659,24 +657,6 @@ static void TestExitMacros() { EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), ""); -#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW - // MinGW (as of MinGW 5.1.6 and MSYS 1.0.11) does not tag crashed - // processes with non-zero exit code and does not honor calls to - // SetErrorMode(SEM_NOGPFAULTERRORBOX) that are supposed to suppress - // error pop-ups. - EXPECT_EXIT({ - testing::GTEST_FLAG(catch_exceptions) = false; - *static_cast<int*>(NULL) = 1; - }, testing::ExitedWithCode(0xC0000005), "") << "foo"; - - EXPECT_NONFATAL_FAILURE({ // NOLINT - EXPECT_EXIT({ - testing::GTEST_FLAG(catch_exceptions) = false; - *static_cast<int*>(NULL) = 1; - }, testing::ExitedWithCode(0), "") << "This failure is expected."; - }, "This failure is expected."); -#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW - #if GTEST_OS_WINDOWS // Of all signals effects on the process exit code, only those of SIGABRT // are documented on Windows. @@ -1131,8 +1111,10 @@ TEST(EnvironmentTest, HandleFitsIntoSizeT) { // Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger // failures when death tests are available on the system. TEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) { - EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(false) << "failure", "false.*failure"); - ASSERT_DEATH_IF_SUPPORTED(GTEST_CHECK_(false) << "failure", "false.*failure"); + EXPECT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestExpectMacro"), + "death inside CondDeathTestExpectMacro"); + ASSERT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestAssertMacro"), + "death inside CondDeathTestAssertMacro"); // Empty statement will not crash, which must trigger a failure. EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, ""), ""); |