| #![allow(unknown_lints, unexpected_cfgs)] |
| #![warn(rust_2018_idioms)] |
| #![cfg(all(feature = "full", tokio_unstable))] |
| |
| use tokio::runtime::LocalOptions; |
| use tokio::task::spawn_local; |
| |
| #[test] |
| fn test_spawn_local_in_runtime() { |
| let rt = rt(); |
| |
| let res = rt.block_on(async move { |
| let (tx, rx) = tokio::sync::oneshot::channel(); |
| |
| spawn_local(async { |
| tokio::task::yield_now().await; |
| tx.send(5).unwrap(); |
| }); |
| |
| rx.await.unwrap() |
| }); |
| |
| assert_eq!(res, 5); |
| } |
| |
| #[test] |
| fn test_spawn_from_handle() { |
| let rt = rt(); |
| |
| let (tx, rx) = tokio::sync::oneshot::channel(); |
| |
| rt.handle().spawn(async { |
| tokio::task::yield_now().await; |
| tx.send(5).unwrap(); |
| }); |
| |
| let res = rt.block_on(async move { rx.await.unwrap() }); |
| |
| assert_eq!(res, 5); |
| } |
| |
| #[test] |
| fn test_spawn_local_on_runtime_object() { |
| let rt = rt(); |
| |
| let (tx, rx) = tokio::sync::oneshot::channel(); |
| |
| rt.spawn_local(async { |
| tokio::task::yield_now().await; |
| tx.send(5).unwrap(); |
| }); |
| |
| let res = rt.block_on(async move { rx.await.unwrap() }); |
| |
| assert_eq!(res, 5); |
| } |
| |
| #[test] |
| fn test_spawn_local_from_guard() { |
| let rt = rt(); |
| |
| let (tx, rx) = tokio::sync::oneshot::channel(); |
| |
| let _guard = rt.enter(); |
| |
| spawn_local(async { |
| tokio::task::yield_now().await; |
| tx.send(5).unwrap(); |
| }); |
| |
| let res = rt.block_on(async move { rx.await.unwrap() }); |
| |
| assert_eq!(res, 5); |
| } |
| |
| #[test] |
| #[should_panic] |
| fn test_spawn_local_from_guard_other_thread() { |
| let (tx, rx) = std::sync::mpsc::channel(); |
| |
| std::thread::spawn(move || { |
| let rt = rt(); |
| let handle = rt.handle().clone(); |
| |
| tx.send(handle).unwrap(); |
| }); |
| |
| let handle = rx.recv().unwrap(); |
| |
| let _guard = handle.enter(); |
| |
| spawn_local(async {}); |
| } |
| |
| fn rt() -> tokio::runtime::LocalRuntime { |
| tokio::runtime::Builder::new_current_thread() |
| .enable_all() |
| .build_local(&LocalOptions::default()) |
| .unwrap() |
| } |