1 #![allow(clippy::unnecessary_operation)]
2 #![warn(rust_2018_idioms)]
3 #![cfg(feature = "sync")]
4 
5 #[cfg(all(target_family = "wasm", not(target_os = "wasi")))]
6 use wasm_bindgen_test::wasm_bindgen_test as test;
7 
8 use tokio::sync::Barrier;
9 
10 use tokio_test::task::spawn;
11 use tokio_test::{assert_pending, assert_ready};
12 
13 struct IsSend<T: Send>(T);
14 #[test]
barrier_future_is_send()15 fn barrier_future_is_send() {
16     let b = Barrier::new(0);
17     IsSend(b.wait());
18 }
19 
20 #[test]
zero_does_not_block()21 fn zero_does_not_block() {
22     let b = Barrier::new(0);
23 
24     {
25         let mut w = spawn(b.wait());
26         let wr = assert_ready!(w.poll());
27         assert!(wr.is_leader());
28     }
29     {
30         let mut w = spawn(b.wait());
31         let wr = assert_ready!(w.poll());
32         assert!(wr.is_leader());
33     }
34 }
35 
36 #[test]
single()37 fn single() {
38     let b = Barrier::new(1);
39 
40     {
41         let mut w = spawn(b.wait());
42         let wr = assert_ready!(w.poll());
43         assert!(wr.is_leader());
44     }
45     {
46         let mut w = spawn(b.wait());
47         let wr = assert_ready!(w.poll());
48         assert!(wr.is_leader());
49     }
50     {
51         let mut w = spawn(b.wait());
52         let wr = assert_ready!(w.poll());
53         assert!(wr.is_leader());
54     }
55 }
56 
57 #[test]
tango()58 fn tango() {
59     let b = Barrier::new(2);
60 
61     let mut w1 = spawn(b.wait());
62     assert_pending!(w1.poll());
63 
64     let mut w2 = spawn(b.wait());
65     let wr2 = assert_ready!(w2.poll());
66     let wr1 = assert_ready!(w1.poll());
67 
68     assert!(wr1.is_leader() || wr2.is_leader());
69     assert!(!(wr1.is_leader() && wr2.is_leader()));
70 }
71 
72 #[test]
lots()73 fn lots() {
74     let b = Barrier::new(100);
75 
76     for _ in 0..10 {
77         let mut wait = Vec::new();
78         for _ in 0..99 {
79             let mut w = spawn(b.wait());
80             assert_pending!(w.poll());
81             wait.push(w);
82         }
83         for w in &mut wait {
84             assert_pending!(w.poll());
85         }
86 
87         // pass the barrier
88         let mut w = spawn(b.wait());
89         let mut found_leader = assert_ready!(w.poll()).is_leader();
90         for mut w in wait {
91             let wr = assert_ready!(w.poll());
92             if wr.is_leader() {
93                 assert!(!found_leader);
94                 found_leader = true;
95             }
96         }
97         assert!(found_leader);
98     }
99 }
100