cpython (3.2): Issue #12400: runtest() reuses the same io.StringIO instance for all calls

http://hg.python.org/cpython/rev/6c54c334ea7a changeset: 71068:6c54c334ea7a branch: 3.2 parent: 71066:74c6afbb524a user: Victor Stinner <victor.stinner@haypocalc.com> date: Wed Jun 29 15:22:26 2011 +0200 summary: 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 files: Lib/test/regrtest.py | 57 ++++++++++++++++++------------- 1 files changed, 33 insertions(+), 24 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -154,22 +154,23 @@ """ import builtins +import errno import getopt +import io import json +import logging import os +import platform import random import re import sys +import sysconfig +import tempfile import time -import errno import traceback +import unittest import warnings -import unittest from inspect import isabstract -import tempfile -import platform -import sysconfig -import logging # Some times __path__ and __file__ are not absolute (e.g. while running from @@ -535,7 +536,7 @@ args_tuple = ( (test, verbose, quiet), dict(huntrleaks=huntrleaks, use_resources=use_resources, - debug=debug, rerun_failed=verbose3) + debug=debug, output_on_failure=verbose3) ) yield (test, args_tuple) pending = tests_and_args() @@ -613,7 +614,7 @@ else: try: result = runtest(test, verbose, quiet, huntrleaks, debug, - rerun_failed=verbose3) + output_on_failure=verbose3) accumulate_result(test, result) except KeyboardInterrupt: interrupted = True @@ -760,7 +761,7 @@ def runtest(test, verbose, quiet, huntrleaks=False, debug=False, use_resources=None, - rerun_failed=False): + output_on_failure=False): """Run a single test. test -- the name of the test @@ -769,7 +770,7 @@ 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 Returns one of the test result constants: INTERRUPTED KeyboardInterrupt when run under -j @@ -783,27 +784,35 @@ if use_resources is not None: support.use_resources = use_resources 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: 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 -- Repository URL: http://hg.python.org/cpython
participants (1)
-
victor.stinner