| #![cfg(all(unix, feature = "process"))] |
| #![warn(rust_2018_idioms)] |
| |
| use std::io::ErrorKind; |
| use std::process::Stdio; |
| use std::time::Duration; |
| use tokio::io::AsyncReadExt; |
| use tokio::process::Command; |
| use tokio::time::sleep; |
| use tokio_test::assert_ok; |
| |
| #[tokio::test] |
| async fn kill_on_drop() { |
| let mut cmd = Command::new("bash"); |
| cmd.args(&[ |
| "-c", |
| " |
| # Fork another child that won't get killed |
| sh -c 'sleep 1; echo child ran' & |
| disown -a |
| |
| # Await our death |
| sleep 5 |
| echo hello from beyond the grave |
| ", |
| ]); |
| |
| let e = cmd.kill_on_drop(true).stdout(Stdio::piped()).spawn(); |
| if e.is_err() && e.as_ref().unwrap_err().kind() == ErrorKind::NotFound { |
| println!("bash not available; skipping test"); |
| return; |
| } |
| let mut child = e.unwrap(); |
| |
| sleep(Duration::from_secs(2)).await; |
| |
| let mut out = child.stdout.take().unwrap(); |
| drop(child); |
| |
| let mut msg = String::new(); |
| assert_ok!(out.read_to_string(&mut msg).await); |
| |
| assert_eq!("child ran\n", msg); |
| } |