summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2019-12-08 08:38:16 +0100
committerGitHub <noreply@github.com>2019-12-08 08:38:16 +0100
commit6cac1136665b70f72db291b95876d7affcf1d2db (patch)
treebaf9af65677cacb92ec5d10d8567e90bf8246b17
parent2b7de6696bf2f924cd2cd9ff0a539c8aa37c6244 (diff)
downloadcpython-git-6cac1136665b70f72db291b95876d7affcf1d2db.tar.gz
bpo-38991: Remove test.support.strip_python_stderr() (GH-17490)
test.support: run_python_until_end(), assert_python_ok() and assert_python_failure() functions no longer strip whitespaces from stderr.
-rw-r--r--Doc/library/test.rst16
-rw-r--r--Lib/test/support/__init__.py10
-rw-r--r--Lib/test/support/script_helper.py3
-rw-r--r--Lib/test/test_cmd_line.py6
-rw-r--r--Lib/test/test_cmd_line_script.py4
-rw-r--r--Lib/test/test_faulthandler.py3
-rw-r--r--Lib/test/test_gc.py6
-rw-r--r--Lib/test/test_subprocess.py50
-rw-r--r--Lib/test/test_support.py1
-rw-r--r--Lib/test/test_warnings/__init__.py3
-rw-r--r--Misc/NEWS.d/next/Tests/2019-12-07-00-52-09.bpo-38991.JE3_o-.rst5
11 files changed, 46 insertions, 61 deletions
diff --git a/Doc/library/test.rst b/Doc/library/test.rst
index 4a61566c22..73b3fe5cf0 100644
--- a/Doc/library/test.rst
+++ b/Doc/library/test.rst
@@ -686,13 +686,6 @@ The :mod:`test.support` module defines the following functions:
``sys.stdout`` if it's not set.
-.. function:: strip_python_strerr(stderr)
-
- Strip the *stderr* of a Python process from potential debug output
- emitted by the interpreter. This will typically be run on the result of
- :meth:`subprocess.Popen.communicate`.
-
-
.. function:: args_from_interpreter_flags()
Return a list of command line arguments reproducing the current settings
@@ -1499,6 +1492,9 @@ script execution tests.
in a subprocess. The values can include ``__isolated``, ``__cleanenv``,
``__cwd``, and ``TERM``.
+ .. versionchanged:: 3.9
+ The function no longer strips whitespaces from *stderr*.
+
.. function:: assert_python_ok(*args, **env_vars)
@@ -1512,6 +1508,9 @@ script execution tests.
Python is started in isolated mode (command line option ``-I``),
except if the ``__isolated`` keyword is set to ``False``.
+ .. versionchanged:: 3.9
+ The function no longer strips whitespaces from *stderr*.
+
.. function:: assert_python_failure(*args, **env_vars)
@@ -1521,6 +1520,9 @@ script execution tests.
See :func:`assert_python_ok` for more options.
+ .. versionchanged:: 3.9
+ The function no longer strips whitespaces from *stderr*.
+
.. function:: spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index 7e1b30cc16..215bab8131 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -2512,16 +2512,6 @@ def swap_item(obj, item, new_val):
if item in obj:
del obj[item]
-def strip_python_stderr(stderr):
- """Strip the stderr of a Python process from potential debug output
- emitted by the interpreter.
-
- This will typically be run on the result of the communicate() method
- of a subprocess.Popen object.
- """
- stderr = re.sub(br"\[\d+ refs, \d+ blocks\]\r?\n?", b"", stderr).strip()
- return stderr
-
requires_type_collecting = unittest.skipIf(hasattr(sys, 'getcounts'),
'types are immortal if COUNT_ALLOCS is defined')
diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
index 83519988e3..37e576d4a7 100644
--- a/Lib/test/support/script_helper.py
+++ b/Lib/test/support/script_helper.py
@@ -11,7 +11,7 @@ import py_compile
import zipfile
from importlib.util import source_from_cache
-from test.support import make_legacy_pyc, strip_python_stderr
+from test.support import make_legacy_pyc
# Cached result of the expensive test performed in the function below.
@@ -134,7 +134,6 @@ def run_python_until_end(*args, **env_vars):
proc.kill()
subprocess._cleanup()
rc = proc.returncode
- err = strip_python_stderr(err)
return _PythonRunResult(rc, out, err), cmd_line
def _assert_python(expected_success, /, *args, **env_vars):
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index 497bfa9eb8..47810020dd 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -332,10 +332,10 @@ class CmdLineTest(unittest.TestCase):
if sys.platform == 'win32':
self.assertEqual(b'1\r\n2\r\n', out)
- self.assertEqual(b'3\r\n4', err)
+ self.assertEqual(b'3\r\n4\r\n', err)
else:
self.assertEqual(b'1\n2\n', out)
- self.assertEqual(b'3\n4', err)
+ self.assertEqual(b'3\n4\n', err)
def test_unmached_quote(self):
# Issue #10206: python program starting with unmatched quote
@@ -391,7 +391,7 @@ class CmdLineTest(unittest.TestCase):
stderr=subprocess.PIPE,
preexec_fn=preexec)
out, err = p.communicate()
- self.assertEqual(support.strip_python_stderr(err), b'')
+ self.assertEqual(err, b'')
self.assertEqual(p.returncode, 42)
def test_no_stdin(self):
diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py
index 60723078ef..2ac926deac 100644
--- a/Lib/test/test_cmd_line_script.py
+++ b/Lib/test/test_cmd_line_script.py
@@ -535,7 +535,7 @@ class CmdLineTest(unittest.TestCase):
script_name = _make_test_script(script_dir, 'script', script)
exitcode, stdout, stderr = assert_python_failure(script_name)
text = stderr.decode('ascii').split('\n')
- self.assertEqual(len(text), 4)
+ self.assertEqual(len(text), 5)
self.assertTrue(text[0].startswith('Traceback'))
self.assertTrue(text[1].startswith(' File '))
self.assertTrue(text[3].startswith('NameError'))
@@ -579,7 +579,7 @@ class CmdLineTest(unittest.TestCase):
script_name = _make_test_script(script_dir, 'script', script)
exitcode, stdout, stderr = assert_python_failure(script_name)
text = stderr.decode('ascii')
- self.assertEqual(text, "some text")
+ self.assertEqual(text.rstrip(), "some text")
def test_syntaxerror_unindented_caret_position(self):
script = "1 + 1 = 2\n"
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index a4427a537d..ac8cf4686b 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -71,9 +71,8 @@ class FaultHandlerTests(unittest.TestCase):
with support.SuppressCrashReport():
process = script_helper.spawn_python('-c', code, pass_fds=pass_fds)
with process:
- stdout, stderr = process.communicate()
+ output, stderr = process.communicate()
exitcode = process.wait()
- output = support.strip_python_stderr(stdout)
output = output.decode('ascii', 'backslashreplace')
if filename:
self.assertEqual(output, '')
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index fdb8752b66..c0d4a7507a 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -1,7 +1,7 @@
import unittest
import unittest.mock
from test.support import (verbose, refcount_test, run_unittest,
- strip_python_stderr, cpython_only, start_threads,
+ cpython_only, start_threads,
temp_dir, requires_type_collecting, TESTFN, unlink,
import_module)
from test.support.script_helper import assert_python_ok, make_script
@@ -671,8 +671,8 @@ class GCTests(unittest.TestCase):
p.stdout.close()
p.stderr.close()
self.assertEqual(p.returncode, 0)
- self.assertEqual(stdout.strip(), b"")
- return strip_python_stderr(stderr)
+ self.assertEqual(stdout, b"")
+ return stderr
stderr = run_command(code % "0")
self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at "
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 97dc09c564..f806be817b 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -85,15 +85,6 @@ class BaseTestCase(unittest.TestCase):
self.doCleanups()
support.reap_children()
- def assertStderrEqual(self, stderr, expected, msg=None):
- # In a debug build, stuff like "[6580 refs]" is printed to stderr at
- # shutdown time. That frustrates tests trying to check stderr produced
- # from a spawned Python process.
- actual = support.strip_python_stderr(stderr)
- # strip_python_stderr also strips whitespace, so we do too.
- expected = expected.strip()
- self.assertEqual(actual, expected, msg)
-
class PopenTestException(Exception):
pass
@@ -547,7 +538,7 @@ class ProcessTestCase(BaseTestCase):
'import sys; sys.stderr.write("strawberry")'],
stderr=subprocess.PIPE)
with p:
- self.assertStderrEqual(p.stderr.read(), b"strawberry")
+ self.assertEqual(p.stderr.read(), b"strawberry")
def test_stderr_filedes(self):
# stderr is set to open file descriptor
@@ -559,7 +550,7 @@ class ProcessTestCase(BaseTestCase):
stderr=d)
p.wait()
os.lseek(d, 0, 0)
- self.assertStderrEqual(os.read(d, 1024), b"strawberry")
+ self.assertEqual(os.read(d, 1024), b"strawberry")
def test_stderr_fileobj(self):
# stderr is set to open file object
@@ -570,7 +561,7 @@ class ProcessTestCase(BaseTestCase):
stderr=tf)
p.wait()
tf.seek(0)
- self.assertStderrEqual(tf.read(), b"strawberry")
+ self.assertEqual(tf.read(), b"strawberry")
def test_stderr_redirect_with_no_stdout_redirect(self):
# test stderr=STDOUT while stdout=None (not set)
@@ -589,8 +580,8 @@ class ProcessTestCase(BaseTestCase):
stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
#NOTE: stdout should get stderr from grandchild
- self.assertStderrEqual(stdout, b'42')
- self.assertStderrEqual(stderr, b'') # should be empty
+ self.assertEqual(stdout, b'42')
+ self.assertEqual(stderr, b'') # should be empty
self.assertEqual(p.returncode, 0)
def test_stdout_stderr_pipe(self):
@@ -603,7 +594,7 @@ class ProcessTestCase(BaseTestCase):
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
with p:
- self.assertStderrEqual(p.stdout.read(), b"appleorange")
+ self.assertEqual(p.stdout.read(), b"appleorange")
def test_stdout_stderr_file(self):
# capture stdout and stderr to the same open file
@@ -618,7 +609,7 @@ class ProcessTestCase(BaseTestCase):
stderr=tf)
p.wait()
tf.seek(0)
- self.assertStderrEqual(tf.read(), b"appleorange")
+ self.assertEqual(tf.read(), b"appleorange")
def test_stdout_filedes_of_stdout(self):
# stdout is set to 1 (#1531862).
@@ -767,7 +758,7 @@ class ProcessTestCase(BaseTestCase):
stderr=subprocess.PIPE)
(stdout, stderr) = p.communicate()
self.assertEqual(stdout, None)
- self.assertStderrEqual(stderr, b"pineapple")
+ self.assertEqual(stderr, b"pineapple")
def test_communicate(self):
p = subprocess.Popen([sys.executable, "-c",
@@ -782,7 +773,7 @@ class ProcessTestCase(BaseTestCase):
self.addCleanup(p.stdin.close)
(stdout, stderr) = p.communicate(b"banana")
self.assertEqual(stdout, b"banana")
- self.assertStderrEqual(stderr, b"pineapple")
+ self.assertEqual(stderr, b"pineapple")
def test_communicate_timeout(self):
p = subprocess.Popen([sys.executable, "-c",
@@ -801,7 +792,7 @@ class ProcessTestCase(BaseTestCase):
# after it completes.
(stdout, stderr) = p.communicate()
self.assertEqual(stdout, "banana")
- self.assertStderrEqual(stderr.encode(), b"pineapple\npear\n")
+ self.assertEqual(stderr.encode(), b"pineapple\npear\n")
def test_communicate_timeout_large_output(self):
# Test an expiring timeout while the child is outputting lots of data.
@@ -887,7 +878,7 @@ class ProcessTestCase(BaseTestCase):
p.stdin.write(b"banana")
(stdout, stderr) = p.communicate(b"split")
self.assertEqual(stdout, b"bananasplit")
- self.assertStderrEqual(stderr, b"")
+ self.assertEqual(stderr, b"")
def test_universal_newlines_and_text(self):
args = [
@@ -1005,7 +996,6 @@ class ProcessTestCase(BaseTestCase):
self.assertEqual("line1\nline2\nline3\nline4\nline5\n", stdout)
# Python debug build push something like "[42442 refs]\n"
# to stderr at exit of subprocess.
- # Don't use assertStderrEqual because it strips CR and LF from output.
self.assertTrue(stderr.startswith("eline2\neline6\neline7\n"))
def test_universal_newlines_communicate_encodings(self):
@@ -2240,13 +2230,13 @@ class POSIXProcessTestCase(BaseTestCase):
def test_kill(self):
p = self._kill_process('kill')
_, stderr = p.communicate()
- self.assertStderrEqual(stderr, b'')
+ self.assertEqual(stderr, b'')
self.assertEqual(p.wait(), -signal.SIGKILL)
def test_terminate(self):
p = self._kill_process('terminate')
_, stderr = p.communicate()
- self.assertStderrEqual(stderr, b'')
+ self.assertEqual(stderr, b'')
self.assertEqual(p.wait(), -signal.SIGTERM)
def test_send_signal_dead(self):
@@ -2294,8 +2284,8 @@ class POSIXProcessTestCase(BaseTestCase):
stdin=stdin,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()
- err = support.strip_python_stderr(err)
- self.assertEqual((out, err), (b'apple', b'orange'))
+ self.assertEqual(out, b'apple')
+ self.assertEqual(err, b'orange')
finally:
self._restore_fds(saved_fds)
@@ -2380,7 +2370,7 @@ class POSIXProcessTestCase(BaseTestCase):
os.lseek(fd, 0, 0)
out = os.read(temp_fds[2], 1024)
- err = support.strip_python_stderr(os.read(temp_fds[0], 1024))
+ err = os.read(temp_fds[0], 1024).strip()
self.assertEqual(out, b"got STDIN")
self.assertEqual(err, b"err")
@@ -2422,7 +2412,7 @@ class POSIXProcessTestCase(BaseTestCase):
os.lseek(fd, 0, 0)
out = os.read(stdout_no, 1024)
- err = support.strip_python_stderr(os.read(stderr_no, 1024))
+ err = os.read(stderr_no, 1024).strip()
finally:
self._restore_fds(saved_fds)
@@ -3338,7 +3328,7 @@ class Win32ProcessTestCase(BaseTestCase):
p.stdout.read(1)
getattr(p, method)(*args)
_, stderr = p.communicate()
- self.assertStderrEqual(stderr, b'')
+ self.assertEqual(stderr, b'')
returncode = p.wait()
self.assertNotEqual(returncode, 0)
@@ -3361,7 +3351,7 @@ class Win32ProcessTestCase(BaseTestCase):
# This shouldn't raise even though the child is now dead
getattr(p, method)(*args)
_, stderr = p.communicate()
- self.assertStderrEqual(stderr, b'')
+ self.assertEqual(stderr, b'')
rc = p.wait()
self.assertEqual(rc, 42)
@@ -3550,7 +3540,7 @@ class ContextManagerTests(BaseTestCase):
stdout=subprocess.PIPE,
stderr=subprocess.PIPE) as proc:
self.assertEqual(proc.stdout.read(), b"stdout")
- self.assertStderrEqual(proc.stderr.read(), b"stderr")
+ self.assertEqual(proc.stderr.read(), b"stderr")
self.assertTrue(proc.stdout.closed)
self.assertTrue(proc.stderr.closed)
diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
index e3ce670b84..eb27c0cf86 100644
--- a/Lib/test/test_support.py
+++ b/Lib/test/test_support.py
@@ -653,7 +653,6 @@ class TestSupport(unittest.TestCase):
# run_doctest
# threading_cleanup
# reap_threads
- # strip_python_stderr
# can_symlink
# skip_unless_symlink
# SuppressCrashReport
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py
index d103182951..3a6d64eaad 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -1219,7 +1219,8 @@ class A:
a=A()
"""
rc, out, err = assert_python_ok("-c", code)
- self.assertEqual(err.decode(), '<string>:7: UserWarning: test')
+ self.assertEqual(err.decode().rstrip(),
+ '<string>:7: UserWarning: test')
def test_late_resource_warning(self):
# Issue #21925: Emitting a ResourceWarning late during the Python
diff --git a/Misc/NEWS.d/next/Tests/2019-12-07-00-52-09.bpo-38991.JE3_o-.rst b/Misc/NEWS.d/next/Tests/2019-12-07-00-52-09.bpo-38991.JE3_o-.rst
new file mode 100644
index 0000000000..cff5a65646
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2019-12-07-00-52-09.bpo-38991.JE3_o-.rst
@@ -0,0 +1,5 @@
+:mod:`test.support`: :func:`~test.support.run_python_until_end`,
+:func:`~test.support.assert_python_ok` and
+:func:`~test.support.assert_python_failure` functions no longer strip
+whitespaces from stderr. Remove ``test.support.strip_python_stderr()``
+function.