summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_subprocess.py
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2012-11-11 18:12:40 (GMT)
committerGregory P. Smith <greg@krypto.org>2012-11-11 18:12:40 (GMT)
commit65ee6ece2d000e716bf1dcbf3bfc74c32ceba4c8 (patch)
tree265dc16110e873971a727c7f09dbd6a457f6911b /Lib/test/test_subprocess.py
parentcba149761a73e7c1aec7fdf6b310957b01d30520 (diff)
parent859035d2efb32ad56ae9e8e2d0981c36074a79c3 (diff)
downloadcpython-65ee6ece2d000e716bf1dcbf3bfc74c32ceba4c8.zip
cpython-65ee6ece2d000e716bf1dcbf3bfc74c32ceba4c8.tar.gz
cpython-65ee6ece2d000e716bf1dcbf3bfc74c32ceba4c8.tar.bz2
Refactor test_preexec_errpipe to not create an uncollectable reference cycle.
Diffstat (limited to 'Lib/test/test_subprocess.py')
-rw-r--r--Lib/test/test_subprocess.py39
1 files changed, 19 insertions, 20 deletions
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index e502618..d18784c 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -1189,23 +1189,15 @@ class POSIXProcessTestCase(BaseTestCase):
self.fail("Exception raised by preexec_fn did not make it "
"to the parent process.")
- @unittest.skipIf(not os.path.exists("/dev/zero"), "/dev/zero required.")
- def test_preexec_errpipe_does_not_double_close_pipes(self):
- """Issue16140: Don't double close pipes on preexec error."""
- class SafeConstructorPopen(subprocess.Popen):
- def __init__(self):
- pass # Do nothing so we can modify the instance for testing.
- def RealPopen(self, *args, **kwargs):
- subprocess.Popen.__init__(self, *args, **kwargs)
- def raise_it():
- raise subprocess.SubprocessError(
- "force the _execute_child() errpipe_data path.")
-
- p = SafeConstructorPopen()
+ class _TestExecuteChildPopen(subprocess.Popen):
+ """Used to test behavior at the end of _execute_child."""
+ def __init__(self, testcase, *args, **kwargs):
+ self._testcase = testcase
+ subprocess.Popen.__init__(self, *args, **kwargs)
- def _test_fds_execute_child_wrapper(*args, **kwargs):
+ def _execute_child(self, *args, **kwargs):
try:
- subprocess.Popen._execute_child(p, *args, **kwargs)
+ subprocess.Popen._execute_child(self, *args, **kwargs)
finally:
# Open a bunch of file descriptors and verify that
# none of them are the same as the ones the Popen
@@ -1214,17 +1206,24 @@ class POSIXProcessTestCase(BaseTestCase):
for _ in range(8)]
try:
for fd in devzero_fds:
- self.assertNotIn(fd, (
- p.stdin.fileno(), p.stdout.fileno(),
- p.stderr.fileno()),
+ self._testcase.assertNotIn(
+ fd, (self.stdin.fileno(), self.stdout.fileno(),
+ self.stderr.fileno()),
msg="At least one fd was closed early.")
finally:
map(os.close, devzero_fds)
- p._execute_child = _test_fds_execute_child_wrapper
+ @unittest.skipIf(not os.path.exists("/dev/zero"), "/dev/zero required.")
+ def test_preexec_errpipe_does_not_double_close_pipes(self):
+ """Issue16140: Don't double close pipes on preexec error."""
+
+ def raise_it():
+ raise subprocess.SubprocessError(
+ "force the _execute_child() errpipe_data path.")
with self.assertRaises(subprocess.SubprocessError):
- p.RealPopen([sys.executable, "-c", "pass"],
+ self._TestExecuteChildPopen(
+ self, [sys.executable, "-c", "pass"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, preexec_fn=raise_it)