use std::time::Duration;
use netem::{DataSize, NetemConfig};
use str0m::RtcError;
use str0m::bwe::Bitrate;
use crate::common::{BweTestContext, Step, connect_with_bwe, init_crypto_default, init_log};
#[test]
pub fn bwe_changing_bandwidth() -> Result<(), RtcError> {
init_log();
init_crypto_default();
let plan = vec![
Step::Conditions {
description: "High bandwidth conditions",
config: NetemConfig::new()
.latency(Duration::from_millis(10))
.jitter(Duration::from_millis(2))
.link(Bitrate::mbps(10), DataSize::kbytes(200))
.seed(42),
},
Step::Media {
description: "Probe for high bandwidth",
desired_bitrate: Bitrate::mbps(5),
media_send_rate: Bitrate::mbps(1),
},
Step::Run {
description: "Wait for high bandwidth",
duration: Duration::from_secs(20),
},
Step::Check {
description: "Ensure we have high bandwidth",
at_least: Bitrate::mbps(5),
},
Step::Conditions {
description: "Bad network conditions",
config: NetemConfig::new()
.latency(Duration::from_millis(10))
.jitter(Duration::from_millis(20))
.link(Bitrate::kbps(800), DataSize::kbytes(50))
.seed(42),
},
Step::Run {
description: "Run bad conditions",
duration: Duration::from_secs(5),
},
Step::Check {
description: "Lower estimate for bad conditions",
at_least: Bitrate::kbps(500),
},
Step::Media {
description: "Drop the send rate for bad conditions",
desired_bitrate: Bitrate::mbps(5),
media_send_rate: Bitrate::kbps(600),
},
Step::Run {
description: "Wait for bad conditions stabilization",
duration: Duration::from_secs(10),
},
Step::Check {
description: "Bad conditions stabilized",
at_least: Bitrate::kbps(400),
},
Step::Conditions {
description: "High bandwidth conditions",
config: NetemConfig::new()
.latency(Duration::from_millis(10))
.jitter(Duration::from_millis(2))
.link(Bitrate::mbps(10), DataSize::kbytes(200))
.seed(42),
},
Step::Run {
description: "Wait for high bandwidth to recover",
duration: Duration::from_secs(40),
},
Step::Check {
description: "High bandwidth should recover",
at_least: Bitrate::mbps(3),
},
];
let (mut l, mut r) = connect_with_bwe(Bitrate::mbps(1), Bitrate::mbps(5));
let mut ctx = BweTestContext::new(&mut l, &mut r);
ctx.run_plan(&mut l, &mut r, &plan)?;
Ok(())
}