gtest-death-test.cc
Go to the documentation of this file.
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@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)
31 //
32 // This file implements death tests.
33 
34 #include "gtest/gtest-death-test.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"
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 exists to
72 // prevent the accidental inclusion of gtest-internal-inl.h in the
73 // user's 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 
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 
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 {
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@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 =
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.
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.
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 =
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 // Make sure AddressSanitizer does not tamper with the stack here.
990 bool StackGrowsDown() {
991  int dummy;
992  bool result;
993  StackLowerThanAddress(&dummy, &result);
994  return result;
995 }
996 
997 // Spawns a child process with the same executable as the current process in
998 // a thread-safe manner and instructs it to run the death test. The
999 // implementation uses fork(2) + exec. On systems where clone(2) is
1000 // available, it is used instead, being slightly more thread-safe. On QNX,
1001 // fork supports only single-threaded environments, so this function uses
1002 // spawn(2) there instead. The function dies with an error message if
1003 // anything goes wrong.
1004 static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
1005  ExecDeathTestArgs args = { argv, close_fd };
1006  pid_t child_pid = -1;
1007 
1008 # if GTEST_OS_QNX
1009  // Obtains the current directory and sets it to be closed in the child
1010  // process.
1011  const int cwd_fd = open(".", O_RDONLY);
1012  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
1013  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
1014  // We need to execute the test program in the same environment where
1015  // it was originally invoked. Therefore we change to the original
1016  // working directory first.
1017  const char* const original_dir =
1019  // We can safely call chdir() as it's a direct system call.
1020  if (chdir(original_dir) != 0) {
1021  DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
1022  GetLastErrnoDescription());
1023  return EXIT_FAILURE;
1024  }
1025 
1026  int fd_flags;
1027  // Set close_fd to be closed after spawn.
1028  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
1029  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
1030  fd_flags | FD_CLOEXEC));
1031  struct inheritance inherit = {0};
1032  // spawn is a system call.
1033  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
1034  // Restores the current working directory.
1035  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
1036  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
1037 
1038 # else // GTEST_OS_QNX
1039 # if GTEST_OS_LINUX
1040  // When a SIGPROF signal is received while fork() or clone() are executing,
1041  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
1042  // it after the call to fork()/clone() is complete.
1043  struct sigaction saved_sigprof_action;
1044  struct sigaction ignore_sigprof_action;
1045  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
1046  sigemptyset(&ignore_sigprof_action.sa_mask);
1047  ignore_sigprof_action.sa_handler = SIG_IGN;
1048  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
1049  SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
1050 # endif // GTEST_OS_LINUX
1051 
1052 # if GTEST_HAS_CLONE
1053  const bool use_fork = GTEST_FLAG(death_test_use_fork);
1054 
1055  if (!use_fork) {
1056  static const bool stack_grows_down = StackGrowsDown();
1057  const size_t stack_size = getpagesize();
1058  // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
1059  void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
1060  MAP_ANON | MAP_PRIVATE, -1, 0);
1061  GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
1062 
1063  // Maximum stack alignment in bytes: For a downward-growing stack, this
1064  // amount is subtracted from size of the stack space to get an address
1065  // that is within the stack space and is aligned on all systems we care
1066  // about. As far as I know there is no ABI with stack alignment greater
1067  // than 64. We assume stack and stack_size already have alignment of
1068  // kMaxStackAlignment.
1069  const size_t kMaxStackAlignment = 64;
1070  void* const stack_top =
1071  static_cast<char*>(stack) +
1072  (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
1073  GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
1074  reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
1075 
1076  child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
1077 
1078  GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
1079  }
1080 # else
1081  const bool use_fork = true;
1082 # endif // GTEST_HAS_CLONE
1083 
1084  if (use_fork && (child_pid = fork()) == 0) {
1085  ExecDeathTestChildMain(&args);
1086  _exit(0);
1087  }
1088 # endif // GTEST_OS_QNX
1089 # if GTEST_OS_LINUX
1090  GTEST_DEATH_TEST_CHECK_SYSCALL_(
1091  sigaction(SIGPROF, &saved_sigprof_action, NULL));
1092 # endif // GTEST_OS_LINUX
1093 
1094  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
1095  return child_pid;
1096 }
1097 
1098 // The AssumeRole process for a fork-and-exec death test. It re-executes the
1099 // main program from the beginning, setting the --gtest_filter
1100 // and --gtest_internal_run_death_test flags to cause only the current
1101 // death test to be re-run.
1102 DeathTest::TestRole ExecDeathTest::AssumeRole() {
1103  const UnitTestImpl* const impl = GetUnitTestImpl();
1104  const InternalRunDeathTestFlag* const flag =
1105  impl->internal_run_death_test_flag();
1106  const TestInfo* const info = impl->current_test_info();
1107  const int death_test_index = info->result()->death_test_count();
1108 
1109  if (flag != NULL) {
1110  set_write_fd(flag->write_fd());
1111  return EXECUTE_TEST;
1112  }
1113 
1114  int pipe_fd[2];
1115  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
1116  // Clear the close-on-exec flag on the write end of the pipe, lest
1117  // it be closed when the child process does an exec:
1118  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
1119 
1120  const std::string filter_flag =
1122  + info->test_case_name() + "." + info->name();
1123  const std::string internal_flag =
1125  + file_ + "|" + StreamableToString(line_) + "|"
1126  + StreamableToString(death_test_index) + "|"
1127  + StreamableToString(pipe_fd[1]);
1128  Arguments args;
1129  args.AddArguments(GetArgvsForDeathTestChildProcess());
1130  args.AddArgument(filter_flag.c_str());
1131  args.AddArgument(internal_flag.c_str());
1132 
1133  DeathTest::set_last_death_test_message("");
1134 
1135  CaptureStderr();
1136  // See the comment in NoExecDeathTest::AssumeRole for why the next line
1137  // is necessary.
1138  FlushInfoLog();
1139 
1140  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
1141  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
1142  set_child_pid(child_pid);
1143  set_read_fd(pipe_fd[0]);
1144  set_spawned(true);
1145  return OVERSEE_TEST;
1146 }
1147 
1148 # endif // !GTEST_OS_WINDOWS
1149 
1150 // Creates a concrete DeathTest-derived class that depends on the
1151 // --gtest_death_test_style flag, and sets the pointer pointed to
1152 // by the "test" argument to its address. If the test should be
1153 // skipped, sets that pointer to NULL. Returns true, unless the
1154 // flag is set to an invalid value.
1155 bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
1156  const char* file, int line,
1157  DeathTest** test) {
1158  UnitTestImpl* const impl = GetUnitTestImpl();
1159  const InternalRunDeathTestFlag* const flag =
1160  impl->internal_run_death_test_flag();
1161  const int death_test_index = impl->current_test_info()
1162  ->increment_death_test_count();
1163 
1164  if (flag != NULL) {
1165  if (death_test_index > flag->index()) {
1166  DeathTest::set_last_death_test_message(
1167  "Death test count (" + StreamableToString(death_test_index)
1168  + ") somehow exceeded expected maximum ("
1169  + StreamableToString(flag->index()) + ")");
1170  return false;
1171  }
1172 
1173  if (!(flag->file() == file && flag->line() == line &&
1174  flag->index() == death_test_index)) {
1175  *test = NULL;
1176  return true;
1177  }
1178  }
1179 
1180 # if GTEST_OS_WINDOWS
1181 
1182  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
1183  GTEST_FLAG(death_test_style) == "fast") {
1184  *test = new WindowsDeathTest(statement, regex, file, line);
1185  }
1186 
1187 # else
1188 
1189  if (GTEST_FLAG(death_test_style) == "threadsafe") {
1190  *test = new ExecDeathTest(statement, regex, file, line);
1191  } else if (GTEST_FLAG(death_test_style) == "fast") {
1192  *test = new NoExecDeathTest(statement, regex);
1193  }
1194 
1195 # endif // GTEST_OS_WINDOWS
1196 
1197  else { // NOLINT - this is more readable than unbalanced brackets inside #if.
1198  DeathTest::set_last_death_test_message(
1199  "Unknown death test style \"" + GTEST_FLAG(death_test_style)
1200  + "\" encountered");
1201  return false;
1202  }
1203 
1204  return true;
1205 }
1206 
1207 // Splits a given string on a given delimiter, populating a given
1208 // vector with the fields. GTEST_HAS_DEATH_TEST implies that we have
1209 // ::std::string, so we can use it here.
1210 static void SplitString(const ::std::string& str, char delimiter,
1211  ::std::vector< ::std::string>* dest) {
1212  ::std::vector< ::std::string> parsed;
1213  ::std::string::size_type pos = 0;
1214  while (::testing::internal::AlwaysTrue()) {
1215  const ::std::string::size_type colon = str.find(delimiter, pos);
1216  if (colon == ::std::string::npos) {
1217  parsed.push_back(str.substr(pos));
1218  break;
1219  } else {
1220  parsed.push_back(str.substr(pos, colon - pos));
1221  pos = colon + 1;
1222  }
1223  }
1224  dest->swap(parsed);
1225 }
1226 
1227 # if GTEST_OS_WINDOWS
1228 // Recreates the pipe and event handles from the provided parameters,
1229 // signals the event, and returns a file descriptor wrapped around the pipe
1230 // handle. This function is called in the child process only.
1231 int GetStatusFileDescriptor(unsigned int parent_process_id,
1232  size_t write_handle_as_size_t,
1233  size_t event_handle_as_size_t) {
1234  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
1235  FALSE, // Non-inheritable.
1236  parent_process_id));
1237  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
1238  DeathTestAbort("Unable to open parent process " +
1239  StreamableToString(parent_process_id));
1240  }
1241 
1242  // TODO(vladl@google.com): Replace the following check with a
1243  // compile-time assertion when available.
1244  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
1245 
1246  const HANDLE write_handle =
1247  reinterpret_cast<HANDLE>(write_handle_as_size_t);
1248  HANDLE dup_write_handle;
1249 
1250  // The newly initialized handle is accessible only in in the parent
1251  // process. To obtain one accessible within the child, we need to use
1252  // DuplicateHandle.
1253  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
1254  ::GetCurrentProcess(), &dup_write_handle,
1255  0x0, // Requested privileges ignored since
1256  // DUPLICATE_SAME_ACCESS is used.
1257  FALSE, // Request non-inheritable handler.
1258  DUPLICATE_SAME_ACCESS)) {
1259  DeathTestAbort("Unable to duplicate the pipe handle " +
1260  StreamableToString(write_handle_as_size_t) +
1261  " from the parent process " +
1262  StreamableToString(parent_process_id));
1263  }
1264 
1265  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
1266  HANDLE dup_event_handle;
1267 
1268  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
1269  ::GetCurrentProcess(), &dup_event_handle,
1270  0x0,
1271  FALSE,
1272  DUPLICATE_SAME_ACCESS)) {
1273  DeathTestAbort("Unable to duplicate the event handle " +
1274  StreamableToString(event_handle_as_size_t) +
1275  " from the parent process " +
1276  StreamableToString(parent_process_id));
1277  }
1278 
1279  const int write_fd =
1280  ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
1281  if (write_fd == -1) {
1282  DeathTestAbort("Unable to convert pipe handle " +
1283  StreamableToString(write_handle_as_size_t) +
1284  " to a file descriptor");
1285  }
1286 
1287  // Signals the parent that the write end of the pipe has been acquired
1288  // so the parent can release its own write end.
1289  ::SetEvent(dup_event_handle);
1290 
1291  return write_fd;
1292 }
1293 # endif // GTEST_OS_WINDOWS
1294 
1295 // Returns a newly created InternalRunDeathTestFlag object with fields
1296 // initialized from the GTEST_FLAG(internal_run_death_test) flag if
1297 // the flag is specified; otherwise returns NULL.
1298 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
1299  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
1300 
1301  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
1302  // can use it here.
1303  int line = -1;
1304  int index = -1;
1305  ::std::vector< ::std::string> fields;
1306  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
1307  int write_fd = -1;
1308 
1309 # if GTEST_OS_WINDOWS
1310 
1311  unsigned int parent_process_id = 0;
1312  size_t write_handle_as_size_t = 0;
1313  size_t event_handle_as_size_t = 0;
1314 
1315  if (fields.size() != 6
1316  || !ParseNaturalNumber(fields[1], &line)
1317  || !ParseNaturalNumber(fields[2], &index)
1318  || !ParseNaturalNumber(fields[3], &parent_process_id)
1319  || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
1320  || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
1321  DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
1322  GTEST_FLAG(internal_run_death_test));
1323  }
1324  write_fd = GetStatusFileDescriptor(parent_process_id,
1325  write_handle_as_size_t,
1326  event_handle_as_size_t);
1327 # else
1328 
1329  if (fields.size() != 4
1330  || !ParseNaturalNumber(fields[1], &line)
1331  || !ParseNaturalNumber(fields[2], &index)
1332  || !ParseNaturalNumber(fields[3], &write_fd)) {
1333  DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
1334  + GTEST_FLAG(internal_run_death_test));
1335  }
1336 
1337 # endif // GTEST_OS_WINDOWS
1338 
1339  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
1340 }
1341 
1342 } // namespace internal
1343 
1344 #endif // GTEST_HAS_DEATH_TEST
1345 
1346 } // namespace testing
#define free(ptr)
Definition: curl_memory.h:130
class UnitTestImpl * GetUnitTestImpl()
const char * original_working_dir() const
Definition: gtest.cc:4228
GTEST_API_ std::string GetCapturedStderr()
#define GTEST_NAME_
Definition: gtest-port.h:284
int death_test_count() const
Definition: gtest.h:606
#define false
static const char kDefaultDeathTestStyle[]
const char * StringFromGTestEnv(const char *flag, const char *default_val)
Definition: gtest-port.cc:1177
#define GTEST_LOG_(severity)
Definition: gtest-port.h:1301
::std::string string
Definition: gtest-port.h:1129
UNITTEST_START char * ptr
Definition: unit1330.c:38
GTEST_API_ size_t GetThreadCount()
Definition: gtest-port.cc:129
const char kInternalRunDeathTestFlag[]
static bool PartialMatch(const ::std::string &str, const RE &re)
Definition: gtest-port.h:1219
UNITTEST_START int result
Definition: unit1304.c:49
GTEST_DEFINE_string_(death_test_style, internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),"Indicates how to run a death test in a forked child process: ""\"threadsafe\" (child process re-executes the test binary ""from the beginning, running only the specific death test) or ""\"fast\" (child process runs the death test immediately ""after forking).")
char buffer[]
Definition: unit1308.c:48
unsigned int i
Definition: unit1303.c:79
std::string StreamableToString(const T &streamable)
int Write(int fd, const void *buf, unsigned int count)
Definition: gtest-port.h:2323
UNITTEST_START char * output
Definition: unit1302.c:50
const char * name() const
Definition: gtest.h:655
const char * str
Definition: unit1398.c:33
#define FALSE
bool GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests)
#define GTEST_CHECK_(condition)
Definition: gtest-port.h:1322
#define GTEST_NO_INLINE_
Definition: gtest-port.h:973
int Read(int fd, void *buf, unsigned int count)
Definition: gtest-port.h:2320
GTEST_API_ bool AlwaysTrue()
Definition: gtest.cc:4937
std::string GetString() const
Definition: gtest.cc:944
const char * test_case_name() const
Definition: gtest.h:652
bool BoolFromGTestEnv(const char *flag, bool default_val)
Definition: gtest-port.cc:1145
GTEST_DEFINE_bool_(death_test_use_fork, internal::BoolFromGTestEnv("death_test_use_fork", false),"Instructs to use fork()/_exit() instead of clone() in death tests. ""Ignored and always uses fork() on POSIX systems where clone() is not ""implemented. Useful when running under valgrind or similar tools if ""those do not support clone(). Valgrind 3.3.1 will just fail if ""it sees an unsupported combination of clone() flags. ""It is not recommended to use this flag w/o valgrind though it will ""work in 99% of the cases. Once valgrind is fixed, this flag will ""most likely be removed.")
const char kFilterFlag[]
TestEventListeners * listeners()
GTEST_API_ void CaptureStderr()
const TestResult * result() const
Definition: gtest.h:700
static UnitTest * GetInstance()
Definition: gtest.cc:3935
GTEST_DEFINE_string_(internal_run_death_test,"","Indicates the file, line number, temporal index of ""the single death test to run, and a file descriptor to ""which a success code may be sent, all separated by ""the '|' characters. This flag is specified if and only if the current ""process is a sub-process launched for running a thread-safe ""death test. FOR INTERNAL USE ONLY.")
#define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
Definition: gtest-port.h:1005
#define fprintf
Definition: curl_printf.h:41
#define TRUE
FILE * FDOpen(int fd, const char *mode)
Definition: gtest-port.h:2316
char * StrDup(const char *src)
Definition: gtest-port.h:2288
const char * StrError(int errnum)
Definition: gtest-port.h:2327
#define GTEST_FLAG_PREFIX_
Definition: gtest-port.h:281


rc_tagdetect_client
Author(s): Monika Florek-Jasinska , Raphael Schaller
autogenerated on Sat Feb 13 2021 03:42:09