archy/scripts/test-performance.sh
Dorian e3aa95a103 fix: prevent tokio runtime deadlock in credential issue/verify
The credential issuance and verification handlers used
Handle::block_on() directly inside the tokio runtime, causing a
deadlock. Wrapped with block_in_place() to properly yield the
runtime thread.

Also completed full feature verification across all 25 test groups
(~175 checks) on live server.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:43:12 +00:00

168 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
# TEST-208/209: Performance and load tests.
# Checks system responsiveness, resource usage, and mobile performance metrics.
SSH_KEY="${ARCHIPELAGO_SSH_KEY:-$HOME/.ssh/archipelago-deploy}"
TARGET="archipelago@192.168.1.228"
SSH_CMD="ssh -i $SSH_KEY -o StrictHostKeyChecking=no $TARGET"
PASSWORD="password123"
PASS=0
FAIL=0
WARN=0
RESULTS=()
log() { echo -e "\033[1;34m[TEST]\033[0m $*"; }
pass() { echo -e "\033[1;32m[PASS]\033[0m $*"; PASS=$((PASS + 1)); RESULTS+=("PASS: $*"); }
fail() { echo -e "\033[1;31m[FAIL]\033[0m $*"; FAIL=$((FAIL + 1)); RESULTS+=("FAIL: $*"); }
warn() { echo -e "\033[1;33m[WARN]\033[0m $*"; WARN=$((WARN + 1)); RESULTS+=("WARN: $*"); }
main() {
log "=== Performance Test Suite ==="
echo ""
# --- TEST-208: System Load ---
log "=== TEST-208: System Load ==="
# 1. Check UI load time
log "1. Measuring UI load time..."
local ui_time
ui_time=$($SSH_CMD "curl -s -o /dev/null -w '%{time_total}' http://localhost/ 2>/dev/null" || echo "999")
ui_time_ms=$(echo "$ui_time * 1000" | bc 2>/dev/null || echo "999")
log " UI load time: ${ui_time}s"
if (( $(echo "$ui_time < 3" | bc -l 2>/dev/null || echo 0) )); then
pass "UI loads in ${ui_time}s (< 3s threshold)"
else
fail "UI load time ${ui_time}s exceeds 3s threshold"
fi
# 2. Check RPC response time
log "2. Measuring RPC response time..."
local rpc_time
rpc_time=$($SSH_CMD "curl -s -o /dev/null -w '%{time_total}' http://localhost:5678/rpc/v1 \
-X POST -H 'Content-Type: application/json' \
-d '{\"method\":\"health\"}' 2>/dev/null" || echo "999")
log " RPC response time: ${rpc_time}s"
if (( $(echo "$rpc_time < 1" | bc -l 2>/dev/null || echo 0) )); then
pass "RPC responds in ${rpc_time}s (< 1s)"
else
fail "RPC response time ${rpc_time}s exceeds 1s"
fi
# 3. Check memory usage
log "3. Checking system memory..."
local mem_info
mem_info=$($SSH_CMD "free -m | awk '/Mem:/{print \$2,\$3,\$4}'")
local total_mb used_mb avail_mb
total_mb=$(echo "$mem_info" | awk '{print $1}')
used_mb=$(echo "$mem_info" | awk '{print $2}')
avail_mb=$(echo "$mem_info" | awk '{print $3}')
local pct_used=$((used_mb * 100 / total_mb))
log " Memory: ${used_mb}MB / ${total_mb}MB (${pct_used}% used, ${avail_mb}MB free)"
if [ "$pct_used" -lt 90 ]; then
pass "Memory usage ${pct_used}% (< 90%)"
else
warn "Memory usage ${pct_used}% — high (>= 90%)"
fi
# 4. Check disk usage
log "4. Checking disk usage..."
local disk_pct
disk_pct=$($SSH_CMD "df / | awk 'NR==2{print \$5}' | tr -d '%'")
log " Disk: ${disk_pct}% used"
if [ "$disk_pct" -lt 95 ]; then
pass "Disk usage ${disk_pct}% (< 95%)"
else
warn "Disk usage ${disk_pct}% — critical (>= 95%)"
fi
# 5. Check running containers
log "5. Counting running containers..."
local container_count
container_count=$($SSH_CMD "podman ps -q 2>/dev/null | wc -l")
log " Running containers: $container_count"
pass "$container_count containers running"
# 6. Check for OOM kills
log "6. Checking for OOM kills..."
local oom_count
oom_count=$($SSH_CMD "dmesg 2>/dev/null | grep -c 'Out of memory' || echo 0")
if [ "$oom_count" -eq 0 ]; then
pass "No OOM kills detected"
else
fail "$oom_count OOM kills detected"
fi
# 7. Check WebSocket connectivity
log "7. Testing WebSocket endpoint..."
local ws_status
ws_status=$($SSH_CMD "curl -s -o /dev/null -w '%{http_code}' -H 'Upgrade: websocket' -H 'Connection: Upgrade' http://localhost:5678/ws 2>/dev/null" || echo "000")
if [ "$ws_status" = "101" ] || [ "$ws_status" = "200" ] || [ "$ws_status" = "426" ]; then
pass "WebSocket endpoint responds (HTTP $ws_status)"
else
warn "WebSocket endpoint returned HTTP $ws_status"
fi
# 8. Check backend service health
log "8. Checking archipelago service..."
local svc_status
svc_status=$($SSH_CMD "systemctl is-active archipelago 2>/dev/null" || echo "inactive")
if [ "$svc_status" = "active" ]; then
pass "archipelago service is active"
else
fail "archipelago service is $svc_status"
fi
echo ""
# --- TEST-209: Asset Size Check (proxy for mobile perf) ---
log "=== TEST-209: Frontend Asset Sizes ==="
# Check total JS bundle size
log "9. Checking JS bundle sizes..."
local js_size
js_size=$($SSH_CMD "du -sb /opt/archipelago/web-ui/assets/*.js 2>/dev/null | awk '{sum+=\$1}END{print sum}'" || echo "0")
local js_size_kb=$((js_size / 1024))
log " Total JS: ${js_size_kb}KB"
if [ "$js_size_kb" -lt 2048 ]; then
pass "JS bundle ${js_size_kb}KB (< 2MB)"
else
warn "JS bundle ${js_size_kb}KB — consider code splitting"
fi
# Check total CSS size
local css_size
css_size=$($SSH_CMD "du -sb /opt/archipelago/web-ui/assets/*.css 2>/dev/null | awk '{sum+=\$1}END{print sum}'" || echo "0")
local css_size_kb=$((css_size / 1024))
log " Total CSS: ${css_size_kb}KB"
if [ "$css_size_kb" -lt 512 ]; then
pass "CSS bundle ${css_size_kb}KB (< 512KB)"
else
warn "CSS bundle ${css_size_kb}KB — consider purging"
fi
# Check gzip is enabled
log "10. Checking gzip compression..."
local gzip_check
gzip_check=$($SSH_CMD "curl -sI -H 'Accept-Encoding: gzip' http://localhost/ 2>/dev/null | grep -i content-encoding || echo ''")
if echo "$gzip_check" | grep -qi "gzip"; then
pass "gzip compression enabled"
else
warn "gzip compression not detected in response headers"
fi
echo ""
log "=== RESULTS ==="
for r in "${RESULTS[@]}"; do
echo " $r"
done
echo ""
log "Pass: $PASS | Fail: $FAIL | Warn: $WARN"
[ $FAIL -gt 0 ] && exit 1
exit 0
}
main "$@"