From 05b460367c9f6775b575b875873cd2ef064f904b Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Sun, 28 Sep 2025 20:34:31 +0100 Subject: [PATCH 1/3] Reduce admin test timeouts to reduce random failures --- tests/async/test_admin.py | 51 +++++++++++++++++++------------------- tests/common/test_admin.py | 45 +++++++++++++++++---------------- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/tests/async/test_admin.py b/tests/async/test_admin.py index a1cf97c4..f2413f3b 100644 --- a/tests/async/test_admin.py +++ b/tests/async/test_admin.py @@ -21,7 +21,8 @@ def with_instrumented_server(auth=False, **ikwargs): def decorator(f): @wraps(f) def wrapped(self, *args, **kwargs): - sio = socketio.AsyncServer(async_mode='asgi') + sio = socketio.AsyncServer(async_mode='asgi', ping_interval=5, + ping_timeout=4) @sio.event async def enter_room(sid, data): @@ -107,23 +108,23 @@ def test_missing_auth(self): @with_instrumented_server(auth=False) def test_admin_connect_with_no_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin') - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) @with_instrumented_server(auth={'foo': 'bar'}) def test_admin_connect_with_dict_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect( 'http://localhost:8900', namespace='/admin', auth={'foo': 'baz'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect( 'http://localhost:8900', namespace='/admin') @@ -131,52 +132,52 @@ def test_admin_connect_with_dict_auth(self): @with_instrumented_server(auth=[{'foo': 'bar'}, {'u': 'admin', 'p': 'secret'}]) def test_admin_connect_with_list_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'u': 'admin', 'p': 'secret'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'baz'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin') @with_instrumented_server(auth=_custom_auth) def test_admin_connect_with_function_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'baz'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin') @with_instrumented_server(auth=_async_custom_auth) def test_admin_connect_with_async_function_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'baz'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin') @with_instrumented_server() def test_admin_connect_only_admin(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin') sid = admin_client.sid events = self._expect({'config': 1, 'all_sockets': 1, @@ -201,10 +202,10 @@ def test_admin_connect_only_admin(self): @with_instrumented_server() def test_admin_connect_with_others(self): - with socketio.SimpleClient() as client1, \ - socketio.SimpleClient() as client2, \ - socketio.SimpleClient() as client3, \ - socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as client1, \ + socketio.SimpleClient(reconnection=False) as client2, \ + socketio.SimpleClient(reconnection=False) as client3, \ + socketio.SimpleClient(reconnection=False) as admin_client: client1.connect('http://localhost:8900') client1.emit('enter_room', 'room') sid1 = client1.sid @@ -251,7 +252,7 @@ def test_admin_connect_with_others(self): @with_instrumented_server(mode='production', read_only=True) def test_admin_connect_production(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin') events = self._expect({'config': 1, 'server_stats': 2}, admin_client) @@ -272,9 +273,9 @@ def test_admin_connect_production(self): @with_instrumented_server() def test_admin_features(self): - with socketio.SimpleClient() as client1, \ - socketio.SimpleClient() as client2, \ - socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as client1, \ + socketio.SimpleClient(reconnection=False) as client2, \ + socketio.SimpleClient(reconnection=False) as admin_client: client1.connect('http://localhost:8900') client2.connect('http://localhost:8900') admin_client.connect('http://localhost:8900', namespace='/admin') diff --git a/tests/common/test_admin.py b/tests/common/test_admin.py index e7667311..910b7428 100644 --- a/tests/common/test_admin.py +++ b/tests/common/test_admin.py @@ -18,7 +18,8 @@ def with_instrumented_server(auth=False, **ikwargs): def decorator(f): @wraps(f) def wrapped(self, *args, **kwargs): - sio = socketio.Server(async_mode='threading') + sio = socketio.Server(async_mode='threading', ping_interval=5, + ping_timeout=4) @sio.event def enter_room(sid, data): @@ -97,23 +98,23 @@ def test_missing_auth(self): @with_instrumented_server(auth=False) def test_admin_connect_with_no_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin') - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) @with_instrumented_server(auth={'foo': 'bar'}) def test_admin_connect_with_dict_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect( 'http://localhost:8900', namespace='/admin', auth={'foo': 'baz'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect( 'http://localhost:8900', namespace='/admin') @@ -121,38 +122,38 @@ def test_admin_connect_with_dict_auth(self): @with_instrumented_server(auth=[{'foo': 'bar'}, {'u': 'admin', 'p': 'secret'}]) def test_admin_connect_with_list_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'u': 'admin', 'p': 'secret'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'baz'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin') @with_instrumented_server(auth=_custom_auth) def test_admin_connect_with_function_auth(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'bar'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin', auth={'foo': 'baz'}) - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: with pytest.raises(ConnectionError): admin_client.connect('http://localhost:8900', namespace='/admin') @with_instrumented_server() def test_admin_connect_only_admin(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin') sid = admin_client.sid events = self._expect({'config': 1, 'all_sockets': 1, @@ -177,10 +178,10 @@ def test_admin_connect_only_admin(self): @with_instrumented_server() def test_admin_connect_with_others(self): - with socketio.SimpleClient() as client1, \ - socketio.SimpleClient() as client2, \ - socketio.SimpleClient() as client3, \ - socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as client1, \ + socketio.SimpleClient(reconnection=False) as client2, \ + socketio.SimpleClient(reconnection=False) as client3, \ + socketio.SimpleClient(reconnection=False) as admin_client: client1.connect('http://localhost:8900') client1.emit('enter_room', 'room') sid1 = client1.sid @@ -227,7 +228,7 @@ def test_admin_connect_with_others(self): @with_instrumented_server(mode='production', read_only=True) def test_admin_connect_production(self): - with socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as admin_client: admin_client.connect('http://localhost:8900', namespace='/admin') events = self._expect({'config': 1, 'server_stats': 2}, admin_client) @@ -248,9 +249,9 @@ def test_admin_connect_production(self): @with_instrumented_server() def test_admin_features(self): - with socketio.SimpleClient() as client1, \ - socketio.SimpleClient() as client2, \ - socketio.SimpleClient() as admin_client: + with socketio.SimpleClient(reconnection=False) as client1, \ + socketio.SimpleClient(reconnection=False) as client2, \ + socketio.SimpleClient(reconnection=False) as admin_client: client1.connect('http://localhost:8900') client2.connect('http://localhost:8900') admin_client.connect('http://localhost:8900', namespace='/admin') From bfeb8b25a58c7452ad5badaa77d599d6a3bd057d Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Sun, 28 Sep 2025 21:48:39 +0100 Subject: [PATCH 2/3] set explicit hostname --- tests/web_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/web_server.py b/tests/web_server.py index cb24668e..113d475e 100644 --- a/tests/web_server.py +++ b/tests/web_server.py @@ -47,7 +47,7 @@ def get_environ(self): env['gunicorn.socket'] = self.connection return env - self.httpd = make_server('', port, self._app_wrapper, + self.httpd = make_server('localhost', port, self._app_wrapper, ThreadingWSGIServer, WebSocketRequestHandler) self.thread = threading.Thread(target=self.httpd.serve_forever) self.thread.start() From 363e1da07c89084724e764e03e4c2392a19b1208 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Sun, 28 Sep 2025 21:55:29 +0100 Subject: [PATCH 3/3] restore timeouts --- tests/async/test_admin.py | 3 +-- tests/common/test_admin.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/async/test_admin.py b/tests/async/test_admin.py index f2413f3b..62806cbb 100644 --- a/tests/async/test_admin.py +++ b/tests/async/test_admin.py @@ -21,8 +21,7 @@ def with_instrumented_server(auth=False, **ikwargs): def decorator(f): @wraps(f) def wrapped(self, *args, **kwargs): - sio = socketio.AsyncServer(async_mode='asgi', ping_interval=5, - ping_timeout=4) + sio = socketio.AsyncServer(async_mode='asgi') @sio.event async def enter_room(sid, data): diff --git a/tests/common/test_admin.py b/tests/common/test_admin.py index 910b7428..a3847898 100644 --- a/tests/common/test_admin.py +++ b/tests/common/test_admin.py @@ -18,8 +18,7 @@ def with_instrumented_server(auth=False, **ikwargs): def decorator(f): @wraps(f) def wrapped(self, *args, **kwargs): - sio = socketio.Server(async_mode='threading', ping_interval=5, - ping_timeout=4) + sio = socketio.Server(async_mode='threading') @sio.event def enter_room(sid, data):