use crate::reliability::harness::{
assert_clean_exit, assert_documented_exit, assert_no_panic, assert_valid_json_if_nonempty, run,
Outcome, Profile,
};
use tempfile::TempDir;
const PLANTED_AWS: &str = "AWS_ACCESS_KEY_ID = \"AKIAQYLPMN5HFIQR7XYA\"\n";
fn assert_machine_stdout_has_no_ansi(o: &Outcome) {
assert!(
!o.stdout_raw.contains(&0x1b),
"{}: ANSI escape reached a machine-format stdout stream:\n{}",
o.what,
o.stdout.chars().take(300).collect::<String>()
);
}
fn assert_valid_jsonl(o: &Outcome) {
for (index, line) in o.stdout.lines().enumerate() {
if line.trim().is_empty() {
continue;
}
let value: serde_json::Value = serde_json::from_str(line).unwrap_or_else(|error| {
panic!(
"{}: jsonl line {index} is not valid JSON: {error}\n{line}",
o.what
)
});
assert!(
value.is_object(),
"{}: jsonl line {index} is not a JSON object: {line}",
o.what
);
}
}
pub fn machine_format_invariant(profile: Profile, format: &str) {
let dir = TempDir::new().expect("tempdir for planted secret");
let path = dir.path().join("planted.txt");
std::fs::write(&path, PLANTED_AWS).expect("write planted secret");
let path = path.to_string_lossy().into_owned();
let outcome = run(
profile,
&[
"scan",
"--daemon=off",
"--backend",
"cpu",
"--format",
format,
&path,
],
);
assert_clean_exit(&outcome);
assert_no_panic(&outcome);
assert_documented_exit(&outcome);
assert_machine_stdout_has_no_ansi(&outcome);
match format {
"jsonl" => assert_valid_jsonl(&outcome),
_ => assert_valid_json_if_nonempty(&outcome),
}
}
crate::kh_matrix!(
crate::reliability::machine_format::machine_format_invariant,
json => "json",
jsonl => "jsonl",
sarif => "sarif",
);