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