gtest_util.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4//
5// Testing utilities that extend gtest.
6
7#ifndef NET_QUIC_TEST_TOOLS_GTEST_UTIL_H_
8#define NET_QUIC_TEST_TOOLS_GTEST_UTIL_H_
9
10#include "net/test/scoped_disable_exit_on_dfatal.h"
11#include "net/test/scoped_mock_log.h"
12#include "testing/gmock/include/gmock/gmock.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15namespace net {
16namespace test {
17
18// Internal implementation for the EXPECT_DFATAL and ASSERT_DFATAL
19// macros.  Do not use this directly.
20#define GTEST_DFATAL_(statement, matcher, fail)                         \
21  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                         \
22  if (true) {                                                           \
23    ::net::test::ScopedMockLog gtest_log;                               \
24    ::net::test::ScopedDisableExitOnDFatal gtest_disable_exit;          \
25    using ::testing::_;                                                 \
26    EXPECT_CALL(gtest_log, Log(_, _, _, _, _))                          \
27        .WillRepeatedly(::testing::Return(false));                      \
28    EXPECT_CALL(gtest_log, Log(logging::LOG_DFATAL, _, _, _, matcher))  \
29        .Times(::testing::AtLeast(1))                                   \
30        .WillOnce(::testing::Return(false));                            \
31    gtest_log.StartCapturingLogs();                                     \
32    { statement; }                                                      \
33    gtest_log.StopCapturingLogs();                                      \
34    if (!testing::Mock::VerifyAndClear(&gtest_log)) {                   \
35      goto GTEST_CONCAT_TOKEN_(gtest_label_dfatal_, __LINE__);          \
36    }                                                                   \
37  } else                                                                \
38    GTEST_CONCAT_TOKEN_(gtest_label_dfatal_, __LINE__):                 \
39        fail("")
40
41// The EXPECT_DFATAL and ASSERT_DFATAL macros are lightweight
42// alternatives to EXPECT_DEBUG_DEATH and ASSERT_DEBUG_DEATH. They
43// are appropriate for testing that your code logs a message at the
44// DFATAL level.
45//
46// Unlike EXPECT_DEBUG_DEATH and ASSERT_DEBUG_DEATH, these macros
47// execute the given statement in the current process, not a forked
48// one.  This works because we disable exiting the program for
49// LOG(DFATAL).  This makes the tests run more quickly.
50//
51// The _WITH() variants allow one to specify any matcher for the
52// DFATAL log message, whereas the other variants assume a regex.
53
54#define EXPECT_DFATAL_WITH(statement, matcher) \
55  GTEST_DFATAL_(statement, matcher, GTEST_NONFATAL_FAILURE_)
56
57#define ASSERT_DFATAL_WITH(statement, matcher) \
58  GTEST_DFATAL_(statement, matcher, GTEST_FATAL_FAILURE_)
59
60#define EXPECT_DFATAL(statement, regex) \
61  EXPECT_DFATAL_WITH(statement, ::testing::ContainsRegex(regex))
62
63#define ASSERT_DFATAL(statement, regex) \
64  ASSERT_DFATAL_WITH(statement, ::testing::ContainsRegex(regex))
65
66// The EXPECT_DEBUG_DFATAL and ASSERT_DEBUG_DFATAL macros are similar to
67// EXPECT_DFATAL and ASSERT_DFATAL. Use them in conjunction with DLOG(DFATAL)
68// or similar macros that produce no-op in opt build and DFATAL in dbg build.
69
70#ifndef NDEBUG
71
72#define EXPECT_DEBUG_DFATAL(statement, regex) \
73  EXPECT_DFATAL(statement, regex)
74#define ASSERT_DEBUG_DFATAL(statement, regex) \
75  ASSERT_DFATAL(statement, regex)
76
77#else  // NDEBUG
78
79#define EXPECT_DEBUG_DFATAL(statement, regex) \
80  GTEST_AMBIGUOUS_ELSE_BLOCKER_               \
81  if (true) {                                 \
82    (void)(regex);                            \
83    statement;                                \
84  } else                                      \
85    GTEST_NONFATAL_FAILURE_("")
86#define ASSERT_DEBUG_DFATAL(statement, regex) \
87  GTEST_AMBIGUOUS_ELSE_BLOCKER_               \
88  if (true) {                                 \
89    (void)(regex);                            \
90    statement;                                \
91  } else                                      \
92    GTEST_NONFATAL_FAILURE_("")
93
94#endif  // NDEBUG
95
96}  // namespace test
97}  // namespace net
98
99#endif  // NET_QUIC_TEST_TOOLS_GTEST_UTIL_H_
100