use serde_json::json;
use zebflow::language::{DenoSandboxConfigPatch, DenoSandboxEngine};
#[test]
fn a_blocking_op_does_not_wedge_the_pool() {
let tmp = tempfile::Builder::new()
.prefix("zf_fifo_")
.tempdir()
.expect("tempdir");
let dir = tmp.path();
let fifo = dir.join("hang.fifo");
let made = std::process::Command::new("mkfifo")
.arg(&fifo)
.status()
.map(|s| s.success())
.unwrap_or(false);
if !made {
println!(" mkfifo unavailable — skipping");
return;
}
let engine = DenoSandboxEngine::default();
let patch = DenoSandboxConfigPatch {
local_fetch_root: Some(dir.display().to_string()),
timeout_ms: Some(150),
..Default::default()
};
let src = "const r = await fetch('/hang.fifo'); return { len: (await r.text()).length };";
for i in 0..8 {
let started = std::time::Instant::now();
let out = engine.run_script(src, &json!({}), Some(&patch));
println!(" fifo read {i}: {:?} after {:?}", out.is_ok(), started.elapsed());
}
let mut healthy = 0;
for _ in 0..8 {
if engine
.run_script("return { ok: 1 };", &json!({}), None)
.is_ok()
{
healthy += 1;
}
}
println!(" workers still serving afterwards: {healthy}/8");
assert_eq!(
healthy, 8,
"POOL WEDGED — only {healthy}/8 workers survived a blocking op; \
terminate_execution() cannot interrupt a blocked syscall in Rust"
);
}