diff options
Diffstat (limited to 'chromium/net/test/gtest_util.h')
-rw-r--r-- | chromium/net/test/gtest_util.h | 99 |
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(>est_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_ |