use super::*;
use cli_spawn_tests::{temp_home, EnvGuard, FakeServer, UNREACHABLE_ADDR};
#[test]
fn write_pid_file_errors_when_config_dir_is_blocked() {
let base = temp_home("pid-dir-blocked");
std::fs::create_dir_all(base.join(".config")).unwrap();
std::fs::write(base.join(".config/moadim"), "block").unwrap();
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", base.to_str().unwrap());
assert!(write_pid_file().is_err());
let _ = std::fs::remove_dir_all(&base);
}
#[test]
fn write_pid_file_skips_readme_when_its_subdir_is_blocked() {
let base = temp_home("readme-subdir-blocked");
let config_dir = base.join(".config/moadim");
std::fs::create_dir_all(&config_dir).unwrap();
std::fs::write(config_dir.join("routines"), "block").unwrap();
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", base.to_str().unwrap());
write_pid_file().unwrap();
assert!(crate::paths::config_readme_path().exists());
assert!(!crate::paths::routines_readme_path().exists());
let _ = std::fs::remove_dir_all(&base);
}
#[test]
fn write_pid_file_errors_when_pid_path_is_directory() {
let base = temp_home("pid-path-is-dir");
let config_dir = base.join(".config/moadim");
std::fs::create_dir_all(config_dir.join("moadim.pid")).unwrap();
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", base.to_str().unwrap());
assert!(write_pid_file().is_err());
let _ = std::fs::remove_dir_all(&base);
}
#[test]
fn spawn_detached_errors_when_log_dir_creation_blocked() {
let base = temp_home("spawn-log-blocked");
std::fs::create_dir_all(base.join(".config")).unwrap();
std::fs::write(base.join(".config/moadim"), "block").unwrap();
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", base.to_str().unwrap());
assert!(spawn_detached().is_err());
let _ = std::fs::remove_dir_all(&base);
}
#[test]
fn spawn_detached_errors_when_log_file_path_is_directory() {
let base = temp_home("spawn-log-is-dir");
let config_dir = base.join(".config/moadim");
std::fs::create_dir_all(config_dir.join("daemon.log")).unwrap();
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", base.to_str().unwrap());
assert!(spawn_detached().is_err());
let _ = std::fs::remove_dir_all(&base);
}
#[test]
fn spawn_detached_errors_when_current_exe_resolution_fails() {
let _fail = EnvGuard::set(crate::utils::process::CURRENT_EXE_FAIL_ENV, "1");
assert!(spawn_detached().is_err());
}
#[test]
fn spawn_restart_errors_when_current_exe_resolution_fails() {
let _fail = EnvGuard::set(crate::utils::process::CURRENT_EXE_FAIL_ENV, "1");
assert!(spawn_restart().is_err());
}
#[test]
fn spawn_detached_rotates_oversized_daemon_log() {
let base = temp_home("spawn-log-rotate");
let config_dir = base.join(".config/moadim");
std::fs::create_dir_all(&config_dir).unwrap();
let log_path = config_dir.join("daemon.log");
std::fs::write(&log_path, vec![b'x'; (DAEMON_LOG_MAX_BYTES + 1) as usize]).unwrap();
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", base.to_str().unwrap());
let pid = spawn_detached().expect("spawn detached child");
let rotated = config_dir.join("daemon.log.1");
assert!(
rotated.exists(),
"oversized daemon.log should be rotated to daemon.log.1"
);
assert!(
std::fs::metadata(&log_path).unwrap().len() < DAEMON_LOG_MAX_BYTES,
"fresh daemon.log should not still hold the oversized contents"
);
#[cfg(unix)]
unsafe {
libc::kill(
libc::pid_t::try_from(pid).unwrap_or(libc::pid_t::MAX),
libc::SIGKILL,
);
}
#[cfg(not(unix))]
let _ = pid;
let _ = std::fs::remove_dir_all(&base);
}
#[test]
fn run_background_errors_when_stop_running_times_out() {
let server = FakeServer::start(200, String::new());
let home = temp_home("runbg-stop-err");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
let _addr = EnvGuard::set(BIND_ADDR_ENV, &server.addr);
let _timeout = EnvGuard::set("MOADIM_RESTART_TIMEOUT_MS", "1");
let _poll = EnvGuard::set("MOADIM_RESTART_POLL_MS", "1");
assert!(run_background().is_err());
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn restart_errors_when_stop_running_times_out() {
let server = FakeServer::start(200, String::new());
let home = temp_home("restart-stop-err");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
let _addr = EnvGuard::set(BIND_ADDR_ENV, &server.addr);
let _timeout = EnvGuard::set("MOADIM_RESTART_TIMEOUT_MS", "1");
let _poll = EnvGuard::set("MOADIM_RESTART_POLL_MS", "1");
assert!(restart(false, false).is_err());
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn restart_errors_when_spawn_detached_fails() {
let base = temp_home("restart-spawn-err");
std::fs::create_dir_all(base.join(".config")).unwrap();
std::fs::write(base.join(".config/moadim"), "block").unwrap();
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", base.to_str().unwrap());
let _addr = EnvGuard::set(BIND_ADDR_ENV, UNREACHABLE_ADDR);
assert!(restart(false, false).is_err());
let _ = std::fs::remove_dir_all(&base);
}
#[test]
fn run_background_errors_when_spawn_detached_fails() {
let base = temp_home("runbg-spawn-err");
std::fs::create_dir_all(base.join(".config")).unwrap();
std::fs::write(base.join(".config/moadim"), "block").unwrap();
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", base.to_str().unwrap());
let _addr = EnvGuard::set(BIND_ADDR_ENV, UNREACHABLE_ADDR);
assert!(run_background().is_err());
let _ = std::fs::remove_dir_all(&base);
}