1 #![cfg(feature = "full")]
2 
3 use std::sync::Arc;
4 use tokio::sync::Semaphore;
5 
6 #[test]
try_acquire()7 fn 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()20 async 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()32 async 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()43 fn 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()56 async 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