Closed
Description
Bug report
unit test test.test_socket.ThreadedVSOCKSocketStreamTest.testStream hangs on WSL2 ubuntu.
I added some print and it seems vsock does not work on WSL though /dev/vsock exists, HAVE_SOCKET_VSOCK() == True.
$ ls /dev/vsock
/dev/vsock
Modified test_socket.py snippet:
@unittest.skipIf(fcntl is None, "need fcntl")
@unittest.skipUnless(HAVE_SOCKET_VSOCK,
'VSOCK sockets required for this test.')
@unittest.skipUnless(get_cid() != 2,
"This test can only be run on a virtual guest.")
class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
def __init__(self, methodName='runTest'):
print('__init__')
unittest.TestCase.__init__(self, methodName=methodName)
ThreadableTest.__init__(self)
def setUp(self):
print('setUp')
self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
self.addCleanup(self.serv.close)
self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
self.serv.listen()
self.serverExplicitReady()
print('Before serv.accept')
self.conn, self.connaddr = self.serv.accept()
print('After serv.accept')
self.addCleanup(self.conn.close)
print('end - setUp')
def clientSetUp(self):
print('clientSetup')
time.sleep(0.1)
self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
self.addCleanup(self.cli.close)
cid = get_cid()
print('cid: ', cid)
print('before cli.connect')
self.cli.connect((cid, VSOCKPORT))
print('end - clientSetup')
def testStream(self):
print('testStream')
msg = self.conn.recv(1024)
self.assertEqual(msg, MSG)
def _testStream(self):
self.cli.send(MSG)
self.cli.close()
Test outputs:
./python -m unittest -v test.test_socket.ThreadedVSOCKSocketStreamTest.testStream
__init__
testStream (test.test_socket.ThreadedVSOCKSocketStreamTest.testStream) ... setUp
Before serv.accept
clientSetup
cid: 4294967295
before cli.connect
^CTraceback (most recent call last):
File "/home/peter/repo/cpython/Lib/runpy.py", line 198, in _run_module_as_main
return _run_code(code, main_globals, None,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peter/repo/cpython/Lib/runpy.py", line 88, in _run_code
exec(code, run_globals)
File "/home/peter/repo/cpython/Lib/unittest/__main__.py", line 18, in <module>
main(module=None)
File "/home/peter/repo/cpython/Lib/unittest/main.py", line 102, in __init__
self.runTests()
...
File "/home/peter/repo/cpython/Lib/unittest/case.py", line 576, in _callSetUp
self.setUp()
File "/home/peter/repo/cpython/Lib/test/test_socket.py", line 376, in _setUp
self.__setUp()
File "/home/peter/repo/cpython/Lib/test/test_socket.py", line 520, in setUp
self.conn, self.connaddr = self.serv.accept()
^^^^^^^^^^^^^^^^^^
File "/home/peter/repo/cpython/Lib/socket.py", line 295, in accept
fd, addr = self._accept()
^^^^^^^^^^^^^^
KeyboardInterrupt
Your environment
- CPython versions tested on:
both Python 3.12.0a4+ and Python 3.10.9+ - Operating system and architecture:
Windows 10 home 19044.2486 + WSL2 Ubuntu 22.04
uname -r
5.15.79.1-microsoft-standard-WSL2
>>> platform.release()
'5.15.79.1-microsoft-standard-WSL2'
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04 LTS"
Suggestions
- Make it work and pass on WSL2
- Skip the test on WSL2
- Add a timeout so it does not hang at least
Linked PRs
- gh-101384: add socket timeout to ThreadedVSOCKSocketStreamTest and skip it on WSL #101418
- gh-101384: add socket timeout to ThreadedVSOCKSocketStreamTest and skip it on WSL #101419
- [3.12] gh-101384: Add socket timeout to ThreadedVSOCKSocketStreamTest and skip it on WSL (GH-101419) #115585
- [3.11] gh-101384: Add socket timeout to ThreadedVSOCKSocketStreamTest and skip it on WSL (GH-101419) #115586