mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
Policy Coverage (#149)
Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
committed by
GitHub
parent
f3d9652a73
commit
d3d5367fd4
+6
-24
@@ -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
@@ -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");
|
||||
|
||||
@@ -14,7 +14,8 @@ cases:
|
||||
k = input.k
|
||||
}
|
||||
query: data.test
|
||||
uncovered: [
|
||||
[ 5, 7 ]
|
||||
]
|
||||
report:
|
||||
- covered: [3, 6]
|
||||
not_covered: [5, 7]
|
||||
|
||||
|
||||
|
||||
@@ -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())?;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user