use std::path::PathBuf;
#[allow(unused_imports)]
use nmbrs_adapter_stdout::StdoutAdapter as _PullInStdoutAdapter;
fn run_args(args: &[String]) {
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.expect("tokio rt");
rt.block_on(async {
nmbrs_runtime::runner::run(args)
.await
.expect("runner.run returned Err — daemon `if:` pull resolution regressed")
});
}
fn tempdir(prefix: &str) -> PathBuf {
let n = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos();
let d = std::env::temp_dir().join(format!("{prefix}-{n:x}"));
std::fs::create_dir_all(&d).unwrap();
d
}
fn in_dir<F: FnOnce()>(dir: &std::path::Path, f: F) {
use std::sync::Mutex;
static CWD_LOCK: Mutex<()> = Mutex::new(());
let _g = CWD_LOCK.lock().unwrap_or_else(|e| e.into_inner());
let prev = std::env::current_dir().unwrap();
std::env::set_current_dir(dir).unwrap();
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(f));
std::env::set_current_dir(prev).unwrap();
if let Err(e) = result {
std::panic::resume_unwind(e);
}
}
const DAEMON_IF_WORKLOAD: &str = r#"
phases:
drive:
cycles: 1
concurrency: 1
ops:
trigger:
daemon: true
if: "cycle >= 0"
stmt: "daemon fired"
scenarios:
default: [drive]
"#;
#[test]
fn daemon_op_with_if_condition_completes() {
let dir = tempdir("nmbrs-daemon-if-e2e");
let workload_path = dir.join("workload.yaml");
std::fs::write(&workload_path, DAEMON_IF_WORKLOAD).expect("write workload");
in_dir(&dir, || {
run_args(&[
format!("workload={}", workload_path.display()),
"driver=stdout".into(),
])
});
}