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