Commit b4920d56 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-31593: test_socketserver waits child processes (#3786)

parent 9bfa55bf
...@@ -69,6 +69,20 @@ def simple_subprocess(testcase): ...@@ -69,6 +69,20 @@ def simple_subprocess(testcase):
testcase.assertEqual(72 << 8, status) 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()
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
class SocketServerTest(unittest.TestCase): class SocketServerTest(unittest.TestCase):
"""Test all socket servers.""" """Test all socket servers."""
...@@ -118,7 +132,7 @@ class SocketServerTest(unittest.TestCase): ...@@ -118,7 +132,7 @@ class SocketServerTest(unittest.TestCase):
class MyServer(svrcls): class MyServer(svrcls):
def handle_error(self, request, client_address): def handle_error(self, request, client_address):
self.close_request(request) self.close_request(request)
self.server_close() close_server(self)
raise raise
class MyHandler(hdlrbase): class MyHandler(hdlrbase):
...@@ -158,7 +172,7 @@ class SocketServerTest(unittest.TestCase): ...@@ -158,7 +172,7 @@ class SocketServerTest(unittest.TestCase):
if verbose: print "waiting for server" if verbose: print "waiting for server"
server.shutdown() server.shutdown()
t.join() t.join()
server.server_close() close_server(server)
self.assertRaises(socket.error, server.socket.fileno) self.assertRaises(socket.error, server.socket.fileno)
if verbose: print "done" if verbose: print "done"
...@@ -314,6 +328,7 @@ class SocketServerTest(unittest.TestCase): ...@@ -314,6 +328,7 @@ class SocketServerTest(unittest.TestCase):
s.shutdown() s.shutdown()
for t, s in threads: for t, s in threads:
t.join() t.join()
close_server(s)
def test_tcpserver_bind_leak(self): def test_tcpserver_bind_leak(self):
# Issue #22435: the server socket wouldn't be closed if bind()/listen() # Issue #22435: the server socket wouldn't be closed if bind()/listen()
...@@ -347,7 +362,7 @@ class MiscTestCase(unittest.TestCase): ...@@ -347,7 +362,7 @@ class MiscTestCase(unittest.TestCase):
s.close() s.close()
server.handle_request() server.handle_request()
self.assertEqual(server.shutdown_called, 1) self.assertEqual(server.shutdown_called, 1)
server.server_close() close_server(server)
def test_main(): def test_main():
......
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