use super::*;
struct EnvGuard {
name: &'static str,
previous: Option<std::ffi::OsString>,
}
impl EnvGuard {
fn set(name: &'static str, value: &str) -> Self {
let previous = std::env::var_os(name);
unsafe { std::env::set_var(name, value) }
Self { name, previous }
}
}
impl Drop for EnvGuard {
fn drop(&mut self) {
unsafe {
match self.previous.take() {
Some(value) => std::env::set_var(self.name, value),
None => std::env::remove_var(self.name),
}
}
}
}
fn temp_home(tag: &str) -> std::path::PathBuf {
let dir = std::env::temp_dir().join(format!("moadim-machine-{tag}-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).expect("create temp home");
dir
}
#[test]
fn max_concurrent_runs_override_absent_is_none() {
let home = temp_home("cap-absent");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
assert_eq!(max_concurrent_runs_override(), None);
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn set_max_concurrent_runs_override_then_read_roundtrips() {
let home = temp_home("cap-roundtrip");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
set_max_concurrent_runs_override(Some(7)).expect("write cap override");
assert_eq!(max_concurrent_runs_override(), Some(7));
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn set_max_concurrent_runs_override_none_clears_it() {
let home = temp_home("cap-clear");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
set_max_concurrent_runs_override(Some(3)).expect("write cap override");
set_max_concurrent_runs_override(None).expect("clear cap override");
assert_eq!(max_concurrent_runs_override(), None);
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn set_machine_preserves_existing_concurrency_override() {
let home = temp_home("cap-preserve-on-name-set");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
set_max_concurrent_runs_override(Some(5)).expect("write cap override");
set_machine("my-box").expect("write machine name");
assert_eq!(max_concurrent_runs_override(), Some(5));
assert_eq!(read_machine_file(), Some("my-box".to_string()));
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn set_max_concurrent_runs_override_preserves_existing_machine_name() {
let home = temp_home("cap-preserve-name");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
set_machine("my-box").expect("write machine name");
set_max_concurrent_runs_override(Some(5)).expect("write cap override");
assert_eq!(read_machine_file(), Some("my-box".to_string()));
assert_eq!(max_concurrent_runs_override(), Some(5));
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn concurrent_set_machine_and_set_cap_override_do_not_clobber_each_other() {
let home = temp_home("concurrent-rmw");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
let barrier = std::sync::Arc::new(std::sync::Barrier::new(2));
let b1 = std::sync::Arc::clone(&barrier);
let t1 = std::thread::spawn(move || {
b1.wait();
set_machine("racer-box").expect("set_machine");
});
let b2 = std::sync::Arc::clone(&barrier);
let t2 = std::thread::spawn(move || {
b2.wait();
set_max_concurrent_runs_override(Some(9)).expect("set_max_concurrent_runs_override");
});
t1.join().unwrap();
t2.join().unwrap();
assert_eq!(
read_machine_file(),
Some("racer-box".to_string()),
"concurrent cap-override write must not drop the machine name"
);
assert_eq!(
max_concurrent_runs_override(),
Some(9),
"concurrent machine-name write must not drop the cap override"
);
let _ = std::fs::remove_dir_all(&home);
}
#[test]
fn set_max_concurrent_runs_override_returns_err_on_write_failure() {
let home = temp_home("cap-write-fail");
let _home = EnvGuard::set("MOADIM_HOME_OVERRIDE", home.to_str().unwrap());
let config_dir = home.join(".config").join("moadim");
std::fs::create_dir_all(config_dir.parent().unwrap()).unwrap();
std::fs::write(&config_dir, b"").unwrap(); assert!(set_max_concurrent_runs_override(Some(1)).is_err());
let _ = std::fs::remove_dir_all(&home);
}