1aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc. 2aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved. 3aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 4aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without 5aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are 6aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met: 7aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 8aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Redistributions of source code must retain the above copyright 9aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer. 10aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Redistributions in binary form must reproduce the above 11aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer 12aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the 13aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution. 14aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Neither the name of Google Inc. nor the names of its 15aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from 16aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission. 17aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 18aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 30aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) 31aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 32aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Google C++ Testing Framework (Google Test) 33aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 34aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file defines internal utilities needed for implementing 35aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// death tests. They are subject to change without notice. 36aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 37aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 38aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 39aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 40aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include "gtest/internal/gtest-internal.h" 41aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 42aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdio.h> 43aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 44aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing { 45aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal { 46aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 47aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(internal_run_death_test); 48aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 49aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Names of the flags (needed for parsing Google Test flags). 50aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kDeathTestStyleFlag[] = "death_test_style"; 51aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kDeathTestUseFork[] = "death_test_use_fork"; 52aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kInternalRunDeathTestFlag[] = "internal_run_death_test"; 53aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 54aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST 55aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 56aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DeathTest is a class that hides much of the complexity of the 57aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method 58aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returns a concrete class that depends on the prevailing death test 59aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// style, as defined by the --gtest_death_test_style and/or 60aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// --gtest_internal_run_death_test flags. 61aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 62aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In describing the results of death tests, these terms are used with 63aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the corresponding definitions: 64aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 65aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// exit status: The integer exit information in the format specified 66aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by wait(2) 67aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// exit code: The integer code passed to exit(3), _exit(2), or 68aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returned from main() 69aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ DeathTest { 70aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 71aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Create returns false if there was an error determining the 72aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // appropriate action to take for the current death test; for example, 73aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // if the gtest_death_test_style flag is set to an invalid value. 74aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The LastMessage method will return a more detailed message in that 75aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // case. Otherwise, the DeathTest pointer pointed to by the "test" 76aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // argument is set. If the death test should be skipped, the pointer 77aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // is set to NULL; otherwise, it is set to the address of a new concrete 78aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // DeathTest object that controls the execution of the current test. 79aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool Create(const char* statement, const RE* regex, 80aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* file, int line, DeathTest** test); 81aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter DeathTest(); 82aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual ~DeathTest() { } 83aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 84aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // A helper class that aborts a death test when it's deleted. 85aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter class ReturnSentinel { 86aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 87aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit ReturnSentinel(DeathTest* test) : test_(test) { } 88aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } 89aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 90aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter DeathTest* const test_; 91aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); 92aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } GTEST_ATTRIBUTE_UNUSED_; 93aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 94aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // An enumeration of possible roles that may be taken when a death 95aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // test is encountered. EXECUTE means that the death test logic should 96aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // be executed immediately. OVERSEE means that the program should prepare 97aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the appropriate environment for a child process to execute the death 98aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // test, then wait for it to complete. 99aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; 100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // An enumeration of the three reasons that a test might be aborted. 102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter enum AbortReason { 103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TEST_ENCOUNTERED_RETURN_STATEMENT, 104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TEST_THREW_EXCEPTION, 105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TEST_DID_NOT_DIE 106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter }; 107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Assumes one of the above roles. 109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual TestRole AssumeRole() = 0; 110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Waits for the death test to finish and returns its status. 112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual int Wait() = 0; 113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns true if the death test passed; that is, the test process 115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // exited during the test, its exit status matches a user-supplied 116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // predicate, and its stderr output matches a user-supplied regular 117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // expression. 118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The user-supplied predicate may be a macro expression rather 119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // than a function pointer or functor, or else Wait and Passed could 120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // be combined. 121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual bool Passed(bool exit_status_ok) = 0; 122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Signals that the death test did not die as expected. 124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void Abort(AbortReason reason) = 0; 125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns a human-readable outcome message regarding the outcome of 127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the last death test. 128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static const char* LastMessage(); 129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static void set_last_death_test_message(const std::string& message); 131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // A string containing a description of the outcome of the last death test. 134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static std::string last_death_test_message_; 135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); 137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Factory interface for death tests. May be mocked out for testing. 140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DeathTestFactory { 141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual ~DeathTestFactory() { } 143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual bool Create(const char* statement, const RE* regex, 144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* file, int line, DeathTest** test) = 0; 145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A concrete DeathTestFactory implementation for normal use. 148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DefaultDeathTestFactory : public DeathTestFactory { 149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual bool Create(const char* statement, const RE* regex, 151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* file, int line, DeathTest** test); 152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns true if exit_status describes a process that was terminated 155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by a signal, or exited normally with a nonzero exit code. 156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool ExitedUnsuccessfully(int exit_status); 157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Traps C++ exceptions escaping statement and reports them as test 159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// failures. Note that trapping SEH exceptions is not implemented here. 160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_HAS_EXCEPTIONS 161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ 162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter try { \ 163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } catch (const ::std::exception& gtest_exception) { \ 165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter fprintf(\ 166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter stderr, \ 167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter "\n%s: Caught std::exception-derived exception escaping the " \ 168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter "death test statement. Exception message: %s\n", \ 169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ 170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter gtest_exception.what()); \ 171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter fflush(stderr); \ 172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ 173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } catch (...) { \ 174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ 175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ 179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) 180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif 182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, 184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ASSERT_EXIT*, and EXPECT_EXIT*. 185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ 186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (::testing::internal::AlwaysTrue()) { \ 188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const ::testing::internal::RE& gtest_regex = (regex); \ 189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::internal::DeathTest* gtest_dt; \ 190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ 191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter __FILE__, __LINE__, >est_dt)) { \ 192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ 193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } \ 194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (gtest_dt != NULL) { \ 195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ 196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter gtest_dt_ptr(gtest_dt); \ 197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter switch (gtest_dt->AssumeRole()) { \ 198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter case ::testing::internal::DeathTest::OVERSEE_TEST: \ 199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ 200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ 201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } \ 202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter break; \ 203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter case ::testing::internal::DeathTest::EXECUTE_TEST: { \ 204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::internal::DeathTest::ReturnSentinel \ 205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter gtest_sentinel(gtest_dt); \ 206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ 207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ 208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter break; \ 209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } \ 210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter default: \ 211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter break; \ 212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } \ 213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } \ 214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } else \ 215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ 216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter fail(::testing::internal::DeathTest::LastMessage()) 217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The symbol "fail" here expands to something into which a message 218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can be streamed. 219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in 221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// NDEBUG mode. In this case we need the statements to be executed, the regex is 222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ignored, and the macro must accept a streamed message even though the message 223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is never printed. 224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_EXECUTE_STATEMENT_(statement, regex) \ 225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (::testing::internal::AlwaysTrue()) { \ 227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } else \ 229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::Message() 230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A class representing the parsed contents of the 232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// --gtest_internal_run_death_test flag, as it existed when 233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// RUN_ALL_TESTS was called. 234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass InternalRunDeathTestFlag { 235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter InternalRunDeathTestFlag(const std::string& a_file, 237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int a_line, 238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int an_index, 239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int a_write_fd) 240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter : file_(a_file), line_(a_line), index_(an_index), 241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter write_fd_(a_write_fd) {} 242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~InternalRunDeathTestFlag() { 244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (write_fd_ >= 0) 245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter posix::Close(write_fd_); 246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const std::string& file() const { return file_; } 249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int line() const { return line_; } 250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int index() const { return index_; } 251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int write_fd() const { return write_fd_; } 252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string file_; 255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int line_; 256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int index_; 257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int write_fd_; 258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); 260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns a newly created InternalRunDeathTestFlag object with fields 263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// initialized from the GTEST_FLAG(internal_run_death_test) flag if 264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the flag is specified; otherwise returns NULL. 265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); 266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else // GTEST_HAS_DEATH_TEST 268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This macro is used for implementing macros such as 270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where 271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// death tests are not supported. Those macros must compile on such systems 272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on 273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// systems that support death tests. This allows one to write such a macro 274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// on a system that does not support death tests and be sure that it will 275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compile on a death-test supporting system. 276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parameters: 278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// statement - A statement that a macro such as EXPECT_DEATH would test 279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for program termination. This macro has to make sure this 280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// statement is compiled but not executed, to ensure that 281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EXPECT_DEATH_IF_SUPPORTED compiles with a certain 282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// parameter iff EXPECT_DEATH compiles with it. 283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// regex - A regex that a macro such as EXPECT_DEATH would use to test 284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the output of statement. This parameter has to be 285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiled but not evaluated by this macro, to ensure that 286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this macro only accepts expressions that a macro such as 287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EXPECT_DEATH would accept. 288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED 289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and a return statement for ASSERT_DEATH_IF_SUPPORTED. 290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This ensures that ASSERT_DEATH_IF_SUPPORTED will not 291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compile inside functions where ASSERT_DEATH doesn't 292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compile. 293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The branch that has an always false condition is used to ensure that 295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// statement and regex are compiled (and thus syntactically correct) but 296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// never executed. The unreachable code macro protects the terminator 297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// statement from generating an 'unreachable code' warning in case 298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// statement unconditionally returns or throws. The Message constructor at 299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the end allows the syntax of streaming additional messages into the 300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. 301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \ 302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (::testing::internal::AlwaysTrue()) { \ 304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_LOG_(WARNING) \ 305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "Death tests are not supported on this platform.\n" \ 306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "Statement '" #statement "' cannot be verified."; \ 307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } else if (::testing::internal::AlwaysFalse()) { \ 308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::internal::RE::PartialMatch(".*", (regex)); \ 309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter terminator; \ 311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } else \ 312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ::testing::Message() 313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_DEATH_TEST 315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} // namespace internal 317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} // namespace testing 318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 320