#![allow(
clippy::missing_docs_in_private_items,
reason = "test helpers and fixtures do not need doc comments"
)]
use super::*;
#[test]
fn tmux_kill_session_is_best_effort_on_missing_session() {
tmux_kill_session("moadim-nonexistent-watchdog-test-session");
}
#[test]
fn tmux_bin_falls_back_to_a_nonexistent_path_under_cfg_test() {
let previous = std::env::var_os("MOADIM_TMUX_BIN");
unsafe {
std::env::remove_var("MOADIM_TMUX_BIN");
}
let bin = super::session::tmux_bin();
assert_ne!(bin, "tmux", "test build must not spawn the real tmux");
assert!(
!std::path::Path::new(&bin).exists(),
"test fallback must point at a non-existent path: {bin}"
);
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_TMUX_BIN", value),
None => std::env::remove_var("MOADIM_TMUX_BIN"),
}
}
}
#[test]
fn tmux_session_alive_reflects_the_bin_exit_status() {
let previous = std::env::var_os("MOADIM_TMUX_BIN");
let set = |bin: &str| {
unsafe { std::env::set_var("MOADIM_TMUX_BIN", bin) };
};
set("/usr/bin/true");
assert!(
super::session::tmux_session_alive("moadim-anything"),
"a 0-exit tmux stub reads as alive"
);
set("/usr/bin/false");
assert!(
!super::session::tmux_session_alive("moadim-anything"),
"a non-zero-exit tmux stub reads as not alive"
);
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_TMUX_BIN", value),
None => std::env::remove_var("MOADIM_TMUX_BIN"),
}
}
}
#[test]
fn tmux_session_prefix_alive_matches_any_session_starting_with_prefix() {
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt as _;
let dir = std::env::temp_dir().join(format!("moadim-tmux-prefix-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
let stub = dir.join("tmux");
std::fs::write(
&stub,
"#!/bin/sh\nprintf 'moadim-other-100_1\\nmoadim-foo-200_2\\nmoadim-baz-qux-300_3\\n'\nexit 0\n",
)
.unwrap();
#[cfg(unix)]
std::fs::set_permissions(&stub, std::fs::Permissions::from_mode(0o755)).unwrap();
let previous = std::env::var_os("MOADIM_TMUX_BIN");
unsafe { std::env::set_var("MOADIM_TMUX_BIN", &stub) };
assert!(
super::session::tmux_session_prefix_alive("moadim-foo-"),
"a listed session starting with the prefix must read as alive"
);
assert!(
!super::session::tmux_session_prefix_alive("moadim-bar-"),
"no listed session starts with this prefix"
);
assert!(
!super::session::tmux_session_prefix_alive("moadim-baz-"),
"a different routine's session name being a string-superset of the prefix (baz-qux vs. \
baz) must not read as baz's own fire still being alive"
);
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_TMUX_BIN", value),
None => std::env::remove_var("MOADIM_TMUX_BIN"),
}
}
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn tmux_session_prefix_alive_false_when_tmux_bin_missing_or_fails() {
let previous = std::env::var_os("MOADIM_TMUX_BIN");
unsafe { std::env::set_var("MOADIM_TMUX_BIN", "/usr/bin/false") };
assert!(!super::session::tmux_session_prefix_alive("moadim-foo-"));
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_TMUX_BIN", value),
None => std::env::remove_var("MOADIM_TMUX_BIN"),
}
}
}
#[test]
fn tmux_session_count_counts_every_session_starting_with_the_prefix() {
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt as _;
let dir = std::env::temp_dir().join(format!("moadim-tmux-count-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
let stub = dir.join("tmux");
std::fs::write(
&stub,
"#!/bin/sh\nprintf 'moadim-foo-100_1\\nmoadim-bar-200_2\\nunrelated-session\\n'\nexit 0\n",
)
.unwrap();
#[cfg(unix)]
std::fs::set_permissions(&stub, std::fs::Permissions::from_mode(0o755)).unwrap();
let previous = std::env::var_os("MOADIM_TMUX_BIN");
unsafe { std::env::set_var("MOADIM_TMUX_BIN", &stub) };
assert_eq!(
super::session::tmux_session_count("moadim-"),
2,
"both moadim-prefixed sessions count, regardless of which routine/slug spawned them"
);
assert_eq!(super::session::tmux_session_count("moadim-nonexistent-"), 0);
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_TMUX_BIN", value),
None => std::env::remove_var("MOADIM_TMUX_BIN"),
}
}
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn tmux_session_count_is_zero_when_tmux_bin_missing_or_fails() {
let previous = std::env::var_os("MOADIM_TMUX_BIN");
unsafe { std::env::set_var("MOADIM_TMUX_BIN", "/usr/bin/false") };
assert_eq!(super::session::tmux_session_count("moadim-"), 0);
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_TMUX_BIN", value),
None => std::env::remove_var("MOADIM_TMUX_BIN"),
}
}
}
#[test]
fn note_forced_kill_is_silent_when_log_cannot_be_opened() {
let missing = std::env::temp_dir().join(format!("moadim-nfk-missing-{}", uuid::Uuid::new_v4()));
let _ = std::fs::remove_dir_all(&missing);
super::session::note_forced_kill(&missing);
assert!(!missing.exists());
}
#[test]
fn cleanup_expired_workbenches_kills_a_live_expired_session() {
let home = std::env::temp_dir().join(format!("moadim-cleanup-live-{}", uuid::Uuid::new_v4()));
let prev_home = std::env::var_os("MOADIM_HOME_OVERRIDE");
let prev_tmux = std::env::var_os("MOADIM_TMUX_BIN");
unsafe {
std::env::set_var("MOADIM_HOME_OVERRIDE", &home);
std::env::set_var("MOADIM_TMUX_BIN", "/usr/bin/true");
}
let workbenches = crate::paths::workbenches_dir();
std::fs::create_dir_all(&workbenches).unwrap();
std::fs::create_dir_all(workbenches.join("alive-1")).unwrap();
let store = super::super::model::new_store();
let stats = cleanup_expired_workbenches(&store);
assert!(
stats.removed >= 1,
"the live, expired workbench is killed and reaped"
);
assert!(!workbenches.join("alive-1").exists());
unsafe {
match prev_home {
Some(value) => std::env::set_var("MOADIM_HOME_OVERRIDE", value),
None => std::env::remove_var("MOADIM_HOME_OVERRIDE"),
}
match prev_tmux {
Some(value) => std::env::set_var("MOADIM_TMUX_BIN", value),
None => std::env::remove_var("MOADIM_TMUX_BIN"),
}
}
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn tmux_bin_honors_the_override_env_var() {
let previous = std::env::var_os("MOADIM_TMUX_BIN");
unsafe {
std::env::set_var("MOADIM_TMUX_BIN", "/tmp/moadim-test-tmux-override");
}
assert_eq!(super::session::tmux_bin(), "/tmp/moadim-test-tmux-override");
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_TMUX_BIN", value),
None => std::env::remove_var("MOADIM_TMUX_BIN"),
}
}
}