diff --git a/graalpython/com.oracle.graal.python.test/src/runner.py b/graalpython/com.oracle.graal.python.test/src/runner.py index 5c4b524eab..8e3589f00d 100644 --- a/graalpython/com.oracle.graal.python.test/src/runner.py +++ b/graalpython/com.oracle.graal.python.test/src/runner.py @@ -1310,7 +1310,7 @@ def _recv(self, size): while len(data) < size: read = self.socket.recv(size - len(data)) if not read: - return data + raise ConnectionClosed data += read return data diff --git a/graalpython/lib-python/3/test/test_docxmlrpc.py b/graalpython/lib-python/3/test/test_docxmlrpc.py index 2ad422079b..96352ab753 100644 --- a/graalpython/lib-python/3/test/test_docxmlrpc.py +++ b/graalpython/lib-python/3/test/test_docxmlrpc.py @@ -8,6 +8,10 @@ support.requires_working_socket(module=True) +# Begin: GraalPy change +SERVER_TIMEOUT = support.LOOPBACK_TIMEOUT +# End: GraalPy Change + 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. @@ -85,7 +89,11 @@ def tearDown(self): # Disable server feedback DocXMLRPCServer._send_traceback_header = False self.serv.shutdown() - self.thread.join() + # Begin: GraalPy change + # self.thread.join() + self.thread.join(SERVER_TIMEOUT) + self.assertFalse(self.thread.is_alive(), "DocXMLRPC server thread did not stop") + # End: GraalPy Change self.serv.server_close() def test_valid_get_response(self): diff --git a/graalpython/lib-python/3/test/test_httpservers.py b/graalpython/lib-python/3/test/test_httpservers.py index 88d06fe04f..78a6145cda 100644 --- a/graalpython/lib-python/3/test/test_httpservers.py +++ b/graalpython/lib-python/3/test/test_httpservers.py @@ -36,6 +36,10 @@ support.requires_working_socket(module=True) +# Begin: GraalPy change +SERVER_TIMEOUT = support.LOOPBACK_TIMEOUT +# End: GraalPy Change + class NoLogRequestHandler: def log_message(self, *args): # don't write log messages to stderr @@ -63,7 +67,12 @@ def run(self): def stop(self): self.server.shutdown() - self.join() + # Begin: GraalPy change + # self.join() + self.join(SERVER_TIMEOUT) + if self.is_alive(): + raise AssertionError("HTTP server thread did not stop") + # End: GraalPy Change class BaseTestCase(unittest.TestCase): @@ -73,7 +82,10 @@ def setUp(self): self.server_started = threading.Event() self.thread = TestServerThread(self, self.request_handler) self.thread.start() - self.server_started.wait() + # Begin: GraalPy change + # self.server_started.wait() + self.assertTrue(self.server_started.wait(SERVER_TIMEOUT), "HTTP server did not start") + # End: GraalPy Change def tearDown(self): self.thread.stop() @@ -322,7 +334,13 @@ class request_handler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(HTTPStatus.OK) + # Begin: GraalPy change + # self.end_headers() + self.send_header('Content-Length', '0') + self.send_header('Connection', 'close') self.end_headers() + self.close_connection = True + # End: GraalPy Change def do_ERROR(self): self.send_error(HTTPStatus.NOT_FOUND, 'File not found') diff --git a/graalpython/lib-python/3/test/test_xmlrpc.py b/graalpython/lib-python/3/test/test_xmlrpc.py index 7f517dc7c1..cf694b8ea1 100644 --- a/graalpython/lib-python/3/test/test_xmlrpc.py +++ b/graalpython/lib-python/3/test/test_xmlrpc.py @@ -313,12 +313,19 @@ def test_ssl_presence(self): has_ssl = False else: has_ssl = True + # Begin: GraalPy change + old_timeout = socket.getdefaulttimeout() try: + # xmlrpc.client.ServerProxy('https://localhost:9999').bad_function() + socket.setdefaulttimeout(SSL_PROBE_TIMEOUT) xmlrpc.client.ServerProxy('https://localhost:9999').bad_function() except NotImplementedError: self.assertFalse(has_ssl, "xmlrpc client's error with SSL support") except OSError: self.assertTrue(has_ssl) + finally: + socket.setdefaulttimeout(old_timeout) + # End: GraalPy Change def test_keepalive_disconnect(self): class RequestHandler(http.server.BaseHTTPRequestHandler): @@ -599,6 +606,10 @@ def test_decode(self): ADDR = PORT = URL = None +# Begin: GraalPy change +SERVER_TIMEOUT = support.LOOPBACK_TIMEOUT +SSL_PROBE_TIMEOUT = 1.0 +# End: GraalPy Change # The evt is set twice. First when the server is ready to serve. # Second when the server has been shutdown. The user must clear @@ -630,6 +641,9 @@ def get_request(self): serv = MyXMLRPCServer(("localhost", 0), requestHandler, encoding=encoding, logRequests=False, bind_and_activate=False) + # Begin: GraalPy change + serv.socket.settimeout(SERVER_TIMEOUT) + # End: GraalPy Change try: serv.server_bind() global ADDR, PORT, URL @@ -785,16 +799,34 @@ def setUp(self): # start server thread to handle requests serv_args = (self.evt, self.request_count, self.requestHandler) thread = threading.Thread(target=self.threadFunc, args=serv_args) + # Begin: GraalPy change + self.thread = thread + # End: GraalPy Change thread.start() - self.addCleanup(thread.join) + # Begin: GraalPy change + # self.addCleanup(thread.join) + self.addCleanup(self._join_server_thread) + # End: GraalPy Change # wait for the server to be ready - self.evt.wait() + # Begin: GraalPy change + # self.evt.wait() + self.assertTrue(self.evt.wait(SERVER_TIMEOUT), "XML-RPC server did not start") + # End: GraalPy Change self.evt.clear() + # Begin: GraalPy change + def _join_server_thread(self): + self.thread.join(SERVER_TIMEOUT) + self.assertFalse(self.thread.is_alive(), "XML-RPC server thread did not stop") + # End: GraalPy Change + def tearDown(self): # wait on the server thread to terminate - self.evt.wait() + # Begin: GraalPy change + # self.evt.wait() + self.assertTrue(self.evt.wait(SERVER_TIMEOUT), "XML-RPC server did not stop") + # End: GraalPy Change # disable traceback reporting xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = False @@ -1339,16 +1371,34 @@ def setUp(self): # start server thread to handle requests serv_args = (self.evt, 1) thread = threading.Thread(target=http_server, args=serv_args) + # Begin: GraalPy change + self.thread = thread + # End: GraalPy Change thread.start() - self.addCleanup(thread.join) + # Begin: GraalPy change + # self.addCleanup(thread.join) + self.addCleanup(self._join_server_thread) + # End: GraalPy Change # wait for the server to be ready - self.evt.wait() + # Begin: GraalPy change + # self.evt.wait() + self.assertTrue(self.evt.wait(SERVER_TIMEOUT), "XML-RPC server did not start") + # End: GraalPy Change self.evt.clear() + # Begin: GraalPy change + def _join_server_thread(self): + self.thread.join(SERVER_TIMEOUT) + self.assertFalse(self.thread.is_alive(), "XML-RPC server thread did not stop") + # End: GraalPy Change + def tearDown(self): # wait on the server thread to terminate - self.evt.wait() + # Begin: GraalPy change + # self.evt.wait() + self.assertTrue(self.evt.wait(SERVER_TIMEOUT), "XML-RPC server did not stop") + # End: GraalPy Change # reset flag xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = False # reset message class