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