XuqmGroup-AndroidSDK/scripts/tc10_network_resilience.sh

117 行
5.9 KiB
Bash

#!/usr/bin/env bash
# =============================================================================
# TC-10: Android SDK 网络断开 / 重连压测脚本
# =============================================================================
# 测试目的: 验证 SDK 在网络中断后能自动重连,WebSocket 恢复 STOMP CONNECTED
# 运行方式: bash scripts/tc10_network_resilience.sh [emulator-5554]
#
# 依赖:
# - adb 已在 PATH 或 ANDROID_HOME 已设置
# - 目标模拟器已安装 sample-app-debug.apk + sample-app-debug-androidTest.apk
# - 目标模拟器已开机且 shell 可用
# =============================================================================
set -euo pipefail
ANDROID_HOME="${ANDROID_HOME:-$HOME/Library/Android/sdk}"
ADB="${ANDROID_HOME}/platform-tools/adb"
DEVICE="${1:-emulator-5554}"
PKG="com.xuqm.demo"
RUNNER="androidx.test.runner.AndroidJUnitRunner"
echo_step() { echo -e "\n\033[1;34m[TC-10] $*\033[0m"; }
echo_ok() { echo -e "\033[0;32m ✓ $*\033[0m"; }
echo_fail() { echo -e "\033[0;31m ✗ $*\033[0m"; exit 1; }
# ─────────────────────────────────────────
# 前置检查
# ─────────────────────────────────────────
echo_step "前置检查"
if ! "$ADB" -s "$DEVICE" get-state &>/dev/null; then
echo_fail "设备 $DEVICE 不可用,请先启动模拟器"
fi
echo_ok "设备 $DEVICE 已连接"
# ─────────────────────────────────────────
# 步骤 1: 启动 Sample App 并等待 3s 稳定
# ─────────────────────────────────────────
echo_step "步骤 1: 启动 Sample App"
"$ADB" -s "$DEVICE" shell am start -n "${PKG}/com.xuqm.sdk.sample.MainActivity" > /dev/null
sleep 3
echo_ok "App 已启动"
# ─────────────────────────────────────────
# 步骤 2: 采集 WebSocket 连接日志基线
# ─────────────────────────────────────────
echo_step "步骤 2: 清除旧日志,等待 WebSocket 连接基线"
"$ADB" -s "$DEVICE" logcat -c
sleep 5
CONNECTED_BEFORE=$("$ADB" -s "$DEVICE" logcat -d -s "XuqmImSDK:D" 2>/dev/null | grep -c "onConnected" || true)
echo_ok "连接前 onConnected 事件数: $CONNECTED_BEFORE"
# ─────────────────────────────────────────
# 步骤 3: 关闭 WiFi模拟网络断开
# ─────────────────────────────────────────
echo_step "步骤 3: 关闭 WiFi模拟网络断开"
"$ADB" -s "$DEVICE" shell svc wifi disable
echo_ok "WiFi 已关闭"
echo " 等待 5s,观察 SDK 检测到断开..."
sleep 5
# 验证 Disconnected 事件
DISCONNECTED=$("$ADB" -s "$DEVICE" logcat -d -s "XuqmImSDK:D" 2>/dev/null | grep -c "onDisconnected" || true)
echo " onDisconnected 事件数: $DISCONNECTED"
# ─────────────────────────────────────────
# 步骤 4: 恢复 WiFi模拟网络恢复
# ─────────────────────────────────────────
echo_step "步骤 4: 恢复 WiFi模拟网络恢复"
"$ADB" -s "$DEVICE" shell svc wifi enable
echo_ok "WiFi 已恢复"
echo " 等待 35s,SDK 应自动重连(最大退避 30s..."
sleep 35
# ─────────────────────────────────────────
# 步骤 5: 验证重连
# ─────────────────────────────────────────
echo_step "步骤 5: 验证自动重连"
CONNECTED_AFTER=$("$ADB" -s "$DEVICE" logcat -d -s "XuqmImSDK:D" 2>/dev/null | grep -c "onConnected" || true)
echo " 重连后 onConnected 事件总数: $CONNECTED_AFTER"
if [ "$CONNECTED_AFTER" -gt "$CONNECTED_BEFORE" ]; then
echo_ok "SDK 成功自动重连 (onConnected 事件 +$((CONNECTED_AFTER - CONNECTED_BEFORE)))"
TC10_STATUS="通过"
else
echo -e "\033[0;33m ⚠ 未检测到新的 onConnected 事件(可能需要更长等待时间或 App 尚未登录)\033[0m"
TC10_STATUS="待确认"
fi
# ─────────────────────────────────────────
# 步骤 6: 采集关键日志片段
# ─────────────────────────────────────────
echo_step "步骤 6: 关键日志片段"
"$ADB" -s "$DEVICE" logcat -d -s "XuqmImSDK:D" 2>/dev/null \
| grep -E "onConnected|onDisconnected|scheduleReconnect|connectWithToken" \
| tail -20 \
| sed 's/^/ /'
# ─────────────────────────────────────────
# 步骤 7: 输出结论
# ─────────────────────────────────────────
echo ""
echo "═══════════════════════════════════════"
echo " TC-10 网络断开/重连压测结果"
echo "═══════════════════════════════════════"
echo " 设备 : $DEVICE"
echo " 断开时长 : 5s"
echo " 等待重连 : 35s"
echo " 测试结论 : $TC10_STATUS"
echo "═══════════════════════════════════════"
if [ "$TC10_STATUS" = "通过" ]; then
exit 0
else
exit 1
fi