#![warn(rust_2018_idioms)] #![cfg(all(feature = "full", not(tokio_wasi)))] // Wasi does not support bind use tokio::net::TcpListener; use tokio::runtime; use tokio_test::{assert_err, assert_pending, assert_ready, task}; #[test] fn tcp_doesnt_block() { let rt = rt(); let listener = { let _enter = rt.enter(); let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap(); TcpListener::from_std(listener).unwrap() }; drop(rt); let mut task = task::spawn(async move { assert_err!(listener.accept().await); }); assert_ready!(task.poll()); } #[test] fn drop_wakes() { let rt = rt(); let listener = { let _enter = rt.enter(); let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap(); TcpListener::from_std(listener).unwrap() }; let mut task = task::spawn(async move { assert_err!(listener.accept().await); }); assert_pending!(task.poll()); drop(rt); assert!(task.is_woken()); assert_ready!(task.poll()); } fn rt() -> runtime::Runtime { runtime::Builder::new_current_thread() .enable_all() .build() .unwrap() }