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_