696 lines
27 KiB
Bash
696 lines
27 KiB
Bash
#!/bin/bash
|
||
|
||
# Phantom Protocol - Тестирование реальных сценариев использования
|
||
# Этот скрипт демонстрирует практические примеры использования Phantom Protocol
|
||
|
||
set -e
|
||
|
||
# Цвета для вывода
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
PURPLE='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Функция для красивого вывода
|
||
print_header() {
|
||
echo -e "\n${BLUE}================================${NC}"
|
||
echo -e "${BLUE}$1${NC}"
|
||
echo -e "${BLUE}================================${NC}\n"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||
}
|
||
|
||
print_info() {
|
||
echo -e "${CYAN}ℹ️ $1${NC}"
|
||
}
|
||
|
||
# Проверка зависимостей
|
||
check_dependencies() {
|
||
print_header "Проверка зависимостей"
|
||
|
||
local deps=("docker" "docker-compose" "curl" "nc" "python3")
|
||
local missing_deps=()
|
||
|
||
for dep in "${deps[@]}"; do
|
||
if command -v "$dep" >/dev/null 2>&1; then
|
||
print_success "$dep установлен"
|
||
else
|
||
print_error "$dep не найден"
|
||
missing_deps+=("$dep")
|
||
fi
|
||
done
|
||
|
||
if [ ${#missing_deps[@]} -ne 0 ]; then
|
||
print_error "Отсутствуют зависимости: ${missing_deps[*]}"
|
||
print_info "Установите недостающие зависимости и повторите попытку"
|
||
exit 1
|
||
fi
|
||
|
||
print_success "Все зависимости установлены"
|
||
}
|
||
|
||
# Запуск базовой Phantom сети
|
||
start_phantom_network() {
|
||
print_header "Запуск базовой Phantom сети"
|
||
|
||
if docker-compose ps | grep -q "phantom-node"; then
|
||
print_warning "Phantom сеть уже запущена"
|
||
return 0
|
||
fi
|
||
|
||
print_info "Сборка Docker образов..."
|
||
docker-compose build --quiet
|
||
|
||
print_info "Запуск сети из 5 узлов..."
|
||
docker-compose up -d phantom-node-1 phantom-node-2 phantom-node-3 phantom-node-4 phantom-node-5
|
||
|
||
print_info "Ожидание инициализации сети (60 секунд)..."
|
||
sleep 60
|
||
|
||
# Проверка статуса узлов
|
||
local healthy_nodes=0
|
||
for i in {1..5}; do
|
||
if docker-compose ps phantom-node-$i | grep -q "Up"; then
|
||
healthy_nodes=$((healthy_nodes + 1))
|
||
print_success "Узел phantom-node-$i запущен"
|
||
else
|
||
print_error "Узел phantom-node-$i не запущен"
|
||
fi
|
||
done
|
||
|
||
if [ $healthy_nodes -ge 3 ]; then
|
||
print_success "Phantom сеть готова ($healthy_nodes/5 узлов активны)"
|
||
else
|
||
print_error "Недостаточно активных узлов для работы сети"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# Тест 1: SOCKS5 прокси
|
||
test_socks5_proxy() {
|
||
print_header "Тест 1: SOCKS5 прокси через Phantom"
|
||
|
||
print_info "Запуск SOCKS5 прокси контейнера..."
|
||
docker-compose up -d phantom-socks5-proxy
|
||
|
||
print_info "Ожидание готовности прокси (30 секунд)..."
|
||
sleep 30
|
||
|
||
# Проверка доступности прокси
|
||
if nc -z localhost 8080; then
|
||
print_success "SOCKS5 прокси доступен на порту 8080"
|
||
else
|
||
print_error "SOCKS5 прокси недоступен"
|
||
return 1
|
||
fi
|
||
|
||
# Тест проксирования HTTP запроса
|
||
print_info "Тестирование HTTP запроса через SOCKS5 прокси..."
|
||
|
||
# Получение IP без прокси
|
||
local direct_ip
|
||
direct_ip=$(curl -s --max-time 10 http://httpbin.org/ip | grep -o '"origin":"[^"]*' | cut -d'"' -f4)
|
||
|
||
# Получение IP через прокси
|
||
local proxy_ip
|
||
proxy_ip=$(curl -s --max-time 30 --socks5 localhost:8080 http://httpbin.org/ip | grep -o '"origin":"[^"]*' | cut -d'"' -f4)
|
||
|
||
if [ -n "$direct_ip" ] && [ -n "$proxy_ip" ]; then
|
||
print_info "IP без прокси: $direct_ip"
|
||
print_info "IP через Phantom прокси: $proxy_ip"
|
||
|
||
if [ "$direct_ip" != "$proxy_ip" ]; then
|
||
print_success "SOCKS5 прокси работает корректно (IP изменился)"
|
||
else
|
||
print_warning "IP не изменился, возможно прокси не работает"
|
||
fi
|
||
else
|
||
print_error "Не удалось получить IP адреса для сравнения"
|
||
fi
|
||
|
||
# Тест производительности
|
||
print_info "Тест производительности прокси..."
|
||
local start_time=$(date +%s%N)
|
||
curl -s --max-time 10 --socks5 localhost:8080 http://httpbin.org/get > /dev/null
|
||
local end_time=$(date +%s%N)
|
||
local duration=$(( (end_time - start_time) / 1000000 ))
|
||
|
||
print_info "Время ответа через прокси: ${duration}ms"
|
||
|
||
if [ $duration -lt 5000 ]; then
|
||
print_success "Производительность прокси отличная (<5s)"
|
||
elif [ $duration -lt 10000 ]; then
|
||
print_success "Производительность прокси хорошая (<10s)"
|
||
else
|
||
print_warning "Производительность прокси низкая (>10s)"
|
||
fi
|
||
}
|
||
|
||
# Тест 2: DNS резолвинг .phantom доменов
|
||
test_phantom_dns() {
|
||
print_header "Тест 2: DNS резолвинг .phantom доменов"
|
||
|
||
print_info "Запуск Phantom DNS сервера..."
|
||
docker-compose up -d phantom-dns-server
|
||
|
||
print_info "Ожидание готовности DNS сервера (30 секунд)..."
|
||
sleep 30
|
||
|
||
# Проверка доступности DNS сервера
|
||
if nc -z -u localhost 53; then
|
||
print_success "Phantom DNS сервер доступен на порту 53"
|
||
else
|
||
print_error "Phantom DNS сервер недоступен"
|
||
return 1
|
||
fi
|
||
|
||
# Тест резолвинга обычного домена
|
||
print_info "Тестирование резолвинга обычного домена..."
|
||
if nslookup google.com localhost > /dev/null 2>&1; then
|
||
print_success "Резолвинг обычных доменов работает"
|
||
else
|
||
print_error "Резолвинг обычных доменов не работает"
|
||
fi
|
||
|
||
# Создание тестового .phantom домена
|
||
print_info "Создание тестового .phantom домена..."
|
||
docker exec phantom-dns-server phantom-dns-admin --add-domain test.phantom --ip 172.20.0.100
|
||
|
||
# Тест резолвинга .phantom домена
|
||
print_info "Тестирование резолвинга .phantom домена..."
|
||
local phantom_ip
|
||
phantom_ip=$(nslookup test.phantom localhost 2>/dev/null | grep "Address:" | tail -1 | awk '{print $2}')
|
||
|
||
if [ "$phantom_ip" = "172.20.0.100" ]; then
|
||
print_success ".phantom домен резолвится корректно: test.phantom -> $phantom_ip"
|
||
else
|
||
print_error ".phantom домен не резолвится или резолвится неправильно"
|
||
fi
|
||
}
|
||
|
||
# Тест 3: Hidden Service
|
||
test_hidden_service() {
|
||
print_header "Тест 3: Hidden Service (.phantom сайт)"
|
||
|
||
print_info "Запуск Hidden Service..."
|
||
docker-compose up -d phantom-hidden-service test-web-server
|
||
|
||
print_info "Ожидание готовности сервиса (45 секунд)..."
|
||
sleep 45
|
||
|
||
# Получение адреса hidden service
|
||
local hidden_address
|
||
hidden_address=$(docker exec phantom-hidden-service cat /var/lib/phantom/hidden-service/hostname 2>/dev/null || echo "unknown.phantom")
|
||
|
||
print_info "Адрес Hidden Service: $hidden_address"
|
||
|
||
# Проверка доступности через обычный HTTP
|
||
if curl -s --max-time 10 http://localhost:8081 > /dev/null; then
|
||
print_success "Тестовый веб-сервер доступен напрямую"
|
||
else
|
||
print_error "Тестовый веб-сервер недоступен"
|
||
return 1
|
||
fi
|
||
|
||
# Проверка доступности через Phantom сеть
|
||
print_info "Тестирование доступа к Hidden Service через Phantom..."
|
||
|
||
# Используем SOCKS5 прокси для доступа к .phantom домену
|
||
if curl -s --max-time 30 --socks5 localhost:8080 "http://$hidden_address" > /dev/null; then
|
||
print_success "Hidden Service доступен через Phantom сеть"
|
||
else
|
||
print_warning "Hidden Service недоступен через Phantom (возможно, нужно больше времени)"
|
||
fi
|
||
}
|
||
|
||
# Тест 4: Туннелирование TCP трафика
|
||
test_tcp_tunnel() {
|
||
print_header "Тест 4: TCP туннелирование через Phantom"
|
||
|
||
print_info "Создание TCP туннеля для SSH (порт 2222 -> test-web-server:80)..."
|
||
|
||
# Запуск туннеля в фоне
|
||
docker run -d --name phantom-tcp-tunnel \
|
||
--network phantom-protocol-2025-release_phantom-network \
|
||
-p 2222:2222 \
|
||
phantom-protocol:tunnel \
|
||
phantom-tunnel --local 2222 --remote test-web-server:80 --hops 3 &
|
||
|
||
local tunnel_pid=$!
|
||
|
||
print_info "Ожидание готовности туннеля (30 секунд)..."
|
||
sleep 30
|
||
|
||
# Проверка доступности туннеля
|
||
if nc -z localhost 2222; then
|
||
print_success "TCP туннель доступен на порту 2222"
|
||
|
||
# Тест передачи данных через туннель
|
||
print_info "Тестирование передачи данных через туннель..."
|
||
local response
|
||
response=$(echo -e "GET / HTTP/1.1\r\nHost: test-web-server\r\n\r\n" | nc localhost 2222 | head -1)
|
||
|
||
if echo "$response" | grep -q "HTTP/1.1 200"; then
|
||
print_success "Данные успешно передаются через TCP туннель"
|
||
else
|
||
print_error "Ошибка передачи данных через туннель"
|
||
fi
|
||
else
|
||
print_error "TCP туннель недоступен"
|
||
fi
|
||
|
||
# Остановка туннеля
|
||
docker stop phantom-tcp-tunnel 2>/dev/null || true
|
||
docker rm phantom-tcp-tunnel 2>/dev/null || true
|
||
}
|
||
|
||
# Тест 5: Файловое хранилище
|
||
test_file_storage() {
|
||
print_header "Тест 5: Распределенное файловое хранилище"
|
||
|
||
print_info "Запуск системы файлового хранилища..."
|
||
docker-compose up -d phantom-storage
|
||
|
||
print_info "Ожидание готовности системы (30 секунд)..."
|
||
sleep 30
|
||
|
||
# Проверка API
|
||
if curl -s --max-time 10 http://localhost:8070/health > /dev/null; then
|
||
print_success "API файлового хранилища доступно"
|
||
else
|
||
print_error "API файлового хранилища недоступно"
|
||
return 1
|
||
fi
|
||
|
||
# Создание тестового файла
|
||
local test_file="/tmp/phantom_test_file.txt"
|
||
echo "Это тестовый файл для Phantom Protocol $(date)" > "$test_file"
|
||
|
||
# Загрузка файла
|
||
print_info "Загрузка тестового файла..."
|
||
local upload_response
|
||
upload_response=$(curl -s --max-time 30 -X POST -F "file=@$test_file" http://localhost:8070/upload)
|
||
|
||
local file_id
|
||
file_id=$(echo "$upload_response" | grep -o '"file_id":"[^"]*' | cut -d'"' -f4)
|
||
|
||
if [ -n "$file_id" ]; then
|
||
print_success "Файл загружен с ID: $file_id"
|
||
|
||
# Скачивание файла
|
||
print_info "Скачивание файла..."
|
||
local download_file="/tmp/phantom_downloaded_file.txt"
|
||
|
||
if curl -s --max-time 30 "http://localhost:8070/download/$file_id" -o "$download_file"; then
|
||
if diff "$test_file" "$download_file" > /dev/null; then
|
||
print_success "Файл успешно скачан и содержимое совпадает"
|
||
else
|
||
print_error "Содержимое скачанного файла не совпадает с оригиналом"
|
||
fi
|
||
else
|
||
print_error "Не удалось скачать файл"
|
||
fi
|
||
|
||
# Очистка
|
||
rm -f "$test_file" "$download_file"
|
||
else
|
||
print_error "Не удалось загрузить файл"
|
||
fi
|
||
}
|
||
|
||
# Тест 6: Мессенджер
|
||
test_messenger() {
|
||
print_header "Тест 6: Анонимный мессенджер"
|
||
|
||
print_info "Запуск мессенджера..."
|
||
docker-compose up -d phantom-messenger
|
||
|
||
print_info "Ожидание готовности мессенджера (30 секунд)..."
|
||
sleep 30
|
||
|
||
# Проверка API
|
||
if curl -s --max-time 10 http://localhost:8076/health > /dev/null; then
|
||
print_success "API мессенджера доступно"
|
||
else
|
||
print_error "API мессенджера недоступно"
|
||
return 1
|
||
fi
|
||
|
||
# Создание пользователя
|
||
print_info "Создание тестового пользователя..."
|
||
local user_response
|
||
user_response=$(curl -s --max-time 10 -X POST -H "Content-Type: application/json" \
|
||
-d '{"username":"test_user","password":"test_password"}' \
|
||
http://localhost:8076/register)
|
||
|
||
local user_id
|
||
user_id=$(echo "$user_response" | grep -o '"user_id":"[^"]*' | cut -d'"' -f4)
|
||
|
||
if [ -n "$user_id" ]; then
|
||
print_success "Пользователь создан с ID: $user_id"
|
||
|
||
# Отправка сообщения
|
||
print_info "Отправка тестового сообщения..."
|
||
local message_response
|
||
message_response=$(curl -s --max-time 10 -X POST -H "Content-Type: application/json" \
|
||
-d '{"from":"'$user_id'","to":"broadcast","message":"Привет, Phantom!","encrypted":true}' \
|
||
http://localhost:8076/send)
|
||
|
||
local message_id
|
||
message_id=$(echo "$message_response" | grep -o '"message_id":"[^"]*' | cut -d'"' -f4)
|
||
|
||
if [ -n "$message_id" ]; then
|
||
print_success "Сообщение отправлено с ID: $message_id"
|
||
else
|
||
print_error "Не удалось отправить сообщение"
|
||
fi
|
||
else
|
||
print_error "Не удалось создать пользователя"
|
||
fi
|
||
}
|
||
|
||
# Тест 7: Производительность сети
|
||
test_network_performance() {
|
||
print_header "Тест 7: Производительность сети"
|
||
|
||
print_info "Тестирование задержки между узлами..."
|
||
|
||
# Тест ping между узлами
|
||
local total_latency=0
|
||
local successful_pings=0
|
||
|
||
for i in {1..5}; do
|
||
for j in {1..5}; do
|
||
if [ $i -ne $j ]; then
|
||
local latency
|
||
latency=$(docker exec phantom-node-$i ping -c 1 -W 2 phantom-node-$j 2>/dev/null | grep "time=" | grep -o "time=[0-9.]*" | cut -d'=' -f2)
|
||
|
||
if [ -n "$latency" ]; then
|
||
total_latency=$(echo "$total_latency + $latency" | bc)
|
||
successful_pings=$((successful_pings + 1))
|
||
print_info "Задержка node-$i -> node-$j: ${latency}ms"
|
||
fi
|
||
fi
|
||
done
|
||
done
|
||
|
||
if [ $successful_pings -gt 0 ]; then
|
||
local avg_latency
|
||
avg_latency=$(echo "scale=2; $total_latency / $successful_pings" | bc)
|
||
print_success "Средняя задержка между узлами: ${avg_latency}ms"
|
||
|
||
if (( $(echo "$avg_latency < 10" | bc -l) )); then
|
||
print_success "Отличная производительность сети"
|
||
elif (( $(echo "$avg_latency < 50" | bc -l) )); then
|
||
print_success "Хорошая производительность сети"
|
||
else
|
||
print_warning "Производительность сети может быть улучшена"
|
||
fi
|
||
else
|
||
print_error "Не удалось измерить задержку между узлами"
|
||
fi
|
||
|
||
# Тест пропускной способности
|
||
print_info "Тестирование пропускной способности через SOCKS5 прокси..."
|
||
|
||
local start_time=$(date +%s)
|
||
curl -s --max-time 60 --socks5 localhost:8080 http://httpbin.org/bytes/1048576 > /dev/null
|
||
local end_time=$(date +%s)
|
||
local duration=$((end_time - start_time))
|
||
|
||
if [ $duration -gt 0 ]; then
|
||
local throughput=$((1048576 / duration / 1024))
|
||
print_info "Пропускная способность: ${throughput} KB/s"
|
||
|
||
if [ $throughput -gt 100 ]; then
|
||
print_success "Отличная пропускная способность"
|
||
elif [ $throughput -gt 50 ]; then
|
||
print_success "Хорошая пропускная способность"
|
||
else
|
||
print_warning "Низкая пропускная способность"
|
||
fi
|
||
else
|
||
print_error "Не удалось измерить пропускную способность"
|
||
fi
|
||
}
|
||
|
||
# Тест 8: Безопасность и анонимность
|
||
test_security_anonymity() {
|
||
print_header "Тест 8: Безопасность и анонимность"
|
||
|
||
print_info "Проверка шифрования соединений..."
|
||
|
||
# Проверка использования TLS/SSL
|
||
local ssl_check
|
||
ssl_check=$(docker exec phantom-node-1 netstat -tlnp | grep ":8050" | wc -l)
|
||
|
||
if [ "$ssl_check" -gt 0 ]; then
|
||
print_success "Узлы прослушивают зашифрованные соединения"
|
||
else
|
||
print_warning "Не удалось проверить шифрование соединений"
|
||
fi
|
||
|
||
# Проверка ротации ключей
|
||
print_info "Проверка ротации криптографических ключей..."
|
||
|
||
local key_rotation_log
|
||
key_rotation_log=$(docker logs phantom-node-1 2>&1 | grep -i "key rotation" | wc -l)
|
||
|
||
if [ "$key_rotation_log" -gt 0 ]; then
|
||
print_success "Ротация ключей активна"
|
||
else
|
||
print_info "Ротация ключей не обнаружена в логах (возможно, еще не произошла)"
|
||
fi
|
||
|
||
# Тест анонимности через множественные запросы
|
||
print_info "Тестирование анонимности через множественные запросы..."
|
||
|
||
local unique_ips=()
|
||
for i in {1..5}; do
|
||
local ip
|
||
ip=$(curl -s --max-time 10 --socks5 localhost:8080 http://httpbin.org/ip | grep -o '"origin":"[^"]*' | cut -d'"' -f4)
|
||
|
||
if [ -n "$ip" ]; then
|
||
unique_ips+=("$ip")
|
||
print_info "Запрос $i: IP = $ip"
|
||
fi
|
||
|
||
sleep 2
|
||
done
|
||
|
||
# Подсчет уникальных IP
|
||
local unique_count
|
||
unique_count=$(printf '%s\n' "${unique_ips[@]}" | sort -u | wc -l)
|
||
|
||
print_info "Обнаружено $unique_count уникальных IP из ${#unique_ips[@]} запросов"
|
||
|
||
if [ "$unique_count" -gt 1 ]; then
|
||
print_success "Анонимность работает - используются разные exit точки"
|
||
else
|
||
print_warning "Все запросы используют один IP (возможно, один exit node)"
|
||
fi
|
||
}
|
||
|
||
# Генерация отчета
|
||
generate_report() {
|
||
print_header "Генерация отчета тестирования"
|
||
|
||
local report_file="phantom_test_report_$(date +%Y%m%d_%H%M%S).txt"
|
||
|
||
{
|
||
echo "Phantom Protocol - Отчет тестирования"
|
||
echo "======================================"
|
||
echo "Дата: $(date)"
|
||
echo "Система: $(uname -a)"
|
||
echo ""
|
||
|
||
echo "Статус Docker контейнеров:"
|
||
docker-compose ps
|
||
echo ""
|
||
|
||
echo "Использование ресурсов:"
|
||
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
|
||
echo ""
|
||
|
||
echo "Логи узлов (последние 50 строк):"
|
||
for i in {1..5}; do
|
||
echo "--- Узел phantom-node-$i ---"
|
||
docker logs --tail 50 phantom-node-$i 2>&1 | tail -20
|
||
echo ""
|
||
done
|
||
|
||
} > "$report_file"
|
||
|
||
print_success "Отчет сохранен в файл: $report_file"
|
||
}
|
||
|
||
# Очистка ресурсов
|
||
cleanup() {
|
||
print_header "Очистка ресурсов"
|
||
|
||
print_info "Остановка всех контейнеров..."
|
||
docker-compose down
|
||
|
||
print_info "Удаление временных файлов..."
|
||
rm -f /tmp/phantom_test_file.txt /tmp/phantom_downloaded_file.txt
|
||
|
||
print_success "Очистка завершена"
|
||
}
|
||
|
||
# Главная функция
|
||
main() {
|
||
echo -e "${PURPLE}"
|
||
echo "╔══════════════════════════════════════════════════════════════╗"
|
||
echo "║ ║"
|
||
echo "║ Phantom Protocol - Тестирование сценариев ║"
|
||
echo "║ ║"
|
||
echo "║ Этот скрипт демонстрирует реальные сценарии использования ║"
|
||
echo "║ Phantom Protocol и проверяет работоспособность системы ║"
|
||
echo "║ ║"
|
||
echo "╚══════════════════════════════════════════════════════════════╝"
|
||
echo -e "${NC}\n"
|
||
|
||
# Проверка аргументов командной строки
|
||
local run_all=true
|
||
local tests_to_run=()
|
||
|
||
if [ $# -gt 0 ]; then
|
||
run_all=false
|
||
tests_to_run=("$@")
|
||
fi
|
||
|
||
# Проверка зависимостей
|
||
check_dependencies
|
||
|
||
# Запуск базовой сети
|
||
start_phantom_network
|
||
|
||
# Выполнение тестов
|
||
local test_results=()
|
||
|
||
if $run_all || [[ " ${tests_to_run[*]} " =~ " socks5 " ]]; then
|
||
if test_socks5_proxy; then
|
||
test_results+=("SOCKS5 Proxy: ✅")
|
||
else
|
||
test_results+=("SOCKS5 Proxy: ❌")
|
||
fi
|
||
fi
|
||
|
||
if $run_all || [[ " ${tests_to_run[*]} " =~ " dns " ]]; then
|
||
if test_phantom_dns; then
|
||
test_results+=("Phantom DNS: ✅")
|
||
else
|
||
test_results+=("Phantom DNS: ❌")
|
||
fi
|
||
fi
|
||
|
||
if $run_all || [[ " ${tests_to_run[*]} " =~ " hidden " ]]; then
|
||
if test_hidden_service; then
|
||
test_results+=("Hidden Service: ✅")
|
||
else
|
||
test_results+=("Hidden Service: ❌")
|
||
fi
|
||
fi
|
||
|
||
if $run_all || [[ " ${tests_to_run[*]} " =~ " tunnel " ]]; then
|
||
if test_tcp_tunnel; then
|
||
test_results+=("TCP Tunnel: ✅")
|
||
else
|
||
test_results+=("TCP Tunnel: ❌")
|
||
fi
|
||
fi
|
||
|
||
if $run_all || [[ " ${tests_to_run[*]} " =~ " storage " ]]; then
|
||
if test_file_storage; then
|
||
test_results+=("File Storage: ✅")
|
||
else
|
||
test_results+=("File Storage: ❌")
|
||
fi
|
||
fi
|
||
|
||
if $run_all || [[ " ${tests_to_run[*]} " =~ " messenger " ]]; then
|
||
if test_messenger; then
|
||
test_results+=("Messenger: ✅")
|
||
else
|
||
test_results+=("Messenger: ❌")
|
||
fi
|
||
fi
|
||
|
||
if $run_all || [[ " ${tests_to_run[*]} " =~ " performance " ]]; then
|
||
if test_network_performance; then
|
||
test_results+=("Performance: ✅")
|
||
else
|
||
test_results+=("Performance: ❌")
|
||
fi
|
||
fi
|
||
|
||
if $run_all || [[ " ${tests_to_run[*]} " =~ " security " ]]; then
|
||
if test_security_anonymity; then
|
||
test_results+=("Security: ✅")
|
||
else
|
||
test_results+=("Security: ❌")
|
||
fi
|
||
fi
|
||
|
||
# Генерация отчета
|
||
generate_report
|
||
|
||
# Итоговый отчет
|
||
print_header "Итоговый отчет тестирования"
|
||
|
||
local passed=0
|
||
local total=${#test_results[@]}
|
||
|
||
for result in "${test_results[@]}"; do
|
||
echo -e " $result"
|
||
if [[ "$result" =~ ✅ ]]; then
|
||
passed=$((passed + 1))
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
if [ $passed -eq $total ]; then
|
||
print_success "Все тесты пройдены успешно! ($passed/$total)"
|
||
echo -e "\n${GREEN}🎉 Phantom Protocol готов к использованию!${NC}"
|
||
elif [ $passed -gt $((total / 2)) ]; then
|
||
print_warning "Большинство тестов пройдено ($passed/$total)"
|
||
echo -e "\n${YELLOW}⚠️ Phantom Protocol частично функционален${NC}"
|
||
else
|
||
print_error "Многие тесты не пройдены ($passed/$total)"
|
||
echo -e "\n${RED}❌ Требуется дополнительная настройка${NC}"
|
||
fi
|
||
|
||
echo -e "\n${CYAN}Для получения помощи обратитесь к документации или сообществу Phantom Protocol${NC}"
|
||
|
||
# Опция очистки
|
||
echo ""
|
||
read -p "Очистить ресурсы после тестирования? (y/N): " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
cleanup
|
||
else
|
||
print_info "Ресурсы оставлены для дальнейшего использования"
|
||
print_info "Для очистки выполните: docker-compose down"
|
||
fi
|
||
}
|
||
|
||
# Обработка сигналов
|
||
trap cleanup EXIT
|
||
|
||
# Запуск основной функции
|
||
main "$@"
|
||
|