87 lines
2.6 KiB
Bash
Executable File
87 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ©AngelaMos | 2026
|
|
# test_helpers.sh
|
|
#
|
|
# Test assertion framework for the bash test harness
|
|
#
|
|
# Provides the core testing primitives: setup_test resets registry state
|
|
# and sets SYSROOT to a fixture directory for isolated filesystem
|
|
# checks. assert_status compares a control's recorded status against an
|
|
# expected value. assert_evidence_contains checks for a substring in the
|
|
# evidence string. assert_json_valid validates JSON via python3's
|
|
# json.tool (accepts both file paths and inline strings). print_results
|
|
# outputs the total/pass/fail summary and returns non-zero on failures.
|
|
# Tracks counts in TEST_PASS, TEST_FAIL, TEST_TOTAL globals.
|
|
#
|
|
# Connects to:
|
|
# lib/registry.sh - reset_results, RESULT_STATUS, RESULT_EVIDENCE
|
|
# tests/test_runner.sh - sources this file before running tests
|
|
# testdata/fixtures/ - pass-scenario fixture directory
|
|
# testdata/fixtures_fail/ - fail-scenario fixture directory
|
|
|
|
declare -g TEST_PASS=0
|
|
declare -g TEST_FAIL=0
|
|
declare -g TEST_TOTAL=0
|
|
declare -g CURRENT_TEST=""
|
|
|
|
setup_test() {
|
|
local fixtures_dir="$1"
|
|
reset_results
|
|
SYSROOT="$fixtures_dir"
|
|
DETECTED_ID="debian"
|
|
DETECTED_VERSION="12"
|
|
}
|
|
|
|
assert_status() {
|
|
local id="$1" expected="$2"
|
|
local actual="${RESULT_STATUS[$id]:-UNSET}"
|
|
((TEST_TOTAL++)) || true
|
|
if [[ "$actual" == "$expected" ]]; then
|
|
((TEST_PASS++)) || true
|
|
else
|
|
((TEST_FAIL++)) || true
|
|
echo " FAIL: ${CURRENT_TEST} — ${id}: expected ${expected}, got ${actual}" >&2
|
|
fi
|
|
}
|
|
|
|
assert_evidence_contains() {
|
|
local id="$1" expected="$2"
|
|
local actual="${RESULT_EVIDENCE[$id]:-}"
|
|
((TEST_TOTAL++)) || true
|
|
if [[ "$actual" == *"$expected"* ]]; then
|
|
((TEST_PASS++)) || true
|
|
else
|
|
((TEST_FAIL++)) || true
|
|
echo " FAIL: ${CURRENT_TEST} — ${id} evidence missing '${expected}': got '${actual}'" >&2
|
|
fi
|
|
}
|
|
|
|
assert_json_valid() {
|
|
local input="$1"
|
|
((TEST_TOTAL++)) || true
|
|
if [[ -f "$input" ]]; then
|
|
if python3 -m json.tool "$input" > /dev/null 2>&1; then
|
|
((TEST_PASS++)) || true
|
|
else
|
|
((TEST_FAIL++)) || true
|
|
echo " FAIL: ${CURRENT_TEST} — JSON file '${input}' is not valid" >&2
|
|
fi
|
|
else
|
|
if echo "$input" | python3 -m json.tool > /dev/null 2>&1; then
|
|
((TEST_PASS++)) || true
|
|
else
|
|
((TEST_FAIL++)) || true
|
|
echo " FAIL: ${CURRENT_TEST} — JSON string is not valid" >&2
|
|
fi
|
|
fi
|
|
}
|
|
|
|
print_results() {
|
|
echo ""
|
|
echo "Tests: ${TEST_TOTAL} | Pass: ${TEST_PASS} | Fail: ${TEST_FAIL}"
|
|
if (( TEST_FAIL > 0 )); then
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|