• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::sync::AtomicWaker;
2 use tokio_test::task;
3 
4 use std::task::Waker;
5 
6 trait AssertSend: Send {}
7 trait AssertSync: Send {}
8 
9 impl AssertSend for AtomicWaker {}
10 impl AssertSync for AtomicWaker {}
11 
12 impl AssertSend for Waker {}
13 impl AssertSync for Waker {}
14 
15 #[test]
basic_usage()16 fn basic_usage() {
17     let mut waker = task::spawn(AtomicWaker::new());
18 
19     waker.enter(|cx, waker| waker.register_by_ref(cx.waker()));
20     waker.wake();
21 
22     assert!(waker.is_woken());
23 }
24 
25 #[test]
wake_without_register()26 fn wake_without_register() {
27     let mut waker = task::spawn(AtomicWaker::new());
28     waker.wake();
29 
30     // Registering should not result in a notification
31     waker.enter(|cx, waker| waker.register_by_ref(cx.waker()));
32 
33     assert!(!waker.is_woken());
34 }
35 
36 #[test]
atomic_waker_panic_safe()37 fn atomic_waker_panic_safe() {
38     use std::panic;
39     use std::ptr;
40     use std::task::{RawWaker, RawWakerVTable, Waker};
41 
42     static PANICKING_VTABLE: RawWakerVTable = RawWakerVTable::new(
43         |_| panic!("clone"),
44         |_| unimplemented!("wake"),
45         |_| unimplemented!("wake_by_ref"),
46         |_| (),
47     );
48 
49     static NONPANICKING_VTABLE: RawWakerVTable = RawWakerVTable::new(
50         |_| RawWaker::new(ptr::null(), &NONPANICKING_VTABLE),
51         |_| unimplemented!("wake"),
52         |_| unimplemented!("wake_by_ref"),
53         |_| (),
54     );
55 
56     let panicking = unsafe { Waker::from_raw(RawWaker::new(ptr::null(), &PANICKING_VTABLE)) };
57     let nonpanicking = unsafe { Waker::from_raw(RawWaker::new(ptr::null(), &NONPANICKING_VTABLE)) };
58 
59     let atomic_waker = AtomicWaker::new();
60 
61     let panicking = panic::AssertUnwindSafe(&panicking);
62 
63     let result = panic::catch_unwind(|| {
64         let panic::AssertUnwindSafe(panicking) = panicking;
65         atomic_waker.register_by_ref(panicking);
66     });
67 
68     assert!(result.is_err());
69     assert!(atomic_waker.take_waker().is_none());
70 
71     atomic_waker.register_by_ref(&nonpanicking);
72     assert!(atomic_waker.take_waker().is_some());
73 }
74