use std::sync::Arc;
use std::time::Duration;
use std::thread;
use api_rate_limiter::limiter::RateLimiter;
use api_rate_limiter::cache::in_memory::InMemoryCache;
#[test]
fn test_rate_limiter_basic() {
let cache = Arc::new(InMemoryCache::new());
let limiter = RateLimiter::new(cache, 3, Duration::from_secs(1));
assert!(limiter.allow("127.0.0.1"));
assert!(limiter.allow("127.0.0.1"));
assert!(limiter.allow("127.0.0.1"));
assert!(!limiter.allow("127.0.0.1"));
thread::sleep(Duration::from_secs(1));
assert!(limiter.allow("127.0.0.1"));
}
#[test]
fn test_rate_limiter_zero_capacity() {
let cache = Arc::new(InMemoryCache::new());
let limiter = RateLimiter::new(cache, 0, Duration::from_secs(1));
assert!(!limiter.allow("127.0.0.1"));
}
#[test]
fn test_partial_refill() {
let cache = Arc::new(InMemoryCache::new());
let limiter = RateLimiter::new(cache, 5, Duration::from_secs(3));
for _ in 0..5 {
assert!(limiter.allow("127.0.0.1"));
}
assert!(!limiter.allow("127.0.0.1"));
thread::sleep(Duration::from_secs(1));
assert!(!limiter.allow("127.0.0.1"));
thread::sleep(Duration::from_secs(2));
assert!(limiter.allow("127.0.0.1"));
}
#[test]
fn test_concurrent_access() {
let cache = Arc::new(InMemoryCache::new());
let limiter = Arc::new(RateLimiter::new(cache, 10, Duration::from_secs(1)));
let mut handles = vec![];
for _ in 0..5 {
let limiter_clone = Arc::clone(&limiter);
handles.push(thread::spawn(move || {
assert!(limiter_clone.allow("127.0.0.1"));
}));
}
for handle in handles {
handle.join().unwrap();
}
}
#[test]
fn test_large_capacity() {
let cache = Arc::new(InMemoryCache::new());
let limiter = RateLimiter::new(cache, 500_000, Duration::from_secs(4));
for _ in 0..500_000 {
assert!(limiter.allow("127.0.0.1"));
}
assert!(!limiter.allow("127.0.0.1"));
thread::sleep(Duration::from_secs(1));
assert!(!limiter.allow("127.0.0.1"));
thread::sleep(Duration::from_secs(5));
assert!(limiter.allow("127.0.0.1"));
}