new file mode 100644
@@ -0,0 +1,141 @@
+From 159e030c7c23060de989cebec6d98d776c75bcbd Mon Sep 17 00:00:00 2001
+From: Miguel Grinberg <miguel.grinberg@gmail.com>
+Date: Sun, 13 Oct 2024 15:11:39 +0100
+Subject: [PATCH] Removed net access requirement in client unit tests (Fixes
+ #40)
+
+Upstream-Status: Backport [https://github.com/miguelgrinberg/simple-websocket/commit/159e030c7c23060de989cebec6d98d776c75bcbd]
+Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
+---
+ tests/test_client.py | 34 +++++++++++++++++-----------------
+ 1 file changed, 17 insertions(+), 17 deletions(-)
+
+diff --git a/tests/test_client.py b/tests/test_client.py
+index d986520..898b423 100644
+--- a/tests/test_client.py
++++ b/tests/test_client.py
+@@ -22,16 +22,16 @@ def get_client(self, mock_wsconn, url, events=[], subprotocols=None,
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_make_client(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws?a=1')
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws?a=1')
+ assert client.sock == mock_socket()
+ assert client.receive_bytes == 4096
+ assert client.input_buffer == []
+ assert client.event.__class__.__name__ == 'Event'
+ client.sock.send.assert_called_with(
+- b"Request(host='example.com', target='/ws?a=1', extensions=[], "
++ b"Request(host='localhost', target='/ws?a=1', extensions=[], "
+ b"extra_headers=[], subprotocols=[])")
+ assert not client.is_server
+- assert client.host == 'example.com'
++ assert client.host == 'localhost'
+ assert client.port == 80
+ assert client.path == '/ws?a=1'
+
+@@ -39,42 +39,42 @@ def test_make_client(self, mock_wsconn, mock_socket):
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_make_client_subprotocol(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws?a=1',
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws?a=1',
+ subprotocols='foo')
+ assert client.subprotocols == ['foo']
+ client.sock.send.assert_called_with(
+- b"Request(host='example.com', target='/ws?a=1', extensions=[], "
++ b"Request(host='localhost', target='/ws?a=1', extensions=[], "
+ b"extra_headers=[], subprotocols=['foo'])")
+
+ @mock.patch('simple_websocket.ws.socket.socket')
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_make_client_subprotocols(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws?a=1',
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws?a=1',
+ subprotocols=['foo', 'bar'])
+ assert client.subprotocols == ['foo', 'bar']
+ client.sock.send.assert_called_with(
+- b"Request(host='example.com', target='/ws?a=1', extensions=[], "
++ b"Request(host='localhost', target='/ws?a=1', extensions=[], "
+ b"extra_headers=[], subprotocols=['foo', 'bar'])")
+
+ @mock.patch('simple_websocket.ws.socket.socket')
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_make_client_headers(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws?a=1',
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws?a=1',
+ headers={'Foo': 'Bar'})
+ client.sock.send.assert_called_with(
+- b"Request(host='example.com', target='/ws?a=1', extensions=[], "
++ b"Request(host='localhost', target='/ws?a=1', extensions=[], "
+ b"extra_headers=[('Foo', 'Bar')], subprotocols=[])")
+
+ @mock.patch('simple_websocket.ws.socket.socket')
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_make_client_headers2(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws?a=1',
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws?a=1',
+ headers=[('Foo', 'Bar'), ('Foo', 'Baz')])
+ client.sock.send.assert_called_with(
+- b"Request(host='example.com', target='/ws?a=1', extensions=[], "
++ b"Request(host='localhost', target='/ws?a=1', extensions=[], "
+ b"extra_headers=[('Foo', 'Bar'), ('Foo', 'Baz')], "
+ b"subprotocols=[])")
+
+@@ -82,7 +82,7 @@ def test_make_client_headers2(self, mock_wsconn, mock_socket):
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_send(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws')
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws')
+ while client.connected:
+ time.sleep(0.01)
+ with pytest.raises(simple_websocket.ConnectionClosed):
+@@ -102,7 +102,7 @@ def test_send(self, mock_wsconn, mock_socket):
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_receive(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws', events=[
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws', events=[
+ [TextMessage('hello')],
+ [BytesMessage(b'hello')],
+ ])
+@@ -117,7 +117,7 @@ def test_receive(self, mock_wsconn, mock_socket):
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_receive_after_close(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws', events=[
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws', events=[
+ [TextMessage('hello')],
+ ])
+ while client.connected:
+@@ -130,7 +130,7 @@ def test_receive_after_close(self, mock_wsconn, mock_socket):
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_receive_ping(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws', events=[
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws', events=[
+ [Ping(b'hello')],
+ ])
+ while client.connected:
+@@ -141,7 +141,7 @@ def test_receive_ping(self, mock_wsconn, mock_socket):
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_receive_empty(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.side_effect = [b'x', b'x', b'']
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws', events=[
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws', events=[
+ [TextMessage('hello')],
+ ])
+ while client.connected:
+@@ -154,7 +154,7 @@ def test_receive_empty(self, mock_wsconn, mock_socket):
+ @mock.patch('simple_websocket.ws.WSConnection')
+ def test_close(self, mock_wsconn, mock_socket):
+ mock_socket.return_value.recv.return_value = b'x'
+- client = self.get_client(mock_wsconn, 'ws://example.com/ws')
++ client = self.get_client(mock_wsconn, 'ws://localhost/ws')
+ while client.connected:
+ time.sleep(0.01)
+ with pytest.raises(simple_websocket.ConnectionClosed):
@@ -5,7 +5,9 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=9d272c9fe2437531b5bbecf4fcc82e24"
inherit pypi python_setuptools_build_meta ptest-python-pytest
-SRC_URI += "file://0001-Async-test-improvements-for-Python-3.14-48.patch"
+SRC_URI += "file://0001-Async-test-improvements-for-Python-3.14-48.patch \
+ file://0002-Removed-net-access-requirement-in-client-unit-tests.patch \
+ "
SRC_URI[sha256sum] = "7939234e7aa067c534abdab3a9ed933ec9ce4691b0713c78acb195560aa52ae4"
RDEPENDS:${PN} += " \
The client unit tests mock socket.socket but not socket.getaddrinfo(), so every test resolves example.com. Without working DNS in the image (e.g. yoe-musl-sysvinit qemux86-64) all of tests/test_client.py fails. Backport the upstream fix that uses localhost instead. AI-Generated: Uses Claude Code Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com> --- ...ess-requirement-in-client-unit-tests.patch | 141 ++++++++++++++++++ .../python/python3-simple-websocket_1.1.0.bb | 4 +- 2 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 meta-python/recipes-devtools/python/python3-simple-websocket/0002-Removed-net-access-requirement-in-client-unit-tests.patch