use core::time::Duration;
use srt_runtime::livecc::{LiveCC, MaxBwConfig};
const ONE_GBPS_BYTES_PER_SEC: u64 = 125_000_000;
#[test]
fn pkt_snd_period_known_payload_and_bw() {
let cc = LiveCC::new(Default::default());
let got = cc.on_ack_received();
assert_eq!(
got,
Duration::from_micros(11),
"PKT_SND_PERIOD should be 11 us for init payload 1456 at 1 Gbps"
);
}
#[test]
fn pkt_snd_period_with_smaller_avg_payload() {
let mut cc = LiveCC::new(Default::default());
for _ in 0..64 {
cc.on_data_packet(1316);
}
let avg = cc.avg_payload_size();
assert!(
avg.abs_diff(1316) <= 1,
"expected AvgPayloadSize ~1316, got {avg}"
);
let got = cc.on_ack_received();
assert_eq!(
got,
Duration::from_micros(10),
"PKT_SND_PERIOD should be 10 us for ~1316 avg payload at 1 Gbps"
);
}
#[test]
fn maxbw_set_mode_period_matches_formula() {
let cc = LiveCC::new(MaxBwConfig::Set(62_500_000));
assert_eq!(cc.on_ack_received(), Duration::from_micros(23));
}
#[test]
fn maxbw_input_based_mode_period() {
let cc = LiveCC::new(MaxBwConfig::InputBased {
input_bw: 10_000_000,
overhead: 25,
});
let got = cc.on_ack_received();
assert_eq!(got, Duration::from_micros(117));
}
#[test]
fn maxbw_infinite_mode_zero_period() {
let cc = LiveCC::new(MaxBwConfig::Infinite);
assert_eq!(cc.on_ack_received(), Duration::ZERO);
}
#[test]
fn ewma_convergence_from_known_start() {
let mut cc = LiveCC::new(Default::default());
assert_eq!(cc.avg_payload_size(), 1456, "init cap must be 1456");
cc.on_data_packet(1000);
assert_eq!(cc.avg_payload_size(), 1399);
cc.on_data_packet(1000);
assert_eq!(cc.avg_payload_size(), 1349);
cc.on_data_packet(1000);
assert_eq!(cc.avg_payload_size(), 1305);
for _ in 0..61 {
cc.on_data_packet(1000);
}
let avg = cc.avg_payload_size();
assert!(
avg.abs_diff(1000) <= 1,
"expected convergence within 1 of 1000, got {avg}"
);
}
#[test]
fn maxbw_estimated_mode_uses_overhead_formula() {
let cc = LiveCC::new(MaxBwConfig::Estimated {
est_input_bw: 20_000_000,
overhead: 50,
});
assert_eq!(cc.on_ack_received(), Duration::from_micros(49));
}
#[test]
fn runtime_switch_between_modes_alters_period() {
let mut cc = LiveCC::new(MaxBwConfig::Infinite);
assert_eq!(cc.on_ack_received(), Duration::ZERO);
cc.set_max_bw_config(MaxBwConfig::Set(ONE_GBPS_BYTES_PER_SEC));
assert_eq!(cc.on_ack_received(), Duration::from_micros(11));
cc.set_max_bw_config(MaxBwConfig::Set(ONE_GBPS_BYTES_PER_SEC / 2));
assert_eq!(cc.on_ack_received(), Duration::from_micros(23));
cc.set_max_bw_config(MaxBwConfig::Infinite);
assert_eq!(cc.on_ack_received(), Duration::ZERO);
}