#![warn(rust_2018_idioms)] #![allow(clippy::declare_interior_mutable_const)] #![cfg(all(feature = "full", not(tokio_wasi)))] use futures::future; use std::error::Error; use tokio::runtime::Builder; use tokio::task::{self, block_in_place}; mod support { pub mod panic; } use support::panic::test_panic; #[test] fn block_in_place_panic_caller() -> Result<(), Box> { let panic_location_file = test_panic(|| { let rt = Builder::new_current_thread().enable_all().build().unwrap(); rt.block_on(async { block_in_place(|| {}); }); }); // The panic location should be in this file assert_eq!(&panic_location_file.unwrap(), file!()); Ok(()) } #[test] fn local_set_spawn_local_panic_caller() -> Result<(), Box> { let panic_location_file = test_panic(|| { let _local = task::LocalSet::new(); let _ = task::spawn_local(async {}); }); // The panic location should be in this file assert_eq!(&panic_location_file.unwrap(), file!()); Ok(()) } #[test] fn local_set_block_on_panic_caller() -> Result<(), Box> { let panic_location_file = test_panic(|| { let rt = Builder::new_current_thread().enable_all().build().unwrap(); let local = task::LocalSet::new(); rt.block_on(async { local.block_on(&rt, future::pending::<()>()); }); }); // The panic location should be in this file assert_eq!(&panic_location_file.unwrap(), file!()); Ok(()) } #[test] fn spawn_panic_caller() -> Result<(), Box> { let panic_location_file = test_panic(|| { tokio::spawn(future::pending::<()>()); }); // The panic location should be in this file assert_eq!(&panic_location_file.unwrap(), file!()); Ok(()) } #[test] fn local_key_sync_scope_panic_caller() -> Result<(), Box> { tokio::task_local! { static NUMBER: u32; } let panic_location_file = test_panic(|| { NUMBER.sync_scope(1, || { NUMBER.with(|_| { NUMBER.sync_scope(1, || {}); }); }); }); // The panic location should be in this file assert_eq!(&panic_location_file.unwrap(), file!()); Ok(()) } #[test] fn local_key_with_panic_caller() -> Result<(), Box> { tokio::task_local! { static NUMBER: u32; } let panic_location_file = test_panic(|| { NUMBER.with(|_| {}); }); // The panic location should be in this file assert_eq!(&panic_location_file.unwrap(), file!()); Ok(()) } #[test] fn local_key_get_panic_caller() -> Result<(), Box> { tokio::task_local! { static NUMBER: u32; } let panic_location_file = test_panic(|| { NUMBER.get(); }); // The panic location should be in this file assert_eq!(&panic_location_file.unwrap(), file!()); Ok(()) }