39#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
40#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
60#ifdef GTEST_HAS_DEATH_TEST
89 const char* file,
int line, DeathTest** test);
91 virtual ~DeathTest() =
default;
94 class ReturnSentinel {
96 explicit ReturnSentinel(DeathTest* test) : test_(test) {}
97 ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
100 DeathTest*
const test_;
101 ReturnSentinel(
const ReturnSentinel&) =
delete;
102 ReturnSentinel& operator=(
const ReturnSentinel&) =
delete;
110 enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
114 TEST_ENCOUNTERED_RETURN_STATEMENT,
115 TEST_THREW_EXCEPTION,
120 virtual TestRole AssumeRole() = 0;
123 virtual int Wait() = 0;
132 virtual bool Passed(
bool exit_status_ok) = 0;
135 virtual void Abort(AbortReason reason) = 0;
139 static const char* LastMessage();
141 static void set_last_death_test_message(
const std::string& message);
145 static std::string last_death_test_message_;
147 DeathTest(
const DeathTest&) =
delete;
148 DeathTest& operator=(
const DeathTest&) =
delete;
154class DeathTestFactory {
156 virtual ~DeathTestFactory() =
default;
157 virtual bool Create(
const char* statement,
159 int line, DeathTest** test) = 0;
163class DefaultDeathTestFactory :
public DeathTestFactory {
165 bool Create(
const char* statement, Matcher<const std::string&> matcher,
166 const char* file,
int line, DeathTest** test)
override;
171GTEST_API_ bool ExitedUnsuccessfully(
int exit_status);
176inline Matcher<const ::std::string&> MakeDeathTestMatcher(
177 ::testing::internal::RE regex) {
178 return ContainsRegex(regex.pattern());
180inline Matcher<const ::std::string&> MakeDeathTestMatcher(
const char* regex) {
181 return ContainsRegex(regex);
183inline Matcher<const ::std::string&> MakeDeathTestMatcher(
184 const ::std::string& regex) {
185 return ContainsRegex(regex);
190inline Matcher<const ::std::string&> MakeDeathTestMatcher(
191 Matcher<const ::std::string&> matcher) {
197#if GTEST_HAS_EXCEPTIONS
198#define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
200 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
201 } catch (const ::std::exception& gtest_exception) { \
204 "\n%s: Caught std::exception-derived exception escaping the " \
205 "death test statement. Exception message: %s\n", \
206 ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
207 gtest_exception.what()); \
209 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
211 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
215#define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
216 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
222#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \
223 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
224 if (::testing::internal::AlwaysTrue()) { \
225 ::testing::internal::DeathTest* gtest_dt; \
226 if (!::testing::internal::DeathTest::Create( \
228 ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \
229 __FILE__, __LINE__, >est_dt)) { \
230 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
232 if (gtest_dt != nullptr) { \
233 std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \
234 switch (gtest_dt->AssumeRole()) { \
235 case ::testing::internal::DeathTest::OVERSEE_TEST: \
236 if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
237 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
240 case ::testing::internal::DeathTest::EXECUTE_TEST: { \
241 const ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \
243 GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
244 gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
250 GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \
251 : fail(::testing::internal::DeathTest::LastMessage())
260#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \
261 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
262 if (::testing::internal::AlwaysTrue()) { \
263 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
264 } else if (!::testing::internal::AlwaysTrue()) { \
265 ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \
272class InternalRunDeathTestFlag {
274 InternalRunDeathTestFlag(
const std::string& a_file,
int a_line,
int an_index,
276 : file_(a_file), line_(a_line), index_(an_index), write_fd_(a_write_fd) {}
278 ~InternalRunDeathTestFlag() {
282 const std::string& file()
const {
return file_; }
283 int line()
const {
return line_; }
284 int index()
const {
return index_; }
285 int write_fd()
const {
return write_fd_; }
293 InternalRunDeathTestFlag(
const InternalRunDeathTestFlag&) =
delete;
294 InternalRunDeathTestFlag& operator=(
const InternalRunDeathTestFlag&) =
delete;
300InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
Definition gmock-internal-utils.h:55
#define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
Definition gtest-port.h:360
#define GTEST_DECLARE_string_(name)
Definition gtest-port.h:2285
#define GTEST_API_
Definition gtest-port.h:842
#define GTEST_DISABLE_MSC_WARNINGS_POP_()
Definition gtest-port.h:361
int Close(int fd)
Definition gtest-port.h:2114
const char kDeathTestStyleFlag[]
Definition gtest-death-test-internal.h:56
const char kDeathTestUseFork[]
Definition gtest-death-test-internal.h:57
const char kInternalRunDeathTestFlag[]
Definition gtest-death-test-internal.h:58
Definition gmock-actions.h:151