Googletest export

Accept gmock matchers in EXPECT_EXIT and friends to allow matches other than simple regex matches on death output.

PiperOrigin-RevId: 223035409
This commit is contained in:
durandal
2018-11-27 15:17:28 -05:00
committed by Gennadiy Civil
parent 191f9336bc
commit b22d23667b
5 changed files with 335 additions and 249 deletions

View File

@@ -31,6 +31,8 @@
// Tests for death tests.
#include "gtest/gtest-death-test.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "gtest/internal/gtest-filepath.h"
@@ -59,6 +61,8 @@ using testing::internal::AlwaysTrue;
namespace posix = ::testing::internal::posix;
using testing::HasSubstr;
using testing::Matcher;
using testing::Message;
using testing::internal::DeathTest;
using testing::internal::DeathTestFactory;
@@ -97,6 +101,8 @@ class ReplaceDeathTestFactory {
} // namespace internal
} // namespace testing
namespace {
void DieWithMessage(const ::std::string& message) {
fprintf(stderr, "%s", message.c_str());
fflush(stderr); // Make sure the text is printed before the process exits.
@@ -452,16 +458,12 @@ TEST_F(TestForDeathTest, MixedStyles) {
# if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD
namespace {
bool pthread_flag;
void SetPthreadFlag() {
pthread_flag = true;
}
} // namespace
TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {
if (!testing::GTEST_FLAG(death_test_use_fork)) {
testing::GTEST_FLAG(death_test_style) = "threadsafe";
@@ -885,7 +887,7 @@ class MockDeathTestFactory : public DeathTestFactory {
public:
MockDeathTestFactory();
virtual bool Create(const char* statement,
const ::testing::internal::RE* regex,
testing::Matcher<const std::string&> matcher,
const char* file, int line, DeathTest** test);
// Sets the parameters for subsequent calls to Create.
@@ -1000,11 +1002,9 @@ void MockDeathTestFactory::SetParameters(bool create,
// Sets test to NULL (if create_ is false) or to the address of a new
// MockDeathTest object with parameters taken from the last call
// to SetParameters (if create_ is true). Always returns true.
bool MockDeathTestFactory::Create(const char* /*statement*/,
const ::testing::internal::RE* /*regex*/,
const char* /*file*/,
int /*line*/,
DeathTest** test) {
bool MockDeathTestFactory::Create(
const char* /*statement*/, testing::Matcher<const std::string&> /*matcher*/,
const char* /*file*/, int /*line*/, DeathTest** test) {
test_deleted_ = false;
if (create_) {
*test = new MockDeathTest(this, role_, status_, passed_);
@@ -1326,8 +1326,60 @@ TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInThreadSafeStyle) {
}, "Inside");
}
void DieWithMessage(const char* message) {
fputs(message, stderr);
fflush(stderr); // Make sure the text is printed before the process exits.
_exit(1);
}
TEST(MatcherDeathTest, DoesNotBreakBareRegexMatching) {
// googletest tests this, of course; here we ensure that including googlemock
// has not broken it.
EXPECT_DEATH(DieWithMessage("O, I die, Horatio."), "I d[aeiou]e");
}
TEST(MatcherDeathTest, MonomorphicMatcherMatches) {
EXPECT_DEATH(DieWithMessage("Behind O, I am slain!"),
Matcher<const std::string&>(HasSubstr("I am slain")));
}
TEST(MatcherDeathTest, MonomorphicMatcherDoesNotMatch) {
EXPECT_NONFATAL_FAILURE(
EXPECT_DEATH(DieWithMessage("Behind O, I am slain!"),
Matcher<const std::string&>(HasSubstr("Ow, I am slain"))),
"Expected: has substring \"Ow, I am slain\"");
}
TEST(MatcherDeathTest, PolymorphicMatcherMatches) {
EXPECT_DEATH(DieWithMessage("The rest is silence."),
HasSubstr("rest is silence"));
}
TEST(MatcherDeathTest, PolymorphicMatcherDoesNotMatch) {
EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieWithMessage("The rest is silence."),
HasSubstr("rest is science")),
"Expected: has substring \"rest is science\"");
}
TEST(MatcherDeathTest, CompositeMatcherMatches) {
EXPECT_DEATH(DieWithMessage("Et tu, Brute! Then fall, Caesar."),
AllOf(HasSubstr("Et tu"), HasSubstr("fall, Caesar")));
}
TEST(MatcherDeathTest, CompositeMatcherDoesNotMatch) {
EXPECT_NONFATAL_FAILURE(
EXPECT_DEATH(DieWithMessage("The rest is silence."),
AnyOf(HasSubstr("Eat two"), HasSubstr("lol Caesar"))),
"Expected: (has substring \"Eat two\") or "
"(has substring \"lol Caesar\")");
}
} // namespace
#else // !GTEST_HAS_DEATH_TEST follows
namespace {
using testing::internal::CaptureStderr;
using testing::internal::GetCapturedStderr;
@@ -1376,8 +1428,12 @@ TEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) {
EXPECT_EQ(1, n);
}
} // namespace
#endif // !GTEST_HAS_DEATH_TEST
namespace {
// Tests that the death test macros expand to code which may or may not
// be followed by operator<<, and that in either case the complete text
// comprises only a single C++ statement.
@@ -1428,3 +1484,5 @@ TEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) {
TEST(NotADeathTest, Test) {
SUCCEED();
}
} // namespace