47 #ifdef GTEST_HAS_DEATH_TEST
50 #include <crt_externs.h>
51 #endif // GTEST_OS_MAC
59 #endif // GTEST_OS_LINUX
63 #ifdef GTEST_OS_WINDOWS
68 #endif // GTEST_OS_WINDOWS
72 #endif // GTEST_OS_QNX
74 #ifdef GTEST_OS_FUCHSIA
75 #include <lib/fdio/fd.h>
76 #include <lib/fdio/io.h>
77 #include <lib/fdio/spawn.h>
78 #include <lib/zx/channel.h>
79 #include <lib/zx/port.h>
80 #include <lib/zx/process.h>
81 #include <lib/zx/socket.h>
82 #include <zircon/processargs.h>
83 #include <zircon/syscalls.h>
84 #include <zircon/syscalls/policy.h>
85 #include <zircon/syscalls/port.h>
86 #endif // GTEST_OS_FUCHSIA
88 #endif // GTEST_HAS_DEATH_TEST
111 "Indicates how to run a death test in a forked child process: "
112 "\"threadsafe\" (child process re-executes the test binary "
113 "from the beginning, running only the specific death test) or "
114 "\"fast\" (child process runs the death test immediately "
120 "Instructs to use fork()/_Exit() instead of clone() in death tests. "
121 "Ignored and always uses fork() on POSIX systems where clone() is not "
122 "implemented. Useful when running under valgrind or similar tools if "
123 "those do not support clone(). Valgrind 3.3.1 will just fail if "
124 "it sees an unsupported combination of clone() flags. "
125 "It is not recommended to use this flag w/o valgrind though it will "
126 "work in 99% of the cases. Once valgrind is fixed, this flag will "
127 "most likely be removed.");
130 internal_run_death_test,
"",
131 "Indicates the file, line number, temporal index of "
132 "the single death test to run, and a file descriptor to "
133 "which a success code may be sent, all separated by "
134 "the '|' characters. This flag is specified if and only if the "
135 "current process is a sub-process launched for running a thread-safe "
136 "death test. FOR INTERNAL USE ONLY.");
140 #ifdef GTEST_HAS_DEATH_TEST
146 #if !defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_FUCHSIA)
147 static bool g_in_fast_death_test_child =
false;
155 bool InDeathTestChild() {
156 #if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_FUCHSIA)
167 return g_in_fast_death_test_child;
174 ExitedWithCode::ExitedWithCode(
int exit_code) : exit_code_(exit_code) {}
177 bool ExitedWithCode::operator()(
int exit_status)
const {
178 #if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_FUCHSIA)
180 return exit_status == exit_code_;
184 return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
186 #endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
189 #if !defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_FUCHSIA)
191 KilledBySignal::KilledBySignal(
int signum) : signum_(signum) {}
194 bool KilledBySignal::operator()(
int exit_status)
const {
195 #if defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)
198 if (GTEST_KILLED_BY_SIGNAL_OVERRIDE_(signum_, exit_status, &result)) {
202 #endif // defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)
203 return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
205 #endif // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
213 static std::string ExitSummary(
int exit_code) {
216 #if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_FUCHSIA)
218 m <<
"Exited with exit status " << exit_code;
222 if (WIFEXITED(exit_code)) {
223 m <<
"Exited with exit status " << WEXITSTATUS(exit_code);
224 }
else if (WIFSIGNALED(exit_code)) {
225 m <<
"Terminated by signal " << WTERMSIG(exit_code);
228 if (WCOREDUMP(exit_code)) {
229 m <<
" (core dumped)";
232 #endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
234 return m.GetString();
239 bool ExitedUnsuccessfully(
int exit_status) {
240 return !ExitedWithCode(0)(exit_status);
243 #if !defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_FUCHSIA)
248 static std::string DeathTestThreadWarning(
size_t thread_count) {
250 msg <<
"Death tests use fork(), which is unsafe particularly"
251 <<
" in a threaded context. For this test, " <<
GTEST_NAME_ <<
" ";
252 if (thread_count == 0) {
253 msg <<
"couldn't detect the number of threads.";
255 msg <<
"detected " << thread_count <<
" threads.";
258 "https://github.com/google/googletest/blob/main/docs/"
259 "advanced.md#death-tests-and-threads"
260 <<
" for more explanation and suggested solutions, especially if"
261 <<
" this is the last message you see before your test times out.";
262 return msg.GetString();
264 #endif // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
267 static const char kDeathTestLived =
'L';
268 static const char kDeathTestReturned =
'R';
269 static const char kDeathTestThrew =
'T';
270 static const char kDeathTestInternalError =
'I';
272 #ifdef GTEST_OS_FUCHSIA
275 static const int kFuchsiaReadPipeFd = 3;
286 enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
293 [[noreturn]]
static void DeathTestAbort(
const std::string& message) {
297 const InternalRunDeathTestFlag*
const flag =
299 if (flag !=
nullptr) {
301 fputc(kDeathTestInternalError, parent);
302 fprintf(parent,
"%s", message.c_str());
306 fprintf(stderr,
"%s", message.c_str());
314 #define GTEST_DEATH_TEST_CHECK_(expression) \
316 if (!::testing::internal::IsTrue(expression)) { \
317 DeathTestAbort(::std::string("CHECK failed: File ") + __FILE__ + \
319 ::testing::internal::StreamableToString(__LINE__) + \
320 ": " + #expression); \
322 } while (::testing::internal::AlwaysFalse())
331 #define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
335 gtest_retval = (expression); \
336 } while (gtest_retval == -1 && errno == EINTR); \
337 if (gtest_retval == -1) { \
338 DeathTestAbort(::std::string("CHECK failed: File ") + __FILE__ + \
340 ::testing::internal::StreamableToString(__LINE__) + \
341 ": " + #expression + " != -1"); \
343 } while (::testing::internal::AlwaysFalse())
346 std::string GetLastErrnoDescription() {
354 static void FailFromInternalError(
int fd) {
360 while ((num_read =
posix::Read(fd, buffer, 255)) > 0) {
361 buffer[num_read] =
'\0';
364 }
while (num_read == -1 && errno == EINTR);
369 const int last_error = errno;
370 GTEST_LOG_(FATAL) <<
"Error while reading death test internal: "
371 << GetLastErrnoDescription() <<
" [" << last_error <<
"]";
377 DeathTest::DeathTest() {
379 if (info ==
nullptr) {
381 "Cannot run a death test outside of a TEST or "
388 bool DeathTest::Create(
const char* statement,
389 Matcher<const std::string&> matcher,
const char* file,
390 int line, DeathTest** test) {
392 statement, std::move(matcher), file, line, test);
395 const char* DeathTest::LastMessage() {
396 return last_death_test_message_.c_str();
399 void DeathTest::set_last_death_test_message(
const std::string& message) {
400 last_death_test_message_ = message;
403 std::string DeathTest::last_death_test_message_;
406 class DeathTestImpl :
public DeathTest {
408 DeathTestImpl(
const char* a_statement, Matcher<const std::string&> matcher)
409 : statement_(a_statement),
410 matcher_(std::move(matcher)),
413 outcome_(IN_PROGRESS),
418 ~DeathTestImpl()
override { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
420 void Abort(AbortReason reason)
override;
421 bool Passed(
bool status_ok)
override;
423 const char* statement()
const {
return statement_; }
424 bool spawned()
const {
return spawned_; }
425 void set_spawned(
bool is_spawned) { spawned_ = is_spawned; }
426 int status()
const {
return status_; }
427 void set_status(
int a_status) { status_ = a_status; }
428 DeathTestOutcome outcome()
const {
return outcome_; }
429 void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
430 int read_fd()
const {
return read_fd_; }
431 void set_read_fd(
int fd) { read_fd_ = fd; }
432 int write_fd()
const {
return write_fd_; }
433 void set_write_fd(
int fd) { write_fd_ = fd; }
439 void ReadAndInterpretStatusByte();
442 virtual std::string GetErrorLogs();
447 const char*
const statement_;
449 Matcher<const std::string&> matcher_;
455 DeathTestOutcome outcome_;
470 void DeathTestImpl::ReadAndInterpretStatusByte() {
480 }
while (bytes_read == -1 && errno == EINTR);
482 if (bytes_read == 0) {
484 }
else if (bytes_read == 1) {
486 case kDeathTestReturned:
487 set_outcome(RETURNED);
489 case kDeathTestThrew:
492 case kDeathTestLived:
495 case kDeathTestInternalError:
496 FailFromInternalError(read_fd());
499 GTEST_LOG_(FATAL) <<
"Death test child process reported "
500 <<
"unexpected status byte ("
501 <<
static_cast<unsigned int>(flag) <<
")";
504 GTEST_LOG_(FATAL) <<
"Read from death test child process failed: "
505 << GetLastErrnoDescription();
507 GTEST_DEATH_TEST_CHECK_SYSCALL_(
posix::Close(read_fd()));
521 const char status_ch = reason == TEST_DID_NOT_DIE ? kDeathTestLived
522 : reason == TEST_THREW_EXCEPTION ? kDeathTestThrew
523 : kDeathTestReturned;
525 GTEST_DEATH_TEST_CHECK_SYSCALL_(
posix::Write(write_fd(), &status_ch, 1));
540 static ::std::string FormatDeathTestOutput(const ::std::string& output) {
542 for (
size_t at = 0;;) {
543 const size_t line_end = output.find(
'\n', at);
545 if (line_end == ::std::string::npos) {
546 ret += output.substr(at);
549 ret += output.substr(at, line_end + 1 - at);
576 bool DeathTestImpl::Passed(
bool status_ok) {
577 if (!spawned())
return false;
579 const std::string error_message = GetErrorLogs();
581 bool success =
false;
584 buffer <<
"Death test: " << statement() <<
"\n";
587 buffer <<
" Result: failed to die.\n"
589 << FormatDeathTestOutput(error_message);
592 buffer <<
" Result: threw an exception.\n"
594 << FormatDeathTestOutput(error_message);
597 buffer <<
" Result: illegal return in test statement.\n"
599 << FormatDeathTestOutput(error_message);
603 if (matcher_.Matches(error_message)) {
606 std::ostringstream stream;
607 matcher_.DescribeTo(&stream);
608 buffer <<
" Result: died but not with expected error.\n"
609 <<
" Expected: " << stream.str() <<
"\n"
611 << FormatDeathTestOutput(error_message);
614 buffer <<
" Result: died but not with expected exit code:\n"
615 <<
" " << ExitSummary(status()) <<
"\n"
617 << FormatDeathTestOutput(error_message);
623 <<
"DeathTest::Passed somehow called before conclusion of test";
626 DeathTest::set_last_death_test_message(buffer.GetString());
630 #ifndef GTEST_OS_WINDOWS
633 static std::vector<char*> CreateArgvFromArgs(std::vector<std::string>& args) {
634 std::vector<char*> result;
635 result.reserve(args.size() + 1);
636 for (
auto& arg : args) {
637 result.push_back(&arg[0]);
639 result.push_back(
nullptr);
644 #ifdef GTEST_OS_WINDOWS
673 class WindowsDeathTest :
public DeathTestImpl {
675 WindowsDeathTest(
const char* a_statement, Matcher<const std::string&> matcher,
676 const char* file,
int line)
677 : DeathTestImpl(a_statement, std::move(matcher)),
683 virtual TestRole AssumeRole();
687 const char*
const file_;
691 AutoHandle write_handle_;
693 AutoHandle child_handle_;
698 AutoHandle event_handle_;
704 int WindowsDeathTest::Wait() {
705 if (!spawned())
return 0;
709 const HANDLE wait_handles[2] = {child_handle_.Get(), event_handle_.Get()};
710 switch (::WaitForMultipleObjects(2, wait_handles,
714 case WAIT_OBJECT_0 + 1:
717 GTEST_DEATH_TEST_CHECK_(
false);
722 write_handle_.Reset();
723 event_handle_.Reset();
725 ReadAndInterpretStatusByte();
731 GTEST_DEATH_TEST_CHECK_(WAIT_OBJECT_0 ==
732 ::WaitForSingleObject(child_handle_.Get(), INFINITE));
734 GTEST_DEATH_TEST_CHECK_(
735 ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
736 child_handle_.Reset();
737 set_status(static_cast<int>(status_code));
746 DeathTest::TestRole WindowsDeathTest::AssumeRole() {
748 const InternalRunDeathTestFlag*
const flag =
749 impl->internal_run_death_test_flag();
750 const TestInfo*
const info = impl->current_test_info();
751 const int death_test_index = info->result()->death_test_count();
753 if (flag !=
nullptr) {
756 set_write_fd(flag->write_fd());
762 SECURITY_ATTRIBUTES handles_are_inheritable = {
sizeof(SECURITY_ATTRIBUTES),
764 HANDLE read_handle, write_handle;
765 GTEST_DEATH_TEST_CHECK_(::CreatePipe(&read_handle, &write_handle,
766 &handles_are_inheritable,
770 ::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle), O_RDONLY));
771 write_handle_.Reset(write_handle);
772 event_handle_.Reset(::CreateEvent(
773 &handles_are_inheritable,
777 GTEST_DEATH_TEST_CHECK_(event_handle_.Get() !=
nullptr);
779 "filter=" + info->test_suite_name() +
"." +
781 const std::string internal_flag =
792 char executable_path[_MAX_PATH + 1];
793 GTEST_DEATH_TEST_CHECK_(_MAX_PATH + 1 != ::GetModuleFileNameA(
nullptr,
797 std::string command_line = std::string(::GetCommandLineA()) +
" " +
798 filter_flag +
" \"" + internal_flag +
"\"";
800 DeathTest::set_last_death_test_message(
"");
807 STARTUPINFOA startup_info;
808 memset(&startup_info, 0,
sizeof(STARTUPINFO));
809 startup_info.dwFlags = STARTF_USESTDHANDLES;
810 startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
811 startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
812 startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
814 PROCESS_INFORMATION process_info;
815 GTEST_DEATH_TEST_CHECK_(
817 executable_path, const_cast<char*>(command_line.c_str()),
823 UnitTest::GetInstance()->original_working_dir(), &startup_info,
824 &process_info) != FALSE);
825 child_handle_.Reset(process_info.hProcess);
826 ::CloseHandle(process_info.hThread);
831 #elif defined(GTEST_OS_FUCHSIA)
833 class FuchsiaDeathTest :
public DeathTestImpl {
835 FuchsiaDeathTest(
const char* a_statement, Matcher<const std::string&> matcher,
836 const char* file,
int line)
837 : DeathTestImpl(a_statement, std::move(matcher)),
843 TestRole AssumeRole()
override;
844 std::string GetErrorLogs()
override;
848 const char*
const file_;
852 std::string captured_stderr_;
854 zx::process child_process_;
855 zx::channel exception_channel_;
856 zx::socket stderr_socket_;
862 int FuchsiaDeathTest::Wait() {
863 const int kProcessKey = 0;
864 const int kSocketKey = 1;
865 const int kExceptionKey = 2;
867 if (!spawned())
return 0;
870 zx_status_t status_zx;
872 status_zx = zx::port::create(0, &port);
873 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
877 child_process_.wait_async(port, kProcessKey, ZX_PROCESS_TERMINATED, 0);
878 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
881 status_zx = stderr_socket_.wait_async(
882 port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, 0);
883 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
886 status_zx = exception_channel_.wait_async(port, kExceptionKey,
887 ZX_CHANNEL_READABLE, 0);
888 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
890 bool process_terminated =
false;
891 bool socket_closed =
false;
893 zx_port_packet_t packet = {};
894 status_zx = port.wait(zx::time::infinite(), &packet);
895 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
897 if (packet.key == kExceptionKey) {
901 status_zx = child_process_.kill();
902 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
903 }
else if (packet.key == kProcessKey) {
905 GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));
906 GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);
907 process_terminated =
true;
908 }
else if (packet.key == kSocketKey) {
909 GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));
910 if (packet.signal.observed & ZX_SOCKET_READABLE) {
912 constexpr
size_t kBufferSize = 1024;
914 size_t old_length = captured_stderr_.length();
915 size_t bytes_read = 0;
916 captured_stderr_.resize(old_length + kBufferSize);
918 stderr_socket_.read(0, &captured_stderr_.front() + old_length,
919 kBufferSize, &bytes_read);
920 captured_stderr_.resize(old_length + bytes_read);
921 }
while (status_zx == ZX_OK);
922 if (status_zx == ZX_ERR_PEER_CLOSED) {
923 socket_closed =
true;
925 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_ERR_SHOULD_WAIT);
926 status_zx = stderr_socket_.wait_async(
927 port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, 0);
928 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
931 GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_SOCKET_PEER_CLOSED);
932 socket_closed =
true;
935 }
while (!process_terminated && !socket_closed);
937 ReadAndInterpretStatusByte();
939 zx_info_process_t buffer;
940 status_zx = child_process_.get_info(ZX_INFO_PROCESS, &buffer,
sizeof(buffer),
942 GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
944 GTEST_DEATH_TEST_CHECK_(buffer.flags & ZX_INFO_PROCESS_FLAG_EXITED);
945 set_status(static_cast<int>(buffer.return_code));
954 DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
956 const InternalRunDeathTestFlag*
const flag =
957 impl->internal_run_death_test_flag();
958 const TestInfo*
const info = impl->current_test_info();
959 const int death_test_index = info->result()->death_test_count();
961 if (flag !=
nullptr) {
964 set_write_fd(kFuchsiaReadPipeFd);
973 "filter=" + info->test_suite_name() +
"." +
980 std::vector<std::string> args = GetInjectableArgvs();
981 args.push_back(filter_flag);
982 args.push_back(internal_flag);
986 zx_handle_t child_pipe_handle;
988 status = fdio_pipe_half(&child_pipe_fd, &child_pipe_handle);
989 GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
990 set_read_fd(child_pipe_fd);
993 fdio_spawn_action_t spawn_actions[2] = {};
994 fdio_spawn_action_t* add_handle_action = &spawn_actions[0];
995 add_handle_action->action = FDIO_SPAWN_ACTION_ADD_HANDLE;
996 add_handle_action->h.id = PA_HND(PA_FD, kFuchsiaReadPipeFd);
997 add_handle_action->h.handle = child_pipe_handle;
1000 zx::socket stderr_producer_socket;
1001 status = zx::socket::create(0, &stderr_producer_socket, &stderr_socket_);
1002 GTEST_DEATH_TEST_CHECK_(status >= 0);
1003 int stderr_producer_fd = -1;
1005 fdio_fd_create(stderr_producer_socket.release(), &stderr_producer_fd);
1006 GTEST_DEATH_TEST_CHECK_(status >= 0);
1009 GTEST_DEATH_TEST_CHECK_(fcntl(stderr_producer_fd, F_SETFL, 0) == 0);
1011 fdio_spawn_action_t* add_stderr_action = &spawn_actions[1];
1012 add_stderr_action->action = FDIO_SPAWN_ACTION_CLONE_FD;
1013 add_stderr_action->fd.local_fd = stderr_producer_fd;
1014 add_stderr_action->fd.target_fd = STDERR_FILENO;
1017 zx_handle_t child_job = ZX_HANDLE_INVALID;
1018 status = zx_job_create(zx_job_default(), 0, &child_job);
1019 GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
1020 zx_policy_basic_t policy;
1021 policy.condition = ZX_POL_NEW_ANY;
1022 policy.policy = ZX_POL_ACTION_ALLOW;
1023 status = zx_job_set_policy(child_job, ZX_JOB_POL_RELATIVE, ZX_JOB_POL_BASIC,
1025 GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
1029 status = zx_task_create_exception_channel(
1030 child_job, 0, exception_channel_.reset_and_get_address());
1031 GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
1039 std::vector<char*> argv = CreateArgvFromArgs(args);
1040 status = fdio_spawn_etc(child_job, FDIO_SPAWN_CLONE_ALL, argv[0], argv.data(),
1041 nullptr, 2, spawn_actions,
1042 child_process_.reset_and_get_address(),
nullptr);
1043 GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
1046 return OVERSEE_TEST;
1049 std::string FuchsiaDeathTest::GetErrorLogs() {
return captured_stderr_; }
1051 #else // We are neither on Windows, nor on Fuchsia.
1056 class ForkingDeathTest :
public DeathTestImpl {
1058 ForkingDeathTest(
const char* statement, Matcher<const std::string&> matcher);
1061 int Wait()
override;
1064 void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
1072 ForkingDeathTest::ForkingDeathTest(
const char* a_statement,
1073 Matcher<const std::string&> matcher)
1074 : DeathTestImpl(a_statement, std::move(matcher)), child_pid_(-1) {}
1079 int ForkingDeathTest::Wait() {
1080 if (!spawned())
return 0;
1082 ReadAndInterpretStatusByte();
1085 GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
1086 set_status(status_value);
1087 return status_value;
1092 class NoExecDeathTest :
public ForkingDeathTest {
1094 NoExecDeathTest(
const char* a_statement, Matcher<const std::string&> matcher)
1095 : ForkingDeathTest(a_statement, std::move(matcher)) {}
1096 TestRole AssumeRole()
override;
1101 DeathTest::TestRole NoExecDeathTest::AssumeRole() {
1103 if (thread_count != 1) {
1104 GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
1108 GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
1110 DeathTest::set_last_death_test_message(
"");
1121 const pid_t child_pid = fork();
1122 GTEST_DEATH_TEST_CHECK_(child_pid != -1);
1123 set_child_pid(child_pid);
1124 if (child_pid == 0) {
1125 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
1126 set_write_fd(pipe_fd[1]);
1134 g_in_fast_death_test_child =
true;
1135 return EXECUTE_TEST;
1137 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
1138 set_read_fd(pipe_fd[0]);
1140 return OVERSEE_TEST;
1147 class ExecDeathTest :
public ForkingDeathTest {
1149 ExecDeathTest(
const char* a_statement, Matcher<const std::string&> matcher,
1150 const char* file,
int line)
1151 : ForkingDeathTest(a_statement, std::move(matcher)),
1154 TestRole AssumeRole()
override;
1157 static ::std::vector<std::string> GetArgvsForDeathTestChildProcess() {
1158 ::std::vector<std::string> args = GetInjectableArgvs();
1159 #if defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)
1160 ::std::vector<std::string> extra_args =
1161 GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_();
1162 args.insert(args.end(), extra_args.begin(), extra_args.end());
1163 #endif // defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)
1167 const char*
const file_;
1174 struct ExecDeathTestArgs {
1180 extern "C" char** environ;
1181 #else // GTEST_OS_QNX
1185 static int ExecDeathTestChildMain(
void* child_arg) {
1186 ExecDeathTestArgs*
const args =
static_cast<ExecDeathTestArgs*
>(child_arg);
1187 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
1192 const char*
const original_dir =
1193 UnitTest::GetInstance()->original_working_dir();
1195 if (chdir(original_dir) != 0) {
1196 DeathTestAbort(std::string(
"chdir(\"") + original_dir +
1197 "\") failed: " + GetLastErrnoDescription());
1198 return EXIT_FAILURE;
1206 execv(args->argv[0], args->argv);
1207 DeathTestAbort(std::string(
"execv(") + args->argv[0] +
", ...) in " +
1208 original_dir +
" failed: " + GetLastErrnoDescription());
1209 return EXIT_FAILURE;
1211 #endif // GTEST_OS_QNX
1223 static void StackLowerThanAddress(
const void* ptr,
1233 static void StackLowerThanAddress(
const void* ptr,
bool* result) {
1235 *result = std::less<const void*>()(&dummy, ptr);
1241 static bool StackGrowsDown() {
1244 StackLowerThanAddress(&dummy, &result);
1247 #endif // GTEST_HAS_CLONE
1256 static pid_t ExecDeathTestSpawnChild(
char*
const* argv,
int close_fd) {
1257 ExecDeathTestArgs args = {argv, close_fd};
1258 pid_t child_pid = -1;
1263 const int cwd_fd = open(
".", O_RDONLY);
1264 GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
1265 GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
1269 const char*
const original_dir =
1270 UnitTest::GetInstance()->original_working_dir();
1272 if (chdir(original_dir) != 0) {
1273 DeathTestAbort(std::string(
"chdir(\"") + original_dir +
1274 "\") failed: " + GetLastErrnoDescription());
1275 return EXIT_FAILURE;
1280 GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
1281 GTEST_DEATH_TEST_CHECK_SYSCALL_(
1282 fcntl(close_fd, F_SETFD, fd_flags | FD_CLOEXEC));
1283 struct inheritance inherit = {0};
1285 child_pid = spawn(args.argv[0], 0,
nullptr, &inherit, args.argv, environ);
1287 GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
1288 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
1290 #else // GTEST_OS_QNX
1291 #ifdef GTEST_OS_LINUX
1295 struct sigaction saved_sigprof_action;
1296 struct sigaction ignore_sigprof_action;
1297 memset(&ignore_sigprof_action, 0,
sizeof(ignore_sigprof_action));
1298 sigemptyset(&ignore_sigprof_action.sa_mask);
1299 ignore_sigprof_action.sa_handler = SIG_IGN;
1300 GTEST_DEATH_TEST_CHECK_SYSCALL_(
1301 sigaction(SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
1302 #endif // GTEST_OS_LINUX
1308 static const bool stack_grows_down = StackGrowsDown();
1309 const auto stack_size =
static_cast<size_t>(getpagesize() * 2);
1311 void*
const stack = mmap(
nullptr, stack_size, PROT_READ | PROT_WRITE,
1312 MAP_ANON | MAP_PRIVATE, -1, 0);
1313 GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
1321 const size_t kMaxStackAlignment = 64;
1322 void*
const stack_top =
1323 static_cast<char*
>(stack) +
1324 (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
1325 GTEST_DEATH_TEST_CHECK_(
1326 static_cast<size_t>(stack_size) > kMaxStackAlignment &&
1327 reinterpret_cast<uintptr_t>(stack_top) % kMaxStackAlignment == 0);
1329 child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
1331 GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
1334 const bool use_fork =
true;
1335 #endif // GTEST_HAS_CLONE
1337 if (use_fork && (child_pid = fork()) == 0) {
1338 _Exit(ExecDeathTestChildMain(&args));
1340 #endif // GTEST_OS_QNX
1341 #ifdef GTEST_OS_LINUX
1342 GTEST_DEATH_TEST_CHECK_SYSCALL_(
1343 sigaction(SIGPROF, &saved_sigprof_action,
nullptr));
1344 #endif // GTEST_OS_LINUX
1346 GTEST_DEATH_TEST_CHECK_(child_pid != -1);
1354 DeathTest::TestRole ExecDeathTest::AssumeRole() {
1356 const InternalRunDeathTestFlag*
const flag =
1357 impl->internal_run_death_test_flag();
1358 const TestInfo*
const info = impl->current_test_info();
1359 const int death_test_index = info->result()->death_test_count();
1361 if (flag !=
nullptr) {
1362 set_write_fd(flag->write_fd());
1363 return EXECUTE_TEST;
1367 GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
1370 GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
1373 "filter=" + info->test_suite_name() +
"." +
1376 "internal_run_death_test=" + file_ +
"|" +
1380 std::vector<std::string> args = GetArgvsForDeathTestChildProcess();
1381 args.push_back(filter_flag);
1382 args.push_back(internal_flag);
1384 DeathTest::set_last_death_test_message(
"");
1391 std::vector<char*> argv = CreateArgvFromArgs(args);
1392 const pid_t child_pid = ExecDeathTestSpawnChild(argv.data(), pipe_fd[0]);
1393 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
1394 set_child_pid(child_pid);
1395 set_read_fd(pipe_fd[0]);
1397 return OVERSEE_TEST;
1400 #endif // !GTEST_OS_WINDOWS
1407 bool DefaultDeathTestFactory::Create(
const char* statement,
1408 Matcher<const std::string&> matcher,
1409 const char* file,
int line,
1412 const InternalRunDeathTestFlag*
const flag =
1413 impl->internal_run_death_test_flag();
1414 const int death_test_index =
1415 impl->current_test_info()->increment_death_test_count();
1417 if (flag !=
nullptr) {
1418 if (death_test_index > flag->index()) {
1419 DeathTest::set_last_death_test_message(
1421 ") somehow exceeded expected maximum (" +
1426 if (!(flag->file() == file && flag->line() == line &&
1427 flag->index() == death_test_index)) {
1433 #ifdef GTEST_OS_WINDOWS
1437 *test =
new WindowsDeathTest(statement, std::move(matcher), file, line);
1440 #elif defined(GTEST_OS_FUCHSIA)
1444 *test =
new FuchsiaDeathTest(statement, std::move(matcher), file, line);
1450 *test =
new ExecDeathTest(statement, std::move(matcher), file, line);
1452 *test =
new NoExecDeathTest(statement, std::move(matcher));
1455 #endif // GTEST_OS_WINDOWS
1458 DeathTest::set_last_death_test_message(
"Unknown death test style \"" +
1467 #ifdef GTEST_OS_WINDOWS
1471 static int GetStatusFileDescriptor(
unsigned int parent_process_id,
1472 size_t write_handle_as_size_t,
1473 size_t event_handle_as_size_t) {
1474 AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
1476 parent_process_id));
1477 if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
1478 DeathTestAbort(
"Unable to open parent process " +
1484 const HANDLE write_handle =
reinterpret_cast<HANDLE
>(write_handle_as_size_t);
1485 HANDLE dup_write_handle;
1490 if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
1491 ::GetCurrentProcess(), &dup_write_handle,
1495 DUPLICATE_SAME_ACCESS)) {
1496 DeathTestAbort(
"Unable to duplicate the pipe handle " +
1498 " from the parent process " +
1502 const HANDLE event_handle =
reinterpret_cast<HANDLE
>(event_handle_as_size_t);
1503 HANDLE dup_event_handle;
1505 if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
1506 ::GetCurrentProcess(), &dup_event_handle, 0x0, FALSE,
1507 DUPLICATE_SAME_ACCESS)) {
1508 DeathTestAbort(
"Unable to duplicate the event handle " +
1510 " from the parent process " +
1514 const int write_fd =
1515 ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
1516 if (write_fd == -1) {
1517 DeathTestAbort(
"Unable to convert pipe handle " +
1519 " to a file descriptor");
1524 ::SetEvent(dup_event_handle);
1528 #endif // GTEST_OS_WINDOWS
1533 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
1534 if (
GTEST_FLAG_GET(internal_run_death_test).empty())
return nullptr;
1540 ::std::vector< ::std::string> fields;
1544 #ifdef GTEST_OS_WINDOWS
1546 unsigned int parent_process_id = 0;
1547 size_t write_handle_as_size_t = 0;
1548 size_t event_handle_as_size_t = 0;
1550 if (fields.size() != 6 || !ParseNaturalNumber(fields[1], &line) ||
1551 !ParseNaturalNumber(fields[2], &index) ||
1552 !ParseNaturalNumber(fields[3], &parent_process_id) ||
1553 !ParseNaturalNumber(fields[4], &write_handle_as_size_t) ||
1554 !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
1555 DeathTestAbort(
"Bad --gtest_internal_run_death_test flag: " +
1558 write_fd = GetStatusFileDescriptor(parent_process_id, write_handle_as_size_t,
1559 event_handle_as_size_t);
1561 #elif defined(GTEST_OS_FUCHSIA)
1563 if (fields.size() != 3 || !ParseNaturalNumber(fields[1], &line) ||
1564 !ParseNaturalNumber(fields[2], &index)) {
1565 DeathTestAbort(
"Bad --gtest_internal_run_death_test flag: " +
1571 if (fields.size() != 4 || !ParseNaturalNumber(fields[1], &line) ||
1572 !ParseNaturalNumber(fields[2], &index) ||
1573 !ParseNaturalNumber(fields[3], &write_fd)) {
1574 DeathTestAbort(
"Bad --gtest_internal_run_death_test flag: " +
1578 #endif // GTEST_OS_WINDOWS
1580 return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
1585 #endif // GTEST_HAS_DEATH_TEST
class UnitTestImpl * GetUnitTestImpl()
GTEST_API_ std::string GetCapturedStderr()
static const char kDefaultDeathTestStyle[]
const char * StringFromGTestEnv(const char *flag, const char *default_val)
#define GTEST_LOG_(severity)
GTEST_API_ size_t GetThreadCount()
#define GTEST_DEFINE_bool_(name, default_val, doc)
void SuppressEventForwarding(bool)
const char kInternalRunDeathTestFlag[]
#define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
std::string StreamableToString(const T &streamable)
void SplitString(const ::std::string &str, char delimiter,::std::vector<::std::string > *dest)
int Write(int fd, const void *buf, unsigned int count)
#define GTEST_DEFAULT_DEATH_TEST_STYLE
#define GTEST_CHECK_(condition)
int Read(int fd, void *buf, unsigned int count)
#define GTEST_FLAG_GET(name)
bool BoolFromGTestEnv(const char *flag, bool default_val)
TestEventListeners * listeners()
GTEST_API_ void CaptureStderr()
#define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
FILE * FDOpen(int fd, const char *mode)
const char * StrError(int errnum)
#define GTEST_DEFINE_string_(name, default_val, doc)
TestInfo * current_test_info()
#define GTEST_FLAG_PREFIX_