Files
Phantom/release/test-suite.sh

516 lines
16 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
# 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 <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/rsa.h>
#include <stdio.h>
#include <string.h>
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 <openssl/evp.h>
#include <openssl/rand.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#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 "$@"