13d7054aa1
- Fix line 63 in php-analyzer.sh: Add default value for count variable (integer comparison error) - Fix line 655 in php-analyzer.sh: Add default value for memory_error_count (integer comparison error) - Fix line 396 in php-scanner.sh: Replace unsafe eval with safe getent passwd lookup - Add php-ui.sh: User interface and menu system (18KB, 25+ functions) - Add php-scanner.sh: Server enumeration system (17KB, 18 functions) - Add php-action-executor.sh: Optimization execution system (17KB, 20 functions) - Add php-server-manager.sh: Orchestration framework (21KB, 7 functions) - Add php-fpm-batch-analyzer.sh: One-shot diagnostic script showing current vs recommended max_children, memory impact, and optimization potential - Add comprehensive test suite (24 tests) These fixes resolve "integer expression expected" errors during domain analysis. Batch analyzer enables users to see domain-by-domain optimization opportunities before applying changes. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
476 lines
18 KiB
Bash
Executable File
476 lines
18 KiB
Bash
Executable File
#!/bin/bash
|
|
# PHP Optimizer Phase 3 - Comprehensive Test Suite
|
|
# Tests all refactored modules for functionality and compatibility
|
|
|
|
set -e
|
|
|
|
PHP_TOOLKIT_DIR="/root/server-toolkit"
|
|
TEST_RESULTS_FILE="/tmp/php-optimizer-phase3-test-results.txt"
|
|
TEST_PASSED=0
|
|
TEST_FAILED=0
|
|
|
|
# Color codes
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
|
|
# Test result functions
|
|
test_pass() {
|
|
local test_name="$1"
|
|
echo -e "${GREEN}✓ PASS${NC}: $test_name" | tee -a "$TEST_RESULTS_FILE"
|
|
TEST_PASSED=$((TEST_PASSED + 1))
|
|
}
|
|
|
|
test_fail() {
|
|
local test_name="$1"
|
|
local reason="$2"
|
|
echo -e "${RED}✗ FAIL${NC}: $test_name" | tee -a "$TEST_RESULTS_FILE"
|
|
[ -n "$reason" ] && echo " Reason: $reason" | tee -a "$TEST_RESULTS_FILE"
|
|
TEST_FAILED=$((TEST_FAILED + 1))
|
|
}
|
|
|
|
test_skip() {
|
|
local test_name="$1"
|
|
echo -e "${YELLOW}⊘ SKIP${NC}: $test_name" | tee -a "$TEST_RESULTS_FILE"
|
|
}
|
|
|
|
# ============================================================================
|
|
# PHASE 3c STEP 1: MODULE LOADING TEST
|
|
# ============================================================================
|
|
|
|
echo ""
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
|
echo "║ PHASE 3c STEP 1: MODULE LOADING TEST ║"
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
> "$TEST_RESULTS_FILE"
|
|
|
|
# Test 1.1: Source php-ui.sh
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-ui.sh 2>/dev/null
|
|
[ $(type -t show_banner | wc -l) -gt 0 ] && exit 0 || exit 1
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "php-ui.sh loads without errors"
|
|
else
|
|
test_fail "php-ui.sh loads without errors" "Module failed to load"
|
|
fi
|
|
|
|
# Test 1.2: Source php-scanner.sh
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
[ $(type -t enumerate_all_accounts | wc -l) -gt 0 ] && exit 0 || exit 1
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "php-scanner.sh loads without errors"
|
|
else
|
|
test_fail "php-scanner.sh loads without errors" "Module failed to load"
|
|
fi
|
|
|
|
# Test 1.3: Source php-action-executor.sh
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-action-executor.sh 2>/dev/null
|
|
[ $(type -t init_change_tracking | wc -l) -gt 0 ] && exit 0 || exit 1
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "php-action-executor.sh loads without errors"
|
|
else
|
|
test_fail "php-action-executor.sh loads without errors" "Module failed to load"
|
|
fi
|
|
|
|
# Test 1.4: Source php-server-manager.sh
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-analyzer.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-action-executor.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-server-manager.sh 2>/dev/null
|
|
[ $(type -t scan_entire_server | wc -l) -gt 0 ] && exit 0 || exit 1
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "php-server-manager.sh loads without errors"
|
|
else
|
|
test_fail "php-server-manager.sh loads without errors" "Module failed to load"
|
|
fi
|
|
|
|
# Test 1.5: All modules together
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/system-detect.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-detector.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-analyzer.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-config-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-calculator-improved.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-ui.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-action-executor.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-server-manager.sh 2>/dev/null
|
|
|
|
# Verify key functions from each module
|
|
type show_banner >/dev/null 2>&1 || exit 1
|
|
type enumerate_all_domains >/dev/null 2>&1 || exit 1
|
|
type apply_optimization >/dev/null 2>&1 || exit 1
|
|
type execute_server_optimization_plan >/dev/null 2>&1 || exit 1
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "All modules load together without conflicts"
|
|
else
|
|
test_fail "All modules load together without conflicts" "Conflicts or missing functions"
|
|
fi
|
|
|
|
# ============================================================================
|
|
# PHASE 3c STEP 2: CONTROL PANEL ENUMERATION TEST
|
|
# ============================================================================
|
|
|
|
echo ""
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
|
echo "║ PHASE 3c STEP 2: CONTROL PANEL ENUMERATION TEST ║"
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# Test 2.1: List all accounts
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/system-detect.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
|
|
initialize_system_detection
|
|
accounts=$(enumerate_all_accounts)
|
|
[ -n "$accounts" ] && [ $(echo "$accounts" | wc -l) -gt 0 ] && exit 0 || exit 1
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
account_count=$(bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/system-detect.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
initialize_system_detection
|
|
enumerate_all_accounts | wc -l
|
|
EOF
|
|
)
|
|
test_pass "enumerate_all_accounts() returns accounts ($account_count found)"
|
|
else
|
|
test_fail "enumerate_all_accounts() returns accounts" "No accounts enumerated"
|
|
fi
|
|
|
|
# Test 2.2: List domains for first account
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/system-detect.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
|
|
initialize_system_detection
|
|
first_account=$(enumerate_all_accounts | head -1)
|
|
[ -z "$first_account" ] && exit 1
|
|
|
|
domains=$(enumerate_user_domains "$first_account" 2>/dev/null)
|
|
# Domains may or may not exist, but function should work
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "enumerate_user_domains() works for first account"
|
|
else
|
|
test_fail "enumerate_user_domains() works for first account" "Function failed"
|
|
fi
|
|
|
|
# Test 2.3: enumerate_all_domains (server-wide)
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/system-detect.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
|
|
initialize_system_detection
|
|
all_domains=$(enumerate_all_domains)
|
|
# Function should return something (or empty if no domains)
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "enumerate_all_domains() completes without error"
|
|
else
|
|
test_fail "enumerate_all_domains() completes without error" "Function failed"
|
|
fi
|
|
|
|
# ============================================================================
|
|
# PHASE 3c STEP 3: FILTERING AND SELECTION TEST
|
|
# ============================================================================
|
|
|
|
echo ""
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
|
echo "║ PHASE 3c STEP 3: FILTERING AND SELECTION TEST ║"
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# Test 3.1: Account name filtering
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/system-detect.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
|
|
initialize_system_detection
|
|
# Try filtering with a pattern (may return nothing, but function should work)
|
|
filtered=$(filter_accounts_by_name "a" 2>/dev/null)
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "filter_accounts_by_name() executes without error"
|
|
else
|
|
test_fail "filter_accounts_by_name() executes without error" "Function failed"
|
|
fi
|
|
|
|
# Test 3.2: Domain name filtering
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/system-detect.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/user-manager.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-scanner.sh 2>/dev/null
|
|
|
|
initialize_system_detection
|
|
filtered=$(filter_domains_by_name "." 2>/dev/null)
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "filter_domains_by_name() executes without error"
|
|
else
|
|
test_fail "filter_domains_by_name() executes without error" "Function failed"
|
|
fi
|
|
|
|
# Test 3.3: Menu functions
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-ui.sh 2>/dev/null
|
|
|
|
# Test that menu functions exist
|
|
type show_main_menu >/dev/null 2>&1 || exit 1
|
|
type show_optimization_menu >/dev/null 2>&1 || exit 1
|
|
type show_apply_menu >/dev/null 2>&1 || exit 1
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "Menu functions available and callable"
|
|
else
|
|
test_fail "Menu functions available and callable" "Functions missing"
|
|
fi
|
|
|
|
# ============================================================================
|
|
# PHASE 3c STEP 4: BATCH OPERATIONS AND ROLLBACK TEST
|
|
# ============================================================================
|
|
|
|
echo ""
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
|
echo "║ PHASE 3c STEP 4: BATCH OPERATIONS AND ROLLBACK TEST ║"
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# Test 4.1: Change tracking
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-action-executor.sh 2>/dev/null
|
|
|
|
init_change_tracking "test-session-$$"
|
|
[ -n "$EXECUTOR_SESSION_ID" ] && [ -n "$EXECUTOR_CHANGE_LOG" ] && exit 0 || exit 1
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "init_change_tracking() initializes session"
|
|
else
|
|
test_fail "init_change_tracking() initializes session" "Initialization failed"
|
|
fi
|
|
|
|
# Test 4.2: Backup functionality
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-action-executor.sh 2>/dev/null
|
|
|
|
# This should fail gracefully if config not found (expected)
|
|
backup_domain_config "test.example.com" "testuser" 2>/dev/null
|
|
# Function should exist and be callable
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "backup_domain_config() is callable"
|
|
else
|
|
test_fail "backup_domain_config() is callable" "Function error"
|
|
fi
|
|
|
|
# Test 4.3: Verification functions
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/common-functions.sh 2>/dev/null
|
|
source /root/server-toolkit/lib/php-action-executor.sh 2>/dev/null
|
|
|
|
type verify_applied_changes >/dev/null 2>&1 || exit 1
|
|
type validate_pool_config >/dev/null 2>&1 || exit 1
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "Verification functions available"
|
|
else
|
|
test_fail "Verification functions available" "Functions missing"
|
|
fi
|
|
|
|
# Test 4.4: PHP-FPM service functions
|
|
bash << 'EOF'
|
|
source /root/server-toolkit/lib/php-action-executor.sh 2>/dev/null
|
|
|
|
type reload_php_fpm >/dev/null 2>&1 || exit 1
|
|
type restart_php_fpm >/dev/null 2>&1 || exit 1
|
|
type get_php_fpm_status >/dev/null 2>&1 || exit 1
|
|
exit 0
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "PHP-FPM service functions available"
|
|
else
|
|
test_fail "PHP-FPM service functions available" "Functions missing"
|
|
fi
|
|
|
|
# ============================================================================
|
|
# PHASE 3c STEP 5: BACKWARD COMPATIBILITY TEST
|
|
# ============================================================================
|
|
|
|
echo ""
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
|
echo "║ PHASE 3c STEP 5: BACKWARD COMPATIBILITY TEST ║"
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# Test 5.1: Original php-optimizer.sh still works
|
|
bash -n /root/server-toolkit/modules/performance/php-optimizer.sh
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "php-optimizer.sh passes syntax check"
|
|
else
|
|
test_fail "php-optimizer.sh passes syntax check" "Syntax error"
|
|
fi
|
|
|
|
# Test 5.2: Original functions still referenced
|
|
grep -q "analyze_single_domain" /root/server-toolkit/modules/performance/php-optimizer.sh
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "Original function names still in php-optimizer.sh"
|
|
else
|
|
test_fail "Original function names still in php-optimizer.sh" "Functions removed"
|
|
fi
|
|
|
|
# Test 5.3: Color codes preserved
|
|
grep -q "RED=" /root/server-toolkit/modules/performance/php-optimizer.sh
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "Color code definitions preserved"
|
|
else
|
|
test_fail "Color code definitions preserved" "Color codes missing"
|
|
fi
|
|
|
|
# Test 5.4: Menu structure intact
|
|
grep -q "show_main_menu" /root/server-toolkit/modules/performance/php-optimizer.sh
|
|
|
|
if [ $? -eq 0 ]; then
|
|
test_pass "Menu display functions referenced"
|
|
else
|
|
test_fail "Menu display functions referenced" "Menu functions missing"
|
|
fi
|
|
|
|
# ============================================================================
|
|
# PHASE 3c STEP 6: PERFORMANCE AND STRESS TEST
|
|
# ============================================================================
|
|
|
|
echo ""
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
|
echo "║ PHASE 3c STEP 6: PERFORMANCE AND STRESS TEST ║"
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# Test 6.1: Module size reasonable
|
|
UI_SIZE=$(wc -l < /root/server-toolkit/lib/php-ui.sh)
|
|
if [ "$UI_SIZE" -gt 500 ] && [ "$UI_SIZE" -lt 800 ]; then
|
|
test_pass "php-ui.sh size is reasonable ($UI_SIZE lines)"
|
|
else
|
|
test_fail "php-ui.sh size is reasonable" "Size: $UI_SIZE (expected 500-800)"
|
|
fi
|
|
|
|
# Test 6.2: php-scanner.sh size reasonable
|
|
SCANNER_SIZE=$(wc -l < /root/server-toolkit/lib/php-scanner.sh)
|
|
if [ "$SCANNER_SIZE" -gt 500 ] && [ "$SCANNER_SIZE" -lt 600 ]; then
|
|
test_pass "php-scanner.sh size is reasonable ($SCANNER_SIZE lines)"
|
|
else
|
|
test_fail "php-scanner.sh size is reasonable" "Size: $SCANNER_SIZE (expected 500-600)"
|
|
fi
|
|
|
|
# Test 6.3: php-action-executor.sh size reasonable
|
|
EXECUTOR_SIZE=$(wc -l < /root/server-toolkit/lib/php-action-executor.sh)
|
|
if [ "$EXECUTOR_SIZE" -gt 550 ] && [ "$EXECUTOR_SIZE" -lt 650 ]; then
|
|
test_pass "php-action-executor.sh size is reasonable ($EXECUTOR_SIZE lines)"
|
|
else
|
|
test_fail "php-action-executor.sh size is reasonable" "Size: $EXECUTOR_SIZE (expected 550-650)"
|
|
fi
|
|
|
|
# Test 6.4: php-server-manager.sh size reasonable
|
|
MANAGER_SIZE=$(wc -l < /root/server-toolkit/lib/php-server-manager.sh)
|
|
if [ "$MANAGER_SIZE" -gt 500 ] && [ "$MANAGER_SIZE" -lt 600 ]; then
|
|
test_pass "php-server-manager.sh size is reasonable ($MANAGER_SIZE lines)"
|
|
else
|
|
test_fail "php-server-manager.sh size is reasonable" "Size: $MANAGER_SIZE (expected 500-600)"
|
|
fi
|
|
|
|
# Test 6.5: All modules available
|
|
if [ -f /root/server-toolkit/lib/php-ui.sh ] && \
|
|
[ -f /root/server-toolkit/lib/php-scanner.sh ] && \
|
|
[ -f /root/server-toolkit/lib/php-action-executor.sh ] && \
|
|
[ -f /root/server-toolkit/lib/php-server-manager.sh ]; then
|
|
test_pass "All module files exist and are readable"
|
|
else
|
|
test_fail "All module files exist and are readable" "One or more files missing"
|
|
fi
|
|
|
|
# ============================================================================
|
|
# TEST SUMMARY
|
|
# ============================================================================
|
|
|
|
echo ""
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
|
echo "║ PHASE 3c TEST SUMMARY ║"
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
TOTAL=$((TEST_PASSED + TEST_FAILED))
|
|
|
|
echo "Results: $TOTAL tests executed"
|
|
echo ""
|
|
echo -e "${GREEN}Passed: $TEST_PASSED${NC}"
|
|
echo -e "${RED}Failed: $TEST_FAILED${NC}"
|
|
echo ""
|
|
|
|
if [ $TEST_FAILED -eq 0 ]; then
|
|
echo -e "${GREEN}✓ ALL TESTS PASSED${NC}"
|
|
exit 0
|
|
else
|
|
echo -e "${RED}✗ SOME TESTS FAILED${NC}"
|
|
exit 1
|
|
fi
|