diff options
author | Martin Panter <vadmium+py@gmail.com> | 2016-08-20 06:50:58 (GMT) |
---|---|---|
committer | Martin Panter <vadmium+py@gmail.com> | 2016-08-20 06:50:58 (GMT) |
commit | d874c0554740ae15db22f51c4be4d4f5fef5a6fa (patch) | |
tree | 9c488d5a98d4835676da1e57d9cc87534a9bb10c | |
parent | 68c1f1ed034bc0084596e19540910623ecbf64de (diff) | |
download | cpython-d874c0554740ae15db22f51c4be4d4f5fef5a6fa.zip cpython-d874c0554740ae15db22f51c4be4d4f5fef5a6fa.tar.gz cpython-d874c0554740ae15db22f51c4be4d4f5fef5a6fa.tar.bz2 |
Issue #27614: Avoid race in test_docxmlrpc server setup
-rw-r--r-- | Lib/test/test_docxmlrpc.py | 41 |
1 files changed, 11 insertions, 30 deletions
diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py index 15a4ae2..0090333 100644 --- a/Lib/test/test_docxmlrpc.py +++ b/Lib/test/test_docxmlrpc.py @@ -3,12 +3,8 @@ import http.client import sys from test import support threading = support.import_module('threading') -import time -import socket import unittest -PORT = None - def make_request_and_skipIf(condition, reason): # If we skip the test, we have to make a request because # the server created in setUp blocks expecting one to come in. @@ -23,13 +19,10 @@ def make_request_and_skipIf(condition, reason): return decorator -def server(evt, numrequests): +def make_server(): serv = DocXMLRPCServer(("localhost", 0), logRequests=False) try: - global PORT - PORT = serv.socket.getsockname()[1] - # Add some documentation serv.set_server_title("DocXMLRPCServer Test Documentation") serv.set_server_name("DocXMLRPCServer Test Docs") @@ -66,43 +59,31 @@ def server(evt, numrequests): serv.register_function(lambda x, y: x-y) serv.register_function(annotation) serv.register_instance(ClassWithAnnotation()) - - while numrequests > 0: - serv.handle_request() - numrequests -= 1 - except socket.timeout: - pass - finally: + return serv + except: serv.server_close() - PORT = None - evt.set() + raise class DocXMLRPCHTTPGETServer(unittest.TestCase): def setUp(self): - self._threads = support.threading_setup() # Enable server feedback DocXMLRPCServer._send_traceback_header = True - self.evt = threading.Event() - threading.Thread(target=server, args=(self.evt, 1)).start() - - # wait for port to be assigned - deadline = time.monotonic() + 10.0 - while PORT is None: - time.sleep(0.010) - if time.monotonic() > deadline: - break + self.serv = make_server() + self.thread = threading.Thread(target=self.serv.serve_forever) + self.thread.start() + PORT = self.serv.server_address[1] self.client = http.client.HTTPConnection("localhost:%d" % PORT) def tearDown(self): self.client.close() - self.evt.wait() - # Disable server feedback DocXMLRPCServer._send_traceback_header = False - support.threading_cleanup(*self._threads) + self.serv.shutdown() + self.thread.join() + self.serv.server_close() def test_valid_get_response(self): self.client.request("GET", "/") |