//! Process lifecycle: background spawn, liveness, stop. mod common; use agent_manager::process; use std::collections::BTreeMap; fn sleep_cmd() -> (&'static str, Vec) { if cfg!(windows) { ( "ping", vec![ "-n".to_string(), "40".to_string(), "127.0.0.1".to_string(), ], ) } else { ("sleep", vec!["40".to_string()]) } } #[test] fn spawn_detect_stop_cycle() { let app = common::test_app("proc", &["status"]); let (prog, args) = sleep_cmd(); let env = BTreeMap::new(); let pid = process::spawn_background( &app, "test-agent", std::path::Path::new(prog), &args, &env, ) .unwrap(); assert!(pid > 0); assert!(process::is_running(pid)); assert!(process::stop_pid(pid, true, 5)); assert!(!process::is_running(pid)); // The log file was created. assert!(process::agent_log_path(&app, "test-agent").exists()); } #[test] fn spawning_a_failing_program_reports_an_error() { let app = common::test_app("procfail", &["status"]); let env = BTreeMap::new(); // A command that exits immediately with an error. let (prog, args) = if cfg!(windows) { ("cmd", vec!["/C".to_string(), "exit 7".to_string()]) } else { ("sh", vec!["-c".to_string(), "exit 7".to_string()]) }; let err = process::spawn_background( &app, "failing", std::path::Path::new(prog), &args, &env, ) .unwrap_err(); assert!( err.to_string().contains("exited immediately"), "unexpected error: {err:#}" ); }