|  | // 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_ |