summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-09-27 09:21:12 (GMT)
committerGitHub <noreply@github.com>2017-09-27 09:21:12 (GMT)
commitfdcf3e9629201ef725af629d99e02215a2d657c8 (patch)
treeb88ccd78560f0e4996f3796ba58a6c1bc253c99b
parent02c3cdcef84edd8c71e9fe189873dea216acfc1d (diff)
downloadcpython-fdcf3e9629201ef725af629d99e02215a2d657c8.zip
cpython-fdcf3e9629201ef725af629d99e02215a2d657c8.tar.gz
cpython-fdcf3e9629201ef725af629d99e02215a2d657c8.tar.bz2
bpo-31593: test_socketserver waits child processes (#3766)
-rw-r--r--Lib/test/test_socketserver.py32
1 files changed, 22 insertions, 10 deletions
diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py
index 140a6ab..4362133 100644
--- a/Lib/test/test_socketserver.py
+++ b/Lib/test/test_socketserver.py
@@ -68,6 +68,20 @@ def simple_subprocess(testcase):
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.')
class SocketServerTest(unittest.TestCase):
"""Test all socket servers."""
@@ -142,7 +156,7 @@ class SocketServerTest(unittest.TestCase):
if verbose: print("waiting for server")
server.shutdown()
t.join()
- server.server_close()
+ close_server(server)
self.assertEqual(-1, server.socket.fileno())
if verbose: print("done")
@@ -266,7 +280,7 @@ class SocketServerTest(unittest.TestCase):
s.shutdown()
for t, s in threads:
t.join()
- s.server_close()
+ close_server(s)
def test_tcpserver_bind_leak(self):
# Issue #22435: the server socket wouldn't be closed if bind()/listen()
@@ -292,6 +306,7 @@ class ErrorHandlerTest(unittest.TestCase):
def tearDown(self):
test.support.unlink(test.support.TESTFN)
+ reap_children()
def test_sync_handled(self):
BaseErrorTestServer(ValueError)
@@ -337,7 +352,7 @@ class BaseErrorTestServer(socketserver.TCPServer):
try:
self.handle_request()
finally:
- self.server_close()
+ close_server(self)
self.wait_done()
def handle_error(self, request, client_address):
@@ -371,10 +386,7 @@ class ThreadingErrorTestServer(socketserver.ThreadingMixIn,
if HAVE_FORKING:
class ForkingErrorTestServer(socketserver.ForkingMixIn, BaseErrorTestServer):
- def wait_done(self):
- [child] = self.active_children
- os.waitpid(child, 0)
- self.active_children.clear()
+ pass
class SocketWriterTest(unittest.TestCase):
@@ -386,7 +398,7 @@ class SocketWriterTest(unittest.TestCase):
self.server.request_fileno = self.request.fileno()
server = socketserver.TCPServer((HOST, 0), Handler)
- self.addCleanup(server.server_close)
+ self.addCleanup(close_server, server)
s = socket.socket(
server.address_family, socket.SOCK_STREAM, socket.IPPROTO_TCP)
with s:
@@ -410,7 +422,7 @@ class SocketWriterTest(unittest.TestCase):
self.server.sent2 = self.wfile.write(big_chunk)
server = socketserver.TCPServer((HOST, 0), Handler)
- self.addCleanup(server.server_close)
+ self.addCleanup(close_server, server)
interrupted = threading.Event()
def signal_handler(signum, frame):
@@ -486,7 +498,7 @@ class MiscTestCase(unittest.TestCase):
s.close()
server.handle_request()
self.assertEqual(server.shutdown_called, 1)
- server.server_close()
+ close_server(server)
if __name__ == "__main__":