113481Sgiacomo.travaglini@arm.com// Copyright 2005, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
3113481Sgiacomo.travaglini@arm.com//
3213481Sgiacomo.travaglini@arm.com// The Google C++ Testing Framework (Google Test)
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// This header file defines internal utilities needed for implementing
3513481Sgiacomo.travaglini@arm.com// death tests.  They are subject to change without notice.
3613481Sgiacomo.travaglini@arm.com
3713481Sgiacomo.travaglini@arm.com#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
3813481Sgiacomo.travaglini@arm.com#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
3913481Sgiacomo.travaglini@arm.com
4013481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-internal.h"
4113481Sgiacomo.travaglini@arm.com
4213481Sgiacomo.travaglini@arm.com#include <stdio.h>
4313481Sgiacomo.travaglini@arm.com
4413481Sgiacomo.travaglini@arm.comnamespace testing {
4513481Sgiacomo.travaglini@arm.comnamespace internal {
4613481Sgiacomo.travaglini@arm.com
4713481Sgiacomo.travaglini@arm.comGTEST_DECLARE_string_(internal_run_death_test);
4813481Sgiacomo.travaglini@arm.com
4913481Sgiacomo.travaglini@arm.com// Names of the flags (needed for parsing Google Test flags).
5013481Sgiacomo.travaglini@arm.comconst char kDeathTestStyleFlag[] = "death_test_style";
5113481Sgiacomo.travaglini@arm.comconst char kDeathTestUseFork[] = "death_test_use_fork";
5213481Sgiacomo.travaglini@arm.comconst char kInternalRunDeathTestFlag[] = "internal_run_death_test";
5313481Sgiacomo.travaglini@arm.com
5413481Sgiacomo.travaglini@arm.com#if GTEST_HAS_DEATH_TEST
5513481Sgiacomo.travaglini@arm.com
5613481Sgiacomo.travaglini@arm.com// DeathTest is a class that hides much of the complexity of the
5713481Sgiacomo.travaglini@arm.com// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
5813481Sgiacomo.travaglini@arm.com// returns a concrete class that depends on the prevailing death test
5913481Sgiacomo.travaglini@arm.com// style, as defined by the --gtest_death_test_style and/or
6013481Sgiacomo.travaglini@arm.com// --gtest_internal_run_death_test flags.
6113481Sgiacomo.travaglini@arm.com
6213481Sgiacomo.travaglini@arm.com// In describing the results of death tests, these terms are used with
6313481Sgiacomo.travaglini@arm.com// the corresponding definitions:
6413481Sgiacomo.travaglini@arm.com//
6513481Sgiacomo.travaglini@arm.com// exit status:  The integer exit information in the format specified
6613481Sgiacomo.travaglini@arm.com//               by wait(2)
6713481Sgiacomo.travaglini@arm.com// exit code:    The integer code passed to exit(3), _exit(2), or
6813481Sgiacomo.travaglini@arm.com//               returned from main()
6913481Sgiacomo.travaglini@arm.comclass GTEST_API_ DeathTest {
7013481Sgiacomo.travaglini@arm.com public:
7113481Sgiacomo.travaglini@arm.com  // Create returns false if there was an error determining the
7213481Sgiacomo.travaglini@arm.com  // appropriate action to take for the current death test; for example,
7313481Sgiacomo.travaglini@arm.com  // if the gtest_death_test_style flag is set to an invalid value.
7413481Sgiacomo.travaglini@arm.com  // The LastMessage method will return a more detailed message in that
7513481Sgiacomo.travaglini@arm.com  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
7613481Sgiacomo.travaglini@arm.com  // argument is set.  If the death test should be skipped, the pointer
7713481Sgiacomo.travaglini@arm.com  // is set to NULL; otherwise, it is set to the address of a new concrete
7813481Sgiacomo.travaglini@arm.com  // DeathTest object that controls the execution of the current test.
7913481Sgiacomo.travaglini@arm.com  static bool Create(const char* statement, const RE* regex,
8013481Sgiacomo.travaglini@arm.com                     const char* file, int line, DeathTest** test);
8113481Sgiacomo.travaglini@arm.com  DeathTest();
8213481Sgiacomo.travaglini@arm.com  virtual ~DeathTest() { }
8313481Sgiacomo.travaglini@arm.com
8413481Sgiacomo.travaglini@arm.com  // A helper class that aborts a death test when it's deleted.
8513481Sgiacomo.travaglini@arm.com  class ReturnSentinel {
8613481Sgiacomo.travaglini@arm.com   public:
8713481Sgiacomo.travaglini@arm.com    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
8813481Sgiacomo.travaglini@arm.com    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
8913481Sgiacomo.travaglini@arm.com   private:
9013481Sgiacomo.travaglini@arm.com    DeathTest* const test_;
9113481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
9213481Sgiacomo.travaglini@arm.com  } GTEST_ATTRIBUTE_UNUSED_;
9313481Sgiacomo.travaglini@arm.com
9413481Sgiacomo.travaglini@arm.com  // An enumeration of possible roles that may be taken when a death
9513481Sgiacomo.travaglini@arm.com  // test is encountered.  EXECUTE means that the death test logic should
9613481Sgiacomo.travaglini@arm.com  // be executed immediately.  OVERSEE means that the program should prepare
9713481Sgiacomo.travaglini@arm.com  // the appropriate environment for a child process to execute the death
9813481Sgiacomo.travaglini@arm.com  // test, then wait for it to complete.
9913481Sgiacomo.travaglini@arm.com  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
10013481Sgiacomo.travaglini@arm.com
10113481Sgiacomo.travaglini@arm.com  // An enumeration of the three reasons that a test might be aborted.
10213481Sgiacomo.travaglini@arm.com  enum AbortReason {
10313481Sgiacomo.travaglini@arm.com    TEST_ENCOUNTERED_RETURN_STATEMENT,
10413481Sgiacomo.travaglini@arm.com    TEST_THREW_EXCEPTION,
10513481Sgiacomo.travaglini@arm.com    TEST_DID_NOT_DIE
10613481Sgiacomo.travaglini@arm.com  };
10713481Sgiacomo.travaglini@arm.com
10813481Sgiacomo.travaglini@arm.com  // Assumes one of the above roles.
10913481Sgiacomo.travaglini@arm.com  virtual TestRole AssumeRole() = 0;
11013481Sgiacomo.travaglini@arm.com
11113481Sgiacomo.travaglini@arm.com  // Waits for the death test to finish and returns its status.
11213481Sgiacomo.travaglini@arm.com  virtual int Wait() = 0;
11313481Sgiacomo.travaglini@arm.com
11413481Sgiacomo.travaglini@arm.com  // Returns true if the death test passed; that is, the test process
11513481Sgiacomo.travaglini@arm.com  // exited during the test, its exit status matches a user-supplied
11613481Sgiacomo.travaglini@arm.com  // predicate, and its stderr output matches a user-supplied regular
11713481Sgiacomo.travaglini@arm.com  // expression.
11813481Sgiacomo.travaglini@arm.com  // The user-supplied predicate may be a macro expression rather
11913481Sgiacomo.travaglini@arm.com  // than a function pointer or functor, or else Wait and Passed could
12013481Sgiacomo.travaglini@arm.com  // be combined.
12113481Sgiacomo.travaglini@arm.com  virtual bool Passed(bool exit_status_ok) = 0;
12213481Sgiacomo.travaglini@arm.com
12313481Sgiacomo.travaglini@arm.com  // Signals that the death test did not die as expected.
12413481Sgiacomo.travaglini@arm.com  virtual void Abort(AbortReason reason) = 0;
12513481Sgiacomo.travaglini@arm.com
12613481Sgiacomo.travaglini@arm.com  // Returns a human-readable outcome message regarding the outcome of
12713481Sgiacomo.travaglini@arm.com  // the last death test.
12813481Sgiacomo.travaglini@arm.com  static const char* LastMessage();
12913481Sgiacomo.travaglini@arm.com
13013481Sgiacomo.travaglini@arm.com  static void set_last_death_test_message(const std::string& message);
13113481Sgiacomo.travaglini@arm.com
13213481Sgiacomo.travaglini@arm.com private:
13313481Sgiacomo.travaglini@arm.com  // A string containing a description of the outcome of the last death test.
13413481Sgiacomo.travaglini@arm.com  static std::string last_death_test_message_;
13513481Sgiacomo.travaglini@arm.com
13613481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
13713481Sgiacomo.travaglini@arm.com};
13813481Sgiacomo.travaglini@arm.com
13913481Sgiacomo.travaglini@arm.com// Factory interface for death tests.  May be mocked out for testing.
14013481Sgiacomo.travaglini@arm.comclass DeathTestFactory {
14113481Sgiacomo.travaglini@arm.com public:
14213481Sgiacomo.travaglini@arm.com  virtual ~DeathTestFactory() { }
14313481Sgiacomo.travaglini@arm.com  virtual bool Create(const char* statement, const RE* regex,
14413481Sgiacomo.travaglini@arm.com                      const char* file, int line, DeathTest** test) = 0;
14513481Sgiacomo.travaglini@arm.com};
14613481Sgiacomo.travaglini@arm.com
14713481Sgiacomo.travaglini@arm.com// A concrete DeathTestFactory implementation for normal use.
14813481Sgiacomo.travaglini@arm.comclass DefaultDeathTestFactory : public DeathTestFactory {
14913481Sgiacomo.travaglini@arm.com public:
15013481Sgiacomo.travaglini@arm.com  virtual bool Create(const char* statement, const RE* regex,
15113481Sgiacomo.travaglini@arm.com                      const char* file, int line, DeathTest** test);
15213481Sgiacomo.travaglini@arm.com};
15313481Sgiacomo.travaglini@arm.com
15413481Sgiacomo.travaglini@arm.com// Returns true if exit_status describes a process that was terminated
15513481Sgiacomo.travaglini@arm.com// by a signal, or exited normally with a nonzero exit code.
15613481Sgiacomo.travaglini@arm.comGTEST_API_ bool ExitedUnsuccessfully(int exit_status);
15713481Sgiacomo.travaglini@arm.com
15813481Sgiacomo.travaglini@arm.com// Traps C++ exceptions escaping statement and reports them as test
15913481Sgiacomo.travaglini@arm.com// failures. Note that trapping SEH exceptions is not implemented here.
16013481Sgiacomo.travaglini@arm.com# if GTEST_HAS_EXCEPTIONS
16113481Sgiacomo.travaglini@arm.com#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
16213481Sgiacomo.travaglini@arm.com  try { \
16313481Sgiacomo.travaglini@arm.com    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
16413481Sgiacomo.travaglini@arm.com  } catch (const ::std::exception& gtest_exception) { \
16513481Sgiacomo.travaglini@arm.com    fprintf(\
16613481Sgiacomo.travaglini@arm.com        stderr, \
16713481Sgiacomo.travaglini@arm.com        "\n%s: Caught std::exception-derived exception escaping the " \
16813481Sgiacomo.travaglini@arm.com        "death test statement. Exception message: %s\n", \
16913481Sgiacomo.travaglini@arm.com        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
17013481Sgiacomo.travaglini@arm.com        gtest_exception.what()); \
17113481Sgiacomo.travaglini@arm.com    fflush(stderr); \
17213481Sgiacomo.travaglini@arm.com    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
17313481Sgiacomo.travaglini@arm.com  } catch (...) { \
17413481Sgiacomo.travaglini@arm.com    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
17513481Sgiacomo.travaglini@arm.com  }
17613481Sgiacomo.travaglini@arm.com
17713481Sgiacomo.travaglini@arm.com# else
17813481Sgiacomo.travaglini@arm.com#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
17913481Sgiacomo.travaglini@arm.com  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
18013481Sgiacomo.travaglini@arm.com
18113481Sgiacomo.travaglini@arm.com# endif
18213481Sgiacomo.travaglini@arm.com
18313481Sgiacomo.travaglini@arm.com// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
18413481Sgiacomo.travaglini@arm.com// ASSERT_EXIT*, and EXPECT_EXIT*.
18513481Sgiacomo.travaglini@arm.com# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
18613481Sgiacomo.travaglini@arm.com  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
18713481Sgiacomo.travaglini@arm.com  if (::testing::internal::AlwaysTrue()) { \
18813481Sgiacomo.travaglini@arm.com    const ::testing::internal::RE& gtest_regex = (regex); \
18913481Sgiacomo.travaglini@arm.com    ::testing::internal::DeathTest* gtest_dt; \
19013481Sgiacomo.travaglini@arm.com    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
19113481Sgiacomo.travaglini@arm.com        __FILE__, __LINE__, &gtest_dt)) { \
19213481Sgiacomo.travaglini@arm.com      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
19313481Sgiacomo.travaglini@arm.com    } \
19413481Sgiacomo.travaglini@arm.com    if (gtest_dt != NULL) { \
19513481Sgiacomo.travaglini@arm.com      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
19613481Sgiacomo.travaglini@arm.com          gtest_dt_ptr(gtest_dt); \
19713481Sgiacomo.travaglini@arm.com      switch (gtest_dt->AssumeRole()) { \
19813481Sgiacomo.travaglini@arm.com        case ::testing::internal::DeathTest::OVERSEE_TEST: \
19913481Sgiacomo.travaglini@arm.com          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
20013481Sgiacomo.travaglini@arm.com            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
20113481Sgiacomo.travaglini@arm.com          } \
20213481Sgiacomo.travaglini@arm.com          break; \
20313481Sgiacomo.travaglini@arm.com        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
20413481Sgiacomo.travaglini@arm.com          ::testing::internal::DeathTest::ReturnSentinel \
20513481Sgiacomo.travaglini@arm.com              gtest_sentinel(gtest_dt); \
20613481Sgiacomo.travaglini@arm.com          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
20713481Sgiacomo.travaglini@arm.com          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
20813481Sgiacomo.travaglini@arm.com          break; \
20913481Sgiacomo.travaglini@arm.com        } \
21013481Sgiacomo.travaglini@arm.com        default: \
21113481Sgiacomo.travaglini@arm.com          break; \
21213481Sgiacomo.travaglini@arm.com      } \
21313481Sgiacomo.travaglini@arm.com    } \
21413481Sgiacomo.travaglini@arm.com  } else \
21513481Sgiacomo.travaglini@arm.com    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
21613481Sgiacomo.travaglini@arm.com      fail(::testing::internal::DeathTest::LastMessage())
21713481Sgiacomo.travaglini@arm.com// The symbol "fail" here expands to something into which a message
21813481Sgiacomo.travaglini@arm.com// can be streamed.
21913481Sgiacomo.travaglini@arm.com
22013481Sgiacomo.travaglini@arm.com// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
22113481Sgiacomo.travaglini@arm.com// NDEBUG mode. In this case we need the statements to be executed, the regex is
22213481Sgiacomo.travaglini@arm.com// ignored, and the macro must accept a streamed message even though the message
22313481Sgiacomo.travaglini@arm.com// is never printed.
22413481Sgiacomo.travaglini@arm.com# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
22513481Sgiacomo.travaglini@arm.com  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
22613481Sgiacomo.travaglini@arm.com  if (::testing::internal::AlwaysTrue()) { \
22713481Sgiacomo.travaglini@arm.com     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
22813481Sgiacomo.travaglini@arm.com  } else \
22913481Sgiacomo.travaglini@arm.com    ::testing::Message()
23013481Sgiacomo.travaglini@arm.com
23113481Sgiacomo.travaglini@arm.com// A class representing the parsed contents of the
23213481Sgiacomo.travaglini@arm.com// --gtest_internal_run_death_test flag, as it existed when
23313481Sgiacomo.travaglini@arm.com// RUN_ALL_TESTS was called.
23413481Sgiacomo.travaglini@arm.comclass InternalRunDeathTestFlag {
23513481Sgiacomo.travaglini@arm.com public:
23613481Sgiacomo.travaglini@arm.com  InternalRunDeathTestFlag(const std::string& a_file,
23713481Sgiacomo.travaglini@arm.com                           int a_line,
23813481Sgiacomo.travaglini@arm.com                           int an_index,
23913481Sgiacomo.travaglini@arm.com                           int a_write_fd)
24013481Sgiacomo.travaglini@arm.com      : file_(a_file), line_(a_line), index_(an_index),
24113481Sgiacomo.travaglini@arm.com        write_fd_(a_write_fd) {}
24213481Sgiacomo.travaglini@arm.com
24313481Sgiacomo.travaglini@arm.com  ~InternalRunDeathTestFlag() {
24413481Sgiacomo.travaglini@arm.com    if (write_fd_ >= 0)
24513481Sgiacomo.travaglini@arm.com      posix::Close(write_fd_);
24613481Sgiacomo.travaglini@arm.com  }
24713481Sgiacomo.travaglini@arm.com
24813481Sgiacomo.travaglini@arm.com  const std::string& file() const { return file_; }
24913481Sgiacomo.travaglini@arm.com  int line() const { return line_; }
25013481Sgiacomo.travaglini@arm.com  int index() const { return index_; }
25113481Sgiacomo.travaglini@arm.com  int write_fd() const { return write_fd_; }
25213481Sgiacomo.travaglini@arm.com
25313481Sgiacomo.travaglini@arm.com private:
25413481Sgiacomo.travaglini@arm.com  std::string file_;
25513481Sgiacomo.travaglini@arm.com  int line_;
25613481Sgiacomo.travaglini@arm.com  int index_;
25713481Sgiacomo.travaglini@arm.com  int write_fd_;
25813481Sgiacomo.travaglini@arm.com
25913481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
26013481Sgiacomo.travaglini@arm.com};
26113481Sgiacomo.travaglini@arm.com
26213481Sgiacomo.travaglini@arm.com// Returns a newly created InternalRunDeathTestFlag object with fields
26313481Sgiacomo.travaglini@arm.com// initialized from the GTEST_FLAG(internal_run_death_test) flag if
26413481Sgiacomo.travaglini@arm.com// the flag is specified; otherwise returns NULL.
26513481Sgiacomo.travaglini@arm.comInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
26613481Sgiacomo.travaglini@arm.com
26713481Sgiacomo.travaglini@arm.com#else  // GTEST_HAS_DEATH_TEST
26813481Sgiacomo.travaglini@arm.com
26913481Sgiacomo.travaglini@arm.com// This macro is used for implementing macros such as
27013481Sgiacomo.travaglini@arm.com// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
27113481Sgiacomo.travaglini@arm.com// death tests are not supported. Those macros must compile on such systems
27213481Sgiacomo.travaglini@arm.com// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
27313481Sgiacomo.travaglini@arm.com// systems that support death tests. This allows one to write such a macro
27413481Sgiacomo.travaglini@arm.com// on a system that does not support death tests and be sure that it will
27513481Sgiacomo.travaglini@arm.com// compile on a death-test supporting system.
27613481Sgiacomo.travaglini@arm.com//
27713481Sgiacomo.travaglini@arm.com// Parameters:
27813481Sgiacomo.travaglini@arm.com//   statement -  A statement that a macro such as EXPECT_DEATH would test
27913481Sgiacomo.travaglini@arm.com//                for program termination. This macro has to make sure this
28013481Sgiacomo.travaglini@arm.com//                statement is compiled but not executed, to ensure that
28113481Sgiacomo.travaglini@arm.com//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
28213481Sgiacomo.travaglini@arm.com//                parameter iff EXPECT_DEATH compiles with it.
28313481Sgiacomo.travaglini@arm.com//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
28413481Sgiacomo.travaglini@arm.com//                the output of statement.  This parameter has to be
28513481Sgiacomo.travaglini@arm.com//                compiled but not evaluated by this macro, to ensure that
28613481Sgiacomo.travaglini@arm.com//                this macro only accepts expressions that a macro such as
28713481Sgiacomo.travaglini@arm.com//                EXPECT_DEATH would accept.
28813481Sgiacomo.travaglini@arm.com//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
28913481Sgiacomo.travaglini@arm.com//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
29013481Sgiacomo.travaglini@arm.com//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
29113481Sgiacomo.travaglini@arm.com//                compile inside functions where ASSERT_DEATH doesn't
29213481Sgiacomo.travaglini@arm.com//                compile.
29313481Sgiacomo.travaglini@arm.com//
29413481Sgiacomo.travaglini@arm.com//  The branch that has an always false condition is used to ensure that
29513481Sgiacomo.travaglini@arm.com//  statement and regex are compiled (and thus syntactically correct) but
29613481Sgiacomo.travaglini@arm.com//  never executed. The unreachable code macro protects the terminator
29713481Sgiacomo.travaglini@arm.com//  statement from generating an 'unreachable code' warning in case
29813481Sgiacomo.travaglini@arm.com//  statement unconditionally returns or throws. The Message constructor at
29913481Sgiacomo.travaglini@arm.com//  the end allows the syntax of streaming additional messages into the
30013481Sgiacomo.travaglini@arm.com//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
30113481Sgiacomo.travaglini@arm.com# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
30213481Sgiacomo.travaglini@arm.com    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
30313481Sgiacomo.travaglini@arm.com    if (::testing::internal::AlwaysTrue()) { \
30413481Sgiacomo.travaglini@arm.com      GTEST_LOG_(WARNING) \
30513481Sgiacomo.travaglini@arm.com          << "Death tests are not supported on this platform.\n" \
30613481Sgiacomo.travaglini@arm.com          << "Statement '" #statement "' cannot be verified."; \
30713481Sgiacomo.travaglini@arm.com    } else if (::testing::internal::AlwaysFalse()) { \
30813481Sgiacomo.travaglini@arm.com      ::testing::internal::RE::PartialMatch(".*", (regex)); \
30913481Sgiacomo.travaglini@arm.com      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
31013481Sgiacomo.travaglini@arm.com      terminator; \
31113481Sgiacomo.travaglini@arm.com    } else \
31213481Sgiacomo.travaglini@arm.com      ::testing::Message()
31313481Sgiacomo.travaglini@arm.com
31413481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_DEATH_TEST
31513481Sgiacomo.travaglini@arm.com
31613481Sgiacomo.travaglini@arm.com}  // namespace internal
31713481Sgiacomo.travaglini@arm.com}  // namespace testing
31813481Sgiacomo.travaglini@arm.com
31913481Sgiacomo.travaglini@arm.com#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
320