From 8f3c7ce66bc076074ea80fc187d818eeb76c1f16 Mon Sep 17 00:00:00 2001 From: "Erik M. Bray" Date: Thu, 12 Jan 2017 14:33:19 +0100 Subject: [PATCH] Fix test_asyncore tests on Cygwin by working around two Cygwin bugs: * The first bug is connect()-ing an AF_UNIX socket can hang indefinitely if the server is not actively accept()-ing connections; see https://cygwin.com/ml/cygwin/2017-01/msg00054.html This issue is worked around explicitly in the tests, but not generally in asyncore (as the only known general workaround breaks SO_PEERCRED queries). It's also something of a corner-case which won't affect non-test code often. * Skips the test_set_reuse_addr tests due to an upstream bug (now fixed upstream) with getsockopt(SO_REUSEADDR); see https://cygwin.com/ml/cygwin-patches/2017-q1/msg00007.html --- Lib/test/test_asyncore.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index 51c6573..d5e9f68 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -100,6 +100,12 @@ def bind_af_aware(sock, addr): sock.bind(addr) +def setsock_no_peercred(sock): + if sys.platform == 'cygwin' and sock.family == socket.AF_UNIX: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_PEERCRED, None, 0) + + + class HelperFunctionTests(unittest.TestCase): def test_readwriteexc(self): # Check exception handling behavior of read, write and _exception @@ -472,6 +478,7 @@ class BaseServer(asyncore.dispatcher): def __init__(self, family, addr, handler=BaseTestHandler): asyncore.dispatcher.__init__(self) self.create_socket(family) + setsock_no_peercred(self.socket) self.set_reuse_addr() bind_af_aware(self.socket, addr) self.listen(5) @@ -493,6 +500,7 @@ class BaseClient(BaseTestHandler): def __init__(self, family, address): BaseTestHandler.__init__(self) self.create_socket(family) + setsock_no_peercred(self.socket) self.connect(address) def handle_connect(self): @@ -553,6 +561,7 @@ class BaseTestAPI: def __init__(self, family, addr): BaseTestHandler.__init__(self) self.create_socket(family) + setsock_no_peercred(self.socket) bind_af_aware(self.socket, addr) self.listen(5) self.address = self.socket.getsockname() @@ -752,6 +761,8 @@ class BaseTestAPI: def test_set_reuse_addr(self): if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX: self.skipTest("Not applicable to AF_UNIX sockets.") + elif sys.platform == 'cygwin': + self.skipTest("Known failure on Cygwin due to a Cygwin bug") sock = socket.socket(self.family) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) -- 2.8.3