blob: 4369e2202d4f9ad3d73d85f1756d8905425c15a0 [file] [log] [blame]
// 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/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 {
~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 {
// 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);
// 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