Home | History | Annotate | Download | only in gtest
      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 (at) google.com (Zhanyong Wan)
     31 //
     32 // This file implements death tests.
     33 
     34 #include <gtest/gtest-death-test.h>
     35 #include <gtest/internal/gtest-port.h>
     36 
     37 #include <errno.h>
     38 #include <limits.h>
     39 #include <stdarg.h>
     40 
     41 #include <gtest/gtest-message.h>
     42 #include <gtest/internal/gtest-string.h>
     43 
     44 // Indicates that this translation unit is part of Google Test's
     45 // implementation.  It must come before gtest-internal-inl.h is
     46 // included, or there will be a compiler error.  This trick is to
     47 // prevent a user from accidentally including gtest-internal-inl.h in
     48 // his code.
     49 #define GTEST_IMPLEMENTATION
     50 #include "src/gtest-internal-inl.h"
     51 #undef GTEST_IMPLEMENTATION
     52 
     53 namespace testing {
     54 
     55 // Constants.
     56 
     57 // The default death test style.
     58 static const char kDefaultDeathTestStyle[] = "fast";
     59 
     60 GTEST_DEFINE_string(
     61     death_test_style,
     62     internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
     63     "Indicates how to run a death test in a forked child process: "
     64     "\"threadsafe\" (child process re-executes the test binary "
     65     "from the beginning, running only the specific death test) or "
     66     "\"fast\" (child process runs the death test immediately "
     67     "after forking).");
     68 
     69 namespace internal {
     70 GTEST_DEFINE_string(
     71     internal_run_death_test, "",
     72     "Indicates the file, line number, temporal index of "
     73     "the single death test to run, and a file descriptor to "
     74     "which a success code may be sent, all separated by "
     75     "colons.  This flag is specified if and only if the current "
     76     "process is a sub-process launched for running a thread-safe "
     77     "death test.  FOR INTERNAL USE ONLY.");
     78 }  // namespace internal
     79 
     80 #ifdef GTEST_HAS_DEATH_TEST
     81 
     82 // ExitedWithCode constructor.
     83 ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
     84 }
     85 
     86 // ExitedWithCode function-call operator.
     87 bool ExitedWithCode::operator()(int exit_status) const {
     88   return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
     89 }
     90 
     91 // KilledBySignal constructor.
     92 KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
     93 }
     94 
     95 // KilledBySignal function-call operator.
     96 bool KilledBySignal::operator()(int exit_status) const {
     97   return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
     98 }
     99 
    100 namespace internal {
    101 
    102 // Utilities needed for death tests.
    103 
    104 // Generates a textual description of a given exit code, in the format
    105 // specified by wait(2).
    106 static String ExitSummary(int exit_code) {
    107   Message m;
    108   if (WIFEXITED(exit_code)) {
    109     m << "Exited with exit status " << WEXITSTATUS(exit_code);
    110   } else if (WIFSIGNALED(exit_code)) {
    111     m << "Terminated by signal " << WTERMSIG(exit_code);
    112   }
    113 #ifdef WCOREDUMP
    114   if (WCOREDUMP(exit_code)) {
    115     m << " (core dumped)";
    116   }
    117 #endif
    118   return m.GetString();
    119 }
    120 
    121 // Returns true if exit_status describes a process that was terminated
    122 // by a signal, or exited normally with a nonzero exit code.
    123 bool ExitedUnsuccessfully(int exit_status) {
    124   return !ExitedWithCode(0)(exit_status);
    125 }
    126 
    127 // Generates a textual failure message when a death test finds more than
    128 // one thread running, or cannot determine the number of threads, prior
    129 // to executing the given statement.  It is the responsibility of the
    130 // caller not to pass a thread_count of 1.
    131 static String DeathTestThreadWarning(size_t thread_count) {
    132   Message msg;
    133   msg << "Death tests use fork(), which is unsafe particularly"
    134       << " in a threaded context. For this test, " << GTEST_NAME << " ";
    135   if (thread_count == 0)
    136     msg << "couldn't detect the number of threads.";
    137   else
    138     msg << "detected " << thread_count << " threads.";
    139   return msg.GetString();
    140 }
    141 
    142 // Static string containing a description of the outcome of the
    143 // last death test.
    144 static String last_death_test_message;
    145 
    146 // Flag characters for reporting a death test that did not die.
    147 static const char kDeathTestLived = 'L';
    148 static const char kDeathTestReturned = 'R';
    149 static const char kDeathTestInternalError = 'I';
    150 
    151 // An enumeration describing all of the possible ways that a death test
    152 // can conclude.  DIED means that the process died while executing the
    153 // test code; LIVED means that process lived beyond the end of the test
    154 // code; and RETURNED means that the test statement attempted a "return,"
    155 // which is not allowed.  IN_PROGRESS means the test has not yet
    156 // concluded.
    157 enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED };
    158 
    159 // Routine for aborting the program which is safe to call from an
    160 // exec-style death test child process, in which case the the error
    161 // message is propagated back to the parent process.  Otherwise, the
    162 // message is simply printed to stderr.  In either case, the program
    163 // then exits with status 1.
    164 void DeathTestAbort(const char* format, ...) {
    165   // This function may be called from a threadsafe-style death test
    166   // child process, which operates on a very small stack.  Use the
    167   // heap for any additional non-miniscule memory requirements.
    168   const InternalRunDeathTestFlag* const flag =
    169       GetUnitTestImpl()->internal_run_death_test_flag();
    170   va_list args;
    171   va_start(args, format);
    172 
    173   if (flag != NULL) {
    174     FILE* parent = fdopen(flag->status_fd, "w");
    175     fputc(kDeathTestInternalError, parent);
    176     vfprintf(parent, format, args);
    177     fclose(parent);
    178     va_end(args);
    179     _exit(1);
    180   } else {
    181     vfprintf(stderr, format, args);
    182     va_end(args);
    183     abort();
    184   }
    185 }
    186 
    187 // A replacement for CHECK that calls DeathTestAbort if the assertion
    188 // fails.
    189 #define GTEST_DEATH_TEST_CHECK(expression) \
    190   do { \
    191     if (!(expression)) { \
    192       DeathTestAbort("CHECK failed: File %s, line %d: %s", \
    193                      __FILE__, __LINE__, #expression); \
    194     } \
    195   } while (0)
    196 
    197 // This macro is similar to GTEST_DEATH_TEST_CHECK, but it is meant for
    198 // evaluating any system call that fulfills two conditions: it must return
    199 // -1 on failure, and set errno to EINTR when it is interrupted and
    200 // should be tried again.  The macro expands to a loop that repeatedly
    201 // evaluates the expression as long as it evaluates to -1 and sets
    202 // errno to EINTR.  If the expression evaluates to -1 but errno is
    203 // something other than EINTR, DeathTestAbort is called.
    204 #define GTEST_DEATH_TEST_CHECK_SYSCALL(expression) \
    205   do { \
    206     int retval; \
    207     do { \
    208       retval = (expression); \
    209     } while (retval == -1 && errno == EINTR); \
    210     if (retval == -1) { \
    211       DeathTestAbort("CHECK failed: File %s, line %d: %s != -1", \
    212                      __FILE__, __LINE__, #expression); \
    213     } \
    214   } while (0)
    215 
    216 // Death test constructor.  Increments the running death test count
    217 // for the current test.
    218 DeathTest::DeathTest() {
    219   TestInfo* const info = GetUnitTestImpl()->current_test_info();
    220   if (info == NULL) {
    221     DeathTestAbort("Cannot run a death test outside of a TEST or "
    222                    "TEST_F construct");
    223   }
    224 }
    225 
    226 // Creates and returns a death test by dispatching to the current
    227 // death test factory.
    228 bool DeathTest::Create(const char* statement, const RE* regex,
    229                        const char* file, int line, DeathTest** test) {
    230   return GetUnitTestImpl()->death_test_factory()->Create(
    231       statement, regex, file, line, test);
    232 }
    233 
    234 const char* DeathTest::LastMessage() {
    235   return last_death_test_message.c_str();
    236 }
    237 
    238 // ForkingDeathTest provides implementations for most of the abstract
    239 // methods of the DeathTest interface.  Only the AssumeRole method is
    240 // left undefined.
    241 class ForkingDeathTest : public DeathTest {
    242  public:
    243   ForkingDeathTest(const char* statement, const RE* regex);
    244 
    245   // All of these virtual functions are inherited from DeathTest.
    246   virtual int Wait();
    247   virtual bool Passed(bool status_ok);
    248   virtual void Abort(AbortReason reason);
    249 
    250  protected:
    251   void set_forked(bool forked) { forked_ = forked; }
    252   void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
    253   void set_read_fd(int fd) { read_fd_ = fd; }
    254   void set_write_fd(int fd) { write_fd_ = fd; }
    255 
    256  private:
    257   // The textual content of the code this object is testing.
    258   const char* const statement_;
    259   // The regular expression which test output must match.
    260   const RE* const regex_;
    261   // True if the death test successfully forked.
    262   bool forked_;
    263   // PID of child process during death test; 0 in the child process itself.
    264   pid_t child_pid_;
    265   // File descriptors for communicating the death test's status byte.
    266   int read_fd_;   // Always -1 in the child process.
    267   int write_fd_;  // Always -1 in the parent process.
    268   // The exit status of the child process.
    269   int status_;
    270   // How the death test concluded.
    271   DeathTestOutcome outcome_;
    272 };
    273 
    274 // Constructs a ForkingDeathTest.
    275 ForkingDeathTest::ForkingDeathTest(const char* statement, const RE* regex)
    276     : DeathTest(),
    277       statement_(statement),
    278       regex_(regex),
    279       forked_(false),
    280       child_pid_(-1),
    281       read_fd_(-1),
    282       write_fd_(-1),
    283       status_(-1),
    284       outcome_(IN_PROGRESS) {
    285 }
    286 
    287 // Reads an internal failure message from a file descriptor, then calls
    288 // LOG(FATAL) with that message.  Called from a death test parent process
    289 // to read a failure message from the death test child process.
    290 static void FailFromInternalError(int fd) {
    291   Message error;
    292   char buffer[256];
    293   ssize_t num_read;
    294 
    295   do {
    296     while ((num_read = read(fd, buffer, 255)) > 0) {
    297       buffer[num_read] = '\0';
    298       error << buffer;
    299     }
    300   } while (num_read == -1 && errno == EINTR);
    301 
    302   // TODO(smcafee):  Maybe just FAIL the test instead?
    303   if (num_read == 0) {
    304     GTEST_LOG(FATAL, error);
    305   } else {
    306     GTEST_LOG(FATAL,
    307               Message() << "Error while reading death test internal: "
    308               << strerror(errno) << " [" << errno << "]");
    309   }
    310 }
    311 
    312 // Waits for the child in a death test to exit, returning its exit
    313 // status, or 0 if no child process exists.  As a side effect, sets the
    314 // outcome data member.
    315 int ForkingDeathTest::Wait() {
    316   if (!forked_)
    317     return 0;
    318 
    319   // The read() here blocks until data is available (signifying the
    320   // failure of the death test) or until the pipe is closed (signifying
    321   // its success), so it's okay to call this in the parent before
    322   // the child process has exited.
    323   char flag;
    324   ssize_t bytes_read;
    325 
    326   do {
    327     bytes_read = read(read_fd_, &flag, 1);
    328   } while (bytes_read == -1 && errno == EINTR);
    329 
    330   if (bytes_read == 0) {
    331     outcome_ = DIED;
    332   } else if (bytes_read == 1) {
    333     switch (flag) {
    334       case kDeathTestReturned:
    335         outcome_ = RETURNED;
    336         break;
    337       case kDeathTestLived:
    338         outcome_ = LIVED;
    339         break;
    340       case kDeathTestInternalError:
    341         FailFromInternalError(read_fd_);  // Does not return.
    342         break;
    343       default:
    344         GTEST_LOG(FATAL,
    345                   Message() << "Death test child process reported unexpected "
    346                   << "status byte (" << static_cast<unsigned int>(flag)
    347                   << ")");
    348     }
    349   } else {
    350     GTEST_LOG(FATAL,
    351               Message() << "Read from death test child process failed: "
    352               << strerror(errno));
    353   }
    354 
    355   GTEST_DEATH_TEST_CHECK_SYSCALL(close(read_fd_));
    356   GTEST_DEATH_TEST_CHECK_SYSCALL(waitpid(child_pid_, &status_, 0));
    357   return status_;
    358 }
    359 
    360 // Assesses the success or failure of a death test, using both private
    361 // members which have previously been set, and one argument:
    362 //
    363 // Private data members:
    364 //   outcome:  an enumeration describing how the death test
    365 //             concluded: DIED, LIVED, or RETURNED.  The death test fails
    366 //             in the latter two cases
    367 //   status:   the exit status of the child process, in the format
    368 //             specified by wait(2)
    369 //   regex:    a regular expression object to be applied to
    370 //             the test's captured standard error output; the death test
    371 //             fails if it does not match
    372 //
    373 // Argument:
    374 //   status_ok: true if exit_status is acceptable in the context of
    375 //              this particular death test, which fails if it is false
    376 //
    377 // Returns true iff all of the above conditions are met.  Otherwise, the
    378 // first failing condition, in the order given above, is the one that is
    379 // reported. Also sets the static variable last_death_test_message.
    380 bool ForkingDeathTest::Passed(bool status_ok) {
    381   if (!forked_)
    382     return false;
    383 
    384 #if GTEST_HAS_GLOBAL_STRING
    385   const ::string error_message = GetCapturedStderr();
    386 #else
    387   const ::std::string error_message = GetCapturedStderr();
    388 #endif  // GTEST_HAS_GLOBAL_STRING
    389 
    390   bool success = false;
    391   Message buffer;
    392 
    393   buffer << "Death test: " << statement_ << "\n";
    394   switch (outcome_) {
    395     case LIVED:
    396       buffer << "    Result: failed to die.\n"
    397              << " Error msg: " << error_message;
    398       break;
    399     case RETURNED:
    400       buffer << "    Result: illegal return in test statement.\n"
    401              << " Error msg: " << error_message;
    402       break;
    403     case DIED:
    404       if (status_ok) {
    405         if (RE::PartialMatch(error_message, *regex_)) {
    406           success = true;
    407         } else {
    408           buffer << "    Result: died but not with expected error.\n"
    409                  << "  Expected: " << regex_->pattern() << "\n"
    410                  << "Actual msg: " << error_message;
    411         }
    412       } else {
    413         buffer << "    Result: died but not with expected exit code:\n"
    414                << "            " << ExitSummary(status_) << "\n";
    415       }
    416       break;
    417     default:
    418       GTEST_LOG(FATAL,
    419                 "DeathTest::Passed somehow called before conclusion of test");
    420   }
    421 
    422   last_death_test_message = buffer.GetString();
    423   return success;
    424 }
    425 
    426 // Signals that the death test code which should have exited, didn't.
    427 // Should be called only in a death test child process.
    428 // Writes a status byte to the child's status file desriptor, then
    429 // calls _exit(1).
    430 void ForkingDeathTest::Abort(AbortReason reason) {
    431   // The parent process considers the death test to be a failure if
    432   // it finds any data in our pipe.  So, here we write a single flag byte
    433   // to the pipe, then exit.
    434   const char flag =
    435       reason == TEST_DID_NOT_DIE ? kDeathTestLived : kDeathTestReturned;
    436   GTEST_DEATH_TEST_CHECK_SYSCALL(write(write_fd_, &flag, 1));
    437   GTEST_DEATH_TEST_CHECK_SYSCALL(close(write_fd_));
    438   _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
    439 }
    440 
    441 // A concrete death test class that forks, then immediately runs the test
    442 // in the child process.
    443 class NoExecDeathTest : public ForkingDeathTest {
    444  public:
    445   NoExecDeathTest(const char* statement, const RE* regex) :
    446       ForkingDeathTest(statement, regex) { }
    447   virtual TestRole AssumeRole();
    448 };
    449 
    450 // The AssumeRole process for a fork-and-run death test.  It implements a
    451 // straightforward fork, with a simple pipe to transmit the status byte.
    452 DeathTest::TestRole NoExecDeathTest::AssumeRole() {
    453   const size_t thread_count = GetThreadCount();
    454   if (thread_count != 1) {
    455     GTEST_LOG(WARNING, DeathTestThreadWarning(thread_count));
    456   }
    457 
    458   int pipe_fd[2];
    459   GTEST_DEATH_TEST_CHECK(pipe(pipe_fd) != -1);
    460 
    461   last_death_test_message = "";
    462   CaptureStderr();
    463   // When we fork the process below, the log file buffers are copied, but the
    464   // file descriptors are shared.  We flush all log files here so that closing
    465   // the file descriptors in the child process doesn't throw off the
    466   // synchronization between descriptors and buffers in the parent process.
    467   // This is as close to the fork as possible to avoid a race condition in case
    468   // there are multiple threads running before the death test, and another
    469   // thread writes to the log file.
    470   FlushInfoLog();
    471 
    472   const pid_t child_pid = fork();
    473   GTEST_DEATH_TEST_CHECK(child_pid != -1);
    474   set_child_pid(child_pid);
    475   if (child_pid == 0) {
    476     GTEST_DEATH_TEST_CHECK_SYSCALL(close(pipe_fd[0]));
    477     set_write_fd(pipe_fd[1]);
    478     // Redirects all logging to stderr in the child process to prevent
    479     // concurrent writes to the log files.  We capture stderr in the parent
    480     // process and append the child process' output to a log.
    481     LogToStderr();
    482     return EXECUTE_TEST;
    483   } else {
    484     GTEST_DEATH_TEST_CHECK_SYSCALL(close(pipe_fd[1]));
    485     set_read_fd(pipe_fd[0]);
    486     set_forked(true);
    487     return OVERSEE_TEST;
    488   }
    489 }
    490 
    491 // A concrete death test class that forks and re-executes the main
    492 // program from the beginning, with command-line flags set that cause
    493 // only this specific death test to be run.
    494 class ExecDeathTest : public ForkingDeathTest {
    495  public:
    496   ExecDeathTest(const char* statement, const RE* regex,
    497                 const char* file, int line) :
    498       ForkingDeathTest(statement, regex), file_(file), line_(line) { }
    499   virtual TestRole AssumeRole();
    500  private:
    501   // The name of the file in which the death test is located.
    502   const char* const file_;
    503   // The line number on which the death test is located.
    504   const int line_;
    505 };
    506 
    507 // Utility class for accumulating command-line arguments.
    508 class Arguments {
    509  public:
    510   Arguments() {
    511     args_.push_back(NULL);
    512   }
    513   ~Arguments() {
    514     for (std::vector<char*>::iterator i = args_.begin();
    515          i + 1 != args_.end();
    516          ++i) {
    517       free(*i);
    518     }
    519   }
    520   void AddArgument(const char* argument) {
    521     args_.insert(args_.end() - 1, strdup(argument));
    522   }
    523 
    524   template <typename Str>
    525   void AddArguments(const ::std::vector<Str>& arguments) {
    526     for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
    527          i != arguments.end();
    528          ++i) {
    529       args_.insert(args_.end() - 1, strdup(i->c_str()));
    530     }
    531   }
    532   char* const* Argv() {
    533     return &args_[0];
    534   }
    535  private:
    536   std::vector<char*> args_;
    537 };
    538 
    539 // A struct that encompasses the arguments to the child process of a
    540 // threadsafe-style death test process.
    541 struct ExecDeathTestArgs {
    542   char* const* argv;  // Command-line arguments for the child's call to exec
    543   int close_fd;       // File descriptor to close; the read end of a pipe
    544 };
    545 
    546 // The main function for a threadsafe-style death test child process.
    547 static int ExecDeathTestChildMain(void* child_arg) {
    548   ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
    549   GTEST_DEATH_TEST_CHECK_SYSCALL(close(args->close_fd));
    550   execve(args->argv[0], args->argv, environ);
    551   DeathTestAbort("execve failed: %s", strerror(errno));
    552   return EXIT_FAILURE;
    553 }
    554 
    555 // Two utility routines that together determine the direction the stack
    556 // grows.
    557 // This could be accomplished more elegantly by a single recursive
    558 // function, but we want to guard against the unlikely possibility of
    559 // a smart compiler optimizing the recursion away.
    560 static bool StackLowerThanAddress(const void* ptr) {
    561   int dummy;
    562   return &dummy < ptr;
    563 }
    564 
    565 static bool StackGrowsDown() {
    566   int dummy;
    567   return StackLowerThanAddress(&dummy);
    568 }
    569 
    570 // A threadsafe implementation of fork(2) for threadsafe-style death tests
    571 // that uses clone(2).  It dies with an error message if anything goes
    572 // wrong.
    573 static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
    574   static const bool stack_grows_down = StackGrowsDown();
    575   const size_t stack_size = getpagesize();
    576   void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
    577                            MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    578   GTEST_DEATH_TEST_CHECK(stack != MAP_FAILED);
    579   void* const stack_top =
    580       static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);
    581   ExecDeathTestArgs args = { argv, close_fd };
    582   const pid_t child_pid = clone(&ExecDeathTestChildMain, stack_top,
    583                                 SIGCHLD, &args);
    584   GTEST_DEATH_TEST_CHECK(child_pid != -1);
    585   GTEST_DEATH_TEST_CHECK(munmap(stack, stack_size) != -1);
    586   return child_pid;
    587 }
    588 
    589 // The AssumeRole process for a fork-and-exec death test.  It re-executes the
    590 // main program from the beginning, setting the --gtest_filter
    591 // and --gtest_internal_run_death_test flags to cause only the current
    592 // death test to be re-run.
    593 DeathTest::TestRole ExecDeathTest::AssumeRole() {
    594   const UnitTestImpl* const impl = GetUnitTestImpl();
    595   const InternalRunDeathTestFlag* const flag =
    596       impl->internal_run_death_test_flag();
    597   const TestInfo* const info = impl->current_test_info();
    598   const int death_test_index = info->result()->death_test_count();
    599 
    600   if (flag != NULL) {
    601     set_write_fd(flag->status_fd);
    602     return EXECUTE_TEST;
    603   }
    604 
    605   int pipe_fd[2];
    606   GTEST_DEATH_TEST_CHECK(pipe(pipe_fd) != -1);
    607   // Clear the close-on-exec flag on the write end of the pipe, lest
    608   // it be closed when the child process does an exec:
    609   GTEST_DEATH_TEST_CHECK(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
    610 
    611   const String filter_flag =
    612       String::Format("--%s%s=%s.%s",
    613                      GTEST_FLAG_PREFIX, kFilterFlag,
    614                      info->test_case_name(), info->name());
    615   const String internal_flag =
    616       String::Format("--%s%s=%s:%d:%d:%d",
    617                      GTEST_FLAG_PREFIX, kInternalRunDeathTestFlag, file_, line_,
    618                      death_test_index, pipe_fd[1]);
    619   Arguments args;
    620   args.AddArguments(GetArgvs());
    621   args.AddArgument("--logtostderr");
    622   args.AddArgument(filter_flag.c_str());
    623   args.AddArgument(internal_flag.c_str());
    624 
    625   last_death_test_message = "";
    626 
    627   CaptureStderr();
    628   // See the comment in NoExecDeathTest::AssumeRole for why the next line
    629   // is necessary.
    630   FlushInfoLog();
    631 
    632   const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
    633   GTEST_DEATH_TEST_CHECK_SYSCALL(close(pipe_fd[1]));
    634   set_child_pid(child_pid);
    635   set_read_fd(pipe_fd[0]);
    636   set_forked(true);
    637   return OVERSEE_TEST;
    638 }
    639 
    640 // Creates a concrete DeathTest-derived class that depends on the
    641 // --gtest_death_test_style flag, and sets the pointer pointed to
    642 // by the "test" argument to its address.  If the test should be
    643 // skipped, sets that pointer to NULL.  Returns true, unless the
    644 // flag is set to an invalid value.
    645 bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
    646                                      const char* file, int line,
    647                                      DeathTest** test) {
    648   UnitTestImpl* const impl = GetUnitTestImpl();
    649   const InternalRunDeathTestFlag* const flag =
    650       impl->internal_run_death_test_flag();
    651   const int death_test_index = impl->current_test_info()
    652       ->increment_death_test_count();
    653 
    654   if (flag != NULL) {
    655     if (death_test_index > flag->index) {
    656       last_death_test_message = String::Format(
    657           "Death test count (%d) somehow exceeded expected maximum (%d)",
    658           death_test_index, flag->index);
    659       return false;
    660     }
    661 
    662     if (!(flag->file == file && flag->line == line &&
    663           flag->index == death_test_index)) {
    664       *test = NULL;
    665       return true;
    666     }
    667   }
    668 
    669   if (GTEST_FLAG(death_test_style) == "threadsafe") {
    670     *test = new ExecDeathTest(statement, regex, file, line);
    671   } else if (GTEST_FLAG(death_test_style) == "fast") {
    672     *test = new NoExecDeathTest(statement, regex);
    673   } else {
    674     last_death_test_message = String::Format(
    675         "Unknown death test style \"%s\" encountered",
    676         GTEST_FLAG(death_test_style).c_str());
    677     return false;
    678   }
    679 
    680   return true;
    681 }
    682 
    683 // Splits a given string on a given delimiter, populating a given
    684 // vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
    685 // ::std::string, so we can use it here.
    686 static void SplitString(const ::std::string& str, char delimiter,
    687                         ::std::vector< ::std::string>* dest) {
    688   ::std::vector< ::std::string> parsed;
    689   ::std::string::size_type pos = 0;
    690   while (true) {
    691     const ::std::string::size_type colon = str.find(delimiter, pos);
    692     if (colon == ::std::string::npos) {
    693       parsed.push_back(str.substr(pos));
    694       break;
    695     } else {
    696       parsed.push_back(str.substr(pos, colon - pos));
    697       pos = colon + 1;
    698     }
    699   }
    700   dest->swap(parsed);
    701 }
    702 
    703 // Attempts to parse a string into a positive integer.  Returns true
    704 // if that is possible.  GTEST_HAS_DEATH_TEST implies that we have
    705 // ::std::string, so we can use it here.
    706 static bool ParsePositiveInt(const ::std::string& str, int* number) {
    707   // Fail fast if the given string does not begin with a digit;
    708   // this bypasses strtol's "optional leading whitespace and plus
    709   // or minus sign" semantics, which are undesirable here.
    710   if (str.empty() || !isdigit(str[0])) {
    711     return false;
    712   }
    713   char* endptr;
    714   const long parsed = strtol(str.c_str(), &endptr, 10);  // NOLINT
    715   if (*endptr == '\0' && parsed <= INT_MAX) {
    716     *number = static_cast<int>(parsed);
    717     return true;
    718   } else {
    719     return false;
    720   }
    721 }
    722 
    723 // Returns a newly created InternalRunDeathTestFlag object with fields
    724 // initialized from the GTEST_FLAG(internal_run_death_test) flag if
    725 // the flag is specified; otherwise returns NULL.
    726 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
    727   if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
    728 
    729   InternalRunDeathTestFlag* const internal_run_death_test_flag =
    730       new InternalRunDeathTestFlag;
    731   // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
    732   // can use it here.
    733   ::std::vector< ::std::string> fields;
    734   SplitString(GTEST_FLAG(internal_run_death_test).c_str(), ':', &fields);
    735   if (fields.size() != 4
    736       || !ParsePositiveInt(fields[1], &internal_run_death_test_flag->line)
    737       || !ParsePositiveInt(fields[2], &internal_run_death_test_flag->index)
    738       || !ParsePositiveInt(fields[3],
    739                            &internal_run_death_test_flag->status_fd)) {
    740     DeathTestAbort("Bad --gtest_internal_run_death_test flag: %s",
    741                    GTEST_FLAG(internal_run_death_test).c_str());
    742   }
    743   internal_run_death_test_flag->file = fields[0].c_str();
    744   return internal_run_death_test_flag;
    745 }
    746 
    747 }  // namespace internal
    748 
    749 #endif  // GTEST_HAS_DEATH_TEST
    750 
    751 }  // namespace testing
    752