hive-agent: compact tests set the harness dir like the other Bus tests
The two report_compact tests build a Bus, which resolves the events db under HYPERHIVE_HARNESS_DIR and panics when it is unset, as in the nix test sandbox. Add a test-only paths::with_harness_dir that points the variable at a temp dir under a lock, and use it in both the new tests and the existing swarm_inference Bus test, which set the variable unguarded.
This commit is contained in:
parent
2c4a3c2fa7
commit
3c03d82858
3 changed files with 69 additions and 37 deletions
|
|
@ -131,3 +131,38 @@ pub fn claude_dir() -> PathBuf {
|
|||
}
|
||||
PathBuf::from("/root/.claude")
|
||||
}
|
||||
|
||||
/// Run `f` with `HYPERHIVE_HARNESS_DIR` pointing at a fresh temp dir, then
|
||||
/// restore the previous value. Tests that build a `Bus` or read the harness
|
||||
/// state files go through this: the variable is process-wide, so the calls
|
||||
/// are serialised on a lock.
|
||||
#[cfg(test)]
|
||||
pub fn with_harness_dir<T>(f: impl FnOnce() -> T) -> T {
|
||||
use std::ffi::OsString;
|
||||
use std::sync::Mutex;
|
||||
|
||||
static LOCK: Mutex<()> = Mutex::new(());
|
||||
|
||||
struct Restore(Option<OsString>);
|
||||
impl Drop for Restore {
|
||||
fn drop(&mut self) {
|
||||
// SAFETY: still holding `LOCK`, the only writer of this variable.
|
||||
unsafe {
|
||||
match self.0.take() {
|
||||
Some(v) => std::env::set_var("HYPERHIVE_HARNESS_DIR", v),
|
||||
None => std::env::remove_var("HYPERHIVE_HARNESS_DIR"),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let _lock = LOCK
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
// Declared after `_lock` so the variable is restored before the lock drops.
|
||||
let _restore = Restore(std::env::var_os("HYPERHIVE_HARNESS_DIR"));
|
||||
// SAFETY: serialised by `LOCK`.
|
||||
unsafe { std::env::set_var("HYPERHIVE_HARNESS_DIR", dir.path()) };
|
||||
f()
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue