magicciv/scripts/dev-setup/test_bluefin.sh

143 lines
4.7 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# Smoke tests for scripts/dev-setup/bluefin.sh.
#
# Runs locally on the EDIT host without any bluefin/bootc prereqs —
# exercises the shell logic via bash -n (parse) and the --help / --check
# argument paths, which must not require sudo or rpm-ostree on the caller.
#
# Usage:
# bash scripts/dev-setup/test_bluefin.sh # run all tests
# bash scripts/dev-setup/test_bluefin.sh -v # verbose
#
# Exit codes:
# 0 all tests passed
# 1 at least one test failed
#
# Wired into CI via `./run verify` → scripts/run/verify.sh once that lands.
set -uo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BLUEFIN="$REPO_ROOT/scripts/dev-setup/bluefin.sh"
GREEN='\033[0;32m'
RED='\033[0;31m'
DIM='\033[2m'
NC='\033[0m'
pass_count=0
fail_count=0
fail_names=()
_verbose=false
for a in "$@"; do
case "$a" in
-v|--verbose) _verbose=true ;;
esac
done
run_test() {
local name="$1"; shift
if "$@" >/tmp/bluefin-test-stdout.log 2>/tmp/bluefin-test-stderr.log; then
pass_count=$((pass_count + 1))
echo -e " ${GREEN}PASS${NC} $name"
else
fail_count=$((fail_count + 1))
fail_names+=("$name")
echo -e " ${RED}FAIL${NC} $name"
if [ "$_verbose" = "true" ]; then
echo -e "${DIM}--- stdout ---${NC}"
cat /tmp/bluefin-test-stdout.log
echo -e "${DIM}--- stderr ---${NC}"
cat /tmp/bluefin-test-stderr.log
fi
fi
}
echo "scripts/dev-setup/bluefin.sh — smoke tests"
# 1. Script exists and is executable
test_script_exists() {
test -x "$BLUEFIN"
}
run_test "bluefin.sh exists + executable" test_script_exists
# 2. Shell parses cleanly (no syntax errors)
test_parses_cleanly() {
bash -n "$BLUEFIN"
}
run_test "bash -n passes (shell syntax valid)" test_parses_cleanly
# 3. --help works and mentions --check
test_help_mentions_check() {
local out
out="$("$BLUEFIN" --help 2>&1)" || return 1
grep -q -- '--check' <<< "$out"
}
run_test "--help output mentions --check" test_help_mentions_check
# 4. Unknown arg exits nonzero
test_unknown_arg_rejected() {
if "$BLUEFIN" --not-a-real-flag >/dev/null 2>&1; then
return 1 # unexpected success
fi
return 0
}
run_test "unknown argument exits nonzero" test_unknown_arg_rejected
# 5. On non-bluefin hosts (EDIT host is macOS / non-rpm-ostree Linux),
# running without --check must exit 2 because rpm-ostree is absent.
# This guards the "don't try to install on hosts that don't support it".
test_non_rpm_ostree_host_refuses_install() {
if command -v rpm-ostree >/dev/null 2>&1; then
# On a bluefin host, this test is a no-op — the install path is
# legitimate here. Skip by returning success.
echo "[skip] running on an rpm-ostree host; install path is valid here"
return 0
fi
# On non-rpm-ostree hosts, invoking bluefin.sh without --check should
# immediately fail with exit 2 (per the preconditions block).
"$BLUEFIN" >/dev/null 2>&1
local rc=$?
# Exit 2 is the expected "unsupported host" signal.
[ $rc -eq 2 ]
}
run_test "non-rpm-ostree host refuses install with exit 2" test_non_rpm_ostree_host_refuses_install
# 6. REQUIRED_PACKAGES list is defined and non-empty (catches refactor
# accidentally emptying the manifest). Parse the array literal
# directly from the file text — sourcing the script is unsafe because
# it exits on help/check/unknown paths.
test_required_packages_non_empty() {
# Count non-blank, non-comment lines between `REQUIRED_PACKAGES=(` and
# the matching `)`.
local n
n="$(awk '/^REQUIRED_PACKAGES=\(/{f=1;next} f && /^\)/{exit} f && NF && $0 !~ /^[[:space:]]*#/{c++} END{print c+0}' "$BLUEFIN")"
[ -n "$n" ] && [ "$n" -ge 3 ]
}
run_test "REQUIRED_PACKAGES defines >= 3 entries" test_required_packages_non_empty
# 7. REQUIRED_PACKAGES contains the three canonical entries
test_required_packages_includes_canonical() {
grep -q 'weston' "$BLUEFIN" || return 1
grep -q 'vulkan-tools' "$BLUEFIN" || return 1
grep -q 'mesa-vulkan-drivers' "$BLUEFIN" || return 1
}
run_test "REQUIRED_PACKAGES lists weston + vulkan-tools + mesa-vulkan-drivers" \
test_required_packages_includes_canonical
# ── Summary ─────────────────────────────────────────────────────────
echo ""
if [ $fail_count -eq 0 ]; then
echo -e "${GREEN}All $pass_count tests passed.${NC}"
exit 0
else
echo -e "${RED}$fail_count test(s) failed:${NC}"
for n in "${fail_names[@]}"; do
echo -e " ${RED}×${NC} $n"
done
echo ""
echo "Re-run with -v for stdout/stderr:"
echo " bash $0 -v"
exit 1
fi