Kaydet (Commit) 09227b91 authored tarafından Victor Stinner's avatar Victor Stinner

Issue #7449, part 8: don't skip the whole test_asynchat if threading is missing

TestFifo can be executed without the threading module
üst be595d33
# test asynchat # test asynchat
import asyncore, asynchat, socket, threading, time import asyncore, asynchat, socket, time
import unittest import unittest
import sys import sys
from test import test_support from test import test_support
try:
# Skip tests if thread module does not exist. import threading
test_support.import_module('thread') except ImportError:
threading = None
HOST = test_support.HOST HOST = test_support.HOST
SERVER_QUIT = 'QUIT\n' SERVER_QUIT = 'QUIT\n'
class echo_server(threading.Thread): if threading:
# parameter to determine the number of bytes passed back to the class echo_server(threading.Thread):
# client each send # parameter to determine the number of bytes passed back to the
chunk_size = 1 # client each send
chunk_size = 1
def __init__(self, event):
threading.Thread.__init__(self) def __init__(self, event):
self.event = event threading.Thread.__init__(self)
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.event = event
self.port = test_support.bind_port(self.sock) self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# This will be set if the client wants us to wait before echoing data self.port = test_support.bind_port(self.sock)
# back. # This will be set if the client wants us to wait before echoing data
self.start_resend_event = None # back.
self.start_resend_event = None
def run(self):
self.sock.listen(1) def run(self):
self.event.set() self.sock.listen(1)
conn, client = self.sock.accept() self.event.set()
self.buffer = "" conn, client = self.sock.accept()
# collect data until quit message is seen self.buffer = ""
while SERVER_QUIT not in self.buffer: # collect data until quit message is seen
data = conn.recv(1) while SERVER_QUIT not in self.buffer:
if not data: data = conn.recv(1)
break if not data:
self.buffer = self.buffer + data break
self.buffer = self.buffer + data
# remove the SERVER_QUIT message
self.buffer = self.buffer.replace(SERVER_QUIT, '') # remove the SERVER_QUIT message
self.buffer = self.buffer.replace(SERVER_QUIT, '')
if self.start_resend_event:
self.start_resend_event.wait() if self.start_resend_event:
self.start_resend_event.wait()
# re-send entire set of collected data
try: # re-send entire set of collected data
# this may fail on some tests, such as test_close_when_done, since try:
# the client closes the channel when it's done sending # this may fail on some tests, such as test_close_when_done, since
while self.buffer: # the client closes the channel when it's done sending
n = conn.send(self.buffer[:self.chunk_size]) while self.buffer:
time.sleep(0.001) n = conn.send(self.buffer[:self.chunk_size])
self.buffer = self.buffer[n:] time.sleep(0.001)
except: self.buffer = self.buffer[n:]
except:
pass
conn.close()
self.sock.close()
class echo_client(asynchat.async_chat):
def __init__(self, terminator, server_port):
asynchat.async_chat.__init__(self)
self.contents = []
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((HOST, server_port))
self.set_terminator(terminator)
self.buffer = ''
def handle_connect(self):
pass pass
conn.close() if sys.platform == 'darwin':
self.sock.close() # select.poll returns a select.POLLHUP at the end of the tests
# on darwin, so just ignore it
class echo_client(asynchat.async_chat): def handle_expt(self):
pass
def __init__(self, terminator, server_port):
asynchat.async_chat.__init__(self)
self.contents = []
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((HOST, server_port))
self.set_terminator(terminator)
self.buffer = ''
def handle_connect(self):
pass
if sys.platform == 'darwin':
# select.poll returns a select.POLLHUP at the end of the tests
# on darwin, so just ignore it
def handle_expt(self):
pass
def collect_incoming_data(self, data): def collect_incoming_data(self, data):
self.buffer += data self.buffer += data
def found_terminator(self): def found_terminator(self):
self.contents.append(self.buffer) self.contents.append(self.buffer)
self.buffer = "" self.buffer = ""
def start_echo_server(): def start_echo_server():
event = threading.Event() event = threading.Event()
s = echo_server(event) s = echo_server(event)
s.start() s.start()
event.wait() event.wait()
event.clear() event.clear()
time.sleep(0.01) # Give server time to start accepting. time.sleep(0.01) # Give server time to start accepting.
return s, event return s, event
@unittest.skipUnless(threading, 'Threading required for this test.')
class TestAsynchat(unittest.TestCase): class TestAsynchat(unittest.TestCase):
usepoll = False usepoll = False
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment