You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
6.3 KiB
175 lines
6.3 KiB
#!/usr/bin/env python3
|
|
"""
|
|
简单的心跳功能测试
|
|
验证心跳功能是否正确集成到SendController中
|
|
"""
|
|
import asyncio
|
|
import sys
|
|
import os
|
|
from datetime import datetime
|
|
|
|
# 添加项目路径
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
from app.core.websocket.manager import websocket_manager
|
|
from app.utils.structured_log import get_structured_logger, LogLevel
|
|
|
|
logger = get_structured_logger(__name__, LogLevel.DEBUG)
|
|
|
|
async def test_heartbeat_integration():
|
|
"""测试心跳功能集成到SendController"""
|
|
print("=== 心跳功能集成测试 ===")
|
|
|
|
try:
|
|
# 创建客户端
|
|
client_name = "test_heartbeat_integration"
|
|
client_url = "wss://localhost:8080"
|
|
heartbeat_interval = 5 # 5秒心跳间隔,便于测试
|
|
|
|
print(f"创建客户端: {client_name}")
|
|
print(f"心跳间隔: {heartbeat_interval}秒")
|
|
|
|
# 创建客户端
|
|
client = await websocket_manager.create_client(client_name, client_url, heartbeat_interval)
|
|
if not client:
|
|
print("❌ 客户端创建失败")
|
|
return False
|
|
|
|
print(f"✅ 客户端创建成功: {client.name}")
|
|
print(f" 心跳间隔配置: {client.heartbeat_interval}")
|
|
|
|
# 检查心跳Channel是否存在
|
|
heartbeat_channel_name = f"{client_name}_heartbeat"
|
|
heartbeat_channel = websocket_manager.get_channel(heartbeat_channel_name)
|
|
if heartbeat_channel:
|
|
print(f"✅ 心跳Channel存在: {heartbeat_channel.name}")
|
|
else:
|
|
print(f"❌ 心跳Channel不存在: {heartbeat_channel_name}")
|
|
return False
|
|
|
|
# 检查发送控制器是否存在
|
|
if client_name in websocket_manager._send_controllers:
|
|
send_controller = websocket_manager._send_controllers[client_name]
|
|
print(f"✅ 发送控制器存在: {send_controller}")
|
|
print(f" 运行状态: {send_controller.is_running()}")
|
|
stats = send_controller.get_stats()
|
|
print(f" 心跳间隔: {stats.get('heartbeat_interval', 'N/A')}")
|
|
print(f" 心跳任务运行: {stats.get('heartbeat_task_running', False)}")
|
|
else:
|
|
print("❌ 发送控制器不存在")
|
|
return False
|
|
|
|
# 等待心跳生成
|
|
print(f"等待 {heartbeat_interval + 2} 秒观察心跳消息...")
|
|
await asyncio.sleep(heartbeat_interval + 2)
|
|
|
|
# 检查心跳任务状态
|
|
if client_name in websocket_manager._send_controllers:
|
|
send_controller = websocket_manager._send_controllers[client_name]
|
|
stats = send_controller.get_stats()
|
|
if stats.get('heartbeat_task_running', False):
|
|
print("✅ 心跳任务仍在运行")
|
|
else:
|
|
print("❌ 心跳任务已结束")
|
|
else:
|
|
print("❌ 发送控制器不存在")
|
|
|
|
# 清理资源
|
|
print("清理资源...")
|
|
await websocket_manager.remove_client(client_name)
|
|
print("✅ 资源清理完成")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"❌ 测试失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
async def test_heartbeat_with_mock_connection():
|
|
"""测试带模拟连接的心跳功能"""
|
|
print("\n=== 模拟连接心跳测试 ===")
|
|
|
|
try:
|
|
# 创建客户端
|
|
client_name = "test_mock_connection"
|
|
client_url = "wss://localhost:8080"
|
|
heartbeat_interval = 3 # 3秒心跳间隔,便于测试
|
|
|
|
print(f"创建客户端: {client_name}")
|
|
print(f"心跳间隔: {heartbeat_interval}秒")
|
|
|
|
# 创建客户端
|
|
client = await websocket_manager.create_client(client_name, client_url, heartbeat_interval)
|
|
if not client:
|
|
print("❌ 客户端创建失败")
|
|
return False
|
|
|
|
print(f"✅ 客户端创建成功: {client.name}")
|
|
|
|
# 模拟连接成功(直接设置连接状态)
|
|
client._state = client._state.__class__.CONNECTED
|
|
print("✅ 模拟连接成功")
|
|
|
|
# 检查发送控制器(包含心跳功能)
|
|
if client_name in websocket_manager._send_controllers:
|
|
send_controller = websocket_manager._send_controllers[client_name]
|
|
print(f"✅ 发送控制器存在: {send_controller}")
|
|
stats = send_controller.get_stats()
|
|
print(f" 心跳任务运行: {stats.get('heartbeat_task_running', False)}")
|
|
else:
|
|
print("❌ 发送控制器不存在")
|
|
return False
|
|
|
|
# 等待心跳发送
|
|
print(f"等待 {heartbeat_interval + 2} 秒观察心跳消息...")
|
|
await asyncio.sleep(heartbeat_interval + 2)
|
|
|
|
# 检查发送控制器状态
|
|
if client_name in websocket_manager._send_controllers:
|
|
send_controller = websocket_manager._send_controllers[client_name]
|
|
stats = send_controller.get_stats()
|
|
if stats.get('heartbeat_task_running', False):
|
|
print("✅ 心跳任务仍在运行")
|
|
else:
|
|
print("❌ 心跳任务已结束")
|
|
else:
|
|
print("❌ 发送控制器不存在")
|
|
|
|
# 清理资源
|
|
print("清理资源...")
|
|
await websocket_manager.remove_client(client_name)
|
|
print("✅ 资源清理完成")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"❌ 测试失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
async def main():
|
|
"""主测试函数"""
|
|
print("开始心跳功能集成测试")
|
|
print("=" * 50)
|
|
|
|
# 测试1:心跳功能集成
|
|
success1 = await test_heartbeat_integration()
|
|
|
|
# 测试2:模拟连接心跳
|
|
success2 = await test_heartbeat_with_mock_connection()
|
|
|
|
print("\n" + "=" * 50)
|
|
print("测试结果汇总:")
|
|
print(f"心跳功能集成测试: {'✅ 通过' if success1 else '❌ 失败'}")
|
|
print(f"模拟连接心跳测试: {'✅ 通过' if success2 else '❌ 失败'}")
|
|
|
|
if success1 and success2:
|
|
print("🎉 所有测试通过!")
|
|
else:
|
|
print("⚠️ 部分测试失败,请检查日志")
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|