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_