bpo-31593: test_socketserver waits child processes (#3786) · python/cpython@b4920d5
@@ -69,6 +69,20 @@ def simple_subprocess(testcase):
6969testcase.assertEqual(72 << 8, status)
7070717172+def close_server(server):
73+server.server_close()
74+75+if hasattr(server, 'active_children'):
76+# ForkingMixIn: Manually reap all child processes, since server_close()
77+# calls waitpid() in non-blocking mode using the WNOHANG flag.
78+for pid in server.active_children.copy():
79+try:
80+os.waitpid(pid, 0)
81+except ChildProcessError:
82+pass
83+server.active_children.clear()
84+85+7286@unittest.skipUnless(threading, 'Threading required for this test.')
7387class SocketServerTest(unittest.TestCase):
7488"""Test all socket servers."""
@@ -118,7 +132,7 @@ def make_server(self, addr, svrcls, hdlrbase):
118132class MyServer(svrcls):
119133def handle_error(self, request, client_address):
120134self.close_request(request)
121-self.server_close()
135+close_server(self)
122136raise
123137124138class MyHandler(hdlrbase):
@@ -158,7 +172,7 @@ def run_server(self, svrcls, hdlrbase, testfunc):
158172if verbose: print "waiting for server"
159173server.shutdown()
160174t.join()
161-server.server_close()
175+close_server(server)
162176self.assertRaises(socket.error, server.socket.fileno)
163177if verbose: print "done"
164178@@ -314,6 +328,7 @@ class MyHandler(SocketServer.StreamRequestHandler):
314328s.shutdown()
315329for t, s in threads:
316330t.join()
331+close_server(s)
317332318333def test_tcpserver_bind_leak(self):
319334# Issue #22435: the server socket wouldn't be closed if bind()/listen()
@@ -347,7 +362,7 @@ def shutdown_request(self, request):
347362s.close()
348363server.handle_request()
349364self.assertEqual(server.shutdown_called, 1)
350-server.server_close()
365+close_server(server)
351366352367353368def test_main():