use super::*;
use test_log::test;
fn ms(n: u64) -> Duration {
Duration::from_millis(n)
}
#[test]
fn zero_rate_disables_throttling() {
let rl = RateLimiter::new(0);
assert_eq!(Duration::ZERO, rl.acquire_wait(1_000_000, ms(0)));
}
#[test]
fn within_initial_burst_proceeds_immediately() {
let rl = RateLimiter::new(1_000);
assert_eq!(Duration::ZERO, rl.acquire_wait(1_000, ms(0)));
}
#[test]
fn overdraft_waits_proportional_to_deficit() {
let rl = RateLimiter::new(1_000);
assert_eq!(Duration::ZERO, rl.acquire_wait(1_000, ms(0)));
assert_eq!(ms(500), rl.acquire_wait(500, ms(0)));
}
#[test]
fn refill_accrues_over_time() {
let rl = RateLimiter::new(1_000);
assert_eq!(Duration::ZERO, rl.acquire_wait(1_000, ms(0)));
assert_eq!(Duration::ZERO, rl.acquire_wait(500, ms(500)));
}
#[test]
fn burst_is_capped_at_one_second_of_rate() {
let rl = RateLimiter::new(1_000);
assert_eq!(
Duration::ZERO,
rl.acquire_wait(1_000, Duration::from_secs(10))
);
assert_eq!(
Duration::from_secs(1),
rl.acquire_wait(1_000, Duration::from_secs(10))
);
}
#[test]
fn sustained_rate_holds_at_configured_throughput() {
let rl = RateLimiter::new(1_000);
assert_eq!(Duration::ZERO, rl.acquire_wait(1_000, ms(0)));
for sec in 1..=5 {
assert_eq!(
Duration::ZERO,
rl.acquire_wait(1_000, Duration::from_secs(sec)),
"steady-state request at second {sec} should not wait"
);
}
}
#[cfg(feature = "std")]
#[test]
fn request_interruptible_bails_out_before_sleeping_when_stopped() {
let rl = RateLimiter::new(1);
let start = std::time::Instant::now();
let stopped = rl.request_interruptible(1_024 * 1_024, || true);
assert!(stopped, "should report it was interrupted");
assert!(
start.elapsed() < ms(500),
"must not sleep the full computed wait when stopped"
);
}
#[cfg(feature = "std")]
#[test]
fn request_interruptible_zero_rate_is_immediate_passthrough() {
let rl = RateLimiter::new(0);
let start = std::time::Instant::now();
let stopped = rl.request_interruptible(1_000_000, || false);
assert!(!stopped, "rate 0 never throttles, so never interrupted");
assert!(start.elapsed() < ms(500), "rate 0 must not sleep");
}
#[test]
fn backwards_clock_step_does_not_underflow() {
let rl = RateLimiter::new(1_000);
let _ = rl.acquire_wait(1_000, ms(1_000));
assert_eq!(ms(500), rl.acquire_wait(500, ms(0)));
}