| #![warn(rust_2018_idioms)] |
| #![cfg(feature = "full")] |
| |
| use tokio::sync::Notify; |
| use tokio_test::task::spawn; |
| use tokio_test::*; |
| |
| trait AssertSend: Send + Sync {} |
| impl AssertSend for Notify {} |
| |
| #[test] |
| fn notify_notified_one() { |
| let notify = Notify::new(); |
| let mut notified = spawn(async { notify.notified().await }); |
| |
| notify.notify(); |
| assert_ready!(notified.poll()); |
| } |
| |
| #[test] |
| fn notified_one_notify() { |
| let notify = Notify::new(); |
| let mut notified = spawn(async { notify.notified().await }); |
| |
| assert_pending!(notified.poll()); |
| |
| notify.notify(); |
| assert!(notified.is_woken()); |
| assert_ready!(notified.poll()); |
| } |
| |
| #[test] |
| fn notified_multi_notify() { |
| let notify = Notify::new(); |
| let mut notified1 = spawn(async { notify.notified().await }); |
| let mut notified2 = spawn(async { notify.notified().await }); |
| |
| assert_pending!(notified1.poll()); |
| assert_pending!(notified2.poll()); |
| |
| notify.notify(); |
| assert!(notified1.is_woken()); |
| assert!(!notified2.is_woken()); |
| |
| assert_ready!(notified1.poll()); |
| assert_pending!(notified2.poll()); |
| } |
| |
| #[test] |
| fn notify_notified_multi() { |
| let notify = Notify::new(); |
| |
| notify.notify(); |
| |
| let mut notified1 = spawn(async { notify.notified().await }); |
| let mut notified2 = spawn(async { notify.notified().await }); |
| |
| assert_ready!(notified1.poll()); |
| assert_pending!(notified2.poll()); |
| |
| notify.notify(); |
| |
| assert!(notified2.is_woken()); |
| assert_ready!(notified2.poll()); |
| } |
| |
| #[test] |
| fn notified_drop_notified_notify() { |
| let notify = Notify::new(); |
| let mut notified1 = spawn(async { notify.notified().await }); |
| let mut notified2 = spawn(async { notify.notified().await }); |
| |
| assert_pending!(notified1.poll()); |
| |
| drop(notified1); |
| |
| assert_pending!(notified2.poll()); |
| |
| notify.notify(); |
| assert!(notified2.is_woken()); |
| assert_ready!(notified2.poll()); |
| } |
| |
| #[test] |
| fn notified_multi_notify_drop_one() { |
| let notify = Notify::new(); |
| let mut notified1 = spawn(async { notify.notified().await }); |
| let mut notified2 = spawn(async { notify.notified().await }); |
| |
| assert_pending!(notified1.poll()); |
| assert_pending!(notified2.poll()); |
| |
| notify.notify(); |
| |
| assert!(notified1.is_woken()); |
| assert!(!notified2.is_woken()); |
| |
| drop(notified1); |
| |
| assert!(notified2.is_woken()); |
| assert_ready!(notified2.poll()); |
| } |