◐ Shell
clean mode source ↗

[3.6] bpo-33540, socketserver: Add _block_on_close for tests by vstinner · Pull Request #7317 · python/cpython

Expand Up @@ -48,11 +48,11 @@ def receive(sock, n, timeout=20): if HAVE_UNIX_SOCKETS and HAVE_FORKING: class ForkingUnixStreamServer(socketserver.ForkingMixIn, socketserver.UnixStreamServer): pass _block_on_close = True
class ForkingUnixDatagramServer(socketserver.ForkingMixIn, socketserver.UnixDatagramServer): pass _block_on_close = True

@contextlib.contextmanager Expand All @@ -62,24 +62,14 @@ def simple_subprocess(testcase): if pid == 0: # Don't raise an exception; it would be caught by the test harness. os._exit(72) yield None pid2, status = os.waitpid(pid, 0) testcase.assertEqual(pid2, pid) testcase.assertEqual(72 << 8, status)

def close_server(server): server.server_close()
if hasattr(server, 'active_children'): # ForkingMixIn: Manually reap all child processes, since server_close() # calls waitpid() in non-blocking mode using the WNOHANG flag. for pid in server.active_children.copy(): try: os.waitpid(pid, 0) except ChildProcessError: pass server.active_children.clear() try: yield None except: raise finally: pid2, status = os.waitpid(pid, 0) testcase.assertEqual(pid2, pid) testcase.assertEqual(72 << 8, status)

@unittest.skipUnless(threading, 'Threading required for this test.') Expand Down Expand Up @@ -115,6 +105,8 @@ def pickaddr(self, proto):
def make_server(self, addr, svrcls, hdlrbase): class MyServer(svrcls): _block_on_close = True
def handle_error(self, request, client_address): self.close_request(request) raise Expand Down Expand Up @@ -156,8 +148,12 @@ def run_server(self, svrcls, hdlrbase, testfunc): if verbose: print("waiting for server") server.shutdown() t.join() close_server(server) server.server_close() self.assertEqual(-1, server.socket.fileno()) if HAVE_FORKING and isinstance(server, socketserver.ForkingMixIn): # bpo-31151: Check that ForkingMixIn.server_close() waits until # all children completed self.assertFalse(server.active_children) if verbose: print("done")
def stream_examine(self, proto, addr): Expand Down Expand Up @@ -280,7 +276,7 @@ class MyHandler(socketserver.StreamRequestHandler): s.shutdown() for t, s in threads: t.join() close_server(s) s.server_close()
def test_tcpserver_bind_leak(self): # Issue #22435: the server socket wouldn't be closed if bind()/listen() Expand Down Expand Up @@ -344,6 +340,8 @@ def check_result(self, handled):

class BaseErrorTestServer(socketserver.TCPServer): _block_on_close = True
def __init__(self, exception): self.exception = exception super().__init__((HOST, 0), BadHandler) Expand All @@ -352,7 +350,7 @@ def __init__(self, exception): try: self.handle_request() finally: close_server(self) self.server_close() self.wait_done()
def handle_error(self, request, client_address): Expand Down Expand Up @@ -386,7 +384,7 @@ def wait_done(self):
if HAVE_FORKING: class ForkingErrorTestServer(socketserver.ForkingMixIn, BaseErrorTestServer): pass _block_on_close = True

class SocketWriterTest(unittest.TestCase): Expand All @@ -398,7 +396,7 @@ def handle(self): self.server.request_fileno = self.request.fileno()
server = socketserver.TCPServer((HOST, 0), Handler) self.addCleanup(close_server, server) self.addCleanup(server.server_close) s = socket.socket( server.address_family, socket.SOCK_STREAM, socket.IPPROTO_TCP) with s: Expand All @@ -422,7 +420,7 @@ def handle(self): self.server.sent2 = self.wfile.write(big_chunk)
server = socketserver.TCPServer((HOST, 0), Handler) self.addCleanup(close_server, server) self.addCleanup(server.server_close) interrupted = threading.Event()
def signal_handler(signum, frame): Expand Down Expand Up @@ -498,7 +496,7 @@ def shutdown_request(self, request): s.close() server.handle_request() self.assertEqual(server.shutdown_called, 1) close_server(server) server.server_close()

if __name__ == "__main__": Expand Down