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()10fn 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()30fn 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::Runtime51fn rt() -> runtime::Runtime { 52 runtime::Builder::new_current_thread() 53 .enable_all() 54 .build() 55 .unwrap() 56 } 57