#!/bin/bash RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' SCRIPTS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPTS_DIR/../.." && pwd)" BASE_URL="http://localhost:8080" PASSED=0 FAILED=0 SKIPPED=0 SERVER_STARTED=false SERVER_PID="" # ============================================================================ # Вспомогательные функции # ============================================================================ log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } log_step() { echo -e "${CYAN}[STEP]${NC} $1"; } # Очистка при выходе cleanup() { echo "" log_info "Cleaning up..." if [ -n "$SERVER_PID" ] && kill -0 "$SERVER_PID" 2>/dev/null; then log_info "Stopping server (PID: $SERVER_PID)..." kill "$SERVER_PID" 2>/dev/null wait "$SERVER_PID" 2>/dev/null # Убеждаемся, что все beam процессы остановлены pkill -f "beam.*eventhub" 2>/dev/null || true log_success "Server stopped" fi # Удаляем временные файлы rm -f /tmp/eventhub_test_*.log 2>/dev/null } # Обработчик сигналов trap cleanup EXIT INT TERM # Проверка порта check_port() { local port=$1 if lsof -i ":$port" > /dev/null 2>&1 || netstat -tuln 2>/dev/null | grep -q ":$port "; then return 0 fi return 1 } # Ожидание запуска сервера wait_for_server() { local max_attempts=30 local attempt=0 log_info "Waiting for server to start..." while [ $attempt -lt $max_attempts ]; do if curl -s "$BASE_URL/health" | grep -q "ok"; then log_success "Server is ready (took $attempt seconds)" return 0 fi sleep 1 ((attempt++)) echo -n "." done echo "" log_error "Server failed to start within $max_attempts seconds" return 1 } # Запуск сервера start_server() { echo -e "${CYAN}[STEP]${NC} Starting EventHub server..." cd "$PROJECT_ROOT" if [ ! -f "rebar.config" ]; then echo -e "${RED}[ERROR]${NC} rebar.config not found in $(pwd)" return 1 fi echo -e "${BLUE}[INFO]${NC} Project root: $(pwd)" # Очищаем старые данные rm -rf Mnesia.* 2>/dev/null pkill -f "beam.*eventhub_test" 2>/dev/null || true sleep 1 # Компилируем echo -e "${BLUE}[INFO]${NC} Compiling..." rebar3 compile > /dev/null 2>&1 # Запускаем сервер через erl (более надёжно для фона) LOG_FILE="/tmp/eventhub_test_server.log" echo -e "${BLUE}[INFO]${NC} Starting server..." # Запускаем в фоне с перенаправлением вывода rebar3 shell --sname eventhub_test "$LOG_FILE" 2>&1 & SERVER_PID=$! # Даём процессу время запуститься sleep 3 # Проверяем, жив ли процесс if ! kill -0 "$SERVER_PID" 2>/dev/null; then echo -e "${RED}[ERROR]${NC} Server process died immediately" echo -e "${YELLOW}[INFO]${NC} Check log: $LOG_FILE" cat "$LOG_FILE" return 1 fi echo -e "${BLUE}[INFO]${NC} Server PID: $SERVER_PID" # Ждём готовности for i in {1..30}; do echo -n "." if curl -s "http://localhost:8080/health" 2>/dev/null | grep -q "ok"; then echo "" echo -e "${GREEN}[SUCCESS]${NC} Server ready at http://localhost:8080" return 0 fi if ! kill -0 "$SERVER_PID" 2>/dev/null; then echo "" echo -e "${RED}[ERROR]${NC} Server died during startup" echo -e "${YELLOW}[INFO]${NC} Last lines of log:" tail -30 "$LOG_FILE" return 1 fi sleep 1 done echo "" echo -e "${RED}[ERROR]${NC} Server failed to respond" return 1 } # Остановка сервера stop_server() { if [ "$SERVER_STARTED" = true ] && [ -n "$SERVER_PID" ]; then log_step "Stopping EventHub server..." # Останавливаем нашу ноду if kill -0 "$SERVER_PID" 2>/dev/null; then kill "$SERVER_PID" 2>/dev/null wait "$SERVER_PID" 2>/dev/null fi # Останавливаем все связанные beam процессы pkill -f "beam.*eventhub_test" 2>/dev/null || true SERVER_STARTED=false log_success "Server stopped" sleep 2 fi } # Проверка, запущен ли сервер is_server_running() { curl -s "$BASE_URL/health" | grep -q "ok" } # Запуск одного тестового скрипта run_test_script() { local script_path=$1 local script_name=$(basename "$script_path") echo "" echo "============================================================" echo -e "${CYAN}[RUNNING]${NC} $script_name" echo "============================================================" # Даём скрипту права на выполнение chmod +x "$script_path" 2>/dev/null # Запускаем тест if bash "$script_path"; then echo "" echo -e "${GREEN}[PASSED]${NC} $script_name" return 0 else echo "" echo -e "${RED}[FAILED]${NC} $script_name" return 1 fi } # ============================================================================ # Главная логика # ============================================================================ main() { echo "============================================================" echo " EVENTHUB FULL API TEST SUITE" echo "============================================================" echo "" # Проверяем, не запущен ли уже сервер if is_server_running; then log_warning "Server is already running on port 8080" read -p "Use existing server? [Y/n]: " USE_EXISTING if [[ "$USE_EXISTING" =~ ^[Nn] ]]; then log_error "Please stop the existing server first: make stop" exit 1 fi log_info "Using existing server" else # Проверяем, свободен ли порт if check_port 8080; then log_error "Port 8080 is in use by another process" log_info "Please free the port or stop the other process" exit 1 fi # Запускаем сервер if ! start_server; then log_error "Failed to start server" exit 1 fi fi echo "" log_info "Server is ready at $BASE_URL" # Получаем список всех тестовых скриптов TEST_SCRIPTS=$(find "$SCRIPTS_DIR" -maxdepth 1 -name "test_*.sh" ! -name "test_all.sh" ! -name "test_runner.sh" -type f | sort) if [ -z "$TEST_SCRIPTS" ]; then log_warning "No test scripts found in $SCRIPTS_DIR" exit 0 fi echo "" log_info "Found test scripts:" for script in $TEST_SCRIPTS; do echo " - $(basename "$script")" done # Счётчики времени START_TIME=$(date +%s) # Запускаем все тесты for script in $TEST_SCRIPTS; do if run_test_script "$script"; then ((PASSED++)) else ((FAILED++)) fi done END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) # Останавливаем сервер, если мы его запускали if [ "$SERVER_STARTED" = true ]; then echo "" stop_server fi # Итоговый отчёт echo "" echo "============================================================" echo " TEST SUMMARY" echo "============================================================" echo -e "Total scripts: $((PASSED + FAILED))" echo -e "${GREEN}Passed: $PASSED${NC}" echo -e "${RED}Failed: $FAILED${NC}" if [ $SKIPPED -gt 0 ]; then echo -e "${YELLOW}Skipped: $SKIPPED${NC}" fi echo -e "Duration: ${DURATION}s" echo "============================================================" if [ $FAILED -eq 0 ]; then echo "" echo -e "${GREEN}🎉 ALL TESTS PASSED!${NC}" return 0 else echo "" echo -e "${RED}❌ SOME TESTS FAILED${NC}" return 1 fi } # Запуск main "$@" exit $?