39 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
40 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
42 #include "gtest/gtest-matchers.h"
43 #include "gtest/internal/gtest-internal.h"
58 #if GTEST_HAS_DEATH_TEST
86 static bool Create(
const char* statement, Matcher<const std::string&> matcher,
89 virtual ~DeathTest() { }
92 class ReturnSentinel {
95 ~ReturnSentinel() {
test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
97 DeathTest*
const test_;
106 enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
110 TEST_ENCOUNTERED_RETURN_STATEMENT,
111 TEST_THREW_EXCEPTION,
116 virtual TestRole AssumeRole() = 0;
119 virtual int Wait() = 0;
128 virtual bool Passed(
bool exit_status_ok) = 0;
131 virtual void Abort(AbortReason reason) = 0;
135 static const char* LastMessage();
149 class DeathTestFactory {
151 virtual ~DeathTestFactory() { }
152 virtual bool Create(
const char* statement,
153 Matcher<const std::string&> matcher,
const char*
file,
158 class DefaultDeathTestFactory :
public DeathTestFactory {
160 bool Create(
const char* statement, Matcher<const std::string&> matcher,
166 GTEST_API_ bool ExitedUnsuccessfully(
int exit_status);
171 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
175 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
const char* regex) {
178 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
185 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
186 Matcher<const ::std::string&> matcher) {
192 # if GTEST_HAS_EXCEPTIONS
193 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
195 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
196 } catch (const ::std::exception& gtest_exception) { \
199 "\n%s: Caught std::exception-derived exception escaping the " \
200 "death test statement. Exception message: %s\n", \
201 ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
202 gtest_exception.what()); \
204 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
206 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
210 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
211 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
217 #define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \
218 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
219 if (::testing::internal::AlwaysTrue()) { \
220 ::testing::internal::DeathTest* gtest_dt; \
221 if (!::testing::internal::DeathTest::Create( \
223 ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \
224 __FILE__, __LINE__, >est_dt)) { \
225 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
227 if (gtest_dt != nullptr) { \
228 std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \
229 switch (gtest_dt->AssumeRole()) { \
230 case ::testing::internal::DeathTest::OVERSEE_TEST: \
231 if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
232 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
235 case ::testing::internal::DeathTest::EXECUTE_TEST: { \
236 ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \
238 GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
239 gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
245 GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \
246 : fail(::testing::internal::DeathTest::LastMessage())
255 #define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \
256 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
257 if (::testing::internal::AlwaysTrue()) { \
258 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
259 } else if (!::testing::internal::AlwaysTrue()) { \
260 ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \
267 class InternalRunDeathTestFlag {
269 InternalRunDeathTestFlag(
const std::string& a_file,
274 write_fd_(a_write_fd) {}
276 ~InternalRunDeathTestFlag() {
284 int write_fd()
const {
return write_fd_; }
298 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
300 #endif // GTEST_HAS_DEATH_TEST
305 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_