Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/test/test_socketserver.py

    r2 r391  
    44
    55import contextlib
    6 import errno
    76import imp
    87import os
     
    109import signal
    1110import socket
     11import select
     12import errno
    1213import tempfile
    13 import threading
    14 import time
    1514import unittest
    1615import SocketServer
    1716
    1817import test.test_support
    19 from test.test_support import reap_children, verbose, TestSkipped
    20 from test.test_support import TESTFN as TEST_FILE
     18from test.test_support import reap_children, reap_threads, verbose
     19try:
     20    import threading
     21except ImportError:
     22    threading = None
    2123
    2224test.test_support.requires("network")
     
    3335        signal.alarm(n)
    3436
     37# Remember real select() to avoid interferences with mocking
     38_real_select = select.select
     39
    3540def receive(sock, n, timeout=20):
    36     r, w, x = select.select([sock], [], [], timeout)
     41    r, w, x = _real_select([sock], [], [], timeout)
    3742    if sock in r:
    3843        return sock.recv(n)
     
    5459    pid = os.fork()
    5560    if pid == 0:
    56         # Don't throw an exception; it would be caught by the test harness.
     61        # Don't raise an exception; it would be caught by the test harness.
    5762        os._exit(72)
    5863    yield None
    5964    pid2, status = os.waitpid(pid, 0)
    60     testcase.assertEquals(pid2, pid)
    61     testcase.assertEquals(72 << 8, status)
    62 
    63 
     65    testcase.assertEqual(pid2, pid)
     66    testcase.assertEqual(72 << 8, status)
     67
     68
     69@unittest.skipUnless(threading, 'Threading required for this test.')
    6470class SocketServerTest(unittest.TestCase):
    6571    """Test all socket servers."""
    6672
    6773    def setUp(self):
    68         signal_alarm(20)  # Kill deadlocks after 20 seconds.
     74        signal_alarm(60)  # Kill deadlocks after 60 seconds.
    6975        self.port_seed = 0
    7076        self.test_files = []
     
    120126        if verbose: print "creating server"
    121127        server = MyServer(addr, MyHandler)
    122         self.assertEquals(server.server_address, server.socket.getsockname())
     128        self.assertEqual(server.server_address, server.socket.getsockname())
    123129        return server
    124130
     131    @reap_threads
    125132    def run_server(self, svrcls, hdlrbase, testfunc):
    126133        server = self.make_server(self.pickaddr(svrcls.address_family),
     
    159166            data = receive(s, 100)
    160167            buf += data
    161         self.assertEquals(buf, TEST_STR)
     168        self.assertEqual(buf, TEST_STR)
    162169        s.close()
    163170
     
    169176            data = receive(s, 100)
    170177            buf += data
    171         self.assertEquals(buf, TEST_STR)
     178        self.assertEqual(buf, TEST_STR)
    172179        s.close()
    173180
     
    223230                                SocketServer.DatagramRequestHandler,
    224231                                self.dgram_examine)
     232
     233    @contextlib.contextmanager
     234    def mocked_select_module(self):
     235        """Mocks the select.select() call to raise EINTR for first call"""
     236        old_select = select.select
     237
     238        class MockSelect:
     239            def __init__(self):
     240                self.called = 0
     241
     242            def __call__(self, *args):
     243                self.called += 1
     244                if self.called == 1:
     245                    # raise the exception on first call
     246                    raise select.error(errno.EINTR, os.strerror(errno.EINTR))
     247                else:
     248                    # Return real select value for consecutive calls
     249                    return old_select(*args)
     250
     251        select.select = MockSelect()
     252        try:
     253            yield select.select
     254        finally:
     255            select.select = old_select
     256
     257    def test_InterruptServerSelectCall(self):
     258        with self.mocked_select_module() as mock_select:
     259            pid = self.run_server(SocketServer.TCPServer,
     260                                  SocketServer.StreamRequestHandler,
     261                                  self.stream_examine)
     262            # Make sure select was called again:
     263            self.assertGreater(mock_select.called, 1)
    225264
    226265    # Alas, on Linux (at least) recvfrom() doesn't return a meaningful
     
    244283    #                             self.dgram_examine)
    245284
     285    @reap_threads
     286    def test_shutdown(self):
     287        # Issue #2302: shutdown() should always succeed in making an
     288        # other thread leave serve_forever().
     289        class MyServer(SocketServer.TCPServer):
     290            pass
     291
     292        class MyHandler(SocketServer.StreamRequestHandler):
     293            pass
     294
     295        threads = []
     296        for i in range(20):
     297            s = MyServer((HOST, 0), MyHandler)
     298            t = threading.Thread(
     299                name='MyServer serving',
     300                target=s.serve_forever,
     301                kwargs={'poll_interval':0.01})
     302            t.daemon = True  # In case this function raises.
     303            threads.append((t, s))
     304        for t, s in threads:
     305            t.start()
     306            s.shutdown()
     307        for t, s in threads:
     308            t.join()
     309
    246310
    247311def test_main():
    248312    if imp.lock_held():
    249313        # If the import lock is held, the threads will hang
    250         raise TestSkipped("can't run when import lock is held")
     314        raise unittest.SkipTest("can't run when import lock is held")
    251315
    252316    test.test_support.run_unittest(SocketServerTest)
     
    254318if __name__ == "__main__":
    255319    test_main()
    256     signal_alarm(3)  # Shutdown shouldn't take more than 3 seconds.
Note: See TracChangeset for help on using the changeset viewer.