use std::io::Write;
use std::process::{Command, Stdio};
const STDOUT_MARKER: &[u8] = b"ZCCACHE_PASSTHROUGH_STDOUT_MARKER\n";
const STDERR_MARKER: &[u8] = b"ZCCACHE_PASSTHROUGH_STDERR_MARKER\n";
fn target_bin_dir() -> std::path::PathBuf {
let mut p = std::env::current_exe().expect("current_exe");
p.pop(); p.pop(); p
}
fn binary_path(stem: &str) -> std::path::PathBuf {
let mut p = target_bin_dir();
if cfg!(windows) {
p.push(format!("{stem}.exe"));
} else {
p.push(stem);
}
p
}
fn cache_dir_tempdir() -> tempfile::TempDir {
tempfile::Builder::new()
.prefix("zccache-wrapper-passthrough-")
.tempdir()
.expect("tempdir")
}
fn random_payload(len: usize, seed: u64) -> Vec<u8> {
let mut s = seed.wrapping_add(0x9E37_79B9_7F4A_7C15);
let mut out = Vec::with_capacity(len);
for _ in 0..len {
s ^= s << 13;
s ^= s >> 7;
s ^= s << 17;
out.push(s as u8);
}
out
}
fn stop_daemon(zccache: &std::path::Path, endpoint: &std::path::Path) {
let _ = Command::new(zccache)
.arg("stop")
.env("ZCCACHE_CACHE_DIR", endpoint)
.stdout(Stdio::null())
.stderr(Stdio::null())
.status();
}
fn run_wrapper(
zccache: &std::path::Path,
echo_shim: &std::path::Path,
cache_dir: &std::path::Path,
stdin_payload: &[u8],
exit_code: i32,
session_id: Option<&str>,
) -> (i32, Vec<u8>, Vec<u8>) {
let mut cmd = Command::new(zccache);
cmd.arg(echo_shim)
.arg(exit_code.to_string())
.env("ZCCACHE_CACHE_DIR", cache_dir)
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.stderr(Stdio::piped());
if let Some(sid) = session_id {
cmd.env("ZCCACHE_SESSION_ID", sid);
} else {
cmd.env_remove("ZCCACHE_SESSION_ID");
}
let mut child = cmd.spawn().expect("spawn zccache wrapper");
{
let mut stdin = child.stdin.take().expect("piped stdin");
stdin.write_all(stdin_payload).expect("write stdin payload");
}
let output = child.wait_with_output().expect("wait_with_output");
(
output.status.code().unwrap_or(-1),
output.stdout,
output.stderr,
)
}
fn assert_passthrough(payload: &[u8], stdout: &[u8], stderr: &[u8]) {
assert!(
stdout
.windows(STDOUT_MARKER.len())
.any(|w| w == STDOUT_MARKER),
"STDOUT_MARKER missing from wrapper stdout. stdout = {:?}",
String::from_utf8_lossy(stdout)
);
let stderr_marker_pos = stderr
.windows(STDERR_MARKER.len())
.position(|w| w == STDERR_MARKER)
.unwrap_or_else(|| {
panic!(
"STDERR_MARKER missing from wrapper stderr. stderr = {:?}",
String::from_utf8_lossy(stderr)
)
});
let after_marker = &stderr[stderr_marker_pos + STDERR_MARKER.len()..];
let payload_pos = after_marker
.windows(payload.len())
.position(|w| w == payload)
.unwrap_or_else(|| {
panic!(
"stdin payload ({} bytes) not found in wrapper stderr after the marker",
payload.len()
)
});
let _ = payload_pos; }
#[test]
#[ignore] fn wrapper_passthrough_ephemeral_exit_zero() {
let zccache = binary_path("zccache");
let echo_shim = binary_path("echo_shim");
assert!(
zccache.exists(),
"zccache binary missing at {zccache:?} — run `soldr cargo build -p zccache-cli` first"
);
assert!(
echo_shim.exists(),
"echo_shim binary missing at {echo_shim:?} — run `soldr cargo build -p zccache-test-support` first"
);
let cache_dir = cache_dir_tempdir();
let payload = random_payload(8 * 1024 + 7, 0xDEAD_BEEF);
let (code, stdout, stderr) =
run_wrapper(&zccache, &echo_shim, cache_dir.path(), &payload, 0, None);
stop_daemon(&zccache, cache_dir.path());
assert_eq!(
code,
0,
"wrapper exit code wrong (stderr: {:?})",
String::from_utf8_lossy(&stderr)
);
assert_passthrough(&payload, &stdout, &stderr);
}
#[test]
#[ignore] fn wrapper_passthrough_ephemeral_exit_nonzero() {
let zccache = binary_path("zccache");
let echo_shim = binary_path("echo_shim");
if !zccache.exists() || !echo_shim.exists() {
eprintln!("skipping: required binaries not built");
return;
}
let cache_dir = cache_dir_tempdir();
let payload = random_payload(2_048, 0xC0FFEE);
let (code, stdout, stderr) =
run_wrapper(&zccache, &echo_shim, cache_dir.path(), &payload, 7, None);
stop_daemon(&zccache, cache_dir.path());
assert_eq!(
code, 7,
"wrapper must mirror child exit code on non-zero exit"
);
assert_passthrough(&payload, &stdout, &stderr);
}
#[test]
#[ignore] fn wrapper_passthrough_session_path() {
let zccache = binary_path("zccache");
let echo_shim = binary_path("echo_shim");
if !zccache.exists() || !echo_shim.exists() {
eprintln!("skipping: required binaries not built");
return;
}
let cache_dir = cache_dir_tempdir();
let payload = random_payload(1_024, 0x1234_5678);
let (code, stdout, stderr) = run_wrapper(
&zccache,
&echo_shim,
cache_dir.path(),
&payload,
0,
Some("550e8400-e29b-41d4-a716-446655440000"),
);
stop_daemon(&zccache, cache_dir.path());
assert!(
stdout.is_empty(),
"wrapper must not invent stdout on daemon error"
);
assert_ne!(code, 0, "wrapper exit must be non-zero when daemon errors");
assert!(
stderr.windows(b"zccache".len()).any(|w| w == b"zccache"),
"wrapper must surface the daemon error to stderr"
);
}