"""
import builtins
+ import errno
+import faulthandler
import getopt
+ import io
import json
+ import logging
import os
+ import platform
import random
import re
import sys
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
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