mod utils; use std::io::Read; use std::process::{Command, Stdio}; use std::thread::sleep; use std::time::Duration; use utils::shell_command; const SLEEP_DURATION: Duration = Duration::from_millis(10); const SLEEP_ATTEMPS: u32 = 100; #[test] fn does_not_stall_if_status_does_not_match() { let mut child = Command::new(env!("CARGO_BIN_EXE_prcs")) .arg("-s=>=100") .args(&shell_command("exit 42")) .spawn() .unwrap(); for _ in 0..SLEEP_ATTEMPS { if child.try_wait().unwrap().is_some() { return; } sleep(SLEEP_DURATION); } panic!( "prcs did not exit in more than {:?}.", SLEEP_ATTEMPS * SLEEP_DURATION ) } #[test] fn stalls_if_status_matches() { let mut child = Command::new(env!("CARGO_BIN_EXE_prcs")) .arg("-s=>=100") .args(&shell_command("echo text && exit 123")) .stdout(Stdio::piped()) .spawn() .unwrap(); let mut child_stdout = child.stdout.take().unwrap(); let mut output = [0; 4]; for _ in 0..SLEEP_ATTEMPS { child_stdout.read(&mut output).unwrap(); if &output == b"text" { sleep(SLEEP_DURATION); assert!(child.try_wait().unwrap().is_none()); return; } sleep(SLEEP_DURATION); } panic!( "Did not observe child command exit in more than {:?}.", SLEEP_ATTEMPS * SLEEP_DURATION ) }