#![cfg(feature = "systemd")]
use std::io::Write;
use std::process::Command;
#[test]
fn rendered_unit_passes_systemd_analyze() {
let runner = escargot::CargoBuild::new()
.bin("innisfree")
.run()
.expect("failed to build innisfree binary via escargot");
let bin = runner.path().to_path_buf();
let render = Command::new(&bin)
.arg("systemd-service")
.arg("--executable-path")
.arg(&bin)
.output()
.expect("invoking innisfree systemd-service");
assert!(
render.status.success(),
"innisfree systemd-service failed (status={}):\nstderr:\n{}",
render.status,
String::from_utf8_lossy(&render.stderr),
);
let mut unit_file = tempfile::Builder::new()
.prefix("innisfree-")
.suffix("@.service")
.tempfile()
.expect("creating tempfile");
unit_file
.write_all(&render.stdout)
.expect("writing rendered unit to tempfile");
unit_file.flush().expect("flushing tempfile");
let verify = Command::new("systemd-analyze")
.arg("verify")
.arg(unit_file.path())
.output()
.expect("invoking systemd-analyze; is it installed and on PATH?");
let stderr = String::from_utf8_lossy(&verify.stderr);
let stdout = String::from_utf8_lossy(&verify.stdout);
assert!(
verify.status.success() && stderr.trim().is_empty() && stdout.trim().is_empty(),
"systemd-analyze verify failed or emitted warnings:\nstatus: {}\nstdout:\n{}\nstderr:\n{}",
verify.status,
stdout,
stderr,
);
}