lesavka/tests/system/scripts/install/systemd_unit_env_contract.rs

91 lines
2.9 KiB
Rust
Raw Normal View History

// System lifecycle contract for generated systemd units and env files.
//
// Scope: assert install-time unit/env generation remains idempotent and
// restart-safe without touching the live host.
// Targets: `scripts/install/server.sh`.
// Why: the server is a bare-metal appliance; systemd/env drift is one of the
// easiest ways to reintroduce stale codecs or unsafe gadget behavior.
const SERVER_INSTALL: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/scripts/install/server.sh"
));
#[test]
fn generated_systemd_units_load_runtime_env_files_in_the_right_places() {
for marker in [
"EnvironmentFile=-/etc/lesavka/server.env",
"EnvironmentFile=-/etc/lesavka/uvc.env",
"ExecStartPre=/usr/local/bin/lesavka-core.sh --attach",
"ExecStart=/usr/local/bin/lesavka-server",
"ExecStart=/usr/local/bin/lesavka-uvc.sh",
"Wants=lesavka-uvc.service",
"Requires=lesavka-core.service",
] {
assert!(
SERVER_INSTALL.contains(marker),
"generated units should preserve marker {marker}"
);
}
}
#[test]
fn generated_units_are_restartable_without_leaking_helper_processes() {
for marker in [
"Restart=always",
"RestartSec=5",
"RestartSec=2",
"KillMode=control-group",
"TimeoutStopSec=10",
"StandardError=append:/var/log/lesavka/server.stderr",
"StandardError=append:/var/log/lesavka/uvc.stderr",
] {
assert!(
SERVER_INSTALL.contains(marker),
"generated units should preserve restart marker {marker}"
);
}
assert!(
!SERVER_INSTALL.contains("KillMode=process"),
"helpers should not be left behind by process-only termination"
);
assert!(
!SERVER_INSTALL.contains("RefuseManualStop=yes"),
"operators need to be able to stop services during recovery"
);
}
#[test]
fn env_files_are_rendered_to_tempfiles_then_installed_idempotently() {
for marker in [
"render_uvc_env_file >\"$UVC_ENV_TMP\"",
"sudo cmp -s \"$UVC_ENV_TMP\" /etc/lesavka/uvc.env",
"sudo install -m 0644 \"$UVC_ENV_TMP\" /etc/lesavka/uvc.env",
"UVC_ENV_CHANGED=0",
"lesavka-uvc already active; runtime settings unchanged.",
] {
assert!(
SERVER_INSTALL.contains(marker),
"UVC env update should preserve idempotence marker {marker}"
);
}
}
#[test]
fn server_env_persists_runtime_profile_and_tls_settings() {
for marker in [
"LESAVKA_CAM_CODEC=%s",
"LESAVKA_UPSTREAM_HEVC_VIDEO_PLAYOUT_MODE_OFFSETS_US=%s",
"LESAVKA_UPSTREAM_MJPEG_VIDEO_PLAYOUT_MODE_OFFSETS_US=%s",
"LESAVKA_UVC_HEVC_FREEZE_ON_SIZE_DROP=%s",
"LESAVKA_SERVER_BIND_ADDR=%s",
"LESAVKA_REQUIRE_TLS=%s",
"LESAVKA_TLS_CLIENT_CA=%s",
] {
assert!(
SERVER_INSTALL.contains(marker),
"server env should persist marker {marker}"
);
}
}