39#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
40#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
46#include "gtest/gtest-matchers.h"
47#include "gtest/internal/gtest-internal.h"
49GTEST_DECLARE_string_(internal_run_death_test);
55const char kDeathTestStyleFlag[] =
"death_test_style";
56const char kDeathTestUseFork[] =
"death_test_use_fork";
57const char kInternalRunDeathTestFlag[] =
"internal_run_death_test";
59#if GTEST_HAS_DEATH_TEST
61GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
77class GTEST_API_ DeathTest {
87 static bool Create(
const char* statement, Matcher<const std::string&> matcher,
88 const char* file,
int line, DeathTest** test);
90 virtual ~DeathTest() {}
93 class ReturnSentinel {
95 explicit ReturnSentinel(DeathTest* test) : test_(test) {}
96 ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
99 DeathTest*
const test_;
100 ReturnSentinel(
const ReturnSentinel&) =
delete;
101 ReturnSentinel& operator=(
const ReturnSentinel&) =
delete;
102 } GTEST_ATTRIBUTE_UNUSED_;
109 enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
113 TEST_ENCOUNTERED_RETURN_STATEMENT,
114 TEST_THREW_EXCEPTION,
119 virtual TestRole AssumeRole() = 0;
122 virtual int Wait() = 0;
131 virtual bool Passed(
bool exit_status_ok) = 0;
134 virtual void Abort(AbortReason reason) = 0;
138 static const char* LastMessage();
140 static void set_last_death_test_message(
const std::string& message);
144 static std::string last_death_test_message_;
146 DeathTest(
const DeathTest&) =
delete;
147 DeathTest& operator=(
const DeathTest&) =
delete;
150GTEST_DISABLE_MSC_WARNINGS_POP_()
153class DeathTestFactory {
155 virtual ~DeathTestFactory() {}
156 virtual bool Create(
const char* statement,
157 Matcher<const std::string&> matcher,
const char* file,
158 int line, DeathTest** test) = 0;
162class DefaultDeathTestFactory :
public DeathTestFactory {
164 bool Create(
const char* statement, Matcher<const std::string&> matcher,
165 const char* file,
int line, DeathTest** test)
override;
170GTEST_API_
bool ExitedUnsuccessfully(
int exit_status);
175inline Matcher<const ::std::string&> MakeDeathTestMatcher(
177 return ContainsRegex(regex.pattern());
179inline Matcher<const ::std::string&> MakeDeathTestMatcher(
const char* regex) {
180 return ContainsRegex(regex);
182inline Matcher<const ::std::string&> MakeDeathTestMatcher(
183 const ::std::string& regex) {
184 return ContainsRegex(regex);
189inline Matcher<const ::std::string&> MakeDeathTestMatcher(
190 Matcher<const ::std::string&> matcher) {
196#if GTEST_HAS_EXCEPTIONS
197#define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
199 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
200 } catch (const ::std::exception& gtest_exception) { \
203 "\n%s: Caught std::exception-derived exception escaping the " \
204 "death test statement. Exception message: %s\n", \
205 ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
206 gtest_exception.what()); \
208 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
210 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
214#define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
215 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
221#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \
222 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
223 if (::testing::internal::AlwaysTrue()) { \
224 ::testing::internal::DeathTest* gtest_dt; \
225 if (!::testing::internal::DeathTest::Create( \
227 ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \
228 __FILE__, __LINE__, >est_dt)) { \
229 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
231 if (gtest_dt != nullptr) { \
232 std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \
233 switch (gtest_dt->AssumeRole()) { \
234 case ::testing::internal::DeathTest::OVERSEE_TEST: \
235 if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
236 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
239 case ::testing::internal::DeathTest::EXECUTE_TEST: { \
240 ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \
242 GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
243 gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
249 GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \
250 : fail(::testing::internal::DeathTest::LastMessage())
259#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \
260 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
261 if (::testing::internal::AlwaysTrue()) { \
262 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
263 } else if (!::testing::internal::AlwaysTrue()) { \
264 ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \
271class InternalRunDeathTestFlag {
273 InternalRunDeathTestFlag(
const std::string& a_file,
int a_line,
int an_index,
275 : file_(a_file), line_(a_line), index_(an_index), write_fd_(a_write_fd) {}
277 ~InternalRunDeathTestFlag() {
278 if (write_fd_ >= 0) posix::Close(write_fd_);
281 const std::string& file()
const {
return file_; }
282 int line()
const {
return line_; }
283 int index()
const {
return index_; }
284 int write_fd()
const {
return write_fd_; }
292 InternalRunDeathTestFlag(
const InternalRunDeathTestFlag&) =
delete;
293 InternalRunDeathTestFlag& operator=(
const InternalRunDeathTestFlag&) =
delete;
299InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
Definition gtest-port.h:894