mod helpers;
use helpers::TestContext;
use std::thread;
use std::time::Duration;
#[test]
fn test_stop_kills_child_processes() {
let ctx = TestContext::new("t-pgid");
let pid_file = ctx.state_dir.path().join("child.pid");
let pid_file_str = pid_file.to_str().unwrap();
let cmd = format!(
"bash -c 'echo $$ > {} && sleep 60' & sleep 60",
pid_file_str
);
let output = ctx
.cmd()
.args(["--session", &ctx.session, "run", &cmd, "--name", "parent"])
.output()
.unwrap();
assert!(output.status.success());
thread::sleep(Duration::from_millis(500));
let child_pid: i32 = std::fs::read_to_string(&pid_file)
.expect("child pid file not found")
.trim()
.parse()
.expect("invalid pid");
assert!(
nix::sys::signal::kill(nix::unistd::Pid::from_raw(child_pid), None).is_ok(),
"child process should be alive before stop"
);
let output = ctx
.cmd()
.args(["--session", &ctx.session, "stop", "parent"])
.output()
.unwrap();
assert!(output.status.success());
thread::sleep(Duration::from_millis(500));
assert!(
nix::sys::signal::kill(nix::unistd::Pid::from_raw(child_pid), None).is_err(),
"child process should be dead after stop"
);
let _ = ctx
.cmd()
.args(["--session", &ctx.session, "stop-all"])
.output();
}