use super::{kill_group, terminate_group};
use crate::spawn::{command, spawn};
use std::process::Stdio;
#[test]
fn a_running_child_leads_a_group_that_is_asked_to_stop() {
let mut cmd = command("/bin/sh");
cmd.args(["-c", "sleep 30"])
.stdout(Stdio::null())
.stderr(Stdio::null());
let mut child = spawn(&mut cmd).expect("sh runs");
assert!(terminate_group(child.id()), "the signal was sent");
let ended = child.wait().expect("waited");
assert!(
ended.code().is_none(),
"it did not exit on its own: {ended:?}"
);
}
#[test]
fn a_group_that_had_its_chance_is_killed() {
let mut cmd = command("/bin/sh");
cmd.args(["-c", "trap '' TERM; sleep 30"])
.stdout(Stdio::null())
.stderr(Stdio::null());
let mut child = spawn(&mut cmd).expect("sh runs");
assert!(terminate_group(child.id()), "the ask was sent");
assert!(kill_group(child.id()), "the insist was sent");
let ended = child.wait().expect("waited");
assert!(
ended.code().is_none(),
"it did not exit on its own: {ended:?}"
);
}
#[test]
fn a_non_positive_group_is_refused_rather_than_widened() {
assert!(!terminate_group(0));
}
#[test]
fn a_group_that_is_not_there_answers_false() {
let ceiling = u32::try_from(i32::MAX).expect("fits");
assert!(!terminate_group(ceiling));
assert!(!kill_group(ceiling));
}