diff options
author | Ezio Melotti <ezio.melotti@gmail.com> | 2013-03-11 03:59:55 (GMT) |
---|---|---|
committer | Ezio Melotti <ezio.melotti@gmail.com> | 2013-03-11 03:59:55 (GMT) |
commit | 3300878d8c9ca454c78a7222e6b91f75cafbfa49 (patch) | |
tree | 6105273fb4e877ca35d769a68c5b5e8aa229d719 /Lib | |
parent | 686aae484175ac05c18b8840e0c26ab602a31c88 (diff) | |
parent | 42a541bd490fbf8eb9f4bf0399f3411b5f3e5d87 (diff) | |
download | cpython-3300878d8c9ca454c78a7222e6b91f75cafbfa49.zip cpython-3300878d8c9ca454c78a7222e6b91f75cafbfa49.tar.gz cpython-3300878d8c9ca454c78a7222e6b91f75cafbfa49.tar.bz2 |
#11963: merge with 3.2.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_subprocess.py | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index ff74e87..e8e74ed 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -184,16 +184,27 @@ class ProcessTestCase(BaseTestCase): self.assertEqual(p.stdin, None) def test_stdout_none(self): - # .stdout is None when not redirected - p = subprocess.Popen([sys.executable, "-c", - 'print(" this bit of output is from a ' - 'test of stdout in a different ' - 'process ...")'], - stdin=subprocess.PIPE, stderr=subprocess.PIPE) - self.addCleanup(p.stdin.close) + # .stdout is None when not redirected, and the child's stdout will + # be inherited from the parent. In order to test this we run a + # subprocess in a subprocess: + # this_test + # \-- subprocess created by this test (parent) + # \-- subprocess created by the parent subprocess (child) + # The parent doesn't specify stdout, so the child will use the + # parent's stdout. This test checks that the message printed by the + # child goes to the parent stdout. The parent also checks that the + # child's stdout is None. See #11963. + code = ('import sys; from subprocess import Popen, PIPE;' + 'p = Popen([sys.executable, "-c", "print(\'test_stdout_none\')"],' + ' stdin=PIPE, stderr=PIPE);' + 'p.wait(); assert p.stdout is None;') + p = subprocess.Popen([sys.executable, "-c", code], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.addCleanup(p.stdout.close) self.addCleanup(p.stderr.close) - p.wait() - self.assertEqual(p.stdout, None) + out, err = p.communicate() + self.assertEqual(p.returncode, 0, err) + self.assertEqual(out.rstrip(), b'test_stdout_none') def test_stderr_none(self): # .stderr is None when not redirected @@ -471,9 +482,22 @@ class ProcessTestCase(BaseTestCase): def test_stdout_filedes_of_stdout(self): # stdout is set to 1 (#1531862). - cmd = r"import sys, os; sys.exit(os.write(sys.stdout.fileno(), b'.\n'))" - rc = subprocess.call([sys.executable, "-c", cmd], stdout=1) - self.assertEqual(rc, 2) + # To avoid printing the text on stdout, we do something similar to + # test_stdout_none (see above). The parent subprocess calls the child + # subprocess passing stdout=1, and this test uses stdout=PIPE in + # order to capture and check the output of the parent. See #11963. + code = ('import sys, subprocess; ' + 'rc = subprocess.call([sys.executable, "-c", ' + ' "import os, sys; sys.exit(os.write(sys.stdout.fileno(), ' + 'b\'test with stdout=1\'))"], stdout=1); ' + 'assert rc == 18') + p = subprocess.Popen([sys.executable, "-c", code], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.addCleanup(p.stdout.close) + self.addCleanup(p.stderr.close) + out, err = p.communicate() + self.assertEqual(p.returncode, 0, err) + self.assertEqual(out.rstrip(), b'test with stdout=1') def test_stdout_devnull(self): p = subprocess.Popen([sys.executable, "-c", |