diff options
author | M. Kocher <michael.kocher@me.com> | 2021-04-28 08:16:38 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-28 08:16:38 (GMT) |
commit | db0c5b786df961785ae8c803f5572ae0c8dadcc7 (patch) | |
tree | 5af87d347bf4a64b2266d04346a74ce2931d755a /Lib/test | |
parent | f9bedb630e8a0b7d94e1c7e609b20dfaa2b22231 (diff) | |
download | cpython-db0c5b786df961785ae8c803f5572ae0c8dadcc7.zip cpython-db0c5b786df961785ae8c803f5572ae0c8dadcc7.tar.gz cpython-db0c5b786df961785ae8c803f5572ae0c8dadcc7.tar.bz2 |
bpo-43776: Remove list call from args in Popen repr (GH-25338)
Removes the `list` call in the Popen `repr`.
Current implementation:
For cmd = `python --version`, with `shell=True`.
```bash
<Popen: returncode: None args: ['p', 'y', 't', 'h', 'o', 'n', ' ', '-', '-',...>
```
For `shell=False` and args=`['python', '--version']`, the output is correct:
```bash
<Popen: returncode: None args: ['python', '--version']>
```
With the new changes the `repr` yields:
For cmd = `python --version`, with `shell=True`:
```bash
<Popen: returncode: None args: 'python --version'>
```
For `shell=False` and args=`['python', '--version']`, the output:
```bash
<Popen: returncode: None args: ['python', '--version']>
```
Automerge-Triggered-By: GH:gpshead
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_subprocess.py | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 70b54f4..7c79365 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -23,6 +23,7 @@ import threading import gc import textwrap import json +import pathlib from test.support.os_helper import FakePath try: @@ -1442,28 +1443,23 @@ class ProcessTestCase(BaseTestCase): p.communicate(b"x" * 2**20) def test_repr(self): - # Run a command that waits for user input, to check the repr() of - # a Proc object while and after the sub-process runs. - code = 'import sys; input(); sys.exit(57)' - cmd = [sys.executable, '-c', code] - result = "<Popen: returncode: {}" - - with subprocess.Popen( - cmd, stdin=subprocess.PIPE, universal_newlines=True) as proc: - self.assertIsNone(proc.returncode) - self.assertTrue( - repr(proc).startswith(result.format(proc.returncode)) and - repr(proc).endswith('>') - ) - - proc.communicate(input='exit...\n') - proc.wait() - - self.assertIsNotNone(proc.returncode) - self.assertTrue( - repr(proc).startswith(result.format(proc.returncode)) and - repr(proc).endswith('>') - ) + path_cmd = pathlib.Path("my-tool.py") + pathlib_cls = path_cmd.__class__.__name__ + + cases = [ + ("ls", True, 123, "<Popen: returncode: 123 args: 'ls'>"), + ('a' * 100, True, 0, + "<Popen: returncode: 0 args: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...>"), + (["ls"], False, None, "<Popen: returncode: None args: ['ls']>"), + (["ls", '--my-opts', 'a' * 100], False, None, + "<Popen: returncode: None args: ['ls', '--my-opts', 'aaaaaaaaaaaaaaaaaaaaaaaa...>"), + (path_cmd, False, 7, f"<Popen: returncode: 7 args: {pathlib_cls}('my-tool.py')>") + ] + with unittest.mock.patch.object(subprocess.Popen, '_execute_child'): + for cmd, shell, code, sx in cases: + p = subprocess.Popen(cmd, shell=shell) + p.returncode = code + self.assertEqual(repr(p), sx) def test_communicate_epipe_only_stdin(self): # Issue 10963: communicate() should hide EPIPE |