| use std::time::Duration; | |
| use super::ShutdownBehavior; | |
| use super::run_until_shutdown_with_signals; | |
| async fn parent_disconnect_still_stops_executor_after_signal_listener_error() { | |
| let (parent_sender, parent_receiver) = tokio::sync::oneshot::channel(); | |
| let (shutdown_sender, shutdown_receiver) = tokio::sync::oneshot::channel(); | |
| let run = async move { | |
| let _ = shutdown_receiver.await; | |
| Ok::<(), std::io::Error>(()) | |
| }; | |
| let task = tokio::spawn(run_until_shutdown_with_signals( | |
| run, | |
| async move { | |
| let _ = parent_receiver.await; | |
| }, | |
| std::future::ready(Err(std::io::Error::other("signal listener failed"))), | |
| ShutdownBehavior::Graceful(shutdown_sender), | |
| )); | |
| tokio::task::yield_now().await; | |
| parent_sender.send(()).expect("parent lifetime receiver"); | |
| tokio::time::timeout(Duration::from_secs(1), task) | |
| .await | |
| .expect("parent disconnect should stop the executor") | |
| .expect("shutdown task should not panic") | |
| .expect("executor should shut down successfully"); | |
| } | |