Index: tests/subprocess2_test.py |
diff --git a/tests/subprocess2_test.py b/tests/subprocess2_test.py |
index e7ddf90947cf5f10f21f200bb42c7acb7ac34bf9..9f2101a01212d0a86dc4a1c0d77003ccf97ab22d 100755 |
--- a/tests/subprocess2_test.py |
+++ b/tests/subprocess2_test.py |
@@ -5,6 +5,7 @@ |
"""Unit tests for subprocess2.py.""" |
+import cStringIO |
import logging |
import optparse |
import os |
@@ -165,7 +166,7 @@ class DefaultsTest(auto_stub.TestCase): |
self.assertEquals(expected, results) |
-class BaseTestCase(unittest.TestCase): |
+class BaseTestCase(auto_stub.TestCase): |
def setUp(self): |
super(BaseTestCase, self).setUp() |
self.exe_path = __file__ |
@@ -236,7 +237,7 @@ class RegressionTest(BaseTestCase): |
self.fail() |
except ValueError: |
pass |
- |
+ |
if (sys.version_info[0] * 10 + sys.version_info[1]) >= 27: |
# python 2.7+ |
try: |
@@ -617,7 +618,54 @@ class S2Test(BaseTestCase): |
'No output for 9 seconds from command:', proc.cmd_str] |
self.assertEquals(w, expected) |
- |
+ def test_communicate_and_stream(self): |
+ self.mock(sys, 'stdout', cStringIO.StringIO()) |
+ self.mock(sys, 'stderr', cStringIO.StringIO()) |
+ (stdout, stderr), returncode = subprocess2.communicate_and_stream( |
+ self.exe + ['--stderr', '--stdout', '--fail']) |
+ self.assertEquals(returncode, 64) |
+ self.assertEquals('A\nBB\nCCC\n', sys.stdout.getvalue()) |
+ self.assertEquals('A\nBB\nCCC\n', stdout) |
+ self.assertEquals('a\nbb\nccc\n', sys.stderr.getvalue()) |
+ self.assertEquals('a\nbb\nccc\n', stderr) |
+ |
+ def test_communicate_and_stream_partial_pipe(self): |
+ self.mock(sys, 'stdout', cStringIO.StringIO()) |
+ self.mock(sys, 'stderr', cStringIO.StringIO()) |
+ (stdout, stderr), returncode = subprocess2.communicate_and_stream( |
+ self.exe + ['--stderr', '--stdout'], stdout=PIPE) |
+ self.assertEquals(returncode, 0) |
+ self.assertEquals('', sys.stdout.getvalue()) |
+ self.assertEquals('A\nBB\nCCC\n', stdout) |
+ self.assertEquals('a\nbb\nccc\n', sys.stderr.getvalue()) |
+ self.assertEquals('a\nbb\nccc\n', stderr) |
+ |
+ def test_communicate_and_stream_partial_void(self): |
+ self.mock(sys, 'stdout', cStringIO.StringIO()) |
+ self.mock(sys, 'stderr', cStringIO.StringIO()) |
+ (stdout, stderr), returncode = subprocess2.communicate_and_stream( |
+ self.exe + ['--stderr', '--stdout', '--fail'], stderr=VOID) |
+ self.assertEquals(returncode, 64) |
+ self.assertEquals('A\nBB\nCCC\n', sys.stdout.getvalue()) |
+ self.assertEquals('A\nBB\nCCC\n', stdout) |
+ self.assertEquals('', sys.stderr.getvalue()) |
+ self.assertIsNone(stderr) |
+ |
+ def test_communicate_and_stream_redirect(self): |
+ self.mock(sys, 'stdout', cStringIO.StringIO()) |
+ self.mock(sys, 'stderr', cStringIO.StringIO()) |
+ (stdout, stderr), returncode = subprocess2.communicate_and_stream( |
+ self.exe + ['--stderr', '--stdout', '--fail'], stderr=STDOUT) |
+ self.assertEquals(returncode, 64) |
+ self.assertEquals('', sys.stderr.getvalue()) |
+ self.assertIsNone(stderr) |
+ self.assertEquals(sys.stdout.getvalue(), stdout) |
+ # Because stderr/stdout is interwoven arbitrarily, |
+ # just check that no output is missed, but not the order. |
+ self.assertEquals(sorted(stdout), sorted('A\nBB\nCCC\n' + 'a\nbb\nccc\n')) |
+ |
+ |
+ |
def child_main(args): |
if sys.platform == 'win32': |
# Annoying, make sure the output is not translated on Windows. |