particle-os-tools/test-composefs-integration.sh

469 lines
No EOL
13 KiB
Bash

#!/bin/bash
# Test script for apt-layer ComposeFS integration
# Validates the Phase 2.2 implementation: Basic ComposeFS Integration
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 counters
TOTAL_TESTS=0
PASSED_TESTS=0
FAILED_TESTS=0
# Test logging functions
log_test() {
echo -e "${BLUE}[TEST]${NC} $1"
}
log_pass() {
echo -e "${GREEN}[PASS]${NC} $1"
((PASSED_TESTS++))
}
log_fail() {
echo -e "${RED}[FAIL]${NC} $1"
((FAILED_TESTS++))
}
log_info() {
echo -e "${YELLOW}[INFO]${NC} $1"
}
# Test summary
print_summary() {
echo ""
echo "=========================================="
echo "COMPOSEFS INTEGRATION TEST SUMMARY"
echo "=========================================="
echo "Total Tests: $TOTAL_TESTS"
echo "Passed: $PASSED_TESTS"
echo "Failed: $FAILED_TESTS"
echo "Success Rate: $((PASSED_TESTS * 100 / TOTAL_TESTS))%"
echo "=========================================="
if [[ $FAILED_TESTS -eq 0 ]]; then
echo -e "${GREEN}All tests passed! ComposeFS integration is working correctly.${NC}"
exit 0
else
echo -e "${RED}Some tests failed. Please review the output above.${NC}"
exit 1
fi
}
# Cleanup function
cleanup() {
log_info "Cleaning up test artifacts..."
# Unmount any test mounts
for mount_point in /tmp/apt-layer-composefs-test-*; do
if [[ -d "$mount_point" ]] && mountpoint -q "$mount_point" 2>/dev/null; then
umount "$mount_point" 2>/dev/null || true
rmdir "$mount_point" 2>/dev/null || true
fi
done
# Remove test files
rm -rf /tmp/apt-layer-composefs-test-*
}
# Setup test environment
setup_test_env() {
log_info "Setting up test environment..."
# Create test directories
mkdir -p /tmp/apt-layer-composefs-test-source
mkdir -p /tmp/apt-layer-composefs-test-layers
mkdir -p /tmp/apt-layer-composefs-test-mounts
# Create test source content
echo "Test file 1" > /tmp/apt-layer-composefs-test-source/file1.txt
echo "Test file 2" > /tmp/apt-layer-composefs-test-source/file2.txt
mkdir -p /tmp/apt-layer-composefs-test-source/subdir
echo "Test file 3" > /tmp/apt-layer-composefs-test-source/subdir/file3.txt
# Set permissions for testing
chmod 644 /tmp/apt-layer-composefs-test-source/file1.txt
chmod 755 /tmp/apt-layer-composefs-test-source/subdir
log_info "Test environment setup completed"
}
# Test 1: Basic ComposeFS layer creation
test_basic_layer_creation() {
((TOTAL_TESTS++))
log_test "Testing basic ComposeFS layer creation..."
local source_dir="/tmp/apt-layer-composefs-test-source"
local layer_path="/tmp/apt-layer-composefs-test-layers/test-layer.composefs"
if ! apt-layer composefs create "$source_dir" "$layer_path" "test-layer"; then
log_fail "Basic layer creation failed"
return 1
fi
# Check if layer file exists
if [[ ! -f "$layer_path" ]]; then
log_fail "Layer file not created"
return 1
fi
# Check if layer file has content
local file_size
file_size=$(stat -c%s "$layer_path" 2>/dev/null || echo "0")
if [[ $file_size -eq 0 ]]; then
log_fail "Layer file is empty"
return 1
fi
log_pass "Basic layer creation test passed"
return 0
}
# Test 2: Atomic layer creation
test_atomic_layer_creation() {
((TOTAL_TESTS++))
log_test "Testing atomic ComposeFS layer creation..."
local source_dir="/tmp/apt-layer-composefs-test-source"
local layer_path="/tmp/apt-layer-composefs-test-layers/atomic-layer.composefs"
if ! apt-layer composefs atomic-create "$source_dir" "$layer_path" "atomic-layer" "true" "keep-latest"; then
log_fail "Atomic layer creation failed"
return 1
fi
# Check if layer file exists
if [[ ! -f "$layer_path" ]]; then
log_fail "Atomic layer file not created"
return 1
fi
# Check if metadata file exists
if [[ ! -f "${layer_path}.metadata" ]]; then
log_fail "Metadata file not created"
return 1
fi
log_pass "Atomic layer creation test passed"
return 0
}
# Test 3: Layer mounting and unmounting
test_layer_mounting() {
((TOTAL_TESTS++))
log_test "Testing ComposeFS layer mounting and unmounting..."
local layer_path="/tmp/apt-layer-composefs-test-layers/test-layer.composefs"
local mount_point="/tmp/apt-layer-composefs-test-mounts/test-mount"
# Create layer if it doesn't exist
if [[ ! -f "$layer_path" ]]; then
local source_dir="/tmp/apt-layer-composefs-test-source"
if ! apt-layer composefs create "$source_dir" "$layer_path" "test-layer"; then
log_fail "Failed to create layer for mounting test"
return 1
fi
fi
# Mount layer
if ! apt-layer composefs mount "$layer_path" "$mount_point"; then
log_fail "Layer mounting failed"
return 1
fi
# Check if mount point is mounted
if ! mountpoint -q "$mount_point"; then
log_fail "Mount point is not mounted"
return 1
fi
# Check if files are accessible
if [[ ! -f "$mount_point/file1.txt" ]]; then
log_fail "Mounted files not accessible"
return 1
fi
# Unmount layer
if ! apt-layer composefs unmount "$mount_point"; then
log_fail "Layer unmounting failed"
return 1
fi
# Check if mount point is unmounted
if mountpoint -q "$mount_point"; then
log_fail "Mount point is still mounted"
return 1
fi
log_pass "Layer mounting and unmounting test passed"
return 0
}
# Test 4: Layer validation
test_layer_validation() {
((TOTAL_TESTS++))
log_test "Testing ComposeFS layer validation..."
local layer_path="/tmp/apt-layer-composefs-test-layers/test-layer.composefs"
# Create layer if it doesn't exist
if [[ ! -f "$layer_path" ]]; then
local source_dir="/tmp/apt-layer-composefs-test-source"
if ! apt-layer composefs create "$source_dir" "$layer_path" "test-layer"; then
log_fail "Failed to create layer for validation test"
return 1
fi
fi
# Validate layer
if ! apt-layer composefs validate "$layer_path"; then
log_fail "Layer validation failed"
return 1
fi
log_pass "Layer validation test passed"
return 0
}
# Test 5: Layer testing
test_layer_testing() {
((TOTAL_TESTS++))
log_test "Testing ComposeFS layer testing functionality..."
local layer_path="/tmp/apt-layer-composefs-test-layers/test-layer.composefs"
local test_mount_point="/tmp/apt-layer-composefs-test-mounts/test-layer-test"
# Create layer if it doesn't exist
if [[ ! -f "$layer_path" ]]; then
local source_dir="/tmp/apt-layer-composefs-test-source"
if ! apt-layer composefs create "$source_dir" "$layer_path" "test-layer"; then
log_fail "Failed to create layer for testing"
return 1
fi
fi
# Test layer
if ! apt-layer composefs test "$layer_path" "$test_mount_point"; then
log_fail "Layer testing failed"
return 1
fi
log_pass "Layer testing functionality test passed"
return 0
}
# Test 6: Layer composition
test_layer_composition() {
((TOTAL_TESTS++))
log_test "Testing ComposeFS layer composition..."
# Create base layer
local source_dir1="/tmp/apt-layer-composefs-test-source"
local base_layer="/tmp/apt-layer-composefs-test-layers/base-layer.composefs"
if ! apt-layer composefs create "$source_dir1" "$base_layer" "base-layer"; then
log_fail "Failed to create base layer for composition test"
return 1
fi
# Create overlay source
local overlay_source="/tmp/apt-layer-composefs-test-overlay"
mkdir -p "$overlay_source"
echo "Overlay file" > "$overlay_source/overlay.txt"
# Create overlay layer
local overlay_layer="/tmp/apt-layer-composefs-test-layers/overlay-layer.composefs"
if ! apt-layer composefs create "$overlay_source" "$overlay_layer" "overlay-layer"; then
log_fail "Failed to create overlay layer for composition test"
return 1
fi
# Compose layers
local composed_layer="/tmp/apt-layer-composefs-test-layers/composed-layer.composefs"
if ! apt-layer composefs compose "$base_layer" "$overlay_layer" "$composed_layer" "keep-latest"; then
log_fail "Layer composition failed"
return 1
fi
# Check if composed layer exists
if [[ ! -f "$composed_layer" ]]; then
log_fail "Composed layer not created"
return 1
fi
log_pass "Layer composition test passed"
return 0
}
# Test 7: Layer rollback
test_layer_rollback() {
((TOTAL_TESTS++))
log_test "Testing ComposeFS layer rollback..."
local current_layer="/tmp/apt-layer-composefs-test-layers/current-layer.composefs"
local backup_layer="/tmp/apt-layer-composefs-test-layers/backup-layer.composefs"
# Create backup layer
local source_dir="/tmp/apt-layer-composefs-test-source"
if ! apt-layer composefs create "$source_dir" "$backup_layer" "backup-layer"; then
log_fail "Failed to create backup layer for rollback test"
return 1
fi
# Create current layer (different content)
local current_source="/tmp/apt-layer-composefs-test-current"
mkdir -p "$current_source"
echo "Current content" > "$current_source/current.txt"
if ! apt-layer composefs create "$current_source" "$current_layer" "current-layer"; then
log_fail "Failed to create current layer for rollback test"
return 1
fi
# Perform rollback
if ! apt-layer composefs rollback "$current_layer" "$backup_layer"; then
log_fail "Layer rollback failed"
return 1
fi
# Verify rollback (current layer should now match backup)
if ! apt-layer composefs validate "$current_layer"; then
log_fail "Rolled back layer validation failed"
return 1
fi
log_pass "Layer rollback test passed"
return 0
}
# Test 8: ComposeFS status
test_composefs_status() {
((TOTAL_TESTS++))
log_test "Testing ComposeFS status functionality..."
if ! apt-layer composefs status; then
log_fail "ComposeFS status failed"
return 1
fi
log_pass "ComposeFS status test passed"
return 0
}
# Test 9: ComposeFS tools availability
test_composefs_tools() {
((TOTAL_TESTS++))
log_test "Testing ComposeFS tools availability..."
local tools_missing=0
# Check for mkcomposefs
if ! command -v mkcomposefs &> /dev/null; then
log_fail "mkcomposefs not found"
((tools_missing++))
fi
# Check for composefs-info
if ! command -v composefs-info &> /dev/null; then
log_warning "composefs-info not found (optional)"
fi
# Check for mount.composefs
if ! command -v mount.composefs &> /dev/null; then
log_fail "mount.composefs not found"
((tools_missing++))
fi
if [[ $tools_missing -eq 0 ]]; then
log_pass "ComposeFS tools availability test passed"
return 0
else
log_fail "Some ComposeFS tools are missing"
return 1
fi
}
# Test 10: Metadata handling
test_metadata_handling() {
((TOTAL_TESTS++))
log_test "Testing ComposeFS metadata handling..."
local source_dir="/tmp/apt-layer-composefs-test-source"
local layer_path="/tmp/apt-layer-composefs-test-layers/metadata-layer.composefs"
# Create layer with metadata preservation
if ! apt-layer composefs atomic-create "$source_dir" "$layer_path" "metadata-layer" "true" "keep-latest"; then
log_fail "Failed to create layer with metadata"
return 1
fi
# Check if metadata file exists
local metadata_file="${layer_path}.metadata"
if [[ ! -f "$metadata_file" ]]; then
log_fail "Metadata file not created"
return 1
fi
# Check if metadata file has content
local metadata_size
metadata_size=$(stat -c%s "$metadata_file" 2>/dev/null || echo "0")
if [[ $metadata_size -eq 0 ]]; then
log_fail "Metadata file is empty"
return 1
fi
# Check for required metadata fields
if ! grep -q "timestamp:" "$metadata_file"; then
log_fail "Timestamp not found in metadata"
return 1
fi
if ! grep -q "file_count:" "$metadata_file"; then
log_fail "File count not found in metadata"
return 1
fi
log_pass "Metadata handling test passed"
return 0
}
# Main test execution
main() {
echo "=========================================="
echo "apt-layer COMPOSEFS INTEGRATION TEST SUITE"
echo "=========================================="
echo "Testing Phase 2.2: Basic ComposeFS Integration"
echo "=========================================="
echo ""
# Setup test environment
setup_test_env
# Run tests
test_composefs_tools
test_basic_layer_creation
test_atomic_layer_creation
test_layer_validation
test_layer_mounting
test_layer_testing
test_layer_composition
test_layer_rollback
test_metadata_handling
test_composefs_status
# Print summary
print_summary
}
# Cleanup on exit
trap cleanup EXIT
# Run main function
main "$@"