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