File indexing completed on 2025-10-31 09:05:24
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 
0014 
0015 
0016 
0017 
0018 
0019 
0020 
0021 
0022 
0023 
0024 
0025 
0026 
0027 
0028 
0029 
0030 
0031 
0032 
0033 
0034 
0035 
0036 
0037 
0038 
0039 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
0040 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
0041 
0042 #include <stdio.h>
0043 
0044 #include <memory>
0045 #include <string>
0046 
0047 #include "gtest/gtest-matchers.h"
0048 #include "gtest/internal/gtest-internal.h"
0049 #include "gtest/internal/gtest-port.h"
0050 
0051 GTEST_DECLARE_string_(internal_run_death_test);
0052 
0053 namespace testing {
0054 namespace internal {
0055 
0056 
0057 const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
0058 
0059 
0060 
0061 
0062 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
0063     ::testing::internal::RE regex) {
0064   return ContainsRegex(regex.pattern());
0065 }
0066 inline Matcher<const ::std::string&> MakeDeathTestMatcher(const char* regex) {
0067   return ContainsRegex(regex);
0068 }
0069 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
0070     const ::std::string& regex) {
0071   return ContainsRegex(regex);
0072 }
0073 
0074 
0075 
0076 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
0077     Matcher<const ::std::string&> matcher) {
0078   return matcher;
0079 }
0080 
0081 #ifdef GTEST_HAS_DEATH_TEST
0082 
0083 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
0084 )
0085 
0086 
0087 
0088 
0089 
0090 
0091 
0092 
0093 
0094 
0095 
0096 
0097 
0098 
0099 class GTEST_API_ DeathTest {
0100  public:
0101   
0102   
0103   
0104   
0105   
0106   
0107   
0108   
0109   static bool Create(const char* statement, Matcher<const std::string&> matcher,
0110                      const char* file, int line, DeathTest** test);
0111   DeathTest();
0112   virtual ~DeathTest() = default;
0113 
0114   
0115   class ReturnSentinel {
0116    public:
0117     explicit ReturnSentinel(DeathTest* test) : test_(test) {}
0118     ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
0119 
0120    private:
0121     DeathTest* const test_;
0122     ReturnSentinel(const ReturnSentinel&) = delete;
0123     ReturnSentinel& operator=(const ReturnSentinel&) = delete;
0124   };
0125 
0126   
0127   
0128   
0129   
0130   
0131   enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
0132 
0133   
0134   enum AbortReason {
0135     TEST_ENCOUNTERED_RETURN_STATEMENT,
0136     TEST_THREW_EXCEPTION,
0137     TEST_DID_NOT_DIE
0138   };
0139 
0140   
0141   virtual TestRole AssumeRole() = 0;
0142 
0143   
0144   virtual int Wait() = 0;
0145 
0146   
0147   
0148   
0149   
0150   
0151   
0152   
0153   virtual bool Passed(bool exit_status_ok) = 0;
0154 
0155   
0156   virtual void Abort(AbortReason reason) = 0;
0157 
0158   
0159   
0160   static const char* LastMessage();
0161 
0162   static void set_last_death_test_message(const std::string& message);
0163 
0164  private:
0165   
0166   static std::string last_death_test_message_;
0167 
0168   DeathTest(const DeathTest&) = delete;
0169   DeathTest& operator=(const DeathTest&) = delete;
0170 };
0171 
0172 GTEST_DISABLE_MSC_WARNINGS_POP_()  
0173 
0174 
0175 class DeathTestFactory {
0176  public:
0177   virtual ~DeathTestFactory() = default;
0178   virtual bool Create(const char* statement,
0179                       Matcher<const std::string&> matcher, const char* file,
0180                       int line, DeathTest** test) = 0;
0181 };
0182 
0183 
0184 class DefaultDeathTestFactory : public DeathTestFactory {
0185  public:
0186   bool Create(const char* statement, Matcher<const std::string&> matcher,
0187               const char* file, int line, DeathTest** test) override;
0188 };
0189 
0190 
0191 
0192 GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
0193 
0194 
0195 
0196 #if GTEST_HAS_EXCEPTIONS
0197 #define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test)           \
0198   try {                                                                      \
0199     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);               \
0200   } catch (const ::std::exception& gtest_exception) {                        \
0201     fprintf(                                                                 \
0202         stderr,                                                              \
0203         "\n%s: Caught std::exception-derived exception escaping the "        \
0204         "death test statement. Exception message: %s\n",                     \
0205         ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
0206         gtest_exception.what());                                             \
0207     fflush(stderr);                                                          \
0208     death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
0209   } catch (...) {                                                            \
0210     death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
0211   }
0212 
0213 #else
0214 #define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
0215   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
0216 
0217 #endif
0218 
0219 
0220 
0221 #define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail)        \
0222   GTEST_AMBIGUOUS_ELSE_BLOCKER_                                                \
0223   if (::testing::internal::AlwaysTrue()) {                                     \
0224     ::testing::internal::DeathTest* gtest_dt;                                  \
0225     if (!::testing::internal::DeathTest::Create(                               \
0226             #statement,                                                        \
0227             ::testing::internal::MakeDeathTestMatcher(regex_or_matcher),       \
0228             __FILE__, __LINE__, >est_dt)) {                                  \
0229       goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__);                        \
0230     }                                                                          \
0231     if (gtest_dt != nullptr) {                                                 \
0232       std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \
0233       switch (gtest_dt->AssumeRole()) {                                        \
0234         case ::testing::internal::DeathTest::OVERSEE_TEST:                     \
0235           if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) {                \
0236             goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__);                  \
0237           }                                                                    \
0238           break;                                                               \
0239         case ::testing::internal::DeathTest::EXECUTE_TEST: {                   \
0240           const ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \
0241               gtest_dt);                                                       \
0242           GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt);            \
0243           gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE);   \
0244           break;                                                               \
0245         }                                                                      \
0246       }                                                                        \
0247     }                                                                          \
0248   } else                                                                       \
0249     GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__)                                \
0250         : fail(::testing::internal::DeathTest::LastMessage())
0251 
0252 
0253 
0254 
0255 
0256 
0257 
0258 
0259 #define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher)    \
0260   GTEST_AMBIGUOUS_ELSE_BLOCKER_                                  \
0261   if (::testing::internal::AlwaysTrue()) {                       \
0262     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);   \
0263   } else if (!::testing::internal::AlwaysTrue()) {               \
0264     ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \
0265   } else                                                         \
0266     ::testing::Message()
0267 
0268 
0269 
0270 
0271 class InternalRunDeathTestFlag {
0272  public:
0273   InternalRunDeathTestFlag(const std::string& a_file, int a_line, int an_index,
0274                            int a_write_fd)
0275       : file_(a_file), line_(a_line), index_(an_index), write_fd_(a_write_fd) {}
0276 
0277   ~InternalRunDeathTestFlag() {
0278     if (write_fd_ >= 0) posix::Close(write_fd_);
0279   }
0280 
0281   const std::string& file() const { return file_; }
0282   int line() const { return line_; }
0283   int index() const { return index_; }
0284   int write_fd() const { return write_fd_; }
0285 
0286  private:
0287   std::string file_;
0288   int line_;
0289   int index_;
0290   int write_fd_;
0291 
0292   InternalRunDeathTestFlag(const InternalRunDeathTestFlag&) = delete;
0293   InternalRunDeathTestFlag& operator=(const InternalRunDeathTestFlag&) = delete;
0294 };
0295 
0296 
0297 
0298 
0299 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
0300 
0301 #endif  
0302 
0303 }  
0304 }  
0305 
0306 #endif