| // 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_BIDI_TEST_RUNNER_H_ | 
 | #define QUICHE_QUIC_QUARTC_TEST_BIDI_TEST_RUNNER_H_ | 
 |  | 
 | #include "net/third_party/quiche/src/quic/core/quic_time.h" | 
 | #include "net/third_party/quiche/src/quic/quartc/quartc_endpoint.h" | 
 | #include "net/third_party/quiche/src/quic/quartc/quartc_packet_writer.h" | 
 | #include "net/third_party/quiche/src/quic/quartc/test/quartc_data_source.h" | 
 | #include "net/third_party/quiche/src/quic/quartc/test/quartc_peer.h" | 
 | #include "net/third_party/quiche/src/quic/test_tools/simulator/simulator.h" | 
 |  | 
 | namespace quic { | 
 | namespace test { | 
 |  | 
 | // Interface for a component that intercepts endpoint callbacks before | 
 | // forwarding them to another delegate. | 
 | class QuartcEndpointInterceptor : public QuartcEndpoint::Delegate { | 
 |  public: | 
 |   ~QuartcEndpointInterceptor() override = default; | 
 |  | 
 |   // Passes the test's endpoint delegate to this interceptor.  The interceptor | 
 |   // must forward all callbacks to this delegate as soon as it finishes handling | 
 |   // them. | 
 |   virtual void SetDelegate(QuartcEndpoint::Delegate* delegate) = 0; | 
 | }; | 
 |  | 
 | // Runner for bidirectional media flow tests. | 
 | // | 
 | // BidiTestRunner allows an external fixture to set up transports, then executes | 
 | // a test.  During the test, it sets up two QuartcPeers, connects them through | 
 | // the transports, and sends data in both directions for a specified duration. | 
 | // It then stops sending, waits for any pending messages to finish transmission, | 
 | // and then computes and logs a few basic metrics. | 
 | // | 
 | // For now, the runner computes the maximum and average one-way delay, the total | 
 | // throughput (in bytes) and the average bandwidth (in bits per second).  It | 
 | // logs these to the test's text logs. | 
 | // | 
 | // By default, the BidiTestRunner emulates one video stream and one audio stream | 
 | // in each direction.  The audio stream runs with a 20 ms ptime, between 8 and | 
 | // 64 kbps.  The video stream runs at 30 fps, between 25 kbps and 5 mbps. | 
 | // Individual tests can overwrite the configs. | 
 | // | 
 | // BidiTestRunner provides a way for the test to register an "interceptor" on | 
 | // each endpoint.  This allows a test to reconfigure that endpoint's session | 
 | // prior to beginning the test.  For example, interceptors may be used to attach | 
 | // debug visitors or change the congestion controller. | 
 | class BidiTestRunner { | 
 |  public: | 
 |   // TODO(b/130540842): Make this compatible with non-simulator execution. | 
 |   BidiTestRunner(simulator::Simulator* simulator, | 
 |                  QuartcPacketTransport* client_transport, | 
 |                  QuartcPacketTransport* server_transport); | 
 |  | 
 |   virtual ~BidiTestRunner(); | 
 |  | 
 |   void set_client_configs(std::vector<QuartcDataSource::Config> configs) { | 
 |     client_configs_ = std::move(configs); | 
 |   } | 
 |  | 
 |   void set_server_configs(std::vector<QuartcDataSource::Config> configs) { | 
 |     server_configs_ = std::move(configs); | 
 |   } | 
 |  | 
 |   void set_client_interceptor(QuartcEndpointInterceptor* interceptor) { | 
 |     client_interceptor_ = interceptor; | 
 |   } | 
 |  | 
 |   void set_server_interceptor(QuartcEndpointInterceptor* interceptor) { | 
 |     server_interceptor_ = interceptor; | 
 |   } | 
 |  | 
 |   virtual bool RunTest(QuicTime::Delta test_duration); | 
 |  | 
 |  private: | 
 |   // Returns true when no pending packets are believed to be in-flight. | 
 |   bool PacketsDrained(); | 
 |  | 
 |   simulator::Simulator* simulator_; | 
 |   QuartcPacketTransport* client_transport_; | 
 |   QuartcPacketTransport* server_transport_; | 
 |  | 
 |   std::vector<QuartcDataSource::Config> client_configs_; | 
 |   std::vector<QuartcDataSource::Config> server_configs_; | 
 |  | 
 |   QuartcEndpointInterceptor* client_interceptor_ = nullptr; | 
 |   QuartcEndpointInterceptor* server_interceptor_ = nullptr; | 
 |  | 
 |   std::unique_ptr<QuartcServerEndpoint> server_endpoint_; | 
 |   std::unique_ptr<QuartcClientEndpoint> client_endpoint_; | 
 |  | 
 |   std::unique_ptr<QuartcPeer> client_peer_; | 
 |   std::unique_ptr<QuartcPeer> server_peer_; | 
 | }; | 
 |  | 
 | }  // namespace test | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_QUARTC_TEST_BIDI_TEST_RUNNER_H_ |