1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker // 5*6777b538SAndroid Build Coastguard Worker // Testing utilities that extend gtest. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #ifndef NET_TEST_GTEST_UTIL_H_ 8*6777b538SAndroid Build Coastguard Worker #define NET_TEST_GTEST_UTIL_H_ 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <string> 11*6777b538SAndroid Build Coastguard Worker #include <string_view> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/test/mock_log.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/test/scoped_disable_exit_on_dfatal.h" 16*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock-matchers.h" 17*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h" 18*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h" 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace net::test { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // A GMock matcher that checks whether the argument is the expected net::Error. 23*6777b538SAndroid Build Coastguard Worker // On failure, the expected and actual net::Error names will be printed. 24*6777b538SAndroid Build Coastguard Worker // Usage: EXPECT_THAT(foo(), IsError(net::ERR_INVALID_ARGUMENT)); 25*6777b538SAndroid Build Coastguard Worker MATCHER_P(IsError, 26*6777b538SAndroid Build Coastguard Worker expected, 27*6777b538SAndroid Build Coastguard Worker std::string(negation ? "not " : "") + net::ErrorToString(expected)) { 28*6777b538SAndroid Build Coastguard Worker if (arg <= 0) 29*6777b538SAndroid Build Coastguard Worker *result_listener << net::ErrorToString(arg); 30*6777b538SAndroid Build Coastguard Worker return arg == expected; 31*6777b538SAndroid Build Coastguard Worker } 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker // Shorthand for IsError(net::OK). 34*6777b538SAndroid Build Coastguard Worker // Usage: EXPECT_THAT(foo(), IsOk()); 35*6777b538SAndroid Build Coastguard Worker MATCHER(IsOk, 36*6777b538SAndroid Build Coastguard Worker std::string(negation ? "not " : "") + net::ErrorToString(net::OK)) { 37*6777b538SAndroid Build Coastguard Worker if (arg <= 0) 38*6777b538SAndroid Build Coastguard Worker *result_listener << net::ErrorToString(arg); 39*6777b538SAndroid Build Coastguard Worker return arg == net::OK; 40*6777b538SAndroid Build Coastguard Worker } 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker // A gMock matcher for base::StringPiece arguments. 43*6777b538SAndroid Build Coastguard Worker // gMock's built-in HasSubstrMatcher does not work, 44*6777b538SAndroid Build Coastguard Worker // because base::StringPiece cannot be implicitly converted to std::string. 45*6777b538SAndroid Build Coastguard Worker class StringPieceHasSubstrMatcher { 46*6777b538SAndroid Build Coastguard Worker public: StringPieceHasSubstrMatcher(const std::string & substring)47*6777b538SAndroid Build Coastguard Worker explicit StringPieceHasSubstrMatcher(const std::string& substring) 48*6777b538SAndroid Build Coastguard Worker : substring_(substring) {} 49*6777b538SAndroid Build Coastguard Worker StringPieceHasSubstrMatcher(const StringPieceHasSubstrMatcher&) = default; 50*6777b538SAndroid Build Coastguard Worker StringPieceHasSubstrMatcher& operator=(const StringPieceHasSubstrMatcher&) = 51*6777b538SAndroid Build Coastguard Worker default; 52*6777b538SAndroid Build Coastguard Worker MatchAndExplain(std::string_view s,::testing::MatchResultListener * listener)53*6777b538SAndroid Build Coastguard Worker bool MatchAndExplain(std::string_view s, 54*6777b538SAndroid Build Coastguard Worker ::testing::MatchResultListener* listener) const { 55*6777b538SAndroid Build Coastguard Worker return s.find(substring_) != std::string::npos; 56*6777b538SAndroid Build Coastguard Worker } 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker // Describe what this matcher matches. DescribeTo(std::ostream * os)59*6777b538SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const { 60*6777b538SAndroid Build Coastguard Worker *os << "has substring " << substring_; 61*6777b538SAndroid Build Coastguard Worker } 62*6777b538SAndroid Build Coastguard Worker DescribeNegationTo(std::ostream * os)63*6777b538SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const { 64*6777b538SAndroid Build Coastguard Worker *os << "has no substring " << substring_; 65*6777b538SAndroid Build Coastguard Worker } 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker private: 68*6777b538SAndroid Build Coastguard Worker std::string substring_; 69*6777b538SAndroid Build Coastguard Worker }; 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker // Internal implementation for the EXPECT_DFATAL and ASSERT_DFATAL 72*6777b538SAndroid Build Coastguard Worker // macros. Do not use this directly. 73*6777b538SAndroid Build Coastguard Worker #define GTEST_DFATAL_(statement, matcher, fail) \ 74*6777b538SAndroid Build Coastguard Worker do { \ 75*6777b538SAndroid Build Coastguard Worker ::base::test::MockLog gtest_log; \ 76*6777b538SAndroid Build Coastguard Worker ::net::test::ScopedDisableExitOnDFatal gtest_disable_exit; \ 77*6777b538SAndroid Build Coastguard Worker using ::testing::_; \ 78*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(gtest_log, Log(_, _, _, _, _)) \ 79*6777b538SAndroid Build Coastguard Worker .WillRepeatedly(::testing::Return(false)); \ 80*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(gtest_log, Log(::logging::LOGGING_DFATAL, _, _, _, matcher)) \ 81*6777b538SAndroid Build Coastguard Worker .Times(::testing::AtLeast(1)) \ 82*6777b538SAndroid Build Coastguard Worker .WillOnce(::testing::Return(false)); \ 83*6777b538SAndroid Build Coastguard Worker gtest_log.StartCapturingLogs(); \ 84*6777b538SAndroid Build Coastguard Worker { statement; } \ 85*6777b538SAndroid Build Coastguard Worker gtest_log.StopCapturingLogs(); \ 86*6777b538SAndroid Build Coastguard Worker if (!testing::Mock::VerifyAndClear(>est_log)) \ 87*6777b538SAndroid Build Coastguard Worker fail(""); \ 88*6777b538SAndroid Build Coastguard Worker } while (false) 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // The EXPECT_DFATAL and ASSERT_DFATAL macros are lightweight 91*6777b538SAndroid Build Coastguard Worker // alternatives to EXPECT_DEBUG_DEATH and ASSERT_DEBUG_DEATH. They 92*6777b538SAndroid Build Coastguard Worker // are appropriate for testing that your code logs a message at the 93*6777b538SAndroid Build Coastguard Worker // DFATAL level. 94*6777b538SAndroid Build Coastguard Worker // 95*6777b538SAndroid Build Coastguard Worker // Unlike EXPECT_DEBUG_DEATH and ASSERT_DEBUG_DEATH, these macros 96*6777b538SAndroid Build Coastguard Worker // execute the given statement in the current process, not a forked 97*6777b538SAndroid Build Coastguard Worker // one. This works because we disable exiting the program for 98*6777b538SAndroid Build Coastguard Worker // LOG(DFATAL). This makes the tests run more quickly. 99*6777b538SAndroid Build Coastguard Worker // 100*6777b538SAndroid Build Coastguard Worker // The _WITH() variants allow one to specify any matcher for the 101*6777b538SAndroid Build Coastguard Worker // DFATAL log message, whereas the other variants assume a regex. 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker #define EXPECT_DFATAL_WITH(statement, matcher) \ 104*6777b538SAndroid Build Coastguard Worker GTEST_DFATAL_(statement, matcher, GTEST_NONFATAL_FAILURE_) 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker #define ASSERT_DFATAL_WITH(statement, matcher) \ 107*6777b538SAndroid Build Coastguard Worker GTEST_DFATAL_(statement, matcher, GTEST_FATAL_FAILURE_) 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker #define EXPECT_DFATAL(statement, regex) \ 110*6777b538SAndroid Build Coastguard Worker EXPECT_DFATAL_WITH(statement, ::testing::ContainsRegex(regex)) 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker #define ASSERT_DFATAL(statement, regex) \ 113*6777b538SAndroid Build Coastguard Worker ASSERT_DFATAL_WITH(statement, ::testing::ContainsRegex(regex)) 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker } // namespace net::test 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker #endif // NET_TEST_GTEST_UTIL_H_ 118