xref: /aosp_15_r20/external/cronet/net/test/gtest_util.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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(&gtest_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