[Python-checkins] cpython (merge 3.2 -> 3.3): Refactor test_preexec_errpipe to not create an uncollectable reference cycle.

gregory.p.smith python-checkins at python.org
Sun Nov 11 19:13:19 CET 2012


http://hg.python.org/cpython/rev/1fddd68b3658
changeset:   80391:1fddd68b3658
branch:      3.3
parent:      80387:0e48bf45313c
parent:      80390:d09b6cb719b5
user:        Gregory P. Smith <greg at krypto.org>
date:        Sun Nov 11 10:00:49 2012 -0800
summary:
  Refactor test_preexec_errpipe to not create an uncollectable reference cycle.

files:
  Lib/test/test_subprocess.py |  37 ++++++++++++------------
  1 files changed, 18 insertions(+), 19 deletions(-)


diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -1189,22 +1189,15 @@
             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 RuntimeError("force the _execute_child() errpipe_data path.")
+    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)
 
-        p = SafeConstructorPopen()
-
-        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
@@ -1213,17 +1206,23 @@
                                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 RuntimeError("force the _execute_child() errpipe_data path.")
 
         with self.assertRaises(RuntimeError):
-            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)
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list