Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. // Copyright 2005, Google Inc.
  2. // All rights reserved.
  3. //
  4. // Redistribution and use in source and binary forms, with or without
  5. // modification, are permitted provided that the following conditions are
  6. // met:
  7. //
  8. //     * Redistributions of source code must retain the above copyright
  9. // notice, this list of conditions and the following disclaimer.
  10. //     * Redistributions in binary form must reproduce the above
  11. // copyright notice, this list of conditions and the following disclaimer
  12. // in the documentation and/or other materials provided with the
  13. // distribution.
  14. //     * Neither the name of Google Inc. nor the names of its
  15. // contributors may be used to endorse or promote products derived from
  16. // this software without specific prior written permission.
  17. //
  18. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. //
  30. // Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)
  31. //
  32. // This file implements death tests.
  33.  
  34. #include "gtest/gtest-death-test.h"
  35. #include "gtest/internal/gtest-port.h"
  36.  
  37. #if GTEST_HAS_DEATH_TEST
  38.  
  39. # if GTEST_OS_MAC
  40. #  include <crt_externs.h>
  41. # endif  // GTEST_OS_MAC
  42.  
  43. # include <errno.h>
  44. # include <fcntl.h>
  45. # include <limits.h>
  46.  
  47. # if GTEST_OS_LINUX
  48. #  include <signal.h>
  49. # endif  // GTEST_OS_LINUX
  50.  
  51. # include <stdarg.h>
  52.  
  53. # if GTEST_OS_WINDOWS
  54. #  include <windows.h>
  55. # else
  56. #  include <sys/mman.h>
  57. #  include <sys/wait.h>
  58. # endif  // GTEST_OS_WINDOWS
  59.  
  60. # if GTEST_OS_QNX
  61. #  include <spawn.h>
  62. # endif  // GTEST_OS_QNX
  63.  
  64. #endif  // GTEST_HAS_DEATH_TEST
  65.  
  66. #include "gtest/gtest-message.h"
  67. #include "gtest/internal/gtest-string.h"
  68.  
  69. // Indicates that this translation unit is part of Google Test's
  70. // implementation.  It must come before gtest-internal-inl.h is
  71. // included, or there will be a compiler error.  This trick is to
  72. // prevent a user from accidentally including gtest-internal-inl.h in
  73. // his code.
  74. #define GTEST_IMPLEMENTATION_ 1
  75. #include "src/gtest-internal-inl.h"
  76. #undef GTEST_IMPLEMENTATION_
  77.  
  78. namespace testing {
  79.  
  80. // Constants.
  81.  
  82. // The default death test style.
  83. static const char kDefaultDeathTestStyle[] = "fast";
  84.  
  85. GTEST_DEFINE_string_(
  86.     death_test_style,
  87.     internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
  88.     "Indicates how to run a death test in a forked child process: "
  89.     "\"threadsafe\" (child process re-executes the test binary "
  90.     "from the beginning, running only the specific death test) or "
  91.     "\"fast\" (child process runs the death test immediately "
  92.     "after forking).");
  93.  
  94. GTEST_DEFINE_bool_(
  95.     death_test_use_fork,
  96.     internal::BoolFromGTestEnv("death_test_use_fork", false),
  97.     "Instructs to use fork()/_exit() instead of clone() in death tests. "
  98.     "Ignored and always uses fork() on POSIX systems where clone() is not "
  99.     "implemented. Useful when running under valgrind or similar tools if "
  100.     "those do not support clone(). Valgrind 3.3.1 will just fail if "
  101.     "it sees an unsupported combination of clone() flags. "
  102.     "It is not recommended to use this flag w/o valgrind though it will "
  103.     "work in 99% of the cases. Once valgrind is fixed, this flag will "
  104.     "most likely be removed.");
  105.  
  106. namespace internal {
  107. GTEST_DEFINE_string_(
  108.     internal_run_death_test, "",
  109.     "Indicates the file, line number, temporal index of "
  110.     "the single death test to run, and a file descriptor to "
  111.     "which a success code may be sent, all separated by "
  112.     "the '|' characters.  This flag is specified if and only if the current "
  113.     "process is a sub-process launched for running a thread-safe "
  114.     "death test.  FOR INTERNAL USE ONLY.");
  115. }  // namespace internal
  116.  
  117. #if GTEST_HAS_DEATH_TEST
  118.  
  119. namespace internal {
  120.  
  121. // Valid only for fast death tests. Indicates the code is running in the
  122. // child process of a fast style death test.
  123. static bool g_in_fast_death_test_child = false;
  124.  
  125. // Returns a Boolean value indicating whether the caller is currently
  126. // executing in the context of the death test child process.  Tools such as
  127. // Valgrind heap checkers may need this to modify their behavior in death
  128. // tests.  IMPORTANT: This is an internal utility.  Using it may break the
  129. // implementation of death tests.  User code MUST NOT use it.
  130. bool InDeathTestChild() {
  131. # if GTEST_OS_WINDOWS
  132.  
  133.   // On Windows, death tests are thread-safe regardless of the value of the
  134.   // death_test_style flag.
  135.   return !GTEST_FLAG(internal_run_death_test).empty();
  136.  
  137. # else
  138.  
  139.   if (GTEST_FLAG(death_test_style) == "threadsafe")
  140.     return !GTEST_FLAG(internal_run_death_test).empty();
  141.   else
  142.     return g_in_fast_death_test_child;
  143. #endif
  144. }
  145.  
  146. }  // namespace internal
  147.  
  148. // ExitedWithCode constructor.
  149. ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
  150. }
  151.  
  152. // ExitedWithCode function-call operator.
  153. bool ExitedWithCode::operator()(int exit_status) const {
  154. # if GTEST_OS_WINDOWS
  155.  
  156.   return exit_status == exit_code_;
  157.  
  158. # else
  159.  
  160.   return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
  161.  
  162. # endif  // GTEST_OS_WINDOWS
  163. }
  164.  
  165. # if !GTEST_OS_WINDOWS
  166. // KilledBySignal constructor.
  167. KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
  168. }
  169.  
  170. // KilledBySignal function-call operator.
  171. bool KilledBySignal::operator()(int exit_status) const {
  172.   return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
  173. }
  174. # endif  // !GTEST_OS_WINDOWS
  175.  
  176. namespace internal {
  177.  
  178. // Utilities needed for death tests.
  179.  
  180. // Generates a textual description of a given exit code, in the format
  181. // specified by wait(2).
  182. static std::string ExitSummary(int exit_code) {
  183.   Message m;
  184.  
  185. # if GTEST_OS_WINDOWS
  186.  
  187.   m << "Exited with exit status " << exit_code;
  188.  
  189. # else
  190.  
  191.   if (WIFEXITED(exit_code)) {
  192.     m << "Exited with exit status " << WEXITSTATUS(exit_code);
  193.   } else if (WIFSIGNALED(exit_code)) {
  194.     m << "Terminated by signal " << WTERMSIG(exit_code);
  195.   }
  196. #  ifdef WCOREDUMP
  197.   if (WCOREDUMP(exit_code)) {
  198.     m << " (core dumped)";
  199.   }
  200. #  endif
  201. # endif  // GTEST_OS_WINDOWS
  202.  
  203.   return m.GetString();
  204. }
  205.  
  206. // Returns true if exit_status describes a process that was terminated
  207. // by a signal, or exited normally with a nonzero exit code.
  208. bool ExitedUnsuccessfully(int exit_status) {
  209.   return !ExitedWithCode(0)(exit_status);
  210. }
  211.  
  212. # if !GTEST_OS_WINDOWS
  213. // Generates a textual failure message when a death test finds more than
  214. // one thread running, or cannot determine the number of threads, prior
  215. // to executing the given statement.  It is the responsibility of the
  216. // caller not to pass a thread_count of 1.
  217. static std::string DeathTestThreadWarning(size_t thread_count) {
  218.   Message msg;
  219.   msg << "Death tests use fork(), which is unsafe particularly"
  220.       << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
  221.   if (thread_count == 0)
  222.     msg << "couldn't detect the number of threads.";
  223.   else
  224.     msg << "detected " << thread_count << " threads.";
  225.   return msg.GetString();
  226. }
  227. # endif  // !GTEST_OS_WINDOWS
  228.  
  229. // Flag characters for reporting a death test that did not die.
  230. static const char kDeathTestLived = 'L';
  231. static const char kDeathTestReturned = 'R';
  232. static const char kDeathTestThrew = 'T';
  233. static const char kDeathTestInternalError = 'I';
  234.  
  235. // An enumeration describing all of the possible ways that a death test can
  236. // conclude.  DIED means that the process died while executing the test
  237. // code; LIVED means that process lived beyond the end of the test code;
  238. // RETURNED means that the test statement attempted to execute a return
  239. // statement, which is not allowed; THREW means that the test statement
  240. // returned control by throwing an exception.  IN_PROGRESS means the test
  241. // has not yet concluded.
  242. // TODO(vladl@google.com): Unify names and possibly values for
  243. // AbortReason, DeathTestOutcome, and flag characters above.
  244. enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
  245.  
  246. // Routine for aborting the program which is safe to call from an
  247. // exec-style death test child process, in which case the error
  248. // message is propagated back to the parent process.  Otherwise, the
  249. // message is simply printed to stderr.  In either case, the program
  250. // then exits with status 1.
  251. void DeathTestAbort(const std::string& message) {
  252.   // On a POSIX system, this function may be called from a threadsafe-style
  253.   // death test child process, which operates on a very small stack.  Use
  254.   // the heap for any additional non-minuscule memory requirements.
  255.   const InternalRunDeathTestFlag* const flag =
  256.       GetUnitTestImpl()->internal_run_death_test_flag();
  257.   if (flag != NULL) {
  258.     FILE* parent = posix::FDOpen(flag->write_fd(), "w");
  259.     fputc(kDeathTestInternalError, parent);
  260.     fprintf(parent, "%s", message.c_str());
  261.     fflush(parent);
  262.     _exit(1);
  263.   } else {
  264.     fprintf(stderr, "%s", message.c_str());
  265.     fflush(stderr);
  266.     posix::Abort();
  267.   }
  268. }
  269.  
  270. // A replacement for CHECK that calls DeathTestAbort if the assertion
  271. // fails.
  272. # define GTEST_DEATH_TEST_CHECK_(expression) \
  273.   do { \
  274.     if (!::testing::internal::IsTrue(expression)) { \
  275.       DeathTestAbort( \
  276.           ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
  277.           + ::testing::internal::StreamableToString(__LINE__) + ": " \
  278.           + #expression); \
  279.     } \
  280.   } while (::testing::internal::AlwaysFalse())
  281.  
  282. // This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
  283. // evaluating any system call that fulfills two conditions: it must return
  284. // -1 on failure, and set errno to EINTR when it is interrupted and
  285. // should be tried again.  The macro expands to a loop that repeatedly
  286. // evaluates the expression as long as it evaluates to -1 and sets
  287. // errno to EINTR.  If the expression evaluates to -1 but errno is
  288. // something other than EINTR, DeathTestAbort is called.
  289. # define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
  290.   do { \
  291.     int gtest_retval; \
  292.     do { \
  293.       gtest_retval = (expression); \
  294.     } while (gtest_retval == -1 && errno == EINTR); \
  295.     if (gtest_retval == -1) { \
  296.       DeathTestAbort( \
  297.           ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
  298.           + ::testing::internal::StreamableToString(__LINE__) + ": " \
  299.           + #expression + " != -1"); \
  300.     } \
  301.   } while (::testing::internal::AlwaysFalse())
  302.  
  303. // Returns the message describing the last system error in errno.
  304. std::string GetLastErrnoDescription() {
  305.     return errno == 0 ? "" : posix::StrError(errno);
  306. }
  307.  
  308. // This is called from a death test parent process to read a failure
  309. // message from the death test child process and log it with the FATAL
  310. // severity. On Windows, the message is read from a pipe handle. On other
  311. // platforms, it is read from a file descriptor.
  312. static void FailFromInternalError(int fd) {
  313.   Message error;
  314.   char buffer[256];
  315.   int num_read;
  316.  
  317.   do {
  318.     while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
  319.       buffer[num_read] = '\0';
  320.       error << buffer;
  321.     }
  322.   } while (num_read == -1 && errno == EINTR);
  323.  
  324.   if (num_read == 0) {
  325.     GTEST_LOG_(FATAL) << error.GetString();
  326.   } else {
  327.     const int last_error = errno;
  328.     GTEST_LOG_(FATAL) << "Error while reading death test internal: "
  329.                       << GetLastErrnoDescription() << " [" << last_error << "]";
  330.   }
  331. }
  332.  
  333. // Death test constructor.  Increments the running death test count
  334. // for the current test.
  335. DeathTest::DeathTest() {
  336.   TestInfo* const info = GetUnitTestImpl()->current_test_info();
  337.   if (info == NULL) {
  338.     DeathTestAbort("Cannot run a death test outside of a TEST or "
  339.                    "TEST_F construct");
  340.   }
  341. }
  342.  
  343. // Creates and returns a death test by dispatching to the current
  344. // death test factory.
  345. bool DeathTest::Create(const char* statement, const RE* regex,
  346.                        const char* file, int line, DeathTest** test) {
  347.   return GetUnitTestImpl()->death_test_factory()->Create(
  348.       statement, regex, file, line, test);
  349. }
  350.  
  351. const char* DeathTest::LastMessage() {
  352.   return last_death_test_message_.c_str();
  353. }
  354.  
  355. void DeathTest::set_last_death_test_message(const std::string& message) {
  356.   last_death_test_message_ = message;
  357. }
  358.  
  359. std::string DeathTest::last_death_test_message_;
  360.  
  361. // Provides cross platform implementation for some death functionality.
  362. class DeathTestImpl : public DeathTest {
  363.  protected:
  364.   DeathTestImpl(const char* a_statement, const RE* a_regex)
  365.       : statement_(a_statement),
  366.         regex_(a_regex),
  367.         spawned_(false),
  368.         status_(-1),
  369.         outcome_(IN_PROGRESS),
  370.         read_fd_(-1),
  371.         write_fd_(-1) {}
  372.  
  373.   // read_fd_ is expected to be closed and cleared by a derived class.
  374.   ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
  375.  
  376.   void Abort(AbortReason reason);
  377.   virtual bool Passed(bool status_ok);
  378.  
  379.   const char* statement() const { return statement_; }
  380.   const RE* regex() const { return regex_; }
  381.   bool spawned() const { return spawned_; }
  382.   void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
  383.   int status() const { return status_; }
  384.   void set_status(int a_status) { status_ = a_status; }
  385.   DeathTestOutcome outcome() const { return outcome_; }
  386.   void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
  387.   int read_fd() const { return read_fd_; }
  388.   void set_read_fd(int fd) { read_fd_ = fd; }
  389.   int write_fd() const { return write_fd_; }
  390.   void set_write_fd(int fd) { write_fd_ = fd; }
  391.  
  392.   // Called in the parent process only. Reads the result code of the death
  393.   // test child process via a pipe, interprets it to set the outcome_
  394.   // member, and closes read_fd_.  Outputs diagnostics and terminates in
  395.   // case of unexpected codes.
  396.   void ReadAndInterpretStatusByte();
  397.  
  398.  private:
  399.   // The textual content of the code this object is testing.  This class
  400.   // doesn't own this string and should not attempt to delete it.
  401.   const char* const statement_;
  402.   // The regular expression which test output must match.  DeathTestImpl
  403.   // doesn't own this object and should not attempt to delete it.
  404.   const RE* const regex_;
  405.   // True if the death test child process has been successfully spawned.
  406.   bool spawned_;
  407.   // The exit status of the child process.
  408.   int status_;
  409.   // How the death test concluded.
  410.   DeathTestOutcome outcome_;
  411.   // Descriptor to the read end of the pipe to the child process.  It is
  412.   // always -1 in the child process.  The child keeps its write end of the
  413.   // pipe in write_fd_.
  414.   int read_fd_;
  415.   // Descriptor to the child's write end of the pipe to the parent process.
  416.   // It is always -1 in the parent process.  The parent keeps its end of the
  417.   // pipe in read_fd_.
  418.   int write_fd_;
  419. };
  420.  
  421. // Called in the parent process only. Reads the result code of the death
  422. // test child process via a pipe, interprets it to set the outcome_
  423. // member, and closes read_fd_.  Outputs diagnostics and terminates in
  424. // case of unexpected codes.
  425. void DeathTestImpl::ReadAndInterpretStatusByte() {
  426.   char flag;
  427.   int bytes_read;
  428.  
  429.   // The read() here blocks until data is available (signifying the
  430.   // failure of the death test) or until the pipe is closed (signifying
  431.   // its success), so it's okay to call this in the parent before
  432.   // the child process has exited.
  433.   do {
  434.     bytes_read = posix::Read(read_fd(), &flag, 1);
  435.   } while (bytes_read == -1 && errno == EINTR);
  436.  
  437.   if (bytes_read == 0) {
  438.     set_outcome(DIED);
  439.   } else if (bytes_read == 1) {
  440.     switch (flag) {
  441.       case kDeathTestReturned:
  442.         set_outcome(RETURNED);
  443.         break;
  444.       case kDeathTestThrew:
  445.         set_outcome(THREW);
  446.         break;
  447.       case kDeathTestLived:
  448.         set_outcome(LIVED);
  449.         break;
  450.       case kDeathTestInternalError:
  451.         FailFromInternalError(read_fd());  // Does not return.
  452.         break;
  453.       default:
  454.         GTEST_LOG_(FATAL) << "Death test child process reported "
  455.                           << "unexpected status byte ("
  456.                           << static_cast<unsigned int>(flag) << ")";
  457.     }
  458.   } else {
  459.     GTEST_LOG_(FATAL) << "Read from death test child process failed: "
  460.                       << GetLastErrnoDescription();
  461.   }
  462.   GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
  463.   set_read_fd(-1);
  464. }
  465.  
  466. // Signals that the death test code which should have exited, didn't.
  467. // Should be called only in a death test child process.
  468. // Writes a status byte to the child's status file descriptor, then
  469. // calls _exit(1).
  470. void DeathTestImpl::Abort(AbortReason reason) {
  471.   // The parent process considers the death test to be a failure if
  472.   // it finds any data in our pipe.  So, here we write a single flag byte
  473.   // to the pipe, then exit.
  474.   const char status_ch =
  475.       reason == TEST_DID_NOT_DIE ? kDeathTestLived :
  476.       reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
  477.  
  478.   GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
  479.   // We are leaking the descriptor here because on some platforms (i.e.,
  480.   // when built as Windows DLL), destructors of global objects will still
  481.   // run after calling _exit(). On such systems, write_fd_ will be
  482.   // indirectly closed from the destructor of UnitTestImpl, causing double
  483.   // close if it is also closed here. On debug configurations, double close
  484.   // may assert. As there are no in-process buffers to flush here, we are
  485.   // relying on the OS to close the descriptor after the process terminates
  486.   // when the destructors are not run.
  487.   _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
  488. }
  489.  
  490. // Returns an indented copy of stderr output for a death test.
  491. // This makes distinguishing death test output lines from regular log lines
  492. // much easier.
  493. static ::std::string FormatDeathTestOutput(const ::std::string& output) {
  494.   ::std::string ret;
  495.   for (size_t at = 0; ; ) {
  496.     const size_t line_end = output.find('\n', at);
  497.     ret += "[  DEATH   ] ";
  498.     if (line_end == ::std::string::npos) {
  499.       ret += output.substr(at);
  500.       break;
  501.     }
  502.     ret += output.substr(at, line_end + 1 - at);
  503.     at = line_end + 1;
  504.   }
  505.   return ret;
  506. }
  507.  
  508. // Assesses the success or failure of a death test, using both private
  509. // members which have previously been set, and one argument:
  510. //
  511. // Private data members:
  512. //   outcome:  An enumeration describing how the death test
  513. //             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
  514. //             fails in the latter three cases.
  515. //   status:   The exit status of the child process. On *nix, it is in the
  516. //             in the format specified by wait(2). On Windows, this is the
  517. //             value supplied to the ExitProcess() API or a numeric code
  518. //             of the exception that terminated the program.
  519. //   regex:    A regular expression object to be applied to
  520. //             the test's captured standard error output; the death test
  521. //             fails if it does not match.
  522. //
  523. // Argument:
  524. //   status_ok: true if exit_status is acceptable in the context of
  525. //              this particular death test, which fails if it is false
  526. //
  527. // Returns true iff all of the above conditions are met.  Otherwise, the
  528. // first failing condition, in the order given above, is the one that is
  529. // reported. Also sets the last death test message string.
  530. bool DeathTestImpl::Passed(bool status_ok) {
  531.   if (!spawned())
  532.     return false;
  533.  
  534.   const std::string error_message = GetCapturedStderr();
  535.  
  536.   bool success = false;
  537.   Message buffer;
  538.  
  539.   buffer << "Death test: " << statement() << "\n";
  540.   switch (outcome()) {
  541.     case LIVED:
  542.       buffer << "    Result: failed to die.\n"
  543.              << " Error msg:\n" << FormatDeathTestOutput(error_message);
  544.       break;
  545.     case THREW:
  546.       buffer << "    Result: threw an exception.\n"
  547.              << " Error msg:\n" << FormatDeathTestOutput(error_message);
  548.       break;
  549.     case RETURNED:
  550.       buffer << "    Result: illegal return in test statement.\n"
  551.              << " Error msg:\n" << FormatDeathTestOutput(error_message);
  552.       break;
  553.     case DIED:
  554.       if (status_ok) {
  555.         const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
  556.         if (matched) {
  557.           success = true;
  558.         } else {
  559.           buffer << "    Result: died but not with expected error.\n"
  560.                  << "  Expected: " << regex()->pattern() << "\n"
  561.                  << "Actual msg:\n" << FormatDeathTestOutput(error_message);
  562.         }
  563.       } else {
  564.         buffer << "    Result: died but not with expected exit code:\n"
  565.                << "            " << ExitSummary(status()) << "\n"
  566.                << "Actual msg:\n" << FormatDeathTestOutput(error_message);
  567.       }
  568.       break;
  569.     case IN_PROGRESS:
  570.     default:
  571.       GTEST_LOG_(FATAL)
  572.           << "DeathTest::Passed somehow called before conclusion of test";
  573.   }
  574.  
  575.   DeathTest::set_last_death_test_message(buffer.GetString());
  576.   return success;
  577. }
  578.  
  579. # if GTEST_OS_WINDOWS
  580. // WindowsDeathTest implements death tests on Windows. Due to the
  581. // specifics of starting new processes on Windows, death tests there are
  582. // always threadsafe, and Google Test considers the
  583. // --gtest_death_test_style=fast setting to be equivalent to
  584. // --gtest_death_test_style=threadsafe there.
  585. //
  586. // A few implementation notes:  Like the Linux version, the Windows
  587. // implementation uses pipes for child-to-parent communication. But due to
  588. // the specifics of pipes on Windows, some extra steps are required:
  589. //
  590. // 1. The parent creates a communication pipe and stores handles to both
  591. //    ends of it.
  592. // 2. The parent starts the child and provides it with the information
  593. //    necessary to acquire the handle to the write end of the pipe.
  594. // 3. The child acquires the write end of the pipe and signals the parent
  595. //    using a Windows event.
  596. // 4. Now the parent can release the write end of the pipe on its side. If
  597. //    this is done before step 3, the object's reference count goes down to
  598. //    0 and it is destroyed, preventing the child from acquiring it. The
  599. //    parent now has to release it, or read operations on the read end of
  600. //    the pipe will not return when the child terminates.
  601. // 5. The parent reads child's output through the pipe (outcome code and
  602. //    any possible error messages) from the pipe, and its stderr and then
  603. //    determines whether to fail the test.
  604. //
  605. // Note: to distinguish Win32 API calls from the local method and function
  606. // calls, the former are explicitly resolved in the global namespace.
  607. //
  608. class WindowsDeathTest : public DeathTestImpl {
  609.  public:
  610.   WindowsDeathTest(const char* a_statement,
  611.                    const RE* a_regex,
  612.                    const char* file,
  613.                    int line)
  614.       : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
  615.  
  616.   // All of these virtual functions are inherited from DeathTest.
  617.   virtual int Wait();
  618.   virtual TestRole AssumeRole();
  619.  
  620.  private:
  621.   // The name of the file in which the death test is located.
  622.   const char* const file_;
  623.   // The line number on which the death test is located.
  624.   const int line_;
  625.   // Handle to the write end of the pipe to the child process.
  626.   AutoHandle write_handle_;
  627.   // Child process handle.
  628.   AutoHandle child_handle_;
  629.   // Event the child process uses to signal the parent that it has
  630.   // acquired the handle to the write end of the pipe. After seeing this
  631.   // event the parent can release its own handles to make sure its
  632.   // ReadFile() calls return when the child terminates.
  633.   AutoHandle event_handle_;
  634. };
  635.  
  636. // Waits for the child in a death test to exit, returning its exit
  637. // status, or 0 if no child process exists.  As a side effect, sets the
  638. // outcome data member.
  639. int WindowsDeathTest::Wait() {
  640.   if (!spawned())
  641.     return 0;
  642.  
  643.   // Wait until the child either signals that it has acquired the write end
  644.   // of the pipe or it dies.
  645.   const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
  646.   switch (::WaitForMultipleObjects(2,
  647.                                    wait_handles,
  648.                                    FALSE,  // Waits for any of the handles.
  649.                                    INFINITE)) {
  650.     case WAIT_OBJECT_0:
  651.     case WAIT_OBJECT_0 + 1:
  652.       break;
  653.     default:
  654.       GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
  655.   }
  656.  
  657.   // The child has acquired the write end of the pipe or exited.
  658.   // We release the handle on our side and continue.
  659.   write_handle_.Reset();
  660.   event_handle_.Reset();
  661.  
  662.   ReadAndInterpretStatusByte();
  663.  
  664.   // Waits for the child process to exit if it haven't already. This
  665.   // returns immediately if the child has already exited, regardless of
  666.   // whether previous calls to WaitForMultipleObjects synchronized on this
  667.   // handle or not.
  668.   GTEST_DEATH_TEST_CHECK_(
  669.       WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
  670.                                              INFINITE));
  671.   DWORD status_code;
  672.   GTEST_DEATH_TEST_CHECK_(
  673.       ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
  674.   child_handle_.Reset();
  675.   set_status(static_cast<int>(status_code));
  676.   return status();
  677. }
  678.  
  679. // The AssumeRole process for a Windows death test.  It creates a child
  680. // process with the same executable as the current process to run the
  681. // death test.  The child process is given the --gtest_filter and
  682. // --gtest_internal_run_death_test flags such that it knows to run the
  683. // current death test only.
  684. DeathTest::TestRole WindowsDeathTest::AssumeRole() {
  685.   const UnitTestImpl* const impl = GetUnitTestImpl();
  686.   const InternalRunDeathTestFlag* const flag =
  687.       impl->internal_run_death_test_flag();
  688.   const TestInfo* const info = impl->current_test_info();
  689.   const int death_test_index = info->result()->death_test_count();
  690.  
  691.   if (flag != NULL) {
  692.     // ParseInternalRunDeathTestFlag() has performed all the necessary
  693.     // processing.
  694.     set_write_fd(flag->write_fd());
  695.     return EXECUTE_TEST;
  696.   }
  697.  
  698.   // WindowsDeathTest uses an anonymous pipe to communicate results of
  699.   // a death test.
  700.   SECURITY_ATTRIBUTES handles_are_inheritable = {
  701.     sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
  702.   HANDLE read_handle, write_handle;
  703.   GTEST_DEATH_TEST_CHECK_(
  704.       ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
  705.                    0)  // Default buffer size.
  706.       != FALSE);
  707.   set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
  708.                                 O_RDONLY));
  709.   write_handle_.Reset(write_handle);
  710.   event_handle_.Reset(::CreateEvent(
  711.       &handles_are_inheritable,
  712.       TRUE,    // The event will automatically reset to non-signaled state.
  713.       FALSE,   // The initial state is non-signalled.
  714.       NULL));  // The even is unnamed.
  715.   GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
  716.   const std::string filter_flag =
  717.       std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
  718.       info->test_case_name() + "." + info->name();
  719.   const std::string internal_flag =
  720.       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
  721.       "=" + file_ + "|" + StreamableToString(line_) + "|" +
  722.       StreamableToString(death_test_index) + "|" +
  723.       StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
  724.       // size_t has the same width as pointers on both 32-bit and 64-bit
  725.       // Windows platforms.
  726.       // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
  727.       "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
  728.       "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
  729.  
  730.   char executable_path[_MAX_PATH + 1];  // NOLINT
  731.   GTEST_DEATH_TEST_CHECK_(
  732.       _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
  733.                                             executable_path,
  734.                                             _MAX_PATH));
  735.  
  736.   std::string command_line =
  737.       std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
  738.       internal_flag + "\"";
  739.  
  740.   DeathTest::set_last_death_test_message("");
  741.  
  742.   CaptureStderr();
  743.   // Flush the log buffers since the log streams are shared with the child.
  744.   FlushInfoLog();
  745.  
  746.   // The child process will share the standard handles with the parent.
  747.   STARTUPINFOA startup_info;
  748.   memset(&startup_info, 0, sizeof(STARTUPINFO));
  749.   startup_info.dwFlags = STARTF_USESTDHANDLES;
  750.   startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
  751.   startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
  752.   startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
  753.  
  754.   PROCESS_INFORMATION process_info;
  755.   GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
  756.       executable_path,
  757.       const_cast<char*>(command_line.c_str()),
  758.       NULL,   // Retuned process handle is not inheritable.
  759.       NULL,   // Retuned thread handle is not inheritable.
  760.       TRUE,   // Child inherits all inheritable handles (for write_handle_).
  761.       0x0,    // Default creation flags.
  762.       NULL,   // Inherit the parent's environment.
  763.       UnitTest::GetInstance()->original_working_dir(),
  764.       &startup_info,
  765.       &process_info) != FALSE);
  766.   child_handle_.Reset(process_info.hProcess);
  767.   ::CloseHandle(process_info.hThread);
  768.   set_spawned(true);
  769.   return OVERSEE_TEST;
  770. }
  771. # else  // We are not on Windows.
  772.  
  773. // ForkingDeathTest provides implementations for most of the abstract
  774. // methods of the DeathTest interface.  Only the AssumeRole method is
  775. // left undefined.
  776. class ForkingDeathTest : public DeathTestImpl {
  777.  public:
  778.   ForkingDeathTest(const char* statement, const RE* regex);
  779.  
  780.   // All of these virtual functions are inherited from DeathTest.
  781.   virtual int Wait();
  782.  
  783.  protected:
  784.   void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
  785.  
  786.  private:
  787.   // PID of child process during death test; 0 in the child process itself.
  788.   pid_t child_pid_;
  789. };
  790.  
  791. // Constructs a ForkingDeathTest.
  792. ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
  793.     : DeathTestImpl(a_statement, a_regex),
  794.       child_pid_(-1) {}
  795.  
  796. // Waits for the child in a death test to exit, returning its exit
  797. // status, or 0 if no child process exists.  As a side effect, sets the
  798. // outcome data member.
  799. int ForkingDeathTest::Wait() {
  800.   if (!spawned())
  801.     return 0;
  802.  
  803.   ReadAndInterpretStatusByte();
  804.  
  805.   int status_value;
  806.   GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
  807.   set_status(status_value);
  808.   return status_value;
  809. }
  810.  
  811. // A concrete death test class that forks, then immediately runs the test
  812. // in the child process.
  813. class NoExecDeathTest : public ForkingDeathTest {
  814.  public:
  815.   NoExecDeathTest(const char* a_statement, const RE* a_regex) :
  816.       ForkingDeathTest(a_statement, a_regex) { }
  817.   virtual TestRole AssumeRole();
  818. };
  819.  
  820. // The AssumeRole process for a fork-and-run death test.  It implements a
  821. // straightforward fork, with a simple pipe to transmit the status byte.
  822. DeathTest::TestRole NoExecDeathTest::AssumeRole() {
  823.   const size_t thread_count = GetThreadCount();
  824.   if (thread_count != 1) {
  825.     GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
  826.   }
  827.  
  828.   int pipe_fd[2];
  829.   GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
  830.  
  831.   DeathTest::set_last_death_test_message("");
  832.   CaptureStderr();
  833.   // When we fork the process below, the log file buffers are copied, but the
  834.   // file descriptors are shared.  We flush all log files here so that closing
  835.   // the file descriptors in the child process doesn't throw off the
  836.   // synchronization between descriptors and buffers in the parent process.
  837.   // This is as close to the fork as possible to avoid a race condition in case
  838.   // there are multiple threads running before the death test, and another
  839.   // thread writes to the log file.
  840.   FlushInfoLog();
  841.  
  842.   const pid_t child_pid = fork();
  843.   GTEST_DEATH_TEST_CHECK_(child_pid != -1);
  844.   set_child_pid(child_pid);
  845.   if (child_pid == 0) {
  846.     GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
  847.     set_write_fd(pipe_fd[1]);
  848.     // Redirects all logging to stderr in the child process to prevent
  849.     // concurrent writes to the log files.  We capture stderr in the parent
  850.     // process and append the child process' output to a log.
  851.     LogToStderr();
  852.     // Event forwarding to the listeners of event listener API mush be shut
  853.     // down in death test subprocesses.
  854.     GetUnitTestImpl()->listeners()->SuppressEventForwarding();
  855.     g_in_fast_death_test_child = true;
  856.     return EXECUTE_TEST;
  857.   } else {
  858.     GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
  859.     set_read_fd(pipe_fd[0]);
  860.     set_spawned(true);
  861.     return OVERSEE_TEST;
  862.   }
  863. }
  864.  
  865. // A concrete death test class that forks and re-executes the main
  866. // program from the beginning, with command-line flags set that cause
  867. // only this specific death test to be run.
  868. class ExecDeathTest : public ForkingDeathTest {
  869.  public:
  870.   ExecDeathTest(const char* a_statement, const RE* a_regex,
  871.                 const char* file, int line) :
  872.       ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
  873.   virtual TestRole AssumeRole();
  874.  private:
  875.   static ::std::vector<testing::internal::string>
  876.   GetArgvsForDeathTestChildProcess() {
  877.     ::std::vector<testing::internal::string> args = GetInjectableArgvs();
  878.     return args;
  879.   }
  880.   // The name of the file in which the death test is located.
  881.   const char* const file_;
  882.   // The line number on which the death test is located.
  883.   const int line_;
  884. };
  885.  
  886. // Utility class for accumulating command-line arguments.
  887. class Arguments {
  888.  public:
  889.   Arguments() {
  890.     args_.push_back(NULL);
  891.   }
  892.  
  893.   ~Arguments() {
  894.     for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
  895.          ++i) {
  896.       free(*i);
  897.     }
  898.   }
  899.   void AddArgument(const char* argument) {
  900.     args_.insert(args_.end() - 1, posix::StrDup(argument));
  901.   }
  902.  
  903.   template <typename Str>
  904.   void AddArguments(const ::std::vector<Str>& arguments) {
  905.     for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
  906.          i != arguments.end();
  907.          ++i) {
  908.       args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
  909.     }
  910.   }
  911.   char* const* Argv() {
  912.     return &args_[0];
  913.   }
  914.  
  915.  private:
  916.   std::vector<char*> args_;
  917. };
  918.  
  919. // A struct that encompasses the arguments to the child process of a
  920. // threadsafe-style death test process.
  921. struct ExecDeathTestArgs {
  922.   char* const* argv;  // Command-line arguments for the child's call to exec
  923.   int close_fd;       // File descriptor to close; the read end of a pipe
  924. };
  925.  
  926. #  if GTEST_OS_MAC
  927. inline char** GetEnviron() {
  928.   // When Google Test is built as a framework on MacOS X, the environ variable
  929.   // is unavailable. Apple's documentation (man environ) recommends using
  930.   // _NSGetEnviron() instead.
  931.   return *_NSGetEnviron();
  932. }
  933. #  else
  934. // Some POSIX platforms expect you to declare environ. extern "C" makes
  935. // it reside in the global namespace.
  936. extern "C" char** environ;
  937. inline char** GetEnviron() { return environ; }
  938. #  endif  // GTEST_OS_MAC
  939.  
  940. #  if !GTEST_OS_QNX
  941. // The main function for a threadsafe-style death test child process.
  942. // This function is called in a clone()-ed process and thus must avoid
  943. // any potentially unsafe operations like malloc or libc functions.
  944. static int ExecDeathTestChildMain(void* child_arg) {
  945.   ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
  946.   GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
  947.  
  948.   // We need to execute the test program in the same environment where
  949.   // it was originally invoked.  Therefore we change to the original
  950.   // working directory first.
  951.   const char* const original_dir =
  952.       UnitTest::GetInstance()->original_working_dir();
  953.   // We can safely call chdir() as it's a direct system call.
  954.   if (chdir(original_dir) != 0) {
  955.     DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
  956.                    GetLastErrnoDescription());
  957.     return EXIT_FAILURE;
  958.   }
  959.  
  960.   // We can safely call execve() as it's a direct system call.  We
  961.   // cannot use execvp() as it's a libc function and thus potentially
  962.   // unsafe.  Since execve() doesn't search the PATH, the user must
  963.   // invoke the test program via a valid path that contains at least
  964.   // one path separator.
  965.   execve(args->argv[0], args->argv, GetEnviron());
  966.   DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
  967.                  original_dir + " failed: " +
  968.                  GetLastErrnoDescription());
  969.   return EXIT_FAILURE;
  970. }
  971. #  endif  // !GTEST_OS_QNX
  972.  
  973. // Two utility routines that together determine the direction the stack
  974. // grows.
  975. // This could be accomplished more elegantly by a single recursive
  976. // function, but we want to guard against the unlikely possibility of
  977. // a smart compiler optimizing the recursion away.
  978. //
  979. // GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
  980. // StackLowerThanAddress into StackGrowsDown, which then doesn't give
  981. // correct answer.
  982. void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
  983. void StackLowerThanAddress(const void* ptr, bool* result) {
  984.   int dummy;
  985.   *result = (&dummy < ptr);
  986. }
  987.  
  988. bool StackGrowsDown() {
  989.   int dummy;
  990.   bool result;
  991.   StackLowerThanAddress(&dummy, &result);
  992.   return result;
  993. }
  994.  
  995. // Spawns a child process with the same executable as the current process in
  996. // a thread-safe manner and instructs it to run the death test.  The
  997. // implementation uses fork(2) + exec.  On systems where clone(2) is
  998. // available, it is used instead, being slightly more thread-safe.  On QNX,
  999. // fork supports only single-threaded environments, so this function uses
  1000. // spawn(2) there instead.  The function dies with an error message if
  1001. // anything goes wrong.
  1002. static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
  1003.   ExecDeathTestArgs args = { argv, close_fd };
  1004.   pid_t child_pid = -1;
  1005.  
  1006. #  if GTEST_OS_QNX
  1007.   // Obtains the current directory and sets it to be closed in the child
  1008.   // process.
  1009.   const int cwd_fd = open(".", O_RDONLY);
  1010.   GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
  1011.   GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
  1012.   // We need to execute the test program in the same environment where
  1013.   // it was originally invoked.  Therefore we change to the original
  1014.   // working directory first.
  1015.   const char* const original_dir =
  1016.       UnitTest::GetInstance()->original_working_dir();
  1017.   // We can safely call chdir() as it's a direct system call.
  1018.   if (chdir(original_dir) != 0) {
  1019.     DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
  1020.                    GetLastErrnoDescription());
  1021.     return EXIT_FAILURE;
  1022.   }
  1023.  
  1024.   int fd_flags;
  1025.   // Set close_fd to be closed after spawn.
  1026.   GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
  1027.   GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
  1028.                                         fd_flags | FD_CLOEXEC));
  1029.   struct inheritance inherit = {0};
  1030.   // spawn is a system call.
  1031.   child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
  1032.   // Restores the current working directory.
  1033.   GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
  1034.   GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
  1035.  
  1036. #  else   // GTEST_OS_QNX
  1037. #   if GTEST_OS_LINUX
  1038.   // When a SIGPROF signal is received while fork() or clone() are executing,
  1039.   // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
  1040.   // it after the call to fork()/clone() is complete.
  1041.   struct sigaction saved_sigprof_action;
  1042.   struct sigaction ignore_sigprof_action;
  1043.   memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
  1044.   sigemptyset(&ignore_sigprof_action.sa_mask);
  1045.   ignore_sigprof_action.sa_handler = SIG_IGN;
  1046.   GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
  1047.       SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
  1048. #   endif  // GTEST_OS_LINUX
  1049.  
  1050. #   if GTEST_HAS_CLONE
  1051.   const bool use_fork = GTEST_FLAG(death_test_use_fork);
  1052.  
  1053.   if (!use_fork) {
  1054.     static const bool stack_grows_down = StackGrowsDown();
  1055.     const size_t stack_size = getpagesize();
  1056.     // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
  1057.     void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
  1058.                              MAP_ANON | MAP_PRIVATE, -1, 0);
  1059.     GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
  1060.  
  1061.     // Maximum stack alignment in bytes:  For a downward-growing stack, this
  1062.     // amount is subtracted from size of the stack space to get an address
  1063.     // that is within the stack space and is aligned on all systems we care
  1064.     // about.  As far as I know there is no ABI with stack alignment greater
  1065.     // than 64.  We assume stack and stack_size already have alignment of
  1066.     // kMaxStackAlignment.
  1067.     const size_t kMaxStackAlignment = 64;
  1068.     void* const stack_top =
  1069.         static_cast<char*>(stack) +
  1070.             (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
  1071.     GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
  1072.         reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
  1073.  
  1074.     child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
  1075.  
  1076.     GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
  1077.   }
  1078. #   else
  1079.   const bool use_fork = true;
  1080. #   endif  // GTEST_HAS_CLONE
  1081.  
  1082.   if (use_fork && (child_pid = fork()) == 0) {
  1083.       ExecDeathTestChildMain(&args);
  1084.       _exit(0);
  1085.   }
  1086. #  endif  // GTEST_OS_QNX
  1087. #  if GTEST_OS_LINUX
  1088.   GTEST_DEATH_TEST_CHECK_SYSCALL_(
  1089.       sigaction(SIGPROF, &saved_sigprof_action, NULL));
  1090. #  endif  // GTEST_OS_LINUX
  1091.  
  1092.   GTEST_DEATH_TEST_CHECK_(child_pid != -1);
  1093.   return child_pid;
  1094. }
  1095.  
  1096. // The AssumeRole process for a fork-and-exec death test.  It re-executes the
  1097. // main program from the beginning, setting the --gtest_filter
  1098. // and --gtest_internal_run_death_test flags to cause only the current
  1099. // death test to be re-run.
  1100. DeathTest::TestRole ExecDeathTest::AssumeRole() {
  1101.   const UnitTestImpl* const impl = GetUnitTestImpl();
  1102.   const InternalRunDeathTestFlag* const flag =
  1103.       impl->internal_run_death_test_flag();
  1104.   const TestInfo* const info = impl->current_test_info();
  1105.   const int death_test_index = info->result()->death_test_count();
  1106.  
  1107.   if (flag != NULL) {
  1108.     set_write_fd(flag->write_fd());
  1109.     return EXECUTE_TEST;
  1110.   }
  1111.  
  1112.   int pipe_fd[2];
  1113.   GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
  1114.   // Clear the close-on-exec flag on the write end of the pipe, lest
  1115.   // it be closed when the child process does an exec:
  1116.   GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
  1117.  
  1118.   const std::string filter_flag =
  1119.       std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
  1120.       + info->test_case_name() + "." + info->name();
  1121.   const std::string internal_flag =
  1122.       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
  1123.       + file_ + "|" + StreamableToString(line_) + "|"
  1124.       + StreamableToString(death_test_index) + "|"
  1125.       + StreamableToString(pipe_fd[1]);
  1126.   Arguments args;
  1127.   args.AddArguments(GetArgvsForDeathTestChildProcess());
  1128.   args.AddArgument(filter_flag.c_str());
  1129.   args.AddArgument(internal_flag.c_str());
  1130.  
  1131.   DeathTest::set_last_death_test_message("");
  1132.  
  1133.   CaptureStderr();
  1134.   // See the comment in NoExecDeathTest::AssumeRole for why the next line
  1135.   // is necessary.
  1136.   FlushInfoLog();
  1137.  
  1138.   const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
  1139.   GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
  1140.   set_child_pid(child_pid);
  1141.   set_read_fd(pipe_fd[0]);
  1142.   set_spawned(true);
  1143.   return OVERSEE_TEST;
  1144. }
  1145.  
  1146. # endif  // !GTEST_OS_WINDOWS
  1147.  
  1148. // Creates a concrete DeathTest-derived class that depends on the
  1149. // --gtest_death_test_style flag, and sets the pointer pointed to
  1150. // by the "test" argument to its address.  If the test should be
  1151. // skipped, sets that pointer to NULL.  Returns true, unless the
  1152. // flag is set to an invalid value.
  1153. bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
  1154.                                      const char* file, int line,
  1155.                                      DeathTest** test) {
  1156.   UnitTestImpl* const impl = GetUnitTestImpl();
  1157.   const InternalRunDeathTestFlag* const flag =
  1158.       impl->internal_run_death_test_flag();
  1159.   const int death_test_index = impl->current_test_info()
  1160.       ->increment_death_test_count();
  1161.  
  1162.   if (flag != NULL) {
  1163.     if (death_test_index > flag->index()) {
  1164.       DeathTest::set_last_death_test_message(
  1165.           "Death test count (" + StreamableToString(death_test_index)
  1166.           + ") somehow exceeded expected maximum ("
  1167.           + StreamableToString(flag->index()) + ")");
  1168.       return false;
  1169.     }
  1170.  
  1171.     if (!(flag->file() == file && flag->line() == line &&
  1172.           flag->index() == death_test_index)) {
  1173.       *test = NULL;
  1174.       return true;
  1175.     }
  1176.   }
  1177.  
  1178. # if GTEST_OS_WINDOWS
  1179.  
  1180.   if (GTEST_FLAG(death_test_style) == "threadsafe" ||
  1181.       GTEST_FLAG(death_test_style) == "fast") {
  1182.     *test = new WindowsDeathTest(statement, regex, file, line);
  1183.   }
  1184.  
  1185. # else
  1186.  
  1187.   if (GTEST_FLAG(death_test_style) == "threadsafe") {
  1188.     *test = new ExecDeathTest(statement, regex, file, line);
  1189.   } else if (GTEST_FLAG(death_test_style) == "fast") {
  1190.     *test = new NoExecDeathTest(statement, regex);
  1191.   }
  1192.  
  1193. # endif  // GTEST_OS_WINDOWS
  1194.  
  1195.   else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
  1196.     DeathTest::set_last_death_test_message(
  1197.         "Unknown death test style \"" + GTEST_FLAG(death_test_style)
  1198.         + "\" encountered");
  1199.     return false;
  1200.   }
  1201.  
  1202.   return true;
  1203. }
  1204.  
  1205. // Splits a given string on a given delimiter, populating a given
  1206. // vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
  1207. // ::std::string, so we can use it here.
  1208. static void SplitString(const ::std::string& str, char delimiter,
  1209.                         ::std::vector< ::std::string>* dest) {
  1210.   ::std::vector< ::std::string> parsed;
  1211.   ::std::string::size_type pos = 0;
  1212.   while (::testing::internal::AlwaysTrue()) {
  1213.     const ::std::string::size_type colon = str.find(delimiter, pos);
  1214.     if (colon == ::std::string::npos) {
  1215.       parsed.push_back(str.substr(pos));
  1216.       break;
  1217.     } else {
  1218.       parsed.push_back(str.substr(pos, colon - pos));
  1219.       pos = colon + 1;
  1220.     }
  1221.   }
  1222.   dest->swap(parsed);
  1223. }
  1224.  
  1225. # if GTEST_OS_WINDOWS
  1226. // Recreates the pipe and event handles from the provided parameters,
  1227. // signals the event, and returns a file descriptor wrapped around the pipe
  1228. // handle. This function is called in the child process only.
  1229. int GetStatusFileDescriptor(unsigned int parent_process_id,
  1230.                             size_t write_handle_as_size_t,
  1231.                             size_t event_handle_as_size_t) {
  1232.   AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
  1233.                                                    FALSE,  // Non-inheritable.
  1234.                                                    parent_process_id));
  1235.   if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
  1236.     DeathTestAbort("Unable to open parent process " +
  1237.                    StreamableToString(parent_process_id));
  1238.   }
  1239.  
  1240.   // TODO(vladl@google.com): Replace the following check with a
  1241.   // compile-time assertion when available.
  1242.   GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
  1243.  
  1244.   const HANDLE write_handle =
  1245.       reinterpret_cast<HANDLE>(write_handle_as_size_t);
  1246.   HANDLE dup_write_handle;
  1247.  
  1248.   // The newly initialized handle is accessible only in in the parent
  1249.   // process. To obtain one accessible within the child, we need to use
  1250.   // DuplicateHandle.
  1251.   if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
  1252.                          ::GetCurrentProcess(), &dup_write_handle,
  1253.                          0x0,    // Requested privileges ignored since
  1254.                                  // DUPLICATE_SAME_ACCESS is used.
  1255.                          FALSE,  // Request non-inheritable handler.
  1256.                          DUPLICATE_SAME_ACCESS)) {
  1257.     DeathTestAbort("Unable to duplicate the pipe handle " +
  1258.                    StreamableToString(write_handle_as_size_t) +
  1259.                    " from the parent process " +
  1260.                    StreamableToString(parent_process_id));
  1261.   }
  1262.  
  1263.   const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
  1264.   HANDLE dup_event_handle;
  1265.  
  1266.   if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
  1267.                          ::GetCurrentProcess(), &dup_event_handle,
  1268.                          0x0,
  1269.                          FALSE,
  1270.                          DUPLICATE_SAME_ACCESS)) {
  1271.     DeathTestAbort("Unable to duplicate the event handle " +
  1272.                    StreamableToString(event_handle_as_size_t) +
  1273.                    " from the parent process " +
  1274.                    StreamableToString(parent_process_id));
  1275.   }
  1276.  
  1277.   const int write_fd =
  1278.       ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
  1279.   if (write_fd == -1) {
  1280.     DeathTestAbort("Unable to convert pipe handle " +
  1281.                    StreamableToString(write_handle_as_size_t) +
  1282.                    " to a file descriptor");
  1283.   }
  1284.  
  1285.   // Signals the parent that the write end of the pipe has been acquired
  1286.   // so the parent can release its own write end.
  1287.   ::SetEvent(dup_event_handle);
  1288.  
  1289.   return write_fd;
  1290. }
  1291. # endif  // GTEST_OS_WINDOWS
  1292.  
  1293. // Returns a newly created InternalRunDeathTestFlag object with fields
  1294. // initialized from the GTEST_FLAG(internal_run_death_test) flag if
  1295. // the flag is specified; otherwise returns NULL.
  1296. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
  1297.   if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
  1298.  
  1299.   // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
  1300.   // can use it here.
  1301.   int line = -1;
  1302.   int index = -1;
  1303.   ::std::vector< ::std::string> fields;
  1304.   SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
  1305.   int write_fd = -1;
  1306.  
  1307. # if GTEST_OS_WINDOWS
  1308.  
  1309.   unsigned int parent_process_id = 0;
  1310.   size_t write_handle_as_size_t = 0;
  1311.   size_t event_handle_as_size_t = 0;
  1312.  
  1313.   if (fields.size() != 6
  1314.       || !ParseNaturalNumber(fields[1], &line)
  1315.       || !ParseNaturalNumber(fields[2], &index)
  1316.       || !ParseNaturalNumber(fields[3], &parent_process_id)
  1317.       || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
  1318.       || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
  1319.     DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
  1320.                    GTEST_FLAG(internal_run_death_test));
  1321.   }
  1322.   write_fd = GetStatusFileDescriptor(parent_process_id,
  1323.                                      write_handle_as_size_t,
  1324.                                      event_handle_as_size_t);
  1325. # else
  1326.  
  1327.   if (fields.size() != 4
  1328.       || !ParseNaturalNumber(fields[1], &line)
  1329.       || !ParseNaturalNumber(fields[2], &index)
  1330.       || !ParseNaturalNumber(fields[3], &write_fd)) {
  1331.     DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
  1332.         + GTEST_FLAG(internal_run_death_test));
  1333.   }
  1334.  
  1335. # endif  // GTEST_OS_WINDOWS
  1336.  
  1337.   return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
  1338. }
  1339.  
  1340. }  // namespace internal
  1341.  
  1342. #endif  // GTEST_HAS_DEATH_TEST
  1343.  
  1344. }  // namespace testing
  1345.