v0.27.3
This commit is contained in:
1 parent
e84df445c6
commit
e87a382a7e
109 files changed
+1092
-2925
No files matched your search
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user