#!/bin/bash # This script tests the temporary file cleanup functionality in Stirling-PDF. # It creates various temporary files inside a Docker container and verifies # that they are properly cleaned up. # Find project root by locating build.gradle find_root() { local dir="$PWD" while [[ "$dir" != "/" ]]; do if [[ -f "$dir/build.gradle" ]]; then echo "$dir" return 0 fi dir="$(dirname "$dir")" done echo "Error: build.gradle not found" >&2 exit 1 } PROJECT_ROOT=$(find_root) CONTAINER_NAME="stirling-pdf-temp-file-test" COMPOSE_FILE="$PROJECT_ROOT/testing/testdriver/temp_file_test.yml" SNAPSHOT_DIR="$PROJECT_ROOT/testing/file_snapshots" SUCCESS=true # Create directories mkdir -p "$SNAPSHOT_DIR" # Colors for output GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[0;33m' NC='\033[0m' # No Color # Function to check the health of the service check_health() { local service_name=$1 local end=$((SECONDS+60)) echo -n "Waiting for $service_name to become healthy..." until [ "$(docker inspect --format='{{json .State.Health.Status}}' "$service_name")" == '"healthy"' ] || [ $SECONDS -ge $end ]; do sleep 3 echo -n "." if [ $SECONDS -ge $end ]; then echo -e "\n$service_name health check timed out after 60 seconds." echo "Printing logs for $service_name:" docker logs "$service_name" return 1 fi done echo -e "\n$service_name is healthy!" return 0 } # Function to capture all files in /tmp and its subdirectories capture_temp_files() { local output_file=$1 echo "Capturing temporary files list..." docker exec $CONTAINER_NAME sh -c "find /tmp -type f | sort" > "$output_file" # Count files local count=$(wc -l < "$output_file") echo "Found $count files in /tmp" } # Function to create test temporary files in the container create_test_files() { echo "Creating test temporary files..." # Create files with various patterns in different directories docker exec $CONTAINER_NAME sh -c ' # Create files in /tmp touch /tmp/output_123.pdf touch /tmp/compressedPDF456.pdf touch /tmp/stirling-pdf-789.tmp touch /tmp/pdf-save-123-456.tmp touch /tmp/pdf-stream-789-012.tmp touch /tmp/PDFBox123.tmp touch /tmp/input_test.pdf touch /tmp/overlay-test.pdf # Create system-like temp files touch /tmp/lu123abc.tmp mkdir -p /tmp/ocr_process123 touch /tmp/tmp_upload.tmp touch /tmp/OSL_PIPE_1000_stirling touch /tmp/random.tmp # Create Jetty files (should be preserved) touch /tmp/jetty-123.tmp touch /tmp/something-with-jetty-inside.tmp # Create nested directories with temp files mkdir -p /tmp/stirling-pdf touch /tmp/stirling-pdf/nested_output.pdf mkdir -p /tmp/webp_outputXYZ touch /tmp/webp_outputXYZ/output_nested.pdf # Create an empty file (special case) touch /tmp/empty.tmp # Create normal files (should be preserved) touch /tmp/important.txt echo "Test files created successfully" ' } # Function to trigger cleanup by modifying settings trigger_cleanup() { echo "Triggering temporary file cleanup..." # Set aggressive cleanup settings and restart docker exec $CONTAINER_NAME sh -c ' echo "stirling.tempfiles.max-age-hours=0.001" >> /app/application.properties echo "stirling.tempfiles.cleanup-interval-minutes=0.1" >> /app/application.properties touch /app/restart-trigger ' # Wait for cleanup to run echo "Waiting for cleanup to run (30 seconds)..." sleep 30 } # Function to verify cleanup results verify_cleanup() { local before_file=$1 local after_file=$2 local status=true echo "Verifying cleanup results..." # Files that should be cleaned local should_be_cleaned=( "/tmp/output_123.pdf" "/tmp/compressedPDF456.pdf" "/tmp/stirling-pdf-789.tmp" "/tmp/pdf-save-123-456.tmp" "/tmp/pdf-stream-789-012.tmp" "/tmp/PDFBox123.tmp" "/tmp/input_test.pdf" "/tmp/overlay-test.pdf" "/tmp/lu123abc.tmp" "/tmp/ocr_process123" "/tmp/tmp_upload.tmp" "/tmp/OSL_PIPE_1000_stirling" "/tmp/random.tmp" "/tmp/empty.tmp" "/tmp/stirling-pdf/nested_output.pdf" "/tmp/webp_outputXYZ/output_nested.pdf" ) # Files that should be preserved local should_be_preserved=( "/tmp/jetty-123.tmp" "/tmp/something-with-jetty-inside.tmp" "/tmp/important.txt" ) # Check files that should be cleaned for file in "${should_be_cleaned[@]}"; do if grep -q "$file" "$after_file"; then echo -e "${RED}FAIL: $file was not cleaned up${NC}" status=false else echo -e "${GREEN}PASS: $file was properly cleaned up${NC}" fi done # Check files that should be preserved for file in "${should_be_preserved[@]}"; do if grep -q "$file" "$after_file"; then echo -e "${GREEN}PASS: $file was properly preserved${NC}" else echo -e "${RED}FAIL: $file was incorrectly cleaned up${NC}" status=false fi done return $status } # Main function main() { echo -e "${YELLOW}Starting temporary file cleanup test...${NC}" # Create special test compose file cat > "$COMPOSE_FILE" << EOL version: '3.8' services: stirling-pdf: image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-ultra-lite container_name: $CONTAINER_NAME environment: - DOCKER_ENABLE_SECURITY=false - APP_FILESYSTEM_DIRECTORY_BASE=/app/customFiles - STIRLING_MACHINE_TYPE=Docker - STIRLING_TEMPFILES_STARTUP_CLEANUP=false - STIRLING_TEMPFILES_CLEANUP_INTERVAL_MINUTES=5 - JAVA_OPTS=-Xmx500m ports: - 8080:8080 healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped EOL # Start the container docker-compose -f "$COMPOSE_FILE" up -d # Wait for container to be healthy if ! check_health "$CONTAINER_NAME"; then echo -e "${RED}Failed to start test container${NC}" docker-compose -f "$COMPOSE_FILE" down exit 1 fi # Create temporary files create_test_files # Capture initial state BEFORE_FILE="$SNAPSHOT_DIR/temp_files_before.txt" capture_temp_files "$BEFORE_FILE" # Trigger cleanup trigger_cleanup # Capture final state AFTER_FILE="$SNAPSHOT_DIR/temp_files_after.txt" capture_temp_files "$AFTER_FILE" # Verify cleanup results if verify_cleanup "$BEFORE_FILE" "$AFTER_FILE"; then echo -e "${GREEN}Temporary file cleanup test PASSED${NC}" else echo -e "${RED}Temporary file cleanup test FAILED${NC}" SUCCESS=false fi # Clean up docker-compose -f "$COMPOSE_FILE" down if $SUCCESS; then exit 0 else exit 1 fi } main