333 lines
8.2 KiB
Bash
Executable File
333 lines
8.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# End-to-end bootstrap integration test
|
||
# Tests the complete bootstrap flow from CLI
|
||
|
||
set -e
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Test configuration
|
||
TEST_DIR="/tmp/nip-e2e-test-$$"
|
||
NIP_BIN="../nip"
|
||
TESTS_PASSED=0
|
||
TESTS_FAILED=0
|
||
|
||
# Logging functions
|
||
log_info() {
|
||
echo -e "${BLUE}ℹ${NC} $1"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}✅${NC} $1"
|
||
((TESTS_PASSED++)) || true
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}❌${NC} $1"
|
||
((TESTS_FAILED++)) || true
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}⚠${NC} $1"
|
||
}
|
||
|
||
# Setup test environment
|
||
setup_test_env() {
|
||
log_info "Setting up test environment..."
|
||
|
||
# Create test directory
|
||
mkdir -p "$TEST_DIR"
|
||
mkdir -p "$TEST_DIR/.nip/bootstrap"
|
||
mkdir -p "$TEST_DIR/.nip/cache"
|
||
|
||
# Set HOME to test directory for isolation
|
||
export HOME="$TEST_DIR"
|
||
export NIP_HOME="$TEST_DIR/.nip"
|
||
|
||
log_success "Test environment ready: $TEST_DIR"
|
||
}
|
||
|
||
# Cleanup test environment
|
||
cleanup_test_env() {
|
||
log_info "Cleaning up test environment..."
|
||
if [ -d "$TEST_DIR" ]; then
|
||
rm -rf "$TEST_DIR"
|
||
fi
|
||
log_success "Cleanup complete"
|
||
}
|
||
|
||
# Check if NIP binary exists
|
||
check_nip_binary() {
|
||
log_info "Checking NIP binary..."
|
||
|
||
if [ ! -f "$NIP_BIN" ]; then
|
||
log_error "NIP binary not found at $NIP_BIN"
|
||
log_info "Please build NIP first: nim c nip.nim"
|
||
exit 1
|
||
fi
|
||
|
||
log_success "NIP binary found"
|
||
}
|
||
|
||
# Test: NIP version
|
||
test_nip_version() {
|
||
log_info "Test: NIP version command"
|
||
|
||
if $NIP_BIN --version &>/dev/null; then
|
||
log_success "NIP version command works"
|
||
else
|
||
log_error "NIP version command failed"
|
||
fi
|
||
}
|
||
|
||
# Test: Bootstrap list (empty)
|
||
test_bootstrap_list_empty() {
|
||
log_info "Test: Bootstrap list (should be empty)"
|
||
|
||
output=$($NIP_BIN bootstrap list 2>&1 || true)
|
||
|
||
if echo "$output" | grep -q "No bootstrap tools installed"; then
|
||
log_success "Bootstrap list shows empty correctly"
|
||
else
|
||
log_warning "Bootstrap list output unexpected (may have system tools)"
|
||
fi
|
||
}
|
||
|
||
# Test: Bootstrap info for non-installed tool
|
||
test_bootstrap_info_not_installed() {
|
||
log_info "Test: Bootstrap info for non-installed tool"
|
||
|
||
output=$($NIP_BIN bootstrap info gentoo 2>&1 || true)
|
||
|
||
if echo "$output" | grep -q "not installed\|Not found"; then
|
||
log_success "Bootstrap info correctly reports not installed"
|
||
else
|
||
log_warning "Bootstrap info output unexpected"
|
||
fi
|
||
}
|
||
|
||
# Test: Bootstrap recipes list
|
||
test_bootstrap_recipes() {
|
||
log_info "Test: Bootstrap recipes list"
|
||
|
||
if $NIP_BIN bootstrap recipes &>/dev/null; then
|
||
log_success "Bootstrap recipes command works"
|
||
else
|
||
log_warning "Bootstrap recipes command failed (may need network)"
|
||
fi
|
||
}
|
||
|
||
# Test: Recipe validation
|
||
test_recipe_validation() {
|
||
log_info "Test: Recipe validation"
|
||
|
||
# Check if recipes exist
|
||
if [ -d "recipes" ]; then
|
||
for recipe in recipes/*/minimal-*.kdl; do
|
||
if [ -f "$recipe" ]; then
|
||
log_info "Validating recipe: $recipe"
|
||
if $NIP_BIN bootstrap validate "$recipe" &>/dev/null; then
|
||
log_success "Recipe validation passed: $(basename $recipe)"
|
||
else
|
||
log_error "Recipe validation failed: $(basename $recipe)"
|
||
fi
|
||
fi
|
||
done
|
||
else
|
||
log_warning "Recipes directory not found, skipping validation"
|
||
fi
|
||
}
|
||
|
||
# Test: Bootstrap help
|
||
test_bootstrap_help() {
|
||
log_info "Test: Bootstrap help command"
|
||
|
||
output=$($NIP_BIN bootstrap help 2>&1 || true)
|
||
|
||
if echo "$output" | grep -q "list\|install\|remove"; then
|
||
log_success "Bootstrap help shows commands"
|
||
else
|
||
log_error "Bootstrap help output incomplete"
|
||
fi
|
||
}
|
||
|
||
# Test: Build command with missing tools (dry run)
|
||
test_build_missing_tools() {
|
||
log_info "Test: Build with missing tools (detection)"
|
||
|
||
# This should detect missing tools and offer options
|
||
# We'll just check if it doesn't crash
|
||
output=$($NIP_BIN build vim --source=gentoo --dry-run 2>&1 || true)
|
||
|
||
if echo "$output" | grep -q "Gentoo\|not found\|bootstrap"; then
|
||
log_success "Build correctly detects missing tools"
|
||
else
|
||
log_warning "Build tool detection output unexpected"
|
||
fi
|
||
}
|
||
|
||
# Test: Container runtime detection
|
||
test_container_detection() {
|
||
log_info "Test: Container runtime detection"
|
||
|
||
if command -v podman &>/dev/null; then
|
||
log_success "Podman detected"
|
||
elif command -v docker &>/dev/null; then
|
||
log_success "Docker detected"
|
||
else
|
||
log_warning "No container runtime detected (optional)"
|
||
fi
|
||
}
|
||
|
||
# Test: Recipe update (if network available)
|
||
test_recipe_update() {
|
||
log_info "Test: Recipe update"
|
||
|
||
# Try to update recipes (may fail without network)
|
||
if $NIP_BIN bootstrap update-recipes &>/dev/null; then
|
||
log_success "Recipe update successful"
|
||
else
|
||
log_warning "Recipe update failed (may need network)"
|
||
fi
|
||
}
|
||
|
||
# Test: Bootstrap installation scripts exist
|
||
test_installation_scripts() {
|
||
log_info "Test: Installation scripts exist"
|
||
|
||
local scripts_found=0
|
||
|
||
for tool in nix pkgsrc gentoo; do
|
||
if [ -d "recipes/$tool/scripts" ]; then
|
||
if [ -f "recipes/$tool/scripts/install.sh" ] || \
|
||
[ -f "recipes/$tool/scripts/bootstrap.sh" ]; then
|
||
((scripts_found++))
|
||
fi
|
||
fi
|
||
done
|
||
|
||
if [ $scripts_found -ge 2 ]; then
|
||
log_success "Installation scripts found for $scripts_found tools"
|
||
else
|
||
log_error "Installation scripts missing"
|
||
fi
|
||
}
|
||
|
||
# Test: Verification scripts exist
|
||
test_verification_scripts() {
|
||
log_info "Test: Verification scripts exist"
|
||
|
||
local scripts_found=0
|
||
|
||
for tool in nix pkgsrc gentoo; do
|
||
if [ -f "recipes/$tool/scripts/verify.sh" ]; then
|
||
((scripts_found++))
|
||
fi
|
||
done
|
||
|
||
if [ $scripts_found -ge 2 ]; then
|
||
log_success "Verification scripts found for $scripts_found tools"
|
||
else
|
||
log_error "Verification scripts missing"
|
||
fi
|
||
}
|
||
|
||
# Test: Recipe schema exists
|
||
test_recipe_schema() {
|
||
log_info "Test: Recipe schema exists"
|
||
|
||
if [ -f "recipes/schema/recipe.json" ]; then
|
||
log_success "Recipe schema found"
|
||
else
|
||
log_error "Recipe schema not found"
|
||
fi
|
||
}
|
||
|
||
# Test: Documentation exists
|
||
test_documentation() {
|
||
log_info "Test: Documentation exists"
|
||
|
||
local docs_found=0
|
||
local required_docs=(
|
||
"nip/docs/getting-started.md"
|
||
"nip/docs/bootstrap-guide.md"
|
||
"nip/docs/bootstrap-overview.md"
|
||
"nip/docs/bootstrap-detection-flow.md"
|
||
"nip/docs/quick-reference.md"
|
||
)
|
||
|
||
for doc in "${required_docs[@]}"; do
|
||
if [ -f "$doc" ]; then
|
||
((docs_found++))
|
||
fi
|
||
done
|
||
|
||
if [ $docs_found -eq ${#required_docs[@]} ]; then
|
||
log_success "All required documentation found"
|
||
else
|
||
log_error "Missing documentation: $((${#required_docs[@]} - docs_found)) files"
|
||
fi
|
||
}
|
||
|
||
# Print test summary
|
||
print_summary() {
|
||
echo ""
|
||
echo "======================================"
|
||
echo "TEST SUMMARY"
|
||
echo "======================================"
|
||
echo -e "Total tests: $((TESTS_PASSED + TESTS_FAILED))"
|
||
echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
|
||
echo -e "${RED}Failed: $TESTS_FAILED${NC}"
|
||
echo "======================================"
|
||
|
||
if [ $TESTS_FAILED -eq 0 ]; then
|
||
echo -e "${GREEN}✅ All tests passed!${NC}"
|
||
return 0
|
||
else
|
||
echo -e "${RED}❌ Some tests failed${NC}"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Main test execution
|
||
main() {
|
||
echo "NIP Bootstrap End-to-End Tests"
|
||
echo "==============================="
|
||
echo ""
|
||
|
||
# Setup
|
||
setup_test_env
|
||
check_nip_binary
|
||
|
||
# Run tests
|
||
test_nip_version
|
||
test_bootstrap_list_empty
|
||
test_bootstrap_info_not_installed
|
||
test_bootstrap_recipes
|
||
test_recipe_validation
|
||
test_bootstrap_help
|
||
test_build_missing_tools
|
||
test_container_detection
|
||
test_recipe_update
|
||
test_installation_scripts
|
||
test_verification_scripts
|
||
test_recipe_schema
|
||
test_documentation
|
||
|
||
# Cleanup and summary
|
||
cleanup_test_env
|
||
print_summary
|
||
}
|
||
|
||
# Trap errors
|
||
trap 'log_error "Test script failed at line $LINENO"' ERR
|
||
|
||
# Run main
|
||
main
|
||
exit $?
|