1 #![warn(rust_2018_idioms)]
2 #![cfg(feature = "full")]
3 
4 use tokio::sync::Notify;
5 use tokio_test::task::spawn;
6 use tokio_test::*;
7 
8 trait AssertSend: Send + Sync {}
9 impl AssertSend for Notify {}
10 
11 #[test]
notify_notified_one()12 fn notify_notified_one() {
13     let notify = Notify::new();
14     let mut notified = spawn(async { notify.notified().await });
15 
16     notify.notify();
17     assert_ready!(notified.poll());
18 }
19 
20 #[test]
notified_one_notify()21 fn notified_one_notify() {
22     let notify = Notify::new();
23     let mut notified = spawn(async { notify.notified().await });
24 
25     assert_pending!(notified.poll());
26 
27     notify.notify();
28     assert!(notified.is_woken());
29     assert_ready!(notified.poll());
30 }
31 
32 #[test]
notified_multi_notify()33 fn notified_multi_notify() {
34     let notify = Notify::new();
35     let mut notified1 = spawn(async { notify.notified().await });
36     let mut notified2 = spawn(async { notify.notified().await });
37 
38     assert_pending!(notified1.poll());
39     assert_pending!(notified2.poll());
40 
41     notify.notify();
42     assert!(notified1.is_woken());
43     assert!(!notified2.is_woken());
44 
45     assert_ready!(notified1.poll());
46     assert_pending!(notified2.poll());
47 }
48 
49 #[test]
notify_notified_multi()50 fn notify_notified_multi() {
51     let notify = Notify::new();
52 
53     notify.notify();
54 
55     let mut notified1 = spawn(async { notify.notified().await });
56     let mut notified2 = spawn(async { notify.notified().await });
57 
58     assert_ready!(notified1.poll());
59     assert_pending!(notified2.poll());
60 
61     notify.notify();
62 
63     assert!(notified2.is_woken());
64     assert_ready!(notified2.poll());
65 }
66 
67 #[test]
notified_drop_notified_notify()68 fn notified_drop_notified_notify() {
69     let notify = Notify::new();
70     let mut notified1 = spawn(async { notify.notified().await });
71     let mut notified2 = spawn(async { notify.notified().await });
72 
73     assert_pending!(notified1.poll());
74 
75     drop(notified1);
76 
77     assert_pending!(notified2.poll());
78 
79     notify.notify();
80     assert!(notified2.is_woken());
81     assert_ready!(notified2.poll());
82 }
83 
84 #[test]
notified_multi_notify_drop_one()85 fn notified_multi_notify_drop_one() {
86     let notify = Notify::new();
87     let mut notified1 = spawn(async { notify.notified().await });
88     let mut notified2 = spawn(async { notify.notified().await });
89 
90     assert_pending!(notified1.poll());
91     assert_pending!(notified2.poll());
92 
93     notify.notify();
94 
95     assert!(notified1.is_woken());
96     assert!(!notified2.is_woken());
97 
98     drop(notified1);
99 
100     assert!(notified2.is_woken());
101     assert_ready!(notified2.poll());
102 }
103