1 #![warn(rust_2018_idioms)]
2 #![cfg(feature = "full")]
3 
4 use tokio::sync::oneshot;
5 use tokio::time::{self, timeout, timeout_at, Instant};
6 use tokio_test::*;
7 
8 use futures::future::pending;
9 use std::time::Duration;
10 
11 #[tokio::test]
simultaneous_deadline_future_completion()12 async fn simultaneous_deadline_future_completion() {
13     // Create a future that is immediately ready
14     let mut fut = task::spawn(timeout_at(Instant::now(), async {}));
15 
16     // Ready!
17     assert_ready_ok!(fut.poll());
18 }
19 
20 #[tokio::test]
completed_future_past_deadline()21 async fn completed_future_past_deadline() {
22     // Wrap it with a deadline
23     let mut fut = task::spawn(timeout_at(Instant::now() - ms(1000), async {}));
24 
25     // Ready!
26     assert_ready_ok!(fut.poll());
27 }
28 
29 #[tokio::test]
future_and_deadline_in_future()30 async fn future_and_deadline_in_future() {
31     time::pause();
32 
33     // Not yet complete
34     let (tx, rx) = oneshot::channel();
35 
36     // Wrap it with a deadline
37     let mut fut = task::spawn(timeout_at(Instant::now() + ms(100), rx));
38 
39     assert_pending!(fut.poll());
40 
41     // Turn the timer, it runs for the elapsed time
42     time::advance(ms(90)).await;
43 
44     assert_pending!(fut.poll());
45 
46     // Complete the future
47     tx.send(()).unwrap();
48     assert!(fut.is_woken());
49 
50     assert_ready_ok!(fut.poll()).unwrap();
51 }
52 
53 #[tokio::test]
future_and_timeout_in_future()54 async fn future_and_timeout_in_future() {
55     time::pause();
56 
57     // Not yet complete
58     let (tx, rx) = oneshot::channel();
59 
60     // Wrap it with a deadline
61     let mut fut = task::spawn(timeout(ms(100), rx));
62 
63     // Ready!
64     assert_pending!(fut.poll());
65 
66     // Turn the timer, it runs for the elapsed time
67     time::advance(ms(90)).await;
68 
69     assert_pending!(fut.poll());
70 
71     // Complete the future
72     tx.send(()).unwrap();
73 
74     assert_ready_ok!(fut.poll()).unwrap();
75 }
76 
77 #[tokio::test]
deadline_now_elapses()78 async fn deadline_now_elapses() {
79     use futures::future::pending;
80 
81     time::pause();
82 
83     // Wrap it with a deadline
84     let mut fut = task::spawn(timeout_at(Instant::now(), pending::<()>()));
85 
86     // Factor in jitter
87     // TODO: don't require this
88     time::advance(ms(1)).await;
89 
90     assert_ready_err!(fut.poll());
91 }
92 
93 #[tokio::test]
deadline_future_elapses()94 async fn deadline_future_elapses() {
95     time::pause();
96 
97     // Wrap it with a deadline
98     let mut fut = task::spawn(timeout_at(Instant::now() + ms(300), pending::<()>()));
99 
100     assert_pending!(fut.poll());
101 
102     time::advance(ms(301)).await;
103 
104     assert!(fut.is_woken());
105     assert_ready_err!(fut.poll());
106 }
107 
ms(n: u64) -> Duration108 fn ms(n: u64) -> Duration {
109     Duration::from_millis(n)
110 }
111