clawdie-iso/firstboot/shell-gpu.sh

233 lines
6.7 KiB
Bash
Raw Normal View History

#!/bin/sh
# Unit tests for clawdie-shell-gpu.sh
# Run: sh test-clawdie-shell-gpu.sh
# POSIX-compliant
set -u
TESTDIR="/tmp/clawdie-test-gpu-$$"
mkdir -p "$TESTDIR"
cd "$TESTDIR"
# Create test rc.conf
touch "$TESTDIR/rc.conf"
mkdir -p "$TESTDIR/var/log"
# Test pciconf output — mock Intel GPU
MOCK_PCICONF_INTEL="vgapci0@pci0:0:2:0: class=0x030000 card=0x87c01028 chip=0x9a4912xx rev=0xXX hdr=0x00
vendor = 'Intel Corporation'
device = 'Intel(R) Graphics...'"
# Test pciconf output — mock AMD GPU
MOCK_PCICONF_AMD="vgapci0@pci0:0:2:0: class=0x030000 card=0x12345678 chip=0x73a110xx rev=0xXX hdr=0x00
vendor = 'AMD/ATI'
device = 'Radeon...'"
# Test pciconf output — mock NVIDIA GPU
MOCK_PCICONF_NVIDIA="vgapci0@pci0:0:2:0: class=0x030000 card=0x87c01028 chip=0x10de231dxx rev=0xXX hdr=0x00
vendor = 'NVIDIA'
device = 'GeForce...'"
# Test pciconf output — mock VMware GPU
MOCK_PCICONF_VMWARE="vgapci0@pci0:0:2:0: class=0x030000 card=0x12345678 chip=0x15ad040axx rev=0xXX hdr=0x00
vendor = 'VMware'
device = 'Virtual...'"
# Environment overrides
export RC_CONF="$TESTDIR/rc.conf"
export LOG_FILE="$TESTDIR/var/log/clawdie-gpu-test.log"
export PROGRESS_FILE="$TESTDIR/var/log/clawdie-gpu-progress-test"
export PCICONF=""
export KLDLOAD="/bin/true" # Mock kldload as success
# Initialize log/progress files
touch "$LOG_FILE"
touch "$PROGRESS_FILE"
# Source the module
. "$(dirname "$0")/clawdie-shell-gpu.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_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 (pattern not found)"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
}
# ============================================================================
# TEST SUITE
# ============================================================================
echo "=== Clawdie Shell GPU Module Tests ==="
echo ""
# Test 1: Driver Matching
echo "Test Group: Driver Matching"
assert_eq "Intel → i915kms" "i915kms" "$(clawdie_shell_gpu_match_driver intel)"
assert_eq "AMD → amdgpu" "amdgpu" "$(clawdie_shell_gpu_match_driver amd)"
assert_eq "NVIDIA → nvidia modules" "nvidia-modeset nvidia" "$(clawdie_shell_gpu_match_driver nvidia)"
assert_eq "VMware → vmwgfx" "vmwgfx" "$(clawdie_shell_gpu_match_driver vmware)"
assert_eq "Unknown → empty (VESA fallback)" "" "$(clawdie_shell_gpu_match_driver vesa)"
echo ""
# Test 2: RC.CONF Writing - Intel
echo "Test Group: RC.CONF Writing (Intel)"
rm -f "$TESTDIR/rc.conf"
touch "$TESTDIR/rc.conf"
clawdie_shell_gpu_write_rcconf "i915kms"
assert_file_contains "rc.conf contains kld_list" "$RC_CONF" "kld_list=\"i915kms\""
echo ""
# Test 3: RC.CONF Writing - AMD
echo "Test Group: RC.CONF Writing (AMD)"
rm -f "$TESTDIR/rc.conf"
touch "$TESTDIR/rc.conf"
clawdie_shell_gpu_write_rcconf "amdgpu"
assert_file_contains "rc.conf contains kld_list" "$RC_CONF" "kld_list=\"amdgpu\""
echo ""
# Test 4: RC.CONF Idempotence
echo "Test Group: RC.CONF Idempotence"
rm -f "$TESTDIR/rc.conf"
touch "$TESTDIR/rc.conf"
clawdie_shell_gpu_write_rcconf "i915kms"
clawdie_shell_gpu_write_rcconf "amdgpu" # Update with different module
kld_value=$(grep "^kld_list=" "$TESTDIR/rc.conf" | cut -d= -f2 | tr -d '"')
assert_eq "RC.CONF updates existing kld_list" "amdgpu" "$kld_value"
echo ""
# Test 5: Empty Module List (VESA)
echo "Test Group: VESA Fallback"
rm -f "$TESTDIR/rc.conf"
touch "$TESTDIR/rc.conf"
clawdie_shell_gpu_write_rcconf ""
if grep -q "^kld_list=" "$TESTDIR/rc.conf"; then
echo "${RED}${NC} Should not add kld_list for VESA"
TESTS_FAILED=$((TESTS_FAILED + 1))
else
echo "${GREEN}${NC} Correctly skips kld_list for VESA"
TESTS_PASSED=$((TESTS_PASSED + 1))
fi
echo ""
# Test 6: Validation
echo "Test Group: Validation"
rm -f "$TESTDIR/rc.conf"
touch "$TESTDIR/rc.conf"
clawdie_shell_gpu_write_rcconf "i915kms"
if clawdie_shell_gpu_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 7: Full Setup Flow - Intel (via direct function calls)
echo "Test Group: Full Setup Flow (Intel)"
rm -f "$TESTDIR/rc.conf" "$PROGRESS_FILE"
touch "$TESTDIR/rc.conf"
touch "$PROGRESS_FILE"
# Test the core flow without mocking pciconf (too complex to mock shell-level)
# Instead test that calling the functions in sequence works
kld="i915kms"
clawdie_shell_gpu_write_rcconf "$kld"
clawdie_shell_gpu_load_live "$kld" 2>/dev/null
echo "[GPU] COMPLETE" >> "$PROGRESS_FILE"
assert_file_contains "Progress checkpoint logged" "$PROGRESS_FILE" "\[GPU\] COMPLETE"
assert_file_contains "RC.CONF contains kld_list" "$RC_CONF" "kld_list=\"i915kms\""
echo ""
# Test 8: PCI Detection - Multiple Vendors (mock via environment)
echo "Test Group: GPU Detection Logic"
# Test Intel detection
result=$(clawdie_shell_gpu_match_driver "intel")
if [ "$result" = "i915kms" ]; then
echo "${GREEN}${NC} Intel GPU matches i915kms"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} Intel GPU detection failed"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
# Test NVIDIA detection
result=$(clawdie_shell_gpu_match_driver "nvidia")
if echo "$result" | grep -q "nvidia"; then
echo "${GREEN}${NC} NVIDIA GPU matches nvidia modules"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} NVIDIA GPU detection failed"
TESTS_FAILED=$((TESTS_FAILED + 1))
fi
echo ""
# Test 9: Error Handling - Missing RC.CONF
echo "Test Group: Error Handling"
rm -f "$TESTDIR/rc.conf"
clawdie_shell_gpu_write_rcconf "i915kms"
if [ -f "$TESTDIR/rc.conf" ]; then
echo "${GREEN}${NC} Creates rc.conf if missing"
TESTS_PASSED=$((TESTS_PASSED + 1))
else
echo "${RED}${NC} Failed to create rc.conf"
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