39 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 40 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 60 #if GTEST_HAS_DEATH_TEST 89 const char* file,
int line, DeathTest** test);
91 virtual ~DeathTest() {}
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;
154 class DeathTestFactory {
156 virtual ~DeathTestFactory() {}
157 virtual bool Create(
const char* statement,
159 int line, DeathTest** test) = 0;
163 class DefaultDeathTestFactory :
public DeathTestFactory {
166 const char* file,
int line, DeathTest** test)
override;
171 GTEST_API_ bool ExitedUnsuccessfully(
int exit_status);
178 return ContainsRegex(regex.
pattern());
181 return ContainsRegex(regex);
184 const ::std::string& regex) {
185 return ContainsRegex(regex);
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 ::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); \ 272 class 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;
300 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
302 #endif // GTEST_HAS_DEATH_TEST 307 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
GTEST_DECLARE_string_(internal_run_death_test)
const char kDeathTestUseFork[]
const char kInternalRunDeathTestFlag[]
const char kDeathTestStyleFlag[]
GTEST_DISABLE_MSC_WARNINGS_POP_() inline const char *SkipComma(const char *str)
const char * pattern() const
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251) class GTEST_API_ TypedTestSuitePState