mod common;
use std::time::Instant;
#[test]
fn rate_limit_5mib_at_1mib_per_sec_takes_about_5_seconds() {
let payload = vec![0u8; 5 * 1024 * 1024];
let start = Instant::now();
let assert = common::rusty_pv_cmd()
.arg("-q")
.arg("-L")
.arg("1M")
.arg("-B")
.arg("64K")
.write_stdin(payload.clone())
.assert()
.success();
let elapsed = start.elapsed();
assert_eq!(assert.get_output().stdout.len(), payload.len());
assert!(
elapsed.as_secs_f64() >= 4.0 && elapsed.as_secs_f64() <= 8.0,
"5MiB @ 1MiB/s should take ~5s; got {:.2}s",
elapsed.as_secs_f64()
);
}
#[test]
fn library_api_rate_limit_holds_to_5_percent() {
use rusty_pv::PvBuilder;
use std::io::Cursor;
let src = vec![0u8; 2 * 1024 * 1024];
let mut reader = Cursor::new(src.clone());
let mut writer = Vec::with_capacity(src.len());
let pv = PvBuilder::new()
.rate_limit(1024 * 1024)
.buffer_size(64 * 1024)
.build();
let start = Instant::now();
let n = pv.copy(&mut reader, &mut writer).unwrap();
let elapsed = start.elapsed();
assert_eq!(n, src.len() as u64);
let lo = 1.9;
let hi = 2.1;
assert!(
elapsed.as_secs_f64() >= lo && elapsed.as_secs_f64() <= hi,
"library 2MiB @ 1MiB/s expected {lo:.1}..{hi:.1}s, got {:.3}s",
elapsed.as_secs_f64()
);
}
#[test]
fn rate_limit_higher_than_source_is_a_ceiling() {
let payload = vec![0u8; 1024]; let start = Instant::now();
let assert = common::rusty_pv_cmd()
.arg("-q")
.arg("-L")
.arg("1G") .write_stdin(payload.clone())
.assert()
.success();
let elapsed = start.elapsed();
assert_eq!(assert.get_output().stdout.len(), payload.len());
assert!(
elapsed.as_secs_f64() < 1.0,
"high -L should not slow down a 1KiB transfer; got {:.3}s",
elapsed.as_secs_f64()
);
}