magicciv/scripts/dev-setup/test_bluefin.sh
Natalie 472211de4d feat(@projects): add build output cleanup objectives
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-04-17 12:46:00 -07:00

142 lines
4.7 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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