summaryrefslogtreecommitdiffstats
path: root/chromium/net/test/gtest_util.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/test/gtest_util.h')
-rw-r--r--chromium/net/test/gtest_util.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/chromium/net/test/gtest_util.h b/chromium/net/test/gtest_util.h
new file mode 100644
index 00000000000..14492c2a780
--- /dev/null
+++ b/chromium/net/test/gtest_util.h
@@ -0,0 +1,99 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Testing utilities that extend gtest.
+
+#ifndef NET_QUIC_TEST_TOOLS_GTEST_UTIL_H_
+#define NET_QUIC_TEST_TOOLS_GTEST_UTIL_H_
+
+#include "net/test/scoped_disable_exit_on_dfatal.h"
+#include "net/test/scoped_mock_log.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+namespace test {
+
+// Internal implementation for the EXPECT_DFATAL and ASSERT_DFATAL
+// macros. Do not use this directly.
+#define GTEST_DFATAL_(statement, matcher, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (true) { \
+ ::net::test::ScopedMockLog gtest_log; \
+ ::net::test::ScopedDisableExitOnDFatal gtest_disable_exit; \
+ using ::testing::_; \
+ EXPECT_CALL(gtest_log, Log(_, _, _, _, _)) \
+ .WillRepeatedly(::testing::Return(false)); \
+ EXPECT_CALL(gtest_log, Log(logging::LOG_DFATAL, _, _, _, matcher)) \
+ .Times(::testing::AtLeast(1)) \
+ .WillOnce(::testing::Return(false)); \
+ gtest_log.StartCapturingLogs(); \
+ { statement; } \
+ gtest_log.StopCapturingLogs(); \
+ if (!testing::Mock::VerifyAndClear(&gtest_log)) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_dfatal_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_dfatal_, __LINE__): \
+ fail("")
+
+// The EXPECT_DFATAL and ASSERT_DFATAL macros are lightweight
+// alternatives to EXPECT_DEBUG_DEATH and ASSERT_DEBUG_DEATH. They
+// are appropriate for testing that your code logs a message at the
+// DFATAL level.
+//
+// Unlike EXPECT_DEBUG_DEATH and ASSERT_DEBUG_DEATH, these macros
+// execute the given statement in the current process, not a forked
+// one. This works because we disable exiting the program for
+// LOG(DFATAL). This makes the tests run more quickly.
+//
+// The _WITH() variants allow one to specify any matcher for the
+// DFATAL log message, whereas the other variants assume a regex.
+
+#define EXPECT_DFATAL_WITH(statement, matcher) \
+ GTEST_DFATAL_(statement, matcher, GTEST_NONFATAL_FAILURE_)
+
+#define ASSERT_DFATAL_WITH(statement, matcher) \
+ GTEST_DFATAL_(statement, matcher, GTEST_FATAL_FAILURE_)
+
+#define EXPECT_DFATAL(statement, regex) \
+ EXPECT_DFATAL_WITH(statement, ::testing::ContainsRegex(regex))
+
+#define ASSERT_DFATAL(statement, regex) \
+ ASSERT_DFATAL_WITH(statement, ::testing::ContainsRegex(regex))
+
+// The EXPECT_DEBUG_DFATAL and ASSERT_DEBUG_DFATAL macros are similar to
+// EXPECT_DFATAL and ASSERT_DFATAL. Use them in conjunction with DLOG(DFATAL)
+// or similar macros that produce no-op in opt build and DFATAL in dbg build.
+
+#ifndef NDEBUG
+
+#define EXPECT_DEBUG_DFATAL(statement, regex) \
+ EXPECT_DFATAL(statement, regex)
+#define ASSERT_DEBUG_DFATAL(statement, regex) \
+ ASSERT_DFATAL(statement, regex)
+
+#else // NDEBUG
+
+#define EXPECT_DEBUG_DFATAL(statement, regex) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (true) { \
+ (void)(regex); \
+ statement; \
+ } else \
+ GTEST_NONFATAL_FAILURE_("")
+#define ASSERT_DEBUG_DFATAL(statement, regex) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (true) { \
+ (void)(regex); \
+ statement; \
+ } else \
+ GTEST_NONFATAL_FAILURE_("")
+
+#endif // NDEBUG
+
+} // namespace test
+} // namespace net
+
+#endif // NET_QUIC_TEST_TOOLS_GTEST_UTIL_H_