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_asynchat.py

    r2 r391  
    1 # test asynchat -- requires threading
    2 
    3 import thread # If this fails, we can't test this module
    4 import asyncore, asynchat, socket, threading, time
     1# test asynchat
     2
     3import asyncore, asynchat, socket, time
    54import unittest
    65import sys
    76from test import test_support
     7try:
     8    import threading
     9except ImportError:
     10    threading = None
    811
    912HOST = test_support.HOST
    1013SERVER_QUIT = 'QUIT\n'
    1114
    12 class echo_server(threading.Thread):
    13     # parameter to determine the number of bytes passed back to the
    14     # client each send
    15     chunk_size = 1
    16 
    17     def __init__(self, event):
    18         threading.Thread.__init__(self)
    19         self.event = event
    20         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    21         self.port = test_support.bind_port(self.sock)
    22 
    23     def run(self):
    24         self.sock.listen(1)
    25         self.event.set()
    26         conn, client = self.sock.accept()
    27         self.buffer = ""
    28         # collect data until quit message is seen
    29         while SERVER_QUIT not in self.buffer:
    30             data = conn.recv(1)
    31             if not data:
    32                 break
    33             self.buffer = self.buffer + data
    34 
    35         # remove the SERVER_QUIT message
    36         self.buffer = self.buffer.replace(SERVER_QUIT, '')
    37 
    38         # re-send entire set of collected data
    39         try:
    40             # this may fail on some tests, such as test_close_when_done, since
    41             # the client closes the channel when it's done sending
    42             while self.buffer:
    43                 n = conn.send(self.buffer[:self.chunk_size])
    44                 time.sleep(0.001)
    45                 self.buffer = self.buffer[n:]
    46         except:
     15if threading:
     16    class echo_server(threading.Thread):
     17        # parameter to determine the number of bytes passed back to the
     18        # client each send
     19        chunk_size = 1
     20
     21        def __init__(self, event):
     22            threading.Thread.__init__(self)
     23            self.event = event
     24            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     25            self.port = test_support.bind_port(self.sock)
     26            # This will be set if the client wants us to wait before echoing data
     27            # back.
     28            self.start_resend_event = None
     29
     30        def run(self):
     31            self.sock.listen(1)
     32            self.event.set()
     33            conn, client = self.sock.accept()
     34            self.buffer = ""
     35            # collect data until quit message is seen
     36            while SERVER_QUIT not in self.buffer:
     37                data = conn.recv(1)
     38                if not data:
     39                    break
     40                self.buffer = self.buffer + data
     41
     42            # remove the SERVER_QUIT message
     43            self.buffer = self.buffer.replace(SERVER_QUIT, '')
     44
     45            if self.start_resend_event:
     46                self.start_resend_event.wait()
     47
     48            # re-send entire set of collected data
     49            try:
     50                # this may fail on some tests, such as test_close_when_done, since
     51                # the client closes the channel when it's done sending
     52                while self.buffer:
     53                    n = conn.send(self.buffer[:self.chunk_size])
     54                    time.sleep(0.001)
     55                    self.buffer = self.buffer[n:]
     56            except:
     57                pass
     58
     59            conn.close()
     60            self.sock.close()
     61
     62    class echo_client(asynchat.async_chat):
     63
     64        def __init__(self, terminator, server_port):
     65            asynchat.async_chat.__init__(self)
     66            self.contents = []
     67            self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
     68            self.connect((HOST, server_port))
     69            self.set_terminator(terminator)
     70            self.buffer = ''
     71
     72        def handle_connect(self):
    4773            pass
    4874
    49         conn.close()
    50         self.sock.close()
    51 
    52 class echo_client(asynchat.async_chat):
    53 
    54     def __init__(self, terminator, server_port):
    55         asynchat.async_chat.__init__(self)
    56         self.contents = []
    57         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
    58         self.connect((HOST, server_port))
    59         self.set_terminator(terminator)
    60         self.buffer = ''
    61 
    62     def handle_connect(self):
    63         pass
    64 
    65     if sys.platform == 'darwin':
    66         # select.poll returns a select.POLLHUP at the end of the tests
    67         # on darwin, so just ignore it
    68         def handle_expt(self):
    69             pass
    70 
    71     def collect_incoming_data(self, data):
    72         self.buffer += data
    73 
    74     def found_terminator(self):
    75         self.contents.append(self.buffer)
    76         self.buffer = ""
    77 
    78 
    79 def start_echo_server():
    80     event = threading.Event()
    81     s = echo_server(event)
    82     s.start()
    83     event.wait()
    84     event.clear()
    85     time.sleep(0.01) # Give server time to start accepting.
    86     return s, event
    87 
    88 
     75        if sys.platform == 'darwin':
     76            # select.poll returns a select.POLLHUP at the end of the tests
     77            # on darwin, so just ignore it
     78            def handle_expt(self):
     79                pass
     80
     81        def collect_incoming_data(self, data):
     82            self.buffer += data
     83
     84        def found_terminator(self):
     85            self.contents.append(self.buffer)
     86            self.buffer = ""
     87
     88
     89    def start_echo_server():
     90        event = threading.Event()
     91        s = echo_server(event)
     92        s.start()
     93        event.wait()
     94        event.clear()
     95        time.sleep(0.01) # Give server time to start accepting.
     96        return s, event
     97
     98
     99@unittest.skipUnless(threading, 'Threading required for this test.')
    89100class TestAsynchat(unittest.TestCase):
    90101    usepoll = False
    91102
    92103    def setUp (self):
    93         pass
     104        self._threads = test_support.threading_setup()
    94105
    95106    def tearDown (self):
    96         pass
     107        test_support.threading_cleanup(*self._threads)
    97108
    98109    def line_terminator_check(self, term, server_chunk):
     
    201212    def test_close_when_done(self):
    202213        s, event = start_echo_server()
     214        s.start_resend_event = threading.Event()
    203215        c = echo_client('\n', s.port)
    204216        c.push("hello world\nI'm not dead yet!\n")
     
    206218        c.close_when_done()
    207219        asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
     220
     221        # Only allow the server to start echoing data back to the client after
     222        # the client has closed its connection.  This prevents a race condition
     223        # where the server echoes all of its data before we can check that it
     224        # got any down below.
     225        s.start_resend_event.set()
    208226        s.join()
    209227
Note: See TracChangeset for help on using the changeset viewer.