#![warn(rust_2018_idioms)] #![cfg(feature = "full")] use tokio::runtime::Runtime; #[test] #[cfg_attr(panic = "abort", ignore)] fn basic_enter() { let rt1 = rt(); let rt2 = rt(); let enter1 = rt1.enter(); let enter2 = rt2.enter(); drop(enter2); drop(enter1); } #[test] #[should_panic] #[cfg_attr(panic = "abort", ignore)] fn interleave_enter_different_rt() { let rt1 = rt(); let rt2 = rt(); let enter1 = rt1.enter(); let enter2 = rt2.enter(); drop(enter1); drop(enter2); } #[test] #[should_panic] #[cfg_attr(panic = "abort", ignore)] fn interleave_enter_same_rt() { let rt1 = rt(); let _enter1 = rt1.enter(); let enter2 = rt1.enter(); let enter3 = rt1.enter(); drop(enter2); drop(enter3); } #[test] #[cfg(not(target_os = "wasi"))] #[cfg_attr(panic = "abort", ignore)] fn interleave_then_enter() { let _ = std::panic::catch_unwind(|| { let rt1 = rt(); let rt2 = rt(); let enter1 = rt1.enter(); let enter2 = rt2.enter(); drop(enter1); drop(enter2); }); // Can still enter let rt3 = rt(); let _enter = rt3.enter(); } #[cfg(tokio_unstable)] mod unstable { use super::*; #[test] fn runtime_id_is_same() { let rt = rt(); let handle1 = rt.handle(); let handle2 = rt.handle(); assert_eq!(handle1.id(), handle2.id()); } #[test] fn runtime_ids_different() { let rt1 = rt(); let rt2 = rt(); assert_ne!(rt1.handle().id(), rt2.handle().id()); } } fn rt() -> Runtime { tokio::runtime::Builder::new_current_thread() .build() .unwrap() }