Commit f58087ba authored by Victor Stinner's avatar Victor Stinner

Issue #8533: revert r80694; try a different fix: regrtest uses backslashreplace

error handler for stdout to avoid UnicodeEncodeError (write non-ASCII character
to stdout using ASCII encoding)
parent 4d39f6e0
...@@ -376,6 +376,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, ...@@ -376,6 +376,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
elif o in ('-j', '--multiprocess'): elif o in ('-j', '--multiprocess'):
use_mp = int(a) use_mp = int(a)
elif o == '--slaveargs': elif o == '--slaveargs':
replace_stdout()
args, kwargs = json.loads(a) args, kwargs = json.loads(a)
try: try:
result = runtest(*args, **kwargs) result = runtest(*args, **kwargs)
...@@ -514,6 +515,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, ...@@ -514,6 +515,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
else: else:
tests = iter(selected) tests = iter(selected)
replace_stdout()
if use_mp: if use_mp:
try: try:
from threading import Thread from threading import Thread
...@@ -727,6 +730,14 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): ...@@ -727,6 +730,14 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
tests.append(modname) tests.append(modname)
return stdtests + sorted(tests) return stdtests + sorted(tests)
def replace_stdout():
"""Set stdout encoder error handler to backslashreplace (as stderr error
handler) to avoid UnicodeEncodeError when printing a traceback"""
stdout = sys.stdout
sys.stdout = open(stdout.fileno(), 'w',
encoding=stdout.encoding,
errors="backslashreplace")
def runtest(test, verbose, quiet, def runtest(test, verbose, quiet,
testdir=None, huntrleaks=False, debug=False, use_resources=None): testdir=None, huntrleaks=False, debug=False, use_resources=None):
"""Run a single test. """Run a single test.
...@@ -939,8 +950,8 @@ def runtest_inner(test, verbose, quiet, ...@@ -939,8 +950,8 @@ def runtest_inner(test, verbose, quiet,
print("test", test, "crashed --", str(type) + ":", value) print("test", test, "crashed --", str(type) + ":", value)
sys.stdout.flush() sys.stdout.flush()
if verbose or debug: if verbose or debug:
traceback.print_exc(file=sys.stderr) traceback.print_exc(file=sys.stdout)
sys.stderr.flush() sys.stdout.flush()
return FAILED, test_time return FAILED, test_time
else: else:
if refleak: if refleak:
......
...@@ -1020,7 +1020,7 @@ def check_impl_detail(**guards): ...@@ -1020,7 +1020,7 @@ def check_impl_detail(**guards):
def _run_suite(suite): def _run_suite(suite):
"""Run tests from a unittest.TestSuite-derived class.""" """Run tests from a unittest.TestSuite-derived class."""
if verbose: if verbose:
runner = unittest.TextTestRunner(sys.stderr, verbosity=2) runner = unittest.TextTestRunner(sys.stdout, verbosity=2)
else: else:
runner = BasicTestRunner() runner = BasicTestRunner()
......
...@@ -1201,8 +1201,8 @@ Documentation ...@@ -1201,8 +1201,8 @@ Documentation
Tests Tests
----- -----
- Issue #8533: Write tracebacks and failed tests to sys.stderr instead of - Issue #8533: regrtest uses backslashreplace error handler for stdout to avoid
sys.stdout to avoid UnicodeEncodeError (use backslashreplace error handler) UnicodeEncodeError (write non-ASCII character to stdout using ASCII encoding)
- Issue #8576: Remove use of find_unused_port() in test_smtplib and - Issue #8576: Remove use of find_unused_port() in test_smtplib and
test_multiprocessing. Patch by Paul Moore. test_multiprocessing. Patch by Paul Moore.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment