Skip to content

Commit 9b4bbf7

Browse files
committed
Fix tests on UNIX sockets on Mac OS X 10.4 (Tiger): don't test the sockname
extra info, getsockname() has a bug on this old OS X kernel.
1 parent df5bb4d commit 9b4bbf7

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

tests/test_events.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import gc
55
import io
66
import os
7+
import platform
78
import signal
89
import socket
910
try:
@@ -40,6 +41,15 @@ def data_file(filename):
4041
raise FileNotFoundError(filename)
4142

4243

44+
def osx_tiger():
45+
"""Return True if the platform is Mac OS 10.4 or older."""
46+
if sys.platform != 'darwin':
47+
return False
48+
version = platform.mac_ver()[0]
49+
version = tuple(map(int, version.split('.')))
50+
return version < (10, 5)
51+
52+
4353
ONLYCERT = data_file('ssl_cert.pem')
4454
ONLYKEY = data_file('ssl_key.pem')
4555
SIGNED_CERTFILE = data_file('keycert3.pem')
@@ -499,10 +509,12 @@ def my_handler(*args):
499509
self.loop.run_forever()
500510
self.assertEqual(caught, 1)
501511

502-
def _basetest_create_connection(self, connection_fut):
512+
def _basetest_create_connection(self, connection_fut, check_sockname=True):
503513
tr, pr = self.loop.run_until_complete(connection_fut)
504514
self.assertIsInstance(tr, asyncio.Transport)
505515
self.assertIsInstance(pr, asyncio.Protocol)
516+
if check_sockname:
517+
self.assertIsNotNone(tr.get_extra_info('sockname'))
506518
self.loop.run_until_complete(pr.done)
507519
self.assertGreater(pr.nbytes, 0)
508520
tr.close()
@@ -515,10 +527,14 @@ def test_create_connection(self):
515527

516528
@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
517529
def test_create_unix_connection(self):
530+
# Issue #20682: On Mac OS X Tiger, getsockname() returns a
531+
# zero-length address for UNIX socket.
532+
check_sockname = not osx_tiger()
533+
518534
with test_utils.run_test_unix_server() as httpd:
519535
conn_fut = self.loop.create_unix_connection(
520536
lambda: MyProto(loop=self.loop), httpd.address)
521-
self._basetest_create_connection(conn_fut)
537+
self._basetest_create_connection(conn_fut, check_sockname)
522538

523539
def test_create_connection_sock(self):
524540
with test_utils.run_test_server() as httpd:
@@ -548,12 +564,14 @@ def test_create_connection_sock(self):
548564
self.assertGreater(pr.nbytes, 0)
549565
tr.close()
550566

551-
def _basetest_create_ssl_connection(self, connection_fut):
567+
def _basetest_create_ssl_connection(self, connection_fut,
568+
check_sockname=True):
552569
tr, pr = self.loop.run_until_complete(connection_fut)
553570
self.assertIsInstance(tr, asyncio.Transport)
554571
self.assertIsInstance(pr, asyncio.Protocol)
555572
self.assertTrue('ssl' in tr.__class__.__name__.lower())
556-
self.assertIsNotNone(tr.get_extra_info('sockname'))
573+
if check_sockname:
574+
self.assertIsNotNone(tr.get_extra_info('sockname'))
557575
self.loop.run_until_complete(pr.done)
558576
self.assertGreater(pr.nbytes, 0)
559577
tr.close()
@@ -571,14 +589,18 @@ def test_create_ssl_connection(self):
571589
@unittest.skipIf(ssl is None, 'No ssl module')
572590
@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
573591
def test_create_ssl_unix_connection(self):
592+
# Issue #20682: On Mac OS X Tiger, getsockname() returns a
593+
# zero-length address for UNIX socket.
594+
check_sockname = not osx_tiger()
595+
574596
with test_utils.run_test_unix_server(use_ssl=True) as httpd:
575597
conn_fut = self.loop.create_unix_connection(
576598
lambda: MyProto(loop=self.loop),
577599
httpd.address,
578600
ssl=test_utils.dummy_ssl_context(),
579601
server_hostname='127.0.0.1')
580602

581-
self._basetest_create_ssl_connection(conn_fut)
603+
self._basetest_create_ssl_connection(conn_fut, check_sockname)
582604

583605
def test_create_connection_local_addr(self):
584606
with test_utils.run_test_server() as httpd:

0 commit comments

Comments
 (0)