469 lines
No EOL
13 KiB
Bash
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 "$@" |