#![allow(unknown_lints, unexpected_cfgs)] #![warn(rust_2018_idioms)] #![cfg(all(feature = "full", not(target_os = "wasi"), target_has_atomic = "64"))] use tokio::runtime::Runtime; #[test] fn num_workers() { let rt = current_thread(); assert_eq!(1, rt.metrics().num_workers()); let rt = threaded(); assert_eq!(2, rt.metrics().num_workers()); } #[test] fn num_alive_tasks() { let rt = current_thread(); let metrics = rt.metrics(); assert_eq!(0, metrics.num_alive_tasks()); rt.block_on(rt.spawn(async move { assert_eq!(1, metrics.num_alive_tasks()); })) .unwrap(); assert_eq!(0, rt.metrics().num_alive_tasks()); let rt = threaded(); let metrics = rt.metrics(); assert_eq!(0, metrics.num_alive_tasks()); rt.block_on(rt.spawn(async move { assert_eq!(1, metrics.num_alive_tasks()); })) .unwrap(); // try for 10 seconds to see if this eventually succeeds. // wake_join() is called before the task is released, so in multithreaded // code, this means we sometimes exit the block_on before the counter decrements. for _ in 0..100 { if rt.metrics().num_alive_tasks() == 0 { break; } std::thread::sleep(std::time::Duration::from_millis(100)); } assert_eq!(0, rt.metrics().num_alive_tasks()); } fn current_thread() -> Runtime { tokio::runtime::Builder::new_current_thread() .enable_all() .build() .unwrap() } fn threaded() -> Runtime { tokio::runtime::Builder::new_multi_thread() .worker_threads(2) .enable_all() .build() .unwrap() }