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