Files
kyle a0495ea36a Add the inferproxy byte forwarder with its two limits
Implemented-By: Laguna S 2.1 (OpenCode)
2026-09-17 21:03:41 -07:00

71 lines
1.9 KiB
Rust

//! Tests for the accept-rate limiter. Do not edit: these define the required behaviour.
use inferproxy::{Limits, TokenBucket};
use std::time::{Duration, Instant};
#[test]
fn default_limits() {
let want = Limits {
max_connections: 8,
burst: 10,
per_second: 2,
};
assert_eq!(Limits::default(), want);
}
#[test]
fn starts_full_and_empties() {
let t0 = Instant::now();
let mut b = TokenBucket::new(3, 2, t0);
assert!(b.take(t0));
assert!(b.take(t0));
assert!(b.take(t0));
assert!(!b.take(t0), "a fourth take at the same instant must fail");
}
#[test]
fn refills_at_the_given_rate() {
let t0 = Instant::now();
let mut b = TokenBucket::new(1, 2, t0);
assert!(b.take(t0));
assert!(
!b.take(t0 + Duration::from_millis(499)),
"half a second at 2/s is one token"
);
assert!(b.take(t0 + Duration::from_millis(500)));
assert!(!b.take(t0 + Duration::from_millis(500)));
}
#[test]
fn partial_refills_add_up() {
// Ten checks 100 ms apart at 2/s must add up to two tokens, not zero.
let t0 = Instant::now();
let mut b = TokenBucket::new(1, 2, t0);
assert!(b.take(t0));
let granted = (1..=10)
.filter(|i| b.take(t0 + Duration::from_millis(100 * i)))
.count();
assert_eq!(granted, 2);
}
#[test]
fn never_holds_more_than_the_burst() {
let t0 = Instant::now();
let mut b = TokenBucket::new(2, 100, t0);
let later = t0 + Duration::from_secs(3600);
assert!(b.take(later));
assert!(b.take(later));
assert!(
!b.take(later),
"an hour of refill must still stop at the burst size"
);
}
#[test]
fn a_clock_that_does_not_advance_is_harmless() {
let t0 = Instant::now();
let mut b = TokenBucket::new(1, 2, t0 + Duration::from_secs(10));
assert!(b.take(t0), "an earlier `now` must not panic or underflow");
assert!(!b.take(t0));
}