Record quic traces in QuartcBidiTest. Creates an interceptor which records a quic trace with the given identifier. Creates and registers one of these interceptors for each endpoint (client and server) in QuartcBidiTest. gfe-relnote: n/a (Quartc test only) PiperOrigin-RevId: 246419708 Change-Id: I0398bccf3650bdf48881882724a066355ede3a0a
diff --git a/quic/quartc/test/quartc_bidi_test.cc b/quic/quartc/test/quartc_bidi_test.cc index c10e62e..3d0e30a 100644 --- a/quic/quartc/test/quartc_bidi_test.cc +++ b/quic/quartc/test/quartc_bidi_test.cc
@@ -6,9 +6,11 @@ #include "net/third_party/quiche/src/quic/core/quic_time.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" #include "net/third_party/quiche/src/quic/quartc/simulated_packet_transport.h" #include "net/third_party/quiche/src/quic/quartc/test/bidi_test_runner.h" +#include "net/third_party/quiche/src/quic/quartc/test/quic_trace_interceptor.h" #include "net/third_party/quiche/src/quic/quartc/test/random_delay_link.h" #include "net/third_party/quiche/src/quic/quartc/test/random_packet_filter.h" #include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h" @@ -25,6 +27,9 @@ QUIC_LOG(INFO) << "Setting random seed to " << seed; random_.set_seed(seed); simulator_.set_random_generator(&random_); + + client_trace_interceptor_ = QuicMakeUnique<QuicTraceInterceptor>("client"); + server_trace_interceptor_ = QuicMakeUnique<QuicTraceInterceptor>("server"); } void CreateTransports(QuicBandwidth bandwidth, @@ -56,6 +61,9 @@ std::unique_ptr<simulator::RandomPacketFilter> client_filter_; std::unique_ptr<simulator::RandomPacketFilter> server_filter_; std::unique_ptr<simulator::SymmetricRandomDelayLink> client_server_link_; + + std::unique_ptr<QuicTraceInterceptor> client_trace_interceptor_; + std::unique_ptr<QuicTraceInterceptor> server_trace_interceptor_; }; TEST_F(QuartcBidiTest, Basic300kbps200ms) { @@ -64,6 +72,8 @@ 10 * kDefaultMaxPacketSize, /*loss_percent=*/0); BidiTestRunner runner(&simulator_, client_transport_.get(), server_transport_.get()); + runner.set_client_interceptor(client_trace_interceptor_.get()); + runner.set_server_interceptor(server_trace_interceptor_.get()); EXPECT_TRUE(runner.RunTest(QuicTime::Delta::FromSeconds(30))); } @@ -73,6 +83,8 @@ 10 * kDefaultMaxPacketSize, /*loss_percent=*/2); BidiTestRunner runner(&simulator_, client_transport_.get(), server_transport_.get()); + runner.set_client_interceptor(client_trace_interceptor_.get()); + runner.set_server_interceptor(server_trace_interceptor_.get()); EXPECT_TRUE(runner.RunTest(QuicTime::Delta::FromSeconds(30))); } @@ -84,6 +96,8 @@ QuicTime::Delta::FromMilliseconds(25)); BidiTestRunner runner(&simulator_, client_transport_.get(), server_transport_.get()); + runner.set_client_interceptor(client_trace_interceptor_.get()); + runner.set_server_interceptor(server_trace_interceptor_.get()); EXPECT_TRUE(runner.RunTest(QuicTime::Delta::FromSeconds(30))); }
diff --git a/quic/quartc/test/quic_trace_interceptor.cc b/quic/quartc/test/quic_trace_interceptor.cc new file mode 100644 index 0000000..c2fa6ec --- /dev/null +++ b/quic/quartc/test/quic_trace_interceptor.cc
@@ -0,0 +1,47 @@ +// Copyright (c) 2019 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. + +#include "net/third_party/quiche/src/quic/quartc/test/quic_trace_interceptor.h" + +#include <string> + +#include "net/third_party/quiche/src/quic/core/quic_error_codes.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_test_output.h" +#include "net/third_party/quiche/src/quic/quartc/quartc_endpoint.h" +#include "net/third_party/quiche/src/quic/quartc/quartc_session.h" + +namespace quic { +namespace test { + +QuicTraceInterceptor::QuicTraceInterceptor(QuicStringPiece identifier) + : identifier_(identifier.data(), identifier.size()), delegate_(nullptr) {} + +QuicTraceInterceptor::~QuicTraceInterceptor() { + if (trace_visitor_) { + QuicRecordTestOutput(identifier_, + trace_visitor_->trace()->SerializeAsString()); + } +} + +void QuicTraceInterceptor::OnSessionCreated(QuartcSession* session) { + trace_visitor_ = QuicMakeUnique<QuicTraceVisitor>(session->connection()); + session->connection()->set_debug_visitor(trace_visitor_.get()); + + delegate_->OnSessionCreated(session); +} + +void QuicTraceInterceptor::OnConnectError(QuicErrorCode error, + const std::string& details) { + delegate_->OnConnectError(error, details); +} + +void QuicTraceInterceptor::SetDelegate(QuartcEndpoint::Delegate* delegate) { + DCHECK(delegate != nullptr); + delegate_ = delegate; +} + +} // namespace test +} // namespace quic
diff --git a/quic/quartc/test/quic_trace_interceptor.h b/quic/quartc/test/quic_trace_interceptor.h new file mode 100644 index 0000000..bb731b1 --- /dev/null +++ b/quic/quartc/test/quic_trace_interceptor.h
@@ -0,0 +1,43 @@ +// Copyright (c) 2019 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. + +#ifndef QUICHE_QUIC_QUARTC_TEST_QUIC_TRACE_INTERCEPTOR_H_ +#define QUICHE_QUIC_QUARTC_TEST_QUIC_TRACE_INTERCEPTOR_H_ + +#include <string> + +#include "net/third_party/quiche/src/quic/core/quic_connection.h" +#include "net/third_party/quiche/src/quic/core/quic_error_codes.h" +#include "net/third_party/quiche/src/quic/core/quic_trace_visitor.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" +#include "net/third_party/quiche/src/quic/quartc/quartc_endpoint.h" +#include "net/third_party/quiche/src/quic/quartc/quartc_session.h" +#include "net/third_party/quiche/src/quic/quartc/test/bidi_test_runner.h" + +namespace quic { +namespace test { + +class QuicTraceInterceptor : public QuartcEndpointInterceptor { + public: + // Creates a trace visitor that records its output using the given identifier. + // |identifier| is combined with the test name and timestamp to form a + // filename for the trace. + explicit QuicTraceInterceptor(QuicStringPiece identifier); + ~QuicTraceInterceptor() override; + + // QuartcEndpointIntercept overrides. + void OnSessionCreated(QuartcSession* session) override; + void OnConnectError(QuicErrorCode error, const std::string& details) override; + void SetDelegate(QuartcEndpoint::Delegate* delegate) override; + + private: + const std::string identifier_; + std::unique_ptr<QuicTraceVisitor> trace_visitor_; + QuartcEndpoint::Delegate* delegate_; +}; + +} // namespace test +} // namespace quic + +#endif // QUICHE_QUIC_QUARTC_TEST_QUIC_TRACE_INTERCEPTOR_H_