#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 相机断开连接测试脚本 测试相机USB拔出时是否能正常检测设备断连并发送socket信息 """ import time import threading import logging from devices.camera_manager import CameraManager from devices.utils.config_manager import ConfigManager from unittest.mock import Mock # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) class MockSocketIO: """模拟SocketIO用于测试""" def __init__(self): self.events = [] self.lock = threading.Lock() def emit(self, event, data, namespace=None): """记录发送的事件""" with self.lock: self.events.append({ 'event': event, 'data': data, 'namespace': namespace, 'timestamp': time.time() }) logger.info(f"Socket事件: {event} -> {data} (namespace: {namespace})") def get_events(self): """获取所有事件""" with self.lock: return self.events.copy() def clear_events(self): """清空事件记录""" with self.lock: self.events.clear() def test_camera_disconnect_detection(): """ 测试相机断开连接检测功能 """ logger.info("="*60) logger.info("开始测试相机断开连接检测功能") logger.info("="*60) # 创建模拟SocketIO mock_socketio = MockSocketIO() # 创建配置管理器 config_manager = ConfigManager() # 创建相机管理器 camera_manager = CameraManager(mock_socketio, config_manager) try: # 1. 初始化相机 logger.info("\n步骤1: 初始化相机设备") if not camera_manager.initialize(): logger.error("相机初始化失败,无法进行测试") return False logger.info(f"相机初始化成功 - 连接状态: {camera_manager.is_connected}") # 2. 启动数据流 logger.info("\n步骤2: 启动相机数据流") if not camera_manager.start_streaming(): logger.error("相机数据流启动失败") return False logger.info("相机数据流启动成功") # 3. 等待一段时间让系统稳定 logger.info("\n步骤3: 等待系统稳定 (5秒)") time.sleep(5) # 清空之前的事件记录 mock_socketio.clear_events() # 4. 提示用户拔出USB logger.info("\n步骤4: 请拔出相机USB连接线") logger.info("等待30秒来检测断开连接...") start_time = time.time() disconnect_detected = False # 监控30秒 while time.time() - start_time < 30: # 检查连接状态 if camera_manager.is_connected: logger.debug(f"相机仍然连接中... (已等待 {time.time() - start_time:.1f}秒)") else: logger.info(f"检测到相机断开连接! (耗时 {time.time() - start_time:.1f}秒)") disconnect_detected = True break time.sleep(1) # 5. 分析结果 logger.info("\n步骤5: 分析测试结果") if disconnect_detected: logger.info("✓ 相机断开连接检测: 成功") else: logger.warning("✗ 相机断开连接检测: 失败 (30秒内未检测到断开)") # 检查Socket事件 events = mock_socketio.get_events() disconnect_events = [e for e in events if 'status' in str(e.get('data', {})) and 'disconnect' in str(e.get('data', {})).lower()] if disconnect_events: logger.info(f"✓ Socket断开通知: 成功 (发送了 {len(disconnect_events)} 个断开事件)") for event in disconnect_events: logger.info(f" - 事件: {event['event']}, 数据: {event['data']}") else: logger.warning("✗ Socket断开通知: 失败 (未发送断开事件)") # 6. 测试重连机制 if disconnect_detected: logger.info("\n步骤6: 测试重连机制") logger.info("请重新插入相机USB连接线") logger.info("等待30秒来检测重新连接...") start_time = time.time() reconnect_detected = False while time.time() - start_time < 30: if camera_manager.is_connected: logger.info(f"检测到相机重新连接! (耗时 {time.time() - start_time:.1f}秒)") reconnect_detected = True break time.sleep(1) if reconnect_detected: logger.info("✓ 相机重连检测: 成功") else: logger.warning("✗ 相机重连检测: 失败 (30秒内未检测到重连)") # 7. 显示所有Socket事件 logger.info("\n步骤7: 所有Socket事件记录") all_events = mock_socketio.get_events() if all_events: for i, event in enumerate(all_events, 1): logger.info(f" {i}. 事件: {event['event']}, 数据: {event['data']}, 时间: {time.strftime('%H:%M:%S', time.localtime(event['timestamp']))}") else: logger.info(" 无Socket事件记录") return disconnect_detected except Exception as e: logger.error(f"测试过程中发生异常: {e}") return False finally: # 清理资源 try: camera_manager.stop_streaming() camera_manager.disconnect() logger.info("测试资源清理完成") except Exception as e: logger.error(f"清理资源时发生异常: {e}") def main(): """ 主函数 """ logger.info("相机断开连接测试脚本") logger.info("此脚本将测试相机USB拔出时的断连检测和Socket通知功能") logger.info("") # 运行测试 success = test_camera_disconnect_detection() logger.info("\n" + "="*60) if success: logger.info("测试完成: 相机断开连接检测功能正常") else: logger.info("测试完成: 相机断开连接检测功能存在问题") logger.info("="*60) if __name__ == "__main__": main()