1 #![cfg(feature = "full")] 2 3 use std::sync::Arc; 4 use tokio::sync::Semaphore; 5 6 #[test] try_acquire()7fn try_acquire() { 8 let sem = Arc::new(Semaphore::new(1)); 9 { 10 let p1 = sem.clone().try_acquire_owned(); 11 assert!(p1.is_ok()); 12 let p2 = sem.clone().try_acquire_owned(); 13 assert!(p2.is_err()); 14 } 15 let p3 = sem.try_acquire_owned(); 16 assert!(p3.is_ok()); 17 } 18 19 #[tokio::test] acquire()20async fn acquire() { 21 let sem = Arc::new(Semaphore::new(1)); 22 let p1 = sem.clone().try_acquire_owned().unwrap(); 23 let sem_clone = sem.clone(); 24 let j = tokio::spawn(async move { 25 let _p2 = sem_clone.acquire_owned().await; 26 }); 27 drop(p1); 28 j.await.unwrap(); 29 } 30 31 #[tokio::test] add_permits()32async fn add_permits() { 33 let sem = Arc::new(Semaphore::new(0)); 34 let sem_clone = sem.clone(); 35 let j = tokio::spawn(async move { 36 let _p2 = sem_clone.acquire_owned().await; 37 }); 38 sem.add_permits(1); 39 j.await.unwrap(); 40 } 41 42 #[test] forget()43fn forget() { 44 let sem = Arc::new(Semaphore::new(1)); 45 { 46 let p = sem.clone().try_acquire_owned().unwrap(); 47 assert_eq!(sem.available_permits(), 0); 48 p.forget(); 49 assert_eq!(sem.available_permits(), 0); 50 } 51 assert_eq!(sem.available_permits(), 0); 52 assert!(sem.try_acquire_owned().is_err()); 53 } 54 55 #[tokio::test] stresstest()56async fn stresstest() { 57 let sem = Arc::new(Semaphore::new(5)); 58 let mut join_handles = Vec::new(); 59 for _ in 0..1000 { 60 let sem_clone = sem.clone(); 61 join_handles.push(tokio::spawn(async move { 62 let _p = sem_clone.acquire_owned().await; 63 })); 64 } 65 for j in join_handles { 66 j.await.unwrap(); 67 } 68 // there should be exactly 5 semaphores available now 69 let _p1 = sem.clone().try_acquire_owned().unwrap(); 70 let _p2 = sem.clone().try_acquire_owned().unwrap(); 71 let _p3 = sem.clone().try_acquire_owned().unwrap(); 72 let _p4 = sem.clone().try_acquire_owned().unwrap(); 73 let _p5 = sem.clone().try_acquire_owned().unwrap(); 74 assert!(sem.try_acquire_owned().is_err()); 75 } 76