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