Home | History | Annotate | Download | only in test
      1 import asyncore
      2 import unittest
      3 import select
      4 import os
      5 import socket
      6 import sys
      7 import time
      8 import errno
      9 import struct
     10 
     11 from test import support
     12 from io import BytesIO
     13 
     14 if support.PGO:
     15     raise unittest.SkipTest("test is not helpful for PGO")
     16 
     17 try:
     18     import threading
     19 except ImportError:
     20     threading = None
     21 
     22 TIMEOUT = 3
     23 HAS_UNIX_SOCKETS = hasattr(socket, 'AF_UNIX')
     24 
     25 class dummysocket:
     26     def __init__(self):
     27         self.closed = False
     28 
     29     def close(self):
     30         self.closed = True
     31 
     32     def fileno(self):
     33         return 42
     34 
     35 class dummychannel:
     36     def __init__(self):
     37         self.socket = dummysocket()
     38 
     39     def close(self):
     40         self.socket.close()
     41 
     42 class exitingdummy:
     43     def __init__(self):
     44         pass
     45 
     46     def handle_read_event(self):
     47         raise asyncore.ExitNow()
     48 
     49     handle_write_event = handle_read_event
     50     handle_close = handle_read_event
     51     handle_expt_event = handle_read_event
     52 
     53 class crashingdummy:
     54     def __init__(self):
     55         self.error_handled = False
     56 
     57     def handle_read_event(self):
     58         raise Exception()
     59 
     60     handle_write_event = handle_read_event
     61     handle_close = handle_read_event
     62     handle_expt_event = handle_read_event
     63 
     64     def handle_error(self):
     65         self.error_handled = True
     66 
     67 # used when testing senders; just collects what it gets until newline is sent
     68 def capture_server(evt, buf, serv):
     69     try:
     70         serv.listen()
     71         conn, addr = serv.accept()
     72     except socket.timeout:
     73         pass
     74     else:
     75         n = 200
     76         start = time.time()
     77         while n > 0 and time.time() - start < 3.0:
     78             r, w, e = select.select([conn], [], [], 0.1)
     79             if r:
     80                 n -= 1
     81                 data = conn.recv(10)
     82                 # keep everything except for the newline terminator
     83                 buf.write(data.replace(b'\n', b''))
     84                 if b'\n' in data:
     85                     break
     86             time.sleep(0.01)
     87 
     88         conn.close()
     89     finally:
     90         serv.close()
     91         evt.set()
     92 
     93 def bind_af_aware(sock, addr):
     94     """Helper function to bind a socket according to its family."""
     95     if HAS_UNIX_SOCKETS and sock.family == socket.AF_UNIX:
     96         # Make sure the path doesn't exist.
     97         support.unlink(addr)
     98         support.bind_unix_socket(sock, addr)
     99     else:
    100         sock.bind(addr)
    101 
    102 
    103 class HelperFunctionTests(unittest.TestCase):
    104     def test_readwriteexc(self):
    105         # Check exception handling behavior of read, write and _exception
    106 
    107         # check that ExitNow exceptions in the object handler method
    108         # bubbles all the way up through asyncore read/write/_exception calls
    109         tr1 = exitingdummy()
    110         self.assertRaises(asyncore.ExitNow, asyncore.read, tr1)
    111         self.assertRaises(asyncore.ExitNow, asyncore.write, tr1)
    112         self.assertRaises(asyncore.ExitNow, asyncore._exception, tr1)
    113 
    114         # check that an exception other than ExitNow in the object handler
    115         # method causes the handle_error method to get called
    116         tr2 = crashingdummy()
    117         asyncore.read(tr2)
    118         self.assertEqual(tr2.error_handled, True)
    119 
    120         tr2 = crashingdummy()
    121         asyncore.write(tr2)
    122         self.assertEqual(tr2.error_handled, True)
    123 
    124         tr2 = crashingdummy()
    125         asyncore._exception(tr2)
    126         self.assertEqual(tr2.error_handled, True)
    127 
    128     # asyncore.readwrite uses constants in the select module that
    129     # are not present in Windows systems (see this thread:
    130     # http://mail.python.org/pipermail/python-list/2001-October/109973.html)
    131     # These constants should be present as long as poll is available
    132 
    133     @unittest.skipUnless(hasattr(select, 'poll'), 'select.poll required')
    134     def test_readwrite(self):
    135         # Check that correct methods are called by readwrite()
    136 
    137         attributes = ('read', 'expt', 'write', 'closed', 'error_handled')
    138 
    139         expected = (
    140             (select.POLLIN, 'read'),
    141             (select.POLLPRI, 'expt'),
    142             (select.POLLOUT, 'write'),
    143             (select.POLLERR, 'closed'),
    144             (select.POLLHUP, 'closed'),
    145             (select.POLLNVAL, 'closed'),
    146             )
    147 
    148         class testobj:
    149             def __init__(self):
    150                 self.read = False
    151                 self.write = False
    152                 self.closed = False
    153                 self.expt = False
    154                 self.error_handled = False
    155 
    156             def handle_read_event(self):
    157                 self.read = True
    158 
    159             def handle_write_event(self):
    160                 self.write = True
    161 
    162             def handle_close(self):
    163                 self.closed = True
    164 
    165             def handle_expt_event(self):
    166                 self.expt = True
    167 
    168             def handle_error(self):
    169                 self.error_handled = True
    170 
    171         for flag, expectedattr in expected:
    172             tobj = testobj()
    173             self.assertEqual(getattr(tobj, expectedattr), False)
    174             asyncore.readwrite(tobj, flag)
    175 
    176             # Only the attribute modified by the routine we expect to be
    177             # called should be True.
    178             for attr in attributes:
    179                 self.assertEqual(getattr(tobj, attr), attr==expectedattr)
    180 
    181             # check that ExitNow exceptions in the object handler method
    182             # bubbles all the way up through asyncore readwrite call
    183             tr1 = exitingdummy()
    184             self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag)
    185 
    186             # check that an exception other than ExitNow in the object handler
    187             # method causes the handle_error method to get called
    188             tr2 = crashingdummy()
    189             self.assertEqual(tr2.error_handled, False)
    190             asyncore.readwrite(tr2, flag)
    191             self.assertEqual(tr2.error_handled, True)
    192 
    193     def test_closeall(self):
    194         self.closeall_check(False)
    195 
    196     def test_closeall_default(self):
    197         self.closeall_check(True)
    198 
    199     def closeall_check(self, usedefault):
    200         # Check that close_all() closes everything in a given map
    201 
    202         l = []
    203         testmap = {}
    204         for i in range(10):
    205             c = dummychannel()
    206             l.append(c)
    207             self.assertEqual(c.socket.closed, False)
    208             testmap[i] = c
    209 
    210         if usedefault:
    211             socketmap = asyncore.socket_map
    212             try:
    213                 asyncore.socket_map = testmap
    214                 asyncore.close_all()
    215             finally:
    216                 testmap, asyncore.socket_map = asyncore.socket_map, socketmap
    217         else:
    218             asyncore.close_all(testmap)
    219 
    220         self.assertEqual(len(testmap), 0)
    221 
    222         for c in l:
    223             self.assertEqual(c.socket.closed, True)
    224 
    225     def test_compact_traceback(self):
    226         try:
    227             raise Exception("I don't like spam!")
    228         except:
    229             real_t, real_v, real_tb = sys.exc_info()
    230             r = asyncore.compact_traceback()
    231         else:
    232             self.fail("Expected exception")
    233 
    234         (f, function, line), t, v, info = r
    235         self.assertEqual(os.path.split(f)[-1], 'test_asyncore.py')
    236         self.assertEqual(function, 'test_compact_traceback')
    237         self.assertEqual(t, real_t)
    238         self.assertEqual(v, real_v)
    239         self.assertEqual(info, '[%s|%s|%s]' % (f, function, line))
    240 
    241 
    242 class DispatcherTests(unittest.TestCase):
    243     def setUp(self):
    244         pass
    245 
    246     def tearDown(self):
    247         asyncore.close_all()
    248 
    249     def test_basic(self):
    250         d = asyncore.dispatcher()
    251         self.assertEqual(d.readable(), True)
    252         self.assertEqual(d.writable(), True)
    253 
    254     def test_repr(self):
    255         d = asyncore.dispatcher()
    256         self.assertEqual(repr(d), '<asyncore.dispatcher at %#x>' % id(d))
    257 
    258     def test_log(self):
    259         d = asyncore.dispatcher()
    260 
    261         # capture output of dispatcher.log() (to stderr)
    262         l1 = "Lovely spam! Wonderful spam!"
    263         l2 = "I don't like spam!"
    264         with support.captured_stderr() as stderr:
    265             d.log(l1)
    266             d.log(l2)
    267 
    268         lines = stderr.getvalue().splitlines()
    269         self.assertEqual(lines, ['log: %s' % l1, 'log: %s' % l2])
    270 
    271     def test_log_info(self):
    272         d = asyncore.dispatcher()
    273 
    274         # capture output of dispatcher.log_info() (to stdout via print)
    275         l1 = "Have you got anything without spam?"
    276         l2 = "Why can't she have egg bacon spam and sausage?"
    277         l3 = "THAT'S got spam in it!"
    278         with support.captured_stdout() as stdout:
    279             d.log_info(l1, 'EGGS')
    280             d.log_info(l2)
    281             d.log_info(l3, 'SPAM')
    282 
    283         lines = stdout.getvalue().splitlines()
    284         expected = ['EGGS: %s' % l1, 'info: %s' % l2, 'SPAM: %s' % l3]
    285         self.assertEqual(lines, expected)
    286 
    287     def test_unhandled(self):
    288         d = asyncore.dispatcher()
    289         d.ignore_log_types = ()
    290 
    291         # capture output of dispatcher.log_info() (to stdout via print)
    292         with support.captured_stdout() as stdout:
    293             d.handle_expt()
    294             d.handle_read()
    295             d.handle_write()
    296             d.handle_connect()
    297 
    298         lines = stdout.getvalue().splitlines()
    299         expected = ['warning: unhandled incoming priority event',
    300                     'warning: unhandled read event',
    301                     'warning: unhandled write event',
    302                     'warning: unhandled connect event']
    303         self.assertEqual(lines, expected)
    304 
    305     def test_strerror(self):
    306         # refers to bug #8573
    307         err = asyncore._strerror(errno.EPERM)
    308         if hasattr(os, 'strerror'):
    309             self.assertEqual(err, os.strerror(errno.EPERM))
    310         err = asyncore._strerror(-1)
    311         self.assertTrue(err != "")
    312 
    313 
    314 class dispatcherwithsend_noread(asyncore.dispatcher_with_send):
    315     def readable(self):
    316         return False
    317 
    318     def handle_connect(self):
    319         pass
    320 
    321 
    322 class DispatcherWithSendTests(unittest.TestCase):
    323     def setUp(self):
    324         pass
    325 
    326     def tearDown(self):
    327         asyncore.close_all()
    328 
    329     @unittest.skipUnless(threading, 'Threading required for this test.')
    330     @support.reap_threads
    331     def test_send(self):
    332         evt = threading.Event()
    333         sock = socket.socket()
    334         sock.settimeout(3)
    335         port = support.bind_port(sock)
    336 
    337         cap = BytesIO()
    338         args = (evt, cap, sock)
    339         t = threading.Thread(target=capture_server, args=args)
    340         t.start()
    341         try:
    342             # wait a little longer for the server to initialize (it sometimes
    343             # refuses connections on slow machines without this wait)
    344             time.sleep(0.2)
    345 
    346             data = b"Suppose there isn't a 16-ton weight?"
    347             d = dispatcherwithsend_noread()
    348             d.create_socket()
    349             d.connect((support.HOST, port))
    350 
    351             # give time for socket to connect
    352             time.sleep(0.1)
    353 
    354             d.send(data)
    355             d.send(data)
    356             d.send(b'\n')
    357 
    358             n = 1000
    359             while d.out_buffer and n > 0:
    360                 asyncore.poll()
    361                 n -= 1
    362 
    363             evt.wait()
    364 
    365             self.assertEqual(cap.getvalue(), data*2)
    366         finally:
    367             t.join(timeout=TIMEOUT)
    368             if t.is_alive():
    369                 self.fail("join() timed out")
    370 
    371 
    372 @unittest.skipUnless(hasattr(asyncore, 'file_wrapper'),
    373                      'asyncore.file_wrapper required')
    374 class FileWrapperTest(unittest.TestCase):
    375     def setUp(self):
    376         self.d = b"It's not dead, it's sleeping!"
    377         with open(support.TESTFN, 'wb') as file:
    378             file.write(self.d)
    379 
    380     def tearDown(self):
    381         support.unlink(support.TESTFN)
    382 
    383     def test_recv(self):
    384         fd = os.open(support.TESTFN, os.O_RDONLY)
    385         w = asyncore.file_wrapper(fd)
    386         os.close(fd)
    387 
    388         self.assertNotEqual(w.fd, fd)
    389         self.assertNotEqual(w.fileno(), fd)
    390         self.assertEqual(w.recv(13), b"It's not dead")
    391         self.assertEqual(w.read(6), b", it's")
    392         w.close()
    393         self.assertRaises(OSError, w.read, 1)
    394 
    395     def test_send(self):
    396         d1 = b"Come again?"
    397         d2 = b"I want to buy some cheese."
    398         fd = os.open(support.TESTFN, os.O_WRONLY | os.O_APPEND)
    399         w = asyncore.file_wrapper(fd)
    400         os.close(fd)
    401 
    402         w.write(d1)
    403         w.send(d2)
    404         w.close()
    405         with open(support.TESTFN, 'rb') as file:
    406             self.assertEqual(file.read(), self.d + d1 + d2)
    407 
    408     @unittest.skipUnless(hasattr(asyncore, 'file_dispatcher'),
    409                          'asyncore.file_dispatcher required')
    410     def test_dispatcher(self):
    411         fd = os.open(support.TESTFN, os.O_RDONLY)
    412         data = []
    413         class FileDispatcher(asyncore.file_dispatcher):
    414             def handle_read(self):
    415                 data.append(self.recv(29))
    416         s = FileDispatcher(fd)
    417         os.close(fd)
    418         asyncore.loop(timeout=0.01, use_poll=True, count=2)
    419         self.assertEqual(b"".join(data), self.d)
    420 
    421     def test_resource_warning(self):
    422         # Issue #11453
    423         fd = os.open(support.TESTFN, os.O_RDONLY)
    424         f = asyncore.file_wrapper(fd)
    425 
    426         os.close(fd)
    427         with support.check_warnings(('', ResourceWarning)):
    428             f = None
    429             support.gc_collect()
    430 
    431     def test_close_twice(self):
    432         fd = os.open(support.TESTFN, os.O_RDONLY)
    433         f = asyncore.file_wrapper(fd)
    434         os.close(fd)
    435 
    436         f.close()
    437         self.assertEqual(f.fd, -1)
    438         # calling close twice should not fail
    439         f.close()
    440 
    441 
    442 class BaseTestHandler(asyncore.dispatcher):
    443 
    444     def __init__(self, sock=None):
    445         asyncore.dispatcher.__init__(self, sock)
    446         self.flag = False
    447 
    448     def handle_accept(self):
    449         raise Exception("handle_accept not supposed to be called")
    450 
    451     def handle_accepted(self):
    452         raise Exception("handle_accepted not supposed to be called")
    453 
    454     def handle_connect(self):
    455         raise Exception("handle_connect not supposed to be called")
    456 
    457     def handle_expt(self):
    458         raise Exception("handle_expt not supposed to be called")
    459 
    460     def handle_close(self):
    461         raise Exception("handle_close not supposed to be called")
    462 
    463     def handle_error(self):
    464         raise
    465 
    466 
    467 class BaseServer(asyncore.dispatcher):
    468     """A server which listens on an address and dispatches the
    469     connection to a handler.
    470     """
    471 
    472     def __init__(self, family, addr, handler=BaseTestHandler):
    473         asyncore.dispatcher.__init__(self)
    474         self.create_socket(family)
    475         self.set_reuse_addr()
    476         bind_af_aware(self.socket, addr)
    477         self.listen(5)
    478         self.handler = handler
    479 
    480     @property
    481     def address(self):
    482         return self.socket.getsockname()
    483 
    484     def handle_accepted(self, sock, addr):
    485         self.handler(sock)
    486 
    487     def handle_error(self):
    488         raise
    489 
    490 
    491 class BaseClient(BaseTestHandler):
    492 
    493     def __init__(self, family, address):
    494         BaseTestHandler.__init__(self)
    495         self.create_socket(family)
    496         self.connect(address)
    497 
    498     def handle_connect(self):
    499         pass
    500 
    501 
    502 class BaseTestAPI:
    503 
    504     def tearDown(self):
    505         asyncore.close_all()
    506 
    507     def loop_waiting_for_flag(self, instance, timeout=5):
    508         timeout = float(timeout) / 100
    509         count = 100
    510         while asyncore.socket_map and count > 0:
    511             asyncore.loop(timeout=0.01, count=1, use_poll=self.use_poll)
    512             if instance.flag:
    513                 return
    514             count -= 1
    515             time.sleep(timeout)
    516         self.fail("flag not set")
    517 
    518     def test_handle_connect(self):
    519         # make sure handle_connect is called on connect()
    520 
    521         class TestClient(BaseClient):
    522             def handle_connect(self):
    523                 self.flag = True
    524 
    525         server = BaseServer(self.family, self.addr)
    526         client = TestClient(self.family, server.address)
    527         self.loop_waiting_for_flag(client)
    528 
    529     def test_handle_accept(self):
    530         # make sure handle_accept() is called when a client connects
    531 
    532         class TestListener(BaseTestHandler):
    533 
    534             def __init__(self, family, addr):
    535                 BaseTestHandler.__init__(self)
    536                 self.create_socket(family)
    537                 bind_af_aware(self.socket, addr)
    538                 self.listen(5)
    539                 self.address = self.socket.getsockname()
    540 
    541             def handle_accept(self):
    542                 self.flag = True
    543 
    544         server = TestListener(self.family, self.addr)
    545         client = BaseClient(self.family, server.address)
    546         self.loop_waiting_for_flag(server)
    547 
    548     def test_handle_accepted(self):
    549         # make sure handle_accepted() is called when a client connects
    550 
    551         class TestListener(BaseTestHandler):
    552 
    553             def __init__(self, family, addr):
    554                 BaseTestHandler.__init__(self)
    555                 self.create_socket(family)
    556                 bind_af_aware(self.socket, addr)
    557                 self.listen(5)
    558                 self.address = self.socket.getsockname()
    559 
    560             def handle_accept(self):
    561                 asyncore.dispatcher.handle_accept(self)
    562 
    563             def handle_accepted(self, sock, addr):
    564                 sock.close()
    565                 self.flag = True
    566 
    567         server = TestListener(self.family, self.addr)
    568         client = BaseClient(self.family, server.address)
    569         self.loop_waiting_for_flag(server)
    570 
    571 
    572     def test_handle_read(self):
    573         # make sure handle_read is called on data received
    574 
    575         class TestClient(BaseClient):
    576             def handle_read(self):
    577                 self.flag = True
    578 
    579         class TestHandler(BaseTestHandler):
    580             def __init__(self, conn):
    581                 BaseTestHandler.__init__(self, conn)
    582                 self.send(b'x' * 1024)
    583 
    584         server = BaseServer(self.family, self.addr, TestHandler)
    585         client = TestClient(self.family, server.address)
    586         self.loop_waiting_for_flag(client)
    587 
    588     def test_handle_write(self):
    589         # make sure handle_write is called
    590 
    591         class TestClient(BaseClient):
    592             def handle_write(self):
    593                 self.flag = True
    594 
    595         server = BaseServer(self.family, self.addr)
    596         client = TestClient(self.family, server.address)
    597         self.loop_waiting_for_flag(client)
    598 
    599     def test_handle_close(self):
    600         # make sure handle_close is called when the other end closes
    601         # the connection
    602 
    603         class TestClient(BaseClient):
    604 
    605             def handle_read(self):
    606                 # in order to make handle_close be called we are supposed
    607                 # to make at least one recv() call
    608                 self.recv(1024)
    609 
    610             def handle_close(self):
    611                 self.flag = True
    612                 self.close()
    613 
    614         class TestHandler(BaseTestHandler):
    615             def __init__(self, conn):
    616                 BaseTestHandler.__init__(self, conn)
    617                 self.close()
    618 
    619         server = BaseServer(self.family, self.addr, TestHandler)
    620         client = TestClient(self.family, server.address)
    621         self.loop_waiting_for_flag(client)
    622 
    623     def test_handle_close_after_conn_broken(self):
    624         # Check that ECONNRESET/EPIPE is correctly handled (issues #5661 and
    625         # #11265).
    626 
    627         data = b'\0' * 128
    628 
    629         class TestClient(BaseClient):
    630 
    631             def handle_write(self):
    632                 self.send(data)
    633 
    634             def handle_close(self):
    635                 self.flag = True
    636                 self.close()
    637 
    638             def handle_expt(self):
    639                 self.flag = True
    640                 self.close()
    641 
    642         class TestHandler(BaseTestHandler):
    643 
    644             def handle_read(self):
    645                 self.recv(len(data))
    646                 self.close()
    647 
    648             def writable(self):
    649                 return False
    650 
    651         server = BaseServer(self.family, self.addr, TestHandler)
    652         client = TestClient(self.family, server.address)
    653         self.loop_waiting_for_flag(client)
    654 
    655     @unittest.skipIf(sys.platform.startswith("sunos"),
    656                      "OOB support is broken on Solaris")
    657     def test_handle_expt(self):
    658         # Make sure handle_expt is called on OOB data received.
    659         # Note: this might fail on some platforms as OOB data is
    660         # tenuously supported and rarely used.
    661         if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX:
    662             self.skipTest("Not applicable to AF_UNIX sockets.")
    663 
    664         if sys.platform == "darwin" and self.use_poll:
    665             self.skipTest("poll may fail on macOS; see issue #28087")
    666 
    667         class TestClient(BaseClient):
    668             def handle_expt(self):
    669                 self.socket.recv(1024, socket.MSG_OOB)
    670                 self.flag = True
    671 
    672         class TestHandler(BaseTestHandler):
    673             def __init__(self, conn):
    674                 BaseTestHandler.__init__(self, conn)
    675                 self.socket.send(bytes(chr(244), 'latin-1'), socket.MSG_OOB)
    676 
    677         server = BaseServer(self.family, self.addr, TestHandler)
    678         client = TestClient(self.family, server.address)
    679         self.loop_waiting_for_flag(client)
    680 
    681     def test_handle_error(self):
    682 
    683         class TestClient(BaseClient):
    684             def handle_write(self):
    685                 1.0 / 0
    686             def handle_error(self):
    687                 self.flag = True
    688                 try:
    689                     raise
    690                 except ZeroDivisionError:
    691                     pass
    692                 else:
    693                     raise Exception("exception not raised")
    694 
    695         server = BaseServer(self.family, self.addr)
    696         client = TestClient(self.family, server.address)
    697         self.loop_waiting_for_flag(client)
    698 
    699     def test_connection_attributes(self):
    700         server = BaseServer(self.family, self.addr)
    701         client = BaseClient(self.family, server.address)
    702 
    703         # we start disconnected
    704         self.assertFalse(server.connected)
    705         self.assertTrue(server.accepting)
    706         # this can't be taken for granted across all platforms
    707         #self.assertFalse(client.connected)
    708         self.assertFalse(client.accepting)
    709 
    710         # execute some loops so that client connects to server
    711         asyncore.loop(timeout=0.01, use_poll=self.use_poll, count=100)
    712         self.assertFalse(server.connected)
    713         self.assertTrue(server.accepting)
    714         self.assertTrue(client.connected)
    715         self.assertFalse(client.accepting)
    716 
    717         # disconnect the client
    718         client.close()
    719         self.assertFalse(server.connected)
    720         self.assertTrue(server.accepting)
    721         self.assertFalse(client.connected)
    722         self.assertFalse(client.accepting)
    723 
    724         # stop serving
    725         server.close()
    726         self.assertFalse(server.connected)
    727         self.assertFalse(server.accepting)
    728 
    729     def test_create_socket(self):
    730         s = asyncore.dispatcher()
    731         s.create_socket(self.family)
    732         self.assertEqual(s.socket.family, self.family)
    733         SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
    734         sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK
    735         if hasattr(socket, 'SOCK_CLOEXEC'):
    736             self.assertIn(s.socket.type,
    737                           (sock_type | socket.SOCK_CLOEXEC, sock_type))
    738         else:
    739             self.assertEqual(s.socket.type, sock_type)
    740 
    741     def test_bind(self):
    742         if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX:
    743             self.skipTest("Not applicable to AF_UNIX sockets.")
    744         s1 = asyncore.dispatcher()
    745         s1.create_socket(self.family)
    746         s1.bind(self.addr)
    747         s1.listen(5)
    748         port = s1.socket.getsockname()[1]
    749 
    750         s2 = asyncore.dispatcher()
    751         s2.create_socket(self.family)
    752         # EADDRINUSE indicates the socket was correctly bound
    753         self.assertRaises(OSError, s2.bind, (self.addr[0], port))
    754 
    755     def test_set_reuse_addr(self):
    756         if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX:
    757             self.skipTest("Not applicable to AF_UNIX sockets.")
    758         sock = socket.socket(self.family)
    759         try:
    760             sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    761         except OSError:
    762             unittest.skip("SO_REUSEADDR not supported on this platform")
    763         else:
    764             # if SO_REUSEADDR succeeded for sock we expect asyncore
    765             # to do the same
    766             s = asyncore.dispatcher(socket.socket(self.family))
    767             self.assertFalse(s.socket.getsockopt(socket.SOL_SOCKET,
    768                                                  socket.SO_REUSEADDR))
    769             s.socket.close()
    770             s.create_socket(self.family)
    771             s.set_reuse_addr()
    772             self.assertTrue(s.socket.getsockopt(socket.SOL_SOCKET,
    773                                                  socket.SO_REUSEADDR))
    774         finally:
    775             sock.close()
    776 
    777     @unittest.skipUnless(threading, 'Threading required for this test.')
    778     @support.reap_threads
    779     def test_quick_connect(self):
    780         # see: http://bugs.python.org/issue10340
    781         if self.family in (socket.AF_INET, getattr(socket, "AF_INET6", object())):
    782             server = BaseServer(self.family, self.addr)
    783             t = threading.Thread(target=lambda: asyncore.loop(timeout=0.1,
    784                                                               count=500))
    785             t.start()
    786             def cleanup():
    787                 t.join(timeout=TIMEOUT)
    788                 if t.is_alive():
    789                     self.fail("join() timed out")
    790             self.addCleanup(cleanup)
    791 
    792             s = socket.socket(self.family, socket.SOCK_STREAM)
    793             s.settimeout(.2)
    794             s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
    795                          struct.pack('ii', 1, 0))
    796             try:
    797                 s.connect(server.address)
    798             except OSError:
    799                 pass
    800             finally:
    801                 s.close()
    802 
    803 class TestAPI_UseIPv4Sockets(BaseTestAPI):
    804     family = socket.AF_INET
    805     addr = (support.HOST, 0)
    806 
    807 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 support required')
    808 class TestAPI_UseIPv6Sockets(BaseTestAPI):
    809     family = socket.AF_INET6
    810     addr = (support.HOSTv6, 0)
    811 
    812 @unittest.skipUnless(HAS_UNIX_SOCKETS, 'Unix sockets required')
    813 class TestAPI_UseUnixSockets(BaseTestAPI):
    814     if HAS_UNIX_SOCKETS:
    815         family = socket.AF_UNIX
    816     addr = support.TESTFN
    817 
    818     def tearDown(self):
    819         support.unlink(self.addr)
    820         BaseTestAPI.tearDown(self)
    821 
    822 class TestAPI_UseIPv4Select(TestAPI_UseIPv4Sockets, unittest.TestCase):
    823     use_poll = False
    824 
    825 @unittest.skipUnless(hasattr(select, 'poll'), 'select.poll required')
    826 class TestAPI_UseIPv4Poll(TestAPI_UseIPv4Sockets, unittest.TestCase):
    827     use_poll = True
    828 
    829 class TestAPI_UseIPv6Select(TestAPI_UseIPv6Sockets, unittest.TestCase):
    830     use_poll = False
    831 
    832 @unittest.skipUnless(hasattr(select, 'poll'), 'select.poll required')
    833 class TestAPI_UseIPv6Poll(TestAPI_UseIPv6Sockets, unittest.TestCase):
    834     use_poll = True
    835 
    836 class TestAPI_UseUnixSocketsSelect(TestAPI_UseUnixSockets, unittest.TestCase):
    837     use_poll = False
    838 
    839 @unittest.skipUnless(hasattr(select, 'poll'), 'select.poll required')
    840 class TestAPI_UseUnixSocketsPoll(TestAPI_UseUnixSockets, unittest.TestCase):
    841     use_poll = True
    842 
    843 if __name__ == "__main__":
    844     unittest.main()
    845