mod common;
use assert_cmd::Command;
use std::fs;
#[test]
fn fast_and_slow_children_both_receive_full_input() {
let tmpdir = common::with_tempdir();
let sink_fast = tmpdir.path().join("fast.txt");
let sink_slow = tmpdir.path().join("slow.txt");
let payload: Vec<u8> = (0..200u8).collect();
let cmd_fast = common::fake_child_emit_cmd("echo", &sink_fast);
let cmd_slow_consumer = common::fake_child_cmd("sleep-per-byte:1");
let mut cmd = Command::cargo_bin("rusty-pee").expect("binary built");
cmd.env_remove("RUSTY_PEE_STRICT");
cmd.arg(&cmd_fast).arg(&cmd_slow_consumer);
cmd.write_stdin(&payload[..]).assert().success();
let fast_content = fs::read(&sink_fast).expect("sink_fast should exist");
assert_eq!(
fast_content, payload,
"FR-002: fast child must receive full input even when slow child paces the parent"
);
assert!(!sink_slow.exists() || fs::metadata(&sink_slow).unwrap().len() == 0);
}
#[test]
fn three_children_argv_order_preserved() {
let tmpdir = common::with_tempdir();
let sink_a = tmpdir.path().join("a.txt");
let sink_b = tmpdir.path().join("b.txt");
let sink_c = tmpdir.path().join("c.txt");
let cmd_a = common::fake_child_emit_cmd("echo", &sink_a);
let cmd_b = common::fake_child_emit_cmd("echo", &sink_b);
let cmd_c = common::fake_child_emit_cmd("echo", &sink_c);
let payload = b"alpha\nbravo\ncharlie\ndelta\necho\n";
let mut cmd = Command::cargo_bin("rusty-pee").expect("binary built");
cmd.env_remove("RUSTY_PEE_STRICT");
cmd.arg(&cmd_a).arg(&cmd_b).arg(&cmd_c);
cmd.write_stdin(&payload[..]).assert().success();
for (name, path) in [("a", &sink_a), ("b", &sink_b), ("c", &sink_c)] {
let content = fs::read(path).expect("sink should exist");
assert_eq!(content, payload, "sink {name} should match input");
}
}
#[test]
fn large_chunked_input_byte_perfect_delivery() {
let tmpdir = common::with_tempdir();
let sink_a = tmpdir.path().join("a.bin");
let sink_b = tmpdir.path().join("b.bin");
let cmd_a = common::fake_child_emit_cmd("echo", &sink_a);
let cmd_b = common::fake_child_emit_cmd("echo", &sink_b);
let payload: Vec<u8> = (0..(256 * 1024)).map(|i| (i % 256) as u8).collect();
let mut cmd = Command::cargo_bin("rusty-pee").expect("binary built");
cmd.env_remove("RUSTY_PEE_STRICT");
cmd.arg(&cmd_a).arg(&cmd_b);
cmd.write_stdin(&payload[..]).assert().success();
let a_content = fs::read(&sink_a).expect("sink_a should exist");
let b_content = fs::read(&sink_b).expect("sink_b should exist");
assert_eq!(a_content.len(), payload.len(), "sink_a size mismatch");
assert_eq!(b_content.len(), payload.len(), "sink_b size mismatch");
assert_eq!(a_content, payload, "sink_a byte-equal mismatch");
assert_eq!(b_content, payload, "sink_b byte-equal mismatch");
}