regrtest.py 56.8 KB
Newer Older
1
#! /usr/bin/env python3
2

3 4
"""
Usage:
5

6
python -m test [options] [test_name1 [test_name2 ...]]
7
python path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
8

9 10 11 12 13 14 15 16

If no arguments or options are provided, finds all files matching
the pattern "test_*" in the Lib/test subdirectory and runs
them in alphabetical order (but see -M and -u, below, for exceptions).

For more rigorous testing, it is useful to use the following
command line:

17
python -E -Wd -m test [options] [test_name1 ...]
18 19 20


Options:
21

22
-h/--help       -- print this text and exit
23 24
--timeout TIMEOUT
                -- dump the traceback and exit if a test takes more
25
                   than TIMEOUT seconds (default: 30 minutes); disable
26
                   the timeout if TIMEOUT is zero
27
--wait          -- wait for user input, e.g., allow a debugger to be attached
28 29 30 31 32 33 34

Verbosity

-v/--verbose    -- run tests in verbose mode with output to stdout
-w/--verbose2   -- re-run failed tests in verbose mode
-W/--verbose3   -- re-run failed tests in verbose mode immediately
-d/--debug      -- print traceback for failed tests
35
-q/--quiet      -- no output unless one or more tests fail
36
-S/--slow       -- print the slowest 10 tests
37
   --header     -- print header with interpreter info
38 39 40

Selecting tests

41
-r/--random     -- randomize test execution order (see below)
42
   --randseed   -- pass a random seed to reproduce a previous random run
43 44
-f/--fromfile   -- read names of tests to run from a file (see below)
-x/--exclude    -- arguments are tests to *exclude*
45
-s/--single     -- single step through a set of tests (see below)
46 47 48 49
-u/--use RES1,RES2,...
                -- specify which special resource intensive tests to run
-M/--memlimit LIMIT
                -- run very large memory-consuming tests
50 51 52
   --testdir DIR
                -- execute test files in the specified directory (instead
                   of the Python stdlib test suite)
53 54 55 56 57 58 59 60 61

Special runs

-l/--findleaks  -- if GC is available detect tests that leak memory
-L/--runleaks   -- run the leaks(1) command just before exit
-R/--huntrleaks RUNCOUNTS
                -- search for reference leaks (needs debug build, v. slow)
-j/--multiprocess PROCESSES
                -- run PROCESSES processes at once
62
-T/--coverage   -- turn on code coverage tracing using the trace module
63 64 65 66 67 68
-D/--coverdir DIRECTORY
                -- Directory where coverage files are put
-N/--nocoverdir -- Put coverage files alongside modules
-t/--threshold THRESHOLD
                -- call gc.set_threshold(THRESHOLD)
-n/--nowindows  -- suppress error message boxes on Windows
69
-F/--forever    -- run the specified tests in a loop, until an error happens
70

71 72

Additional Option Details:
73

74 75 76 77
-r randomizes test execution order. You can use --randseed=int to provide a
int seed value for the randomizer; this is useful for reproducing troublesome
test orders.

78 79 80 81 82 83 84 85 86 87
-s On the first invocation of regrtest using -s, the first test file found
or the first test file given on the command line is run, and the name of
the next test is recorded in a file named pynexttest.  If run from the
Python build directory, pynexttest is located in the 'build' subdirectory,
otherwise it is located in tempfile.gettempdir().  On subsequent runs,
the test in pynexttest is run, and the next test is written to pynexttest.
When the last test has been run, pynexttest is deleted.  In this way it
is possible to single step through the test files.  This is useful when
doing memory analysis on the Python interpreter, which process tends to
consume too many resources to run the full regression test non-stop.
88

89 90 91 92 93 94
-S is used to continue running tests after an aborted run.  It will
maintain the order a standard run (ie, this assumes -r is not used).
This is useful after the tests have prematurely stopped for some external
reason and you want to start running from where you left off rather
than starting from the beginning.

95 96 97 98
-f reads the names of tests from the file given as f's argument, one
or more test names per line.  Whitespace is ignored.  Blank lines and
lines beginning with '#' are ignored.  This is especially useful for
whittling down failures involving interactions among tests.
Tim Peters's avatar
Tim Peters committed
99

100 101 102 103
-L causes the leaks(1) command to be run just before exit if it exists.
leaks(1) is available on Mac OS X and presumably on some other
FreeBSD-derived systems.

104 105 106 107 108 109
-R runs each test several times and examines sys.gettotalrefcount() to
see if the test appears to be leaking references.  The argument should
be of the form stab:run:fname where 'stab' is the number of times the
test is run to let gettotalrefcount settle down, 'run' is the number
of times further it is run and 'fname' is the name of the file the
reports are written to.  These parameters all have defaults (5, 4 and
110
"reflog.txt" respectively), and the minimal invocation is '-R :'.
111

112 113
-M runs tests that require an exorbitant amount of memory. These tests
typically try to ascertain containers keep working when containing more than
114 115 116
2 billion objects, which only works on 64-bit systems. There are also some
tests that try to exhaust the address space of the process, which only makes
sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
117 118 119 120 121 122 123 124 125 126
which is a string in the form of '2.5Gb', determines howmuch memory the
tests will limit themselves to (but they may go slightly over.) The number
shouldn't be more memory than the machine has (including swap memory). You
should also keep in mind that swap memory is generally much, much slower
than RAM, and setting memlimit to all available RAM or higher will heavily
tax the machine. On the other hand, it is no use running these tests with a
limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
to use more than memlimit memory will be skipped. The big-memory tests
generally run very, very long.

127 128 129 130
-u is used to specify which special resource intensive tests to run,
such as those requiring large file support or network connectivity.
The argument is a comma-separated list of words indicating the
resources to test.  Currently only the following are defined:
131

132 133
    all -       Enable all special resources.

Guido van Rossum's avatar
Guido van Rossum committed
134 135 136 137
    audio -     Tests that use the audio device.  (There are known
                cases of broken audio drivers that can crash Python or
                even the Linux kernel.)

138 139
    curses -    Tests that use curses and will modify the terminal's
                state and output modes.
Tim Peters's avatar
Tim Peters committed
140

141 142 143
    largefile - It is okay to run some test that may create huge
                files.  These tests can take a long time and may
                consume >2GB of disk space temporarily.
144

145 146
    network -   It is okay to run tests that use external network
                resource, e.g. testing SSL support for sockets.
147

148 149 150
    decimal -   Test the decimal module against a large suite that
                verifies compliance with standards.

151
    cpu -       Used for certain CPU-heavy tests.
152

Tim Peters's avatar
Tim Peters committed
153
    subprocess  Run all tests for the subprocess module.
154

155 156
    urlfetch -  It is okay to download files required on testing.

157 158
    gui -       Run tests that require a running GUI.

159
To enable all resources except one, use '-uall,-<resource>'.  For
160 161
example, to run all the tests except for the gui tests, give the
option '-uall,-gui'.
162 163
"""

164
import builtins
165
import faulthandler
166
import getopt
167
import json
Christian Heimes's avatar
Christian Heimes committed
168
import os
169
import random
170
import re
171
import io
Christian Heimes's avatar
Christian Heimes committed
172 173
import sys
import time
174
import errno
175
import traceback
Christian Heimes's avatar
Christian Heimes committed
176
import warnings
Benjamin Peterson's avatar
Benjamin Peterson committed
177
import unittest
178
from inspect import isabstract
179
import tempfile
180 181
import platform
import sysconfig
182
import logging
183

184

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
# Some times __path__ and __file__ are not absolute (e.g. while running from
# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
# imports might fail.  This affects only the modules imported before os.chdir().
# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
# they are found in the CWD their __file__ and __path__ will be relative (this
# happens before the chdir).  All the modules imported after the chdir, are
# not found in the CWD, and since the other paths in sys.path[1:] are absolute
# (site.py absolutize them), the __file__ and __path__ will be absolute too.
# Therefore it is necessary to absolutize manually the __file__ and __path__ of
# the packages to prevent later imports to fail when the CWD is different.
for module in sys.modules.values():
    if hasattr(module, '__path__'):
        module.__path__ = [os.path.abspath(path) for path in module.__path__]
    if hasattr(module, '__file__'):
        module.__file__ = os.path.abspath(module.__file__)

201

202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
# MacOSX (a.k.a. Darwin) has a default stack size that is too small
# for deeply recursive regular expressions.  We see this as crashes in
# the Python test suite when running test_re.py and test_sre.py.  The
# fix is to set the stack limit to 2048.
# This approach may also be useful for other Unixy platforms that
# suffer from small default stack limits.
if sys.platform == 'darwin':
    try:
        import resource
    except ImportError:
        pass
    else:
        soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
        newsoft = min(hard, max(soft, 1024*2048))
        resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))

Benjamin Peterson's avatar
Benjamin Peterson committed
218 219 220 221 222 223 224
# Test result constants.
PASSED = 1
FAILED = 0
ENV_CHANGED = -1
SKIPPED = -2
RESOURCE_DENIED = -3
INTERRUPTED = -4
225
CHILD_ERROR = -5   # error in a child process
Benjamin Peterson's avatar
Benjamin Peterson committed
226

227
from test import support
228

229
RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network',
230
                  'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui')
231

232
TEMPDIR = os.path.abspath(tempfile.gettempdir())
233

234 235 236 237
def usage(msg):
    print(msg, file=sys.stderr)
    print("Use --help for usage", file=sys.stderr)
    sys.exit(2)
238 239


240
def main(tests=None, testdir=None, verbose=0, quiet=False,
241
         exclude=False, single=False, randomize=False, fromfile=None,
242
         findleaks=False, use_resources=None, trace=False, coverdir='coverage',
243
         runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
244
         random_seed=None, use_mp=None, verbose3=False, forever=False,
245
         header=False):
246 247
    """Execute a test suite.

248
    This also parses command-line options and modifies its behavior
249
    accordingly.
250 251 252 253 254 255

    tests -- a list of strings containing test names (optional)
    testdir -- the directory in which to look for tests (optional)

    Users other than the Python test suite will certainly want to
    specify testdir; if it's omitted, the directory containing the
256
    Python test suite is searched for.
257 258 259 260

    If the tests argument is omitted, the tests listed on the
    command-line will be used.  If that's empty, too, then all *.py
    files beginning with test_ will be used.
261

262
    The other default arguments (verbose, quiet, exclude,
263 264 265 266
    single, randomize, findleaks, use_resources, trace, coverdir,
    print_slow, and random_seed) allow programmers calling main()
    directly to set the values that would normally be set by flags
    on the command line.
267
    """
268 269 270 271

    # Display the Python traceback fatal errors (e.g. segfault)
    faulthandler.enable(all_threads=True)

272 273 274 275
    if hasattr(faulthandler, 'dump_tracebacks_later'):
        timeout = 60*60
    else:
        timeout = None
276

277 278
    replace_stdout()

279
    support.record_original_stdout(sys.stdout)
280
    try:
281
        opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:nj:',
282 283 284
            ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
             'exclude', 'single', 'slow', 'random', 'fromfile', 'findleaks',
             'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
285
             'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
286
             'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug',
287
             'start=', 'nowindows', 'header', 'testdir=', 'timeout=', 'wait'])
288 289
    except getopt.error as msg:
        usage(msg)
290 291

    # Defaults
292 293
    if random_seed is None:
        random_seed = random.randrange(10000000)
294 295
    if use_resources is None:
        use_resources = []
296 297
    debug = False
    start = None
298
    for o, a in opts:
299
        if o in ('-h', '--help'):
300 301
            print(__doc__)
            return
302 303
        elif o in ('-v', '--verbose'):
            verbose += 1
Martin v. Löwis's avatar
Martin v. Löwis committed
304 305
        elif o in ('-w', '--verbose2'):
            verbose2 = True
306 307
        elif o in ('-d', '--debug'):
            debug = True
308 309
        elif o in ('-W', '--verbose3'):
            verbose3 = True
310
        elif o in ('-q', '--quiet'):
311
            quiet = True;
312 313
            verbose = 0
        elif o in ('-x', '--exclude'):
314
            exclude = True
315 316
        elif o in ('-S', '--start'):
            start = a
317
        elif o in ('-s', '--single'):
318
            single = True
Christian Heimes's avatar
Christian Heimes committed
319 320
        elif o in ('-S', '--slow'):
            print_slow = True
321
        elif o in ('-r', '--randomize'):
322
            randomize = True
323 324
        elif o == '--randseed':
            random_seed = int(a)
Tim Peters's avatar
Tim Peters committed
325 326
        elif o in ('-f', '--fromfile'):
            fromfile = a
327
        elif o in ('-l', '--findleaks'):
328
            findleaks = True
329 330
        elif o in ('-L', '--runleaks'):
            runleaks = True
331 332 333
        elif o in ('-t', '--threshold'):
            import gc
            gc.set_threshold(int(a))
334 335
        elif o in ('-T', '--coverage'):
            trace = True
336
        elif o in ('-D', '--coverdir'):
337 338 339
            # CWD is replaced with a temporary dir before calling main(), so we
            # need  join it with the saved CWD so it goes where the user expects.
            coverdir = os.path.join(support.SAVEDCWD, a)
340 341
        elif o in ('-N', '--nocoverdir'):
            coverdir = None
342 343
        elif o in ('-R', '--huntrleaks'):
            huntrleaks = a.split(':')
344 345 346 347
            if len(huntrleaks) not in (2, 3):
                print(a, huntrleaks)
                usage('-R takes 2 or 3 colon-separated arguments')
            if not huntrleaks[0]:
348 349 350
                huntrleaks[0] = 5
            else:
                huntrleaks[0] = int(huntrleaks[0])
351
            if not huntrleaks[1]:
352 353 354
                huntrleaks[1] = 4
            else:
                huntrleaks[1] = int(huntrleaks[1])
355 356 357 358 359
            if len(huntrleaks) == 2 or not huntrleaks[2]:
                huntrleaks[2:] = ["reflog.txt"]
            # Avoid false positives due to the character cache in
            # stringobject.c filling slowly with random data
            warm_char_cache()
360
        elif o in ('-M', '--memlimit'):
361
            support.set_memlimit(a)
362
        elif o in ('-u', '--use'):
363 364
            u = [x.lower() for x in a.split(',')]
            for r in u:
365
                if r == 'all':
366 367 368 369 370 371
                    use_resources[:] = RESOURCE_NAMES
                    continue
                remove = False
                if r[0] == '-':
                    remove = True
                    r = r[1:]
372
                if r not in RESOURCE_NAMES:
373
                    usage('Invalid -u/--use option: ' + a)
374 375 376 377
                if remove:
                    if r in use_resources:
                        use_resources.remove(r)
                elif r not in use_resources:
378
                    use_resources.append(r)
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
        elif o in ('-n', '--nowindows'):
            import msvcrt
            msvcrt.SetErrorMode(msvcrt.SEM_FAILCRITICALERRORS|
                    msvcrt.SEM_NOALIGNMENTFAULTEXCEPT|
                    msvcrt.SEM_NOGPFAULTERRORBOX|
                    msvcrt.SEM_NOOPENFILEERRORBOX)
            try:
                msvcrt.CrtSetReportMode
            except AttributeError:
                # release build
                pass
            else:
                for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]:
                    msvcrt.CrtSetReportMode(m, msvcrt.CRTDBG_MODE_FILE)
                    msvcrt.CrtSetReportFile(m, msvcrt.CRTDBG_FILE_STDERR)
394 395
        elif o in ('-F', '--forever'):
            forever = True
396 397
        elif o in ('-j', '--multiprocess'):
            use_mp = int(a)
398 399 400 401 402 403 404
            if use_mp <= 0:
                try:
                    import multiprocessing
                    # Use all cores + extras for tests that like to sleep
                    use_mp = 2 + multiprocessing.cpu_count()
                except (ImportError, NotImplementedError):
                    use_mp = 3
405 406
        elif o == '--header':
            header = True
407 408 409 410 411
        elif o == '--slaveargs':
            args, kwargs = json.loads(a)
            try:
                result = runtest(*args, **kwargs)
            except BaseException as e:
Benjamin Peterson's avatar
Benjamin Peterson committed
412
                result = INTERRUPTED, e.__class__.__name__
413 414 415 416
            sys.stdout.flush()
            print()   # Force a newline (just in case)
            print(json.dumps(result))
            sys.exit(0)
417 418 419 420
        elif o == '--testdir':
            # CWD is replaced with a temporary dir before calling main(), so we
            # join it with the saved CWD so it ends up where the user expects.
            testdir = os.path.join(support.SAVEDCWD, a)
421
        elif o == '--timeout':
422 423 424 425
            if not hasattr(faulthandler, 'dump_tracebacks_later'):
                print("--timeout option requires "
                      "faulthandler.dump_tracebacks_later", file=sys.stderr)
                sys.exit(1)
426
            timeout = float(a)
427 428
        elif o == '--wait':
            input("Press any key to continue...")
429 430
        else:
            print(("No handler for option {}.  Please report this as a bug "
431
                   "at http://bugs.python.org.").format(o), file=sys.stderr)
432
            sys.exit(1)
Tim Peters's avatar
Tim Peters committed
433
    if single and fromfile:
434
        usage("-s and -f don't go together!")
435
    if use_mp and trace:
436
        usage("-T and -j don't go together!")
437
    if use_mp and findleaks:
438
        usage("-l and -j don't go together!")
439

440 441 442
    good = []
    bad = []
    skipped = []
443
    resource_denieds = []
444
    environment_changed = []
445
    interrupted = False
446

447
    if findleaks:
448 449 450
        try:
            import gc
        except ImportError:
451
            print('No GC available, disabling findleaks.')
452
            findleaks = False
453
        else:
454 455 456 457
            # Uncomment the line below to report garbage that is not
            # freeable by reference counting alone.  By default only
            # garbage that is not collectable by the GC is reported.
            #gc.set_debug(gc.DEBUG_SAVEALL)
458
            found_garbage = []
459

460
    if single:
461
        filename = os.path.join(TEMPDIR, 'pynexttest')
462 463
        try:
            fp = open(filename, 'r')
464 465
            next_test = fp.read().strip()
            tests = [next_test]
466 467 468
            fp.close()
        except IOError:
            pass
Tim Peters's avatar
Tim Peters committed
469 470 471

    if fromfile:
        tests = []
472
        fp = open(os.path.join(support.SAVEDCWD, fromfile))
473
        count_pat = re.compile(r'\[\s*\d+/\s*\d+\]')
Tim Peters's avatar
Tim Peters committed
474
        for line in fp:
475
            line = count_pat.sub('', line)
Tim Peters's avatar
Tim Peters committed
476 477 478 479 480 481
            guts = line.split() # assuming no test has whitespace in its name
            if guts and not guts[0].startswith('#'):
                tests.extend(guts)
        fp.close()

    # Strip .py extensions.
482 483
    removepy(args)
    removepy(tests)
Tim Peters's avatar
Tim Peters committed
484

485
    stdtests = STDTESTS[:]
486
    nottests = NOTTESTS.copy()
487
    if exclude:
488 489 490
        for arg in args:
            if arg in stdtests:
                stdtests.remove(arg)
491
            nottests.add(arg)
492
        args = []
493 494

    # For a partial run, we do not need to clutter the output.
495
    if verbose or header or not (quiet or single or tests or args):
496 497
        # Print basic platform information
        print("==", platform.python_implementation(), *sys.version.split())
498 499
        print("==  ", platform.platform(aliased=True),
                      "%s-endian" % sys.byteorder)
500
        print("==  ", os.getcwd())
501
        print("Testing with flags:", sys.flags)
502

503 504 505 506 507 508 509
    # if testdir is set, then we are not running the python tests suite, so
    # don't add default tests to be executed or skipped (pass empty values)
    if testdir:
        alltests = findtests(testdir, list(), set())
    else:
        alltests = findtests(testdir, stdtests, nottests)

510
    selected = tests or args or alltests
511
    if single:
512
        selected = selected[:1]
513
        try:
514
            next_single_test = alltests[alltests.index(selected[0])+1]
515 516
        except IndexError:
            next_single_test = None
517 518 519 520 521 522
    # Remove all the tests that precede start if it's set.
    if start:
        try:
            del tests[:tests.index(start)]
        except ValueError:
            print("Couldn't find starting test (%s), using all tests" % start)
523
    if randomize:
524 525
        random.seed(random_seed)
        print("Using random seed", random_seed)
526
        random.shuffle(selected)
527
    if trace:
528 529 530
        import trace, tempfile
        tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,
                                         tempfile.gettempdir()],
531
                             trace=False, count=True)
532

Christian Heimes's avatar
Christian Heimes committed
533
    test_times = []
534 535
    support.verbose = verbose      # Tell tests to be moderately quiet
    support.use_resources = use_resources
536
    save_modules = sys.modules.keys()
537 538 539 540

    def accumulate_result(test, result):
        ok, test_time = result
        test_times.append((test_time, test))
Benjamin Peterson's avatar
Benjamin Peterson committed
541
        if ok == PASSED:
542
            good.append(test)
Benjamin Peterson's avatar
Benjamin Peterson committed
543
        elif ok == FAILED:
544
            bad.append(test)
Benjamin Peterson's avatar
Benjamin Peterson committed
545 546 547 548
        elif ok == ENV_CHANGED:
            bad.append(test)
            environment_changed.append(test)
        elif ok == SKIPPED:
549
            skipped.append(test)
Benjamin Peterson's avatar
Benjamin Peterson committed
550 551 552
        elif ok == RESOURCE_DENIED:
            skipped.append(test)
            resource_denieds.append(test)
553

554
    if forever:
555
        def test_forever(tests=list(selected)):
556 557 558 559 560 561
            while True:
                for test in tests:
                    yield test
                    if bad:
                        return
        tests = test_forever()
Georg Brandl's avatar
Georg Brandl committed
562 563
        test_count = ''
        test_count_width = 3
564
    else:
565
        tests = iter(selected)
Georg Brandl's avatar
Georg Brandl committed
566 567
        test_count = '/{}'.format(len(selected))
        test_count_width = len(test_count) - 1
568

569
    if use_mp:
570 571 572 573 574
        try:
            from threading import Thread
        except ImportError:
            print("Multiprocess option requires thread support")
            sys.exit(2)
575 576
        from queue import Queue
        from subprocess import Popen, PIPE
577 578
        debug_output_pat = re.compile(r"\[\d+ refs\]$")
        output = Queue()
579 580 581
        def tests_and_args():
            for test in tests:
                args_tuple = (
582
                    (test, verbose, quiet),
583
                    dict(huntrleaks=huntrleaks, use_resources=use_resources,
584
                         debug=debug, rerun_failed=verbose3, timeout=timeout)
585 586 587
                )
                yield (test, args_tuple)
        pending = tests_and_args()
588 589
        opt_args = support.args_from_interpreter_flags()
        base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
590 591
        def work():
            # A worker thread.
592
            try:
593 594
                while True:
                    try:
595 596
                        test, args_tuple = next(pending)
                    except StopIteration:
597
                        output.put((None, None, None, None))
598 599
                        return
                    # -E is needed by some tests, e.g. test_import
600
                    popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
601
                                   stdout=PIPE, stderr=PIPE,
602 603
                                   universal_newlines=True,
                                   close_fds=(os.name != 'nt'))
604
                    stdout, stderr = popen.communicate()
605
                    retcode = popen.wait()
606 607 608 609
                    # Strip last refcount output line if it exists, since it
                    # comes from the shutdown of the interpreter in the subcommand.
                    stderr = debug_output_pat.sub("", stderr)
                    stdout, _, result = stdout.strip().rpartition("\n")
610 611 612 613
                    if retcode != 0:
                        result = (CHILD_ERROR, "Exit code %s" % retcode)
                        output.put((test, stdout.rstrip(), stderr.rstrip(), result))
                        return
614 615 616
                    if not result:
                        output.put((None, None, None, None))
                        return
617
                    result = json.loads(result)
618
                    output.put((test, stdout.rstrip(), stderr.rstrip(), result))
619
            except BaseException:
620
                output.put((None, None, None, None))
621
                raise
622 623 624 625
        workers = [Thread(target=work) for i in range(use_mp)]
        for worker in workers:
            worker.start()
        finished = 0
626
        test_index = 1
627 628 629 630 631 632
        try:
            while finished < use_mp:
                test, stdout, stderr, result = output.get()
                if test is None:
                    finished += 1
                    continue
633
                accumulate_result(test, result)
634
                if not quiet:
635 636
                    fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
                    print(fmt.format(
637 638
                        test_count_width, test_index, test_count,
                        len(bad), test))
639 640 641 642 643 644 645
                if stdout:
                    print(stdout)
                if stderr:
                    print(stderr, file=sys.stderr)
                if result[0] == INTERRUPTED:
                    assert result[1] == 'KeyboardInterrupt'
                    raise KeyboardInterrupt   # What else?
646
                if result[0] == CHILD_ERROR:
647
                    raise Exception("Child error on {}: {}".format(test, result[1]))
648
                test_index += 1
649
        except KeyboardInterrupt:
650
            interrupted = True
651
            pending.close()
652 653 654
        for worker in workers:
            worker.join()
    else:
655
        for test_index, test in enumerate(tests, 1):
656
            if not quiet:
657 658
                fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
                print(fmt.format(
659
                    test_count_width, test_index, test_count, len(bad), test))
660 661 662 663
                sys.stdout.flush()
            if trace:
                # If we're tracing code coverage, then we don't exit with status
                # if on a false return value from main.
664
                tracer.runctx('runtest(test, verbose, quiet, timeout=timeout)',
665
                              globals=globals(), locals=vars())
666
            else:
667
                try:
668
                    result = runtest(test, verbose, quiet, huntrleaks, debug,
669
                                     rerun_failed=verbose3, timeout=timeout)
Benjamin Peterson's avatar
Benjamin Peterson committed
670
                    accumulate_result(test, result)
671
                except KeyboardInterrupt:
672
                    interrupted = True
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
                    break
                except:
                    raise
            if findleaks:
                gc.collect()
                if gc.garbage:
                    print("Warning: test created", len(gc.garbage), end=' ')
                    print("uncollectable object(s).")
                    # move the uncollectable objects somewhere so we don't see
                    # them again
                    found_garbage.extend(gc.garbage)
                    del gc.garbage[:]
            # Unload the newly imported modules (best effort finalization)
            for module in sys.modules.keys():
                if module not in save_modules and module.startswith("test."):
                    support.unload(module)
689

690 691 692 693 694 695 696
    if interrupted:
        # print a newline after ^C
        print()
        print("Test suite interrupted by signal SIGINT.")
        omitted = set(selected) - set(good) - set(bad) - set(skipped)
        print(count(len(omitted), "test"), "omitted:")
        printlist(omitted)
697
    if good and not quiet:
698
        if not bad and not skipped and not interrupted and len(good) > 1:
699 700
            print("All", end=' ')
        print(count(len(good), "test"), "OK.")
Christian Heimes's avatar
Christian Heimes committed
701 702
    if print_slow:
        test_times.sort(reverse=True)
703
        print("10 slowest tests:")
Christian Heimes's avatar
Christian Heimes committed
704
        for time, test in test_times[:10]:
705
            print("%s: %.1fs" % (test, time))
706
    if bad:
707 708 709 710 711 712 713 714
        bad = sorted(set(bad) - set(environment_changed))
        if bad:
            print(count(len(bad), "test"), "failed:")
            printlist(bad)
        if environment_changed:
            print("{} altered the execution environment:".format(
                     count(len(environment_changed), "test")))
            printlist(environment_changed)
715
    if skipped and not quiet:
716
        print(count(len(skipped), "test"), "skipped:")
717
        printlist(skipped)
718

719
        e = _ExpectedSkips()
720
        plat = sys.platform
721
        if e.isvalid():
722
            surprise = set(skipped) - e.getexpected() - set(resource_denieds)
723
            if surprise:
724 725
                print(count(len(surprise), "skip"), \
                      "unexpected on", plat + ":")
726
                printlist(surprise)
727
            else:
728
                print("Those skips are all expected on", plat + ".")
729
        else:
730 731
            print("Ask someone to teach regrtest.py about which tests are")
            print("expected to get skipped on", plat + ".")
732

Martin v. Löwis's avatar
Martin v. Löwis committed
733
    if verbose2 and bad:
734
        print("Re-running failed tests in verbose mode")
Martin v. Löwis's avatar
Martin v. Löwis committed
735
        for test in bad:
736
            print("Re-running test %r in verbose mode" % test)
737
            sys.stdout.flush()
Martin v. Löwis's avatar
Martin v. Löwis committed
738
            try:
739
                verbose = True
740
                ok = runtest(test, True, quiet, huntrleaks, debug, timeout=timeout)
Martin v. Löwis's avatar
Martin v. Löwis committed
741 742
            except KeyboardInterrupt:
                # print a newline separate from the ^C
743
                print()
Martin v. Löwis's avatar
Martin v. Löwis committed
744 745 746 747
                break
            except:
                raise

748
    if single:
749 750 751
        if next_single_test:
            with open(filename, 'w') as fp:
                fp.write(next_single_test + '\n')
752 753 754
        else:
            os.unlink(filename)

755 756 757 758
    if trace:
        r = tracer.results()
        r.write_results(show_missing=True, summary=True, coverdir=coverdir)

759 760 761
    if runleaks:
        os.system("leaks %d" % os.getpid())

762
    sys.exit(len(bad) > 0 or interrupted)
763

764

765 766
# small set of tests to determine if we have a basically functioning interpreter
# (i.e. if any of these fail, then anything else is likely to follow)
767
STDTESTS = [
768 769
    'test_grammar',
    'test_opcodes',
770
    'test_dict',
771 772 773
    'test_builtin',
    'test_exceptions',
    'test_types',
774 775 776
    'test_unittest',
    'test_doctest',
    'test_doctest2',
777
]
778

779
# set of tests that we don't want to be executed when using regrtest
780
NOTTESTS = set()
781

782
def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
783
    """Return a list of all applicable test modules."""
784
    testdir = findtestdir(testdir)
785 786
    names = os.listdir(testdir)
    tests = []
787
    others = set(stdtests) | nottests
788
    for name in names:
789 790 791
        mod, ext = os.path.splitext(name)
        if mod[:5] == "test_" and ext in (".py", "") and mod not in others:
            tests.append(mod)
792
    return stdtests + sorted(tests)
793

794 795 796
def replace_stdout():
    """Set stdout encoder error handler to backslashreplace (as stderr error
    handler) to avoid UnicodeEncodeError when printing a traceback"""
797 798 799
    if os.name == "nt":
        # Replace sys.stdout breaks the stdout newlines on Windows: issue #8533
        return
800 801 802

    import atexit

803 804 805
    stdout = sys.stdout
    sys.stdout = open(stdout.fileno(), 'w',
        encoding=stdout.encoding,
806 807 808 809 810 811 812
        errors="backslashreplace",
        closefd=False)

    def restore_stdout():
        sys.stdout.close()
        sys.stdout = stdout
    atexit.register(restore_stdout)
813

814
def runtest(test, verbose, quiet,
815
            huntrleaks=False, debug=False, use_resources=None,
816
            rerun_failed=False, timeout=None):
817
    """Run a single test.
818

819 820
    test -- the name of the test
    verbose -- if true, print more messages
821
    quiet -- if true, don't print 'skipped' messages (probably redundant)
Christian Heimes's avatar
Christian Heimes committed
822
    test_times -- a list of (time, test_name) pairs
823 824
    huntrleaks -- run multiple times to test for leaks; requires a debug
                  build; a triple corresponding to -R's three arguments
825
    rerun_failed -- if true, re-run in verbose mode when failed
826 827
    timeout -- dump the traceback and exit if a test takes more than
               timeout seconds
Benjamin Peterson's avatar
Benjamin Peterson committed
828 829 830 831 832 833 834 835

    Returns one of the test result constants:
        INTERRUPTED      KeyboardInterrupt when run under -j
        RESOURCE_DENIED  test skipped because resource denied
        SKIPPED          test skipped for some other reason
        ENV_CHANGED      test failed because it changed the execution environment
        FAILED           test failed
        PASSED           test passed
836
    """
Thomas Wouters's avatar
Thomas Wouters committed
837

838 839 840
    support.verbose = verbose  # Tell tests to be moderately quiet
    if use_resources is not None:
        support.use_resources = use_resources
841 842
    use_timeout = (timeout is not None and timeout > 0)
    if use_timeout:
843
        faulthandler.dump_tracebacks_later(timeout, exit=True)
844
    try:
845 846 847 848 849 850
        result = runtest_inner(test, verbose, quiet, huntrleaks, debug)
        if result[0] == FAILED and rerun_failed:
            cleanup_test_droppings(test, verbose)
            sys.stdout.flush()
            sys.stderr.flush()
            print("Re-running test {} in verbose mode".format(test))
851
            runtest(test, True, quiet, huntrleaks, debug, timeout=timeout)
852
        return result
853
    finally:
854
        if use_timeout:
855
            faulthandler.cancel_dump_tracebacks_later()
856 857
        cleanup_test_droppings(test, verbose)

858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
# Unit tests are supposed to leave the execution environment unchanged
# once they complete.  But sometimes tests have bugs, especially when
# tests fail, and the changes to environment go on to mess up other
# tests.  This can cause issues with buildbot stability, since tests
# are run in random order and so problems may appear to come and go.
# There are a few things we can save and restore to mitigate this, and
# the following context manager handles this task.

class saved_test_environment:
    """Save bits of the test environment and restore them at block exit.

        with saved_test_environment(testname, verbose, quiet):
            #stuff

    Unless quiet is True, a warning is printed to stderr if any of
    the saved items was changed by the test.  The attribute 'changed'
    is initially False, but is set to True if a change is detected.

    If verbose is more than 1, the before and after state of changed
    items is also printed.
    """

    changed = False

    def __init__(self, testname, verbose=0, quiet=False):
        self.testname = testname
        self.verbose = verbose
        self.quiet = quiet

    # To add things to save and restore, add a name XXX to the resources list
    # and add corresponding get_XXX/restore_XXX functions.  get_XXX should
    # return the value to be saved and compared against a second call to the
    # get function when test execution completes.  restore_XXX should accept
    # the saved value and restore the resource using it.  It will be called if
    # and only if a change in the value is detected.
    #
    # Note: XXX will have any '.' replaced with '_' characters when determining
    # the corresponding method names.

    resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
898
                 'os.environ', 'sys.path', 'sys.path_hooks', '__import__',
899
                 'warnings.filters', 'asyncore.socket_map',
Ezio Melotti's avatar
Ezio Melotti committed
900
                 'logging._handlers', 'logging._handlerList', 'sys.gettrace',
901
                 'sys.warnoptions')
902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941

    def get_sys_argv(self):
        return id(sys.argv), sys.argv, sys.argv[:]
    def restore_sys_argv(self, saved_argv):
        sys.argv = saved_argv[1]
        sys.argv[:] = saved_argv[2]

    def get_cwd(self):
        return os.getcwd()
    def restore_cwd(self, saved_cwd):
        os.chdir(saved_cwd)

    def get_sys_stdout(self):
        return sys.stdout
    def restore_sys_stdout(self, saved_stdout):
        sys.stdout = saved_stdout

    def get_sys_stderr(self):
        return sys.stderr
    def restore_sys_stderr(self, saved_stderr):
        sys.stderr = saved_stderr

    def get_sys_stdin(self):
        return sys.stdin
    def restore_sys_stdin(self, saved_stdin):
        sys.stdin = saved_stdin

    def get_os_environ(self):
        return id(os.environ), os.environ, dict(os.environ)
    def restore_os_environ(self, saved_environ):
        os.environ = saved_environ[1]
        os.environ.clear()
        os.environ.update(saved_environ[2])

    def get_sys_path(self):
        return id(sys.path), sys.path, sys.path[:]
    def restore_sys_path(self, saved_path):
        sys.path = saved_path[1]
        sys.path[:] = saved_path[2]

942 943 944 945 946 947
    def get_sys_path_hooks(self):
        return id(sys.path_hooks), sys.path_hooks, sys.path_hooks[:]
    def restore_sys_path_hooks(self, saved_hooks):
        sys.path_hooks = saved_hooks[1]
        sys.path_hooks[:] = saved_hooks[2]

948 949 950 951 952
    def get_sys_gettrace(self):
        return sys.gettrace()
    def restore_sys_gettrace(self, trace_fxn):
        sys.settrace(trace_fxn)

953
    def get___import__(self):
954
        return builtins.__import__
955
    def restore___import__(self, import_):
956
        builtins.__import__ = import_
957

958 959 960 961 962 963
    def get_warnings_filters(self):
        return id(warnings.filters), warnings.filters, warnings.filters[:]
    def restore_warnings_filters(self, saved_filters):
        warnings.filters = saved_filters[1]
        warnings.filters[:] = saved_filters[2]

964 965
    def get_asyncore_socket_map(self):
        asyncore = sys.modules.get('asyncore')
966 967
        # XXX Making a copy keeps objects alive until __exit__ gets called.
        return asyncore and asyncore.socket_map.copy() or {}
968 969 970
    def restore_asyncore_socket_map(self, saved_map):
        asyncore = sys.modules.get('asyncore')
        if asyncore is not None:
971
            asyncore.close_all(ignore_all=True)
972 973
            asyncore.socket_map.update(saved_map)

974 975
    def get_logging__handlers(self):
        # _handlers is a WeakValueDictionary
976
        return id(logging._handlers), logging._handlers, logging._handlers.copy()
977 978 979 980
    def restore_logging__handlers(self, saved_handlers):
        # Can't easily revert the logging state
        pass

981 982 983 984 985 986 987
    def get_logging__handlerList(self):
        # _handlerList is a list of weakrefs to handlers
        return id(logging._handlerList), logging._handlerList, logging._handlerList[:]
    def restore_logging__handlerList(self, saved_handlerList):
        # Can't easily revert the logging state
        pass

988 989 990 991 992 993
    def get_sys_warnoptions(self):
        return id(sys.warnoptions), sys.warnoptions, sys.warnoptions[:]
    def restore_sys_warnoptions(self, saved_options):
        sys.warnoptions = saved_options[1]
        sys.warnoptions[:] = saved_options[2]

994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
    def resource_info(self):
        for name in self.resources:
            method_suffix = name.replace('.', '_')
            get_name = 'get_' + method_suffix
            restore_name = 'restore_' + method_suffix
            yield name, getattr(self, get_name), getattr(self, restore_name)

    def __enter__(self):
        self.saved_values = dict((name, get()) for name, get, restore
                                                   in self.resource_info())
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
1007 1008
        saved_values = self.saved_values
        del self.saved_values
1009 1010
        for name, get, restore in self.resource_info():
            current = get()
1011
            original = saved_values.pop(name)
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
            # Check for changes to the resource's value
            if current != original:
                self.changed = True
                restore(original)
                if not self.quiet:
                    print("Warning -- {} was modified by {}".format(
                                                 name, self.testname),
                                                 file=sys.stderr)
                    if self.verbose > 1:
                        print("  Before: {}\n  After:  {} ".format(
                                                  original, current),
                                                  file=sys.stderr)
        return False


1027
def runtest_inner(test, verbose, quiet, huntrleaks=False, debug=False):
1028
    support.unload(test)
Benjamin Peterson's avatar
Benjamin Peterson committed
1029 1030 1031 1032
    if verbose:
        capture_stdout = None
    else:
        capture_stdout = io.StringIO()
Thomas Wouters's avatar
Thomas Wouters committed
1033

1034
    test_time = 0.0
1035
    refleak = False  # True if the test leaked references.
1036
    try:
R. David Murray's avatar
R. David Murray committed
1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
        if test.startswith('test.'):
            abstest = test
        else:
            # Always import it from the test package
            abstest = 'test.' + test
        with saved_test_environment(test, verbose, quiet) as environment:
            start_time = time.time()
            the_package = __import__(abstest, globals(), locals(), [])
            the_module = getattr(the_package, test)
            # Old tests run to completion simply as a side-effect of
            # being imported.  For tests based on unittest or doctest,
            # explicitly invoke their test_main() function (if it exists).
            indirect_test = getattr(the_module, "test_main", None)
            if indirect_test is not None:
                indirect_test()
            if huntrleaks:
                refleak = dash_R(the_module, test, indirect_test,
                    huntrleaks)
            test_time = time.time() - start_time
1056
    except support.ResourceDenied as msg:
1057
        if not quiet:
1058
            print(test, "skipped --", msg)
1059
            sys.stdout.flush()
Benjamin Peterson's avatar
Benjamin Peterson committed
1060
        return RESOURCE_DENIED, test_time
1061
    except unittest.SkipTest as msg:
1062
        if not quiet:
1063
            print(test, "skipped --", msg)
1064
            sys.stdout.flush()
Benjamin Peterson's avatar
Benjamin Peterson committed
1065
        return SKIPPED, test_time
1066 1067
    except KeyboardInterrupt:
        raise
1068
    except support.TestFailed as msg:
1069 1070
        print("test", test, "failed --", msg, file=sys.stderr)
        sys.stderr.flush()
Benjamin Peterson's avatar
Benjamin Peterson committed
1071
        return FAILED, test_time
1072
    except:
1073 1074
        msg = traceback.format_exc()
        print("test", test, "crashed --", msg, file=sys.stderr)
1075
        sys.stderr.flush()
Benjamin Peterson's avatar
Benjamin Peterson committed
1076
        return FAILED, test_time
1077
    else:
1078
        if refleak:
Benjamin Peterson's avatar
Benjamin Peterson committed
1079
            return FAILED, test_time
1080
        if environment.changed:
Benjamin Peterson's avatar
Benjamin Peterson committed
1081 1082
            return ENV_CHANGED, test_time
        return PASSED, test_time
1083

1084 1085
def cleanup_test_droppings(testname, verbose):
    import shutil
Benjamin Peterson's avatar
Benjamin Peterson committed
1086
    import stat
1087 1088 1089 1090
    import gc

    # First kill any dangling references to open files etc.
    # This can also issue some ResourceWarnings which would otherwise get
Antoine Pitrou's avatar
Antoine Pitrou committed
1091
    # triggered during the following test run, and possibly produce failures.
1092
    gc.collect()
1093 1094 1095 1096 1097 1098 1099

    # Try to clean up junk commonly left behind.  While tests shouldn't leave
    # any files or directories behind, when a test fails that can be tedious
    # for it to arrange.  The consequences can be especially nasty on Windows,
    # since if a test leaves a file open, it cannot be deleted by name (while
    # there's nothing we can do about that here either, we can display the
    # name of the offending test, which is a real help).
1100
    for name in (support.TESTFN,
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
                 "db_home",
                ):
        if not os.path.exists(name):
            continue

        if os.path.isdir(name):
            kind, nuker = "directory", shutil.rmtree
        elif os.path.isfile(name):
            kind, nuker = "file", os.unlink
        else:
            raise SystemError("os.path says %r exists but is neither "
                              "directory nor file" % name)

        if verbose:
1115
            print("%r left behind %s %r" % (testname, kind, name))
1116
        try:
Benjamin Peterson's avatar
Benjamin Peterson committed
1117 1118 1119 1120
            # if we have chmod, fix possible permissions problems
            # that might prevent cleanup
            if (hasattr(os, 'chmod')):
                os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
1121
            nuker(name)
1122 1123 1124
        except Exception as msg:
            print(("%r left behind %s %r and it couldn't be "
                "removed: %s" % (testname, kind, name, msg)), file=sys.stderr)
1125

Thomas Wouters's avatar
Thomas Wouters committed
1126
def dash_R(the_module, test, indirect_test, huntrleaks):
1127 1128 1129 1130 1131
    """Run a test multiple times, looking for reference leaks.

    Returns:
        False if the test didn't leak references; True if we detected refleaks.
    """
Thomas Wouters's avatar
Thomas Wouters committed
1132
    # This code is hackish and inelegant, but it seems to do the job.
1133 1134
    import copyreg
    import collections.abc
Thomas Wouters's avatar
Thomas Wouters committed
1135 1136 1137 1138 1139 1140 1141

    if not hasattr(sys, 'gettotalrefcount'):
        raise Exception("Tracking reference leaks requires a debug build "
                        "of Python")

    # Save current values for dash_R_cleanup() to restore.
    fs = warnings.filters[:]
1142
    ps = copyreg.dispatch_table.copy()
Thomas Wouters's avatar
Thomas Wouters committed
1143
    pic = sys.path_importer_cache.copy()
Nick Coghlan's avatar
Nick Coghlan committed
1144 1145 1146 1147 1148 1149
    try:
        import zipimport
    except ImportError:
        zdc = None # Run unmodified on platforms without zipimport support
    else:
        zdc = zipimport._zip_directory_cache.copy()
1150
    abcs = {}
1151
    for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]:
1152
        if not isabstract(abc):
1153 1154 1155
            continue
        for obj in abc.__subclasses__() + [abc]:
            abcs[obj] = obj._abc_registry.copy()
Thomas Wouters's avatar
Thomas Wouters committed
1156 1157 1158 1159 1160 1161

    if indirect_test:
        def run_the_test():
            indirect_test()
    else:
        def run_the_test():
1162 1163
            del sys.modules[the_module.__name__]
            exec('import ' + the_module.__name__)
Thomas Wouters's avatar
Thomas Wouters committed
1164 1165 1166

    deltas = []
    nwarmup, ntracked, fname = huntrleaks
1167
    fname = os.path.join(support.SAVEDCWD, fname)
Thomas Wouters's avatar
Thomas Wouters committed
1168
    repcount = nwarmup + ntracked
1169 1170
    print("beginning", repcount, "repetitions", file=sys.stderr)
    print(("1234567890"*(repcount//10 + 1))[:repcount], file=sys.stderr)
1171
    sys.stderr.flush()
Nick Coghlan's avatar
Nick Coghlan committed
1172
    dash_R_cleanup(fs, ps, pic, zdc, abcs)
Thomas Wouters's avatar
Thomas Wouters committed
1173
    for i in range(repcount):
1174
        rc_before = sys.gettotalrefcount()
Thomas Wouters's avatar
Thomas Wouters committed
1175 1176
        run_the_test()
        sys.stderr.write('.')
1177
        sys.stderr.flush()
Nick Coghlan's avatar
Nick Coghlan committed
1178
        dash_R_cleanup(fs, ps, pic, zdc, abcs)
1179
        rc_after = sys.gettotalrefcount()
Thomas Wouters's avatar
Thomas Wouters committed
1180
        if i >= nwarmup:
1181
            deltas.append(rc_after - rc_before)
1182
    print(file=sys.stderr)
Thomas Wouters's avatar
Thomas Wouters committed
1183
    if any(deltas):
1184
        msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1185
        print(msg, file=sys.stderr)
1186 1187 1188 1189
        sys.stderr.flush()
        with open(fname, "a") as refrep:
            print(msg, file=refrep)
            refrep.flush()
1190 1191
        return True
    return False
Thomas Wouters's avatar
Thomas Wouters committed
1192

Nick Coghlan's avatar
Nick Coghlan committed
1193
def dash_R_cleanup(fs, ps, pic, zdc, abcs):
1194
    import gc, copyreg
Brett Cannon's avatar
Brett Cannon committed
1195
    import _strptime, linecache
Jeremy Hylton's avatar
Jeremy Hylton committed
1196
    import urllib.parse, urllib.request, mimetypes, doctest
1197
    import struct, filecmp, collections.abc
Thomas Wouters's avatar
Thomas Wouters committed
1198
    from distutils.dir_util import _path_created
1199
    from weakref import WeakSet
Thomas Wouters's avatar
Thomas Wouters committed
1200

Christian Heimes's avatar
Christian Heimes committed
1201 1202 1203 1204 1205
    # Clear the warnings registry, so they can be displayed again
    for mod in sys.modules.values():
        if hasattr(mod, '__warningregistry__'):
            del mod.__warningregistry__

Thomas Wouters's avatar
Thomas Wouters committed
1206 1207
    # Restore some original values.
    warnings.filters[:] = fs
1208 1209
    copyreg.dispatch_table.clear()
    copyreg.dispatch_table.update(ps)
Thomas Wouters's avatar
Thomas Wouters committed
1210 1211
    sys.path_importer_cache.clear()
    sys.path_importer_cache.update(pic)
Nick Coghlan's avatar
Nick Coghlan committed
1212 1213 1214 1215 1216 1217 1218
    try:
        import zipimport
    except ImportError:
        pass # Run unmodified on platforms without zipimport support
    else:
        zipimport._zip_directory_cache.clear()
        zipimport._zip_directory_cache.update(zdc)
Thomas Wouters's avatar
Thomas Wouters committed
1219

1220
    # clear type cache
Christian Heimes's avatar
Christian Heimes committed
1221
    sys._clear_type_cache()
1222

1223
    # Clear ABC registries, restoring previously saved ABC registries.
1224
    for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]:
1225
        if not isabstract(abc):
1226
            continue
1227
        for obj in abc.__subclasses__() + [abc]:
1228
            obj._abc_registry = abcs.get(obj, WeakSet()).copy()
1229 1230
            obj._abc_cache.clear()
            obj._abc_negative_cache.clear()
1231

1232 1233 1234 1235 1236 1237
    # Flush standard output, so that buffered data is sent to the OS and
    # associated Python objects are reclaimed.
    for stream in (sys.stdout, sys.stderr, sys.__stdout__, sys.__stderr__):
        if stream is not None:
            stream.flush()

Thomas Wouters's avatar
Thomas Wouters committed
1238 1239 1240 1241
    # Clear assorted module caches.
    _path_created.clear()
    re.purge()
    _strptime._regex_cache.clear()
Jeremy Hylton's avatar
Jeremy Hylton committed
1242 1243
    urllib.parse.clear_cache()
    urllib.request.urlcleanup()
Thomas Wouters's avatar
Thomas Wouters committed
1244 1245 1246
    linecache.clearcache()
    mimetypes._default_mime_types()
    filecmp._cache.clear()
1247
    struct._clearcache()
Thomas Wouters's avatar
Thomas Wouters committed
1248 1249 1250 1251 1252
    doctest.master = None

    # Collect cyclic trash.
    gc.collect()

1253 1254 1255 1256 1257
def warm_char_cache():
    s = bytes(range(256))
    for i in range(256):
        s[i:i+1]

1258 1259
def findtestdir(path=None):
    return path or os.path.dirname(__file__) or os.curdir
1260

1261 1262 1263 1264 1265 1266 1267
def removepy(names):
    if not names:
        return
    for idx, name in enumerate(names):
        basename, ext = os.path.splitext(name)
        if ext == '.py':
            names[idx] = basename
Tim Peters's avatar
Tim Peters committed
1268

1269 1270
def count(n, word):
    if n == 1:
1271
        return "%d %s" % (n, word)
1272
    else:
1273
        return "%d %ss" % (n, word)
1274

1275
def printlist(x, width=70, indent=4):
1276
    """Print the elements of iterable x to stdout.
1277 1278 1279 1280 1281 1282

    Optional arg width (default 70) is the maximum line length.
    Optional arg indent (default 4) is the number of blanks with which to
    begin each line.
    """

1283 1284
    from textwrap import fill
    blanks = ' ' * indent
1285 1286
    # Print the sorted list: 'x' may be a '--random' list or a set()
    print(fill(' '.join(str(elt) for elt in sorted(x)), width,
1287
               initial_indent=blanks, subsequent_indent=blanks))
1288

1289 1290
# Map sys.platform to a string containing the basenames of tests
# expected to be skipped on that platform.
1291 1292 1293 1294 1295
#
# Special cases:
#     test_pep277
#         The _ExpectedSkips constructor adds this to the set of expected
#         skips if not os.path.supports_unicode_filenames.
1296 1297 1298
#     test_timeout
#         Controlled by test_timeout.skip_expected.  Requires the network
#         resource and a socket module.
1299 1300 1301
#
# Tests that are expected to be skipped everywhere except on one platform
# are also handled separately.
1302

1303 1304 1305
_expectations = {
    'win32':
        """
1306
        test__locale
1307
        test_crypt
1308
        test_curses
1309 1310 1311
        test_dbm
        test_fcntl
        test_fork1
Christian Heimes's avatar
Christian Heimes committed
1312
        test_epoll
Benjamin Peterson's avatar
Benjamin Peterson committed
1313
        test_dbm_gnu
1314
        test_dbm_ndbm
1315
        test_grp
1316
        test_ioctl
1317
        test_largefile
Christian Heimes's avatar
Christian Heimes committed
1318
        test_kqueue
1319
        test_openpty
1320
        test_ossaudiodev
1321
        test_pipes
1322
        test_poll
1323
        test_posix
1324 1325
        test_pty
        test_pwd
1326
        test_resource
1327
        test_signal
1328
        test_syslog
1329
        test_threadsignals
1330 1331
        test_wait3
        test_wait4
1332 1333 1334
        """,
    'linux2':
        """
1335
        test_curses
1336
        test_largefile
Christian Heimes's avatar
Christian Heimes committed
1337
        test_kqueue
1338
        test_ossaudiodev
1339
        """,
1340
    'unixware7':
1341
        """
Christian Heimes's avatar
Christian Heimes committed
1342
        test_epoll
1343
        test_largefile
Christian Heimes's avatar
Christian Heimes committed
1344
        test_kqueue
1345 1346 1347 1348 1349 1350
        test_minidom
        test_openpty
        test_pyexpat
        test_sax
        test_sundry
        """,
1351 1352
    'openunix8':
        """
Christian Heimes's avatar
Christian Heimes committed
1353
        test_epoll
1354
        test_largefile
Christian Heimes's avatar
Christian Heimes committed
1355
        test_kqueue
1356 1357 1358 1359 1360 1361 1362 1363 1364 1365
        test_minidom
        test_openpty
        test_pyexpat
        test_sax
        test_sundry
        """,
    'sco_sv3':
        """
        test_asynchat
        test_fork1
Christian Heimes's avatar
Christian Heimes committed
1366
        test_epoll
1367 1368 1369
        test_gettext
        test_largefile
        test_locale
Christian Heimes's avatar
Christian Heimes committed
1370
        test_kqueue
1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381
        test_minidom
        test_openpty
        test_pyexpat
        test_queue
        test_sax
        test_sundry
        test_thread
        test_threaded_import
        test_threadedtempfile
        test_threading
        """,
1382
    'darwin':
1383
        """
1384 1385
        test__locale
        test_curses
Christian Heimes's avatar
Christian Heimes committed
1386
        test_epoll
Benjamin Peterson's avatar
Benjamin Peterson committed
1387
        test_dbm_gnu
1388
        test_gdb
1389
        test_largefile
1390
        test_locale
Christian Heimes's avatar
Christian Heimes committed
1391
        test_minidom
1392
        test_ossaudiodev
1393
        test_poll
1394
        """,
1395 1396 1397 1398
    'sunos5':
        """
        test_curses
        test_dbm
Christian Heimes's avatar
Christian Heimes committed
1399 1400
        test_epoll
        test_kqueue
Benjamin Peterson's avatar
Benjamin Peterson committed
1401
        test_dbm_gnu
1402 1403 1404 1405
        test_gzip
        test_openpty
        test_zipfile
        test_zlib
Jeremy Hylton's avatar
Jeremy Hylton committed
1406
        """,
1407 1408 1409
    'hp-ux11':
        """
        test_curses
Christian Heimes's avatar
Christian Heimes committed
1410
        test_epoll
Benjamin Peterson's avatar
Benjamin Peterson committed
1411
        test_dbm_gnu
1412 1413 1414
        test_gzip
        test_largefile
        test_locale
Christian Heimes's avatar
Christian Heimes committed
1415
        test_kqueue
1416 1417 1418 1419 1420 1421 1422
        test_minidom
        test_openpty
        test_pyexpat
        test_sax
        test_zipfile
        test_zlib
        """,
1423 1424 1425 1426
    'cygwin':
        """
        test_curses
        test_dbm
Christian Heimes's avatar
Christian Heimes committed
1427
        test_epoll
1428
        test_ioctl
Christian Heimes's avatar
Christian Heimes committed
1429
        test_kqueue
1430 1431
        test_largefile
        test_locale
1432
        test_ossaudiodev
1433 1434
        test_socketserver
        """,
1435 1436 1437 1438
    'os2emx':
        """
        test_audioop
        test_curses
Christian Heimes's avatar
Christian Heimes committed
1439 1440
        test_epoll
        test_kqueue
1441 1442 1443 1444 1445 1446 1447 1448
        test_largefile
        test_mmap
        test_openpty
        test_ossaudiodev
        test_pty
        test_resource
        test_signal
        """,
1449 1450
    'freebsd4':
        """
Christian Heimes's avatar
Christian Heimes committed
1451
        test_epoll
Benjamin Peterson's avatar
Benjamin Peterson committed
1452
        test_dbm_gnu
1453 1454 1455
        test_locale
        test_ossaudiodev
        test_pep277
Hye-Shik Chang's avatar
Hye-Shik Chang committed
1456
        test_pty
1457
        test_socketserver
Hye-Shik Chang's avatar
Hye-Shik Chang committed
1458
        test_tcl
1459
        test_tk
1460 1461
        test_ttk_guionly
        test_ttk_textonly
1462 1463
        test_timeout
        test_urllibnet
1464
        test_multiprocessing
1465
        """,
1466 1467 1468
    'aix5':
        """
        test_bz2
Christian Heimes's avatar
Christian Heimes committed
1469
        test_epoll
Benjamin Peterson's avatar
Benjamin Peterson committed
1470
        test_dbm_gnu
1471
        test_gzip
Christian Heimes's avatar
Christian Heimes committed
1472
        test_kqueue
1473 1474
        test_ossaudiodev
        test_tcl
1475
        test_tk
1476 1477
        test_ttk_guionly
        test_ttk_textonly
1478 1479 1480
        test_zipimport
        test_zlib
        """,
1481 1482 1483
    'openbsd3':
        """
        test_ctypes
Christian Heimes's avatar
Christian Heimes committed
1484
        test_epoll
Benjamin Peterson's avatar
Benjamin Peterson committed
1485
        test_dbm_gnu
1486 1487 1488 1489 1490
        test_locale
        test_normalization
        test_ossaudiodev
        test_pep277
        test_tcl
1491
        test_tk
1492 1493
        test_ttk_guionly
        test_ttk_textonly
1494
        test_multiprocessing
1495
        """,
1496 1497 1498 1499
    'netbsd3':
        """
        test_ctypes
        test_curses
Christian Heimes's avatar
Christian Heimes committed
1500
        test_epoll
Benjamin Peterson's avatar
Benjamin Peterson committed
1501
        test_dbm_gnu
1502 1503 1504 1505
        test_locale
        test_ossaudiodev
        test_pep277
        test_tcl
1506
        test_tk
1507 1508
        test_ttk_guionly
        test_ttk_textonly
1509
        test_multiprocessing
1510
        """,
1511
}
1512
_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Chang's avatar
Hye-Shik Chang committed
1513
_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang's avatar
Hye-Shik Chang committed
1514
_expectations['freebsd7'] = _expectations['freebsd4']
1515
_expectations['freebsd8'] = _expectations['freebsd4']
1516

1517 1518
class _ExpectedSkips:
    def __init__(self):
1519
        import os.path
1520
        from test import test_timeout
1521

1522
        self.valid = False
1523
        if sys.platform in _expectations:
1524
            s = _expectations[sys.platform]
1525
            self.expected = set(s.split())
1526

1527 1528
            # These are broken tests, for now skipped on every platform.
            # XXX Fix these!
Benjamin Peterson's avatar
Benjamin Peterson committed
1529
            self.expected.add('test_nis')
1530

1531
            # expected to be skipped on every platform, even Linux
1532 1533
            if not os.path.supports_unicode_filenames:
                self.expected.add('test_pep277')
1534

1535 1536 1537 1538 1539 1540 1541 1542
            # doctest, profile and cProfile tests fail when the codec for the
            # fs encoding isn't built in because PyUnicode_Decode() adds two
            # calls into Python.
            encs = ("utf-8", "latin-1", "ascii", "mbcs", "utf-16", "utf-32")
            if sys.getfilesystemencoding().lower() not in encs:
                self.expected.add('test_profile')
                self.expected.add('test_cProfile')
                self.expected.add('test_doctest')
1543

1544 1545 1546
            if test_timeout.skip_expected:
                self.expected.add('test_timeout')

1547
            if sys.platform != "win32":
1548 1549
                # test_sqlite is only reliable on Windows where the library
                # is distributed with Python
1550
                WIN_ONLY = {"test_unicode_file", "test_winreg",
1551
                            "test_winsound", "test_startfile",
Ross Lagerwall's avatar
Ross Lagerwall committed
1552
                            "test_sqlite", "test_msilib"}
1553
                self.expected |= WIN_ONLY
Tim Peters's avatar
Tim Peters committed
1554

1555 1556
            if sys.platform != 'sunos5':
                self.expected.add('test_nis')
1557

Benjamin Peterson's avatar
Benjamin Peterson committed
1558 1559 1560
            if support.python_is_optimized():
                self.expected.add("test_gdb")

1561
            self.valid = True
1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575

    def isvalid(self):
        "Return true iff _ExpectedSkips knows about the current platform."
        return self.valid

    def getexpected(self):
        """Return set of test names we expect to skip on current platform.

        self.isvalid() must be true.
        """

        assert self.isvalid()
        return self.expected

1576 1577 1578 1579 1580 1581 1582
def _make_temp_dir_for_build(TEMPDIR):
    # When tests are run from the Python build directory, it is best practice
    # to keep the test files in a subfolder.  It eases the cleanup of leftover
    # files using command "make distclean".
    if sysconfig.is_python_build():
        TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
        TEMPDIR = os.path.abspath(TEMPDIR)
1583
        try:
1584
            os.mkdir(TEMPDIR)
1585 1586 1587
        except OSError as e:
            if e.errno != errno.EEXIST:
                raise
1588 1589 1590 1591 1592 1593 1594 1595

    # Define a writable temp dir that will be used as cwd while running
    # the tests. The name of the dir includes the pid to allow parallel
    # testing (see the -j option).
    TESTCWD = 'test_python_{}'.format(os.getpid())

    TESTCWD = os.path.join(TEMPDIR, TESTCWD)
    return TEMPDIR, TESTCWD
1596

1597
if __name__ == '__main__':
1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
    # Remove regrtest.py's own directory from the module search path. Despite
    # the elimination of implicit relative imports, this is still needed to
    # ensure that submodules of the test package do not inappropriately appear
    # as top-level modules even when people (or buildbots!) invoke regrtest.py
    # directly instead of using the -m switch
    mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
    i = len(sys.path)
    while i >= 0:
        i -= 1
        if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
            del sys.path[i]

1610 1611 1612 1613 1614 1615 1616
    # findtestdir() gets the dirname out of __file__, so we have to make it
    # absolute before changing the working directory.
    # For example __file__ may be relative when running trace or profile.
    # See issue #9323.
    __file__ = os.path.abspath(__file__)

    # sanity check
1617 1618
    assert __file__ == os.path.abspath(sys.argv[0])

1619
    TEMPDIR, TESTCWD = _make_temp_dir_for_build(TEMPDIR)
1620 1621 1622 1623 1624 1625 1626

    # Run the tests in a context manager that temporary changes the CWD to a
    # temporary and writable directory. If it's not possible to create or
    # change the CWD, the original CWD will be used. The original CWD is
    # available from support.SAVEDCWD.
    with support.temp_cwd(TESTCWD, quiet=True):
        main()