use crate::report::{CheckReport, FailOnPolicy};
pub const EXIT_CLEAN: i32 = 0;
pub const EXIT_POLICY_VIOLATION: i32 = 1;
pub const EXIT_EXECUTION_ERROR: i32 = 2;
#[must_use]
pub fn exit_code(report: &CheckReport, policy: &FailOnPolicy, had_execution_error: bool) -> i32 {
if policy.matches(&report.findings) {
return EXIT_POLICY_VIOLATION;
}
if had_execution_error {
return EXIT_EXECUTION_ERROR;
}
EXIT_CLEAN
}
#[cfg(test)]
mod tests {
use super::*;
use crate::report::{Category, CheckFinding};
use deps_core::EcosystemId;
use deps_core::diagnostic::Severity;
use deps_core::position::Range;
use std::path::PathBuf;
fn finding(category: Category) -> CheckFinding {
CheckFinding {
ecosystem: EcosystemId::Cargo,
manifest_path: PathBuf::from("Cargo.toml"),
dependency_name: Some("serde".to_string()),
requirement: None,
category,
code: None,
advisory_url: None,
advisory_severity: None,
severity: Severity::Warning,
range: Range::default(),
message: "test".to_string(),
}
}
#[test]
fn test_exit_code_clean_report_is_zero() {
let report = CheckReport::default();
let policy = FailOnPolicy::default_categories();
assert_eq!(exit_code(&report, &policy, false), EXIT_CLEAN);
}
#[test]
fn test_exit_code_policy_violation_is_one() {
let report = CheckReport {
findings: vec![finding(Category::Vulnerable)],
};
let policy = FailOnPolicy::default_categories();
assert_eq!(exit_code(&report, &policy, false), EXIT_POLICY_VIOLATION);
}
#[test]
fn test_exit_code_non_failing_category_is_zero() {
let report = CheckReport {
findings: vec![finding(Category::Outdated)],
};
let policy = FailOnPolicy::default_categories();
assert_eq!(exit_code(&report, &policy, false), EXIT_CLEAN);
}
#[test]
fn test_exit_code_execution_error_is_two() {
let report = CheckReport::default();
let policy = FailOnPolicy::default_categories();
assert_eq!(exit_code(&report, &policy, true), EXIT_EXECUTION_ERROR);
}
#[test]
fn test_exit_code_execution_error_takes_precedence_over_clean_policy() {
let report = CheckReport {
findings: vec![finding(Category::Outdated)],
};
let policy = FailOnPolicy::default_categories();
assert_eq!(exit_code(&report, &policy, true), EXIT_EXECUTION_ERROR);
}
#[test]
fn test_exit_code_policy_violation_takes_precedence_over_execution_error() {
let report = CheckReport {
findings: vec![finding(Category::Vulnerable)],
};
let policy = FailOnPolicy::default_categories();
assert_eq!(exit_code(&report, &policy, true), EXIT_POLICY_VIOLATION);
}
}