Add --headless mode (no stdin read, runs until SIGTERM/exit) + systemd/NixOS examples
ci / check (push) Successful in 2m44s
ci / check (push) Successful in 2m44s
This commit is contained in:
@@ -39,3 +39,34 @@ fn bare_command_without_a_world_starts_init() {
|
||||
// It asks before it creates anything.
|
||||
assert!(!dir.join("world").exists());
|
||||
}
|
||||
|
||||
/// `--headless` never reads stdin: with stdin at EOF the world stays up, and
|
||||
/// SIGTERM stops it cleanly (exit code 0).
|
||||
#[test]
|
||||
fn headless_ignores_stdin_eof_and_stops_cleanly_on_sigterm() {
|
||||
use std::io::{BufRead, BufReader};
|
||||
let dir = empty_dir("headless");
|
||||
let world = dir.join("world");
|
||||
sausage::World::create(&world).unwrap();
|
||||
let mut child = Command::new(env!("CARGO_BIN_EXE_sausage"))
|
||||
.args(["run", "--headless"])
|
||||
.arg(&world)
|
||||
.stdin(Stdio::null())
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::null())
|
||||
.spawn()
|
||||
.unwrap();
|
||||
let mut lines = BufReader::new(child.stdout.take().unwrap()).lines();
|
||||
// The host prints this once it runs and the signal handlers are installed.
|
||||
let line = lines.next().expect("host exited before it started").unwrap();
|
||||
assert!(line.contains("headless"), "unexpected first line: {line}");
|
||||
// The host reaches EOF on stdin immediately; it must still be running.
|
||||
std::thread::sleep(std::time::Duration::from_millis(500));
|
||||
assert!(child.try_wait().unwrap().is_none(), "headless host exited on stdin EOF");
|
||||
let pid = child.id().to_string();
|
||||
assert!(Command::new("kill").args(["-TERM", &pid]).status().unwrap().success());
|
||||
let rest: Vec<String> = lines.map(|l| l.unwrap()).collect();
|
||||
let status = child.wait().unwrap();
|
||||
assert!(status.success(), "exit status {status:?}, output {rest:?}");
|
||||
assert!(rest.iter().any(|l| l.contains("Stopping actors")), "output {rest:?}");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user