Files
EventHubBack/test/scripts/test_all.sh
2026-04-20 21:04:16 +03:00

298 lines
8.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
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
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 </dev/null > "$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 $?