use ranked_semaphore::{PriorityConfig, QueueStrategy, RankedSemaphore};
use std::sync::Arc;
use futures::executor::block_on;
use futures::future::join_all;
#[test]
fn test_futures_runtime_basic_usage() {
block_on(async {
let sem = RankedSemaphore::new_fifo(3);
let permit1 = sem.acquire().await.unwrap();
assert_eq!(sem.available_permits(), 2);
let permit2 = sem.acquire_many(2).await.unwrap();
assert_eq!(sem.available_permits(), 0);
assert!(sem.try_acquire().is_err());
drop(permit1);
assert_eq!(sem.available_permits(), 1);
drop(permit2);
assert_eq!(sem.available_permits(), 3);
});
}
#[test]
fn test_futures_runtime_priority_access() {
block_on(async {
let config = PriorityConfig::new()
.default_strategy(QueueStrategy::Fifo)
.greater_or_equal(5, QueueStrategy::Lifo);
let sem = Arc::new(RankedSemaphore::new_with_config(2, config));
let permit_high = Arc::clone(&sem).try_acquire_owned().unwrap();
let permit_med = Arc::clone(&sem).try_acquire_owned().unwrap();
drop(permit_high);
let high_prio_permit = sem.acquire_with_priority(10).await.unwrap();
assert_eq!(high_prio_permit.num_permits(), 1);
drop(permit_med);
let low_prio_permit = sem.acquire_with_priority(0).await.unwrap();
assert_eq!(low_prio_permit.num_permits(), 1);
});
}
#[test]
fn test_futures_runtime_concurrent_operations() {
block_on(async {
let sem = Arc::new(RankedSemaphore::new_fifo(5));
let mut futures = vec![];
for i in 0..10 {
let sem_clone = Arc::clone(&sem);
let future = async move {
let _permit = sem_clone.acquire().await.unwrap();
i
};
futures.push(future);
}
let results = join_all(futures).await;
for (i, result) in results.into_iter().enumerate() {
assert_eq!(result, i);
}
assert_eq!(sem.available_permits(), 5);
});
}
#[test]
fn test_futures_runtime_semaphore_close() {
block_on(async {
let sem = Arc::new(RankedSemaphore::new_fifo(0));
sem.close();
let result = sem.acquire_owned().await;
assert!(result.is_err());
});
}