#!/bin/bash # Phantom Protocol - Комплексный тестовый набор # Автор: Manus AI # Версия: 2025 Модернизированная set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Функции для логирования 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" } # Счетчики тестов TESTS_TOTAL=0 TESTS_PASSED=0 TESTS_FAILED=0 # Функция для запуска теста run_test() { local test_name="$1" local test_command="$2" TESTS_TOTAL=$((TESTS_TOTAL + 1)) log_info "Запуск теста: $test_name" if eval "$test_command"; then log_success "✓ $test_name" TESTS_PASSED=$((TESTS_PASSED + 1)) return 0 else log_error "✗ $test_name" TESTS_FAILED=$((TESTS_FAILED + 1)) return 1 fi } # Тест 1: Проверка зависимостей системы test_system_dependencies() { log_info "Проверка системных зависимостей..." # Проверка компилятора if ! command -v gcc &> /dev/null; then log_error "GCC не найден" return 1 fi # Проверка OpenSSL if ! command -v openssl &> /dev/null; then log_error "OpenSSL не найден" return 1 fi # Проверка версии OpenSSL local openssl_version=$(openssl version | cut -d' ' -f2) log_info "Версия OpenSSL: $openssl_version" # Проверка protobuf if ! command -v protoc &> /dev/null; then log_warning "protoc не найден, но может быть установлен в контейнере" fi # Проверка Docker if ! command -v docker &> /dev/null; then log_error "Docker не найден" return 1 fi return 0 } # Тест 2: Компиляция исходного кода test_source_compilation() { log_info "Тестирование компиляции исходного кода..." cd src # Очистка предыдущих сборок make clean &> /dev/null || true # Попытка компиляции phantomd (упрощенная версия) if gcc -O0 -g -I/usr/include/libxml2 -Wno-deprecated-declarations \ -DOPENSSL_API_COMPAT=0x10100000L \ -o phantomd phantomd.c addr.c helper.c -lssl -lcrypto -lxml2 -lpthread; then log_success "phantomd скомпилирован успешно" # Проверка исполняемого файла if [ -x "./phantomd" ]; then log_success "phantomd исполняемый файл создан" return 0 else log_error "phantomd не является исполняемым" return 1 fi else log_error "Ошибка компиляции phantomd" return 1 fi cd .. } # Тест 3: Проверка Docker сборки test_docker_build() { log_info "Тестирование Docker сборки..." # Проверка наличия Dockerfile if [ ! -f "Dockerfile" ]; then log_error "Dockerfile не найден" return 1 fi # Попытка сборки образа if sudo docker build -t phantom-protocol:test . &> docker_build.log; then log_success "Docker образ собран успешно" # Проверка размера образа local image_size=$(sudo docker images phantom-protocol:test --format "{{.Size}}") log_info "Размер Docker образа: $image_size" return 0 else log_error "Ошибка сборки Docker образа" log_info "Логи сборки сохранены в docker_build.log" return 1 fi } # Тест 4: Проверка конфигурационных файлов test_configuration_files() { log_info "Проверка конфигурационных файлов..." # Проверка docker-compose.yml if [ -f "docker-compose.yml" ]; then if command -v docker-compose &> /dev/null; then if docker-compose config &> /dev/null; then log_success "docker-compose.yml валиден" else log_error "docker-compose.yml содержит ошибки" return 1 fi else log_warning "docker-compose не установлен, пропуск валидации" fi else log_error "docker-compose.yml не найден" return 1 fi # Проверка тестовых конфигураций if [ -d "src/test" ]; then local config_count=$(find src/test -name "*.conf" | wc -l) log_info "Найдено $config_count тестовых конфигураций" if [ $config_count -gt 0 ]; then log_success "Тестовые конфигурации найдены" else log_warning "Тестовые конфигурации не найдены" fi fi return 0 } # Тест 5: Проверка скриптов test_scripts() { log_info "Проверка скриптов..." # Проверка entrypoint.sh if [ -f "docker/entrypoint.sh" ]; then if [ -x "docker/entrypoint.sh" ]; then log_success "entrypoint.sh исполняемый" else log_warning "entrypoint.sh не исполняемый" chmod +x docker/entrypoint.sh fi else log_error "entrypoint.sh не найден" return 1 fi # Проверка других скриптов local scripts=("docker/generate-config.sh" "docker/healthcheck.sh" "docker/test-scripts/test-network.sh") for script in "${scripts[@]}"; do if [ -f "$script" ]; then if [ -x "$script" ]; then log_success "$script исполняемый" else log_warning "$script не исполняемый, исправляю..." chmod +x "$script" fi else log_error "$script не найден" return 1 fi done return 0 } # Тест 6: Проверка документации test_documentation() { log_info "Проверка документации..." local docs=("README-Docker.md" "docs/phantom-protocol-complete-guide-ru.md") for doc in "${docs[@]}"; do if [ -f "$doc" ]; then local word_count=$(wc -w < "$doc") log_info "$doc: $word_count слов" if [ $word_count -gt 1000 ]; then log_success "$doc содержит достаточно контента" else log_warning "$doc содержит мало контента" fi else log_error "$doc не найден" return 1 fi done return 0 } # Тест 7: Проверка сетевых возможностей test_network_capabilities() { log_info "Проверка сетевых возможностей..." # Проверка TUN/TAP поддержки if [ -c "/dev/net/tun" ]; then log_success "TUN/TAP интерфейс доступен" else log_warning "TUN/TAP интерфейс недоступен" # Попытка загрузки модуля if sudo modprobe tun 2>/dev/null; then log_success "Модуль TUN загружен" else log_error "Не удалось загрузить модуль TUN" return 1 fi fi # Проверка доступности портов local ports=(8080 8081 8082 8083 8084) for port in "${ports[@]}"; do if ! netstat -ln | grep ":$port " &> /dev/null; then log_success "Порт $port свободен" else log_warning "Порт $port занят" fi done return 0 } # Тест 8: Функциональное тестирование phantomd test_phantomd_functionality() { log_info "Функциональное тестирование phantomd..." cd src if [ ! -x "./phantomd" ]; then log_error "phantomd не найден или не исполняемый" cd .. return 1 fi # Запуск phantomd в фоновом режиме ./phantomd & local phantomd_pid=$! # Ожидание запуска sleep 2 # Проверка, что процесс запущен if kill -0 $phantomd_pid 2>/dev/null; then log_success "phantomd запущен (PID: $phantomd_pid)" # Проверка создания socket файла if [ -S "/tmp/phantom.sock" ]; then log_success "Socket файл создан" else log_warning "Socket файл не найден" fi # Остановка процесса kill $phantomd_pid 2>/dev/null || true wait $phantomd_pid 2>/dev/null || true log_success "phantomd остановлен" cd .. return 0 else log_error "phantomd не запустился" cd .. return 1 fi } # Тест 9: Проверка криптографических функций test_crypto_functions() { log_info "Проверка криптографических функций..." # Создание тестового файла для проверки криптографии cat > crypto_test.c << 'EOF' #include #include #include #include #include int main() { // Инициализация OpenSSL OpenSSL_add_all_algorithms(); // Тест генерации случайных чисел unsigned char random_bytes[32]; if (RAND_bytes(random_bytes, 32) != 1) { printf("RAND_bytes failed\n"); return 1; } printf("Random bytes generation: OK\n"); // Тест AES шифрования EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); if (!ctx) { printf("EVP_CIPHER_CTX_new failed\n"); return 1; } unsigned char key[32], iv[16]; RAND_bytes(key, 32); RAND_bytes(iv, 16); if (EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, iv) != 1) { printf("EVP_EncryptInit_ex failed\n"); EVP_CIPHER_CTX_free(ctx); return 1; } printf("AES-256-GCM initialization: OK\n"); EVP_CIPHER_CTX_free(ctx); // Тест SHA-3 EVP_MD_CTX *md_ctx = EVP_MD_CTX_new(); if (!md_ctx) { printf("EVP_MD_CTX_new failed\n"); return 1; } if (EVP_DigestInit_ex(md_ctx, EVP_sha3_256(), NULL) != 1) { printf("SHA-3 not available, using SHA-256\n"); if (EVP_DigestInit_ex(md_ctx, EVP_sha256(), NULL) != 1) { printf("SHA-256 failed\n"); EVP_MD_CTX_free(md_ctx); return 1; } } printf("Hash function initialization: OK\n"); EVP_MD_CTX_free(md_ctx); printf("All crypto tests passed\n"); return 0; } EOF # Компиляция и запуск теста if gcc -o crypto_test crypto_test.c -lssl -lcrypto; then if ./crypto_test; then log_success "Криптографические функции работают корректно" rm -f crypto_test crypto_test.c return 0 else log_error "Ошибка в криптографических функциях" rm -f crypto_test crypto_test.c return 1 fi else log_error "Не удалось скомпилировать тест криптографии" rm -f crypto_test.c return 1 fi } # Тест 10: Проверка производительности test_performance() { log_info "Проверка производительности..." # Создание тестового файла для измерения производительности cat > perf_test.c << 'EOF' #include #include #include #include #include #define TEST_DATA_SIZE 1024*1024 // 1MB #define NUM_ITERATIONS 100 int main() { unsigned char *test_data = malloc(TEST_DATA_SIZE); unsigned char *encrypted_data = malloc(TEST_DATA_SIZE + 16); unsigned char key[32], iv[16]; RAND_bytes(test_data, TEST_DATA_SIZE); RAND_bytes(key, 32); RAND_bytes(iv, 16); clock_t start = clock(); for (int i = 0; i < NUM_ITERATIONS; i++) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, iv); int len, encrypted_len; EVP_EncryptUpdate(ctx, encrypted_data, &len, test_data, TEST_DATA_SIZE); encrypted_len = len; EVP_EncryptFinal_ex(ctx, encrypted_data + len, &len); encrypted_len += len; EVP_CIPHER_CTX_free(ctx); } clock_t end = clock(); double cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; double throughput = (TEST_DATA_SIZE * NUM_ITERATIONS) / (cpu_time_used * 1024 * 1024); printf("AES-256-GCM throughput: %.2f MB/s\n", throughput); free(test_data); free(encrypted_data); return 0; } EOF if gcc -o perf_test perf_test.c -lssl -lcrypto; then log_info "Измерение производительности шифрования..." ./perf_test rm -f perf_test perf_test.c log_success "Тест производительности завершен" return 0 else log_error "Не удалось скомпилировать тест производительности" rm -f perf_test.c return 1 fi } # Главная функция main() { log_info "=== Phantom Protocol - Комплексное тестирование ===" log_info "Начало тестирования: $(date)" echo # Запуск всех тестов run_test "Системные зависимости" "test_system_dependencies" run_test "Компиляция исходного кода" "test_source_compilation" run_test "Docker сборка" "test_docker_build" run_test "Конфигурационные файлы" "test_configuration_files" run_test "Скрипты" "test_scripts" run_test "Документация" "test_documentation" run_test "Сетевые возможности" "test_network_capabilities" run_test "Функциональность phantomd" "test_phantomd_functionality" run_test "Криптографические функции" "test_crypto_functions" run_test "Производительность" "test_performance" echo log_info "=== Результаты тестирования ===" log_info "Всего тестов: $TESTS_TOTAL" log_success "Пройдено: $TESTS_PASSED" log_error "Провалено: $TESTS_FAILED" if [ $TESTS_FAILED -eq 0 ]; then log_success "🎉 Все тесты пройдены успешно!" echo log_info "Система готова к развертыванию:" log_info "1. Запустите: make -f Makefile.docker up" log_info "2. Откройте мониторинг: http://localhost:8090" log_info "3. Проверьте логи: make -f Makefile.docker logs" return 0 else log_error "❌ Некоторые тесты провалились" log_info "Проверьте логи и исправьте ошибки перед развертыванием" return 1 fi } # Запуск главной функции main "$@"