14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#! /usr/bin/env python
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUsage:
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpython -m test.regrtest [options] [test_name1 [test_name2 ...]]
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpython path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf no arguments or options are provided, finds all files matching
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe pattern "test_*" in the Lib/test subdirectory and runs
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthem in alphabetical order (but see -M and -u, below, for exceptions).
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFor more rigorous testing, it is useful to use the following
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcommand line:
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpython -E -tt -Wd -3 -m test.regrtest [options] [test_name1 ...]
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmOptions:
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-h/--help       -- print this text and exit
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmVerbosity
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-v/--verbose    -- run tests in verbose mode with output to stdout
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-w/--verbose2   -- re-run failed tests in verbose mode
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-W/--verbose3   -- re-run failed tests in verbose mode immediately
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-q/--quiet      -- no output unless one or more tests fail
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-S/--slow       -- print the slowest 10 tests
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   --header     -- print header with interpreter info
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSelecting tests
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-r/--random     -- randomize test execution order (see below)
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   --randseed   -- pass a random seed to reproduce a previous random run
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-f/--fromfile   -- read names of tests to run from a file (see below)
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-x/--exclude    -- arguments are tests to *exclude*
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-s/--single     -- single step through a set of tests (see below)
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-u/--use RES1,RES2,...
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                -- specify which special resource intensive tests to run
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-M/--memlimit LIMIT
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                -- run very large memory-consuming tests
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSpecial runs
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-l/--findleaks  -- if GC is available detect tests that leak memory
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-L/--runleaks   -- run the leaks(1) command just before exit
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-R/--huntrleaks RUNCOUNTS
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                -- search for reference leaks (needs debug build, v. slow)
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-j/--multiprocess PROCESSES
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                -- run PROCESSES processes at once
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-T/--coverage   -- turn on code coverage tracing using the trace module
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-D/--coverdir DIRECTORY
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                -- Directory where coverage files are put
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-N/--nocoverdir -- Put coverage files alongside modules
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-t/--threshold THRESHOLD
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                -- call gc.set_threshold(THRESHOLD)
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-F/--forever    -- run the specified tests in a loop, until an error happens
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAdditional Option Details:
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-r randomizes test execution order. You can use --randseed=int to provide a
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint seed value for the randomizer; this is useful for reproducing troublesome
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest orders.
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-s On the first invocation of regrtest using -s, the first test file found
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmor the first test file given on the command line is run, and the name of
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe next test is recorded in a file named pynexttest.  If run from the
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPython build directory, pynexttest is located in the 'build' subdirectory,
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmotherwise it is located in tempfile.gettempdir().  On subsequent runs,
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe test in pynexttest is run, and the next test is written to pynexttest.
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWhen the last test has been run, pynexttest is deleted.  In this way it
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis possible to single step through the test files.  This is useful when
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdoing memory analysis on the Python interpreter, which process tends to
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconsume too many resources to run the full regression test non-stop.
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-f reads the names of tests from the file given as f's argument, one
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmor more test names per line.  Whitespace is ignored.  Blank lines and
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlines beginning with '#' are ignored.  This is especially useful for
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhittling down failures involving interactions among tests.
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-L causes the leaks(1) command to be run just before exit if it exists.
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmleaks(1) is available on Mac OS X and presumably on some other
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFreeBSD-derived systems.
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-R runs each test several times and examines sys.gettotalrefcount() to
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsee if the test appears to be leaking references.  The argument should
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbe of the form stab:run:fname where 'stab' is the number of times the
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest is run to let gettotalrefcount settle down, 'run' is the number
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmof times further it is run and 'fname' is the name of the file the
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreports are written to.  These parameters all have defaults (5, 4 and
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"reflog.txt" respectively), and the minimal invocation is '-R :'.
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-M runs tests that require an exorbitant amount of memory. These tests
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypically try to ascertain containers keep working when containing more than
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm2 billion objects, which only works on 64-bit systems. There are also some
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtests that try to exhaust the address space of the process, which only makes
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhich is a string in the form of '2.5Gb', determines howmuch memory the
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtests will limit themselves to (but they may go slightly over.) The number
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmshouldn't be more memory than the machine has (including swap memory). You
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmshould also keep in mind that swap memory is generally much, much slower
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthan RAM, and setting memlimit to all available RAM or higher will heavily
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtax the machine. On the other hand, it is no use running these tests with a
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlimit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto use more than memlimit memory will be skipped. The big-memory tests
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgenerally run very, very long.
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm-u is used to specify which special resource intensive tests to run,
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsuch as those requiring large file support or network connectivity.
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe argument is a comma-separated list of words indicating the
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmresources to test.  Currently only the following are defined:
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    all -       Enable all special resources.
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    audio -     Tests that use the audio device.  (There are known
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                cases of broken audio drivers that can crash Python or
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                even the Linux kernel.)
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    curses -    Tests that use curses and will modify the terminal's
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                state and output modes.
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    largefile - It is okay to run some test that may create huge
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                files.  These tests can take a long time and may
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                consume >2GB of disk space temporarily.
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    network -   It is okay to run tests that use external network
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                resource, e.g. testing SSL support for sockets.
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    bsddb -     It is okay to run the bsddb testsuite, which takes
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a long time to complete.
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    decimal -   Test the decimal module against a large suite that
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                verifies compliance with standards.
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    cpu -       Used for certain CPU-heavy tests.
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    subprocess  Run all tests for the subprocess module.
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    urlfetch -  It is okay to download files required on testing.
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gui -       Run tests that require a running GUI.
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    xpickle -   Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                test backwards compatibility. These tests take a long time
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                to run.
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTo enable all resources except one, use '-uall,-<resource>'.  For
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexample, to run all the tests except for the bsddb tests, give the
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoption '-uall,-bsddb'.
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport StringIO
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport getopt
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport json
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport random
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport re
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport time
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport traceback
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport warnings
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport tempfile
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport imp
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport platform
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sysconfig
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Some times __path__ and __file__ are not absolute (e.g. while running from
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# imports might fail.  This affects only the modules imported before os.chdir().
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# they are found in the CWD their __file__ and __path__ will be relative (this
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# happens before the chdir).  All the modules imported after the chdir, are
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# not found in the CWD, and since the other paths in sys.path[1:] are absolute
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# (site.py absolutize them), the __file__ and __path__ will be absolute too.
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Therefore it is necessary to absolutize manually the __file__ and __path__ of
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# the packages to prevent later imports to fail when the CWD is different.
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor module in sys.modules.itervalues():
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if hasattr(module, '__path__'):
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        module.__path__ = [os.path.abspath(path) for path in module.__path__]
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if hasattr(module, '__file__'):
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        module.__file__ = os.path.abspath(module.__file__)
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# MacOSX (a.k.a. Darwin) has a default stack size that is too small
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# for deeply recursive regular expressions.  We see this as crashes in
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# the Python test suite when running test_re.py and test_sre.py.  The
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# fix is to set the stack limit to 2048.
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# This approach may also be useful for other Unixy platforms that
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# suffer from small default stack limits.
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif sys.platform == 'darwin':
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import resource
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except ImportError:
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pass
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        newsoft = min(hard, max(soft, 1024*2048))
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Test result constants.
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPASSED = 1
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFAILED = 0
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmENV_CHANGED = -1
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSKIPPED = -2
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmRESOURCE_DENIED = -3
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmINTERRUPTED = -4
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmRESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  'xpickle')
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTEMPDIR = os.path.abspath(tempfile.gettempdir())
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef usage(code, msg=''):
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    print __doc__
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if msg: print msg
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sys.exit(code)
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef main(tests=None, testdir=None, verbose=0, quiet=False,
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         exclude=False, single=False, randomize=False, fromfile=None,
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         findleaks=False, use_resources=None, trace=False, coverdir='coverage',
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         random_seed=None, use_mp=None, verbose3=False, forever=False,
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         header=False):
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Execute a test suite.
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    This also parses command-line options and modifies its behavior
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    accordingly.
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tests -- a list of strings containing test names (optional)
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    testdir -- the directory in which to look for tests (optional)
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Users other than the Python test suite will certainly want to
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    specify testdir; if it's omitted, the directory containing the
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Python test suite is searched for.
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    If the tests argument is omitted, the tests listed on the
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    command-line will be used.  If that's empty, too, then all *.py
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    files beginning with test_ will be used.
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    The other default arguments (verbose, quiet, exclude,
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    single, randomize, findleaks, use_resources, trace, coverdir,
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    print_slow, and random_seed) allow programmers calling main()
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    directly to set the values that would normally be set by flags
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    on the command line.
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.record_original_stdout(sys.stdout)
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:',
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             'exclude', 'single', 'slow', 'random', 'fromfile', 'findleaks',
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             'multiprocess=', 'slaveargs=', 'forever', 'header'])
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except getopt.error, msg:
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage(2, msg)
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Defaults
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if random_seed is None:
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        random_seed = random.randrange(10000000)
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if use_resources is None:
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        use_resources = []
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for o, a in opts:
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if o in ('-h', '--help'):
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            usage(0)
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-v', '--verbose'):
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            verbose += 1
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-w', '--verbose2'):
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            verbose2 = True
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-W', '--verbose3'):
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            verbose3 = True
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-q', '--quiet'):
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            quiet = True;
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            verbose = 0
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-x', '--exclude'):
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            exclude = True
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-s', '--single'):
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            single = True
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-S', '--slow'):
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print_slow = True
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-r', '--randomize'):
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            randomize = True
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o == '--randseed':
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            random_seed = int(a)
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-f', '--fromfile'):
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fromfile = a
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-l', '--findleaks'):
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            findleaks = True
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-L', '--runleaks'):
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            runleaks = True
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-t', '--threshold'):
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            import gc
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            gc.set_threshold(int(a))
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-T', '--coverage'):
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            trace = True
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-D', '--coverdir'):
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            coverdir = os.path.join(os.getcwd(), a)
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-N', '--nocoverdir'):
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            coverdir = None
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-R', '--huntrleaks'):
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            huntrleaks = a.split(':')
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if len(huntrleaks) not in (2, 3):
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print a, huntrleaks
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                usage(2, '-R takes 2 or 3 colon-separated arguments')
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not huntrleaks[0]:
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                huntrleaks[0] = 5
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                huntrleaks[0] = int(huntrleaks[0])
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not huntrleaks[1]:
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                huntrleaks[1] = 4
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                huntrleaks[1] = int(huntrleaks[1])
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if len(huntrleaks) == 2 or not huntrleaks[2]:
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                huntrleaks[2:] = ["reflog.txt"]
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-M', '--memlimit'):
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            test_support.set_memlimit(a)
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-u', '--use'):
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            u = [x.lower() for x in a.split(',')]
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for r in u:
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if r == 'all':
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    use_resources[:] = RESOURCE_NAMES
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    continue
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                remove = False
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if r[0] == '-':
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    remove = True
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    r = r[1:]
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if r not in RESOURCE_NAMES:
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    usage(1, 'Invalid -u/--use option: ' + a)
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if remove:
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if r in use_resources:
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        use_resources.remove(r)
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                elif r not in use_resources:
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    use_resources.append(r)
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-F', '--forever'):
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            forever = True
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o in ('-j', '--multiprocess'):
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            use_mp = int(a)
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o == '--header':
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            header = True
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o == '--slaveargs':
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            args, kwargs = json.loads(a)
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                result = runtest(*args, **kwargs)
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except BaseException, e:
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                result = INTERRUPTED, e.__class__.__name__
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print   # Force a newline (just in case)
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print json.dumps(result)
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.exit(0)
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print >>sys.stderr, ("No handler for option {}.  Please "
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "report this as a bug at http://bugs.python.org.").format(o)
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.exit(1)
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if single and fromfile:
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage(2, "-s and -f don't go together!")
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if use_mp and trace:
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage(2, "-T and -j don't go together!")
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if use_mp and findleaks:
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        usage(2, "-l and -j don't go together!")
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    good = []
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    bad = []
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    skipped = []
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    resource_denieds = []
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    environment_changed = []
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    interrupted = False
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if findleaks:
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            import gc
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ImportError:
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print 'No GC available, disabling findleaks.'
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            findleaks = False
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Uncomment the line below to report garbage that is not
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # freeable by reference counting alone.  By default only
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # garbage that is not collectable by the GC is reported.
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            #gc.set_debug(gc.DEBUG_SAVEALL)
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            found_garbage = []
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if single:
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        filename = os.path.join(TEMPDIR, 'pynexttest')
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fp = open(filename, 'r')
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            next_test = fp.read().strip()
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tests = [next_test]
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fp.close()
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except IOError:
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if fromfile:
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tests = []
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fp = open(os.path.join(test_support.SAVEDCWD, fromfile))
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for line in fp:
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            guts = line.split() # assuming no test has whitespace in its name
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if guts and not guts[0].startswith('#'):
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                tests.extend(guts)
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fp.close()
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Strip .py extensions.
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    removepy(args)
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    removepy(tests)
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    stdtests = STDTESTS[:]
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nottests = NOTTESTS.copy()
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if exclude:
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for arg in args:
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if arg in stdtests:
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                stdtests.remove(arg)
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            nottests.add(arg)
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args = []
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # For a partial run, we do not need to clutter the output.
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if verbose or header or not (quiet or single or tests or args):
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Print basic platform information
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "==", platform.python_implementation(), \
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    " ".join(sys.version.split())
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "==  ", platform.platform(aliased=True), \
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      "%s-endian" % sys.byteorder
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "==  ", os.getcwd()
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "Testing with flags:", sys.flags
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    alltests = findtests(testdir, stdtests, nottests)
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    selected = tests or args or alltests
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if single:
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        selected = selected[:1]
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            next_single_test = alltests[alltests.index(selected[0])+1]
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except IndexError:
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            next_single_test = None
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if randomize:
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        random.seed(random_seed)
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "Using random seed", random_seed
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        random.shuffle(selected)
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if trace:
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import trace
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             trace=False, count=True)
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_times = []
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.use_resources = use_resources
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    save_modules = sys.modules.keys()
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def accumulate_result(test, result):
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ok, test_time = result
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_times.append((test_time, test))
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ok == PASSED:
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            good.append(test)
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif ok == FAILED:
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            bad.append(test)
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif ok == ENV_CHANGED:
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            bad.append(test)
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            environment_changed.append(test)
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif ok == SKIPPED:
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            skipped.append(test)
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif ok == RESOURCE_DENIED:
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            skipped.append(test)
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            resource_denieds.append(test)
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if forever:
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_forever(tests=list(selected)):
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while True:
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for test in tests:
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    yield test
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if bad:
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tests = test_forever()
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tests = iter(selected)
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if use_mp:
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            from threading import Thread
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ImportError:
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print "Multiprocess option requires thread support"
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.exit(2)
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from Queue import Queue
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from subprocess import Popen, PIPE
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        debug_output_pat = re.compile(r"\[\d+ refs\]$")
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        output = Queue()
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def tests_and_args():
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for test in tests:
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                args_tuple = (
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    (test, verbose, quiet),
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    dict(huntrleaks=huntrleaks, use_resources=use_resources)
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                )
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield (test, args_tuple)
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pending = tests_and_args()
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        opt_args = test_support.args_from_interpreter_flags()
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def work():
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # A worker thread.
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while True:
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    try:
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        test, args_tuple = next(pending)
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    except StopIteration:
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        output.put((None, None, None, None))
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # -E is needed by some tests, e.g. test_import
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   stdout=PIPE, stderr=PIPE,
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   universal_newlines=True,
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   close_fds=(os.name != 'nt'))
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    stdout, stderr = popen.communicate()
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # Strip last refcount output line if it exists, since it
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # comes from the shutdown of the interpreter in the subcommand.
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    stderr = debug_output_pat.sub("", stderr)
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    stdout, _, result = stdout.strip().rpartition("\n")
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if not result:
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        output.put((None, None, None, None))
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    result = json.loads(result)
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if not quiet:
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        stdout = test+'\n'+stdout
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    output.put((test, stdout.rstrip(), stderr.rstrip(), result))
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except BaseException:
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                output.put((None, None, None, None))
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        workers = [Thread(target=work) for i in range(use_mp)]
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for worker in workers:
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            worker.start()
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finished = 0
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while finished < use_mp:
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                test, stdout, stderr, result = output.get()
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if test is None:
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    finished += 1
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    continue
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if stdout:
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    print stdout
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if stderr:
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    print >>sys.stderr, stderr
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if result[0] == INTERRUPTED:
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    assert result[1] == 'KeyboardInterrupt'
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise KeyboardInterrupt   # What else?
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                accumulate_result(test, result)
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except KeyboardInterrupt:
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            interrupted = True
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pending.close()
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for worker in workers:
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            worker.join()
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for test in tests:
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not quiet:
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print test
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sys.stdout.flush()
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if trace:
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # If we're tracing code coverage, then we don't exit with status
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # if on a false return value from main.
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                tracer.runctx('runtest(test, verbose, quiet)',
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              globals=globals(), locals=vars())
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    result = runtest(test, verbose, quiet, huntrleaks)
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    accumulate_result(test, result)
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if verbose3 and result[0] == FAILED:
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        print "Re-running test %r in verbose mode" % test
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        runtest(test, True, quiet, huntrleaks)
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except KeyboardInterrupt:
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    interrupted = True
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    break
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except:
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if findleaks:
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                gc.collect()
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if gc.garbage:
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    print "Warning: test created", len(gc.garbage),
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    print "uncollectable object(s)."
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # move the uncollectable objects somewhere so we don't see
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # them again
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    found_garbage.extend(gc.garbage)
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    del gc.garbage[:]
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Unload the newly imported modules (best effort finalization)
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for module in sys.modules.keys():
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if module not in save_modules and module.startswith("test."):
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    test_support.unload(module)
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if interrupted:
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # print a newline after ^C
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "Test suite interrupted by signal SIGINT."
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        omitted = set(selected) - set(good) - set(bad) - set(skipped)
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print count(len(omitted), "test"), "omitted:"
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printlist(omitted)
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if good and not quiet:
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not bad and not skipped and not interrupted and len(good) > 1:
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print "All",
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print count(len(good), "test"), "OK."
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if print_slow:
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_times.sort(reverse=True)
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "10 slowest tests:"
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for time, test in test_times[:10]:
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print "%s: %.1fs" % (test, time)
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if bad:
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bad = set(bad) - set(environment_changed)
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if bad:
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print count(len(bad), "test"), "failed:"
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            printlist(bad)
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if environment_changed:
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print "{} altered the execution environment:".format(
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                count(len(environment_changed), "test"))
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            printlist(environment_changed)
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if skipped and not quiet:
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print count(len(skipped), "test"), "skipped:"
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printlist(skipped)
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        e = _ExpectedSkips()
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        plat = sys.platform
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if e.isvalid():
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            surprise = set(skipped) - e.getexpected() - set(resource_denieds)
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if surprise:
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print count(len(surprise), "skip"), \
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      "unexpected on", plat + ":"
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                printlist(surprise)
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print "Those skips are all expected on", plat + "."
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print "Ask someone to teach regrtest.py about which tests are"
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print "expected to get skipped on", plat + "."
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if verbose2 and bad:
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "Re-running failed tests in verbose mode"
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for test in bad:
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print "Re-running test %r in verbose mode" % test
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.stdout.flush()
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                test_support.verbose = True
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ok = runtest(test, True, quiet, huntrleaks)
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except KeyboardInterrupt:
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # print a newline separate from the ^C
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except:
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if single:
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if next_single_test:
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            with open(filename, 'w') as fp:
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                fp.write(next_single_test + '\n')
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            os.unlink(filename)
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if trace:
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        r = tracer.results()
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        r.write_results(show_missing=True, summary=True, coverdir=coverdir)
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if runleaks:
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.system("leaks %d" % os.getpid())
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sys.exit(len(bad) > 0 or interrupted)
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSTDTESTS = [
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_grammar',
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_opcodes',
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_dict',
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_builtin',
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_exceptions',
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_types',
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_unittest',
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_doctest',
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_doctest2',
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm]
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmNOTTESTS = {
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_support',
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_future1',
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'test_future2',
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Return a list of all applicable test modules."""
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    testdir = findtestdir(testdir)
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    names = os.listdir(testdir)
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tests = []
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    others = set(stdtests) | nottests
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for name in names:
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        modname, ext = os.path.splitext(name)
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if modname[:5] == "test_" and ext == ".py" and modname not in others:
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tests.append(modname)
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return stdtests + sorted(tests)
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef runtest(test, verbose, quiet,
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            huntrleaks=False, use_resources=None):
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Run a single test.
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test -- the name of the test
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    verbose -- if true, print more messages
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    quiet -- if true, don't print 'skipped' messages (probably redundant)
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_times -- a list of (time, test_name) pairs
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    huntrleaks -- run multiple times to test for leaks; requires a debug
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  build; a triple corresponding to -R's three arguments
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Returns one of the test result constants:
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        INTERRUPTED      KeyboardInterrupt when run under -j
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        RESOURCE_DENIED  test skipped because resource denied
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        SKIPPED          test skipped for some other reason
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ENV_CHANGED      test failed because it changed the execution environment
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        FAILED           test failed
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PASSED           test passed
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.verbose = verbose  # Tell tests to be moderately quiet
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if use_resources is not None:
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_support.use_resources = use_resources
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return runtest_inner(test, verbose, quiet, huntrleaks)
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    finally:
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cleanup_test_droppings(test, verbose)
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Unit tests are supposed to leave the execution environment unchanged
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# once they complete.  But sometimes tests have bugs, especially when
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# tests fail, and the changes to environment go on to mess up other
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# tests.  This can cause issues with buildbot stability, since tests
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# are run in random order and so problems may appear to come and go.
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# There are a few things we can save and restore to mitigate this, and
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# the following context manager handles this task.
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass saved_test_environment:
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Save bits of the test environment and restore them at block exit.
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with saved_test_environment(testname, verbose, quiet):
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            #stuff
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Unless quiet is True, a warning is printed to stderr if any of
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    the saved items was changed by the test.  The attribute 'changed'
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is initially False, but is set to True if a change is detected.
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    If verbose is more than 1, the before and after state of changed
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    items is also printed.
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    changed = False
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, testname, verbose=0, quiet=False):
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.testname = testname
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.verbose = verbose
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.quiet = quiet
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # To add things to save and restore, add a name XXX to the resources list
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # and add corresponding get_XXX/restore_XXX functions.  get_XXX should
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # return the value to be saved and compared against a second call to the
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # get function when test execution completes.  restore_XXX should accept
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # the saved value and restore the resource using it.  It will be called if
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # and only if a change in the value is detected.
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Note: XXX will have any '.' replaced with '_' characters when determining
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # the corresponding method names.
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 'os.environ', 'sys.path', 'asyncore.socket_map')
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_sys_argv(self):
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return id(sys.argv), sys.argv, sys.argv[:]
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def restore_sys_argv(self, saved_argv):
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.argv = saved_argv[1]
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.argv[:] = saved_argv[2]
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_cwd(self):
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return os.getcwd()
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def restore_cwd(self, saved_cwd):
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.chdir(saved_cwd)
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_sys_stdout(self):
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return sys.stdout
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def restore_sys_stdout(self, saved_stdout):
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stdout = saved_stdout
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_sys_stderr(self):
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return sys.stderr
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def restore_sys_stderr(self, saved_stderr):
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stderr = saved_stderr
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_sys_stdin(self):
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return sys.stdin
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def restore_sys_stdin(self, saved_stdin):
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stdin = saved_stdin
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_os_environ(self):
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return id(os.environ), os.environ, dict(os.environ)
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def restore_os_environ(self, saved_environ):
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.environ = saved_environ[1]
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.environ.clear()
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.environ.update(saved_environ[2])
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_sys_path(self):
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return id(sys.path), sys.path, sys.path[:]
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def restore_sys_path(self, saved_path):
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.path = saved_path[1]
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.path[:] = saved_path[2]
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_asyncore_socket_map(self):
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asyncore = sys.modules.get('asyncore')
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # XXX Making a copy keeps objects alive until __exit__ gets called.
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return asyncore and asyncore.socket_map.copy() or {}
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def restore_asyncore_socket_map(self, saved_map):
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asyncore = sys.modules.get('asyncore')
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if asyncore is not None:
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asyncore.close_all(ignore_all=True)
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asyncore.socket_map.update(saved_map)
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def resource_info(self):
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for name in self.resources:
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            method_suffix = name.replace('.', '_')
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            get_name = 'get_' + method_suffix
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            restore_name = 'restore_' + method_suffix
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield name, getattr(self, get_name), getattr(self, restore_name)
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __enter__(self):
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.saved_values = dict((name, get()) for name, get, restore
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                   in self.resource_info())
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __exit__(self, exc_type, exc_val, exc_tb):
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        saved_values = self.saved_values
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del self.saved_values
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for name, get, restore in self.resource_info():
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            current = get()
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            original = saved_values.pop(name)
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Check for changes to the resource's value
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if current != original:
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.changed = True
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                restore(original)
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if not self.quiet:
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    print >>sys.stderr, (
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          "Warning -- {} was modified by {}".format(
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                 name, self.testname))
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if self.verbose > 1:
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        print >>sys.stderr, (
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "  Before: {}\n  After:  {} ".format(
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                  original, current))
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # XXX (ncoghlan): for most resources (e.g. sys.path) identity
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # matters at least as much as value. For others (e.g. cwd),
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # identity is irrelevant. Should we add a mechanism to check
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # for substitution in the cases where it matters?
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return False
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef runtest_inner(test, verbose, quiet, huntrleaks=False):
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.unload(test)
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if verbose:
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        capture_stdout = None
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        capture_stdout = StringIO.StringIO()
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_time = 0.0
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    refleak = False  # True if the test leaked references.
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        save_stdout = sys.stdout
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if capture_stdout:
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sys.stdout = capture_stdout
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if test.startswith('test.'):
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                abstest = test
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # Always import it from the test package
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                abstest = 'test.' + test
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            with saved_test_environment(test, verbose, quiet) as environment:
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                start_time = time.time()
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                the_package = __import__(abstest, globals(), locals(), [])
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                the_module = getattr(the_package, test)
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # Old tests run to completion simply as a side-effect of
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # being imported.  For tests based on unittest or doctest,
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # explicitly invoke their test_main() function (if it exists).
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                indirect_test = getattr(the_module, "test_main", None)
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if indirect_test is not None:
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    indirect_test()
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if huntrleaks:
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    refleak = dash_R(the_module, test, indirect_test,
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        huntrleaks)
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                test_time = time.time() - start_time
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.stdout = save_stdout
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except test_support.ResourceDenied, msg:
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not quiet:
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print test, "skipped --", msg
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.stdout.flush()
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return RESOURCE_DENIED, test_time
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except unittest.SkipTest, msg:
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not quiet:
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print test, "skipped --", msg
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.stdout.flush()
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return SKIPPED, test_time
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except KeyboardInterrupt:
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except test_support.TestFailed, msg:
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >>sys.stderr, "test", test, "failed --", msg
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stderr.flush()
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return FAILED, test_time
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except:
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        type, value = sys.exc_info()[:2]
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stderr.flush()
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if verbose:
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            traceback.print_exc(file=sys.stderr)
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.stderr.flush()
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return FAILED, test_time
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if refleak:
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return FAILED, test_time
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if environment.changed:
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ENV_CHANGED, test_time
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Except in verbose mode, tests should not print anything
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if verbose or huntrleaks:
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PASSED, test_time
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        output = capture_stdout.getvalue()
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not output:
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PASSED, test_time
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "test", test, "produced unexpected output:"
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "*" * 70
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print output
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print "*" * 70
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stdout.flush()
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return FAILED, test_time
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef cleanup_test_droppings(testname, verbose):
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import shutil
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import stat
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import gc
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # First kill any dangling references to open files etc.
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gc.collect()
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Try to clean up junk commonly left behind.  While tests shouldn't leave
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # any files or directories behind, when a test fails that can be tedious
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # for it to arrange.  The consequences can be especially nasty on Windows,
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # since if a test leaves a file open, it cannot be deleted by name (while
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # there's nothing we can do about that here either, we can display the
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # name of the offending test, which is a real help).
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for name in (test_support.TESTFN,
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "db_home",
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ):
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not os.path.exists(name):
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            continue
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if os.path.isdir(name):
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            kind, nuker = "directory", shutil.rmtree
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif os.path.isfile(name):
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            kind, nuker = "file", os.unlink
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise SystemError("os.path says %r exists but is neither "
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "directory nor file" % name)
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if verbose:
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print "%r left behind %s %r" % (testname, kind, name)
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # if we have chmod, fix possible permissions problems
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # that might prevent cleanup
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (hasattr(os, 'chmod')):
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            nuker(name)
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except Exception, msg:
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "removed: %s" % (testname, kind, name, msg))
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef dash_R(the_module, test, indirect_test, huntrleaks):
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Run a test multiple times, looking for reference leaks.
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Returns:
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        False if the test didn't leak references; True if we detected refleaks.
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # This code is hackish and inelegant, but it seems to do the job.
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import copy_reg, _abcoll, _pyio
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if not hasattr(sys, 'gettotalrefcount'):
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise Exception("Tracking reference leaks requires a debug build "
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "of Python")
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Save current values for dash_R_cleanup() to restore.
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fs = warnings.filters[:]
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ps = copy_reg.dispatch_table.copy()
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pic = sys.path_importer_cache.copy()
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import zipimport
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except ImportError:
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        zdc = None # Run unmodified on platforms without zipimport support
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        zdc = zipimport._zip_directory_cache.copy()
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    abcs = {}
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    modules = _abcoll, _pyio
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # XXX isinstance(abc, ABCMeta) leads to infinite recursion
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not hasattr(abc, '_abc_registry'):
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            continue
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for obj in abc.__subclasses__() + [abc]:
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            abcs[obj] = obj._abc_registry.copy()
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if indirect_test:
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def run_the_test():
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            indirect_test()
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def run_the_test():
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            imp.reload(the_module)
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    deltas = []
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nwarmup, ntracked, fname = huntrleaks
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fname = os.path.join(test_support.SAVEDCWD, fname)
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    repcount = nwarmup + ntracked
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    print >> sys.stderr, "beginning", repcount, "repetitions"
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    dash_R_cleanup(fs, ps, pic, zdc, abcs)
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for i in range(repcount):
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rc_before = sys.gettotalrefcount()
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        run_the_test()
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stderr.write('.')
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dash_R_cleanup(fs, ps, pic, zdc, abcs)
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rc_after = sys.gettotalrefcount()
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if i >= nwarmup:
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            deltas.append(rc_after - rc_before)
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    print >> sys.stderr
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if any(deltas):
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> sys.stderr, msg
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with open(fname, "a") as refrep:
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print >> refrep, msg
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            refrep.flush()
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return True
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return False
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef dash_R_cleanup(fs, ps, pic, zdc, abcs):
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import gc, copy_reg
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import _strptime, linecache
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    dircache = test_support.import_module('dircache', deprecated=True)
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import urlparse, urllib, urllib2, mimetypes, doctest
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    import struct, filecmp
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from distutils.dir_util import _path_created
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Clear the warnings registry, so they can be displayed again
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for mod in sys.modules.values():
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if hasattr(mod, '__warningregistry__'):
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            del mod.__warningregistry__
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Restore some original values.
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    warnings.filters[:] = fs
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    copy_reg.dispatch_table.clear()
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    copy_reg.dispatch_table.update(ps)
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sys.path_importer_cache.clear()
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sys.path_importer_cache.update(pic)
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import zipimport
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    except ImportError:
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pass # Run unmodified on platforms without zipimport support
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        zipimport._zip_directory_cache.clear()
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        zipimport._zip_directory_cache.update(zdc)
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # clear type cache
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sys._clear_type_cache()
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Clear ABC registries, restoring previously saved ABC registries.
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for abc, registry in abcs.items():
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        abc._abc_registry = registry.copy()
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        abc._abc_cache.clear()
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        abc._abc_negative_cache.clear()
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Clear assorted module caches.
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _path_created.clear()
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    re.purge()
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _strptime._regex_cache.clear()
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    urlparse.clear_cache()
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    urllib.urlcleanup()
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    urllib2.install_opener(None)
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    dircache.reset()
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    linecache.clearcache()
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    mimetypes._default_mime_types()
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    filecmp._cache.clear()
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct._clearcache()
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    doctest.master = None
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Collect cyclic trash.
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gc.collect()
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef findtestdir(path=None):
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return path or os.path.dirname(__file__) or os.curdir
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef removepy(names):
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if not names:
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for idx, name in enumerate(names):
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        basename, ext = os.path.splitext(name)
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ext == '.py':
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            names[idx] = basename
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef count(n, word):
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if n == 1:
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return "%d %s" % (n, word)
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return "%d %ss" % (n, word)
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef printlist(x, width=70, indent=4):
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Print the elements of iterable x to stdout.
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Optional arg width (default 70) is the maximum line length.
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Optional arg indent (default 4) is the number of blanks with which to
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    begin each line.
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from textwrap import fill
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    blanks = ' ' * indent
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Print the sorted list: 'x' may be a '--random' list or a set()
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    print fill(' '.join(str(elt) for elt in sorted(x)), width,
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               initial_indent=blanks, subsequent_indent=blanks)
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Map sys.platform to a string containing the basenames of tests
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# expected to be skipped on that platform.
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Special cases:
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#     test_pep277
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#         The _ExpectedSkips constructor adds this to the set of expected
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#         skips if not os.path.supports_unicode_filenames.
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#     test_timeout
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#         Controlled by test_timeout.skip_expected.  Requires the network
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#         resource and a socket module.
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Tests that are expected to be skipped everywhere except on one platform
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# are also handled separately.
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_expectations = {
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'win32':
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test__locale
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_commands
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_crypt
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dbm
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_fcntl
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_fork1
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_grp
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ioctl
11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_mhlib
11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_openpty
11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pipes
11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_poll
11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_posix
11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pty
11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pwd
11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_resource
11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_signal
11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_threadsignals
11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_timing
11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_wait3
11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_wait4
11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'linux2':
11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'unixware7':
11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_minidom
11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_openpty
11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pyexpat
11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_sax
11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_sundry
11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'openunix8':
11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_minidom
11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_openpty
11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pyexpat
11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_sax
11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_sundry
11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'sco_sv3':
12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_asynchat
12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_fork1
12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gettext
12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_minidom
12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_openpty
12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pyexpat
12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_queue
12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_sax
12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_sundry
12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_thread
12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_threaded_import
12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_threadedtempfile
12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_threading
12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'riscos':
12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_asynchat
12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_atexit
12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_commands
12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_crypt
12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dbm
12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_fcntl
12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_fork1
12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_grp
12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_mmap
12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_openpty
12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_poll
12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_popen2
12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pty
12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pwd
12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_strop
12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_sundry
12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_thread
12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_threaded_import
12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_threadedtempfile
12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_threading
12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_timing
12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'darwin':
12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test__locale
12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdb
12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_minidom
12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_poll
12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'sunos5':
12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dbm
12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gzip
12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_openpty
12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_zipfile
12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_zlib
12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'hp-ux11':
12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gzip
12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_minidom
12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_openpty
12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pyexpat
13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_sax
13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_zipfile
13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_zlib
13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'atheos':
13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_mhlib
13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_mmap
13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_poll
13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_popen2
13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_resource
13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'cygwin':
13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dbm
13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ioctl
13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_socketserver
13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'os2emx':
13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_audioop
13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_commands
13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_largefile
13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_mhlib
13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_mmap
13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_openpty
13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pty
13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_resource
13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_signal
13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'freebsd4':
13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pep277
13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pty
13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_socketserver
13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_tcl
13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_tk
13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ttk_guionly
13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ttk_textonly
13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_timeout
13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_urllibnet
13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_multiprocessing
13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'aix5':
13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bz2
13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gzip
13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_kqueue
13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_tcl
13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_tk
13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ttk_guionly
13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ttk_textonly
13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_zipimport
13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_zlib
13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'openbsd3':
13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ascii_formatd
13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ctypes
13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_normalization
14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pep277
14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_tcl
14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_tk
14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ttk_guionly
14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ttk_textonly
14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_multiprocessing
14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    'netbsd3':
14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ascii_formatd
14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb
14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb185
14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_bsddb3
14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ctypes
14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_curses
14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_dl
14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_epoll
14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_gdbm
14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_locale
14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ossaudiodev
14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_pep277
14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_tcl
14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_tk
14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ttk_guionly
14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_ttk_textonly
14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_multiprocessing
14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """,
14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_expectations['freebsd5'] = _expectations['freebsd4']
14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_expectations['freebsd6'] = _expectations['freebsd4']
14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_expectations['freebsd7'] = _expectations['freebsd4']
14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_expectations['freebsd8'] = _expectations['freebsd4']
14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _ExpectedSkips:
14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self):
14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import os.path
14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from test import test_timeout
14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.valid = False
14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if sys.platform in _expectations:
14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s = _expectations[sys.platform]
14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.expected = set(s.split())
14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # expected to be skipped on every platform, even Linux
14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.expected.add('test_linuxaudiodev')
14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not os.path.supports_unicode_filenames:
14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.expected.add('test_pep277')
14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if test_timeout.skip_expected:
14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.expected.add('test_timeout')
14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if sys.maxint == 9223372036854775807L:
14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.expected.add('test_imageop')
14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if sys.platform != "darwin":
14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "test_plistlib", "test_scriptpackages",
14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "test_applesingle"]
14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for skip in MAC_ONLY:
14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.expected.add(skip)
14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif len(u'\0'.encode('unicode-internal')) == 4:
14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.expected.add("test_macostools")
14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if sys.platform != "win32":
14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # test_sqlite is only reliable on Windows where the library
14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # is distributed with Python
14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                WIN_ONLY = ["test_unicode_file", "test_winreg",
14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "test_winsound", "test_startfile",
14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "test_sqlite", "test_msilib"]
14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for skip in WIN_ONLY:
14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.expected.add(skip)
14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if sys.platform != 'irix':
14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "test_gl", "test_imgfile"]
14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for skip in IRIX_ONLY:
14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.expected.add(skip)
14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if sys.platform != 'sunos5':
14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.expected.add('test_sunaudiodev')
14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.expected.add('test_nis')
14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not sys.py3kwarning:
14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.expected.add('test_py3kwarn')
14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.valid = True
14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def isvalid(self):
14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "Return true iff _ExpectedSkips knows about the current platform."
14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.valid
14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def getexpected(self):
14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """Return set of test names we expect to skip on current platform.
14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.isvalid() must be true.
15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert self.isvalid()
15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.expected
15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # findtestdir() gets the dirname out of __file__, so we have to make it
15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # absolute before changing the working directory.
15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # For example __file__ may be relative when running trace or profile.
15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # See issue #9323.
15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __file__ = os.path.abspath(__file__)
15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # sanity check
15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert __file__ == os.path.abspath(sys.argv[0])
15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # When tests are run from the Python build directory, it is best practice
15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # to keep the test files in a subfolder.  It eases the cleanup of leftover
15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # files using command "make distclean".
15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if sysconfig.is_python_build():
15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TEMPDIR = os.path.abspath(TEMPDIR)
15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not os.path.exists(TEMPDIR):
15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            os.mkdir(TEMPDIR)
15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Define a writable temp dir that will be used as cwd while running
15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # the tests. The name of the dir includes the pid to allow parallel
15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # testing (see the -j option).
15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    TESTCWD = 'test_python_{}'.format(os.getpid())
15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    TESTCWD = os.path.join(TEMPDIR, TESTCWD)
15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Run the tests in a context manager that temporary changes the CWD to a
15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # temporary and writable directory. If it's not possible to create or
15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # change the CWD, the original CWD will be used. The original CWD is
15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # available from test_support.SAVEDCWD.
15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    with test_support.temp_cwd(TESTCWD, quiet=True):
15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        main()
1537