use std::fs;
use std::path::Path;
struct ZeroizeRow {
label: &'static str,
source_file: &'static str,
evidence: &'static [&'static str],
}
const ZEROIZE_ROWS: &[ZeroizeRow] = &[
ZeroizeRow {
label: "envelope::discriminate() wraps OWNED payload Vec",
source_file: "src/envelope.rs",
evidence: &["payload_with_prefix: Zeroizing<Vec<u8>>"],
},
ZeroizeRow {
label: "envelope::package() wraps OWNED data Vec",
source_file: "src/envelope.rs",
evidence: &["let mut data: Zeroizing<Vec<u8>>"],
},
ZeroizeRow {
label: "decode() Payload::Entr allocation wraps before public emit",
source_file: "src/decode.rs",
evidence: &["let scrubbed: Zeroizing<Vec<u8>>"],
},
ZeroizeRow {
label: "payload.rs documents caller-wrap contract",
source_file: "src/payload.rs",
evidence: &["Caller-wrap contract", "must wrap"],
},
];
fn crate_root() -> &'static Path {
Path::new(".")
}
#[test]
fn canonical_list_has_expected_row_count() {
let n = ZEROIZE_ROWS.len();
assert_eq!(
n, 4,
"ZEROIZE_ROWS row count = {n}; expected 4 (survey §1 ms-codec table)."
);
}
#[test]
fn every_canonical_zeroize_row_has_evidence_anchor() {
let mut missing: Vec<String> = Vec::new();
for row in ZEROIZE_ROWS {
let path = crate_root().join(row.source_file);
let source = fs::read_to_string(&path).unwrap_or_else(|e| {
panic!(
"failed to read evidence source {} for row {:?}: {e}",
path.display(),
row.label
)
});
let hit = row.evidence.iter().any(|needle| source.contains(needle));
if !hit {
missing.push(format!(
" - {} ({}): no evidence anchor; expected one of {:?}",
row.label, row.source_file, row.evidence,
));
}
}
assert!(
missing.is_empty(),
"ms-codec zeroize-discipline lint: {} row(s) missing Zeroizing evidence:\n{}",
missing.len(),
missing.join("\n"),
);
}