1 use futures::channel::oneshot;
2 use futures::executor::block_on;
3 use futures::future::{abortable, Aborted, FutureExt};
4 use futures::task::{Context, Poll};
5 use futures_test::task::new_count_waker;
6 
7 #[test]
abortable_works()8 fn abortable_works() {
9     let (_tx, a_rx) = oneshot::channel::<()>();
10     let (abortable_rx, abort_handle) = abortable(a_rx);
11 
12     abort_handle.abort();
13     assert!(abortable_rx.is_aborted());
14     assert_eq!(Err(Aborted), block_on(abortable_rx));
15 }
16 
17 #[test]
abortable_awakens()18 fn abortable_awakens() {
19     let (_tx, a_rx) = oneshot::channel::<()>();
20     let (mut abortable_rx, abort_handle) = abortable(a_rx);
21 
22     let (waker, counter) = new_count_waker();
23     let mut cx = Context::from_waker(&waker);
24 
25     assert_eq!(counter, 0);
26     assert_eq!(Poll::Pending, abortable_rx.poll_unpin(&mut cx));
27     assert_eq!(counter, 0);
28 
29     abort_handle.abort();
30     assert_eq!(counter, 1);
31     assert!(abortable_rx.is_aborted());
32     assert_eq!(Poll::Ready(Err(Aborted)), abortable_rx.poll_unpin(&mut cx));
33 }
34 
35 #[test]
abortable_resolves()36 fn abortable_resolves() {
37     let (tx, a_rx) = oneshot::channel::<()>();
38     let (abortable_rx, _abort_handle) = abortable(a_rx);
39 
40     tx.send(()).unwrap();
41 
42     assert!(!abortable_rx.is_aborted());
43     assert_eq!(Ok(Ok(())), block_on(abortable_rx));
44 }
45