37 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 38 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 40 #include "gtest/internal/gtest-internal.h" 56 #if GTEST_HAS_DEATH_TEST 82 static bool Create(
const char * statement,
const RE * regex,
83 const char * file,
int line, DeathTest **
test);
85 virtual ~DeathTest() { }
91 explicit ReturnSentinel(DeathTest *
test) : test_(test) { }
92 ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
94 DeathTest *
const test_;
103 enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
108 TEST_ENCOUNTERED_RETURN_STATEMENT,
109 TEST_THREW_EXCEPTION,
114 virtual TestRole AssumeRole() = 0;
117 virtual int Wait() = 0;
126 virtual bool Passed(
bool exit_status_ok) = 0;
129 virtual void Abort(AbortReason reason) = 0;
133 static const char * LastMessage();
145 class DeathTestFactory
148 virtual ~DeathTestFactory() { }
149 virtual bool Create(
const char * statement,
const RE * regex,
150 const char * file,
int line, DeathTest **
test) = 0;
154 class DefaultDeathTestFactory :
public DeathTestFactory
157 virtual bool Create(
const char * statement,
const RE * regex,
158 const char * file,
int line, DeathTest **
test);
163 GTEST_API_ bool ExitedUnsuccessfully(
int exit_status);
167 # if GTEST_HAS_EXCEPTIONS 168 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ 170 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 171 } catch (const ::std::exception& gtest_exception) { \ 174 "\n%s: Caught std::exception-derived exception escaping the " \ 175 "death test statement. Exception message: %s\n", \ 176 ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ 177 gtest_exception.what()); \ 179 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ 181 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ 185 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ 186 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) 192 # define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ 193 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 194 if (::testing::internal::AlwaysTrue()) { \ 195 const ::testing::internal::RE& gtest_regex = (regex); \ 196 ::testing::internal::DeathTest* gtest_dt; \ 197 if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ 198 __FILE__, __LINE__, >est_dt)) { \ 199 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ 201 if (gtest_dt != NULL) { \ 202 ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ 203 gtest_dt_ptr(gtest_dt); \ 204 switch (gtest_dt->AssumeRole()) { \ 205 case ::testing::internal::DeathTest::OVERSEE_TEST: \ 206 if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ 207 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ 210 case ::testing::internal::DeathTest::EXECUTE_TEST: { \ 211 ::testing::internal::DeathTest::ReturnSentinel \ 212 gtest_sentinel(gtest_dt); \ 213 GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ 214 gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ 222 GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ 223 fail(::testing::internal::DeathTest::LastMessage()) 231 # define GTEST_EXECUTE_STATEMENT_(statement, regex) \ 232 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 233 if (::testing::internal::AlwaysTrue()) { \ 234 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 241 class InternalRunDeathTestFlag
244 InternalRunDeathTestFlag(
const std::string & a_file,
248 : file_(a_file), line_(a_line), index_(an_index),
249 write_fd_(a_write_fd) {}
251 ~InternalRunDeathTestFlag()
258 int line()
const {
return line_; }
259 int index()
const {
return index_; }
260 int write_fd()
const {
return write_fd_; }
274 InternalRunDeathTestFlag * ParseInternalRunDeathTestFlag();
276 #else // GTEST_HAS_DEATH_TEST 310 # define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \ 311 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 312 if (::testing::internal::AlwaysTrue()) { \ 313 GTEST_LOG_(WARNING) \ 314 << "Death tests are not supported on this platform.\n" \ 315 << "Statement '" #statement "' cannot be verified."; \ 316 } else if (::testing::internal::AlwaysFalse()) { \ 317 ::testing::internal::RE::PartialMatch(".*", (regex)); \ 318 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 323 #endif // GTEST_HAS_DEATH_TEST 328 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ const char kDeathTestUseFork[]
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)
class testing::internal::GTestFlagSaver GTEST_ATTRIBUTE_UNUSED_
const char kDeathTestStyleFlag[]
GTEST_DECLARE_string_(internal_run_death_test)
const char kInternalRunDeathTestFlag[]