clawdie-iso/firstboot/shell-pkg.sh
Sam & Claude b04414da91 refactor: Rename clawdie-shell-*.sh to shell-*.sh (remove redundant prefix)
- Rename all modules: clawdie-shell-{func}.sh → shell-{func}.sh
- Update references in firstboot.sh and installerconfig
- Update self-detection case statements in each module
- Reduces naming redundancy and improves clarity

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-24 07:20:17 +00:00

225 lines
6.2 KiB
Bash
Executable file

#!/bin/sh
# Unit tests for clawdie-shell-pkg.sh
# Run: sh test-clawdie-shell-pkg.sh
# POSIX-compliant (no trap ERR on FreeBSD)
set -u
TESTDIR="/tmp/clawdie-test-pkg-$$"
mkdir -p "$TESTDIR"
cd "$TESTDIR"
# Setup test environment
mkdir -p "$TESTDIR/etc/pkg/repos"
mkdir -p "$TESTDIR/var/cache/pkg/bastille"
mkdir -p "$TESTDIR/mnt/media/packages"
mkdir -p "$TESTDIR/var/log"
# Create sample USB packages
touch "$TESTDIR/mnt/media/packages/node24-24.0.0.pkg"
touch "$TESTDIR/mnt/media/packages/bash-5.2.26.pkg"
touch "$TESTDIR/mnt/media/packages/git-2.45.0.pkg"
# Environment overrides
export PKG_CONF_DIR="$TESTDIR/etc/pkg/repos"
export FREEBSD_REPO_CONF="$PKG_CONF_DIR/FreeBSD.conf"
export CLAWDIE_USB_REPO_CONF="$PKG_CONF_DIR/Clawdie-USB.conf"
export USB_MOUNT_POINT="$TESTDIR/mnt/media"
export USB_PKG_PATH="$TESTDIR/mnt/media/packages"
export BASTILLE_PKG_CACHE="$TESTDIR/var/cache/pkg/bastille"
export LOG_FILE="$TESTDIR/var/log/clawdie-pkg-test.log"
export PROGRESS_FILE="$TESTDIR/var/log/clawdie-pkg-progress-test"
# Initialize log/progress files
touch "$LOG_FILE"
touch "$PROGRESS_FILE"
# Source the module (now all paths are overridden)
. "$(dirname "$0")/clawdie-shell-pkg.sh"
# Color codes
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
# Test counter
TESTS_PASSED=0
TESTS_FAILED=0
# Helper: assert
assert_eq() {
local name="$1"
local expected="$2"
local actual="$3"
if [ "$expected" = "$actual" ]; then
echo "${GREEN}${NC} $name"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} $name"
echo " Expected: $expected"
echo " Actual: $actual"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
}
assert_file_exists() {
local name="$1"
local file="$2"
if [ -f "$file" ]; then
echo "${GREEN}${NC} $name"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} $name (file not found: $file)"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
}
assert_file_contains() {
local name="$1"
local file="$2"
local pattern="$3"
if [ -f "$file" ] && grep -q "$pattern" "$file"; then
echo "${GREEN}${NC} $name"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} $name"
echo " File: $file"
echo " Pattern: $pattern"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
}
# ============================================================================
# TEST SUITE
# ============================================================================
echo "=== Clawdie Shell Package Module Tests ==="
echo ""
# Test 1: ABI Detection
echo "Test Group: ABI Detection"
abi=$(clawdie_shell_pkg_detect_abi)
if echo "$abi" | grep -q "FreeBSD"; then
echo "${GREEN}${NC} ABI detection returns FreeBSD format"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} ABI detection failed (got: $abi)"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
echo ""
# Test 2: FreeBSD.conf Creation
echo "Test Group: FreeBSD.conf Creation"
abi=$(clawdie_shell_pkg_detect_abi)
clawdie_shell_pkg_write_freebsd_conf "$abi"
assert_file_exists "FreeBSD.conf created" "$FREEBSD_REPO_CONF"
assert_file_contains "FreeBSD.conf has url" "$FREEBSD_REPO_CONF" "pkg.FreeBSD.org"
assert_file_contains "FreeBSD.conf has enabled" "$FREEBSD_REPO_CONF" "enabled: yes"
assert_file_contains "FreeBSD.conf has priority" "$FREEBSD_REPO_CONF" "priority: 10"
echo ""
# Test 3: Clawdie-USB.conf Creation
echo "Test Group: Clawdie-USB.conf Creation"
clawdie_shell_pkg_write_clawdie_usb_conf
assert_file_exists "Clawdie-USB.conf created" "$CLAWDIE_USB_REPO_CONF"
assert_file_contains "Clawdie-USB.conf has file:// URL" "$CLAWDIE_USB_REPO_CONF" "file://"
assert_file_contains "Clawdie-USB.conf has enabled" "$CLAWDIE_USB_REPO_CONF" "enabled: yes"
assert_file_contains "Clawdie-USB.conf has high priority" "$CLAWDIE_USB_REPO_CONF" "priority: 100"
echo ""
# Test 4: Cache Seeding
echo "Test Group: Cache Seeding"
clawdie_shell_pkg_seed_cache
# Check if packages were copied
if [ -f "$BASTILLE_PKG_CACHE/node24-24.0.0.pkg" ]; then
echo "${GREEN}${NC} Packages seeded to cache"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} Cache seeding failed"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
cached_count=$(find "$BASTILLE_PKG_CACHE" -name "*.pkg" -type f 2>/dev/null | wc -l)
if [ "$cached_count" -ge 3 ]; then
echo "${GREEN}${NC} At least 3 packages cached ($cached_count found)"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} Too few packages cached ($cached_count, expected 3+)"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
echo ""
# Test 5: Validation
echo "Test Group: Validation"
if clawdie_shell_pkg_validate 2>/dev/null; then
echo "${GREEN}${NC} Validation passes"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} Validation failed"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
echo ""
# Test 6: Full Setup Flow
echo "Test Group: Full Setup Flow"
# Reset test dirs
rm -rf "$TESTDIR/etc/pkg/repos"/*
rm -rf "$TESTDIR/var/cache/pkg/bastille"/*
mkdir -p "$TESTDIR/var/cache/pkg/bastille"
# Run full setup
clawdie_shell_pkg_setup 2>/dev/null
assert_file_exists "Setup creates FreeBSD.conf" "$FREEBSD_REPO_CONF"
assert_file_exists "Setup creates Clawdie-USB.conf" "$CLAWDIE_USB_REPO_CONF"
if grep -q "\[PKG\] COMPLETE" "$PROGRESS_FILE"; then
echo "${GREEN}${NC} Progress checkpoint logged"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} Progress checkpoint not found"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
echo ""
# Test 7: Error Handling - Missing USB
echo "Test Group: Error Handling"
# Create env where USB path doesn't exist
export USB_PKG_PATH="/nonexistent/path"
if clawdie_shell_pkg_seed_cache 2>/dev/null; then
# Should succeed but skip (not fail)
echo "${GREEN}${NC} Gracefully handles missing USB path"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} Should not fail on missing USB path"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
echo ""
# ============================================================================
# SUMMARY
# ============================================================================
echo "=== Test Results ==="
echo "${GREEN}Passed: $TESTS_PASSED${NC}"
echo "${RED}Failed: $TESTS_FAILED${NC}"
echo ""
# Cleanup
rm -rf "$TESTDIR"
if [ $TESTS_FAILED -eq 0 ]; then
echo "${GREEN}✓ All tests passed!${NC}"
exit 0
else
echo "${RED}✗ Some tests failed${NC}"
exit 1
fi