@@ -27,6 +27,8 @@ def setUpClass(cls):
2727 cls .__last_message = None
2828 cls .__callback_event = threading .Event ()
2929 cls .__ws = None
30+ cls .__ws_connected = threading .Event () # Use Event for connection tracking
31+ cls .__ws_error = None
3032
3133 def callback (pose , message ):
3234 cls .__last_pose = pose
@@ -52,15 +54,19 @@ def on_message(ws, message):
5254
5355 def on_error (ws , error ):
5456 print (f"WebSocket error: { error } " )
57+ cls .__ws_error = error
58+ cls .__ws_connected .clear ()
5559
5660 def on_close (ws , close_status_code , close_msg ):
57- print ("WebSocket connection closed" )
61+ print (f"WebSocket connection closed: { close_status_code } - { close_msg } " )
62+ cls .__ws_connected .clear ()
5863
5964 def on_open (ws ):
6065 print ("WebSocket connection opened" )
66+ cls .__ws_connected .set () # Signal that connection is established
6167
6268 # Create WebSocket connection
63- websocket .enableTrace (False ) # Set to True for debugging
69+ websocket .enableTrace (True ) # Enable for debugging
6470
6571 # Use wss:// for HTTPS or ws:// for HTTP
6672 url = BASE_URL .replace ("ws://" , "wss://" ) if "4443" in BASE_URL else BASE_URL
@@ -86,7 +92,16 @@ def on_open(ws):
8692 cls .__ws_thread .daemon = True
8793 cls .__ws_thread .start ()
8894
89- time .sleep (2 )
95+ # Wait for connection to be established
96+ connection_established = cls .__ws_connected .wait (timeout = 10 )
97+ if not connection_established :
98+ if cls .__ws_error :
99+ raise Exception (f"WebSocket connection failed: { cls .__ws_error } " )
100+ else :
101+ raise Exception ("WebSocket connection timeout" )
102+
103+ # Give a small buffer after connection
104+ time .sleep (0.5 )
90105
91106 def setUp (self ):
92107 self .__class__ .__last_pose = None
@@ -98,14 +113,27 @@ def _wait_for_callback(self, timeout=10.0):
98113
99114 def _send_message (self , payload ):
100115 """Send message to WebSocket server"""
116+ # Check if connection is still active
117+ if not self .__ws_connected .is_set ():
118+ raise Exception ("WebSocket connection not active" )
119+
120+ if not hasattr (self .__ws , 'sock' ) or self .__ws .sock is None :
121+ raise Exception ("WebSocket socket is None" )
122+
101123 message = {
102124 "type" : "pose" ,
103125 "data" : payload
104126 }
105- self .__ws .send (json .dumps (message ))
127+
128+ try :
129+ self .__ws .send (json .dumps (message ))
130+ except Exception as e :
131+ # Connection might have been closed, try to reconnect
132+ self .__ws_connected .clear ()
133+ raise Exception (f"Failed to send message: { e } " )
106134
107135 def test_response (self ):
108- if not hasattr ( self .__ws , 'sock' ) or self . __ws . sock is None :
136+ if not self .__ws_connected . is_set () :
109137 self .skipTest ("WebSocket client not connected" )
110138
111139 payload = get_message ()
@@ -121,7 +149,7 @@ def test_response(self):
121149 )
122150
123151 def test_single_position_update (self ):
124- if not hasattr ( self .__ws , 'sock' ) or self . __ws . sock is None :
152+ if not self .__ws_connected . is_set () :
125153 self .skipTest ("WebSocket client not connected" )
126154
127155 payload = get_message ()
0 commit comments