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, >est_regex, \ 19113481Sgiacomo.travaglini@arm.com __FILE__, __LINE__, >est_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