#!/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