use memkit_async::{MkAsyncPool, MkBackpressure};
use std::time::Duration;
use std::sync::Arc;
use tokio::time::sleep;
#[tokio::test]
async fn test_pool_contention() {
let pool = MkAsyncPool::new(2, MkBackpressure::Wait);
pool.add(10).unwrap();
pool.add(20).unwrap();
let mut handles = Vec::new();
let counter = Arc::new(std::sync::atomic::AtomicUsize::new(0));
for i in 0..10 {
let pool = pool.clone();
let counter = counter.clone();
handles.push(tokio::spawn(async move {
let guard = pool.acquire().await.expect("Failed to acquire");
sleep(Duration::from_millis(10)).await;
let val = *guard;
assert!(val == 10 || val == 20);
counter.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
println!("Task {} acquired {}", i, val);
}));
}
for h in handles {
h.await.unwrap();
}
assert_eq!(counter.load(std::sync::atomic::Ordering::Relaxed), 10);
assert_eq!(pool.available(), 2);
}
#[tokio::test]
async fn test_backpressure_timeout() {
let pool = MkAsyncPool::new(1, MkBackpressure::Timeout(Duration::from_millis(100)));
pool.add(1).unwrap();
let _guard1 = pool.acquire().await.unwrap();
let result = pool.acquire().await;
assert!(result.is_none(), "Should have timed out");
}