#!/usr/bin/env bats # Tests for scripts/orca-drift-notify.sh, scripts/orca-remediate.sh, # and the NFS detection logic (P10b, REQ-106/REQ-108/REQ-112). load test_helper NOTIFY="$SCRIPTS_DIR/orca-drift-notify.sh" REMEDIATE="$SCRIPTS_DIR/orca-remediate.sh" setup() { STATE_DIR="$(mktemp -d)" export ORCA_STATE_DIR="$STATE_DIR" mkdir -p "$STATE_DIR/drift-events" } teardown() { [ -n "$STATE_DIR" ] && rm -rf "$STATE_DIR" } @test "orca-drift-notify.sh exists and is executable" { [ -f "$NOTIFY" ] [ -x "$NOTIFY" ] } @test "orca-drift-notify.sh records modified event with sha256" { FILE="$STATE_DIR/test.txt" echo "hello world" >"$FILE" run "$NOTIFY" "$FILE" [ "$status" -eq 0 ] # Find the event JSON. EVENT_FILE="$(find "$STATE_DIR/drift-events" -name "*.json" -type f 2>/dev/null | head -1)" [ -n "$EVENT_FILE" ] [ -f "$EVENT_FILE" ] JSON="$(cat "$EVENT_FILE")" assert_json_field "$JSON" "event_id" assert_json_field "$JSON" "ts" assert_json_field "$JSON" "host" assert_json_field "$JSON" "path" assert_json_field "$JSON" "status" assert_json_field "$JSON" "new_sha256" assert_contains "$JSON" "modified" # The new_sha256 should NOT be "DELETED". assert_not_contains "$JSON" '"new_sha256":"DELETED"' } @test "orca-drift-notify.sh records deleted event" { FILE="$STATE_DIR/missing.txt" run "$NOTIFY" "$FILE" [ "$status" -eq 0 ] EVENT_FILE="$(find "$STATE_DIR/drift-events" -name "*.json" -type f 2>/dev/null | head -1)" [ -n "$EVENT_FILE" ] JSON="$(cat "$EVENT_FILE")" assert_contains "$JSON" "deleted" assert_contains "$JSON" '"new_sha256":"DELETED"' } @test "orca-drift-notify.sh records latest_txn when file exists" { echo "T-abcdef0123456789" >"$STATE_DIR/latest-applied-txn" FILE="$STATE_DIR/x.txt" echo "data" >"$FILE" run "$NOTIFY" "$FILE" [ "$status" -eq 0 ] EVENT_FILE="$(find "$STATE_DIR/drift-events" -name "*.json" -type f 2>/dev/null | head -1)" [ -n "$EVENT_FILE" ] JSON="$(cat "$EVENT_FILE")" assert_contains "$JSON" "T-abcdef0123456789" } @test "orca-drift-notify.sh requires path argument" { run "$NOTIFY" [ "$status" -eq 1 ] assert_contains "$output" "usage" } @test "orca-drift-notify.sh generates unique event IDs" { FILE="$STATE_DIR/a.txt" echo "x" >"$FILE" "$NOTIFY" "$FILE" >/dev/null "$NOTIFY" "$FILE" >/dev/null COUNT=$(find "$STATE_DIR/drift-events" -name "*.json" -type f 2>/dev/null | wc -l) [ "$COUNT" -eq 2 ] } @test "orca-remediate.sh exists and is executable" { [ -f "$REMEDIATE" ] [ -x "$REMEDIATE" ] } @test "orca-remediate.sh requires peer and txn args" { run "$REMEDIATE" [ "$status" -eq 1 ] assert_contains "$output" "usage" } @test "orca-remediate.sh cooldown applies on success" { APPLIED_DIR="$STATE_DIR/applied" export ORCA_APPLIED_DIR="$APPLIED_DIR" TXN_DIR="$APPLIED_DIR/T-test-cooldown-0001" mkdir -p "$TXN_DIR" touch "$TXN_DIR/apply.sh" # Stub rsync + ssh to always succeed. mkdir -p "$STATE_DIR/bin" cat >"$STATE_DIR/bin/rsync" <<'EOF' #!/usr/bin/env bash exit 0 EOF cat >"$STATE_DIR/bin/ssh" <<'EOF' #!/usr/bin/env bash echo "applied" exit 0 EOF chmod +x "$STATE_DIR/bin/rsync" "$STATE_DIR/bin/ssh" export PATH="$STATE_DIR/bin:$PATH" # Set short cooldown for testing. export ORCA_REMEDIATE_COOLDOWN=60 run "$REMEDIATE" "peer1" "T-test-cooldown-0001" "/etc/traefik/dynamic/orca.yml" [ "$status" -eq 0 ] # Cooldown file should exist. COOLDOWN_FILE="$STATE_DIR/remediation-cooldown/$(printf '%s' "/etc/traefik/dynamic/orca.yml" | sha256sum | awk '{print $1}')" [ -f "$COOLDOWN_FILE" ] } @test "orca-remediate.sh transient failure (missing txn dir) does NOT enter cooldown" { # No txn dir created -> transient failure. run "$REMEDIATE" "peer1" "T-nonexistent" "/etc/p" [ "$status" -eq 1 ] COOLDOWN_FILE="$STATE_DIR/remediation-cooldown/$(printf '%s' "/etc/p" | sha256sum | awk '{print $1}')" [ ! -f "$COOLDOWN_FILE" ] } @test "NFS detection: stat -f -c %T output is parsed" { # We cannot mount NFS in CI, but we can test that the detectNFS # logic is invoked by orca-drift-notify's peer setup. This test # documents the contract: ext4 / xfs / btrfs -> not NFS; nfs* -> NFS. for fs in ext4 xfs btrfs tmpfs; do [ "$(is_nfs "$fs")" = "false" ] || { echo "expected $fs to NOT be nfs" return 1 } done for fs in nfs nfs4; do [ "$(is_nfs "$fs")" = "true" ] || { echo "expected $fs to BE nfs" return 1 } done } # is_nfs mirrors the bash-side detectNFS contract from peer_setup.go. is_nfs() { case "$1" in *nfs*) echo "true" ;; *) echo "false" ;; esac }