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