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.
219 lines
7.4 KiB
219 lines
7.4 KiB
#!/usr/bin/env python3
|
|
"""
|
|
WebSocket连接测试脚本
|
|
用于测试WebSocket客户端的连接功能
|
|
"""
|
|
import asyncio
|
|
import json
|
|
import sys
|
|
import os
|
|
|
|
# 添加项目根目录到Python路径
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
from app.core.websocket.manager import websocket_manager
|
|
from app.schemas.websocket import CreateWebSocketClientRequest
|
|
from app.utils.log import get_logger
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
async def test_websocket_connection():
|
|
"""测试WebSocket连接功能"""
|
|
print("=== WebSocket连接测试 ===")
|
|
|
|
# 测试配置 - 使用更可靠的测试服务器
|
|
test_cases = [
|
|
{
|
|
"name": "test_ws_demo",
|
|
"url": "ws://demos.kaazing.com/echo",
|
|
"description": "Kaazing Echo服务器测试"
|
|
},
|
|
{
|
|
"name": "test_ws_local",
|
|
"url": "ws://localhost:8080/ws",
|
|
"description": "本地WebSocket服务器测试"
|
|
},
|
|
{
|
|
"name": "test_ws_invalid",
|
|
"url": "http://example.com",
|
|
"description": "无效URL测试(应该失败)"
|
|
}
|
|
]
|
|
|
|
for test_case in test_cases:
|
|
print(f"\n--- 测试: {test_case['description']} ---")
|
|
print(f"URL: {test_case['url']}")
|
|
|
|
try:
|
|
# 创建请求对象
|
|
request = CreateWebSocketClientRequest(
|
|
name=test_case["name"],
|
|
url=test_case["url"],
|
|
heartbeat_interval=120 # 2分钟心跳间隔
|
|
)
|
|
|
|
# 创建客户端
|
|
print("1. 创建WebSocket客户端...")
|
|
client = await websocket_manager.create_client(request.name, request.url)
|
|
print(f" 客户端创建成功: {client.name}")
|
|
|
|
# 连接客户端
|
|
print("2. 连接WebSocket客户端...")
|
|
success = await websocket_manager.connect_client(request.name)
|
|
|
|
if success:
|
|
print(f" ✅ 连接成功: {request.name}")
|
|
|
|
# 获取客户端状态
|
|
client = websocket_manager.get_client(request.name)
|
|
if client:
|
|
stats = client.get_stats()
|
|
print(f" 状态: {stats['state']}")
|
|
print(f" 已连接: {stats['is_connected']}")
|
|
|
|
# 等待一段时间观察连接状态
|
|
print("3. 等待3秒观察连接状态...")
|
|
await asyncio.sleep(3)
|
|
|
|
# 再次检查状态
|
|
client = websocket_manager.get_client(request.name)
|
|
if client:
|
|
stats = client.get_stats()
|
|
print(f" 3秒后状态: {stats['state']}")
|
|
print(f" 3秒后已连接: {stats['is_connected']}")
|
|
|
|
# 断开连接
|
|
print("4. 断开WebSocket客户端...")
|
|
await websocket_manager.disconnect_client(request.name)
|
|
print(f" ✅ 断开成功: {request.name}")
|
|
|
|
else:
|
|
print(f" ❌ 连接失败: {request.name}")
|
|
|
|
except Exception as e:
|
|
print(f" ❌ 测试异常: {e}")
|
|
logger.error(f"WebSocket连接测试异常: {e}")
|
|
|
|
# 清理
|
|
try:
|
|
await websocket_manager.remove_client(test_case["name"])
|
|
except:
|
|
pass
|
|
|
|
print("\n=== 测试完成 ===")
|
|
|
|
async def test_websocket_manager_stats():
|
|
"""测试WebSocket管理器统计信息"""
|
|
print("\n=== WebSocket管理器统计信息 ===")
|
|
|
|
try:
|
|
stats = websocket_manager.get_stats()
|
|
print(f"客户端数量: {stats['client_count']}")
|
|
print(f"Channel数量: {stats['channel_count']}")
|
|
print(f"适配器数量: {stats['adapter_count']}")
|
|
print(f"创建时间: {stats['created_at']}")
|
|
|
|
if stats['clients']:
|
|
print("\n客户端详情:")
|
|
for name, client_stats in stats['clients'].items():
|
|
print(f" - {name}: {client_stats['state']} (连接: {client_stats['is_connected']})")
|
|
|
|
except Exception as e:
|
|
print(f"获取统计信息失败: {e}")
|
|
|
|
async def test_api_endpoint():
|
|
"""测试API端点"""
|
|
print("\n=== API端点测试 ===")
|
|
|
|
# 模拟API请求
|
|
test_request = {
|
|
"name": "test_api_client",
|
|
"url": "ws://demos.kaazing.com/echo",
|
|
"heartbeat_interval": 120
|
|
}
|
|
|
|
print(f"测试请求: {json.dumps(test_request, indent=2)}")
|
|
|
|
try:
|
|
# 创建请求对象
|
|
request = CreateWebSocketClientRequest(**test_request)
|
|
|
|
# 创建客户端
|
|
print("1. 创建WebSocket客户端...")
|
|
client = await websocket_manager.create_client(request.name, request.url)
|
|
print(f" 客户端创建成功: {client.name}")
|
|
|
|
# 连接客户端
|
|
print("2. 连接WebSocket客户端...")
|
|
success = await websocket_manager.connect_client(request.name)
|
|
|
|
if success:
|
|
print(f" ✅ 连接成功: {request.name}")
|
|
|
|
# 确保默认Channels存在并连接,创建适配器
|
|
default_channels = ["default", "system", "events"]
|
|
max_channel_size = 1000
|
|
|
|
print("3. 创建默认Channels和适配器...")
|
|
for ch in default_channels:
|
|
channel = websocket_manager.get_channel(ch)
|
|
if not channel:
|
|
channel = await websocket_manager.create_channel(ch, max_channel_size)
|
|
await channel.connect()
|
|
await websocket_manager.create_adapter(request.name, ch, request.heartbeat_interval)
|
|
print(f" ✅ Channel {ch} 和适配器创建成功")
|
|
|
|
print("4. 等待2秒观察连接状态...")
|
|
await asyncio.sleep(2)
|
|
|
|
# 检查状态
|
|
client = websocket_manager.get_client(request.name)
|
|
if client:
|
|
stats = client.get_stats()
|
|
print(f" 最终状态: {stats['state']}")
|
|
print(f" 最终连接: {stats['is_connected']}")
|
|
|
|
# 断开连接
|
|
print("5. 断开WebSocket客户端...")
|
|
await websocket_manager.disconnect_client(request.name)
|
|
print(f" ✅ 断开成功: {request.name}")
|
|
|
|
else:
|
|
print(f" ❌ 连接失败: {request.name}")
|
|
|
|
except Exception as e:
|
|
print(f" ❌ API测试异常: {e}")
|
|
logger.error(f"API测试异常: {e}")
|
|
|
|
# 清理
|
|
try:
|
|
await websocket_manager.remove_client("test_api_client")
|
|
except:
|
|
pass
|
|
|
|
async def main():
|
|
"""主函数"""
|
|
try:
|
|
# 测试WebSocket连接
|
|
await test_websocket_connection()
|
|
|
|
# 测试API端点
|
|
await test_api_endpoint()
|
|
|
|
# 测试管理器统计
|
|
await test_websocket_manager_stats()
|
|
|
|
except KeyboardInterrupt:
|
|
print("\n测试被用户中断")
|
|
except Exception as e:
|
|
print(f"测试过程中发生异常: {e}")
|
|
logger.error(f"测试异常: {e}")
|
|
finally:
|
|
# 清理资源
|
|
print("\n清理WebSocket管理器资源...")
|
|
await websocket_manager.cleanup()
|
|
print("清理完成")
|
|
|
|
if __name__ == "__main__":
|
|
# 运行测试
|
|
asyncio.run(main())
|