This commit is contained in:
Mateusz Gruszczyński committed 2026-10-07 22:22:54 +02:00
1 parent e84df445c6
commit e87a382a7e
109 files changed
+1092 -2925

No files matched your search

+76
View File
@@ -33,4 +33,80 @@ mod tests {
assert!(limiter.check(1, "site", ip, Some("PL"), &settings).is_ok());
assert!(limiter.check(1, "site", ip, Some("PL"), &settings).is_err());
}
#[test]
fn expired_client_buckets_are_reclaimed_without_waiting_for_capacity_pressure() {
let settings = Settings {
enabled: true,
requests: 10,
window_seconds: 1,
burst: 0,
..Default::default()
};
let limiter = Limiter::new();
let first = "192.0.2.1".parse().unwrap();
let second = "192.0.2.2".parse().unwrap();
assert!(limiter.check(7, "site", first, None, &settings).is_ok());
{
let mut state = lock(&limiter.state);
let bucket = state.buckets.get_mut("site").unwrap().get_mut(&first).unwrap();
bucket.started = Instant::now()
.checked_sub(Duration::from_secs(2))
.unwrap();
state.last_sweep = None;
}
assert!(limiter.check(7, "site", second, None, &settings).is_ok());
let state = lock(&limiter.state);
assert_eq!(state.bucket_count, 1);
assert!(!state.buckets.get("site").unwrap().contains_key(&first));
assert!(state.buckets.get("site").unwrap().contains_key(&second));
}
#[test]
fn maintenance_reclaims_expired_clients_without_new_traffic() {
let settings = Settings {
enabled: true,
requests: 10,
window_seconds: 1,
burst: 0,
..Default::default()
};
let limiter = Limiter::new();
let ip = "192.0.2.10".parse().unwrap();
assert!(limiter.check(9, "idle-site", ip, None, &settings).is_ok());
{
let mut state = lock(&limiter.state);
let bucket = state
.buckets
.get_mut("idle-site")
.unwrap()
.get_mut(&ip)
.unwrap();
bucket.started = Instant::now()
.checked_sub(Duration::from_secs(2))
.unwrap();
}
limiter.maintenance();
let state = lock(&limiter.state);
assert_eq!(state.bucket_count, 0);
assert!(state.buckets.is_empty());
}
#[test]
fn vhost_name_is_stored_once_for_multiple_clients() {
let settings = Settings {
enabled: true,
requests: 10,
..Default::default()
};
let limiter = Limiter::new();
for ip in ["192.0.2.1", "192.0.2.2"] {
assert!(limiter
.check(1, "shared-vhost", ip.parse().unwrap(), None, &settings)
.is_ok());
}
let state = lock(&limiter.state);
assert_eq!(state.buckets.len(), 1);
assert_eq!(state.bucket_count, 2);
}
}