blob: dd0ab5872bc06a53cf6c90fc7d105a86d5623659 [file] [log] [blame]
// Copyright 2025 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 "quiche/quic/moqt/test_tools/moqt_simulator.h"
#include "quiche/quic/core/quic_bandwidth.h"
#include "quiche/quic/core/quic_connection_stats.h"
#include "quiche/quic/core/quic_session.h"
#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/core/quic_types.h"
#include "quic_trace/quic_trace.pb.h"
#include "quiche/common/platform/api/quiche_test.h"
namespace moqt::test {
namespace {
using ::quic_trace::EventType;
class MoqtSimulatorTest : public quiche::test::QuicheTest {};
int CountEventType(const quic_trace::Trace& trace, quic_trace::EventType type) {
int count = 0;
for (const quic_trace::Event& event : trace.events()) {
if (event.event_type() == type) {
++count;
}
}
return count;
}
quic::CongestionControlType GetCongestionControlType(
const quic::QuicSession& session) {
return session.connection()
->sent_packet_manager()
.GetSendAlgorithm()
->GetCongestionControlType();
}
// Ensure the simulation works with default parameters.
TEST_F(MoqtSimulatorTest, DefaultSettings) {
MoqtSimulator simulator(SimulationParameters{});
simulator.Run();
EXPECT_NEAR(simulator.received_on_time_fraction(), 1.0f, 0.001f);
EXPECT_EQ(GetCongestionControlType(*simulator.client_quic_session()),
quic::CongestionControlType::kBBR);
EXPECT_EQ(GetCongestionControlType(*simulator.server_quic_session()),
quic::CongestionControlType::kBBR);
int bitrate_events = 0;
for (const quic_trace::Event& event : simulator.client_trace().events()) {
if (event.event_type() != EventType::MOQT_TARGET_BITRATE_SET) {
continue;
}
++bitrate_events;
EXPECT_GT(event.bandwidth_estimate_bps(),
SimulationParameters().bitrate.ToBitsPerSecond());
EXPECT_LT(event.bandwidth_estimate_bps(),
SimulationParameters().bandwidth.ToBitsPerSecond());
}
EXPECT_GT(bitrate_events, 0);
}
// Ensure that the bitrate adaptation down works.
TEST_F(MoqtSimulatorTest, BandwidthTooLow) {
SimulationParameters parameters;
parameters.bandwidth = quic::QuicBandwidth::FromKBitsPerSecond(900);
parameters.delivery_timeout = quic::QuicTimeDelta::FromSeconds(1);
MoqtSimulator simulator(parameters);
simulator.Run();
EXPECT_GE(simulator.received_on_time_fraction(), 0.8f);
EXPECT_LT(simulator.received_on_time_fraction(), 0.999f);
EXPECT_GT(CountEventType(simulator.client_trace(),
EventType::MOQT_TARGET_BITRATE_SET),
0);
quic::QuicConnectionStats stats =
simulator.client_quic_session()->connection()->GetStats();
EXPECT_LT(stats.blocked_frames_sent, 16);
}
} // namespace
} // namespace moqt::test