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.
214 lines
7.8 KiB
214 lines
7.8 KiB
#!/usr/bin/env python3
|
|
"""
|
|
心跳消息队列大小检查修复验证测试
|
|
验证心跳消息生成后队列大小检查是否正确
|
|
"""
|
|
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.core.websocket.channel import WebSocketChannel, ChannelMessage
|
|
from app.core.websocket.send_controller import WebSocketSendController
|
|
from app.core.websocket.client import WebSocketClient
|
|
from app.utils.structured_log import get_structured_logger, LogLevel
|
|
|
|
logger = get_structured_logger(__name__, LogLevel.DEBUG)
|
|
|
|
class MockWebSocketClient(WebSocketClient):
|
|
"""模拟WebSocket客户端,用于测试"""
|
|
|
|
def __init__(self, name: str, url: str, heartbeat_interval: int = 120):
|
|
super().__init__(name, url)
|
|
self.heartbeat_interval = heartbeat_interval
|
|
self._state = self._state.__class__.CONNECTED # 模拟已连接状态
|
|
|
|
async def send_raw(self, data: str) -> bool:
|
|
"""模拟发送数据"""
|
|
logger.debug(f"模拟发送数据: {self.name} -> {data[:100]}...")
|
|
return True
|
|
|
|
async def test_heartbeat_queue_size_check():
|
|
"""测试心跳消息队列大小检查"""
|
|
print("=== 心跳消息队列大小检查测试 ===")
|
|
|
|
try:
|
|
# 创建模拟客户端
|
|
client_name = "test_heartbeat_queue"
|
|
client_url = "wss://localhost:8080"
|
|
heartbeat_interval = 3 # 3秒心跳间隔,便于测试
|
|
|
|
print(f"创建模拟客户端: {client_name}")
|
|
print(f"心跳间隔: {heartbeat_interval}秒")
|
|
|
|
# 创建模拟客户端
|
|
client = MockWebSocketClient(client_name, client_url, heartbeat_interval)
|
|
print(f"✅ 模拟客户端创建成功: {client.name}")
|
|
|
|
# 创建Channel
|
|
heartbeat_channel = WebSocketChannel(f"{client_name}_heartbeat")
|
|
send_channel = WebSocketChannel(f"{client_name}_send")
|
|
|
|
# 连接Channel
|
|
await heartbeat_channel.connect()
|
|
await send_channel.connect()
|
|
print(f"✅ Channel连接成功")
|
|
|
|
# 创建发送控制器
|
|
send_controller = WebSocketSendController(client, heartbeat_channel, send_channel)
|
|
print(f"✅ 发送控制器创建成功")
|
|
|
|
# 启动发送控制器
|
|
success = await send_controller.start()
|
|
if not success:
|
|
print("❌ 发送控制器启动失败")
|
|
return False
|
|
|
|
print(f"✅ 发送控制器启动成功")
|
|
|
|
# 等待心跳生成
|
|
print(f"等待 {heartbeat_interval + 1} 秒观察心跳消息生成...")
|
|
await asyncio.sleep(heartbeat_interval + 1)
|
|
|
|
# 检查心跳Channel的队列状态
|
|
heartbeat_stats = heartbeat_channel.get_stats()
|
|
print(f"心跳Channel统计信息:")
|
|
print(f" 队列大小: {heartbeat_stats['queue_size']}")
|
|
print(f" 优先级队列大小: {heartbeat_stats['priority_queue_size']}")
|
|
print(f" 总队列大小: {heartbeat_stats['total_queue_size']}")
|
|
print(f" 消息总数: {heartbeat_stats['message_count']}")
|
|
|
|
# 检查发送控制器状态
|
|
controller_stats = send_controller.get_stats()
|
|
print(f"发送控制器统计信息:")
|
|
print(f" 运行状态: {controller_stats['is_running']}")
|
|
print(f" 心跳任务运行: {controller_stats['heartbeat_task_running']}")
|
|
print(f" 发送任务运行: {controller_stats['send_task_running']}")
|
|
|
|
# 等待一段时间观察消息发送
|
|
print(f"等待 5 秒观察消息发送...")
|
|
await asyncio.sleep(5)
|
|
|
|
# 再次检查队列状态
|
|
heartbeat_stats_after = heartbeat_channel.get_stats()
|
|
print(f"发送后心跳Channel统计信息:")
|
|
print(f" 队列大小: {heartbeat_stats_after['queue_size']}")
|
|
print(f" 优先级队列大小: {heartbeat_stats_after['priority_queue_size']}")
|
|
print(f" 总队列大小: {heartbeat_stats_after['total_queue_size']}")
|
|
print(f" 消息总数: {heartbeat_stats_after['message_count']}")
|
|
|
|
# 停止发送控制器
|
|
await send_controller.stop()
|
|
print(f"✅ 发送控制器停止成功")
|
|
|
|
# 断开Channel
|
|
await heartbeat_channel.disconnect()
|
|
await send_channel.disconnect()
|
|
print(f"✅ Channel断开成功")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"❌ 测试失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
async def test_manual_heartbeat_message():
|
|
"""测试手动创建心跳消息"""
|
|
print("\n=== 手动心跳消息测试 ===")
|
|
|
|
try:
|
|
# 创建Channel
|
|
channel_name = "test_manual_heartbeat"
|
|
channel = WebSocketChannel(channel_name)
|
|
|
|
# 连接Channel
|
|
await channel.connect()
|
|
print(f"✅ Channel连接成功: {channel.name}")
|
|
|
|
# 创建心跳消息
|
|
heartbeat_message = ChannelMessage(
|
|
type="heartbeat",
|
|
data={
|
|
"Payload": {
|
|
"Message": "ping"
|
|
}
|
|
},
|
|
priority=1 # 高优先级
|
|
)
|
|
|
|
print(f"✅ 心跳消息创建成功: {heartbeat_message.type}")
|
|
|
|
# 发送消息到Channel
|
|
success = await channel.send_message(heartbeat_message)
|
|
if success:
|
|
print(f"✅ 心跳消息发送到Channel成功")
|
|
else:
|
|
print(f"❌ 心跳消息发送到Channel失败")
|
|
return False
|
|
|
|
# 检查队列状态
|
|
stats = channel.get_stats()
|
|
print(f"Channel统计信息:")
|
|
print(f" 队列大小: {stats['queue_size']}")
|
|
print(f" 优先级队列大小: {stats['priority_queue_size']}")
|
|
print(f" 总队列大小: {stats['total_queue_size']}")
|
|
print(f" 消息总数: {stats['message_count']}")
|
|
|
|
# 接收消息
|
|
received_message = await channel.receive_message()
|
|
if received_message:
|
|
print(f"✅ 消息接收成功: {received_message.type}")
|
|
print(f" 优先级: {received_message.priority}")
|
|
print(f" 数据: {received_message.data}")
|
|
else:
|
|
print(f"❌ 消息接收失败")
|
|
return False
|
|
|
|
# 再次检查队列状态
|
|
stats_after = channel.get_stats()
|
|
print(f"接收后Channel统计信息:")
|
|
print(f" 队列大小: {stats_after['queue_size']}")
|
|
print(f" 优先级队列大小: {stats_after['priority_queue_size']}")
|
|
print(f" 总队列大小: {stats_after['total_queue_size']}")
|
|
|
|
# 断开Channel
|
|
await channel.disconnect()
|
|
print(f"✅ Channel断开成功")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"❌ 测试失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
async def main():
|
|
"""主测试函数"""
|
|
print("开始心跳消息队列大小检查修复验证测试")
|
|
print("=" * 60)
|
|
|
|
# 测试1:心跳消息队列大小检查
|
|
success1 = await test_heartbeat_queue_size_check()
|
|
|
|
# 测试2:手动心跳消息测试
|
|
success2 = await test_manual_heartbeat_message()
|
|
|
|
print("\n" + "=" * 60)
|
|
print("测试结果汇总:")
|
|
print(f"心跳消息队列大小检查测试: {'✅ 通过' if success1 else '❌ 失败'}")
|
|
print(f"手动心跳消息测试: {'✅ 通过' if success2 else '❌ 失败'}")
|
|
|
|
if success1 and success2:
|
|
print("🎉 所有测试通过!心跳消息队列大小检查修复成功!")
|
|
else:
|
|
print("⚠️ 部分测试失败,请检查日志")
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|
|
|