#![allow(clippy::missing_docs_in_private_items)]
use super::*;
#[cfg(target_os = "macos")]
#[test]
fn plist_carries_label_program_args_and_supervision_keys() {
let plist = render_plist(
std::path::Path::new("/opt/moadim/bin/moadim"),
std::path::Path::new("/Users/u/.config/moadim/daemon.log"),
);
assert!(plist.contains("<string>io.moadim.daemon</string>"));
assert!(plist.contains("<string>/opt/moadim/bin/moadim</string>"));
assert!(plist.contains("<string>--interactive</string>"));
assert!(plist.contains("<key>RunAtLoad</key>"));
assert!(plist.contains("<key>KeepAlive</key>"));
assert!(plist.contains("/Users/u/.config/moadim/daemon.log"));
}
#[cfg(target_os = "macos")]
#[test]
fn plist_escapes_xml_metacharacters_in_paths() {
let plist = render_plist(
std::path::Path::new("/tmp/a&b<c>"),
std::path::Path::new("/tmp/log"),
);
assert!(plist.contains("/tmp/a&b<c>"));
assert!(!plist.contains("a&b<c>"));
}
#[cfg(target_os = "macos")]
#[test]
fn xml_escape_covers_all_five_metacharacters() {
assert_eq!(xml_escape("&<>\"'"), "&<>"'");
}
#[cfg(target_os = "macos")]
#[test]
fn plist_path_is_under_launch_agents() {
let path = plist_path().unwrap();
assert!(path.ends_with("Library/LaunchAgents/io.moadim.daemon.plist"));
}
#[cfg(target_os = "linux")]
#[test]
fn unit_carries_exec_start_and_install_section() {
let unit = render_unit(std::path::Path::new("/opt/moadim/bin/moadim"));
assert!(unit.contains("ExecStart=/opt/moadim/bin/moadim --interactive"));
assert!(unit.contains("[Install]"));
assert!(unit.contains("WantedBy=default.target"));
assert!(unit.contains("Restart=always"));
}
#[cfg(target_os = "linux")]
#[test]
fn unit_path_is_under_systemd_user() {
let path = unit_path().unwrap();
assert!(path.ends_with("systemd/user/moadim.service"));
}
#[cfg(any(target_os = "macos", target_os = "linux"))]
#[test]
fn run_succeeds_for_a_zero_exit_command() {
super::common::run("true", &[]).unwrap();
}
#[cfg(any(target_os = "macos", target_os = "linux"))]
#[test]
fn run_errors_on_nonzero_exit() {
assert!(super::common::run("false", &[]).is_err());
}
#[cfg(any(target_os = "macos", target_os = "linux"))]
#[test]
fn run_errors_when_program_is_missing() {
assert!(super::common::run("moadim-no-such-binary-zzzqq", &[]).is_err());
}
#[cfg(target_os = "macos")]
#[test]
fn launchctl_bin_defaults_to_launchctl_when_unset() {
let previous = std::env::var_os("MOADIM_LAUNCHCTL_BIN");
unsafe {
std::env::remove_var("MOADIM_LAUNCHCTL_BIN");
}
assert_eq!(launchctl_bin(), "launchctl");
unsafe {
if let Some(value) = previous {
std::env::set_var("MOADIM_LAUNCHCTL_BIN", value);
}
}
}
#[cfg(target_os = "macos")]
#[test]
fn plist_path_errors_when_home_is_unknown() {
assert!(plist_path_from_home(None).is_err());
let path = plist_path_from_home(Some(std::path::PathBuf::from("/home/u"))).unwrap();
assert!(path.ends_with("Library/LaunchAgents/io.moadim.daemon.plist"));
}
#[cfg(target_os = "macos")]
#[test]
fn write_plist_skips_dir_creation_when_paths_have_no_parent() {
let no_parent = std::path::Path::new("");
assert!(write_plist(no_parent, no_parent, no_parent).is_err());
}
#[cfg(target_os = "macos")]
#[test]
fn install_then_uninstall_round_trips_against_a_sandbox() {
use std::os::unix::fs::PermissionsExt as _;
let base = std::env::temp_dir().join(format!("moadim-svc-install-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&base).unwrap();
let shim = base.join("launchctl");
std::fs::write(&shim, "#!/bin/sh\nexit 0\n").unwrap();
std::fs::set_permissions(&shim, std::fs::Permissions::from_mode(0o755)).unwrap();
let prev_home = std::env::var_os("HOME");
let prev_override = std::env::var_os("MOADIM_HOME_OVERRIDE");
let prev_launchctl = std::env::var_os("MOADIM_LAUNCHCTL_BIN");
unsafe {
std::env::set_var("HOME", &base);
std::env::set_var("MOADIM_HOME_OVERRIDE", &base);
std::env::set_var("MOADIM_LAUNCHCTL_BIN", &shim);
}
let plist = base.join("Library/LaunchAgents/io.moadim.daemon.plist");
install().unwrap();
assert!(plist.exists(), "install writes the LaunchAgent plist");
uninstall().unwrap();
assert!(!plist.exists(), "uninstall removes the plist");
uninstall().unwrap();
unsafe {
match prev_home {
Some(value) => std::env::set_var("HOME", value),
None => std::env::remove_var("HOME"),
}
match prev_override {
Some(value) => std::env::set_var("MOADIM_HOME_OVERRIDE", value),
None => std::env::remove_var("MOADIM_HOME_OVERRIDE"),
}
match prev_launchctl {
Some(value) => std::env::set_var("MOADIM_LAUNCHCTL_BIN", value),
None => std::env::remove_var("MOADIM_LAUNCHCTL_BIN"),
}
}
let _ = std::fs::remove_dir_all(&base);
}