111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright 2005, Google Inc. 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// All rights reserved. 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Redistribution and use in source and binary forms, with or without 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// modification, are permitted provided that the following conditions are 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// met: 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Redistributions of source code must retain the above copyright 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// notice, this list of conditions and the following disclaimer. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Redistributions in binary form must reproduce the above 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// copyright notice, this list of conditions and the following disclaimer 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// in the documentation and/or other materials provided with the 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// distribution. 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Neither the name of Google Inc. nor the names of its 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// contributors may be used to endorse or promote products derived from 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// this software without specific prior written permission. 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The Google C++ Testing Framework (Google Test) 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This header file defines internal utilities needed for implementing 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// death tests. They are subject to change without notice. 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "gtest/internal/gtest-internal.h" 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stdio.h> 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace testing { 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace internal { 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertGTEST_DECLARE_string_(internal_run_death_test); 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Names of the flags (needed for parsing Google Test flags). 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertconst char kDeathTestStyleFlag[] = "death_test_style"; 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertconst char kDeathTestUseFork[] = "death_test_use_fork"; 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertconst char kInternalRunDeathTestFlag[] = "internal_run_death_test"; 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if GTEST_HAS_DEATH_TEST 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// DeathTest is a class that hides much of the complexity of the 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// returns a concrete class that depends on the prevailing death test 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// style, as defined by the --gtest_death_test_style and/or 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// --gtest_internal_run_death_test flags. 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// In describing the results of death tests, these terms are used with 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the corresponding definitions: 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// exit status: The integer exit information in the format specified 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// by wait(2) 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// exit code: The integer code passed to exit(3), _exit(2), or 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// returned from main() 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass GTEST_API_ DeathTest { 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Create returns false if there was an error determining the 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // appropriate action to take for the current death test; for example, 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // if the gtest_death_test_style flag is set to an invalid value. 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // The LastMessage method will return a more detailed message in that 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // case. Otherwise, the DeathTest pointer pointed to by the "test" 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // argument is set. If the death test should be skipped, the pointer 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // is set to NULL; otherwise, it is set to the address of a new concrete 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // DeathTest object that controls the execution of the current test. 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static bool Create(const char* statement, const RE* regex, 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* file, int line, DeathTest** test); 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DeathTest(); 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual ~DeathTest() { } 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // A helper class that aborts a death test when it's deleted. 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class ReturnSentinel { 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit ReturnSentinel(DeathTest* test) : test_(test) { } 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DeathTest* const test_; 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } GTEST_ATTRIBUTE_UNUSED_; 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // An enumeration of possible roles that may be taken when a death 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // test is encountered. EXECUTE means that the death test logic should 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // be executed immediately. OVERSEE means that the program should prepare 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // the appropriate environment for a child process to execute the death 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // test, then wait for it to complete. 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // An enumeration of the three reasons that a test might be aborted. 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum AbortReason { 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TEST_ENCOUNTERED_RETURN_STATEMENT, 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TEST_THREW_EXCEPTION, 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TEST_DID_NOT_DIE 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Assumes one of the above roles. 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual TestRole AssumeRole() = 0; 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Waits for the death test to finish and returns its status. 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual int Wait() = 0; 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Returns true if the death test passed; that is, the test process 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // exited during the test, its exit status matches a user-supplied 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // predicate, and its stderr output matches a user-supplied regular 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // expression. 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // The user-supplied predicate may be a macro expression rather 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // than a function pointer or functor, or else Wait and Passed could 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // be combined. 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual bool Passed(bool exit_status_ok) = 0; 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Signals that the death test did not die as expected. 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual void Abort(AbortReason reason) = 0; 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Returns a human-readable outcome message regarding the outcome of 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // the last death test. 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static const char* LastMessage(); 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static void set_last_death_test_message(const std::string& message); 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // A string containing a description of the outcome of the last death test. 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static std::string last_death_test_message_; 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Factory interface for death tests. May be mocked out for testing. 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass DeathTestFactory { 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual ~DeathTestFactory() { } 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual bool Create(const char* statement, const RE* regex, 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* file, int line, DeathTest** test) = 0; 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// A concrete DeathTestFactory implementation for normal use. 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass DefaultDeathTestFactory : public DeathTestFactory { 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual bool Create(const char* statement, const RE* regex, 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* file, int line, DeathTest** test); 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Returns true if exit_status describes a process that was terminated 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// by a signal, or exited normally with a nonzero exit code. 15611cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertGTEST_API_ bool ExitedUnsuccessfully(int exit_status); 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Traps C++ exceptions escaping statement and reports them as test 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// failures. Note that trapping SEH exceptions is not implemented here. 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if GTEST_HAS_EXCEPTIONS 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert try { \ 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } catch (const ::std::exception& gtest_exception) { \ 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert fprintf(\ 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert stderr, \ 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "\n%s: Caught std::exception-derived exception escaping the " \ 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "death test statement. Exception message: %s\n", \ 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert gtest_exception.what()); \ 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert fflush(stderr); \ 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } catch (...) { \ 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// ASSERT_EXIT*, and EXPECT_EXIT*. 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (::testing::internal::AlwaysTrue()) { \ 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const ::testing::internal::RE& gtest_regex = (regex); \ 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ::testing::internal::DeathTest* gtest_dt; \ 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __FILE__, __LINE__, >est_dt)) { \ 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } \ 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (gtest_dt != NULL) { \ 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert gtest_dt_ptr(gtest_dt); \ 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert switch (gtest_dt->AssumeRole()) { \ 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case ::testing::internal::DeathTest::OVERSEE_TEST: \ 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } \ 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert break; \ 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case ::testing::internal::DeathTest::EXECUTE_TEST: { \ 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ::testing::internal::DeathTest::ReturnSentinel \ 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert gtest_sentinel(gtest_dt); \ 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert break; \ 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } \ 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default: \ 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert break; \ 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } \ 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } \ 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } else \ 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert fail(::testing::internal::DeathTest::LastMessage()) 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The symbol "fail" here expands to something into which a message 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// can be streamed. 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// NDEBUG mode. In this case we need the statements to be executed, the regex is 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// ignored, and the macro must accept a streamed message even though the message 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// is never printed. 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define GTEST_EXECUTE_STATEMENT_(statement, regex) \ 22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (::testing::internal::AlwaysTrue()) { \ 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } else \ 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ::testing::Message() 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// A class representing the parsed contents of the 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// --gtest_internal_run_death_test flag, as it existed when 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// RUN_ALL_TESTS was called. 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass InternalRunDeathTestFlag { 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert InternalRunDeathTestFlag(const std::string& a_file, 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int a_line, 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int an_index, 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int a_write_fd) 24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : file_(a_file), line_(a_line), index_(an_index), 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert write_fd_(a_write_fd) {} 24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~InternalRunDeathTestFlag() { 24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (write_fd_ >= 0) 24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert posix::Close(write_fd_); 24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const std::string& file() const { return file_; } 24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int line() const { return line_; } 25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int index() const { return index_; } 25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int write_fd() const { return write_fd_; } 25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::string file_; 25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int line_; 25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int index_; 25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int write_fd_; 25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); 26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Returns a newly created InternalRunDeathTestFlag object with fields 26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// initialized from the GTEST_FLAG(internal_run_death_test) flag if 26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the flag is specified; otherwise returns NULL. 26511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); 26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else // GTEST_HAS_DEATH_TEST 26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This macro is used for implementing macros such as 27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where 27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// death tests are not supported. Those macros must compile on such systems 27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on 27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// systems that support death tests. This allows one to write such a macro 27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// on a system that does not support death tests and be sure that it will 27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// compile on a death-test supporting system. 27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Parameters: 27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// statement - A statement that a macro such as EXPECT_DEATH would test 27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// for program termination. This macro has to make sure this 28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// statement is compiled but not executed, to ensure that 28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// EXPECT_DEATH_IF_SUPPORTED compiles with a certain 28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// parameter iff EXPECT_DEATH compiles with it. 28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// regex - A regex that a macro such as EXPECT_DEATH would use to test 28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the output of statement. This parameter has to be 28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// compiled but not evaluated by this macro, to ensure that 28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// this macro only accepts expressions that a macro such as 28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// EXPECT_DEATH would accept. 28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED 28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// and a return statement for ASSERT_DEATH_IF_SUPPORTED. 29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This ensures that ASSERT_DEATH_IF_SUPPORTED will not 29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// compile inside functions where ASSERT_DEATH doesn't 29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// compile. 29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The branch that has an always false condition is used to ensure that 29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// statement and regex are compiled (and thus syntactically correct) but 29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// never executed. The unreachable code macro protects the terminator 29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// statement from generating an 'unreachable code' warning in case 29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// statement unconditionally returns or throws. The Message constructor at 29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the end allows the syntax of streaming additional messages into the 30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. 30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \ 30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (::testing::internal::AlwaysTrue()) { \ 30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_LOG_(WARNING) \ 30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "Death tests are not supported on this platform.\n" \ 30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert << "Statement '" #statement "' cannot be verified."; \ 30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } else if (::testing::internal::AlwaysFalse()) { \ 30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ::testing::internal::RE::PartialMatch(".*", (regex)); \ 30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert terminator; \ 31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } else \ 31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ::testing::Message() 31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // GTEST_HAS_DEATH_TEST 31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace internal 31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace testing 31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 320