14b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Copyright 2005, Google Inc. 24b6829f0d28990dd645e16386eb226d0f10c8731shiqian// All rights reserved. 34b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Redistribution and use in source and binary forms, with or without 54b6829f0d28990dd645e16386eb226d0f10c8731shiqian// modification, are permitted provided that the following conditions are 64b6829f0d28990dd645e16386eb226d0f10c8731shiqian// met: 74b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 84b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions of source code must retain the above copyright 94b6829f0d28990dd645e16386eb226d0f10c8731shiqian// notice, this list of conditions and the following disclaimer. 104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions in binary form must reproduce the above 114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// copyright notice, this list of conditions and the following disclaimer 124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in the documentation and/or other materials provided with the 134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// distribution. 144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Neither the name of Google Inc. nor the names of its 154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// contributors may be used to endorse or promote products derived from 164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// this software without specific prior written permission. 174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Author: wan@google.com (Zhanyong Wan) 314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests for death tests. 334b6829f0d28990dd645e16386eb226d0f10c8731shiqian 342620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest-death-test.h" 352620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest.h" 362620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/internal/gtest-filepath.h" 374b6829f0d28990dd645e16386eb226d0f10c8731shiqian 38f6d087b78d230d875bf5d8281112662795044680zhanyong.wanusing testing::internal::AlwaysFalse; 39f6d087b78d230d875bf5d8281112662795044680zhanyong.wanusing testing::internal::AlwaysTrue; 40f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 414cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_DEATH_TEST 424b6829f0d28990dd645e16386eb226d0f10c8731shiqian 43733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS 44733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <direct.h> // For chdir(). 45733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else 46733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <unistd.h> 47733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/wait.h> // For waitpid. 48733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS 49c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 50733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <limits.h> 51733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <signal.h> 52733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <stdio.h> 53dd617c1bc8e67a915068e8462881fbc5e2f6ae30zhanyong.wan 547c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev# if GTEST_OS_LINUX 557c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev# include <sys/time.h> 567c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev# endif // GTEST_OS_LINUX 577c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev 58733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include "gtest/gtest-spi.h" 594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Indicates that this translation unit is part of Google Test's 614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// implementation. It must come before gtest-internal-inl.h is 624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// included, or there will be a compiler error. This trick is to 634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// prevent a user from accidentally including gtest-internal-inl.h in 644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// his code. 65733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_IMPLEMENTATION_ 1 66733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include "src/gtest-internal-inl.h" 67733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# undef GTEST_IMPLEMENTATION_ 684b6829f0d28990dd645e16386eb226d0f10c8731shiqian 69a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wannamespace posix = ::testing::internal::posix; 70c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 71a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wanusing testing::Message; 724b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::internal::DeathTest; 734b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::internal::DeathTestFactory; 74baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wanusing testing::internal::FilePath; 75b0b40063a828ca7a4ceb079ecd508775c6aa9d93zhanyong.wanusing testing::internal::GetLastErrnoDescription; 76a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wanusing testing::internal::GetUnitTestImpl; 77f46f3eaf059b7b3ca00a3428c594bd477bc1839cvladlosevusing testing::internal::InDeathTestChild; 78c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanusing testing::internal::ParseNaturalNumber; 794b6829f0d28990dd645e16386eb226d0f10c8731shiqian 804b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing { 814b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 824b6829f0d28990dd645e16386eb226d0f10c8731shiqian 834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A helper class whose objects replace the death test factory for a 844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// single UnitTest object during their lifetimes. 854b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass ReplaceDeathTestFactory { 864b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 87a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan explicit ReplaceDeathTestFactory(DeathTestFactory* new_factory) 88a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan : unit_test_impl_(GetUnitTestImpl()) { 89a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan old_factory_ = unit_test_impl_->death_test_factory_.release(); 90a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan unit_test_impl_->death_test_factory_.reset(new_factory); 914b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 924b6829f0d28990dd645e16386eb226d0f10c8731shiqian 934b6829f0d28990dd645e16386eb226d0f10c8731shiqian ~ReplaceDeathTestFactory() { 94a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan unit_test_impl_->death_test_factory_.release(); 95a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan unit_test_impl_->death_test_factory_.reset(old_factory_); 964b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 974b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 984b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Prevents copying ReplaceDeathTestFactory objects. 994b6829f0d28990dd645e16386eb226d0f10c8731shiqian ReplaceDeathTestFactory(const ReplaceDeathTestFactory&); 1004b6829f0d28990dd645e16386eb226d0f10c8731shiqian void operator=(const ReplaceDeathTestFactory&); 1014b6829f0d28990dd645e16386eb226d0f10c8731shiqian 102a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan UnitTestImpl* unit_test_impl_; 1034b6829f0d28990dd645e16386eb226d0f10c8731shiqian DeathTestFactory* old_factory_; 1044b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 1054b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1064b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace internal 1074b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace testing 1084b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10934b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wanvoid DieWithMessage(const ::std::string& message) { 11034b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan fprintf(stderr, "%s", message.c_str()); 11134b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan fflush(stderr); // Make sure the text is printed before the process exits. 11234b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan 113b1fc4d36385c457e2237e778859759219f1604b6vladlosev // We call _exit() instead of exit(), as the former is a direct 114b1fc4d36385c457e2237e778859759219f1604b6vladlosev // system call and thus safer in the presence of threads. exit() 115b1fc4d36385c457e2237e778859759219f1604b6vladlosev // will invoke user-defined exit-hooks, which may do dangerous 116b1fc4d36385c457e2237e778859759219f1604b6vladlosev // things that conflict with death tests. 1170a4157359e39ecd69e143e4410099eadfb320f75vladlosev // 1180a4157359e39ecd69e143e4410099eadfb320f75vladlosev // Some compilers can recognize that _exit() never returns and issue the 1190a4157359e39ecd69e143e4410099eadfb320f75vladlosev // 'unreachable code' warning for code following this function, unless 1200a4157359e39ecd69e143e4410099eadfb320f75vladlosev // fooled by a fake condition. 1210a4157359e39ecd69e143e4410099eadfb320f75vladlosev if (AlwaysTrue()) 1220a4157359e39ecd69e143e4410099eadfb320f75vladlosev _exit(1); 123b1fc4d36385c457e2237e778859759219f1604b6vladlosev} 124b1fc4d36385c457e2237e778859759219f1604b6vladlosev 12534b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wanvoid DieInside(const ::std::string& function) { 12634b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan DieWithMessage("death inside " + function + "()."); 12734b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan} 12834b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan 1294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that death tests work. 1304b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1314b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass TestForDeathTest : public testing::Test { 1324b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected: 133baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {} 134baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 135baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan virtual ~TestForDeathTest() { 136c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan posix::ChDir(original_dir_.c_str()); 137baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } 138baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 1394b6829f0d28990dd645e16386eb226d0f10c8731shiqian // A static member function that's expected to die. 140b1fc4d36385c457e2237e778859759219f1604b6vladlosev static void StaticMemberFunction() { DieInside("StaticMemberFunction"); } 1414b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1424b6829f0d28990dd645e16386eb226d0f10c8731shiqian // A method of the test fixture that may die. 1434b6829f0d28990dd645e16386eb226d0f10c8731shiqian void MemberFunction() { 144b1fc4d36385c457e2237e778859759219f1604b6vladlosev if (should_die_) 145b1fc4d36385c457e2237e778859759219f1604b6vladlosev DieInside("MemberFunction"); 1464b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1474b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1484b6829f0d28990dd645e16386eb226d0f10c8731shiqian // True iff MemberFunction() should die. 1494b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool should_die_; 150baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan const FilePath original_dir_; 1514b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 1524b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1534b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A class with a member function that may die. 1544b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MayDie { 1554b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 1564b6829f0d28990dd645e16386eb226d0f10c8731shiqian explicit MayDie(bool should_die) : should_die_(should_die) {} 1574b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1584b6829f0d28990dd645e16386eb226d0f10c8731shiqian // A member function that may die. 1594b6829f0d28990dd645e16386eb226d0f10c8731shiqian void MemberFunction() const { 160b1fc4d36385c457e2237e778859759219f1604b6vladlosev if (should_die_) 161b1fc4d36385c457e2237e778859759219f1604b6vladlosev DieInside("MayDie::MemberFunction"); 1624b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1634b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1644b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 1654b6829f0d28990dd645e16386eb226d0f10c8731shiqian // True iff MemberFunction() should die. 1664b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool should_die_; 1674b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 1684b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A global function that's expected to die. 170b1fc4d36385c457e2237e778859759219f1604b6vladlosevvoid GlobalFunction() { DieInside("GlobalFunction"); } 1714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A non-void function that's expected to die. 1734b6829f0d28990dd645e16386eb226d0f10c8731shiqianint NonVoidFunction() { 174b1fc4d36385c457e2237e778859759219f1604b6vladlosev DieInside("NonVoidFunction"); 1754b6829f0d28990dd645e16386eb226d0f10c8731shiqian return 1; 1764b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1774b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A unary function that may die. 1794b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid DieIf(bool should_die) { 180b1fc4d36385c457e2237e778859759219f1604b6vladlosev if (should_die) 181b1fc4d36385c457e2237e778859759219f1604b6vladlosev DieInside("DieIf"); 1824b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A binary function that may die. 1854b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool DieIfLessThan(int x, int y) { 1864b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (x < y) { 187b1fc4d36385c457e2237e778859759219f1604b6vladlosev DieInside("DieIfLessThan"); 1884b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1894b6829f0d28990dd645e16386eb226d0f10c8731shiqian return true; 1904b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture. 1934b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid DeathTestSubroutine() { 1944b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(GlobalFunction(), "death.*GlobalFunction"); 1954b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH(GlobalFunction(), "death.*GlobalFunction"); 1964b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1974b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Death in dbg, not opt. 1994b6829f0d28990dd645e16386eb226d0f10c8731shiqianint DieInDebugElse12(int* sideeffect) { 2004b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (sideeffect) *sideeffect = 12; 201733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 202733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifndef NDEBUG 203733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 204b1fc4d36385c457e2237e778859759219f1604b6vladlosev DieInside("DieInDebugElse12"); 205733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 206733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // NDEBUG 207733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 2084b6829f0d28990dd645e16386eb226d0f10c8731shiqian return 12; 2094b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 2104b6829f0d28990dd645e16386eb226d0f10c8731shiqian 211733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS 212c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 213c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan// Tests the ExitedWithCode predicate. 214c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanTEST(ExitStatusPredicateTest, ExitedWithCode) { 215c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // On Windows, the process's exit code is the same as its exit status, 216c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // so the predicate just compares the its input with its parameter. 217c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_TRUE(testing::ExitedWithCode(0)(0)); 218c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_TRUE(testing::ExitedWithCode(1)(1)); 219c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_TRUE(testing::ExitedWithCode(42)(42)); 220c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_FALSE(testing::ExitedWithCode(0)(1)); 221c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_FALSE(testing::ExitedWithCode(1)(0)); 222c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 223c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 224733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else 225c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 226c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// Returns the exit status of a process that calls _exit(2) with a 2274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// given exit code. This is a helper function for the 2284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// ExitStatusPredicateTest test suite. 2294b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic int NormalExitStatus(int exit_code) { 2304b6829f0d28990dd645e16386eb226d0f10c8731shiqian pid_t child_pid = fork(); 2314b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (child_pid == 0) { 232c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian _exit(exit_code); 2334b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 2344b6829f0d28990dd645e16386eb226d0f10c8731shiqian int status; 2354b6829f0d28990dd645e16386eb226d0f10c8731shiqian waitpid(child_pid, &status, 0); 2364b6829f0d28990dd645e16386eb226d0f10c8731shiqian return status; 2374b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 2384b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the exit status of a process that raises a given signal. 2404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// If the signal does not cause the process to die, then it returns 2414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// instead the exit status of a process that exits normally with exit 2424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// code 1. This is a helper function for the ExitStatusPredicateTest 2434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test suite. 2444b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic int KilledExitStatus(int signum) { 2454b6829f0d28990dd645e16386eb226d0f10c8731shiqian pid_t child_pid = fork(); 2464b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (child_pid == 0) { 2474b6829f0d28990dd645e16386eb226d0f10c8731shiqian raise(signum); 248c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian _exit(1); 2494b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 2504b6829f0d28990dd645e16386eb226d0f10c8731shiqian int status; 2514b6829f0d28990dd645e16386eb226d0f10c8731shiqian waitpid(child_pid, &status, 0); 2524b6829f0d28990dd645e16386eb226d0f10c8731shiqian return status; 2534b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 2544b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the ExitedWithCode predicate. 2564b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExitStatusPredicateTest, ExitedWithCode) { 2574b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int status0 = NormalExitStatus(0); 2584b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int status1 = NormalExitStatus(1); 2594b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int status42 = NormalExitStatus(42); 2604b6829f0d28990dd645e16386eb226d0f10c8731shiqian const testing::ExitedWithCode pred0(0); 2614b6829f0d28990dd645e16386eb226d0f10c8731shiqian const testing::ExitedWithCode pred1(1); 2624b6829f0d28990dd645e16386eb226d0f10c8731shiqian const testing::ExitedWithCode pred42(42); 2634b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_PRED1(pred0, status0); 2644b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_PRED1(pred1, status1); 2654b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_PRED1(pred42, status42); 2664b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(pred0(status1)); 2674b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(pred42(status0)); 2684b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(pred1(status42)); 2694b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 2704b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the KilledBySignal predicate. 2724b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExitStatusPredicateTest, KilledBySignal) { 2734b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int status_segv = KilledExitStatus(SIGSEGV); 2744b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int status_kill = KilledExitStatus(SIGKILL); 2754b6829f0d28990dd645e16386eb226d0f10c8731shiqian const testing::KilledBySignal pred_segv(SIGSEGV); 2764b6829f0d28990dd645e16386eb226d0f10c8731shiqian const testing::KilledBySignal pred_kill(SIGKILL); 2774b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_PRED1(pred_segv, status_segv); 2784b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_PRED1(pred_kill, status_kill); 2794b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(pred_segv(status_kill)); 2804b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(pred_kill(status_segv)); 2814b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 2824b6829f0d28990dd645e16386eb226d0f10c8731shiqian 283733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS 284c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 2854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the death test macros expand to code which may or may not 2864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// be followed by operator<<, and that in either case the complete text 2874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// comprises only a single C++ statement. 2884b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, SingleStatement) { 289f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (AlwaysFalse()) 2904b6829f0d28990dd645e16386eb226d0f10c8731shiqian // This would fail if executed; this is a compilation test only 2914b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH(return, ""); 2924b6829f0d28990dd645e16386eb226d0f10c8731shiqian 293f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (AlwaysTrue()) 294c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(1), ""); 2954b6829f0d28990dd645e16386eb226d0f10c8731shiqian else 2964b6829f0d28990dd645e16386eb226d0f10c8731shiqian // This empty "else" branch is meant to ensure that EXPECT_DEATH 2974b6829f0d28990dd645e16386eb226d0f10c8731shiqian // doesn't expand into an "if" statement without an "else" 2984b6829f0d28990dd645e16386eb226d0f10c8731shiqian ; 2994b6829f0d28990dd645e16386eb226d0f10c8731shiqian 300f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (AlwaysFalse()) 3014b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH(return, "") << "did not die"; 3024b6829f0d28990dd645e16386eb226d0f10c8731shiqian 303f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (AlwaysFalse()) 3044b6829f0d28990dd645e16386eb226d0f10c8731shiqian ; 3054b6829f0d28990dd645e16386eb226d0f10c8731shiqian else 306c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(1), "") << 1 << 2 << 3; 3074b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3084b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3094b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid DieWithEmbeddedNul() { 31089be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan fprintf(stderr, "Hello%cmy null world.\n", '\0'); 311c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan fflush(stderr); 312c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian _exit(1); 3134b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3144b6829f0d28990dd645e16386eb226d0f10c8731shiqian 315733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_USES_PCRE 3164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error 3174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// message has a NUL character in it. 318dd617c1bc8e67a915068e8462881fbc5e2f6ae30zhanyong.wanTEST_F(TestForDeathTest, EmbeddedNulInMessage) { 3194b6829f0d28990dd645e16386eb226d0f10c8731shiqian // TODO(wan@google.com): <regex.h> doesn't support matching strings 3204b6829f0d28990dd645e16386eb226d0f10c8731shiqian // with embedded NUL characters - find a way to workaround it. 32189be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan EXPECT_DEATH(DieWithEmbeddedNul(), "my null world"); 32289be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan ASSERT_DEATH(DieWithEmbeddedNul(), "my null world"); 3234b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 324733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_USES_PCRE 3254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that death test macros expand to code which interacts well with switch 3274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// statements. 3284b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, SwitchStatement) { 329f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // Microsoft compiler usually complains about switch statements without 330f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // case labels. We suppress that warning for this test. 331f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_PUSH_(4065) 332c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 3334b6829f0d28990dd645e16386eb226d0f10c8731shiqian switch (0) 3344b6829f0d28990dd645e16386eb226d0f10c8731shiqian default: 335c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian ASSERT_DEATH(_exit(1), "") << "exit in default switch handler"; 3364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3374b6829f0d28990dd645e16386eb226d0f10c8731shiqian switch (0) 3384b6829f0d28990dd645e16386eb226d0f10c8731shiqian case 0: 339c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(1), "") << "exit in switch case"; 340c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 341f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_POP_() 3424b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 344c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// Tests that a static member function can be used in a "fast" style 345c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// death test. 346c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqianTEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) { 347c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian testing::GTEST_FLAG(death_test_style) = "fast"; 3484b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember"); 3494b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3504b6829f0d28990dd645e16386eb226d0f10c8731shiqian 351c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// Tests that a method of the test fixture can be used in a "fast" 352c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// style death test. 353c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqianTEST_F(TestForDeathTest, MemberFunctionFastStyle) { 354c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian testing::GTEST_FLAG(death_test_style) = "fast"; 3554b6829f0d28990dd645e16386eb226d0f10c8731shiqian should_die_ = true; 3564b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction"); 3574b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3584b6829f0d28990dd645e16386eb226d0f10c8731shiqian 359c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wanvoid ChangeToRootDir() { posix::ChDir(GTEST_PATH_SEP_); } 360c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 361c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// Tests that death tests work even if the current directory has been 362c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// changed. 363c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqianTEST_F(TestForDeathTest, FastDeathTestInChangedDir) { 364c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian testing::GTEST_FLAG(death_test_style) = "fast"; 365c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian 366c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan ChangeToRootDir(); 367c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); 368c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian 369c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan ChangeToRootDir(); 370c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian ASSERT_DEATH(_exit(1), ""); 371c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian} 372c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian 3737c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev# if GTEST_OS_LINUX 3747c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosevvoid SigprofAction(int, siginfo_t*, void*) { /* no op */ } 3757c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev 3767c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev// Sets SIGPROF action and ITIMER_PROF timer (interval: 1ms). 3777c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosevvoid SetSigprofActionAndTimer() { 3787c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev struct itimerval timer; 3797c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev timer.it_interval.tv_sec = 0; 3807c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev timer.it_interval.tv_usec = 1; 3817c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev timer.it_value = timer.it_interval; 3827c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL)); 3837c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev struct sigaction signal_action; 3847c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev memset(&signal_action, 0, sizeof(signal_action)); 3857c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev sigemptyset(&signal_action.sa_mask); 3867c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev signal_action.sa_sigaction = SigprofAction; 3877c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev signal_action.sa_flags = SA_RESTART | SA_SIGINFO; 3887c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, NULL)); 3897c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev} 3907c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev 3917c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev// Disables ITIMER_PROF timer and ignores SIGPROF signal. 3927c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosevvoid DisableSigprofActionAndTimer(struct sigaction* old_signal_action) { 3937c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev struct itimerval timer; 3945f4d53c8ef453c82f87095711dd072370d496c0bvladlosev timer.it_interval.tv_sec = 0; 3957c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev timer.it_interval.tv_usec = 0; 3965f4d53c8ef453c82f87095711dd072370d496c0bvladlosev timer.it_value = timer.it_interval; 3977c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL)); 3987c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev struct sigaction signal_action; 3997c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev memset(&signal_action, 0, sizeof(signal_action)); 4007c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev sigemptyset(&signal_action.sa_mask); 4017c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev signal_action.sa_handler = SIG_IGN; 4027c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, old_signal_action)); 4037c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev} 4047c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev 4057c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev// Tests that death tests work when SIGPROF handler and timer are set. 4067c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosevTEST_F(TestForDeathTest, FastSigprofActionSet) { 4077c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev testing::GTEST_FLAG(death_test_style) = "fast"; 4087c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev SetSigprofActionAndTimer(); 4097c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev EXPECT_DEATH(_exit(1), ""); 4107c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev struct sigaction old_signal_action; 4117c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev DisableSigprofActionAndTimer(&old_signal_action); 4127c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction); 4137c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev} 4147c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev 4157c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosevTEST_F(TestForDeathTest, ThreadSafeSigprofActionSet) { 4167c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev testing::GTEST_FLAG(death_test_style) = "threadsafe"; 4177c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev SetSigprofActionAndTimer(); 4187c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev EXPECT_DEATH(_exit(1), ""); 4197c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev struct sigaction old_signal_action; 4207c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev DisableSigprofActionAndTimer(&old_signal_action); 4217c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction); 4227c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev} 4237c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev# endif // GTEST_OS_LINUX 4247c3004c3013fe4adf5e0447d37ee2d0501c2b227vladlosev 4254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Repeats a representative sample of death tests in the "threadsafe" style: 4264b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4274b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) { 4284b6829f0d28990dd645e16386eb226d0f10c8731shiqian testing::GTEST_FLAG(death_test_style) = "threadsafe"; 4294b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember"); 4304b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4324b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) { 4334b6829f0d28990dd645e16386eb226d0f10c8731shiqian testing::GTEST_FLAG(death_test_style) = "threadsafe"; 4344b6829f0d28990dd645e16386eb226d0f10c8731shiqian should_die_ = true; 4354b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction"); 4364b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4374b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4384b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) { 4394b6829f0d28990dd645e16386eb226d0f10c8731shiqian testing::GTEST_FLAG(death_test_style) = "threadsafe"; 4404b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4414b6829f0d28990dd645e16386eb226d0f10c8731shiqian for (int i = 0; i < 3; ++i) 442c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), "") << ": i = " << i; 443c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian} 444c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian 445c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqianTEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) { 446c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian testing::GTEST_FLAG(death_test_style) = "threadsafe"; 447c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian 448c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan ChangeToRootDir(); 449c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); 450c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian 451c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan ChangeToRootDir(); 452c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian ASSERT_DEATH(_exit(1), ""); 4534b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4544b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4554b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, MixedStyles) { 4564b6829f0d28990dd645e16386eb226d0f10c8731shiqian testing::GTEST_FLAG(death_test_style) = "threadsafe"; 457c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(1), ""); 4584b6829f0d28990dd645e16386eb226d0f10c8731shiqian testing::GTEST_FLAG(death_test_style) = "fast"; 459c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(1), ""); 4604b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4614b6829f0d28990dd645e16386eb226d0f10c8731shiqian 46274de57c951aedebc5dfe26a27604353432392b98zhanyong.wan# if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD 46374de57c951aedebc5dfe26a27604353432392b98zhanyong.wan 4644b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace { 4654b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4664b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool pthread_flag; 4674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4684b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid SetPthreadFlag() { 4694b6829f0d28990dd645e16386eb226d0f10c8731shiqian pthread_flag = true; 4704b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4724b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace 4734b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4744b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) { 47521d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian if (!testing::GTEST_FLAG(death_test_use_fork)) { 47621d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian testing::GTEST_FLAG(death_test_style) = "threadsafe"; 47721d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian pthread_flag = false; 47821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL)); 47921d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian ASSERT_DEATH(_exit(1), ""); 48021d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian ASSERT_FALSE(pthread_flag); 48121d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian } 4824b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 484733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD 485c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 4864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that a method of another class can be used in a death test. 4874b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, MethodOfAnotherClass) { 4884b6829f0d28990dd645e16386eb226d0f10c8731shiqian const MayDie x(true); 4894b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH(x.MemberFunction(), "MayDie\\:\\:MemberFunction"); 4904b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that a global function can be used in a death test. 4934b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, GlobalFunction) { 4944b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(GlobalFunction(), "GlobalFunction"); 4954b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4964b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4974b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that any value convertible to an RE works as a second 4984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument to EXPECT_DEATH. 4994b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) { 5004b6829f0d28990dd645e16386eb226d0f10c8731shiqian static const char regex_c_str[] = "GlobalFunction"; 5014b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(GlobalFunction(), regex_c_str); 5024b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5034b6829f0d28990dd645e16386eb226d0f10c8731shiqian const testing::internal::RE regex(regex_c_str); 5044b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(GlobalFunction(), regex); 5054b6829f0d28990dd645e16386eb226d0f10c8731shiqian 506733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_HAS_GLOBAL_STRING 507733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 5084b6829f0d28990dd645e16386eb226d0f10c8731shiqian const string regex_str(regex_c_str); 5094b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(GlobalFunction(), regex_str); 510733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 511733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_HAS_GLOBAL_STRING 5124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5134b6829f0d28990dd645e16386eb226d0f10c8731shiqian const ::std::string regex_std_str(regex_c_str); 5144b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(GlobalFunction(), regex_std_str); 5154b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5164b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that a non-void function can be used in a death test. 5184b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, NonVoidFunction) { 5194b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH(NonVoidFunction(), "NonVoidFunction"); 5204b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that functions that take parameter(s) can be used in a death test. 5234b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, FunctionWithParameter) { 5244b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(DieIf(true), "DieIf\\(\\)"); 5254b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(DieIfLessThan(2, 3), "DieIfLessThan"); 5264b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5274b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture. 5294b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, OutsideFixture) { 5304b6829f0d28990dd645e16386eb226d0f10c8731shiqian DeathTestSubroutine(); 5314b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5324b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that death tests can be done inside a loop. 5344b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, InsideLoop) { 5354b6829f0d28990dd645e16386eb226d0f10c8731shiqian for (int i = 0; i < 5; i++) { 5364b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(DieIfLessThan(-1, i), "DieIfLessThan") << "where i == " << i; 5374b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 5384b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that a compound statement can be used in a death test. 5414b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, CompoundStatement) { 5424b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH({ // NOLINT 5434b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int x = 2; 5444b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int y = x + 1; 5454b6829f0d28990dd645e16386eb226d0f10c8731shiqian DieIfLessThan(x, y); 5464b6829f0d28990dd645e16386eb226d0f10c8731shiqian }, 5474b6829f0d28990dd645e16386eb226d0f10c8731shiqian "DieIfLessThan"); 5484b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5494b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that code that doesn't die causes a death test to fail. 5514b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, DoesNotDie) { 5524b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), "DieIf"), 5534b6829f0d28990dd645e16386eb226d0f10c8731shiqian "failed to die"); 5544b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5554b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5564b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that a death test fails when the error message isn't expected. 5574b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, ErrorMessageMismatch) { 5584b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_NONFATAL_FAILURE({ // NOLINT 5594b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(DieIf(true), "DieIfLessThan") << "End of death test message."; 5604b6829f0d28990dd645e16386eb226d0f10c8731shiqian }, "died but not with expected error"); 5614b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5624b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// On exit, *aborted will be true iff the EXPECT_DEATH() statement 5644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// aborted the function. 5654b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid ExpectDeathTestHelper(bool* aborted) { 5664b6829f0d28990dd645e16386eb226d0f10c8731shiqian *aborted = true; 5674b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(DieIf(false), "DieIf"); // This assertion should fail. 5684b6829f0d28990dd645e16386eb226d0f10c8731shiqian *aborted = false; 5694b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5704b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_DEATH doesn't abort the test on failure. 5724b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, EXPECT_DEATH) { 5734b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool aborted = true; 5744b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted), 5754b6829f0d28990dd645e16386eb226d0f10c8731shiqian "failed to die"); 5764b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(aborted); 5774b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5784b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ASSERT_DEATH does abort the test on failure. 5804b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, ASSERT_DEATH) { 5814b6829f0d28990dd645e16386eb226d0f10c8731shiqian static bool aborted; 5824b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FATAL_FAILURE({ // NOLINT 5834b6829f0d28990dd645e16386eb226d0f10c8731shiqian aborted = true; 5844b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH(DieIf(false), "DieIf"); // This assertion should fail. 5854b6829f0d28990dd645e16386eb226d0f10c8731shiqian aborted = false; 5864b6829f0d28990dd645e16386eb226d0f10c8731shiqian }, "failed to die"); 5874b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(aborted); 5884b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5894b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_DEATH evaluates the arguments exactly once. 5914b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, SingleEvaluation) { 5924b6829f0d28990dd645e16386eb226d0f10c8731shiqian int x = 3; 5934b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(DieIf((++x) == 4), "DieIf"); 5944b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5954b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* regex = "DieIf"; 5964b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* regex_save = regex; 5974b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(DieIfLessThan(3, 4), regex++); 5984b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(regex_save + 1, regex); 5994b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6004b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6014b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that run-away death tests are reported as failures. 602636f903d84ec28714cb3d84a346dfb58f5bc99d3vladlosevTEST_F(TestForDeathTest, RunawayIsFailure) { 6034b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), "Foo"), 6044b6829f0d28990dd645e16386eb226d0f10c8731shiqian "failed to die."); 605636f903d84ec28714cb3d84a346dfb58f5bc99d3vladlosev} 6064b6829f0d28990dd645e16386eb226d0f10c8731shiqian 607636f903d84ec28714cb3d84a346dfb58f5bc99d3vladlosev// Tests that death tests report executing 'return' in the statement as 608636f903d84ec28714cb3d84a346dfb58f5bc99d3vladlosev// failure. 609636f903d84ec28714cb3d84a346dfb58f5bc99d3vladlosevTEST_F(TestForDeathTest, ReturnIsFailure) { 6104b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, "Bar"), 6114b6829f0d28990dd645e16386eb226d0f10c8731shiqian "illegal return in test statement."); 6124b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6134b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6147a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests that EXPECT_DEBUG_DEATH works as expected, that is, you can stream a 6157a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// message to it, and in debug mode it: 6164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 1. Asserts on death. 6174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2. Has no side effect. 6184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 6194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// And in opt mode, it: 6204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 1. Has side effects but does not assert. 6214b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, TestExpectDebugDeath) { 6224b6829f0d28990dd645e16386eb226d0f10c8731shiqian int sideeffect = 0; 6234b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6247a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12") 6257a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com << "Must accept a streamed message"; 6264b6829f0d28990dd645e16386eb226d0f10c8731shiqian 627733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifdef NDEBUG 628733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 6294b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Checks that the assignment occurs in opt mode (sideeffect). 6304b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(12, sideeffect); 631733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 632733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else 633733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 6344b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Checks that the assignment does not occur in dbg mode (no sideeffect). 6354b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, sideeffect); 636733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 637733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif 6384b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6407a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests that ASSERT_DEBUG_DEATH works as expected, that is, you can stream a 6417a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// message to it, and in debug mode it: 6427a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// 1. Asserts on death. 6434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2. Has no side effect. 6444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 6457a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// And in opt mode, it: 6467a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// 1. Has side effects but does not assert. 647b5150233bec111306f340bf486a1a0624b3a817eshiqianTEST_F(TestForDeathTest, TestAssertDebugDeath) { 6484b6829f0d28990dd645e16386eb226d0f10c8731shiqian int sideeffect = 0; 6494b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6507a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com ASSERT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12") 6517a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com << "Must accept a streamed message"; 6524b6829f0d28990dd645e16386eb226d0f10c8731shiqian 653733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifdef NDEBUG 654733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 6554b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Checks that the assignment occurs in opt mode (sideeffect). 6564b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(12, sideeffect); 657733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 658733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else 659733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 6604b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Checks that the assignment does not occur in dbg mode (no sideeffect). 6614b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, sideeffect); 662733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 663733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif 6644b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6654b6829f0d28990dd645e16386eb226d0f10c8731shiqian 666733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifndef NDEBUG 6674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6684b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid ExpectDebugDeathHelper(bool* aborted) { 6694b6829f0d28990dd645e16386eb226d0f10c8731shiqian *aborted = true; 6704b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEBUG_DEATH(return, "") << "This is expected to fail."; 6714b6829f0d28990dd645e16386eb226d0f10c8731shiqian *aborted = false; 6724b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6734b6829f0d28990dd645e16386eb226d0f10c8731shiqian 674733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS 675dd617c1bc8e67a915068e8462881fbc5e2f6ae30zhanyong.wanTEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) { 676c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan printf("This test should be considered failing if it shows " 677c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan "any pop-up dialogs.\n"); 678c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan fflush(stdout); 679c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 680c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_DEATH({ 681c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan testing::GTEST_FLAG(catch_exceptions) = false; 682c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan abort(); 683c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan }, ""); 684c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 685733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS 686c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 6874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort 6884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the function. 6894b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) { 6904b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool aborted = true; 6914b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), ""); 6924b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(aborted); 6934b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6944b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6954b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid AssertDebugDeathHelper(bool* aborted) { 6964b6829f0d28990dd645e16386eb226d0f10c8731shiqian *aborted = true; 697d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com GTEST_LOG_(INFO) << "Before ASSERT_DEBUG_DEATH"; 698d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com ASSERT_DEBUG_DEATH(GTEST_LOG_(INFO) << "In ASSERT_DEBUG_DEATH"; return, "") 699d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com << "This is expected to fail."; 700d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com GTEST_LOG_(INFO) << "After ASSERT_DEBUG_DEATH"; 7014b6829f0d28990dd645e16386eb226d0f10c8731shiqian *aborted = false; 7024b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7034b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on 7054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// failure. 7064b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, AssertDebugDeathAborts) { 7074b6829f0d28990dd645e16386eb226d0f10c8731shiqian static bool aborted; 7084b6829f0d28990dd645e16386eb226d0f10c8731shiqian aborted = false; 7094b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 7104b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(aborted); 7114b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 713d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts2) { 714d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 715d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 716d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 717d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 718d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 719d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 720d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts3) { 721d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 722d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 723d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 724d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 725d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 726d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 727d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts4) { 728d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 729d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 730d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 731d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 732d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 733d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 734d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts5) { 735d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 736d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 737d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 738d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 739d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 740d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 741d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts6) { 742d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 743d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 744d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 745d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 746d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 747d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 748d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts7) { 749d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 750d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 751d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 752d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 753d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 754d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 755d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts8) { 756d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 757d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 758d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 759d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 760d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 761d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 762d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts9) { 763d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 764d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 765d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 766d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 767d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 768d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 769d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.comTEST_F(TestForDeathTest, AssertDebugDeathAborts10) { 770d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com static bool aborted; 771d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com aborted = false; 772d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); 773d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com EXPECT_TRUE(aborted); 774d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com} 775d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com 776733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // _NDEBUG 7774b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the *_EXIT family of macros, using a variety of predicates. 77921d43d1a7e09d960b790d992f1bb4e92c70391d4shiqianstatic void TestExitMacros() { 780c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); 781c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), ""); 782c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 783733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS 784733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 785c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Of all signals effects on the process exit code, only those of SIGABRT 786c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // are documented on Windows. 787c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx. 7887a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "") << "b_ar"; 789733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 790733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else 791733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 792c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo"; 793c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar"; 794c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 7954b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FATAL_FAILURE({ // NOLINT 796c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), "") 7977a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com << "This failure is expected, too."; 7984b6829f0d28990dd645e16386eb226d0f10c8731shiqian }, "This failure is expected, too."); 799733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 800733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS 801c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 802c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_NONFATAL_FAILURE({ // NOLINT 803c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "") 8047a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com << "This failure is expected."; 805c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan }, "This failure is expected."); 8064b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 8074b6829f0d28990dd645e16386eb226d0f10c8731shiqian 80821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqianTEST_F(TestForDeathTest, ExitMacros) { 80921d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian TestExitMacros(); 81021d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian} 81121d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian 81221d43d1a7e09d960b790d992f1bb4e92c70391d4shiqianTEST_F(TestForDeathTest, ExitMacrosUsingFork) { 81321d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian testing::GTEST_FLAG(death_test_use_fork) = true; 81421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian TestExitMacros(); 81521d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian} 81621d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian 8174b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestForDeathTest, InvalidStyle) { 8184b6829f0d28990dd645e16386eb226d0f10c8731shiqian testing::GTEST_FLAG(death_test_style) = "rococo"; 8194b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_NONFATAL_FAILURE({ // NOLINT 820c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(0), "") << "This failure is expected."; 8214b6829f0d28990dd645e16386eb226d0f10c8731shiqian }, "This failure is expected."); 8224b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 8234b6829f0d28990dd645e16386eb226d0f10c8731shiqian 82434b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wanTEST_F(TestForDeathTest, DeathTestFailedOutput) { 82534b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan testing::GTEST_FLAG(death_test_style) = "fast"; 82634b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_NONFATAL_FAILURE( 82734b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_DEATH(DieWithMessage("death\n"), 82834b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "expected message"), 82934b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "Actual msg:\n" 83034b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "[ DEATH ] death\n"); 83134b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan} 83234b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan 83334b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wanTEST_F(TestForDeathTest, DeathTestUnexpectedReturnOutput) { 83434b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan testing::GTEST_FLAG(death_test_style) = "fast"; 83534b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_NONFATAL_FAILURE( 83634b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_DEATH({ 83734b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan fprintf(stderr, "returning\n"); 83834b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan fflush(stderr); 83934b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan return; 84034b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan }, ""), 84134b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan " Result: illegal return in test statement.\n" 84234b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan " Error msg:\n" 84334b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "[ DEATH ] returning\n"); 84434b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan} 84534b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan 84634b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wanTEST_F(TestForDeathTest, DeathTestBadExitCodeOutput) { 84734b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan testing::GTEST_FLAG(death_test_style) = "fast"; 84834b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_NONFATAL_FAILURE( 84934b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_EXIT(DieWithMessage("exiting with rc 1\n"), 85034b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan testing::ExitedWithCode(3), 85134b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "expected message"), 85234b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan " Result: died but not with expected exit code:\n" 85334b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan " Exited with exit status 1\n" 85434b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "Actual msg:\n" 85534b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "[ DEATH ] exiting with rc 1\n"); 85634b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan} 85734b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan 85834b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wanTEST_F(TestForDeathTest, DeathTestMultiLineMatchFail) { 85934b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan testing::GTEST_FLAG(death_test_style) = "fast"; 86034b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_NONFATAL_FAILURE( 86134b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"), 86234b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "line 1\nxyz\nline 3\n"), 86334b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "Actual msg:\n" 86434b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "[ DEATH ] line 1\n" 86534b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "[ DEATH ] line 2\n" 86634b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "[ DEATH ] line 3\n"); 86734b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan} 86834b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan 86934b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wanTEST_F(TestForDeathTest, DeathTestMultiLineMatchPass) { 87034b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan testing::GTEST_FLAG(death_test_style) = "fast"; 87134b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"), 87234b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan "line 1\nline 2\nline 3\n"); 87334b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan} 87434b3f298ed6c093e36511e235fff9d7501ec4395zhanyong.wan 8754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A DeathTestFactory that returns MockDeathTests. 8764b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MockDeathTestFactory : public DeathTestFactory { 8774b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 8784b6829f0d28990dd645e16386eb226d0f10c8731shiqian MockDeathTestFactory(); 8794b6829f0d28990dd645e16386eb226d0f10c8731shiqian virtual bool Create(const char* statement, 8804b6829f0d28990dd645e16386eb226d0f10c8731shiqian const ::testing::internal::RE* regex, 8814b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* file, int line, DeathTest** test); 8824b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8834b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Sets the parameters for subsequent calls to Create. 8844b6829f0d28990dd645e16386eb226d0f10c8731shiqian void SetParameters(bool create, DeathTest::TestRole role, 8854b6829f0d28990dd645e16386eb226d0f10c8731shiqian int status, bool passed); 8864b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8874b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Accessors. 8884b6829f0d28990dd645e16386eb226d0f10c8731shiqian int AssumeRoleCalls() const { return assume_role_calls_; } 8894b6829f0d28990dd645e16386eb226d0f10c8731shiqian int WaitCalls() const { return wait_calls_; } 8904b6829f0d28990dd645e16386eb226d0f10c8731shiqian int PassedCalls() const { return passed_args_.size(); } 8914b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool PassedArgument(int n) const { return passed_args_[n]; } 8924b6829f0d28990dd645e16386eb226d0f10c8731shiqian int AbortCalls() const { return abort_args_.size(); } 8934b6829f0d28990dd645e16386eb226d0f10c8731shiqian DeathTest::AbortReason AbortArgument(int n) const { 8944b6829f0d28990dd645e16386eb226d0f10c8731shiqian return abort_args_[n]; 8954b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 8964b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool TestDeleted() const { return test_deleted_; } 8974b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8984b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 8994b6829f0d28990dd645e16386eb226d0f10c8731shiqian friend class MockDeathTest; 9004b6829f0d28990dd645e16386eb226d0f10c8731shiqian // If true, Create will return a MockDeathTest; otherwise it returns 9014b6829f0d28990dd645e16386eb226d0f10c8731shiqian // NULL. 9024b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool create_; 9034b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The value a MockDeathTest will return from its AssumeRole method. 9044b6829f0d28990dd645e16386eb226d0f10c8731shiqian DeathTest::TestRole role_; 9054b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The value a MockDeathTest will return from its Wait method. 9064b6829f0d28990dd645e16386eb226d0f10c8731shiqian int status_; 9074b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The value a MockDeathTest will return from its Passed method. 9084b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool passed_; 9094b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9104b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Number of times AssumeRole was called. 9114b6829f0d28990dd645e16386eb226d0f10c8731shiqian int assume_role_calls_; 9124b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Number of times Wait was called. 9134b6829f0d28990dd645e16386eb226d0f10c8731shiqian int wait_calls_; 9144b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The arguments to the calls to Passed since the last call to 9154b6829f0d28990dd645e16386eb226d0f10c8731shiqian // SetParameters. 9164b6829f0d28990dd645e16386eb226d0f10c8731shiqian std::vector<bool> passed_args_; 9174b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The arguments to the calls to Abort since the last call to 9184b6829f0d28990dd645e16386eb226d0f10c8731shiqian // SetParameters. 9194b6829f0d28990dd645e16386eb226d0f10c8731shiqian std::vector<DeathTest::AbortReason> abort_args_; 9204b6829f0d28990dd645e16386eb226d0f10c8731shiqian // True if the last MockDeathTest returned by Create has been 9214b6829f0d28990dd645e16386eb226d0f10c8731shiqian // deleted. 9224b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool test_deleted_; 9234b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 9244b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A DeathTest implementation useful in testing. It returns values set 9274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// at its creation from its various inherited DeathTest methods, and 9284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// reports calls to those methods to its parent MockDeathTestFactory 9294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// object. 9304b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MockDeathTest : public DeathTest { 9314b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 9324b6829f0d28990dd645e16386eb226d0f10c8731shiqian MockDeathTest(MockDeathTestFactory *parent, 9334b6829f0d28990dd645e16386eb226d0f10c8731shiqian TestRole role, int status, bool passed) : 9344b6829f0d28990dd645e16386eb226d0f10c8731shiqian parent_(parent), role_(role), status_(status), passed_(passed) { 9354b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 9364b6829f0d28990dd645e16386eb226d0f10c8731shiqian virtual ~MockDeathTest() { 9374b6829f0d28990dd645e16386eb226d0f10c8731shiqian parent_->test_deleted_ = true; 9384b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 9394b6829f0d28990dd645e16386eb226d0f10c8731shiqian virtual TestRole AssumeRole() { 9404b6829f0d28990dd645e16386eb226d0f10c8731shiqian ++parent_->assume_role_calls_; 9414b6829f0d28990dd645e16386eb226d0f10c8731shiqian return role_; 9424b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 9434b6829f0d28990dd645e16386eb226d0f10c8731shiqian virtual int Wait() { 9444b6829f0d28990dd645e16386eb226d0f10c8731shiqian ++parent_->wait_calls_; 9454b6829f0d28990dd645e16386eb226d0f10c8731shiqian return status_; 9464b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 9474b6829f0d28990dd645e16386eb226d0f10c8731shiqian virtual bool Passed(bool exit_status_ok) { 9484b6829f0d28990dd645e16386eb226d0f10c8731shiqian parent_->passed_args_.push_back(exit_status_ok); 9494b6829f0d28990dd645e16386eb226d0f10c8731shiqian return passed_; 9504b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 9514b6829f0d28990dd645e16386eb226d0f10c8731shiqian virtual void Abort(AbortReason reason) { 9524b6829f0d28990dd645e16386eb226d0f10c8731shiqian parent_->abort_args_.push_back(reason); 9534b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 95493fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev 9554b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 9564b6829f0d28990dd645e16386eb226d0f10c8731shiqian MockDeathTestFactory* const parent_; 9574b6829f0d28990dd645e16386eb226d0f10c8731shiqian const TestRole role_; 9584b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int status_; 9594b6829f0d28990dd645e16386eb226d0f10c8731shiqian const bool passed_; 9604b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 9614b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9624b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// MockDeathTestFactory constructor. 9644b6829f0d28990dd645e16386eb226d0f10c8731shiqianMockDeathTestFactory::MockDeathTestFactory() 9654b6829f0d28990dd645e16386eb226d0f10c8731shiqian : create_(true), 9664b6829f0d28990dd645e16386eb226d0f10c8731shiqian role_(DeathTest::OVERSEE_TEST), 9674b6829f0d28990dd645e16386eb226d0f10c8731shiqian status_(0), 9684b6829f0d28990dd645e16386eb226d0f10c8731shiqian passed_(true), 9694b6829f0d28990dd645e16386eb226d0f10c8731shiqian assume_role_calls_(0), 9704b6829f0d28990dd645e16386eb226d0f10c8731shiqian wait_calls_(0), 9714b6829f0d28990dd645e16386eb226d0f10c8731shiqian passed_args_(), 9724b6829f0d28990dd645e16386eb226d0f10c8731shiqian abort_args_() { 9734b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 9744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9754b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Sets the parameters for subsequent calls to Create. 9774b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid MockDeathTestFactory::SetParameters(bool create, 9784b6829f0d28990dd645e16386eb226d0f10c8731shiqian DeathTest::TestRole role, 9794b6829f0d28990dd645e16386eb226d0f10c8731shiqian int status, bool passed) { 9804b6829f0d28990dd645e16386eb226d0f10c8731shiqian create_ = create; 9814b6829f0d28990dd645e16386eb226d0f10c8731shiqian role_ = role; 9824b6829f0d28990dd645e16386eb226d0f10c8731shiqian status_ = status; 9834b6829f0d28990dd645e16386eb226d0f10c8731shiqian passed_ = passed; 9844b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9854b6829f0d28990dd645e16386eb226d0f10c8731shiqian assume_role_calls_ = 0; 9864b6829f0d28990dd645e16386eb226d0f10c8731shiqian wait_calls_ = 0; 9874b6829f0d28990dd645e16386eb226d0f10c8731shiqian passed_args_.clear(); 9884b6829f0d28990dd645e16386eb226d0f10c8731shiqian abort_args_.clear(); 9894b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 9904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Sets test to NULL (if create_ is false) or to the address of a new 9934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// MockDeathTest object with parameters taken from the last call 9944b6829f0d28990dd645e16386eb226d0f10c8731shiqian// to SetParameters (if create_ is true). Always returns true. 99537ce949fb6ee00109391035835d4893a94f250a9zhanyong.wanbool MockDeathTestFactory::Create(const char* /*statement*/, 99637ce949fb6ee00109391035835d4893a94f250a9zhanyong.wan const ::testing::internal::RE* /*regex*/, 99737ce949fb6ee00109391035835d4893a94f250a9zhanyong.wan const char* /*file*/, 99837ce949fb6ee00109391035835d4893a94f250a9zhanyong.wan int /*line*/, 9994b6829f0d28990dd645e16386eb226d0f10c8731shiqian DeathTest** test) { 10004b6829f0d28990dd645e16386eb226d0f10c8731shiqian test_deleted_ = false; 10014b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (create_) { 10024b6829f0d28990dd645e16386eb226d0f10c8731shiqian *test = new MockDeathTest(this, role_, status_, passed_); 10034b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 10044b6829f0d28990dd645e16386eb226d0f10c8731shiqian *test = NULL; 10054b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 10064b6829f0d28990dd645e16386eb226d0f10c8731shiqian return true; 10074b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 10084b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1009e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro. 10104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// It installs a MockDeathTestFactory that is used for the duration 10114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// of the test case. 10124b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MacroLogicDeathTest : public testing::Test { 10134b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected: 10144b6829f0d28990dd645e16386eb226d0f10c8731shiqian static testing::internal::ReplaceDeathTestFactory* replacer_; 10154b6829f0d28990dd645e16386eb226d0f10c8731shiqian static MockDeathTestFactory* factory_; 10164b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10174b6829f0d28990dd645e16386eb226d0f10c8731shiqian static void SetUpTestCase() { 10184b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_ = new MockDeathTestFactory; 1019a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan replacer_ = new testing::internal::ReplaceDeathTestFactory(factory_); 10204b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 10214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10224b6829f0d28990dd645e16386eb226d0f10c8731shiqian static void TearDownTestCase() { 10234b6829f0d28990dd645e16386eb226d0f10c8731shiqian delete replacer_; 10244b6829f0d28990dd645e16386eb226d0f10c8731shiqian replacer_ = NULL; 10254b6829f0d28990dd645e16386eb226d0f10c8731shiqian delete factory_; 10264b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_ = NULL; 10274b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 10284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10294b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Runs a death test that breaks the rules by returning. Such a death 10304b6829f0d28990dd645e16386eb226d0f10c8731shiqian // test cannot be run directly from a test routine that uses a 10314b6829f0d28990dd645e16386eb226d0f10c8731shiqian // MockDeathTest, or the remainder of the routine will not be executed. 10324b6829f0d28990dd645e16386eb226d0f10c8731shiqian static void RunReturningDeathTest(bool* flag) { 10334b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_DEATH({ // NOLINT 10344b6829f0d28990dd645e16386eb226d0f10c8731shiqian *flag = true; 10354b6829f0d28990dd645e16386eb226d0f10c8731shiqian return; 10364b6829f0d28990dd645e16386eb226d0f10c8731shiqian }, ""); 10374b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 10384b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 10394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10404b6829f0d28990dd645e16386eb226d0f10c8731shiqiantesting::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_ 10414b6829f0d28990dd645e16386eb226d0f10c8731shiqian = NULL; 10424b6829f0d28990dd645e16386eb226d0f10c8731shiqianMockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL; 10434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10444b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Test that nothing happens when the factory doesn't return a DeathTest: 10464b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MacroLogicDeathTest, NothingHappens) { 10474b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool flag = false; 10484b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true); 10494b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(flag = true, ""); 10504b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(flag); 10514b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->AssumeRoleCalls()); 10524b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->WaitCalls()); 10534b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->PassedCalls()); 10544b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->AbortCalls()); 10554b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(factory_->TestDeleted()); 10564b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 10574b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Test that the parent process doesn't run the death test code, 10594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// and that the Passed method returns false when the (simulated) 10604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// child process exits with status 0: 10614b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) { 10624b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool flag = false; 10634b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true); 10644b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(flag = true, ""); 10654b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(flag); 10664b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(1, factory_->AssumeRoleCalls()); 10674b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(1, factory_->WaitCalls()); 10684b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_EQ(1, factory_->PassedCalls()); 10694b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(factory_->PassedArgument(0)); 10704b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->AbortCalls()); 10714b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(factory_->TestDeleted()); 10724b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 10734b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the Passed method was given the argument "true" when 10754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the (simulated) child process exits with status 1: 10764b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) { 10774b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool flag = false; 10784b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true); 10794b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(flag = true, ""); 10804b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FALSE(flag); 10814b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(1, factory_->AssumeRoleCalls()); 10824b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(1, factory_->WaitCalls()); 10834b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_EQ(1, factory_->PassedCalls()); 10844b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(factory_->PassedArgument(0)); 10854b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->AbortCalls()); 10864b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(factory_->TestDeleted()); 10874b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 10884b6829f0d28990dd645e16386eb226d0f10c8731shiqian 10894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the (simulated) child process executes the death test 10904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// code, and is aborted with the correct AbortReason if it 10914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// executes a return statement. 10924b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MacroLogicDeathTest, ChildPerformsReturn) { 10934b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool flag = false; 10944b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true); 10954b6829f0d28990dd645e16386eb226d0f10c8731shiqian RunReturningDeathTest(&flag); 10964b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(flag); 10974b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(1, factory_->AssumeRoleCalls()); 10984b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->WaitCalls()); 10994b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->PassedCalls()); 11004b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(1, factory_->AbortCalls()); 11014b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT, 11024b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_->AbortArgument(0)); 11034b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(factory_->TestDeleted()); 11044b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 11054b6829f0d28990dd645e16386eb226d0f10c8731shiqian 11064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the (simulated) child process is aborted with the 11074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// correct AbortReason if it does not die. 11084b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(MacroLogicDeathTest, ChildDoesNotDie) { 11094b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool flag = false; 11104b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true); 11114b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_DEATH(flag = true, ""); 11124b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(flag); 11134b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(1, factory_->AssumeRoleCalls()); 11144b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->WaitCalls()); 11154b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(0, factory_->PassedCalls()); 11164b6829f0d28990dd645e16386eb226d0f10c8731shiqian // This time there are two calls to Abort: one since the test didn't 11174b6829f0d28990dd645e16386eb226d0f10c8731shiqian // die, and another from the ReturnSentinel when it's destroyed. The 11184b6829f0d28990dd645e16386eb226d0f10c8731shiqian // sentinel normally isn't destroyed if a test doesn't die, since 1119c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian // _exit(2) is called in that case by ForkingDeathTest, but not by 11204b6829f0d28990dd645e16386eb226d0f10c8731shiqian // our MockDeathTest. 11214b6829f0d28990dd645e16386eb226d0f10c8731shiqian ASSERT_EQ(2, factory_->AbortCalls()); 11224b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE, 11234b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_->AbortArgument(0)); 11244b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT, 11254b6829f0d28990dd645e16386eb226d0f10c8731shiqian factory_->AbortArgument(1)); 11264b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_TRUE(factory_->TestDeleted()); 11274b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 11284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 11294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that a successful death test does not register a successful 11304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test part. 11314b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SuccessRegistrationDeathTest, NoSuccessPart) { 1132c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(1), ""); 11331cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); 11344b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 11354b6829f0d28990dd645e16386eb226d0f10c8731shiqian 11364b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsDeathTest, DeathTest) { 1137c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(1), "") << "unexpected failure"; 1138c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian ASSERT_DEATH(_exit(1), "") << "unexpected failure"; 11394b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_NONFATAL_FAILURE({ // NOLINT 1140c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian EXPECT_DEATH(_exit(0), "") << "expected failure"; 11414b6829f0d28990dd645e16386eb226d0f10c8731shiqian }, "expected failure"); 11424b6829f0d28990dd645e16386eb226d0f10c8731shiqian EXPECT_FATAL_FAILURE({ // NOLINT 1143c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian ASSERT_DEATH(_exit(0), "") << "expected failure"; 11444b6829f0d28990dd645e16386eb226d0f10c8731shiqian }, "expected failure"); 11454b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 11464b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1147b0b40063a828ca7a4ceb079ecd508775c6aa9d93zhanyong.wan// Tests that GetLastErrnoDescription returns an empty string when the 1148c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan// last error is 0 and non-empty string when it is non-zero. 1149b0b40063a828ca7a4ceb079ecd508775c6aa9d93zhanyong.wanTEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) { 1150c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan errno = ENOENT; 1151b0b40063a828ca7a4ceb079ecd508775c6aa9d93zhanyong.wan EXPECT_STRNE("", GetLastErrnoDescription().c_str()); 1152c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan errno = 0; 1153b0b40063a828ca7a4ceb079ecd508775c6aa9d93zhanyong.wan EXPECT_STREQ("", GetLastErrnoDescription().c_str()); 1154c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 1155c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1156733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS 1157c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanTEST(AutoHandleTest, AutoHandleWorks) { 1158c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL); 1159c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan ASSERT_NE(INVALID_HANDLE_VALUE, handle); 1160c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1161c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Tests that the AutoHandle is correctly initialized with a handle. 1162c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan testing::internal::AutoHandle auto_handle(handle); 1163c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(handle, auto_handle.Get()); 1164c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1165c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Tests that Reset assigns INVALID_HANDLE_VALUE. 1166c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Note that this cannot verify whether the original handle is closed. 1167c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan auto_handle.Reset(); 1168c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get()); 1169c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1170c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Tests that Reset assigns the new handle. 1171c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Note that this cannot verify whether the original handle is closed. 1172c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan handle = ::CreateEvent(NULL, FALSE, FALSE, NULL); 1173c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan ASSERT_NE(INVALID_HANDLE_VALUE, handle); 1174c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan auto_handle.Reset(handle); 1175c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(handle, auto_handle.Get()); 1176c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1177c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default. 1178c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan testing::internal::AutoHandle auto_handle2; 1179c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get()); 1180c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 1181733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS 1182c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1183733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS 1184c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wantypedef unsigned __int64 BiggestParsable; 1185c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wantypedef signed __int64 BiggestSignedParsable; 1186733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else 1187c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wantypedef unsigned long long BiggestParsable; 1188c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wantypedef signed long long BiggestSignedParsable; 1189733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS 1190c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1191be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan// We cannot use std::numeric_limits<T>::max() as it clashes with the 1192be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan// max() macro defined by <windows.h>. 1193be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wanconst BiggestParsable kBiggestParsableMax = ULLONG_MAX; 1194be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wanconst BiggestSignedParsable kBiggestSignedParsableMax = LLONG_MAX; 1195be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan 1196c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanTEST(ParseNaturalNumberTest, RejectsInvalidFormat) { 1197c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan BiggestParsable result = 0; 1198c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1199c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Rejects non-numbers. 120003c314931649a999b0cf5deb0a434a1009157416jgm@google.com EXPECT_FALSE(ParseNaturalNumber("non-number string", &result)); 1201c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1202c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Rejects numbers with whitespace prefix. 120303c314931649a999b0cf5deb0a434a1009157416jgm@google.com EXPECT_FALSE(ParseNaturalNumber(" 123", &result)); 1204c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1205c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Rejects negative numbers. 120603c314931649a999b0cf5deb0a434a1009157416jgm@google.com EXPECT_FALSE(ParseNaturalNumber("-123", &result)); 1207c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1208c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Rejects numbers starting with a plus sign. 120903c314931649a999b0cf5deb0a434a1009157416jgm@google.com EXPECT_FALSE(ParseNaturalNumber("+123", &result)); 1210c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan errno = 0; 1211c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 1212c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1213c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanTEST(ParseNaturalNumberTest, RejectsOverflownNumbers) { 1214c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan BiggestParsable result = 0; 1215c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 121603c314931649a999b0cf5deb0a434a1009157416jgm@google.com EXPECT_FALSE(ParseNaturalNumber("99999999999999999999999", &result)); 1217c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1218c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan signed char char_result = 0; 121903c314931649a999b0cf5deb0a434a1009157416jgm@google.com EXPECT_FALSE(ParseNaturalNumber("200", &char_result)); 1220c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan errno = 0; 1221c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 1222c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1223c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanTEST(ParseNaturalNumberTest, AcceptsValidNumbers) { 1224c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan BiggestParsable result = 0; 1225c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1226c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan result = 0; 122703c314931649a999b0cf5deb0a434a1009157416jgm@google.com ASSERT_TRUE(ParseNaturalNumber("123", &result)); 1228a773ef8a3b70936450c94bdcba1e6345a980244ezhanyong.wan EXPECT_EQ(123U, result); 1229c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1230c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Check 0 as an edge case. 1231c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan result = 1; 123203c314931649a999b0cf5deb0a434a1009157416jgm@google.com ASSERT_TRUE(ParseNaturalNumber("0", &result)); 1233a773ef8a3b70936450c94bdcba1e6345a980244ezhanyong.wan EXPECT_EQ(0U, result); 1234c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1235c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan result = 1; 123603c314931649a999b0cf5deb0a434a1009157416jgm@google.com ASSERT_TRUE(ParseNaturalNumber("00000", &result)); 1237a773ef8a3b70936450c94bdcba1e6345a980244ezhanyong.wan EXPECT_EQ(0U, result); 1238c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 1239c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1240c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanTEST(ParseNaturalNumberTest, AcceptsTypeLimits) { 1241c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan Message msg; 1242c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan msg << kBiggestParsableMax; 1243c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1244c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan BiggestParsable result = 0; 1245c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result)); 1246c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(kBiggestParsableMax, result); 1247c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1248c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan Message msg2; 1249c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan msg2 << kBiggestSignedParsableMax; 1250c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1251c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan BiggestSignedParsable signed_result = 0; 1252c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result)); 1253c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(kBiggestSignedParsableMax, signed_result); 1254c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1255c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan Message msg3; 1256c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan msg3 << INT_MAX; 1257c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1258c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan int int_result = 0; 1259c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result)); 1260c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(INT_MAX, int_result); 1261c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1262c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan Message msg4; 1263c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan msg4 << UINT_MAX; 1264c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1265c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan unsigned int uint_result = 0; 1266c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result)); 1267c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(UINT_MAX, uint_result); 1268c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 1269c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1270c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanTEST(ParseNaturalNumberTest, WorksForShorterIntegers) { 1271c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan short short_result = 0; 127203c314931649a999b0cf5deb0a434a1009157416jgm@google.com ASSERT_TRUE(ParseNaturalNumber("123", &short_result)); 1273c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(123, short_result); 1274c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1275c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan signed char char_result = 0; 127603c314931649a999b0cf5deb0a434a1009157416jgm@google.com ASSERT_TRUE(ParseNaturalNumber("123", &char_result)); 1277c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan EXPECT_EQ(123, char_result); 1278c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 1279c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1280733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS 1281c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wanTEST(EnvironmentTest, HandleFitsIntoSizeT) { 1282c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // TODO(vladl@google.com): Remove this test after this condition is verified 1283c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // in a static assertion in gtest-death-test.cc in the function 1284c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // GetStatusFileDescriptor. 1285c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t)); 1286c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan} 1287733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS 1288c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 1289535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger 1290535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan// failures when death tests are available on the system. 1291535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wanTEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) { 1292b1fc4d36385c457e2237e778859759219f1604b6vladlosev EXPECT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestExpectMacro"), 1293b1fc4d36385c457e2237e778859759219f1604b6vladlosev "death inside CondDeathTestExpectMacro"); 1294b1fc4d36385c457e2237e778859759219f1604b6vladlosev ASSERT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestAssertMacro"), 1295b1fc4d36385c457e2237e778859759219f1604b6vladlosev "death inside CondDeathTestAssertMacro"); 1296535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan 1297535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan // Empty statement will not crash, which must trigger a failure. 1298535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, ""), ""); 1299535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan EXPECT_FATAL_FAILURE(ASSERT_DEATH_IF_SUPPORTED(;, ""), ""); 1300535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan} 1301535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan 1302f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comTEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInFastStyle) { 1303f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com testing::GTEST_FLAG(death_test_style) = "fast"; 1304f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com EXPECT_FALSE(InDeathTestChild()); 1305f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com EXPECT_DEATH({ 1306f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside"); 1307f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com fflush(stderr); 1308f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com _exit(1); 1309f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com }, "Inside"); 1310f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com} 1311f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com 1312f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comTEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInThreadSafeStyle) { 1313f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com testing::GTEST_FLAG(death_test_style) = "threadsafe"; 1314f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com EXPECT_FALSE(InDeathTestChild()); 1315f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com EXPECT_DEATH({ 1316f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside"); 1317f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com fflush(stderr); 1318f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com _exit(1); 1319f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com }, "Inside"); 1320f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com} 1321f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com 1322f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#else // !GTEST_HAS_DEATH_TEST follows 1323535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan 1324535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wanusing testing::internal::CaptureStderr; 1325535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wanusing testing::internal::GetCapturedStderr; 1326535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan 1327535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED are still 1328d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// defined but do not trigger failures when death tests are not available on 1329535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan// the system. 1330535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wanTEST(ConditionalDeathMacrosTest, WarnsWhenDeathTestsNotAvailable) { 1331535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan // Empty statement will not crash, but that should not trigger a failure 1332535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan // when death tests are not supported. 1333535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan CaptureStderr(); 1334535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan EXPECT_DEATH_IF_SUPPORTED(;, ""); 133503c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string output = GetCapturedStderr(); 1336535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan ASSERT_TRUE(NULL != strstr(output.c_str(), 1337535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan "Death tests are not supported on this platform")); 1338535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan ASSERT_TRUE(NULL != strstr(output.c_str(), ";")); 1339535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan 1340d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan // The streamed message should not be printed as there is no test failure. 1341535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan CaptureStderr(); 1342d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan EXPECT_DEATH_IF_SUPPORTED(;, "") << "streamed message"; 1343d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan output = GetCapturedStderr(); 1344d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message")); 1345d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1346d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan CaptureStderr(); 1347d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ASSERT_DEATH_IF_SUPPORTED(;, ""); // NOLINT 1348535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan output = GetCapturedStderr(); 1349535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan ASSERT_TRUE(NULL != strstr(output.c_str(), 1350535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan "Death tests are not supported on this platform")); 1351535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan ASSERT_TRUE(NULL != strstr(output.c_str(), ";")); 1352d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1353d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan CaptureStderr(); 1354d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ASSERT_DEATH_IF_SUPPORTED(;, "") << "streamed message"; // NOLINT 1355d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan output = GetCapturedStderr(); 1356d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message")); 1357535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan} 1358535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan 1359d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wanvoid FuncWithAssert(int* n) { 1360d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ASSERT_DEATH_IF_SUPPORTED(return;, ""); 1361d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan (*n)++; 1362d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan} 1363d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1364d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// Tests that ASSERT_DEATH_IF_SUPPORTED does not return from the current 1365d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// function (as ASSERT_DEATH does) if death tests are not supported. 1366d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wanTEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) { 1367d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan int n = 0; 1368d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan FuncWithAssert(&n); 1369d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan EXPECT_EQ(1, n); 1370d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan} 1371d05532bf391ba7f7d147a598e737788787b9a7d5zhanyong.wan 1372f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#endif // !GTEST_HAS_DEATH_TEST 13734b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1374d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// Tests that the death test macros expand to code which may or may not 1375d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// be followed by operator<<, and that in either case the complete text 1376d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// comprises only a single C++ statement. 1377d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// 1378d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// The syntax should work whether death tests are available or not. 1379d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wanTEST(ConditionalDeathMacrosSyntaxDeathTest, SingleStatement) { 1380f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (AlwaysFalse()) 1381d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan // This would fail if executed; this is a compilation test only 1382d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ASSERT_DEATH_IF_SUPPORTED(return, ""); 1383d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1384f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (AlwaysTrue()) 1385d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan EXPECT_DEATH_IF_SUPPORTED(_exit(1), ""); 1386d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan else 1387d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan // This empty "else" branch is meant to ensure that EXPECT_DEATH 1388d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan // doesn't expand into an "if" statement without an "else" 1389d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ; // NOLINT 1390d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1391f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (AlwaysFalse()) 1392d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ASSERT_DEATH_IF_SUPPORTED(return, "") << "did not die"; 1393d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1394f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (AlwaysFalse()) 1395d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ; // NOLINT 1396d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan else 1397d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << 1 << 2 << 3; 1398d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan} 1399d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1400d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// Tests that conditional death test macros expand to code which interacts 1401d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan// well with switch statements. 1402d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wanTEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) { 1403f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // Microsoft compiler usually complains about switch statements without 1404f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // case labels. We suppress that warning for this test. 1405f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_PUSH_(4065) 1406d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1407d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan switch (0) 1408d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan default: 1409d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan ASSERT_DEATH_IF_SUPPORTED(_exit(1), "") 1410d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan << "exit in default switch handler"; 1411d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1412d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan switch (0) 1413d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan case 0: 1414d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << "exit in switch case"; 1415d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 1416f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_POP_() 1417d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan} 1418d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan 14194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that a test case whose name ends with "DeathTest" works fine 14204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// on Windows. 14214b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(NotADeathTest, Test) { 14224b6829f0d28990dd645e16386eb226d0f10c8731shiqian SUCCEED(); 14234b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1424