185 lines
5.3 KiB
Bash
Executable File
185 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Screenshot Automation Common Functions
|
|
# Shared functionality between Android and iOS screenshot scripts
|
|
|
|
# This script should be sourced, not executed directly
|
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
echo "This script should be sourced, not executed directly"
|
|
exit 1
|
|
fi
|
|
|
|
# Configuration - these should be set before sourcing this file, but defaults provided
|
|
SCRIPT_DIR="${SCRIPT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
|
|
PROJECT_ROOT="${PROJECT_ROOT:-$(dirname "$SCRIPT_DIR")}"
|
|
MAESTRO_DIR="${MAESTRO_DIR:-$PROJECT_ROOT/maestro}"
|
|
ENV_FILE="${ENV_FILE:-$PROJECT_ROOT/.env}"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Logging functions
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# Check common dependencies (flutter, maestro, dotenv, ffprobe)
|
|
check_common_dependencies() {
|
|
log_info "Checking common dependencies..."
|
|
|
|
local all_found=true
|
|
|
|
if ! command -v flutter &> /dev/null; then
|
|
log_error "Flutter is not installed or not in PATH"
|
|
all_found=false
|
|
fi
|
|
|
|
if ! command -v maestro &> /dev/null; then
|
|
log_error "Maestro is not installed or not in PATH"
|
|
all_found=false
|
|
fi
|
|
|
|
if ! command -v dotenv &> /dev/null; then
|
|
log_error "dotenv is not installed or not in PATH"
|
|
all_found=false
|
|
fi
|
|
|
|
if ! command -v ffprobe &> /dev/null; then
|
|
log_error "ffprobe is not installed or not in PATH (part of ffmpeg)"
|
|
all_found=false
|
|
fi
|
|
|
|
if [ "$all_found" = false ]; then
|
|
return 1
|
|
fi
|
|
|
|
log_success "Common dependencies found"
|
|
return 0
|
|
}
|
|
|
|
# Get image dimensions using ffprobe
|
|
get_image_dimensions() {
|
|
local image_path="$1"
|
|
ffprobe -v quiet -select_streams v:0 -show_entries stream=width,height -of csv=p=0 "$image_path" 2>/dev/null
|
|
}
|
|
|
|
# Log image information for debugging
|
|
log_image_info() {
|
|
local image_path="$1"
|
|
local device_type="$2"
|
|
|
|
local dimensions=$(get_image_dimensions "$image_path")
|
|
local filename=$(basename "$image_path")
|
|
|
|
if [ -n "$dimensions" ]; then
|
|
local width=$(echo "$dimensions" | cut -d',' -f1)
|
|
local height=$(echo "$dimensions" | cut -d',' -f2)
|
|
log_info "Screenshot: $filename - ${width}x${height} - $device_type"
|
|
else
|
|
log_warning "Could not analyze: $filename - assuming $device_type"
|
|
fi
|
|
}
|
|
|
|
# Clean up old maestro screenshots for specified platform(s)
|
|
# Usage: clean_old_screenshots "android" or clean_old_screenshots "ios" or clean_old_screenshots "android ios"
|
|
clean_old_screenshots() {
|
|
local platforms="$1"
|
|
|
|
log_info "Cleaning up old screenshots..."
|
|
|
|
for platform in $platforms; do
|
|
local platform_dir="$MAESTRO_DIR/$platform"
|
|
|
|
if [ -d "$platform_dir" ]; then
|
|
local old_count=$(find "$platform_dir" -name "*.png" 2>/dev/null | wc -l)
|
|
if [ "$old_count" -gt 0 ]; then
|
|
log_info "Removing $old_count old screenshot(s) from maestro/$platform/"
|
|
rm -f "$platform_dir"/*.png
|
|
else
|
|
log_info "No old screenshots found in maestro/$platform/"
|
|
fi
|
|
else
|
|
log_info "No $platform screenshot directory found"
|
|
fi
|
|
done
|
|
|
|
log_success "Screenshot cleanup completed"
|
|
}
|
|
|
|
# Execute maestro tests
|
|
# Usage: run_maestro_tests [device_id]
|
|
run_maestro_tests() {
|
|
local device_id="${1:-}"
|
|
|
|
if [ -n "$device_id" ]; then
|
|
log_info "Running maestro screenshot tests on device $device_id..."
|
|
else
|
|
log_info "Running maestro screenshot tests..."
|
|
fi
|
|
|
|
# Check if .env file exists
|
|
if [ ! -f "$ENV_FILE" ]; then
|
|
log_error "Environment file not found at $ENV_FILE"
|
|
log_info "Please create a .env file with required Maestro variables"
|
|
return 1
|
|
fi
|
|
|
|
log_info "Using environment file: $ENV_FILE"
|
|
cd "$MAESTRO_DIR"
|
|
|
|
# Run maestro tests with optional device specification
|
|
if [ -n "$device_id" ]; then
|
|
log_info "Executing: MAESTRO_DEVICE=$device_id dotenv -f $ENV_FILE run maestro test screenshots.yaml"
|
|
MAESTRO_DEVICE="$device_id" dotenv -f "$ENV_FILE" run maestro test screenshots.yaml
|
|
else
|
|
log_info "Executing: dotenv -f $ENV_FILE run maestro test screenshots.yaml"
|
|
dotenv -f "$ENV_FILE" run maestro test screenshots.yaml
|
|
fi
|
|
|
|
local maestro_exit_code=$?
|
|
if [ $maestro_exit_code -eq 0 ]; then
|
|
log_success "Maestro tests completed successfully"
|
|
return 0
|
|
else
|
|
log_error "Maestro tests failed with exit code $maestro_exit_code"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Run Flutter app on specified device
|
|
# Platform-specific validation should be done in the calling script
|
|
run_flutter_app() {
|
|
local device_id="$1"
|
|
local device_type="$2"
|
|
local wait_time="${3:-30}" # Optional wait time, default 30s
|
|
|
|
log_info "Running Flutter app on $device_type ($device_id)"
|
|
|
|
cd "$PROJECT_ROOT"
|
|
flutter run -d "$device_id" --hot &
|
|
local flutter_pid=$!
|
|
|
|
# Wait for app to be installed and launched
|
|
log_info "Waiting for Flutter app to launch..."
|
|
sleep "$wait_time"
|
|
|
|
log_success "Flutter app should be running on $device_type"
|
|
return 0
|
|
}
|