1b89a7cc2SEnji Cooper // Copyright 2005, Google Inc. 2b89a7cc2SEnji Cooper // All rights reserved. 3b89a7cc2SEnji Cooper // 4b89a7cc2SEnji Cooper // Redistribution and use in source and binary forms, with or without 5b89a7cc2SEnji Cooper // modification, are permitted provided that the following conditions are 6b89a7cc2SEnji Cooper // met: 7b89a7cc2SEnji Cooper // 8b89a7cc2SEnji Cooper // * Redistributions of source code must retain the above copyright 9b89a7cc2SEnji Cooper // notice, this list of conditions and the following disclaimer. 10b89a7cc2SEnji Cooper // * Redistributions in binary form must reproduce the above 11b89a7cc2SEnji Cooper // copyright notice, this list of conditions and the following disclaimer 12b89a7cc2SEnji Cooper // in the documentation and/or other materials provided with the 13b89a7cc2SEnji Cooper // distribution. 14b89a7cc2SEnji Cooper // * Neither the name of Google Inc. nor the names of its 15b89a7cc2SEnji Cooper // contributors may be used to endorse or promote products derived from 16b89a7cc2SEnji Cooper // this software without specific prior written permission. 17b89a7cc2SEnji Cooper // 18b89a7cc2SEnji Cooper // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19b89a7cc2SEnji Cooper // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20b89a7cc2SEnji Cooper // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21b89a7cc2SEnji Cooper // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22b89a7cc2SEnji Cooper // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23b89a7cc2SEnji Cooper // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24b89a7cc2SEnji Cooper // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25b89a7cc2SEnji Cooper // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26b89a7cc2SEnji Cooper // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27b89a7cc2SEnji Cooper // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28b89a7cc2SEnji Cooper // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29b89a7cc2SEnji Cooper 30b89a7cc2SEnji Cooper // 31b89a7cc2SEnji Cooper // Tests for death tests. 32b89a7cc2SEnji Cooper 33b89a7cc2SEnji Cooper #include "gtest/gtest-death-test.h" 34b89a7cc2SEnji Cooper #include "gtest/gtest.h" 35b89a7cc2SEnji Cooper #include "gtest/internal/gtest-filepath.h" 36b89a7cc2SEnji Cooper 37b89a7cc2SEnji Cooper using testing::internal::AlwaysFalse; 38b89a7cc2SEnji Cooper using testing::internal::AlwaysTrue; 39b89a7cc2SEnji Cooper 40*28f6c2f2SEnji Cooper #ifdef GTEST_HAS_DEATH_TEST 41b89a7cc2SEnji Cooper 42*28f6c2f2SEnji Cooper #ifdef GTEST_OS_WINDOWS 43b89a7cc2SEnji Cooper #include <direct.h> // For chdir(). 44*28f6c2f2SEnji Cooper #include <fcntl.h> // For O_BINARY 45*28f6c2f2SEnji Cooper #include <io.h> 46b89a7cc2SEnji Cooper #else 47b89a7cc2SEnji Cooper #include <sys/wait.h> // For waitpid. 48*28f6c2f2SEnji Cooper #include <unistd.h> 49b89a7cc2SEnji Cooper #endif // GTEST_OS_WINDOWS 50b89a7cc2SEnji Cooper 51b89a7cc2SEnji Cooper #include <limits.h> 52b89a7cc2SEnji Cooper #include <signal.h> 53b89a7cc2SEnji Cooper #include <stdio.h> 54b89a7cc2SEnji Cooper 55*28f6c2f2SEnji Cooper #include <string> 56*28f6c2f2SEnji Cooper #include <vector> 57*28f6c2f2SEnji Cooper 58*28f6c2f2SEnji Cooper #ifdef GTEST_OS_LINUX 59b89a7cc2SEnji Cooper #include <sys/time.h> 60b89a7cc2SEnji Cooper #endif // GTEST_OS_LINUX 61b89a7cc2SEnji Cooper 62b89a7cc2SEnji Cooper #include "gtest/gtest-spi.h" 63b89a7cc2SEnji Cooper #include "src/gtest-internal-inl.h" 64b89a7cc2SEnji Cooper 65b89a7cc2SEnji Cooper namespace posix = ::testing::internal::posix; 66b89a7cc2SEnji Cooper 67*28f6c2f2SEnji Cooper using testing::ContainsRegex; 68*28f6c2f2SEnji Cooper using testing::Matcher; 69b89a7cc2SEnji Cooper using testing::Message; 70b89a7cc2SEnji Cooper using testing::internal::DeathTest; 71b89a7cc2SEnji Cooper using testing::internal::DeathTestFactory; 72b89a7cc2SEnji Cooper using testing::internal::FilePath; 73b89a7cc2SEnji Cooper using testing::internal::GetLastErrnoDescription; 74b89a7cc2SEnji Cooper using testing::internal::GetUnitTestImpl; 75b89a7cc2SEnji Cooper using testing::internal::InDeathTestChild; 76b89a7cc2SEnji Cooper using testing::internal::ParseNaturalNumber; 77b89a7cc2SEnji Cooper 78b89a7cc2SEnji Cooper namespace testing { 79b89a7cc2SEnji Cooper namespace internal { 80b89a7cc2SEnji Cooper 81b89a7cc2SEnji Cooper // A helper class whose objects replace the death test factory for a 82b89a7cc2SEnji Cooper // single UnitTest object during their lifetimes. 83b89a7cc2SEnji Cooper class ReplaceDeathTestFactory { 84b89a7cc2SEnji Cooper public: 85b89a7cc2SEnji Cooper explicit ReplaceDeathTestFactory(DeathTestFactory* new_factory) 86b89a7cc2SEnji Cooper : unit_test_impl_(GetUnitTestImpl()) { 87b89a7cc2SEnji Cooper old_factory_ = unit_test_impl_->death_test_factory_.release(); 88b89a7cc2SEnji Cooper unit_test_impl_->death_test_factory_.reset(new_factory); 89b89a7cc2SEnji Cooper } 90b89a7cc2SEnji Cooper 91b89a7cc2SEnji Cooper ~ReplaceDeathTestFactory() { 92b89a7cc2SEnji Cooper unit_test_impl_->death_test_factory_.release(); 93b89a7cc2SEnji Cooper unit_test_impl_->death_test_factory_.reset(old_factory_); 94b89a7cc2SEnji Cooper } 95*28f6c2f2SEnji Cooper 96b89a7cc2SEnji Cooper private: 97b89a7cc2SEnji Cooper // Prevents copying ReplaceDeathTestFactory objects. 98b89a7cc2SEnji Cooper ReplaceDeathTestFactory(const ReplaceDeathTestFactory&); 99b89a7cc2SEnji Cooper void operator=(const ReplaceDeathTestFactory&); 100b89a7cc2SEnji Cooper 101b89a7cc2SEnji Cooper UnitTestImpl* unit_test_impl_; 102b89a7cc2SEnji Cooper DeathTestFactory* old_factory_; 103b89a7cc2SEnji Cooper }; 104b89a7cc2SEnji Cooper 105b89a7cc2SEnji Cooper } // namespace internal 106b89a7cc2SEnji Cooper } // namespace testing 107b89a7cc2SEnji Cooper 108*28f6c2f2SEnji Cooper namespace { 109*28f6c2f2SEnji Cooper 110b89a7cc2SEnji Cooper void DieWithMessage(const ::std::string& message) { 111b89a7cc2SEnji Cooper fprintf(stderr, "%s", message.c_str()); 112b89a7cc2SEnji Cooper fflush(stderr); // Make sure the text is printed before the process exits. 113b89a7cc2SEnji Cooper 114b89a7cc2SEnji Cooper // We call _exit() instead of exit(), as the former is a direct 115b89a7cc2SEnji Cooper // system call and thus safer in the presence of threads. exit() 116b89a7cc2SEnji Cooper // will invoke user-defined exit-hooks, which may do dangerous 117b89a7cc2SEnji Cooper // things that conflict with death tests. 118b89a7cc2SEnji Cooper // 119b89a7cc2SEnji Cooper // Some compilers can recognize that _exit() never returns and issue the 120b89a7cc2SEnji Cooper // 'unreachable code' warning for code following this function, unless 121b89a7cc2SEnji Cooper // fooled by a fake condition. 122*28f6c2f2SEnji Cooper if (AlwaysTrue()) _exit(1); 123b89a7cc2SEnji Cooper } 124b89a7cc2SEnji Cooper 125b89a7cc2SEnji Cooper void DieInside(const ::std::string& function) { 126b89a7cc2SEnji Cooper DieWithMessage("death inside " + function + "()."); 127b89a7cc2SEnji Cooper } 128b89a7cc2SEnji Cooper 129b89a7cc2SEnji Cooper // Tests that death tests work. 130b89a7cc2SEnji Cooper 131b89a7cc2SEnji Cooper class TestForDeathTest : public testing::Test { 132b89a7cc2SEnji Cooper protected: 133b89a7cc2SEnji Cooper TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {} 134b89a7cc2SEnji Cooper 135*28f6c2f2SEnji Cooper ~TestForDeathTest() override { posix::ChDir(original_dir_.c_str()); } 136b89a7cc2SEnji Cooper 137b89a7cc2SEnji Cooper // A static member function that's expected to die. 138b89a7cc2SEnji Cooper static void StaticMemberFunction() { DieInside("StaticMemberFunction"); } 139b89a7cc2SEnji Cooper 140b89a7cc2SEnji Cooper // A method of the test fixture that may die. 141b89a7cc2SEnji Cooper void MemberFunction() { 142*28f6c2f2SEnji Cooper if (should_die_) DieInside("MemberFunction"); 143b89a7cc2SEnji Cooper } 144b89a7cc2SEnji Cooper 145*28f6c2f2SEnji Cooper // True if and only if MemberFunction() should die. 146b89a7cc2SEnji Cooper bool should_die_; 147b89a7cc2SEnji Cooper const FilePath original_dir_; 148b89a7cc2SEnji Cooper }; 149b89a7cc2SEnji Cooper 150b89a7cc2SEnji Cooper // A class with a member function that may die. 151b89a7cc2SEnji Cooper class MayDie { 152b89a7cc2SEnji Cooper public: 153b89a7cc2SEnji Cooper explicit MayDie(bool should_die) : should_die_(should_die) {} 154b89a7cc2SEnji Cooper 155b89a7cc2SEnji Cooper // A member function that may die. 156b89a7cc2SEnji Cooper void MemberFunction() const { 157*28f6c2f2SEnji Cooper if (should_die_) DieInside("MayDie::MemberFunction"); 158b89a7cc2SEnji Cooper } 159b89a7cc2SEnji Cooper 160b89a7cc2SEnji Cooper private: 161*28f6c2f2SEnji Cooper // True if and only if MemberFunction() should die. 162b89a7cc2SEnji Cooper bool should_die_; 163b89a7cc2SEnji Cooper }; 164b89a7cc2SEnji Cooper 165b89a7cc2SEnji Cooper // A global function that's expected to die. 166b89a7cc2SEnji Cooper void GlobalFunction() { DieInside("GlobalFunction"); } 167b89a7cc2SEnji Cooper 168b89a7cc2SEnji Cooper // A non-void function that's expected to die. 169b89a7cc2SEnji Cooper int NonVoidFunction() { 170b89a7cc2SEnji Cooper DieInside("NonVoidFunction"); 171b89a7cc2SEnji Cooper return 1; 172b89a7cc2SEnji Cooper } 173b89a7cc2SEnji Cooper 174b89a7cc2SEnji Cooper // A unary function that may die. 175b89a7cc2SEnji Cooper void DieIf(bool should_die) { 176*28f6c2f2SEnji Cooper if (should_die) DieInside("DieIf"); 177b89a7cc2SEnji Cooper } 178b89a7cc2SEnji Cooper 179b89a7cc2SEnji Cooper // A binary function that may die. 180b89a7cc2SEnji Cooper bool DieIfLessThan(int x, int y) { 181b89a7cc2SEnji Cooper if (x < y) { 182b89a7cc2SEnji Cooper DieInside("DieIfLessThan"); 183b89a7cc2SEnji Cooper } 184b89a7cc2SEnji Cooper return true; 185b89a7cc2SEnji Cooper } 186b89a7cc2SEnji Cooper 187b89a7cc2SEnji Cooper // Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture. 188b89a7cc2SEnji Cooper void DeathTestSubroutine() { 189b89a7cc2SEnji Cooper EXPECT_DEATH(GlobalFunction(), "death.*GlobalFunction"); 190b89a7cc2SEnji Cooper ASSERT_DEATH(GlobalFunction(), "death.*GlobalFunction"); 191b89a7cc2SEnji Cooper } 192b89a7cc2SEnji Cooper 193b89a7cc2SEnji Cooper // Death in dbg, not opt. 194b89a7cc2SEnji Cooper int DieInDebugElse12(int* sideeffect) { 195b89a7cc2SEnji Cooper if (sideeffect) *sideeffect = 12; 196b89a7cc2SEnji Cooper 197b89a7cc2SEnji Cooper #ifndef NDEBUG 198b89a7cc2SEnji Cooper 199b89a7cc2SEnji Cooper DieInside("DieInDebugElse12"); 200b89a7cc2SEnji Cooper 201b89a7cc2SEnji Cooper #endif // NDEBUG 202b89a7cc2SEnji Cooper 203b89a7cc2SEnji Cooper return 12; 204b89a7cc2SEnji Cooper } 205b89a7cc2SEnji Cooper 206*28f6c2f2SEnji Cooper #ifdef GTEST_OS_WINDOWS 207*28f6c2f2SEnji Cooper 208*28f6c2f2SEnji Cooper // Death in dbg due to Windows CRT assertion failure, not opt. 209*28f6c2f2SEnji Cooper int DieInCRTDebugElse12(int* sideeffect) { 210*28f6c2f2SEnji Cooper if (sideeffect) *sideeffect = 12; 211*28f6c2f2SEnji Cooper 212*28f6c2f2SEnji Cooper // Create an invalid fd by closing a valid one 213*28f6c2f2SEnji Cooper int fdpipe[2]; 214*28f6c2f2SEnji Cooper EXPECT_EQ(_pipe(fdpipe, 256, O_BINARY), 0); 215*28f6c2f2SEnji Cooper EXPECT_EQ(_close(fdpipe[0]), 0); 216*28f6c2f2SEnji Cooper EXPECT_EQ(_close(fdpipe[1]), 0); 217*28f6c2f2SEnji Cooper 218*28f6c2f2SEnji Cooper // _dup() should crash in debug mode 219*28f6c2f2SEnji Cooper EXPECT_EQ(_dup(fdpipe[0]), -1); 220*28f6c2f2SEnji Cooper 221*28f6c2f2SEnji Cooper return 12; 222*28f6c2f2SEnji Cooper } 223*28f6c2f2SEnji Cooper 224*28f6c2f2SEnji Cooper #endif // GTEST_OS_WINDOWS 225*28f6c2f2SEnji Cooper 226*28f6c2f2SEnji Cooper #if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_FUCHSIA) 227b89a7cc2SEnji Cooper 228b89a7cc2SEnji Cooper // Tests the ExitedWithCode predicate. 229b89a7cc2SEnji Cooper TEST(ExitStatusPredicateTest, ExitedWithCode) { 230b89a7cc2SEnji Cooper // On Windows, the process's exit code is the same as its exit status, 231b89a7cc2SEnji Cooper // so the predicate just compares the its input with its parameter. 232b89a7cc2SEnji Cooper EXPECT_TRUE(testing::ExitedWithCode(0)(0)); 233b89a7cc2SEnji Cooper EXPECT_TRUE(testing::ExitedWithCode(1)(1)); 234b89a7cc2SEnji Cooper EXPECT_TRUE(testing::ExitedWithCode(42)(42)); 235b89a7cc2SEnji Cooper EXPECT_FALSE(testing::ExitedWithCode(0)(1)); 236b89a7cc2SEnji Cooper EXPECT_FALSE(testing::ExitedWithCode(1)(0)); 237b89a7cc2SEnji Cooper } 238b89a7cc2SEnji Cooper 239b89a7cc2SEnji Cooper #else 240b89a7cc2SEnji Cooper 241b89a7cc2SEnji Cooper // Returns the exit status of a process that calls _exit(2) with a 242b89a7cc2SEnji Cooper // given exit code. This is a helper function for the 243b89a7cc2SEnji Cooper // ExitStatusPredicateTest test suite. 244b89a7cc2SEnji Cooper static int NormalExitStatus(int exit_code) { 245b89a7cc2SEnji Cooper pid_t child_pid = fork(); 246b89a7cc2SEnji Cooper if (child_pid == 0) { 247b89a7cc2SEnji Cooper _exit(exit_code); 248b89a7cc2SEnji Cooper } 249b89a7cc2SEnji Cooper int status; 250b89a7cc2SEnji Cooper waitpid(child_pid, &status, 0); 251b89a7cc2SEnji Cooper return status; 252b89a7cc2SEnji Cooper } 253b89a7cc2SEnji Cooper 254b89a7cc2SEnji Cooper // Returns the exit status of a process that raises a given signal. 255b89a7cc2SEnji Cooper // If the signal does not cause the process to die, then it returns 256b89a7cc2SEnji Cooper // instead the exit status of a process that exits normally with exit 257b89a7cc2SEnji Cooper // code 1. This is a helper function for the ExitStatusPredicateTest 258b89a7cc2SEnji Cooper // test suite. 259b89a7cc2SEnji Cooper static int KilledExitStatus(int signum) { 260b89a7cc2SEnji Cooper pid_t child_pid = fork(); 261b89a7cc2SEnji Cooper if (child_pid == 0) { 262b89a7cc2SEnji Cooper raise(signum); 263b89a7cc2SEnji Cooper _exit(1); 264b89a7cc2SEnji Cooper } 265b89a7cc2SEnji Cooper int status; 266b89a7cc2SEnji Cooper waitpid(child_pid, &status, 0); 267b89a7cc2SEnji Cooper return status; 268b89a7cc2SEnji Cooper } 269b89a7cc2SEnji Cooper 270b89a7cc2SEnji Cooper // Tests the ExitedWithCode predicate. 271b89a7cc2SEnji Cooper TEST(ExitStatusPredicateTest, ExitedWithCode) { 272b89a7cc2SEnji Cooper const int status0 = NormalExitStatus(0); 273b89a7cc2SEnji Cooper const int status1 = NormalExitStatus(1); 274b89a7cc2SEnji Cooper const int status42 = NormalExitStatus(42); 275b89a7cc2SEnji Cooper const testing::ExitedWithCode pred0(0); 276b89a7cc2SEnji Cooper const testing::ExitedWithCode pred1(1); 277b89a7cc2SEnji Cooper const testing::ExitedWithCode pred42(42); 278b89a7cc2SEnji Cooper EXPECT_PRED1(pred0, status0); 279b89a7cc2SEnji Cooper EXPECT_PRED1(pred1, status1); 280b89a7cc2SEnji Cooper EXPECT_PRED1(pred42, status42); 281b89a7cc2SEnji Cooper EXPECT_FALSE(pred0(status1)); 282b89a7cc2SEnji Cooper EXPECT_FALSE(pred42(status0)); 283b89a7cc2SEnji Cooper EXPECT_FALSE(pred1(status42)); 284b89a7cc2SEnji Cooper } 285b89a7cc2SEnji Cooper 286b89a7cc2SEnji Cooper // Tests the KilledBySignal predicate. 287b89a7cc2SEnji Cooper TEST(ExitStatusPredicateTest, KilledBySignal) { 288b89a7cc2SEnji Cooper const int status_segv = KilledExitStatus(SIGSEGV); 289b89a7cc2SEnji Cooper const int status_kill = KilledExitStatus(SIGKILL); 290b89a7cc2SEnji Cooper const testing::KilledBySignal pred_segv(SIGSEGV); 291b89a7cc2SEnji Cooper const testing::KilledBySignal pred_kill(SIGKILL); 292b89a7cc2SEnji Cooper EXPECT_PRED1(pred_segv, status_segv); 293b89a7cc2SEnji Cooper EXPECT_PRED1(pred_kill, status_kill); 294b89a7cc2SEnji Cooper EXPECT_FALSE(pred_segv(status_kill)); 295b89a7cc2SEnji Cooper EXPECT_FALSE(pred_kill(status_segv)); 296b89a7cc2SEnji Cooper } 297b89a7cc2SEnji Cooper 298b89a7cc2SEnji Cooper #endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA 299b89a7cc2SEnji Cooper 300*28f6c2f2SEnji Cooper // The following code intentionally tests a suboptimal syntax. 301*28f6c2f2SEnji Cooper #ifdef __GNUC__ 302*28f6c2f2SEnji Cooper #pragma GCC diagnostic push 303*28f6c2f2SEnji Cooper #pragma GCC diagnostic ignored "-Wdangling-else" 304*28f6c2f2SEnji Cooper #pragma GCC diagnostic ignored "-Wempty-body" 305*28f6c2f2SEnji Cooper #pragma GCC diagnostic ignored "-Wpragmas" 306*28f6c2f2SEnji Cooper #endif 307b89a7cc2SEnji Cooper // Tests that the death test macros expand to code which may or may not 308b89a7cc2SEnji Cooper // be followed by operator<<, and that in either case the complete text 309b89a7cc2SEnji Cooper // comprises only a single C++ statement. 310b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, SingleStatement) { 311b89a7cc2SEnji Cooper if (AlwaysFalse()) 312b89a7cc2SEnji Cooper // This would fail if executed; this is a compilation test only 313b89a7cc2SEnji Cooper ASSERT_DEATH(return, ""); 314b89a7cc2SEnji Cooper 315b89a7cc2SEnji Cooper if (AlwaysTrue()) 316b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), ""); 317b89a7cc2SEnji Cooper else 318b89a7cc2SEnji Cooper // This empty "else" branch is meant to ensure that EXPECT_DEATH 319b89a7cc2SEnji Cooper // doesn't expand into an "if" statement without an "else" 320b89a7cc2SEnji Cooper ; 321b89a7cc2SEnji Cooper 322*28f6c2f2SEnji Cooper if (AlwaysFalse()) ASSERT_DEATH(return, "") << "did not die"; 323b89a7cc2SEnji Cooper 324b89a7cc2SEnji Cooper if (AlwaysFalse()) 325b89a7cc2SEnji Cooper ; 326b89a7cc2SEnji Cooper else 327b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), "") << 1 << 2 << 3; 328b89a7cc2SEnji Cooper } 329*28f6c2f2SEnji Cooper #ifdef __GNUC__ 330*28f6c2f2SEnji Cooper #pragma GCC diagnostic pop 331*28f6c2f2SEnji Cooper #endif 332b89a7cc2SEnji Cooper 333b89a7cc2SEnji Cooper // Tests that death test macros expand to code which interacts well with switch 334b89a7cc2SEnji Cooper // statements. 335b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, SwitchStatement) { 336b89a7cc2SEnji Cooper // Microsoft compiler usually complains about switch statements without 337b89a7cc2SEnji Cooper // case labels. We suppress that warning for this test. 338b89a7cc2SEnji Cooper GTEST_DISABLE_MSC_WARNINGS_PUSH_(4065) 339b89a7cc2SEnji Cooper 340b89a7cc2SEnji Cooper switch (0) 341b89a7cc2SEnji Cooper default: 342b89a7cc2SEnji Cooper ASSERT_DEATH(_exit(1), "") << "exit in default switch handler"; 343b89a7cc2SEnji Cooper 344b89a7cc2SEnji Cooper switch (0) 345b89a7cc2SEnji Cooper case 0: 346b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), "") << "exit in switch case"; 347b89a7cc2SEnji Cooper 348b89a7cc2SEnji Cooper GTEST_DISABLE_MSC_WARNINGS_POP_() 349b89a7cc2SEnji Cooper } 350b89a7cc2SEnji Cooper 351b89a7cc2SEnji Cooper // Tests that a static member function can be used in a "fast" style 352b89a7cc2SEnji Cooper // death test. 353b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) { 354*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 355b89a7cc2SEnji Cooper ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember"); 356b89a7cc2SEnji Cooper } 357b89a7cc2SEnji Cooper 358b89a7cc2SEnji Cooper // Tests that a method of the test fixture can be used in a "fast" 359b89a7cc2SEnji Cooper // style death test. 360b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, MemberFunctionFastStyle) { 361*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 362b89a7cc2SEnji Cooper should_die_ = true; 363b89a7cc2SEnji Cooper EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction"); 364b89a7cc2SEnji Cooper } 365b89a7cc2SEnji Cooper 366b89a7cc2SEnji Cooper void ChangeToRootDir() { posix::ChDir(GTEST_PATH_SEP_); } 367b89a7cc2SEnji Cooper 368b89a7cc2SEnji Cooper // Tests that death tests work even if the current directory has been 369b89a7cc2SEnji Cooper // changed. 370b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, FastDeathTestInChangedDir) { 371*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 372b89a7cc2SEnji Cooper 373b89a7cc2SEnji Cooper ChangeToRootDir(); 374b89a7cc2SEnji Cooper EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); 375b89a7cc2SEnji Cooper 376b89a7cc2SEnji Cooper ChangeToRootDir(); 377b89a7cc2SEnji Cooper ASSERT_DEATH(_exit(1), ""); 378b89a7cc2SEnji Cooper } 379b89a7cc2SEnji Cooper 380*28f6c2f2SEnji Cooper #ifdef GTEST_OS_LINUX 381*28f6c2f2SEnji Cooper void SigprofAction(int, siginfo_t*, void*) { /* no op */ 382*28f6c2f2SEnji Cooper } 383b89a7cc2SEnji Cooper 384b89a7cc2SEnji Cooper // Sets SIGPROF action and ITIMER_PROF timer (interval: 1ms). 385b89a7cc2SEnji Cooper void SetSigprofActionAndTimer() { 386b89a7cc2SEnji Cooper struct sigaction signal_action; 387b89a7cc2SEnji Cooper memset(&signal_action, 0, sizeof(signal_action)); 388b89a7cc2SEnji Cooper sigemptyset(&signal_action.sa_mask); 389b89a7cc2SEnji Cooper signal_action.sa_sigaction = SigprofAction; 390b89a7cc2SEnji Cooper signal_action.sa_flags = SA_RESTART | SA_SIGINFO; 391*28f6c2f2SEnji Cooper ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, nullptr)); 392*28f6c2f2SEnji Cooper // timer comes second, to avoid SIGPROF premature delivery, as suggested at 393*28f6c2f2SEnji Cooper // https://www.gnu.org/software/libc/manual/html_node/Setting-an-Alarm.html 394*28f6c2f2SEnji Cooper struct itimerval timer; 395*28f6c2f2SEnji Cooper timer.it_interval.tv_sec = 0; 396*28f6c2f2SEnji Cooper timer.it_interval.tv_usec = 1; 397*28f6c2f2SEnji Cooper timer.it_value = timer.it_interval; 398*28f6c2f2SEnji Cooper ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, nullptr)); 399b89a7cc2SEnji Cooper } 400b89a7cc2SEnji Cooper 401b89a7cc2SEnji Cooper // Disables ITIMER_PROF timer and ignores SIGPROF signal. 402b89a7cc2SEnji Cooper void DisableSigprofActionAndTimer(struct sigaction* old_signal_action) { 403b89a7cc2SEnji Cooper struct itimerval timer; 404b89a7cc2SEnji Cooper timer.it_interval.tv_sec = 0; 405b89a7cc2SEnji Cooper timer.it_interval.tv_usec = 0; 406b89a7cc2SEnji Cooper timer.it_value = timer.it_interval; 407*28f6c2f2SEnji Cooper ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, nullptr)); 408b89a7cc2SEnji Cooper struct sigaction signal_action; 409b89a7cc2SEnji Cooper memset(&signal_action, 0, sizeof(signal_action)); 410b89a7cc2SEnji Cooper sigemptyset(&signal_action.sa_mask); 411b89a7cc2SEnji Cooper signal_action.sa_handler = SIG_IGN; 412b89a7cc2SEnji Cooper ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, old_signal_action)); 413b89a7cc2SEnji Cooper } 414b89a7cc2SEnji Cooper 415b89a7cc2SEnji Cooper // Tests that death tests work when SIGPROF handler and timer are set. 416b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, FastSigprofActionSet) { 417*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 418b89a7cc2SEnji Cooper SetSigprofActionAndTimer(); 419b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), ""); 420b89a7cc2SEnji Cooper struct sigaction old_signal_action; 421b89a7cc2SEnji Cooper DisableSigprofActionAndTimer(&old_signal_action); 422b89a7cc2SEnji Cooper EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction); 423b89a7cc2SEnji Cooper } 424b89a7cc2SEnji Cooper 425b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, ThreadSafeSigprofActionSet) { 426*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "threadsafe"); 427b89a7cc2SEnji Cooper SetSigprofActionAndTimer(); 428b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), ""); 429b89a7cc2SEnji Cooper struct sigaction old_signal_action; 430b89a7cc2SEnji Cooper DisableSigprofActionAndTimer(&old_signal_action); 431b89a7cc2SEnji Cooper EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction); 432b89a7cc2SEnji Cooper } 433b89a7cc2SEnji Cooper #endif // GTEST_OS_LINUX 434b89a7cc2SEnji Cooper 435b89a7cc2SEnji Cooper // Repeats a representative sample of death tests in the "threadsafe" style: 436b89a7cc2SEnji Cooper 437b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) { 438*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "threadsafe"); 439b89a7cc2SEnji Cooper ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember"); 440b89a7cc2SEnji Cooper } 441b89a7cc2SEnji Cooper 442b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) { 443*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "threadsafe"); 444b89a7cc2SEnji Cooper should_die_ = true; 445b89a7cc2SEnji Cooper EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction"); 446b89a7cc2SEnji Cooper } 447b89a7cc2SEnji Cooper 448b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) { 449*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "threadsafe"); 450b89a7cc2SEnji Cooper 451b89a7cc2SEnji Cooper for (int i = 0; i < 3; ++i) 452b89a7cc2SEnji Cooper EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), "") << ": i = " << i; 453b89a7cc2SEnji Cooper } 454b89a7cc2SEnji Cooper 455b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) { 456*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "threadsafe"); 457b89a7cc2SEnji Cooper 458b89a7cc2SEnji Cooper ChangeToRootDir(); 459b89a7cc2SEnji Cooper EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); 460b89a7cc2SEnji Cooper 461b89a7cc2SEnji Cooper ChangeToRootDir(); 462b89a7cc2SEnji Cooper ASSERT_DEATH(_exit(1), ""); 463b89a7cc2SEnji Cooper } 464b89a7cc2SEnji Cooper 465b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, MixedStyles) { 466*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "threadsafe"); 467b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), ""); 468*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 469b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), ""); 470b89a7cc2SEnji Cooper } 471b89a7cc2SEnji Cooper 472b89a7cc2SEnji Cooper #if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD 473b89a7cc2SEnji Cooper 474b89a7cc2SEnji Cooper bool pthread_flag; 475b89a7cc2SEnji Cooper 476*28f6c2f2SEnji Cooper void SetPthreadFlag() { pthread_flag = true; } 477b89a7cc2SEnji Cooper 478b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) { 479*28f6c2f2SEnji Cooper if (!GTEST_FLAG_GET(death_test_use_fork)) { 480*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "threadsafe"); 481b89a7cc2SEnji Cooper pthread_flag = false; 482*28f6c2f2SEnji Cooper ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, nullptr, nullptr)); 483b89a7cc2SEnji Cooper ASSERT_DEATH(_exit(1), ""); 484b89a7cc2SEnji Cooper ASSERT_FALSE(pthread_flag); 485b89a7cc2SEnji Cooper } 486b89a7cc2SEnji Cooper } 487b89a7cc2SEnji Cooper 488b89a7cc2SEnji Cooper #endif // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD 489b89a7cc2SEnji Cooper 490b89a7cc2SEnji Cooper // Tests that a method of another class can be used in a death test. 491b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, MethodOfAnotherClass) { 492b89a7cc2SEnji Cooper const MayDie x(true); 493b89a7cc2SEnji Cooper ASSERT_DEATH(x.MemberFunction(), "MayDie\\:\\:MemberFunction"); 494b89a7cc2SEnji Cooper } 495b89a7cc2SEnji Cooper 496b89a7cc2SEnji Cooper // Tests that a global function can be used in a death test. 497b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, GlobalFunction) { 498b89a7cc2SEnji Cooper EXPECT_DEATH(GlobalFunction(), "GlobalFunction"); 499b89a7cc2SEnji Cooper } 500b89a7cc2SEnji Cooper 501b89a7cc2SEnji Cooper // Tests that any value convertible to an RE works as a second 502b89a7cc2SEnji Cooper // argument to EXPECT_DEATH. 503b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) { 504b89a7cc2SEnji Cooper static const char regex_c_str[] = "GlobalFunction"; 505b89a7cc2SEnji Cooper EXPECT_DEATH(GlobalFunction(), regex_c_str); 506b89a7cc2SEnji Cooper 507b89a7cc2SEnji Cooper const testing::internal::RE regex(regex_c_str); 508b89a7cc2SEnji Cooper EXPECT_DEATH(GlobalFunction(), regex); 509b89a7cc2SEnji Cooper 510b89a7cc2SEnji Cooper const ::std::string regex_std_str(regex_c_str); 511b89a7cc2SEnji Cooper EXPECT_DEATH(GlobalFunction(), regex_std_str); 512b89a7cc2SEnji Cooper 513*28f6c2f2SEnji Cooper // This one is tricky; a temporary pointer into another temporary. Reference 514*28f6c2f2SEnji Cooper // lifetime extension of the pointer is not sufficient. 515*28f6c2f2SEnji Cooper EXPECT_DEATH(GlobalFunction(), ::std::string(regex_c_str).c_str()); 516b89a7cc2SEnji Cooper } 517b89a7cc2SEnji Cooper 518b89a7cc2SEnji Cooper // Tests that a non-void function can be used in a death test. 519b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, NonVoidFunction) { 520b89a7cc2SEnji Cooper ASSERT_DEATH(NonVoidFunction(), "NonVoidFunction"); 521b89a7cc2SEnji Cooper } 522b89a7cc2SEnji Cooper 523b89a7cc2SEnji Cooper // Tests that functions that take parameter(s) can be used in a death test. 524b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, FunctionWithParameter) { 525b89a7cc2SEnji Cooper EXPECT_DEATH(DieIf(true), "DieIf\\(\\)"); 526b89a7cc2SEnji Cooper EXPECT_DEATH(DieIfLessThan(2, 3), "DieIfLessThan"); 527b89a7cc2SEnji Cooper } 528b89a7cc2SEnji Cooper 529b89a7cc2SEnji Cooper // Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture. 530*28f6c2f2SEnji Cooper TEST_F(TestForDeathTest, OutsideFixture) { DeathTestSubroutine(); } 531b89a7cc2SEnji Cooper 532b89a7cc2SEnji Cooper // Tests that death tests can be done inside a loop. 533b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, InsideLoop) { 534b89a7cc2SEnji Cooper for (int i = 0; i < 5; i++) { 535b89a7cc2SEnji Cooper EXPECT_DEATH(DieIfLessThan(-1, i), "DieIfLessThan") << "where i == " << i; 536b89a7cc2SEnji Cooper } 537b89a7cc2SEnji Cooper } 538b89a7cc2SEnji Cooper 539b89a7cc2SEnji Cooper // Tests that a compound statement can be used in a death test. 540b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, CompoundStatement) { 541*28f6c2f2SEnji Cooper EXPECT_DEATH( 542*28f6c2f2SEnji Cooper { // NOLINT 543b89a7cc2SEnji Cooper const int x = 2; 544b89a7cc2SEnji Cooper const int y = x + 1; 545b89a7cc2SEnji Cooper DieIfLessThan(x, y); 546b89a7cc2SEnji Cooper }, 547b89a7cc2SEnji Cooper "DieIfLessThan"); 548b89a7cc2SEnji Cooper } 549b89a7cc2SEnji Cooper 550b89a7cc2SEnji Cooper // Tests that code that doesn't die causes a death test to fail. 551b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, DoesNotDie) { 552*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), "DieIf"), "failed to die"); 553b89a7cc2SEnji Cooper } 554b89a7cc2SEnji Cooper 555b89a7cc2SEnji Cooper // Tests that a death test fails when the error message isn't expected. 556b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, ErrorMessageMismatch) { 557*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE( 558*28f6c2f2SEnji Cooper { // NOLINT 559*28f6c2f2SEnji Cooper EXPECT_DEATH(DieIf(true), "DieIfLessThan") 560*28f6c2f2SEnji Cooper << "End of death test message."; 561*28f6c2f2SEnji Cooper }, 562*28f6c2f2SEnji Cooper "died but not with expected error"); 563b89a7cc2SEnji Cooper } 564b89a7cc2SEnji Cooper 565*28f6c2f2SEnji Cooper // On exit, *aborted will be true if and only if the EXPECT_DEATH() 566*28f6c2f2SEnji Cooper // statement aborted the function. 567b89a7cc2SEnji Cooper void ExpectDeathTestHelper(bool* aborted) { 568b89a7cc2SEnji Cooper *aborted = true; 569b89a7cc2SEnji Cooper EXPECT_DEATH(DieIf(false), "DieIf"); // This assertion should fail. 570b89a7cc2SEnji Cooper *aborted = false; 571b89a7cc2SEnji Cooper } 572b89a7cc2SEnji Cooper 573b89a7cc2SEnji Cooper // Tests that EXPECT_DEATH doesn't abort the test on failure. 574b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, EXPECT_DEATH) { 575b89a7cc2SEnji Cooper bool aborted = true; 576*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted), "failed to die"); 577b89a7cc2SEnji Cooper EXPECT_FALSE(aborted); 578b89a7cc2SEnji Cooper } 579b89a7cc2SEnji Cooper 580b89a7cc2SEnji Cooper // Tests that ASSERT_DEATH does abort the test on failure. 581b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, ASSERT_DEATH) { 582b89a7cc2SEnji Cooper static bool aborted; 583*28f6c2f2SEnji Cooper EXPECT_FATAL_FAILURE( 584*28f6c2f2SEnji Cooper { // NOLINT 585b89a7cc2SEnji Cooper aborted = true; 586b89a7cc2SEnji Cooper ASSERT_DEATH(DieIf(false), "DieIf"); // This assertion should fail. 587b89a7cc2SEnji Cooper aborted = false; 588*28f6c2f2SEnji Cooper }, 589*28f6c2f2SEnji Cooper "failed to die"); 590b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 591b89a7cc2SEnji Cooper } 592b89a7cc2SEnji Cooper 593b89a7cc2SEnji Cooper // Tests that EXPECT_DEATH evaluates the arguments exactly once. 594b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, SingleEvaluation) { 595b89a7cc2SEnji Cooper int x = 3; 596b89a7cc2SEnji Cooper EXPECT_DEATH(DieIf((++x) == 4), "DieIf"); 597b89a7cc2SEnji Cooper 598b89a7cc2SEnji Cooper const char* regex = "DieIf"; 599b89a7cc2SEnji Cooper const char* regex_save = regex; 600b89a7cc2SEnji Cooper EXPECT_DEATH(DieIfLessThan(3, 4), regex++); 601b89a7cc2SEnji Cooper EXPECT_EQ(regex_save + 1, regex); 602b89a7cc2SEnji Cooper } 603b89a7cc2SEnji Cooper 604b89a7cc2SEnji Cooper // Tests that run-away death tests are reported as failures. 605b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, RunawayIsFailure) { 606b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), "Foo"), 607b89a7cc2SEnji Cooper "failed to die."); 608b89a7cc2SEnji Cooper } 609b89a7cc2SEnji Cooper 610b89a7cc2SEnji Cooper // Tests that death tests report executing 'return' in the statement as 611b89a7cc2SEnji Cooper // failure. 612b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, ReturnIsFailure) { 613b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, "Bar"), 614b89a7cc2SEnji Cooper "illegal return in test statement."); 615b89a7cc2SEnji Cooper } 616b89a7cc2SEnji Cooper 617b89a7cc2SEnji Cooper // Tests that EXPECT_DEBUG_DEATH works as expected, that is, you can stream a 618b89a7cc2SEnji Cooper // message to it, and in debug mode it: 619b89a7cc2SEnji Cooper // 1. Asserts on death. 620b89a7cc2SEnji Cooper // 2. Has no side effect. 621b89a7cc2SEnji Cooper // 622b89a7cc2SEnji Cooper // And in opt mode, it: 623b89a7cc2SEnji Cooper // 1. Has side effects but does not assert. 624b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, TestExpectDebugDeath) { 625b89a7cc2SEnji Cooper int sideeffect = 0; 626b89a7cc2SEnji Cooper 627b89a7cc2SEnji Cooper // Put the regex in a local variable to make sure we don't get an "unused" 628b89a7cc2SEnji Cooper // warning in opt mode. 629b89a7cc2SEnji Cooper const char* regex = "death.*DieInDebugElse12"; 630b89a7cc2SEnji Cooper 631b89a7cc2SEnji Cooper EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), regex) 632b89a7cc2SEnji Cooper << "Must accept a streamed message"; 633b89a7cc2SEnji Cooper 634b89a7cc2SEnji Cooper #ifdef NDEBUG 635b89a7cc2SEnji Cooper 636b89a7cc2SEnji Cooper // Checks that the assignment occurs in opt mode (sideeffect). 637b89a7cc2SEnji Cooper EXPECT_EQ(12, sideeffect); 638b89a7cc2SEnji Cooper 639b89a7cc2SEnji Cooper #else 640b89a7cc2SEnji Cooper 641b89a7cc2SEnji Cooper // Checks that the assignment does not occur in dbg mode (no sideeffect). 642b89a7cc2SEnji Cooper EXPECT_EQ(0, sideeffect); 643b89a7cc2SEnji Cooper 644b89a7cc2SEnji Cooper #endif 645b89a7cc2SEnji Cooper } 646b89a7cc2SEnji Cooper 647*28f6c2f2SEnji Cooper #ifdef GTEST_OS_WINDOWS 648*28f6c2f2SEnji Cooper 649*28f6c2f2SEnji Cooper // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/crtsetreportmode 650*28f6c2f2SEnji Cooper // In debug mode, the calls to _CrtSetReportMode and _CrtSetReportFile enable 651*28f6c2f2SEnji Cooper // the dumping of assertions to stderr. Tests that EXPECT_DEATH works as 652*28f6c2f2SEnji Cooper // expected when in CRT debug mode (compiled with /MTd or /MDd, which defines 653*28f6c2f2SEnji Cooper // _DEBUG) the Windows CRT crashes the process with an assertion failure. 654*28f6c2f2SEnji Cooper // 1. Asserts on death. 655*28f6c2f2SEnji Cooper // 2. Has no side effect (doesn't pop up a window or wait for user input). 656*28f6c2f2SEnji Cooper #ifdef _DEBUG 657*28f6c2f2SEnji Cooper TEST_F(TestForDeathTest, CRTDebugDeath) { 658*28f6c2f2SEnji Cooper EXPECT_DEATH(DieInCRTDebugElse12(nullptr), "dup.* : Assertion failed") 659*28f6c2f2SEnji Cooper << "Must accept a streamed message"; 660*28f6c2f2SEnji Cooper } 661*28f6c2f2SEnji Cooper #endif // _DEBUG 662*28f6c2f2SEnji Cooper 663*28f6c2f2SEnji Cooper #endif // GTEST_OS_WINDOWS 664*28f6c2f2SEnji Cooper 665b89a7cc2SEnji Cooper // Tests that ASSERT_DEBUG_DEATH works as expected, that is, you can stream a 666b89a7cc2SEnji Cooper // message to it, and in debug mode it: 667b89a7cc2SEnji Cooper // 1. Asserts on death. 668b89a7cc2SEnji Cooper // 2. Has no side effect. 669b89a7cc2SEnji Cooper // 670b89a7cc2SEnji Cooper // And in opt mode, it: 671b89a7cc2SEnji Cooper // 1. Has side effects but does not assert. 672b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, TestAssertDebugDeath) { 673b89a7cc2SEnji Cooper int sideeffect = 0; 674b89a7cc2SEnji Cooper 675b89a7cc2SEnji Cooper ASSERT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12") 676b89a7cc2SEnji Cooper << "Must accept a streamed message"; 677b89a7cc2SEnji Cooper 678b89a7cc2SEnji Cooper #ifdef NDEBUG 679b89a7cc2SEnji Cooper 680b89a7cc2SEnji Cooper // Checks that the assignment occurs in opt mode (sideeffect). 681b89a7cc2SEnji Cooper EXPECT_EQ(12, sideeffect); 682b89a7cc2SEnji Cooper 683b89a7cc2SEnji Cooper #else 684b89a7cc2SEnji Cooper 685b89a7cc2SEnji Cooper // Checks that the assignment does not occur in dbg mode (no sideeffect). 686b89a7cc2SEnji Cooper EXPECT_EQ(0, sideeffect); 687b89a7cc2SEnji Cooper 688b89a7cc2SEnji Cooper #endif 689b89a7cc2SEnji Cooper } 690b89a7cc2SEnji Cooper 691b89a7cc2SEnji Cooper #ifndef NDEBUG 692b89a7cc2SEnji Cooper 693b89a7cc2SEnji Cooper void ExpectDebugDeathHelper(bool* aborted) { 694b89a7cc2SEnji Cooper *aborted = true; 695b89a7cc2SEnji Cooper EXPECT_DEBUG_DEATH(return, "") << "This is expected to fail."; 696b89a7cc2SEnji Cooper *aborted = false; 697b89a7cc2SEnji Cooper } 698b89a7cc2SEnji Cooper 699*28f6c2f2SEnji Cooper #ifdef GTEST_OS_WINDOWS 700b89a7cc2SEnji Cooper TEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) { 701*28f6c2f2SEnji Cooper printf( 702*28f6c2f2SEnji Cooper "This test should be considered failing if it shows " 703b89a7cc2SEnji Cooper "any pop-up dialogs.\n"); 704b89a7cc2SEnji Cooper fflush(stdout); 705b89a7cc2SEnji Cooper 706*28f6c2f2SEnji Cooper EXPECT_DEATH( 707*28f6c2f2SEnji Cooper { 708*28f6c2f2SEnji Cooper GTEST_FLAG_SET(catch_exceptions, false); 709b89a7cc2SEnji Cooper abort(); 710*28f6c2f2SEnji Cooper }, 711*28f6c2f2SEnji Cooper ""); 712b89a7cc2SEnji Cooper } 713b89a7cc2SEnji Cooper #endif // GTEST_OS_WINDOWS 714b89a7cc2SEnji Cooper 715b89a7cc2SEnji Cooper // Tests that EXPECT_DEBUG_DEATH in debug mode does not abort 716b89a7cc2SEnji Cooper // the function. 717b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) { 718b89a7cc2SEnji Cooper bool aborted = true; 719b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), ""); 720b89a7cc2SEnji Cooper EXPECT_FALSE(aborted); 721b89a7cc2SEnji Cooper } 722b89a7cc2SEnji Cooper 723b89a7cc2SEnji Cooper void AssertDebugDeathHelper(bool* aborted) { 724b89a7cc2SEnji Cooper *aborted = true; 725b89a7cc2SEnji Cooper GTEST_LOG_(INFO) << "Before ASSERT_DEBUG_DEATH"; 726b89a7cc2SEnji Cooper ASSERT_DEBUG_DEATH(GTEST_LOG_(INFO) << "In ASSERT_DEBUG_DEATH"; return, "") 727b89a7cc2SEnji Cooper << "This is expected to fail."; 728b89a7cc2SEnji Cooper GTEST_LOG_(INFO) << "After ASSERT_DEBUG_DEATH"; 729b89a7cc2SEnji Cooper *aborted = false; 730b89a7cc2SEnji Cooper } 731b89a7cc2SEnji Cooper 732b89a7cc2SEnji Cooper // Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on 733b89a7cc2SEnji Cooper // failure. 734b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts) { 735b89a7cc2SEnji Cooper static bool aborted; 736b89a7cc2SEnji Cooper aborted = false; 737b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 738b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 739b89a7cc2SEnji Cooper } 740b89a7cc2SEnji Cooper 741b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts2) { 742b89a7cc2SEnji Cooper static bool aborted; 743b89a7cc2SEnji Cooper aborted = false; 744b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 745b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 746b89a7cc2SEnji Cooper } 747b89a7cc2SEnji Cooper 748b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts3) { 749b89a7cc2SEnji Cooper static bool aborted; 750b89a7cc2SEnji Cooper aborted = false; 751b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 752b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 753b89a7cc2SEnji Cooper } 754b89a7cc2SEnji Cooper 755b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts4) { 756b89a7cc2SEnji Cooper static bool aborted; 757b89a7cc2SEnji Cooper aborted = false; 758b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 759b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 760b89a7cc2SEnji Cooper } 761b89a7cc2SEnji Cooper 762b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts5) { 763b89a7cc2SEnji Cooper static bool aborted; 764b89a7cc2SEnji Cooper aborted = false; 765b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 766b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 767b89a7cc2SEnji Cooper } 768b89a7cc2SEnji Cooper 769b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts6) { 770b89a7cc2SEnji Cooper static bool aborted; 771b89a7cc2SEnji Cooper aborted = false; 772b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 773b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 774b89a7cc2SEnji Cooper } 775b89a7cc2SEnji Cooper 776b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts7) { 777b89a7cc2SEnji Cooper static bool aborted; 778b89a7cc2SEnji Cooper aborted = false; 779b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 780b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 781b89a7cc2SEnji Cooper } 782b89a7cc2SEnji Cooper 783b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts8) { 784b89a7cc2SEnji Cooper static bool aborted; 785b89a7cc2SEnji Cooper aborted = false; 786b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 787b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 788b89a7cc2SEnji Cooper } 789b89a7cc2SEnji Cooper 790b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts9) { 791b89a7cc2SEnji Cooper static bool aborted; 792b89a7cc2SEnji Cooper aborted = false; 793b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 794b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 795b89a7cc2SEnji Cooper } 796b89a7cc2SEnji Cooper 797b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, AssertDebugDeathAborts10) { 798b89a7cc2SEnji Cooper static bool aborted; 799b89a7cc2SEnji Cooper aborted = false; 800b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 801b89a7cc2SEnji Cooper EXPECT_TRUE(aborted); 802b89a7cc2SEnji Cooper } 803b89a7cc2SEnji Cooper 804b89a7cc2SEnji Cooper #endif // _NDEBUG 805b89a7cc2SEnji Cooper 806b89a7cc2SEnji Cooper // Tests the *_EXIT family of macros, using a variety of predicates. 807b89a7cc2SEnji Cooper static void TestExitMacros() { 808b89a7cc2SEnji Cooper EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); 809b89a7cc2SEnji Cooper ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), ""); 810b89a7cc2SEnji Cooper 811*28f6c2f2SEnji Cooper #ifdef GTEST_OS_WINDOWS 812b89a7cc2SEnji Cooper 813b89a7cc2SEnji Cooper // Of all signals effects on the process exit code, only those of SIGABRT 814b89a7cc2SEnji Cooper // are documented on Windows. 815b89a7cc2SEnji Cooper // See https://msdn.microsoft.com/en-us/query-bi/m/dwwzkt4c. 816b89a7cc2SEnji Cooper EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "") << "b_ar"; 817b89a7cc2SEnji Cooper 818*28f6c2f2SEnji Cooper #elif !defined(GTEST_OS_FUCHSIA) 819b89a7cc2SEnji Cooper 820b89a7cc2SEnji Cooper // Fuchsia has no unix signals. 821b89a7cc2SEnji Cooper EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo"; 822b89a7cc2SEnji Cooper ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar"; 823b89a7cc2SEnji Cooper 824*28f6c2f2SEnji Cooper EXPECT_FATAL_FAILURE( 825*28f6c2f2SEnji Cooper { // NOLINT 826b89a7cc2SEnji Cooper ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), "") 827b89a7cc2SEnji Cooper << "This failure is expected, too."; 828*28f6c2f2SEnji Cooper }, 829*28f6c2f2SEnji Cooper "This failure is expected, too."); 830b89a7cc2SEnji Cooper 831b89a7cc2SEnji Cooper #endif // GTEST_OS_WINDOWS 832b89a7cc2SEnji Cooper 833*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE( 834*28f6c2f2SEnji Cooper { // NOLINT 835b89a7cc2SEnji Cooper EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "") 836b89a7cc2SEnji Cooper << "This failure is expected."; 837*28f6c2f2SEnji Cooper }, 838*28f6c2f2SEnji Cooper "This failure is expected."); 839b89a7cc2SEnji Cooper } 840b89a7cc2SEnji Cooper 841*28f6c2f2SEnji Cooper TEST_F(TestForDeathTest, ExitMacros) { TestExitMacros(); } 842b89a7cc2SEnji Cooper 843b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, ExitMacrosUsingFork) { 844*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_use_fork, true); 845b89a7cc2SEnji Cooper TestExitMacros(); 846b89a7cc2SEnji Cooper } 847b89a7cc2SEnji Cooper 848b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, InvalidStyle) { 849*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "rococo"); 850*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE( 851*28f6c2f2SEnji Cooper { // NOLINT 852b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(0), "") << "This failure is expected."; 853*28f6c2f2SEnji Cooper }, 854*28f6c2f2SEnji Cooper "This failure is expected."); 855b89a7cc2SEnji Cooper } 856b89a7cc2SEnji Cooper 857b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, DeathTestFailedOutput) { 858*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 859b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE( 860*28f6c2f2SEnji Cooper EXPECT_DEATH(DieWithMessage("death\n"), "expected message"), 861b89a7cc2SEnji Cooper "Actual msg:\n" 862b89a7cc2SEnji Cooper "[ DEATH ] death\n"); 863b89a7cc2SEnji Cooper } 864b89a7cc2SEnji Cooper 865b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, DeathTestUnexpectedReturnOutput) { 866*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 867*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(EXPECT_DEATH( 868*28f6c2f2SEnji Cooper { 869b89a7cc2SEnji Cooper fprintf(stderr, "returning\n"); 870b89a7cc2SEnji Cooper fflush(stderr); 871b89a7cc2SEnji Cooper return; 872*28f6c2f2SEnji Cooper }, 873*28f6c2f2SEnji Cooper ""), 874b89a7cc2SEnji Cooper " Result: illegal return in test statement.\n" 875b89a7cc2SEnji Cooper " Error msg:\n" 876b89a7cc2SEnji Cooper "[ DEATH ] returning\n"); 877b89a7cc2SEnji Cooper } 878b89a7cc2SEnji Cooper 879b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, DeathTestBadExitCodeOutput) { 880*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 881b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE( 882b89a7cc2SEnji Cooper EXPECT_EXIT(DieWithMessage("exiting with rc 1\n"), 883*28f6c2f2SEnji Cooper testing::ExitedWithCode(3), "expected message"), 884b89a7cc2SEnji Cooper " Result: died but not with expected exit code:\n" 885b89a7cc2SEnji Cooper " Exited with exit status 1\n" 886b89a7cc2SEnji Cooper "Actual msg:\n" 887b89a7cc2SEnji Cooper "[ DEATH ] exiting with rc 1\n"); 888b89a7cc2SEnji Cooper } 889b89a7cc2SEnji Cooper 890b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, DeathTestMultiLineMatchFail) { 891*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 892b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE( 893b89a7cc2SEnji Cooper EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"), 894b89a7cc2SEnji Cooper "line 1\nxyz\nline 3\n"), 895b89a7cc2SEnji Cooper "Actual msg:\n" 896b89a7cc2SEnji Cooper "[ DEATH ] line 1\n" 897b89a7cc2SEnji Cooper "[ DEATH ] line 2\n" 898b89a7cc2SEnji Cooper "[ DEATH ] line 3\n"); 899b89a7cc2SEnji Cooper } 900b89a7cc2SEnji Cooper 901b89a7cc2SEnji Cooper TEST_F(TestForDeathTest, DeathTestMultiLineMatchPass) { 902*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 903b89a7cc2SEnji Cooper EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"), 904b89a7cc2SEnji Cooper "line 1\nline 2\nline 3\n"); 905b89a7cc2SEnji Cooper } 906b89a7cc2SEnji Cooper 907b89a7cc2SEnji Cooper // A DeathTestFactory that returns MockDeathTests. 908b89a7cc2SEnji Cooper class MockDeathTestFactory : public DeathTestFactory { 909b89a7cc2SEnji Cooper public: 910b89a7cc2SEnji Cooper MockDeathTestFactory(); 911*28f6c2f2SEnji Cooper bool Create(const char* statement, 912*28f6c2f2SEnji Cooper testing::Matcher<const std::string&> matcher, const char* file, 913*28f6c2f2SEnji Cooper int line, DeathTest** test) override; 914b89a7cc2SEnji Cooper 915b89a7cc2SEnji Cooper // Sets the parameters for subsequent calls to Create. 916*28f6c2f2SEnji Cooper void SetParameters(bool create, DeathTest::TestRole role, int status, 917*28f6c2f2SEnji Cooper bool passed); 918b89a7cc2SEnji Cooper 919b89a7cc2SEnji Cooper // Accessors. 920b89a7cc2SEnji Cooper int AssumeRoleCalls() const { return assume_role_calls_; } 921b89a7cc2SEnji Cooper int WaitCalls() const { return wait_calls_; } 922b89a7cc2SEnji Cooper size_t PassedCalls() const { return passed_args_.size(); } 923*28f6c2f2SEnji Cooper bool PassedArgument(int n) const { 924*28f6c2f2SEnji Cooper return passed_args_[static_cast<size_t>(n)]; 925*28f6c2f2SEnji Cooper } 926b89a7cc2SEnji Cooper size_t AbortCalls() const { return abort_args_.size(); } 927b89a7cc2SEnji Cooper DeathTest::AbortReason AbortArgument(int n) const { 928*28f6c2f2SEnji Cooper return abort_args_[static_cast<size_t>(n)]; 929b89a7cc2SEnji Cooper } 930b89a7cc2SEnji Cooper bool TestDeleted() const { return test_deleted_; } 931b89a7cc2SEnji Cooper 932b89a7cc2SEnji Cooper private: 933b89a7cc2SEnji Cooper friend class MockDeathTest; 934b89a7cc2SEnji Cooper // If true, Create will return a MockDeathTest; otherwise it returns 935b89a7cc2SEnji Cooper // NULL. 936b89a7cc2SEnji Cooper bool create_; 937b89a7cc2SEnji Cooper // The value a MockDeathTest will return from its AssumeRole method. 938b89a7cc2SEnji Cooper DeathTest::TestRole role_; 939b89a7cc2SEnji Cooper // The value a MockDeathTest will return from its Wait method. 940b89a7cc2SEnji Cooper int status_; 941b89a7cc2SEnji Cooper // The value a MockDeathTest will return from its Passed method. 942b89a7cc2SEnji Cooper bool passed_; 943b89a7cc2SEnji Cooper 944b89a7cc2SEnji Cooper // Number of times AssumeRole was called. 945b89a7cc2SEnji Cooper int assume_role_calls_; 946b89a7cc2SEnji Cooper // Number of times Wait was called. 947b89a7cc2SEnji Cooper int wait_calls_; 948b89a7cc2SEnji Cooper // The arguments to the calls to Passed since the last call to 949b89a7cc2SEnji Cooper // SetParameters. 950b89a7cc2SEnji Cooper std::vector<bool> passed_args_; 951b89a7cc2SEnji Cooper // The arguments to the calls to Abort since the last call to 952b89a7cc2SEnji Cooper // SetParameters. 953b89a7cc2SEnji Cooper std::vector<DeathTest::AbortReason> abort_args_; 954b89a7cc2SEnji Cooper // True if the last MockDeathTest returned by Create has been 955b89a7cc2SEnji Cooper // deleted. 956b89a7cc2SEnji Cooper bool test_deleted_; 957b89a7cc2SEnji Cooper }; 958b89a7cc2SEnji Cooper 959b89a7cc2SEnji Cooper // A DeathTest implementation useful in testing. It returns values set 960b89a7cc2SEnji Cooper // at its creation from its various inherited DeathTest methods, and 961b89a7cc2SEnji Cooper // reports calls to those methods to its parent MockDeathTestFactory 962b89a7cc2SEnji Cooper // object. 963b89a7cc2SEnji Cooper class MockDeathTest : public DeathTest { 964b89a7cc2SEnji Cooper public: 965*28f6c2f2SEnji Cooper MockDeathTest(MockDeathTestFactory* parent, TestRole role, int status, 966*28f6c2f2SEnji Cooper bool passed) 967*28f6c2f2SEnji Cooper : parent_(parent), role_(role), status_(status), passed_(passed) {} 968*28f6c2f2SEnji Cooper ~MockDeathTest() override { parent_->test_deleted_ = true; } 969*28f6c2f2SEnji Cooper TestRole AssumeRole() override { 970b89a7cc2SEnji Cooper ++parent_->assume_role_calls_; 971b89a7cc2SEnji Cooper return role_; 972b89a7cc2SEnji Cooper } 973*28f6c2f2SEnji Cooper int Wait() override { 974b89a7cc2SEnji Cooper ++parent_->wait_calls_; 975b89a7cc2SEnji Cooper return status_; 976b89a7cc2SEnji Cooper } 977*28f6c2f2SEnji Cooper bool Passed(bool exit_status_ok) override { 978b89a7cc2SEnji Cooper parent_->passed_args_.push_back(exit_status_ok); 979b89a7cc2SEnji Cooper return passed_; 980b89a7cc2SEnji Cooper } 981*28f6c2f2SEnji Cooper void Abort(AbortReason reason) override { 982b89a7cc2SEnji Cooper parent_->abort_args_.push_back(reason); 983b89a7cc2SEnji Cooper } 984b89a7cc2SEnji Cooper 985b89a7cc2SEnji Cooper private: 986b89a7cc2SEnji Cooper MockDeathTestFactory* const parent_; 987b89a7cc2SEnji Cooper const TestRole role_; 988b89a7cc2SEnji Cooper const int status_; 989b89a7cc2SEnji Cooper const bool passed_; 990b89a7cc2SEnji Cooper }; 991b89a7cc2SEnji Cooper 992b89a7cc2SEnji Cooper // MockDeathTestFactory constructor. 993b89a7cc2SEnji Cooper MockDeathTestFactory::MockDeathTestFactory() 994b89a7cc2SEnji Cooper : create_(true), 995b89a7cc2SEnji Cooper role_(DeathTest::OVERSEE_TEST), 996b89a7cc2SEnji Cooper status_(0), 997b89a7cc2SEnji Cooper passed_(true), 998b89a7cc2SEnji Cooper assume_role_calls_(0), 999b89a7cc2SEnji Cooper wait_calls_(0), 1000b89a7cc2SEnji Cooper passed_args_(), 1001*28f6c2f2SEnji Cooper abort_args_() {} 1002b89a7cc2SEnji Cooper 1003b89a7cc2SEnji Cooper // Sets the parameters for subsequent calls to Create. 1004*28f6c2f2SEnji Cooper void MockDeathTestFactory::SetParameters(bool create, DeathTest::TestRole role, 1005b89a7cc2SEnji Cooper int status, bool passed) { 1006b89a7cc2SEnji Cooper create_ = create; 1007b89a7cc2SEnji Cooper role_ = role; 1008b89a7cc2SEnji Cooper status_ = status; 1009b89a7cc2SEnji Cooper passed_ = passed; 1010b89a7cc2SEnji Cooper 1011b89a7cc2SEnji Cooper assume_role_calls_ = 0; 1012b89a7cc2SEnji Cooper wait_calls_ = 0; 1013b89a7cc2SEnji Cooper passed_args_.clear(); 1014b89a7cc2SEnji Cooper abort_args_.clear(); 1015b89a7cc2SEnji Cooper } 1016b89a7cc2SEnji Cooper 1017b89a7cc2SEnji Cooper // Sets test to NULL (if create_ is false) or to the address of a new 1018b89a7cc2SEnji Cooper // MockDeathTest object with parameters taken from the last call 1019b89a7cc2SEnji Cooper // to SetParameters (if create_ is true). Always returns true. 1020*28f6c2f2SEnji Cooper bool MockDeathTestFactory::Create( 1021*28f6c2f2SEnji Cooper const char* /*statement*/, testing::Matcher<const std::string&> /*matcher*/, 1022*28f6c2f2SEnji Cooper const char* /*file*/, int /*line*/, DeathTest** test) { 1023b89a7cc2SEnji Cooper test_deleted_ = false; 1024b89a7cc2SEnji Cooper if (create_) { 1025b89a7cc2SEnji Cooper *test = new MockDeathTest(this, role_, status_, passed_); 1026b89a7cc2SEnji Cooper } else { 1027*28f6c2f2SEnji Cooper *test = nullptr; 1028b89a7cc2SEnji Cooper } 1029b89a7cc2SEnji Cooper return true; 1030b89a7cc2SEnji Cooper } 1031b89a7cc2SEnji Cooper 1032b89a7cc2SEnji Cooper // A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro. 1033b89a7cc2SEnji Cooper // It installs a MockDeathTestFactory that is used for the duration 1034b89a7cc2SEnji Cooper // of the test case. 1035b89a7cc2SEnji Cooper class MacroLogicDeathTest : public testing::Test { 1036b89a7cc2SEnji Cooper protected: 1037b89a7cc2SEnji Cooper static testing::internal::ReplaceDeathTestFactory* replacer_; 1038b89a7cc2SEnji Cooper static MockDeathTestFactory* factory_; 1039b89a7cc2SEnji Cooper 1040*28f6c2f2SEnji Cooper static void SetUpTestSuite() { 1041b89a7cc2SEnji Cooper factory_ = new MockDeathTestFactory; 1042b89a7cc2SEnji Cooper replacer_ = new testing::internal::ReplaceDeathTestFactory(factory_); 1043b89a7cc2SEnji Cooper } 1044b89a7cc2SEnji Cooper 1045*28f6c2f2SEnji Cooper static void TearDownTestSuite() { 1046b89a7cc2SEnji Cooper delete replacer_; 1047*28f6c2f2SEnji Cooper replacer_ = nullptr; 1048b89a7cc2SEnji Cooper delete factory_; 1049*28f6c2f2SEnji Cooper factory_ = nullptr; 1050b89a7cc2SEnji Cooper } 1051b89a7cc2SEnji Cooper 1052b89a7cc2SEnji Cooper // Runs a death test that breaks the rules by returning. Such a death 1053b89a7cc2SEnji Cooper // test cannot be run directly from a test routine that uses a 1054b89a7cc2SEnji Cooper // MockDeathTest, or the remainder of the routine will not be executed. 1055b89a7cc2SEnji Cooper static void RunReturningDeathTest(bool* flag) { 1056*28f6c2f2SEnji Cooper ASSERT_DEATH( 1057*28f6c2f2SEnji Cooper { // NOLINT 1058b89a7cc2SEnji Cooper *flag = true; 1059b89a7cc2SEnji Cooper return; 1060*28f6c2f2SEnji Cooper }, 1061*28f6c2f2SEnji Cooper ""); 1062b89a7cc2SEnji Cooper } 1063b89a7cc2SEnji Cooper }; 1064b89a7cc2SEnji Cooper 1065*28f6c2f2SEnji Cooper testing::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_ = 1066*28f6c2f2SEnji Cooper nullptr; 1067*28f6c2f2SEnji Cooper MockDeathTestFactory* MacroLogicDeathTest::factory_ = nullptr; 1068b89a7cc2SEnji Cooper 1069b89a7cc2SEnji Cooper // Test that nothing happens when the factory doesn't return a DeathTest: 1070b89a7cc2SEnji Cooper TEST_F(MacroLogicDeathTest, NothingHappens) { 1071b89a7cc2SEnji Cooper bool flag = false; 1072b89a7cc2SEnji Cooper factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true); 1073b89a7cc2SEnji Cooper EXPECT_DEATH(flag = true, ""); 1074b89a7cc2SEnji Cooper EXPECT_FALSE(flag); 1075b89a7cc2SEnji Cooper EXPECT_EQ(0, factory_->AssumeRoleCalls()); 1076b89a7cc2SEnji Cooper EXPECT_EQ(0, factory_->WaitCalls()); 1077b89a7cc2SEnji Cooper EXPECT_EQ(0U, factory_->PassedCalls()); 1078b89a7cc2SEnji Cooper EXPECT_EQ(0U, factory_->AbortCalls()); 1079b89a7cc2SEnji Cooper EXPECT_FALSE(factory_->TestDeleted()); 1080b89a7cc2SEnji Cooper } 1081b89a7cc2SEnji Cooper 1082b89a7cc2SEnji Cooper // Test that the parent process doesn't run the death test code, 1083b89a7cc2SEnji Cooper // and that the Passed method returns false when the (simulated) 1084b89a7cc2SEnji Cooper // child process exits with status 0: 1085b89a7cc2SEnji Cooper TEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) { 1086b89a7cc2SEnji Cooper bool flag = false; 1087b89a7cc2SEnji Cooper factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true); 1088b89a7cc2SEnji Cooper EXPECT_DEATH(flag = true, ""); 1089b89a7cc2SEnji Cooper EXPECT_FALSE(flag); 1090b89a7cc2SEnji Cooper EXPECT_EQ(1, factory_->AssumeRoleCalls()); 1091b89a7cc2SEnji Cooper EXPECT_EQ(1, factory_->WaitCalls()); 1092b89a7cc2SEnji Cooper ASSERT_EQ(1U, factory_->PassedCalls()); 1093b89a7cc2SEnji Cooper EXPECT_FALSE(factory_->PassedArgument(0)); 1094b89a7cc2SEnji Cooper EXPECT_EQ(0U, factory_->AbortCalls()); 1095b89a7cc2SEnji Cooper EXPECT_TRUE(factory_->TestDeleted()); 1096b89a7cc2SEnji Cooper } 1097b89a7cc2SEnji Cooper 1098b89a7cc2SEnji Cooper // Tests that the Passed method was given the argument "true" when 1099b89a7cc2SEnji Cooper // the (simulated) child process exits with status 1: 1100b89a7cc2SEnji Cooper TEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) { 1101b89a7cc2SEnji Cooper bool flag = false; 1102b89a7cc2SEnji Cooper factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true); 1103b89a7cc2SEnji Cooper EXPECT_DEATH(flag = true, ""); 1104b89a7cc2SEnji Cooper EXPECT_FALSE(flag); 1105b89a7cc2SEnji Cooper EXPECT_EQ(1, factory_->AssumeRoleCalls()); 1106b89a7cc2SEnji Cooper EXPECT_EQ(1, factory_->WaitCalls()); 1107b89a7cc2SEnji Cooper ASSERT_EQ(1U, factory_->PassedCalls()); 1108b89a7cc2SEnji Cooper EXPECT_TRUE(factory_->PassedArgument(0)); 1109b89a7cc2SEnji Cooper EXPECT_EQ(0U, factory_->AbortCalls()); 1110b89a7cc2SEnji Cooper EXPECT_TRUE(factory_->TestDeleted()); 1111b89a7cc2SEnji Cooper } 1112b89a7cc2SEnji Cooper 1113b89a7cc2SEnji Cooper // Tests that the (simulated) child process executes the death test 1114b89a7cc2SEnji Cooper // code, and is aborted with the correct AbortReason if it 1115b89a7cc2SEnji Cooper // executes a return statement. 1116b89a7cc2SEnji Cooper TEST_F(MacroLogicDeathTest, ChildPerformsReturn) { 1117b89a7cc2SEnji Cooper bool flag = false; 1118b89a7cc2SEnji Cooper factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true); 1119b89a7cc2SEnji Cooper RunReturningDeathTest(&flag); 1120b89a7cc2SEnji Cooper EXPECT_TRUE(flag); 1121b89a7cc2SEnji Cooper EXPECT_EQ(1, factory_->AssumeRoleCalls()); 1122b89a7cc2SEnji Cooper EXPECT_EQ(0, factory_->WaitCalls()); 1123b89a7cc2SEnji Cooper EXPECT_EQ(0U, factory_->PassedCalls()); 1124b89a7cc2SEnji Cooper EXPECT_EQ(1U, factory_->AbortCalls()); 1125b89a7cc2SEnji Cooper EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT, 1126b89a7cc2SEnji Cooper factory_->AbortArgument(0)); 1127b89a7cc2SEnji Cooper EXPECT_TRUE(factory_->TestDeleted()); 1128b89a7cc2SEnji Cooper } 1129b89a7cc2SEnji Cooper 1130b89a7cc2SEnji Cooper // Tests that the (simulated) child process is aborted with the 1131b89a7cc2SEnji Cooper // correct AbortReason if it does not die. 1132b89a7cc2SEnji Cooper TEST_F(MacroLogicDeathTest, ChildDoesNotDie) { 1133b89a7cc2SEnji Cooper bool flag = false; 1134b89a7cc2SEnji Cooper factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true); 1135b89a7cc2SEnji Cooper EXPECT_DEATH(flag = true, ""); 1136b89a7cc2SEnji Cooper EXPECT_TRUE(flag); 1137b89a7cc2SEnji Cooper EXPECT_EQ(1, factory_->AssumeRoleCalls()); 1138b89a7cc2SEnji Cooper EXPECT_EQ(0, factory_->WaitCalls()); 1139b89a7cc2SEnji Cooper EXPECT_EQ(0U, factory_->PassedCalls()); 1140b89a7cc2SEnji Cooper // This time there are two calls to Abort: one since the test didn't 1141b89a7cc2SEnji Cooper // die, and another from the ReturnSentinel when it's destroyed. The 1142b89a7cc2SEnji Cooper // sentinel normally isn't destroyed if a test doesn't die, since 1143b89a7cc2SEnji Cooper // _exit(2) is called in that case by ForkingDeathTest, but not by 1144b89a7cc2SEnji Cooper // our MockDeathTest. 1145b89a7cc2SEnji Cooper ASSERT_EQ(2U, factory_->AbortCalls()); 1146*28f6c2f2SEnji Cooper EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE, factory_->AbortArgument(0)); 1147b89a7cc2SEnji Cooper EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT, 1148b89a7cc2SEnji Cooper factory_->AbortArgument(1)); 1149b89a7cc2SEnji Cooper EXPECT_TRUE(factory_->TestDeleted()); 1150b89a7cc2SEnji Cooper } 1151b89a7cc2SEnji Cooper 1152b89a7cc2SEnji Cooper // Tests that a successful death test does not register a successful 1153b89a7cc2SEnji Cooper // test part. 1154b89a7cc2SEnji Cooper TEST(SuccessRegistrationDeathTest, NoSuccessPart) { 1155b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), ""); 1156b89a7cc2SEnji Cooper EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); 1157b89a7cc2SEnji Cooper } 1158b89a7cc2SEnji Cooper 1159b89a7cc2SEnji Cooper TEST(StreamingAssertionsDeathTest, DeathTest) { 1160b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(1), "") << "unexpected failure"; 1161b89a7cc2SEnji Cooper ASSERT_DEATH(_exit(1), "") << "unexpected failure"; 1162*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE( 1163*28f6c2f2SEnji Cooper { // NOLINT 1164b89a7cc2SEnji Cooper EXPECT_DEATH(_exit(0), "") << "expected failure"; 1165*28f6c2f2SEnji Cooper }, 1166*28f6c2f2SEnji Cooper "expected failure"); 1167*28f6c2f2SEnji Cooper EXPECT_FATAL_FAILURE( 1168*28f6c2f2SEnji Cooper { // NOLINT 1169b89a7cc2SEnji Cooper ASSERT_DEATH(_exit(0), "") << "expected failure"; 1170*28f6c2f2SEnji Cooper }, 1171*28f6c2f2SEnji Cooper "expected failure"); 1172b89a7cc2SEnji Cooper } 1173b89a7cc2SEnji Cooper 1174b89a7cc2SEnji Cooper // Tests that GetLastErrnoDescription returns an empty string when the 1175b89a7cc2SEnji Cooper // last error is 0 and non-empty string when it is non-zero. 1176b89a7cc2SEnji Cooper TEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) { 1177b89a7cc2SEnji Cooper errno = ENOENT; 1178b89a7cc2SEnji Cooper EXPECT_STRNE("", GetLastErrnoDescription().c_str()); 1179b89a7cc2SEnji Cooper errno = 0; 1180b89a7cc2SEnji Cooper EXPECT_STREQ("", GetLastErrnoDescription().c_str()); 1181b89a7cc2SEnji Cooper } 1182b89a7cc2SEnji Cooper 1183*28f6c2f2SEnji Cooper #ifdef GTEST_OS_WINDOWS 1184b89a7cc2SEnji Cooper TEST(AutoHandleTest, AutoHandleWorks) { 1185b89a7cc2SEnji Cooper HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL); 1186b89a7cc2SEnji Cooper ASSERT_NE(INVALID_HANDLE_VALUE, handle); 1187b89a7cc2SEnji Cooper 1188b89a7cc2SEnji Cooper // Tests that the AutoHandle is correctly initialized with a handle. 1189b89a7cc2SEnji Cooper testing::internal::AutoHandle auto_handle(handle); 1190b89a7cc2SEnji Cooper EXPECT_EQ(handle, auto_handle.Get()); 1191b89a7cc2SEnji Cooper 1192b89a7cc2SEnji Cooper // Tests that Reset assigns INVALID_HANDLE_VALUE. 1193b89a7cc2SEnji Cooper // Note that this cannot verify whether the original handle is closed. 1194b89a7cc2SEnji Cooper auto_handle.Reset(); 1195b89a7cc2SEnji Cooper EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get()); 1196b89a7cc2SEnji Cooper 1197b89a7cc2SEnji Cooper // Tests that Reset assigns the new handle. 1198b89a7cc2SEnji Cooper // Note that this cannot verify whether the original handle is closed. 1199b89a7cc2SEnji Cooper handle = ::CreateEvent(NULL, FALSE, FALSE, NULL); 1200b89a7cc2SEnji Cooper ASSERT_NE(INVALID_HANDLE_VALUE, handle); 1201b89a7cc2SEnji Cooper auto_handle.Reset(handle); 1202b89a7cc2SEnji Cooper EXPECT_EQ(handle, auto_handle.Get()); 1203b89a7cc2SEnji Cooper 1204b89a7cc2SEnji Cooper // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default. 1205b89a7cc2SEnji Cooper testing::internal::AutoHandle auto_handle2; 1206b89a7cc2SEnji Cooper EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get()); 1207b89a7cc2SEnji Cooper } 1208b89a7cc2SEnji Cooper #endif // GTEST_OS_WINDOWS 1209b89a7cc2SEnji Cooper 1210*28f6c2f2SEnji Cooper #ifdef GTEST_OS_WINDOWS 1211b89a7cc2SEnji Cooper typedef unsigned __int64 BiggestParsable; 1212b89a7cc2SEnji Cooper typedef signed __int64 BiggestSignedParsable; 1213b89a7cc2SEnji Cooper #else 1214b89a7cc2SEnji Cooper typedef unsigned long long BiggestParsable; 1215b89a7cc2SEnji Cooper typedef signed long long BiggestSignedParsable; 1216b89a7cc2SEnji Cooper #endif // GTEST_OS_WINDOWS 1217b89a7cc2SEnji Cooper 1218b89a7cc2SEnji Cooper // We cannot use std::numeric_limits<T>::max() as it clashes with the 1219b89a7cc2SEnji Cooper // max() macro defined by <windows.h>. 1220b89a7cc2SEnji Cooper const BiggestParsable kBiggestParsableMax = ULLONG_MAX; 1221b89a7cc2SEnji Cooper const BiggestSignedParsable kBiggestSignedParsableMax = LLONG_MAX; 1222b89a7cc2SEnji Cooper 1223b89a7cc2SEnji Cooper TEST(ParseNaturalNumberTest, RejectsInvalidFormat) { 1224b89a7cc2SEnji Cooper BiggestParsable result = 0; 1225b89a7cc2SEnji Cooper 1226b89a7cc2SEnji Cooper // Rejects non-numbers. 1227b89a7cc2SEnji Cooper EXPECT_FALSE(ParseNaturalNumber("non-number string", &result)); 1228b89a7cc2SEnji Cooper 1229b89a7cc2SEnji Cooper // Rejects numbers with whitespace prefix. 1230b89a7cc2SEnji Cooper EXPECT_FALSE(ParseNaturalNumber(" 123", &result)); 1231b89a7cc2SEnji Cooper 1232b89a7cc2SEnji Cooper // Rejects negative numbers. 1233b89a7cc2SEnji Cooper EXPECT_FALSE(ParseNaturalNumber("-123", &result)); 1234b89a7cc2SEnji Cooper 1235b89a7cc2SEnji Cooper // Rejects numbers starting with a plus sign. 1236b89a7cc2SEnji Cooper EXPECT_FALSE(ParseNaturalNumber("+123", &result)); 1237b89a7cc2SEnji Cooper errno = 0; 1238b89a7cc2SEnji Cooper } 1239b89a7cc2SEnji Cooper 1240b89a7cc2SEnji Cooper TEST(ParseNaturalNumberTest, RejectsOverflownNumbers) { 1241b89a7cc2SEnji Cooper BiggestParsable result = 0; 1242b89a7cc2SEnji Cooper 1243b89a7cc2SEnji Cooper EXPECT_FALSE(ParseNaturalNumber("99999999999999999999999", &result)); 1244b89a7cc2SEnji Cooper 1245b89a7cc2SEnji Cooper signed char char_result = 0; 1246b89a7cc2SEnji Cooper EXPECT_FALSE(ParseNaturalNumber("200", &char_result)); 1247b89a7cc2SEnji Cooper errno = 0; 1248b89a7cc2SEnji Cooper } 1249b89a7cc2SEnji Cooper 1250b89a7cc2SEnji Cooper TEST(ParseNaturalNumberTest, AcceptsValidNumbers) { 1251b89a7cc2SEnji Cooper BiggestParsable result = 0; 1252b89a7cc2SEnji Cooper 1253b89a7cc2SEnji Cooper result = 0; 1254b89a7cc2SEnji Cooper ASSERT_TRUE(ParseNaturalNumber("123", &result)); 1255b89a7cc2SEnji Cooper EXPECT_EQ(123U, result); 1256b89a7cc2SEnji Cooper 1257b89a7cc2SEnji Cooper // Check 0 as an edge case. 1258b89a7cc2SEnji Cooper result = 1; 1259b89a7cc2SEnji Cooper ASSERT_TRUE(ParseNaturalNumber("0", &result)); 1260b89a7cc2SEnji Cooper EXPECT_EQ(0U, result); 1261b89a7cc2SEnji Cooper 1262b89a7cc2SEnji Cooper result = 1; 1263b89a7cc2SEnji Cooper ASSERT_TRUE(ParseNaturalNumber("00000", &result)); 1264b89a7cc2SEnji Cooper EXPECT_EQ(0U, result); 1265b89a7cc2SEnji Cooper } 1266b89a7cc2SEnji Cooper 1267b89a7cc2SEnji Cooper TEST(ParseNaturalNumberTest, AcceptsTypeLimits) { 1268b89a7cc2SEnji Cooper Message msg; 1269b89a7cc2SEnji Cooper msg << kBiggestParsableMax; 1270b89a7cc2SEnji Cooper 1271b89a7cc2SEnji Cooper BiggestParsable result = 0; 1272b89a7cc2SEnji Cooper EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result)); 1273b89a7cc2SEnji Cooper EXPECT_EQ(kBiggestParsableMax, result); 1274b89a7cc2SEnji Cooper 1275b89a7cc2SEnji Cooper Message msg2; 1276b89a7cc2SEnji Cooper msg2 << kBiggestSignedParsableMax; 1277b89a7cc2SEnji Cooper 1278b89a7cc2SEnji Cooper BiggestSignedParsable signed_result = 0; 1279b89a7cc2SEnji Cooper EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result)); 1280b89a7cc2SEnji Cooper EXPECT_EQ(kBiggestSignedParsableMax, signed_result); 1281b89a7cc2SEnji Cooper 1282b89a7cc2SEnji Cooper Message msg3; 1283b89a7cc2SEnji Cooper msg3 << INT_MAX; 1284b89a7cc2SEnji Cooper 1285b89a7cc2SEnji Cooper int int_result = 0; 1286b89a7cc2SEnji Cooper EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result)); 1287b89a7cc2SEnji Cooper EXPECT_EQ(INT_MAX, int_result); 1288b89a7cc2SEnji Cooper 1289b89a7cc2SEnji Cooper Message msg4; 1290b89a7cc2SEnji Cooper msg4 << UINT_MAX; 1291b89a7cc2SEnji Cooper 1292b89a7cc2SEnji Cooper unsigned int uint_result = 0; 1293b89a7cc2SEnji Cooper EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result)); 1294b89a7cc2SEnji Cooper EXPECT_EQ(UINT_MAX, uint_result); 1295b89a7cc2SEnji Cooper } 1296b89a7cc2SEnji Cooper 1297b89a7cc2SEnji Cooper TEST(ParseNaturalNumberTest, WorksForShorterIntegers) { 1298b89a7cc2SEnji Cooper short short_result = 0; 1299b89a7cc2SEnji Cooper ASSERT_TRUE(ParseNaturalNumber("123", &short_result)); 1300b89a7cc2SEnji Cooper EXPECT_EQ(123, short_result); 1301b89a7cc2SEnji Cooper 1302b89a7cc2SEnji Cooper signed char char_result = 0; 1303b89a7cc2SEnji Cooper ASSERT_TRUE(ParseNaturalNumber("123", &char_result)); 1304b89a7cc2SEnji Cooper EXPECT_EQ(123, char_result); 1305b89a7cc2SEnji Cooper } 1306b89a7cc2SEnji Cooper 1307*28f6c2f2SEnji Cooper #ifdef GTEST_OS_WINDOWS 1308b89a7cc2SEnji Cooper TEST(EnvironmentTest, HandleFitsIntoSizeT) { 1309b89a7cc2SEnji Cooper ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t)); 1310b89a7cc2SEnji Cooper } 1311b89a7cc2SEnji Cooper #endif // GTEST_OS_WINDOWS 1312b89a7cc2SEnji Cooper 1313b89a7cc2SEnji Cooper // Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger 1314b89a7cc2SEnji Cooper // failures when death tests are available on the system. 1315b89a7cc2SEnji Cooper TEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) { 1316b89a7cc2SEnji Cooper EXPECT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestExpectMacro"), 1317b89a7cc2SEnji Cooper "death inside CondDeathTestExpectMacro"); 1318b89a7cc2SEnji Cooper ASSERT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestAssertMacro"), 1319b89a7cc2SEnji Cooper "death inside CondDeathTestAssertMacro"); 1320b89a7cc2SEnji Cooper 1321b89a7cc2SEnji Cooper // Empty statement will not crash, which must trigger a failure. 1322b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, ""), ""); 1323b89a7cc2SEnji Cooper EXPECT_FATAL_FAILURE(ASSERT_DEATH_IF_SUPPORTED(;, ""), ""); 1324b89a7cc2SEnji Cooper } 1325b89a7cc2SEnji Cooper 1326b89a7cc2SEnji Cooper TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInFastStyle) { 1327*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "fast"); 1328b89a7cc2SEnji Cooper EXPECT_FALSE(InDeathTestChild()); 1329*28f6c2f2SEnji Cooper EXPECT_DEATH( 1330*28f6c2f2SEnji Cooper { 1331b89a7cc2SEnji Cooper fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside"); 1332b89a7cc2SEnji Cooper fflush(stderr); 1333b89a7cc2SEnji Cooper _exit(1); 1334*28f6c2f2SEnji Cooper }, 1335*28f6c2f2SEnji Cooper "Inside"); 1336b89a7cc2SEnji Cooper } 1337b89a7cc2SEnji Cooper 1338b89a7cc2SEnji Cooper TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInThreadSafeStyle) { 1339*28f6c2f2SEnji Cooper GTEST_FLAG_SET(death_test_style, "threadsafe"); 1340b89a7cc2SEnji Cooper EXPECT_FALSE(InDeathTestChild()); 1341*28f6c2f2SEnji Cooper EXPECT_DEATH( 1342*28f6c2f2SEnji Cooper { 1343b89a7cc2SEnji Cooper fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside"); 1344b89a7cc2SEnji Cooper fflush(stderr); 1345b89a7cc2SEnji Cooper _exit(1); 1346*28f6c2f2SEnji Cooper }, 1347*28f6c2f2SEnji Cooper "Inside"); 1348b89a7cc2SEnji Cooper } 1349b89a7cc2SEnji Cooper 1350*28f6c2f2SEnji Cooper void DieWithMessage(const char* message) { 1351*28f6c2f2SEnji Cooper fputs(message, stderr); 1352*28f6c2f2SEnji Cooper fflush(stderr); // Make sure the text is printed before the process exits. 1353*28f6c2f2SEnji Cooper _exit(1); 1354*28f6c2f2SEnji Cooper } 1355*28f6c2f2SEnji Cooper 1356*28f6c2f2SEnji Cooper TEST(MatcherDeathTest, DoesNotBreakBareRegexMatching) { 1357*28f6c2f2SEnji Cooper // googletest tests this, of course; here we ensure that including googlemock 1358*28f6c2f2SEnji Cooper // has not broken it. 1359*28f6c2f2SEnji Cooper #ifdef GTEST_USES_POSIX_RE 1360*28f6c2f2SEnji Cooper EXPECT_DEATH(DieWithMessage("O, I die, Horatio."), "I d[aeiou]e"); 1361*28f6c2f2SEnji Cooper #else 1362*28f6c2f2SEnji Cooper EXPECT_DEATH(DieWithMessage("O, I die, Horatio."), "I di?e"); 1363*28f6c2f2SEnji Cooper #endif 1364*28f6c2f2SEnji Cooper } 1365*28f6c2f2SEnji Cooper 1366*28f6c2f2SEnji Cooper TEST(MatcherDeathTest, MonomorphicMatcherMatches) { 1367*28f6c2f2SEnji Cooper EXPECT_DEATH(DieWithMessage("Behind O, I am slain!"), 1368*28f6c2f2SEnji Cooper Matcher<const std::string&>(ContainsRegex("I am slain"))); 1369*28f6c2f2SEnji Cooper } 1370*28f6c2f2SEnji Cooper 1371*28f6c2f2SEnji Cooper TEST(MatcherDeathTest, MonomorphicMatcherDoesNotMatch) { 1372*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE( 1373*28f6c2f2SEnji Cooper EXPECT_DEATH( 1374*28f6c2f2SEnji Cooper DieWithMessage("Behind O, I am slain!"), 1375*28f6c2f2SEnji Cooper Matcher<const std::string&>(ContainsRegex("Ow, I am slain"))), 1376*28f6c2f2SEnji Cooper "Expected: contains regular expression \"Ow, I am slain\""); 1377*28f6c2f2SEnji Cooper } 1378*28f6c2f2SEnji Cooper 1379*28f6c2f2SEnji Cooper TEST(MatcherDeathTest, PolymorphicMatcherMatches) { 1380*28f6c2f2SEnji Cooper EXPECT_DEATH(DieWithMessage("The rest is silence."), 1381*28f6c2f2SEnji Cooper ContainsRegex("rest is silence")); 1382*28f6c2f2SEnji Cooper } 1383*28f6c2f2SEnji Cooper 1384*28f6c2f2SEnji Cooper TEST(MatcherDeathTest, PolymorphicMatcherDoesNotMatch) { 1385*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE( 1386*28f6c2f2SEnji Cooper EXPECT_DEATH(DieWithMessage("The rest is silence."), 1387*28f6c2f2SEnji Cooper ContainsRegex("rest is science")), 1388*28f6c2f2SEnji Cooper "Expected: contains regular expression \"rest is science\""); 1389*28f6c2f2SEnji Cooper } 1390*28f6c2f2SEnji Cooper 1391*28f6c2f2SEnji Cooper } // namespace 1392*28f6c2f2SEnji Cooper 1393b89a7cc2SEnji Cooper #else // !GTEST_HAS_DEATH_TEST follows 1394b89a7cc2SEnji Cooper 1395*28f6c2f2SEnji Cooper namespace { 1396*28f6c2f2SEnji Cooper 1397b89a7cc2SEnji Cooper using testing::internal::CaptureStderr; 1398b89a7cc2SEnji Cooper using testing::internal::GetCapturedStderr; 1399b89a7cc2SEnji Cooper 1400b89a7cc2SEnji Cooper // Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED are still 1401b89a7cc2SEnji Cooper // defined but do not trigger failures when death tests are not available on 1402b89a7cc2SEnji Cooper // the system. 1403b89a7cc2SEnji Cooper TEST(ConditionalDeathMacrosTest, WarnsWhenDeathTestsNotAvailable) { 1404b89a7cc2SEnji Cooper // Empty statement will not crash, but that should not trigger a failure 1405b89a7cc2SEnji Cooper // when death tests are not supported. 1406b89a7cc2SEnji Cooper CaptureStderr(); 1407b89a7cc2SEnji Cooper EXPECT_DEATH_IF_SUPPORTED(;, ""); 1408b89a7cc2SEnji Cooper std::string output = GetCapturedStderr(); 1409b89a7cc2SEnji Cooper ASSERT_TRUE(NULL != strstr(output.c_str(), 1410b89a7cc2SEnji Cooper "Death tests are not supported on this platform")); 1411b89a7cc2SEnji Cooper ASSERT_TRUE(NULL != strstr(output.c_str(), ";")); 1412b89a7cc2SEnji Cooper 1413b89a7cc2SEnji Cooper // The streamed message should not be printed as there is no test failure. 1414b89a7cc2SEnji Cooper CaptureStderr(); 1415b89a7cc2SEnji Cooper EXPECT_DEATH_IF_SUPPORTED(;, "") << "streamed message"; 1416b89a7cc2SEnji Cooper output = GetCapturedStderr(); 1417b89a7cc2SEnji Cooper ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message")); 1418b89a7cc2SEnji Cooper 1419b89a7cc2SEnji Cooper CaptureStderr(); 1420b89a7cc2SEnji Cooper ASSERT_DEATH_IF_SUPPORTED(;, ""); // NOLINT 1421b89a7cc2SEnji Cooper output = GetCapturedStderr(); 1422b89a7cc2SEnji Cooper ASSERT_TRUE(NULL != strstr(output.c_str(), 1423b89a7cc2SEnji Cooper "Death tests are not supported on this platform")); 1424b89a7cc2SEnji Cooper ASSERT_TRUE(NULL != strstr(output.c_str(), ";")); 1425b89a7cc2SEnji Cooper 1426b89a7cc2SEnji Cooper CaptureStderr(); 1427b89a7cc2SEnji Cooper ASSERT_DEATH_IF_SUPPORTED(;, "") << "streamed message"; // NOLINT 1428b89a7cc2SEnji Cooper output = GetCapturedStderr(); 1429b89a7cc2SEnji Cooper ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message")); 1430b89a7cc2SEnji Cooper } 1431b89a7cc2SEnji Cooper 1432b89a7cc2SEnji Cooper void FuncWithAssert(int* n) { 1433b89a7cc2SEnji Cooper ASSERT_DEATH_IF_SUPPORTED(return;, ""); 1434b89a7cc2SEnji Cooper (*n)++; 1435b89a7cc2SEnji Cooper } 1436b89a7cc2SEnji Cooper 1437b89a7cc2SEnji Cooper // Tests that ASSERT_DEATH_IF_SUPPORTED does not return from the current 1438b89a7cc2SEnji Cooper // function (as ASSERT_DEATH does) if death tests are not supported. 1439b89a7cc2SEnji Cooper TEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) { 1440b89a7cc2SEnji Cooper int n = 0; 1441b89a7cc2SEnji Cooper FuncWithAssert(&n); 1442b89a7cc2SEnji Cooper EXPECT_EQ(1, n); 1443b89a7cc2SEnji Cooper } 1444b89a7cc2SEnji Cooper 1445*28f6c2f2SEnji Cooper } // namespace 1446*28f6c2f2SEnji Cooper 1447b89a7cc2SEnji Cooper #endif // !GTEST_HAS_DEATH_TEST 1448b89a7cc2SEnji Cooper 1449*28f6c2f2SEnji Cooper namespace { 1450*28f6c2f2SEnji Cooper 1451*28f6c2f2SEnji Cooper // The following code intentionally tests a suboptimal syntax. 1452*28f6c2f2SEnji Cooper #ifdef __GNUC__ 1453*28f6c2f2SEnji Cooper #pragma GCC diagnostic push 1454*28f6c2f2SEnji Cooper #pragma GCC diagnostic ignored "-Wdangling-else" 1455*28f6c2f2SEnji Cooper #pragma GCC diagnostic ignored "-Wempty-body" 1456*28f6c2f2SEnji Cooper #pragma GCC diagnostic ignored "-Wpragmas" 1457*28f6c2f2SEnji Cooper #endif 1458b89a7cc2SEnji Cooper // Tests that the death test macros expand to code which may or may not 1459b89a7cc2SEnji Cooper // be followed by operator<<, and that in either case the complete text 1460b89a7cc2SEnji Cooper // comprises only a single C++ statement. 1461b89a7cc2SEnji Cooper // 1462b89a7cc2SEnji Cooper // The syntax should work whether death tests are available or not. 1463b89a7cc2SEnji Cooper TEST(ConditionalDeathMacrosSyntaxDeathTest, SingleStatement) { 1464b89a7cc2SEnji Cooper if (AlwaysFalse()) 1465b89a7cc2SEnji Cooper // This would fail if executed; this is a compilation test only 1466b89a7cc2SEnji Cooper ASSERT_DEATH_IF_SUPPORTED(return, ""); 1467b89a7cc2SEnji Cooper 1468b89a7cc2SEnji Cooper if (AlwaysTrue()) 1469b89a7cc2SEnji Cooper EXPECT_DEATH_IF_SUPPORTED(_exit(1), ""); 1470b89a7cc2SEnji Cooper else 1471b89a7cc2SEnji Cooper // This empty "else" branch is meant to ensure that EXPECT_DEATH 1472b89a7cc2SEnji Cooper // doesn't expand into an "if" statement without an "else" 1473b89a7cc2SEnji Cooper ; // NOLINT 1474b89a7cc2SEnji Cooper 1475*28f6c2f2SEnji Cooper if (AlwaysFalse()) ASSERT_DEATH_IF_SUPPORTED(return, "") << "did not die"; 1476b89a7cc2SEnji Cooper 1477b89a7cc2SEnji Cooper if (AlwaysFalse()) 1478b89a7cc2SEnji Cooper ; // NOLINT 1479b89a7cc2SEnji Cooper else 1480b89a7cc2SEnji Cooper EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << 1 << 2 << 3; 1481b89a7cc2SEnji Cooper } 1482*28f6c2f2SEnji Cooper #ifdef __GNUC__ 1483*28f6c2f2SEnji Cooper #pragma GCC diagnostic pop 1484*28f6c2f2SEnji Cooper #endif 1485b89a7cc2SEnji Cooper 1486b89a7cc2SEnji Cooper // Tests that conditional death test macros expand to code which interacts 1487b89a7cc2SEnji Cooper // well with switch statements. 1488b89a7cc2SEnji Cooper TEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) { 1489b89a7cc2SEnji Cooper // Microsoft compiler usually complains about switch statements without 1490b89a7cc2SEnji Cooper // case labels. We suppress that warning for this test. 1491b89a7cc2SEnji Cooper GTEST_DISABLE_MSC_WARNINGS_PUSH_(4065) 1492b89a7cc2SEnji Cooper 1493b89a7cc2SEnji Cooper switch (0) 1494b89a7cc2SEnji Cooper default: 1495*28f6c2f2SEnji Cooper ASSERT_DEATH_IF_SUPPORTED(_exit(1), "") << "exit in default switch handler"; 1496b89a7cc2SEnji Cooper 1497b89a7cc2SEnji Cooper switch (0) 1498b89a7cc2SEnji Cooper case 0: 1499b89a7cc2SEnji Cooper EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << "exit in switch case"; 1500b89a7cc2SEnji Cooper 1501b89a7cc2SEnji Cooper GTEST_DISABLE_MSC_WARNINGS_POP_() 1502b89a7cc2SEnji Cooper } 1503b89a7cc2SEnji Cooper 1504b89a7cc2SEnji Cooper // Tests that a test case whose name ends with "DeathTest" works fine 1505b89a7cc2SEnji Cooper // on Windows. 1506*28f6c2f2SEnji Cooper TEST(NotADeathTest, Test) { SUCCEED(); } 1507*28f6c2f2SEnji Cooper 1508*28f6c2f2SEnji Cooper } // namespace 1509