516 lines
16 KiB
Bash
516 lines
16 KiB
Bash
#!/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 "$@"
|
||
|