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