#![allow(
clippy::missing_docs_in_private_items,
reason = "test helpers and fixtures do not need doc comments"
)]
use super::*;
fn never_expires_runtime(_slug: &str) -> u64 {
u64::MAX
}
fn noop_kill(_session: &str) {}
fn finish_at_trigger(_dir: &std::path::Path, trigger_ts: u64) -> u64 {
trigger_ts
}
fn noop_persist(
_slug: &str,
_name: &str,
_path: &std::path::Path,
_started_at: u64,
_finished_at: u64,
) {
}
#[test]
fn parse_workbench_name_splits_slug_and_timestamp() {
assert_eq!(parse_workbench_name("foo-123"), Some(("foo", 123)));
assert_eq!(
parse_workbench_name("my-routine-1700000000"),
Some(("my-routine", 1_700_000_000))
);
assert_eq!(
parse_workbench_name("my-routine-1700000000_12345"),
Some(("my-routine", 1_700_000_000))
);
assert_eq!(parse_workbench_name("foo-123_9"), Some(("foo", 123)));
}
#[test]
fn parse_workbench_name_rejects_non_workbench_dirs() {
assert_eq!(parse_workbench_name("noseparator"), None);
assert_eq!(parse_workbench_name("foo-bar"), None); assert_eq!(parse_workbench_name("foo-"), None); assert_eq!(parse_workbench_name("-123"), None); }
#[test]
fn is_expired_compares_age_against_ttl() {
assert!(is_expired(1000, 0, 500)); assert!(!is_expired(1000, 600, 500)); assert!(!is_expired(1000, 1000, 0)); assert!(!is_expired(1000, 2000, 0));
}
fn touch_dir(parent: &std::path::Path, name: &str) {
std::fs::create_dir_all(parent.join(name)).unwrap();
}
#[test]
fn reap_dir_removes_only_finished_and_expired() {
let base = std::env::temp_dir().join("moadim-cleanup-reap-test");
let _ = std::fs::remove_dir_all(&base);
std::fs::create_dir_all(&base).unwrap();
touch_dir(&base, "expired-100"); touch_dir(&base, "fresh-900"); touch_dir(&base, "running-100"); touch_dir(&base, "notawb"); std::fs::write(base.join("stray-50"), b"x").unwrap();
let now = 1000;
let ttl_for = |_slug: &str| 500_u64; let alive = |session: &str| session == "moadim-running-100";
let stats = reap_dir(
&base,
now,
&ttl_for,
&never_expires_runtime,
&alive,
&noop_kill,
&finish_at_trigger,
&noop_persist,
);
assert_eq!(stats.removed, 1);
assert_eq!(stats.freed_bytes, 0, "an empty reaped dir frees 0 bytes");
assert!(!base.join("expired-100").exists());
assert!(base.join("fresh-900").exists());
assert!(base.join("running-100").exists());
assert!(base.join("notawb").exists());
std::fs::remove_dir_all(&base).unwrap();
}
#[test]
fn reap_dir_uses_per_slug_ttl() {
let base = std::env::temp_dir().join("moadim-cleanup-perslug-test");
let _ = std::fs::remove_dir_all(&base);
std::fs::create_dir_all(&base).unwrap();
touch_dir(&base, "short-500");
touch_dir(&base, "long-500");
let now = 1000;
let ttl_for = |slug: &str| if slug == "short" { 100 } else { 100_000 };
let dead = |_session: &str| false;
let stats = reap_dir(
&base,
now,
&ttl_for,
&never_expires_runtime,
&dead,
&noop_kill,
&finish_at_trigger,
&noop_persist,
);
assert_eq!(stats.removed, 1);
assert!(!base.join("short-500").exists());
assert!(base.join("long-500").exists());
std::fs::remove_dir_all(&base).unwrap();
}
include!("reap_dir_measures_ttl_from_finish_not_trigger_tests.rs");
include!("kill_all_routine_sessions_tests.rs");