diff --git a/bazel/external/quiche.BUILD b/bazel/external/quiche.BUILD index e41693b201776..149db513f83f3 100644 --- a/bazel/external/quiche.BUILD +++ b/bazel/external/quiche.BUILD @@ -62,13 +62,15 @@ cc_library( "quiche/http2/platform/api/http2_string.h", "quiche/http2/platform/api/http2_string_piece.h", # TODO: uncomment the following files as implementations are added. - # "quiche/http2/platform/api/http2_bug_tracker.h", # "quiche/http2/platform/api/http2_flags.h", - # "quiche/http2/platform/api/http2_mock_log.h", # "quiche/http2/platform/api/http2_reconstruct_object.h", # "quiche/http2/platform/api/http2_test_helpers.h", ] + envoy_select_quiche( - ["quiche/http2/platform/api/http2_string_utils.h"], + [ + "quiche/http2/platform/api/http2_bug_tracker.h", + "quiche/http2/platform/api/http2_logging.h", + "quiche/http2/platform/api/http2_string_utils.h", + ], "@envoy", ), visibility = ["//visibility:public"], @@ -90,7 +92,11 @@ cc_library( # TODO: uncomment the following files as implementations are added. # "quiche/spdy/platform/api/spdy_flags.h", ] + envoy_select_quiche( - ["quiche/spdy/platform/api/spdy_string_utils.h"], + [ + "quiche/spdy/platform/api/spdy_bug_tracker.h", + "quiche/spdy/platform/api/spdy_logging.h", + "quiche/spdy/platform/api/spdy_string_utils.h", + ], "@envoy", ), visibility = ["//visibility:public"], @@ -130,7 +136,6 @@ cc_library( hdrs = [ "quiche/quic/platform/api/quic_aligned.h", "quiche/quic/platform/api/quic_arraysize.h", - "quiche/quic/platform/api/quic_bug_tracker.h", "quiche/quic/platform/api/quic_client_stats.h", "quiche/quic/platform/api/quic_containers.h", "quiche/quic/platform/api/quic_endian.h", @@ -139,21 +144,16 @@ cc_library( "quiche/quic/platform/api/quic_fallthrough.h", "quiche/quic/platform/api/quic_flag_utils.h", "quiche/quic/platform/api/quic_iovec.h", - "quiche/quic/platform/api/quic_logging.h", "quiche/quic/platform/api/quic_map_util.h", - "quiche/quic/platform/api/quic_mock_log.h", "quiche/quic/platform/api/quic_prefetch.h", "quiche/quic/platform/api/quic_ptr_util.h", "quiche/quic/platform/api/quic_reference_counted.h", "quiche/quic/platform/api/quic_server_stats.h", - "quiche/quic/platform/api/quic_stack_trace.h", "quiche/quic/platform/api/quic_string_piece.h", "quiche/quic/platform/api/quic_test_output.h", "quiche/quic/platform/api/quic_uint128.h", - "quiche/quic/platform/api/quic_thread.h", # TODO: uncomment the following files as implementations are added. # "quiche/quic/platform/api/quic_clock.h", - # "quiche/quic/platform/api/quic_expect_bug.h", # "quiche/quic/platform/api/quic_file_utils.h", # "quiche/quic/platform/api/quic_flags.h", # "quiche/quic/platform/api/quic_fuzzed_data_provider.h", @@ -166,15 +166,19 @@ cc_library( # "quiche/quic/platform/api/quic_mem_slice_storage.h", # "quiche/quic/platform/api/quic_pcc_sender.h", # "quiche/quic/platform/api/quic_socket_address.h", - # "quiche/quic/platform/api/quic_stack_trace.h", - # "quiche/quic/platform/api/quic_test.h", # "quiche/quic/platform/api/quic_test_loopback.h", # "quiche/quic/platform/api/quic_test_mem_slice_vector.h", ] + envoy_select_quiche( [ + "quiche/quic/platform/api/quic_bug_tracker.h", + "quiche/quic/platform/api/quic_expect_bug.h", + "quiche/quic/platform/api/quic_mock_log.h", + "quiche/quic/platform/api/quic_logging.h", + "quiche/quic/platform/api/quic_stack_trace.h", "quiche/quic/platform/api/quic_string_utils.h", "quiche/quic/platform/api/quic_test.h", "quiche/quic/platform/api/quic_text_utils.h", + "quiche/quic/platform/api/quic_thread.h", ], "@envoy", ), @@ -222,12 +226,11 @@ envoy_cc_test( envoy_cc_test( name = "quic_platform_test", - srcs = [ - "quiche/quic/platform/api/quic_reference_counted_test.cc", - ] + envoy_select_quiche( + srcs = envoy_select_quiche( [ - "quiche/quic/platform/api/quic_text_utils_test.cc", + "quiche/quic/platform/api/quic_reference_counted_test.cc", "quiche/quic/platform/api/quic_string_utils_test.cc", + "quiche/quic/platform/api/quic_text_utils_test.cc", ], "@envoy", ), diff --git a/source/extensions/quic_listeners/quiche/platform/BUILD b/source/extensions/quic_listeners/quiche/platform/BUILD index 922912ccef2b0..f6f8c67631a02 100644 --- a/source/extensions/quic_listeners/quiche/platform/BUILD +++ b/source/extensions/quic_listeners/quiche/platform/BUILD @@ -42,14 +42,21 @@ envoy_cc_library( "http2_ptr_util_impl.h", "http2_string_impl.h", "http2_string_piece_impl.h", - ] + envoy_select_quiche(["http2_string_utils_impl.h"]), + ] + envoy_select_quiche([ + "http2_bug_tracker_impl.h", + "http2_logging_impl.h", + "http2_string_utils_impl.h", + ]), external_deps = [ "abseil_base", "abseil_optional", "abseil_str_format", ], visibility = ["//visibility:public"], - deps = envoy_select_quiche([":string_utils_lib"]), + deps = envoy_select_quiche([ + ":quic_platform_logging_impl_lib", + ":string_utils_lib", + ]), ) envoy_cc_library( @@ -58,9 +65,19 @@ envoy_cc_library( visibility = ["//visibility:public"], ) +envoy_cc_library( + name = "quic_platform_logging_impl_lib", + srcs = ["quic_logging_impl.cc"], + hdrs = [ + "quic_bug_tracker_impl.h", + "quic_logging_impl.h", + ], + visibility = ["//visibility:public"], + deps = ["//source/common/common:assert_lib"], +) + envoy_cc_library( name = "quic_platform_base_impl_lib", - srcs = envoy_select_quiche(["quic_logging_impl.cc"]), hdrs = [ "quic_aligned_impl.h", "quic_arraysize_impl.h", @@ -79,6 +96,7 @@ envoy_cc_library( "quic_string_piece_impl.h", "quic_uint128_impl.h", ] + envoy_select_quiche([ + "quic_expect_bug_impl.h", "quic_logging_impl.h", "quic_mock_log_impl.h", "quic_stack_trace_impl.h", @@ -96,6 +114,7 @@ envoy_cc_library( ], visibility = ["//visibility:public"], deps = ["@com_googlesource_quiche//:quic_platform_export"] + envoy_select_quiche([ + ":quic_platform_logging_impl_lib", "//include/envoy/thread:thread_interface", "//source/common/common:assert_lib", "//source/server:backtrace_lib", @@ -113,7 +132,6 @@ envoy_cc_library( "quic_mutex_impl.h", "quic_str_cat_impl.h", ] + envoy_select_quiche([ - "quic_bug_tracker_impl.h", "quic_hostname_utils_impl.h", "quic_string_utils_impl.h", "quic_test_output_impl.h", @@ -157,7 +175,11 @@ envoy_cc_library( "spdy_test_helpers_impl.h", "spdy_test_utils_prod_impl.h", "spdy_unsafe_arena_impl.h", - ] + envoy_select_quiche(["spdy_string_utils_impl.h"]), + ] + envoy_select_quiche([ + "spdy_bug_tracker_impl.h", + "spdy_logging_impl.h", + "spdy_string_utils_impl.h", + ]), external_deps = [ "abseil_base", "abseil_hash", @@ -167,6 +189,7 @@ envoy_cc_library( ], visibility = ["//visibility:public"], deps = envoy_select_quiche([ + ":quic_platform_logging_impl_lib", ":string_utils_lib", "//source/common/common:assert_lib", ]), diff --git a/source/extensions/quic_listeners/quiche/platform/http2_bug_tracker_impl.h b/source/extensions/quic_listeners/quiche/platform/http2_bug_tracker_impl.h new file mode 100644 index 0000000000000..58c7039d536bb --- /dev/null +++ b/source/extensions/quic_listeners/quiche/platform/http2_bug_tracker_impl.h @@ -0,0 +1,13 @@ +#pragma once + +// NOLINT(namespace-envoy) +// +// This file is part of the QUICHE platform implementation, and is not to be +// consumed or referenced directly by other Envoy code. It serves purely as a +// porting layer for QUICHE. + +#include "extensions/quic_listeners/quiche/platform/quic_bug_tracker_impl.h" + +#define HTTP2_BUG_IMPL QUIC_BUG_IMPL +#define HTTP2_BUG_IF_IMPL QUIC_BUG_IF_IMPL +#define FLAGS_http2_always_log_bugs_for_tests_IMPL true diff --git a/source/extensions/quic_listeners/quiche/platform/http2_logging_impl.h b/source/extensions/quic_listeners/quiche/platform/http2_logging_impl.h new file mode 100644 index 0000000000000..473c2d00d4bd4 --- /dev/null +++ b/source/extensions/quic_listeners/quiche/platform/http2_logging_impl.h @@ -0,0 +1,23 @@ +#pragma once + +// NOLINT(namespace-envoy) +// +// This file is part of the QUICHE platform implementation, and is not to be +// consumed or referenced directly by other Envoy code. It serves purely as a +// porting layer for QUICHE. + +#include "extensions/quic_listeners/quiche/platform/quic_logging_impl.h" + +#define HTTP2_LOG_IMPL(severity) QUIC_LOG_IMPL(severity) + +#define HTTP2_VLOG_IMPL(verbose_level) QUIC_VLOG_IMPL(verbose_level) + +#define HTTP2_DLOG_IMPL(severity) QUIC_DLOG_IMPL(severity) + +#define HTTP2_DLOG_IF_IMPL(severity, condition) QUIC_DLOG_IF_IMPL(severity, condition) + +#define HTTP2_DVLOG_IMPL(verbose_level) QUIC_DVLOG_IMPL(verbose_level) + +#define HTTP2_DVLOG_IF_IMPL(verbose_level, condition) QUIC_DVLOG_IF_IMPL(verbose_level, condition) + +#define HTTP2_DLOG_EVERY_N_IMPL(severity, n) QUIC_DLOG_EVERY_N_IMPL(severity, n) diff --git a/source/extensions/quic_listeners/quiche/platform/quic_bug_tracker_impl.h b/source/extensions/quic_listeners/quiche/platform/quic_bug_tracker_impl.h index 4f30441d1b9ac..050bd385d8818 100644 --- a/source/extensions/quic_listeners/quiche/platform/quic_bug_tracker_impl.h +++ b/source/extensions/quic_listeners/quiche/platform/quic_bug_tracker_impl.h @@ -6,9 +6,11 @@ // consumed or referenced directly by other Envoy code. It serves purely as a // porting layer for QUICHE. -#include "quiche/quic/platform/api/quic_logging.h" +#include "extensions/quic_listeners/quiche/platform/quic_logging_impl.h" -#define QUIC_BUG_IMPL QUIC_LOG(DFATAL) -#define QUIC_BUG_IF_IMPL(condition) QUIC_LOG_IF(DFATAL, condition) -#define QUIC_PEER_BUG_IMPL QUIC_LOG(ERROR) -#define QUIC_PEER_BUG_IF_IMPL(condition) QUIC_LOG_IF(ERROR, condition) +// TODO(wub): Implement exponential back off to avoid performance problems due +// to excessive QUIC_BUG. +#define QUIC_BUG_IMPL QUIC_LOG_IMPL(DFATAL) +#define QUIC_BUG_IF_IMPL(condition) QUIC_LOG_IF_IMPL(DFATAL, condition) +#define QUIC_PEER_BUG_IMPL QUIC_LOG_IMPL(ERROR) +#define QUIC_PEER_BUG_IF_IMPL(condition) QUIC_LOG_IF_IMPL(ERROR, condition) diff --git a/source/extensions/quic_listeners/quiche/platform/quic_expect_bug_impl.h b/source/extensions/quic_listeners/quiche/platform/quic_expect_bug_impl.h new file mode 100644 index 0000000000000..213f8ab397a02 --- /dev/null +++ b/source/extensions/quic_listeners/quiche/platform/quic_expect_bug_impl.h @@ -0,0 +1,16 @@ +#pragma once + +// NOLINT(namespace-envoy) +// +// This file is part of the QUICHE platform implementation, and is not to be +// consumed or referenced directly by other Envoy code. It serves purely as a +// porting layer for QUICHE. + +#include "extensions/quic_listeners/quiche/platform/quic_logging_impl.h" +#include "extensions/quic_listeners/quiche/platform/quic_mock_log_impl.h" + +#define EXPECT_QUIC_BUG_IMPL(statement, regex) \ + EXPECT_QUIC_DFATAL_IMPL(statement, testing::ContainsRegex(regex)) + +#define EXPECT_QUIC_PEER_BUG_IMPL(statement, regex) \ + EXPECT_QUIC_LOG_IMPL(statement, ERROR, testing::ContainsRegex(regex)) diff --git a/source/extensions/quic_listeners/quiche/platform/quic_logging_impl.cc b/source/extensions/quic_listeners/quiche/platform/quic_logging_impl.cc index cee7e7decb32f..578fbffc28335 100644 --- a/source/extensions/quic_listeners/quiche/platform/quic_logging_impl.cc +++ b/source/extensions/quic_listeners/quiche/platform/quic_logging_impl.cc @@ -12,6 +12,7 @@ namespace quic { namespace { std::atomic g_verbosity_threshold; +std::atomic g_dfatal_exit_disabled; // Pointer to the global log sink, usually it is nullptr. // If not nullptr, as in some tests, the sink will receive a copy of the log message right after the @@ -39,7 +40,15 @@ QuicLogEmitter::~QuicLogEmitter() { } if (level_ == FATAL) { +#ifdef NDEBUG + // Release mode. abort(); +#else + // Debug mode. + if (!g_dfatal_exit_disabled) { + abort(); + } +#endif } } @@ -49,6 +58,12 @@ void SetVerbosityLogThreshold(int new_verbosity) { g_verbosity_threshold.store(new_verbosity, std::memory_order_relaxed); } +bool IsDFatalExitDisabled() { return g_dfatal_exit_disabled.load(std::memory_order_relaxed); } + +void SetDFatalExitDisabled(bool is_disabled) { + g_dfatal_exit_disabled.store(is_disabled, std::memory_order_relaxed); +} + QuicLogSink* SetLogSink(QuicLogSink* new_sink) { absl::MutexLock lock(&g_quic_log_sink_mutex); QuicLogSink* old_sink = g_quic_log_sink.load(std::memory_order_relaxed); diff --git a/source/extensions/quic_listeners/quiche/platform/quic_logging_impl.h b/source/extensions/quic_listeners/quiche/platform/quic_logging_impl.h index 813a9bb0f9631..d5de4b0c48120 100644 --- a/source/extensions/quic_listeners/quiche/platform/quic_logging_impl.h +++ b/source/extensions/quic_listeners/quiche/platform/quic_logging_impl.h @@ -44,6 +44,9 @@ // TODO(wub): Implement QUIC_LOG_FIRST_N_IMPL. #define QUIC_LOG_FIRST_N_IMPL(severity, n) QUIC_LOG_IMPL(severity) +// TODO(wub): Implement QUIC_LOG_EVERY_N_IMPL. +#define QUIC_LOG_EVERY_N_IMPL(severity, n) QUIC_LOG_IMPL(severity) + // TODO(wub): Implement QUIC_LOG_EVERY_N_SEC_IMPL. #define QUIC_LOG_EVERY_N_SEC_IMPL(severity, seconds) QUIC_LOG_IMPL(severity) @@ -63,6 +66,7 @@ #define QUIC_DLOG_IMPL(severity) QUIC_COMPILED_OUT_LOG() #define QUIC_DLOG_IF_IMPL(severity, condition) QUIC_COMPILED_OUT_LOG() #define QUIC_DLOG_INFO_IS_ON_IMPL() 0 +#define QUIC_DLOG_EVERY_N_IMPL(severity, n) QUIC_COMPILED_OUT_LOG() #define QUIC_NOTREACHED_IMPL() #else // Debug build @@ -71,6 +75,7 @@ #define QUIC_DLOG_IMPL(severity) QUIC_LOG_IMPL(severity) #define QUIC_DLOG_IF_IMPL(severity, condition) QUIC_LOG_IF_IMPL(severity, condition) #define QUIC_DLOG_INFO_IS_ON_IMPL() QUIC_LOG_INFO_IS_ON_IMPL() +#define QUIC_DLOG_EVERY_N_IMPL(severity, n) QUIC_LOG_EVERY_N_IMPL(severity, n) #define QUIC_NOTREACHED_IMPL() NOT_REACHED_GCOVR_EXCL_LINE #endif @@ -132,6 +137,9 @@ inline bool IsVerboseLogEnabled(int verbosity) { return IsLogLevelEnabled(INFO) && verbosity <= GetVerbosityLogThreshold(); } +bool IsDFatalExitDisabled(); +void SetDFatalExitDisabled(bool is_disabled); + // QuicLogSink is used to capture logs emitted from the QUIC_LOG... macros. class QuicLogSink { public: diff --git a/source/extensions/quic_listeners/quiche/platform/quic_mock_log_impl.h b/source/extensions/quic_listeners/quiche/platform/quic_mock_log_impl.h index 4f3c6d4e5c7a1..ed5298a07f2bc 100644 --- a/source/extensions/quic_listeners/quiche/platform/quic_mock_log_impl.h +++ b/source/extensions/quic_listeners/quiche/platform/quic_mock_log_impl.h @@ -47,6 +47,24 @@ class QuicEnvoyMockLog : public QuicLogSink { bool is_capturing_; }; +// ScopedDisableExitOnDFatal is used to disable exiting the program when we encounter a +// QUIC_LOG(DFATAL) within the current block. After we leave the current block, the previous +// behavior is restored. +class ScopedDisableExitOnDFatal { +public: + ScopedDisableExitOnDFatal() : previous_value_(IsDFatalExitDisabled()) { + SetDFatalExitDisabled(true); + } + + ScopedDisableExitOnDFatal(const ScopedDisableExitOnDFatal&) = delete; + ScopedDisableExitOnDFatal& operator=(const ScopedDisableExitOnDFatal&) = delete; + + ~ScopedDisableExitOnDFatal() { SetDFatalExitDisabled(previous_value_); } + +private: + const bool previous_value_; +}; + } // namespace quic using QuicMockLogImpl = quic::QuicEnvoyMockLog; @@ -57,3 +75,25 @@ using QuicMockLogImpl = quic::QuicEnvoyMockLog; #define EXPECT_QUIC_LOG_CALL_CONTAINS_IMPL(log, level, content) \ EXPECT_CALL(log, Log(quic::level, testing::HasSubstr(content))) + +// Not part of the api exposed by quic_mock_log.h. This is used by +// quic_expect_bug_impl.h. +#define EXPECT_QUIC_LOG_IMPL(statement, level, matcher) \ + do { \ + quic::QuicEnvoyMockLog mock_log; \ + EXPECT_CALL(mock_log, Log(quic::level, matcher)).Times(testing::AtLeast(1)); \ + mock_log.StartCapturingLogs(); \ + { statement; } \ + mock_log.StopCapturingLogs(); \ + if (!testing::Mock::VerifyAndClear(&mock_log)) { \ + GTEST_NONFATAL_FAILURE_(""); \ + } \ + } while (false) + +#define EXPECT_QUIC_DFATAL_IMPL(statement, matcher) \ + EXPECT_QUIC_LOG_IMPL( \ + { \ + quic::ScopedDisableExitOnDFatal disable_exit_on_dfatal; \ + statement; \ + }, \ + DFATAL, matcher) diff --git a/source/extensions/quic_listeners/quiche/platform/spdy_bug_tracker_impl.h b/source/extensions/quic_listeners/quiche/platform/spdy_bug_tracker_impl.h new file mode 100644 index 0000000000000..93cb60e469695 --- /dev/null +++ b/source/extensions/quic_listeners/quiche/platform/spdy_bug_tracker_impl.h @@ -0,0 +1,13 @@ +#pragma once + +// NOLINT(namespace-envoy) +// +// This file is part of the QUICHE platform implementation, and is not to be +// consumed or referenced directly by other Envoy code. It serves purely as a +// porting layer for QUICHE. + +#include "extensions/quic_listeners/quiche/platform/quic_bug_tracker_impl.h" + +#define SPDY_BUG_IMPL QUIC_BUG_IMPL +#define SPDY_BUG_IF_IMPL QUIC_BUG_IF_IMPL +#define FLAGS_spdy_always_log_bugs_for_tests_impl true diff --git a/source/extensions/quic_listeners/quiche/platform/spdy_logging_impl.h b/source/extensions/quic_listeners/quiche/platform/spdy_logging_impl.h new file mode 100644 index 0000000000000..4a21b95ab34d6 --- /dev/null +++ b/source/extensions/quic_listeners/quiche/platform/spdy_logging_impl.h @@ -0,0 +1,21 @@ +#pragma once + +// NOLINT(namespace-envoy) +// +// This file is part of the QUICHE platform implementation, and is not to be +// consumed or referenced directly by other Envoy code. It serves purely as a +// porting layer for QUICHE. + +#include "extensions/quic_listeners/quiche/platform/quic_logging_impl.h" + +#define SPDY_LOG_IMPL(severity) QUIC_LOG_IMPL(severity) + +#define SPDY_VLOG_IMPL(verbose_level) QUIC_VLOG_IMPL(verbose_level) + +#define SPDY_DLOG_IMPL(severity) QUIC_DLOG_IMPL(severity) + +#define SPDY_DLOG_IF_IMPL(severity, condition) QUIC_DLOG_IF_IMPL(severity, condition) + +#define SPDY_DVLOG_IMPL(verbose_level) QUIC_DVLOG_IMPL(verbose_level) + +#define SPDY_DVLOG_IF_IMPL(verbose_level, condition) QUIC_DVLOG_IF_IMPL(verbose_level, condition) diff --git a/test/extensions/quic_listeners/quiche/platform/BUILD b/test/extensions/quic_listeners/quiche/platform/BUILD index c24563392a970..16d008648f526 100644 --- a/test/extensions/quic_listeners/quiche/platform/BUILD +++ b/test/extensions/quic_listeners/quiche/platform/BUILD @@ -15,9 +15,10 @@ envoy_package() envoy_cc_test( name = "http2_platform_test", - srcs = ["http2_platform_test.cc"], + srcs = envoy_select_quiche(["http2_platform_test.cc"]), external_deps = ["quiche_http2_platform"], deps = [ + "//test/test_common:logging_lib", "//test/test_common:utility_lib", ], ) @@ -39,9 +40,10 @@ envoy_cc_test( envoy_cc_test( name = "spdy_platform_test", - srcs = ["spdy_platform_test.cc"], + srcs = envoy_select_quiche(["spdy_platform_test.cc"]), external_deps = ["quiche_spdy_platform"], deps = [ + "//test/test_common:logging_lib", "//test/test_common:utility_lib", ], ) diff --git a/test/extensions/quic_listeners/quiche/platform/http2_platform_test.cc b/test/extensions/quic_listeners/quiche/platform/http2_platform_test.cc index f17b77ae9808c..10b9b38787e1e 100644 --- a/test/extensions/quic_listeners/quiche/platform/http2_platform_test.cc +++ b/test/extensions/quic_listeners/quiche/platform/http2_platform_test.cc @@ -1,9 +1,13 @@ #include +#include "test/test_common/logging.h" + #include "gtest/gtest.h" #include "quiche/http2/platform/api/http2_arraysize.h" +#include "quiche/http2/platform/api/http2_bug_tracker.h" #include "quiche/http2/platform/api/http2_containers.h" #include "quiche/http2/platform/api/http2_estimate_memory_usage.h" +#include "quiche/http2/platform/api/http2_logging.h" #include "quiche/http2/platform/api/http2_optional.h" #include "quiche/http2/platform/api/http2_ptr_util.h" #include "quiche/http2/platform/api/http2_string.h" @@ -26,6 +30,14 @@ TEST(Http2PlatformTest, Http2Arraysize) { EXPECT_EQ(5, HTTP2_ARRAYSIZE(array)); } +TEST(Http2PlatformTest, Http2BugTracker) { + EXPECT_DEBUG_DEATH(HTTP2_BUG << "Here is a bug,", " bug"); + EXPECT_DEBUG_DEATH(HTTP2_BUG_IF(true) << "There is a bug,", " bug"); + EXPECT_LOG_NOT_CONTAINS("error", "", HTTP2_BUG_IF(false) << "A feature is not a bug."); + + EXPECT_EQ(true, FLAGS_http2_always_log_bugs_for_tests); +} + TEST(Http2PlatformTest, Http2Deque) { http2::Http2Deque deque; deque.push_back(10); @@ -38,6 +50,29 @@ TEST(Http2PlatformTest, Http2EstimateMemoryUsage) { EXPECT_EQ(0, http2::Http2EstimateMemoryUsage(s)); } +TEST(Http2PlatformTest, Http2Log) { + // HTTP2_LOG macros are defined to QUIC_LOG macros, which is tested in + // QuicPlatformTest. Here we just make sure HTTP2_LOG macros compile. + HTTP2_LOG(INFO) << "INFO log may not show up by default."; + HTTP2_LOG(ERROR) << "ERROR log should show up by default."; + + // VLOG are only emitted if INFO is enabled and verbosity level is high enough. + HTTP2_VLOG(1) << "VLOG(1)"; + + HTTP2_DLOG(INFO) << "DLOG(INFO)"; + HTTP2_DLOG(ERROR) << "DLOG(ERROR)"; + + HTTP2_DLOG_IF(ERROR, true) << "DLOG_IF(ERROR, true)"; + HTTP2_DLOG_IF(ERROR, false) << "DLOG_IF(ERROR, false)"; + + HTTP2_DVLOG(2) << "DVLOG(2)"; + + HTTP2_DVLOG_IF(3, true) << "DVLOG_IF(3, true)"; + HTTP2_DVLOG_IF(4, false) << "DVLOG_IF(4, false)"; + + HTTP2_DLOG_EVERY_N(ERROR, 2) << "DLOG_EVERY_N(ERROR, 2)"; +} + TEST(Http2PlatformTest, Http2Optional) { http2::Http2Optional opt; EXPECT_FALSE(opt.has_value()); diff --git a/test/extensions/quic_listeners/quiche/platform/quic_platform_test.cc b/test/extensions/quic_listeners/quiche/platform/quic_platform_test.cc index cd8f513e8f9c6..db838e8cd12fc 100644 --- a/test/extensions/quic_listeners/quiche/platform/quic_platform_test.cc +++ b/test/extensions/quic_listeners/quiche/platform/quic_platform_test.cc @@ -18,6 +18,7 @@ #include "quiche/quic/platform/api/quic_containers.h" #include "quiche/quic/platform/api/quic_endian.h" #include "quiche/quic/platform/api/quic_estimate_memory_usage.h" +#include "quiche/quic/platform/api/quic_expect_bug.h" #include "quiche/quic/platform/api/quic_exported_stats.h" #include "quiche/quic/platform/api/quic_hostname_utils.h" #include "quiche/quic/platform/api/quic_logging.h" @@ -74,6 +75,18 @@ TEST(QuicPlatformTest, QuicClientStats) { QuicClientSparseHistogram("my.sparse.histogram", 345); } +TEST(QuicPlatformTest, QuicExpectBug) { + auto bug = [](const char* error_message) { QUIC_BUG << error_message; }; + + auto peer_bug = [](const char* error_message) { QUIC_PEER_BUG << error_message; }; + + EXPECT_QUIC_BUG(bug("bug one is expected"), "bug one"); + EXPECT_QUIC_BUG(bug("bug two is expected"), "bug two"); + + EXPECT_QUIC_PEER_BUG(peer_bug("peer_bug_1 is expected"), "peer_bug_1"); + EXPECT_QUIC_PEER_BUG(peer_bug("peer_bug_2 is expected"), "peer_bug_2"); +} + TEST(QuicPlatformTest, QuicExportedStats) { // Just make sure they compile. QUIC_HISTOGRAM_ENUM("my.enum.histogram", TestEnum::ONE, TestEnum::COUNT, "doc"); diff --git a/test/extensions/quic_listeners/quiche/platform/spdy_platform_test.cc b/test/extensions/quic_listeners/quiche/platform/spdy_platform_test.cc index 8c3571920a3e2..6ac1874cad0e6 100644 --- a/test/extensions/quic_listeners/quiche/platform/spdy_platform_test.cc +++ b/test/extensions/quic_listeners/quiche/platform/spdy_platform_test.cc @@ -1,10 +1,14 @@ #include +#include "test/test_common/logging.h" + #include "gtest/gtest.h" #include "quiche/spdy/platform/api/spdy_arraysize.h" +#include "quiche/spdy/platform/api/spdy_bug_tracker.h" #include "quiche/spdy/platform/api/spdy_containers.h" #include "quiche/spdy/platform/api/spdy_endianness_util.h" #include "quiche/spdy/platform/api/spdy_estimate_memory_usage.h" +#include "quiche/spdy/platform/api/spdy_logging.h" #include "quiche/spdy/platform/api/spdy_ptr_util.h" #include "quiche/spdy/platform/api/spdy_string.h" #include "quiche/spdy/platform/api/spdy_string_piece.h" @@ -26,6 +30,14 @@ TEST(SpdyPlatformTest, SpdyArraysize) { EXPECT_EQ(5, SPDY_ARRAYSIZE(array)); } +TEST(SpdyPlatformTest, SpdyBugTracker) { + EXPECT_DEBUG_DEATH(SPDY_BUG << "Here is a bug,", " bug"); + EXPECT_DEBUG_DEATH(SPDY_BUG_IF(true) << "There is a bug,", " bug"); + EXPECT_LOG_NOT_CONTAINS("error", "", SPDY_BUG_IF(false) << "A feature is not a bug."); + + EXPECT_EQ(true, FLAGS_spdy_always_log_bugs_for_tests); +} + TEST(SpdyPlatformTest, SpdyHashMap) { spdy::SpdyHashMap hmap; hmap.insert({"foo", 2}); @@ -51,6 +63,27 @@ TEST(SpdyPlatformTest, SpdyEstimateMemoryUsage) { EXPECT_EQ(0, spdy::SpdyEstimateMemoryUsage(s)); } +TEST(SpdyPlatformTest, SpdyLog) { + // SPDY_LOG macros are defined to QUIC_LOG macros, which is tested in + // QuicPlatformTest. Here we just make sure SPDY_LOG macros compile. + SPDY_LOG(INFO) << "INFO log may not show up by default."; + SPDY_LOG(ERROR) << "ERROR log should show up by default."; + + // VLOG is only emitted if INFO is enabled and verbosity level is high enough. + SPDY_VLOG(1) << "VLOG(1)"; + + SPDY_DLOG(INFO) << "DLOG(INFO)"; + SPDY_DLOG(ERROR) << "DLOG(ERROR)"; + + SPDY_DLOG_IF(ERROR, true) << "DLOG_IF(ERROR, true)"; + SPDY_DLOG_IF(ERROR, false) << "DLOG_IF(ERROR, false)"; + + SPDY_DVLOG(2) << "DVLOG(2)"; + + SPDY_DVLOG_IF(3, true) << "DVLOG_IF(3, true)"; + SPDY_DVLOG_IF(4, false) << "DVLOG_IF(4, false)"; +} + TEST(SpdyPlatformTest, SpdyMakeUnique) { auto p = spdy::SpdyMakeUnique(4); EXPECT_EQ(4, *p);