From c9e363c2eb3eed920bcd0d08a2eabdfa939b1270 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 15 May 2007 23:18:55 +0000 Subject: Make test_subprocess pass. The subprocess module now reads and writes bytes instead of strings. We'll see how long that lasts. --- Lib/subprocess.py | 14 ++++++++------ Lib/test/test_subprocess.py | 29 ++++++++--------------------- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 22de0ce..2d02df6 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -830,7 +830,7 @@ class Popen(object): # object do the translation: It is based on stdio, which is # impossible to combine with select (unless forcing no # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): + if self.universal_newlines: if stdout: stdout = self._translate_newlines(stdout) if stderr: @@ -1044,6 +1044,8 @@ class Popen(object): def _communicate(self, input): + if isinstance(input, str): # Unicode + input = input.encode("utf-8") # XXX What else? read_set = [] write_set = [] stdout = None # Return @@ -1080,29 +1082,29 @@ class Popen(object): if self.stdout in rlist: data = os.read(self.stdout.fileno(), 1024) - if data == "": + if not data: self.stdout.close() read_set.remove(self.stdout) stdout.append(data) if self.stderr in rlist: data = os.read(self.stderr.fileno(), 1024) - if data == "": + if not data: self.stderr.close() read_set.remove(self.stderr) stderr.append(data) # All data exchanged. Translate lists into strings. if stdout is not None: - stdout = ''.join(stdout) + stdout = b''.join(stdout) if stderr is not None: - stderr = ''.join(stderr) + stderr = b''.join(stderr) # Translate newlines, if requested. We cannot let the file # object do the translation: It is based on stdio, which is # impossible to combine with select (unless forcing no # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): + if self.universal_newlines: if stdout: stdout = self._translate_newlines(stdout) if stderr: diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index ce7b659..f87fc91 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -24,7 +24,7 @@ else: # shutdown time. That frustrates tests trying to check stderr produced # from a spawned Python process. def remove_stderr_debug_decorations(stderr): - return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr) + return re.sub(r"\[\d+ refs\]\r?\n?$", "", str8(stderr)) class ProcessTestCase(unittest.TestCase): def setUp(self): @@ -162,7 +162,7 @@ class ProcessTestCase(unittest.TestCase): stdout=d) p.wait() os.lseek(d, 0, 0) - self.assertEqual(os.read(d, 1024), "orange") + self.assertEqual(os.read(d, 1024), b"orange") def test_stdout_fileobj(self): # stdout is set to open file object @@ -300,7 +300,7 @@ class ProcessTestCase(unittest.TestCase): stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = p.communicate("banana") - self.assertEqual(stdout, "banana") + self.assertEqual(stdout, b"banana") self.assertEqual(remove_stderr_debug_decorations(stderr), "pineapple") @@ -331,7 +331,7 @@ class ProcessTestCase(unittest.TestCase): stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - string_to_write = "abc"*pipe_buf + string_to_write = b"abc"*pipe_buf (stdout, stderr) = p.communicate(string_to_write) self.assertEqual(stdout, string_to_write) @@ -345,7 +345,7 @@ class ProcessTestCase(unittest.TestCase): stderr=subprocess.PIPE) p.stdin.write("banana") (stdout, stderr) = p.communicate("split") - self.assertEqual(stdout, "bananasplit") + self.assertEqual(stdout, b"bananasplit") self.assertEqual(remove_stderr_debug_decorations(stderr), "") def test_universal_newlines(self): @@ -365,14 +365,7 @@ class ProcessTestCase(unittest.TestCase): stdout=subprocess.PIPE, universal_newlines=1) stdout = p.stdout.read() - if hasattr(file, 'newlines'): - # Interpreter with universal newline support - self.assertEqual(stdout, - "line1\nline2\nline3\nline4\nline5\nline6") - else: - # Interpreter without universal newline support - self.assertEqual(stdout, - "line1\nline2\rline3\r\nline4\r\nline5\nline6") + self.assertEqual(stdout, "line1\nline2\nline3\nline4\nline5\nline6") def test_universal_newlines_communicate(self): # universal newlines through communicate() @@ -392,13 +385,7 @@ class ProcessTestCase(unittest.TestCase): stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=1) (stdout, stderr) = p.communicate() - if hasattr(file, 'newlines'): - # Interpreter with universal newline support - self.assertEqual(stdout, - "line1\nline2\nline3\nline4\nline5\nline6") - else: - # Interpreter without universal newline support - self.assertEqual(stdout, "line1\nline2\rline3\r\nline4\r\nline5\nline6") + self.assertEqual(stdout, b"line1\nline2\nline3\nline4\nline5\nline6") def test_no_leaking(self): # Make sure we leak no resources @@ -414,7 +401,7 @@ class ProcessTestCase(unittest.TestCase): stdout=subprocess.PIPE, stderr=subprocess.PIPE) data = p.communicate("lime")[0] - self.assertEqual(data, "lime") + self.assertEqual(data, b"lime") def test_list2cmdline(self): -- cgit v0.12