2025-11-03 00:11:13 +08:00

296 lines
8.8 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Comprehensive testing script for camera simulation
# Tests all camera source backends and configurations
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
TEST_DATA_DIR="$PROJECT_DIR/test_data"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Test results
TESTS_PASSED=0
TESTS_FAILED=0
# Function to print colored output
print_status() {
local status=$1
local message=$2
case $status in
"SUCCESS")
echo -e "${GREEN}$message${NC}"
((TESTS_PASSED++))
;;
"FAILURE")
echo -e "${RED}$message${NC}"
((TESTS_FAILED++))
;;
"INFO")
echo -e "${YELLOW} $message${NC}"
;;
*)
echo "$message"
;;
esac
}
# Function to run a test
run_test() {
local test_name=$1
local command=$2
local timeout_duration=${3:-10}
echo ""
echo "Running test: $test_name"
echo "Command: $command"
if timeout ${timeout_duration}s bash -c "$command" > /tmp/test_output.log 2>&1; then
print_status "SUCCESS" "$test_name passed"
return 0
else
print_status "FAILURE" "$test_name failed"
echo "Output:"
tail -20 /tmp/test_output.log
return 1
fi
}
# Create test data directory
create_test_data() {
print_status "INFO" "Creating test data directory..."
mkdir -p "$TEST_DATA_DIR"
# Check if ffmpeg is available
if ! command -v ffmpeg &> /dev/null; then
print_status "FAILURE" "FFmpeg not found. Please install FFmpeg."
exit 1
fi
# Create various test videos
print_status "INFO" "Generating test videos..."
# 1. Small test video (480p, 5 seconds)
if [ ! -f "$TEST_DATA_DIR/test_480p.mp4" ]; then
ffmpeg -f lavfi -i testsrc2=size=640x480:rate=30 -t 5 \
-vf "drawtext=text='480p Test':fontsize=20:fontcolor=white:x=10:y=10" \
-c:v libx264 -preset ultrafast \
-y "$TEST_DATA_DIR/test_480p.mp4" 2>/dev/null
print_status "SUCCESS" "Created test_480p.mp4"
fi
# 2. Medium test video (720p, 10 seconds)
if [ ! -f "$TEST_DATA_DIR/test_720p.mp4" ]; then
ffmpeg -f lavfi -i testsrc=size=1280x720:rate=30 -t 10 \
-vf "drawtext=text='720p Test':fontsize=24:fontcolor=white:x=10:y=10" \
-c:v libx264 -preset ultrafast \
-y "$TEST_DATA_DIR/test_720p.mp4" 2>/dev/null
print_status "SUCCESS" "Created test_720p.mp4"
fi
# 3. High resolution test (1080p, 5 seconds)
if [ ! -f "$TEST_DATA_DIR/test_1080p.mp4" ]; then
ffmpeg -f lavfi -i testsrc2=size=1920x1080:rate=30 -t 5 \
-vf "drawtext=text='1080p Test':fontsize=30:fontcolor=white:x=10:y=10" \
-c:v libx264 -preset ultrafast \
-y "$TEST_DATA_DIR/test_1080p.mp4" 2>/dev/null
print_status "SUCCESS" "Created test_1080p.mp4"
fi
# 4. Meteor simulation video (with brightness changes)
if [ ! -f "$TEST_DATA_DIR/meteor_simulation.mp4" ]; then
ffmpeg -f lavfi -i "nullsrc=s=1280x720:r=30" -t 10 \
-vf "geq=r='if(between(t,2,2.1)+between(t,5,5.2)+between(t,8,8.1),255,50)':g='if(between(t,2,2.1)+between(t,5,5.2)+between(t,8,8.1),255,50)':b='if(between(t,2,2.1)+between(t,5,5.2)+between(t,8,8.1),255,50)',drawtext=text='Meteor Simulation':fontsize=24:fontcolor=white:x=(w-text_w)/2:y=50" \
-c:v libx264 -preset ultrafast \
-y "$TEST_DATA_DIR/meteor_simulation.mp4" 2>/dev/null
print_status "SUCCESS" "Created meteor_simulation.mp4"
fi
ls -lh "$TEST_DATA_DIR"/*.mp4 2>/dev/null || true
}
# Build the project
build_project() {
print_status "INFO" "Building meteor-edge-client..."
cd "$PROJECT_DIR"
if cargo build --features camera_sim --release; then
print_status "SUCCESS" "Build completed successfully"
else
print_status "FAILURE" "Build failed"
exit 1
fi
}
# Test 1: Test pattern sources
test_patterns() {
print_status "INFO" "Testing pattern generators..."
local patterns=("static" "noise" "bar" "meteor" "checkerboard" "gradient")
for pattern in "${patterns[@]}"; do
run_test "Pattern: $pattern" \
"cd $PROJECT_DIR && cargo run --features camera_sim -- test --camera-source test:$pattern --frames 100" \
5
done
}
# Test 2: File reader
test_file_reader() {
print_status "INFO" "Testing file reader..."
local test_files=("test_480p.mp4" "test_720p.mp4" "test_1080p.mp4" "meteor_simulation.mp4")
for file in "${test_files[@]}"; do
if [ -f "$TEST_DATA_DIR/$file" ]; then
run_test "File: $file" \
"cd $PROJECT_DIR && cargo run --features camera_sim -- test --camera-source file:test_data/$file --frames 50" \
10
else
print_status "FAILURE" "Test file not found: $file"
fi
done
}
# Test 3: Performance benchmarks
test_performance() {
print_status "INFO" "Running performance benchmarks..."
# Test pattern performance
run_test "Pattern benchmark (1000 frames)" \
"cd $PROJECT_DIR && cargo run --release --features camera_sim -- benchmark --camera-source test:meteor --frames 1000" \
30
# File reader performance
if [ -f "$TEST_DATA_DIR/test_720p.mp4" ]; then
run_test "File reader benchmark" \
"cd $PROJECT_DIR && cargo run --release --features camera_sim -- benchmark --camera-source file:test_data/test_720p.mp4 --frames 300" \
30
fi
}
# Test 4: Memory leak check
test_memory_leaks() {
print_status "INFO" "Testing for memory leaks..."
if command -v valgrind &> /dev/null; then
run_test "Memory leak check" \
"cd $PROJECT_DIR && valgrind --leak-check=full --error-exitcode=1 ./target/release/meteor-edge-client test --camera-source test:static --frames 100" \
60
else
print_status "INFO" "Valgrind not available, skipping memory leak test"
fi
}
# Test 5: Concurrent sources
test_concurrent() {
print_status "INFO" "Testing concurrent camera sources..."
# Start multiple instances in background
cd "$PROJECT_DIR"
./target/release/meteor-edge-client test --camera-source test:meteor --frames 100 &
PID1=$!
./target/release/meteor-edge-client test --camera-source test:noise --frames 100 &
PID2=$!
./target/release/meteor-edge-client test --camera-source test:bar --frames 100 &
PID3=$!
# Wait for all to complete
if wait $PID1 && wait $PID2 && wait $PID3; then
print_status "SUCCESS" "Concurrent sources test passed"
else
print_status "FAILURE" "Concurrent sources test failed"
fi
}
# Test 6: Error handling
test_error_handling() {
print_status "INFO" "Testing error handling..."
# Test with non-existent file
run_test "Non-existent file handling" \
"cd $PROJECT_DIR && ! cargo run --features camera_sim -- test --camera-source file:nonexistent.mp4 --frames 10" \
5
# Test with invalid pattern
run_test "Invalid pattern handling" \
"cd $PROJECT_DIR && ! cargo run --features camera_sim -- test --camera-source test:invalid_pattern --frames 10" \
5
}
# Main test execution
main() {
echo "================================================"
echo "Camera Simulation Test Suite"
echo "================================================"
# Parse arguments
TEST_SUITE=${1:-all}
# Create test data
create_test_data
# Build project
build_project
# Run tests based on selection
case $TEST_SUITE in
patterns)
test_patterns
;;
files)
test_file_reader
;;
performance)
test_performance
;;
memory)
test_memory_leaks
;;
concurrent)
test_concurrent
;;
errors)
test_error_handling
;;
all)
test_patterns
test_file_reader
test_performance
test_memory_leaks
test_concurrent
test_error_handling
;;
*)
echo "Usage: $0 [all|patterns|files|performance|memory|concurrent|errors]"
exit 1
;;
esac
# Print summary
echo ""
echo "================================================"
echo "Test Summary"
echo "================================================"
print_status "SUCCESS" "Tests passed: $TESTS_PASSED"
if [ $TESTS_FAILED -gt 0 ]; then
print_status "FAILURE" "Tests failed: $TESTS_FAILED"
exit 1
else
print_status "SUCCESS" "All tests passed!"
fi
}
# Run main function
main "$@"