brick/tests/p4c_cli.rs

77 lines
2.4 KiB
Rust

use serde_json::Value;
use std::fs;
use std::process::Command;
use tempfile::TempDir;
fn fixture_root() -> std::path::PathBuf {
std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/p4c")
}
#[test]
fn build_imports_a_qualified_p4c_envelope() {
let directory = TempDir::new().unwrap();
let graph = directory.path().join("graph.json");
let html = directory.path().join("graph.html");
let report = fixture_root().join("reports/p4c-1.2.5.16-duplicate-state.json");
let output = Command::new(env!("CARGO_BIN_EXE_brick"))
.args([
"build",
fixture_root().to_str().unwrap(),
"--p4c-report",
report.to_str().unwrap(),
"--json",
graph.to_str().unwrap(),
"--html",
html.to_str().unwrap(),
])
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
assert!(String::from_utf8_lossy(&output.stdout).contains("1 p4c diagnostics"));
let model: Value = serde_json::from_slice(&fs::read(graph).unwrap()).unwrap();
assert_eq!(model.get("schema_version"), Some(&Value::from(4)));
assert_eq!(
model.pointer("/metrics/p4/parser_state_count"),
Some(&Value::from(2))
);
let findings = model
.get("nodes")
.and_then(Value::as_array)
.unwrap()
.iter()
.filter(|node| node.get("kind").and_then(Value::as_str) == Some("finding"))
.collect::<Vec<_>>();
assert_eq!(findings.len(), 1);
assert_eq!(
findings[0].pointer("/attributes/tool.version"),
Some(&Value::String("1.2.5.16".into()))
);
}
#[test]
fn build_rejects_a_malformed_p4c_envelope() {
let directory = TempDir::new().unwrap();
let report = directory.path().join("malformed.json");
fs::write(&report, b"{not-json").unwrap();
let output = Command::new(env!("CARGO_BIN_EXE_brick"))
.args([
"build",
fixture_root().to_str().unwrap(),
"--p4c-report",
report.to_str().unwrap(),
"--json",
directory.path().join("graph.json").to_str().unwrap(),
"--html",
directory.path().join("graph.html").to_str().unwrap(),
])
.output()
.unwrap();
assert!(!output.status.success());
assert!(String::from_utf8_lossy(&output.stderr).contains("invalid P4 evidence report"));
}