ci: enforce complete security audit coverage
This commit is contained in:
@@ -253,6 +253,12 @@ class SecurityAuditWrapperTests(unittest.TestCase):
|
||||
self.assertEqual(0, manifest["overall_status"])
|
||||
self.assertEqual(1, manifest["finding_status"])
|
||||
self.assertEqual(0, manifest["execution_error_status"])
|
||||
self.assertEqual("complete", manifest["coverage_status"])
|
||||
scanner_results = {
|
||||
result["id"]: result["status"]
|
||||
for result in manifest["scanner_coverage"]["results"]
|
||||
}
|
||||
self.assertEqual("findings", scanner_results["semgrep"])
|
||||
self.assertIn(
|
||||
"Semgrep SAST\t1\tfindings", (reports / "step-status.tsv").read_text()
|
||||
)
|
||||
@@ -312,6 +318,86 @@ class SecurityAuditWrapperTests(unittest.TestCase):
|
||||
)
|
||||
self.assertEqual(1, self._manifest(invalid_reports)["execution_error_status"])
|
||||
|
||||
def test_missing_tool_is_machine_readable_and_strictly_enforced(self) -> None:
|
||||
gitleaks_stub = self.stub_bin / "gitleaks"
|
||||
disabled_stub = self.stub_bin / "gitleaks.disabled"
|
||||
gitleaks_stub.rename(disabled_stub)
|
||||
try:
|
||||
result, reports = self._run(
|
||||
"--report-only",
|
||||
SECURITY_AUDIT_REQUIRE_TOOLS="0",
|
||||
CI="false",
|
||||
GITEA_ACTIONS="false",
|
||||
)
|
||||
self.assertEqual(0, result.returncode, result.stderr)
|
||||
manifest = self._manifest(reports)
|
||||
self.assertEqual("incomplete", manifest["coverage_status"])
|
||||
self.assertEqual(["gitleaks"], manifest["scanner_coverage"]["incomplete"])
|
||||
scanner_results = {
|
||||
item["id"]: item for item in manifest["scanner_coverage"]["results"]
|
||||
}
|
||||
self.assertEqual("skipped", scanner_results["gitleaks"]["status"])
|
||||
self.assertEqual(127, scanner_results["gitleaks"]["exit_code"])
|
||||
self.assertIn(
|
||||
"gitleaks\tmissing",
|
||||
(reports / "tool-versions.txt").read_text(encoding="utf-8"),
|
||||
)
|
||||
|
||||
strict_result, strict_reports = self._run(
|
||||
"--strict",
|
||||
SECURITY_AUDIT_REQUIRE_TOOLS="0",
|
||||
CI="false",
|
||||
GITEA_ACTIONS="false",
|
||||
)
|
||||
self.assertEqual(1, strict_result.returncode)
|
||||
self.assertEqual(
|
||||
"incomplete",
|
||||
self._manifest(strict_reports)["coverage_status"],
|
||||
)
|
||||
|
||||
ci_result, ci_reports = self._run(
|
||||
"--report-only",
|
||||
SECURITY_AUDIT_REQUIRE_TOOLS="0",
|
||||
CI="true",
|
||||
GITEA_ACTIONS="false",
|
||||
)
|
||||
self.assertEqual(1, ci_result.returncode)
|
||||
self.assertEqual(
|
||||
"incomplete",
|
||||
self._manifest(ci_reports)["coverage_status"],
|
||||
)
|
||||
finally:
|
||||
disabled_stub.rename(gitleaks_stub)
|
||||
|
||||
def test_full_mode_records_every_required_scanner(self) -> None:
|
||||
self._install_full_mode_stubs()
|
||||
|
||||
result, reports = self._run("--report-only", mode="full")
|
||||
|
||||
self.assertEqual(0, result.returncode, result.stderr)
|
||||
manifest = self._manifest(reports)
|
||||
self.assertEqual("complete", manifest["coverage_status"])
|
||||
required = manifest["scanner_coverage"]["required"]
|
||||
results = manifest["scanner_coverage"]["results"]
|
||||
self.assertEqual(
|
||||
{
|
||||
"semgrep",
|
||||
"bandit",
|
||||
"ruff-security",
|
||||
"gitleaks",
|
||||
"trivy",
|
||||
"pip-audit",
|
||||
"npm-audit",
|
||||
"osv-scanner",
|
||||
"jscpd",
|
||||
"radon",
|
||||
"xenon",
|
||||
},
|
||||
set(required),
|
||||
)
|
||||
self.assertEqual(set(required), {item["id"] for item in results})
|
||||
self.assertTrue(all(item["status"] == "no-findings" for item in results))
|
||||
|
||||
def test_workspace_mutation_invalidates_the_audit(self) -> None:
|
||||
result, reports = self._run(
|
||||
"--report-only",
|
||||
@@ -498,6 +584,7 @@ class SecurityAuditContainerRunnerTests(unittest.TestCase):
|
||||
else []
|
||||
)
|
||||
self.assertEqual(expected_roots, repository_roots)
|
||||
self.assertIn("SECURITY_AUDIT_REQUIRE_TOOLS=1", run_command)
|
||||
|
||||
def test_non_actions_runner_keeps_the_scoped_bind_mount(self) -> None:
|
||||
result, commands = self._run(scope="govoplan")
|
||||
|
||||
Reference in New Issue
Block a user