diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2011-01-03 21:15:48 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2011-01-03 21:15:48 (GMT) |
commit | 95aaeee59afab1e86a77f73b7da81ff5063b024a (patch) | |
tree | a7f0bc27bd19529c7a6fe2163e2d808cac1fef1b /Lib/test/test_subprocess.py | |
parent | 4d419689049411d7b648e73fc9b3859488aa26a1 (diff) | |
download | cpython-95aaeee59afab1e86a77f73b7da81ff5063b024a.zip cpython-95aaeee59afab1e86a77f73b7da81ff5063b024a.tar.gz cpython-95aaeee59afab1e86a77f73b7da81ff5063b024a.tar.bz2 |
Add a subprocess test of remapping standard file descriptors (issue #1187).
Diffstat (limited to 'Lib/test/test_subprocess.py')
-rw-r--r-- | Lib/test/test_subprocess.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 7b9e2b4..4b58308 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -955,6 +955,54 @@ class POSIXProcessTestCase(BaseTestCase): # all standard fds closed. self.check_close_std_fds([0, 1, 2]) + def test_remapping_std_fds(self): + # open up some temporary files + temps = [mkstemp() for i in range(3)] + try: + temp_fds = [fd for fd, fname in temps] + + # unlink the files -- we won't need to reopen them + for fd, fname in temps: + os.unlink(fname) + + # write some data to what will become stdin, and rewind + os.write(temp_fds[1], b"STDIN") + os.lseek(temp_fds[1], 0, 0) + + # move the standard file descriptors out of the way + saved_fds = [os.dup(fd) for fd in range(3)] + try: + # duplicate the file objects over the standard fd's + for fd, temp_fd in enumerate(temp_fds): + os.dup2(temp_fd, fd) + + # now use those files in the "wrong" order, so that subprocess + # has to rearrange them in the child + p = subprocess.Popen([sys.executable, "-c", + 'import sys; got = sys.stdin.read();' + 'sys.stdout.write("got %s"%got); sys.stderr.write("err")'], + stdin=temp_fds[1], + stdout=temp_fds[2], + stderr=temp_fds[0]) + p.wait() + finally: + # restore the original fd's underneath sys.stdin, etc. + for std, saved in enumerate(saved_fds): + os.dup2(saved, std) + os.close(saved) + + for fd in temp_fds: + os.lseek(fd, 0, 0) + + out = os.read(temp_fds[2], 1024) + err = support.strip_python_stderr(os.read(temp_fds[0], 1024)) + self.assertEqual(out, b"got STDIN") + self.assertEqual(err, b"err") + + finally: + for fd in temp_fds: + os.close(fd) + def test_surrogates_error_message(self): def prepare(): raise ValueError("surrogate:\uDCff") |