use super::{
AUDIO_ONLY_BPS, HIGH_MIN_BPS, LOW_MIN_BPS, MEDIUM_MIN_BPS, SUSPEND_STREAK, SUSPEND_VIDEO_BPS,
UPGRADE_STREAK,
};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(docsrs, doc(cfg(feature = "pacer")))]
pub struct PacerConfig {
pub suspend_video_bps: u64,
pub audio_only_bps: u64,
pub low_min_bps: u64,
pub medium_min_bps: u64,
pub high_min_bps: u64,
pub suspend_streak: u8,
pub upgrade_streak: u8,
}
impl Default for PacerConfig {
fn default() -> Self {
Self {
suspend_video_bps: SUSPEND_VIDEO_BPS,
audio_only_bps: AUDIO_ONLY_BPS,
low_min_bps: LOW_MIN_BPS,
medium_min_bps: MEDIUM_MIN_BPS,
high_min_bps: HIGH_MIN_BPS,
suspend_streak: SUSPEND_STREAK,
upgrade_streak: UPGRADE_STREAK,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_values_match_constants() {
let cfg = PacerConfig::default();
assert_eq!(cfg.suspend_video_bps, SUSPEND_VIDEO_BPS);
assert_eq!(cfg.audio_only_bps, AUDIO_ONLY_BPS);
assert_eq!(cfg.low_min_bps, LOW_MIN_BPS);
assert_eq!(cfg.medium_min_bps, MEDIUM_MIN_BPS);
assert_eq!(cfg.high_min_bps, HIGH_MIN_BPS);
assert_eq!(cfg.suspend_streak, SUSPEND_STREAK);
assert_eq!(cfg.upgrade_streak, UPGRADE_STREAK);
}
#[test]
fn struct_update_syntax_works() {
let cfg = PacerConfig {
upgrade_streak: 5,
..PacerConfig::default()
};
assert_eq!(cfg.upgrade_streak, 5);
assert_eq!(cfg.audio_only_bps, AUDIO_ONLY_BPS);
assert_eq!(cfg.suspend_streak, SUSPEND_STREAK);
}
#[test]
fn custom_config_drives_pacer_behavior() {
use crate::bwe::{PacerAction, SubscriberPacer};
let cfg = PacerConfig {
upgrade_streak: 1,
..PacerConfig::default()
};
let mut pacer = SubscriberPacer::with_config(cfg);
let action = pacer.update(MEDIUM_MIN_BPS + 1);
assert_eq!(
action,
PacerAction::ChangeLayer(crate::ids::SfuRid::MEDIUM),
"upgrade_streak=1 must upgrade in first tick"
);
}
#[test]
fn custom_audio_only_threshold() {
use crate::bwe::{PacerAction, SubscriberPacer};
let custom_audio_only = 200_000u64;
let cfg = PacerConfig {
audio_only_bps: custom_audio_only,
low_min_bps: custom_audio_only + 50_000,
..PacerConfig::default()
};
let mut pacer = SubscriberPacer::with_config(cfg);
let action = pacer.update(100_000);
assert_eq!(action, PacerAction::GoAudioOnly);
}
}