#![cfg(unix)]
use assay_evidence::bundle::writer::BundleWriter;
use assay_evidence::types::EvidenceEvent;
use assert_cmd::Command;
use std::io::Write;
use tempfile::NamedTempFile;
fn bundle_with_oversized_line() -> Vec<u8> {
let pad = "A".repeat(2 * 1024 * 1024);
let mut buffer = Vec::new();
{
let mut w = BundleWriter::new(&mut buffer);
w.add_event(EvidenceEvent::new(
"assay.test",
"urn:assay:test",
"run_bounded_cli",
0,
serde_json::json!({ "pad": pad }),
));
w.finish().expect("write bundle");
}
buffer
}
fn assert_named_a_line_ceiling(stderr: &str) {
let hay = stderr.to_lowercase();
assert!(
hay.contains("limitlinebytes"),
"refusal must be classified as LimitLineBytes; got:\n{stderr}"
);
}
#[test]
fn stdin_verify_refuses_a_bundle_whose_line_exceeds_the_ceiling() {
let payload = bundle_with_oversized_line();
let out = Command::cargo_bin("assay")
.expect("binary")
.args(["evidence", "verify", "-"])
.write_stdin(payload)
.assert()
.get_output()
.clone();
assert_ne!(
out.status.code(),
Some(0),
"an oversized-line bundle must not verify on stdin"
);
assert_named_a_line_ceiling(&String::from_utf8_lossy(&out.stderr));
}
#[test]
fn push_refuses_a_bundle_whose_line_exceeds_the_ceiling_in_verify_mode() {
let mut f = NamedTempFile::new().expect("temp bundle");
f.write_all(&bundle_with_oversized_line()).expect("write");
f.flush().expect("flush");
let out = Command::cargo_bin("assay")
.expect("binary")
.args(["evidence", "push"])
.arg(f.path())
.assert()
.get_output()
.clone();
assert_ne!(
out.status.code(),
Some(0),
"verify-mode push must refuse an oversized-line bundle before upload"
);
assert_named_a_line_ceiling(&String::from_utf8_lossy(&out.stderr));
}
#[test]
fn push_no_verify_still_refuses_a_bundle_whose_line_exceeds_the_ceiling() {
let mut f = NamedTempFile::new().expect("temp bundle");
f.write_all(&bundle_with_oversized_line()).expect("write");
f.flush().expect("flush");
let out = Command::cargo_bin("assay")
.expect("binary")
.args(["evidence", "push", "--no-verify"])
.arg(f.path())
.assert()
.get_output()
.clone();
assert_ne!(
out.status.code(),
Some(0),
"--no-verify push must refuse an oversized-line bundle before upload"
);
assert_named_a_line_ceiling(&String::from_utf8_lossy(&out.stderr));
}