]> granicus.if.org Git - python/commitdiff
(merge 3.2) Issue #12400: runtest() reuses the same io.StringIO instance for
authorVictor Stinner <victor.stinner@haypocalc.com>
Wed, 29 Jun 2011 13:25:40 +0000 (15:25 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Wed, 29 Jun 2011 13:25:40 +0000 (15:25 +0200)
all calls

 * Don't force verbose to True with option -W
 * Rename rerun_failed variable to output_on_failure

1  2 
Lib/test/regrtest.py

index ecd8b092c7de607a09fb282eb431c3ca7742078c,bb3e703f9ab231b1f60fa483dad8b53e4b57756d..d64494ed8229532e5147047868baea9ca1a865d5
@@@ -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()
              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
      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
  
      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