Policy Coverage (#149)

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
Anand Krishnamoorthi
2024-02-19 19:10:13 -08:00
committed by GitHub
parent f3d9652a73
commit d3d5367fd4
14 changed files with 141 additions and 104 deletions
+6 -24
View File
@@ -111,6 +111,7 @@ fn run_aci_tests(dir: &Path) -> Result<()> {
#[cfg(feature = "coverage")]
fn run_aci_tests_coverage(dir: &Path) -> Result<()> {
let mut engine = Engine::new();
engine.set_enable_coverage(true);
let mut added = std::collections::BTreeSet::new();
@@ -150,24 +151,8 @@ fn run_aci_tests_coverage(dir: &Path) -> Result<()> {
}
}
println!("\n\nCOVERAGE REPORT");
// Fetch coverage report.
let report = engine.get_coverage_report()?;
for file in report.files.into_iter() {
if file.uncovered.is_empty() {
println!("{} has full coverage", file.path);
continue;
}
println!("{}:", file.path);
for (line, code) in file.code.split('\n').enumerate() {
if file.uncovered.contains(&(line as u32 + 1)) {
println!("\x1b[31m {line:4} {code}\x1b[0m");
} else {
println!(" {line:4} {code}");
}
}
}
println!("{}", report.to_colored_string()?);
Ok(())
}
@@ -184,11 +169,8 @@ struct Cli {
fn main() -> Result<()> {
let cli = Cli::parse();
cfg_if::cfg_if! {
if #[cfg(feature = "coverage")] {
run_aci_tests_coverage(&Path::new(&cli.test_dir))
} else {
run_aci_tests(&Path::new(&cli.test_dir))
}
}
#[cfg(feature = "coverage")]
run_aci_tests_coverage(&Path::new(&cli.test_dir))?;
run_aci_tests(&Path::new(&cli.test_dir))
}
+11 -3
View File
@@ -8,6 +8,12 @@ use regorus::*;
use anyhow::Result;
use test_generator::test_resources;
#[derive(serde::Deserialize)]
struct File {
covered: BTreeSet<u32>,
not_covered: BTreeSet<u32>,
}
#[derive(serde::Deserialize)]
struct TestCase {
data: Option<Value>,
@@ -15,8 +21,8 @@ struct TestCase {
modules: Vec<String>,
note: String,
query: String,
uncovered: Vec<BTreeSet<u32>>,
skip: Option<bool>,
report: Vec<File>,
}
#[derive(serde::Deserialize)]
@@ -38,6 +44,7 @@ fn yaml_test_impl(file: &str) -> Result<()> {
}
let mut engine = Engine::new();
engine.set_enable_coverage(true);
for (idx, rego) in case.modules.iter().enumerate() {
engine.add_policy(format!("rego_{idx}"), rego.clone())?;
@@ -54,8 +61,9 @@ fn yaml_test_impl(file: &str) -> Result<()> {
let _ = engine.eval_query(case.query.clone(), false)?;
let report = engine.get_coverage_report()?;
for (idx, uncovered) in case.uncovered.into_iter().enumerate() {
assert_eq!(uncovered, report.files[idx].uncovered);
for (idx, file) in case.report.into_iter().enumerate() {
assert_eq!(file.not_covered, report.files[idx].not_covered);
assert_eq!(file.covered, report.files[idx].covered);
}
println!("passed");
+4 -3
View File
@@ -14,7 +14,8 @@ cases:
k = input.k
}
query: data.test
uncovered: [
[ 5, 7 ]
]
report:
- covered: [3, 6]
not_covered: [5, 7]
+3
View File
@@ -54,6 +54,9 @@ struct YamlTest {
fn eval_test_case(case: &TestCase) -> Result<Value> {
let mut engine = Engine::new();
#[cfg(feature = "coverage")]
engine.set_enable_coverage(true);
if let Some(data) = &case.data {
engine.add_data(data.clone())?;
}