1 #![warn(rust_2018_idioms)]
2 #![cfg(feature = "full")]
3 
4 use tokio::net::TcpListener;
5 use tokio::runtime;
6 use tokio_test::{assert_err, assert_pending, assert_ready, task};
7 
8 #[test]
tcp_doesnt_block()9 fn tcp_doesnt_block() {
10     let rt = rt();
11 
12     let mut listener = rt.enter(|| {
13         let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap();
14         TcpListener::from_std(listener).unwrap()
15     });
16 
17     drop(rt);
18 
19     let mut task = task::spawn(async move {
20         assert_err!(listener.accept().await);
21     });
22 
23     assert_ready!(task.poll());
24 }
25 
26 #[test]
drop_wakes()27 fn drop_wakes() {
28     let rt = rt();
29 
30     let mut listener = rt.enter(|| {
31         let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap();
32         TcpListener::from_std(listener).unwrap()
33     });
34 
35     let mut task = task::spawn(async move {
36         assert_err!(listener.accept().await);
37     });
38 
39     assert_pending!(task.poll());
40 
41     drop(rt);
42 
43     assert!(task.is_woken());
44     assert_ready!(task.poll());
45 }
46 
rt() -> runtime::Runtime47 fn rt() -> runtime::Runtime {
48     runtime::Builder::new()
49         .basic_scheduler()
50         .enable_all()
51         .build()
52         .unwrap()
53 }
54