From: Victor Stinner Date: Wed, 29 Jun 2011 13:25:40 +0000 (+0200) Subject: (merge 3.2) Issue #12400: runtest() reuses the same io.StringIO instance for X-Git-Tag: v3.3.0a1~2014 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d71bd9a9a472df2010f2b05a588493157aa9ffcb;p=python (merge 3.2) Issue #12400: runtest() reuses the same io.StringIO instance for all calls * Don't force verbose to True with option -W * Rename rerun_failed variable to output_on_failure --- d71bd9a9a472df2010f2b05a588493157aa9ffcb diff --cc Lib/test/regrtest.py index ecd8b092c7,bb3e703f9a..d64494ed82 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@@ -162,10 -154,13 +162,14 @@@ option '-uall,-gui' """ import builtins + import errno +import faulthandler import getopt + import io import json + import logging import os + import platform import random import re import sys @@@ -579,7 -536,7 +580,8 @@@ def main(tests=None, testdir=None, verb args_tuple = ( (test, verbose, quiet), dict(huntrleaks=huntrleaks, use_resources=use_resources, - debug=debug, rerun_failed=verbose3, timeout=timeout) - debug=debug, output_on_failure=verbose3) ++ debug=debug, output_on_failure=verbose3, ++ timeout=timeout) ) yield (test, args_tuple) pending = tests_and_args() @@@ -664,7 -614,7 +666,7 @@@ else: try: result = runtest(test, verbose, quiet, huntrleaks, debug, - rerun_failed=verbose3, timeout=timeout) - output_on_failure=verbose3) ++ output_on_failure=verbose3, timeout=timeout) accumulate_result(test, result) except KeyboardInterrupt: interrupted = True @@@ -808,7 -761,7 +810,7 @@@ def replace_stdout() def runtest(test, verbose, quiet, huntrleaks=False, debug=False, use_resources=None, - rerun_failed=False, timeout=None): - output_on_failure=False): ++ output_on_failure=False, timeout=None): """Run a single test. test -- the name of the test @@@ -817,9 -770,7 +819,9 @@@ test_times -- a list of (time, test_name) pairs huntrleaks -- run multiple times to test for leaks; requires a debug build; a triple corresponding to -R's three arguments - rerun_failed -- if true, re-run in verbose mode when failed + output_on_failure -- if true, display test output on failure + timeout -- dump the traceback and exit if a test takes more than + timeout seconds Returns one of the test result constants: INTERRUPTED KeyboardInterrupt when run under -j @@@ -832,33 -783,36 +834,41 @@@ if use_resources is not None: support.use_resources = use_resources + use_timeout = (timeout is not None) + if use_timeout: + faulthandler.dump_tracebacks_later(timeout, exit=True) try: - if rerun_failed: - support.verbose = True + support.verbose = verbose # Tell tests to be moderately quiet + if output_on_failure: + if runtest.stringio is None: + # Reuse the same instance to all calls to runtest(). Some + # tests keep a reference to sys.stdout or sys.stderr + # (eg. test_argparse). + runtest.stringio = io.StringIO() + + orig_stdout = sys.stdout orig_stderr = sys.stderr - with support.captured_stdout() as stream: - try: - sys.stderr = stream - result = runtest_inner(test, verbose, quiet, huntrleaks, - debug, display_failure=False) - if result[0] == FAILED: - output = stream.getvalue() - orig_stderr.write(output) - orig_stderr.flush() - finally: - sys.stderr = orig_stderr + try: + sys.stdout = runtest.stringio + sys.stderr = runtest.stringio + result = runtest_inner(test, verbose, quiet, huntrleaks, + debug, display_failure=False) + if result[0] == FAILED: + output = stringio.getvalue() + orig_stderr.write(output) + orig_stderr.flush() + finally: + sys.stdout = orig_stdout + sys.stderr = orig_stderr else: - support.verbose = verbose # Tell tests to be moderately quiet result = runtest_inner(test, verbose, quiet, huntrleaks, debug, display_failure=not verbose) return result finally: + if use_timeout: + faulthandler.cancel_dump_tracebacks_later() cleanup_test_droppings(test, verbose) + runtest.stringio = None # Unit tests are supposed to leave the execution environment unchanged # once they complete. But sometimes tests have bugs, especially when