teto_ai/docker_test.sh

283 lines
7.3 KiB
Bash
Executable file

#!/bin/bash
# Docker VP8 Webcam Recording Test Runner
# ======================================
set -e
CONTAINER_NAME="teto_ai_dev"
OUTPUT_DIR="./output"
LOG_FILE="./docker_test.log"
echo "🐳 Docker VP8 Webcam Recording Test Runner"
echo "=========================================="
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
log() {
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
}
success() {
echo -e "${GREEN}$1${NC}" | tee -a "$LOG_FILE"
}
warning() {
echo -e "${YELLOW}⚠️ $1${NC}" | tee -a "$LOG_FILE"
}
error() {
echo -e "${RED}$1${NC}" | tee -a "$LOG_FILE"
}
# Function to check if container is running
check_container() {
if docker-compose ps | grep -q "$CONTAINER_NAME.*Up"; then
return 0
else
return 1
fi
}
# Function to wait for container to be ready
wait_for_container() {
log "Waiting for container to be ready..."
local attempts=0
local max_attempts=30
while [ $attempts -lt $max_attempts ]; do
if check_container; then
# Wait a bit more for the bot to initialize
sleep 5
success "Container is running and ready"
return 0
fi
sleep 2
attempts=$((attempts + 1))
echo -n "."
done
error "Container failed to start within $max_attempts attempts"
return 1
}
# Function to run VP8 tests inside container
run_vp8_tests() {
log "Running VP8 implementation tests inside container..."
if docker-compose exec -T $CONTAINER_NAME node test_vp8.js; then
success "VP8 implementation tests passed"
return 0
else
error "VP8 implementation tests failed"
return 1
fi
}
# Function to check output directory
check_output_dir() {
log "Checking output directory setup..."
# Check host output directory
if [ -d "$OUTPUT_DIR" ]; then
success "Host output directory exists: $OUTPUT_DIR"
else
warning "Creating host output directory: $OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"
fi
# Check container output directory
if docker-compose exec -T $CONTAINER_NAME ls /tmp/output >/dev/null 2>&1; then
success "Container output directory accessible: /tmp/output"
else
error "Container output directory not accessible"
return 1
fi
# Test volume mounting
local test_file="docker_test_$(date +%s).tmp"
if docker-compose exec -T $CONTAINER_NAME sh -c "echo 'test' > /tmp/output/$test_file"; then
if [ -f "$OUTPUT_DIR/$test_file" ]; then
success "Volume mounting working correctly"
rm -f "$OUTPUT_DIR/$test_file"
docker-compose exec -T $CONTAINER_NAME rm -f "/tmp/output/$test_file"
else
error "Volume mounting not working - file not visible on host"
return 1
fi
else
error "Cannot write to container output directory"
return 1
fi
}
# Function to check environment variables
check_environment() {
log "Checking environment variables..."
if [ -z "$USER_TOKEN" ]; then
error "USER_TOKEN environment variable not set"
echo "Please run: export USER_TOKEN=\"your_discord_token\""
return 1
else
success "USER_TOKEN is set"
fi
# Check other optional variables
if [ -n "$BOT_CLIENT_ID" ]; then
success "BOT_CLIENT_ID is set"
else
warning "BOT_CLIENT_ID not set (optional)"
fi
}
# Function to show container logs
show_logs() {
log "Recent container logs:"
echo "===================="
docker-compose logs --tail=20 $CONTAINER_NAME
echo "===================="
}
# Function to test Docker networking
test_networking() {
log "Testing Docker networking capabilities..."
# Test basic connectivity
if docker-compose exec -T $CONTAINER_NAME ping -c 1 8.8.8.8 >/dev/null 2>&1; then
success "Container has internet connectivity"
else
error "Container networking issues - no internet"
return 1
fi
# Test Discord connectivity
if docker-compose exec -T $CONTAINER_NAME curl -s https://discord.com >/dev/null 2>&1; then
success "Container can reach Discord servers"
else
warning "Cannot reach Discord servers (may be temporary)"
fi
}
# Function to check FFmpeg
check_ffmpeg() {
log "Checking FFmpeg in container..."
if docker-compose exec -T $CONTAINER_NAME ffmpeg -version >/dev/null 2>&1; then
success "FFmpeg is available in container"
# Check VP8 codec support
if docker-compose exec -T $CONTAINER_NAME ffmpeg -codecs 2>/dev/null | grep -q "libvpx"; then
success "VP8 codec support confirmed"
else
warning "VP8 codec support unclear"
fi
else
error "FFmpeg not available in container"
return 1
fi
}
# Function to run readiness check inside container
run_readiness_check() {
log "Running comprehensive readiness check..."
if docker-compose exec -T $CONTAINER_NAME node check_ready.js; then
success "Readiness check passed"
return 0
else
error "Readiness check failed"
return 1
fi
}
# Main test sequence
main() {
log "Starting Docker VP8 test sequence..."
echo > "$LOG_FILE" # Clear log file
# Pre-flight checks
log "=== PRE-FLIGHT CHECKS ==="
check_environment || exit 1
# Start container if not running
if ! check_container; then
log "Starting Docker container..."
docker-compose up -d --build
else
log "Container already running"
fi
wait_for_container || exit 1
# Run all tests
log "=== CONTAINER TESTS ==="
check_output_dir || exit 1
test_networking || exit 1
check_ffmpeg || exit 1
run_vp8_tests || exit 1
run_readiness_check || exit 1
# Final status
log "=== FINAL STATUS ==="
success "All Docker VP8 tests passed!"
echo ""
echo "🎉 Container is ready for VP8 webcam recording!"
echo ""
echo "Next steps:"
echo "1. Join a Discord voice channel"
echo "2. Run: test vp8"
echo "3. Run: record webcam"
echo "4. Check output: ls -la $OUTPUT_DIR"
echo ""
echo "Monitor logs: docker-compose logs -f $CONTAINER_NAME"
echo "Access VNC: localhost:5901"
echo ""
}
# Handle script arguments
case "${1:-test}" in
"test")
main
;;
"logs")
docker-compose logs -f $CONTAINER_NAME
;;
"shell")
docker-compose exec $CONTAINER_NAME /bin/bash
;;
"stop")
docker-compose down
;;
"restart")
docker-compose restart $CONTAINER_NAME
;;
"clean")
docker-compose down -v --remove-orphans
docker system prune -f
;;
"help"|"-h"|"--help")
echo "Docker VP8 Test Runner"
echo "Usage: $0 [command]"
echo ""
echo "Commands:"
echo " test Run full test suite (default)"
echo " logs Follow container logs"
echo " shell Open shell in container"
echo " stop Stop container"
echo " restart Restart container"
echo " clean Clean up containers and volumes"
echo " help Show this help"
;;
*)
error "Unknown command: $1"
echo "Run '$0 help' for usage information"
exit 1
;;
esac