regrtest.py revision 4698d9928ef1547e86a3f692e0c8d77e3f5e869c
1152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum#! /usr/bin/env python
2152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
35f2e0e5ccb988cdf65137034b33ee57198cc23b9Martin v. Löwis"""Regression test.
4152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
5152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumThis will find all modules whose name is "test_*" in the test
6152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdirectory, and run them.  Various command line options provide
7152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumadditional facilities.
8152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
9152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumCommand line options:
10152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
1161147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-v: verbose    -- run tests in verbose mode with output to stdout
1204824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis-w: verbose2   -- re-run failed tests in verbose mode
1361147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-q: quiet      -- don't print anything except if a test fails
1461147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-x: exclude    -- arguments are tests to *exclude*
1561147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-s: single     -- run only a single test (see below)
1636dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin-S: slow       -- print the slowest 10 tests
1761147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-r: random     -- randomize test execution order
1861147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-f: fromfile   -- read names of tests to run from a file (see below)
1961147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-l: findleaks  -- if GC is available detect tests that leak memory
2061147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-u: use        -- specify which special resource intensive tests to run
2161147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-h: help       -- print this text and exit
2261147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-t: threshold  -- call gc.set_threshold(N)
2361147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-T: coverage   -- turn on code coverage using the trace module
24aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald-D: coverdir   -- Directory where coverage files are put
25aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald-N: nocoverdir -- Put coverage files alongside modules
2661147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-L: runleaks   -- run the leaks(1) command just before exit
2761147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-R: huntrleaks -- search for reference leaks (needs debug build, v. slow)
28abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouters-M: memlimit   -- run very large memory-consuming tests
294698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou-j: multiprocess -- run several processes at once
30152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
31152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumIf non-option arguments are present, they are names for tests to run,
32152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumunless -x is given, in which case they are names for tests not to run.
33152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumIf no test names are given, all tests are run.
34f58ed2596706b97c16174a839c1ed6f6b1f87fa6Guido van Rossum
35a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter-r randomizes test execution order. You can use --randseed=int to provide a
36a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winterint seed value for the randomizer; this is useful for reproducing troublesome
37a199f0198600996c6a9de3a3d914f0bc2101d244Collin Wintertest orders.
38a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter
393b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw-T turns on code coverage tracing with the trace module.
403b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw
41aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald-D specifies the directory where coverage files are put.
42aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald
43aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald-N Put coverage files alongside modules.
44aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald
459e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum-s means to run only a single test and exit.  This is useful when
469e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumdoing memory analysis on the Python interpreter (which tend to consume
479e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumtoo many resources to run the full regression test non-stop).  The
489e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumfile /tmp/pynexttest is read to find the next test to run.  If this
499e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumfile is missing, the first test_*.py file in testdir or on the command
509e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumline is used.  (actually tempfile.gettempdir() is used instead of
519e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum/tmp).
52e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
539e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum-f reads the names of tests from the file given as f's argument, one
549e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumor more test names per line.  Whitespace is ignored.  Blank lines and
559e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumlines beginning with '#' are ignored.  This is especially useful for
569e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumwhittling down failures involving interactions among tests.
57c5000dfc4098f8547461e790a91536a923124261Tim Peters
580179a18034b2316a70655d0f05bfbb20a0881f17Skip Montanaro-L causes the leaks(1) command to be run just before exit if it exists.
590179a18034b2316a70655d0f05bfbb20a0881f17Skip Montanaroleaks(1) is available on Mac OS X and presumably on some other
600179a18034b2316a70655d0f05bfbb20a0881f17Skip MontanaroFreeBSD-derived systems.
610179a18034b2316a70655d0f05bfbb20a0881f17Skip Montanaro
6261147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson-R runs each test several times and examines sys.gettotalrefcount() to
6361147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudsonsee if the test appears to be leaking references.  The argument should
6461147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudsonbe of the form stab:run:fname where 'stab' is the number of times the
6561147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudsontest is run to let gettotalrefcount settle down, 'run' is the number
6661147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudsonof times further it is run and 'fname' is the name of the file the
6761147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudsonreports are written to.  These parameters all have defaults (5, 4 and
6861147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson"reflog.txt" respectively), so the minimal invocation is '-R ::'.
6961147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson
70abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouters-M runs tests that require an exorbitant amount of memory. These tests
71abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouterstypically try to ascertain containers keep working when containing more than
7297ff04789de3e37af585648de70260a54a29bd47Armin Rigo2 billion objects, which only works on 64-bit systems. There are also some
7397ff04789de3e37af585648de70260a54a29bd47Armin Rigotests that try to exhaust the address space of the process, which only makes
7497ff04789de3e37af585648de70260a54a29bd47Armin Rigosense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
75abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouterswhich is a string in the form of '2.5Gb', determines howmuch memory the
76abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouterstests will limit themselves to (but they may go slightly over.) The number
77abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Woutersshouldn't be more memory than the machine has (including swap memory). You
78abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Woutersshould also keep in mind that swap memory is generally much, much slower
79abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Woutersthan RAM, and setting memlimit to all available RAM or higher will heavily
80abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouterstax the machine. On the other hand, it is no use running these tests with a
81abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouterslimit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
82abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Woutersto use more than memlimit memory will be skipped. The big-memory tests
83abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Woutersgenerally run very, very long.
84abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouters
859e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum-u is used to specify which special resource intensive tests to run,
869e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumsuch as those requiring large file support or network connectivity.
879e9d4f8ed8d467d0558251f43c5decc754712d53Guido van RossumThe argument is a comma-separated list of words indicating the
889e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumresources to test.  Currently only the following are defined:
8908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
903a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake    all -       Enable all special resources.
913a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
92315aa361fc60d3328aad3a5dcfd42f08213c25fbGuido van Rossum    audio -     Tests that use the audio device.  (There are known
93315aa361fc60d3328aad3a5dcfd42f08213c25fbGuido van Rossum                cases of broken audio drivers that can crash Python or
94315aa361fc60d3328aad3a5dcfd42f08213c25fbGuido van Rossum                even the Linux kernel.)
95315aa361fc60d3328aad3a5dcfd42f08213c25fbGuido van Rossum
962158df0b4d8358b5efdcac3024e8cc6d6c92d981Andrew M. Kuchling    curses -    Tests that use curses and will modify the terminal's
972158df0b4d8358b5efdcac3024e8cc6d6c92d981Andrew M. Kuchling                state and output modes.
981633a2e3452b40d0e9bb1f15ab16cd6b90f15a19Tim Peters
9987988b675323ebca3b15c52bad0dbc6b5422c2b0Benjamin Peterson    lib2to3 -   Run the tests for 2to3 (They take a while.)
10087988b675323ebca3b15c52bad0dbc6b5422c2b0Benjamin Peterson
1019e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    largefile - It is okay to run some test that may create huge
1029e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                files.  These tests can take a long time and may
1039e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                consume >2GB of disk space temporarily.
10408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
1059e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    network -   It is okay to run tests that use external network
1069e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                resource, e.g. testing SSL support for sockets.
1071c6b1a2b4ea38955a3f0514f4709bafd0be96c5eMartin v. Löwis
1081c6b1a2b4ea38955a3f0514f4709bafd0be96c5eMartin v. Löwis    bsddb -     It is okay to run the bsddb testsuite, which takes
1091c6b1a2b4ea38955a3f0514f4709bafd0be96c5eMartin v. Löwis                a long time to complete.
1104dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake
1117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    decimal -   Test the decimal module against a large suite that
1127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                verifies compliance with standards.
1137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1144336eda88640695b23790e4f52de9ee92c7fee73Jeremy Hylton    compiler -  Test the compiler package by compiling all the source
1154336eda88640695b23790e4f52de9ee92c7fee73Jeremy Hylton                in the standard library and test suite.  This takes
11668c04534182f2c09783b6506701a8bc25c98b4a9Raymond Hettinger                a long time.  Enabling this resource also allows
11768c04534182f2c09783b6506701a8bc25c98b4a9Raymond Hettinger                test_tokenize to verify round-trip lexing on every
11868c04534182f2c09783b6506701a8bc25c98b4a9Raymond Hettinger                file in the test library.
1194336eda88640695b23790e4f52de9ee92c7fee73Jeremy Hylton
120eba28bea9b8ef7df010e65c630b8c0f7009c6005Tim Peters    subprocess  Run all tests for the subprocess module.
121f7f1bb7ff5039626c856efafb68a4d338ab96642Peter Astrand
122aaa2f1dea706daf2a5f431d97a3e3120dba652d2Hye-Shik Chang    urlfetch -  It is okay to download files required on testing.
123aaa2f1dea706daf2a5f431d97a3e3120dba652d2Hye-Shik Chang
124b1a98de25ecd3e11fc3093de31fe844233dcd389Guilherme Polo    gui -       Run tests that require a running GUI.
125b1a98de25ecd3e11fc3093de31fe844233dcd389Guilherme Polo
126f8089c7789d61979fd195e67186a77039534cc87Collin Winter    xpickle -   Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
127f8089c7789d61979fd195e67186a77039534cc87Collin Winter                test backwards compatibility. These tests take a long time
128f8089c7789d61979fd195e67186a77039534cc87Collin Winter                to run.
129f8089c7789d61979fd195e67186a77039534cc87Collin Winter
1304dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred DrakeTo enable all resources except one, use '-uall,-<resource>'.  For
1314dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drakeexample, to run all the tests except for the bsddb tests, give the
1324dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drakeoption '-uall,-bsddb'.
133152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum"""
134152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
13536dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskinimport cStringIO
136152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport getopt
1374698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrouimport json
13836dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskinimport os
139ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaroimport random
14094a9c09e109706af64ae8796882baab2af25be2fNeal Norwitzimport re
14136dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskinimport sys
14236dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskinimport time
1433b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsawimport traceback
14436dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskinimport warnings
145888a39b54c4f47ee25d53b157e2c50402627cd0bBenjamin Petersonimport unittest
146dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossum
147dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossum# I see no other way to suppress these warnings;
148dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossum# putting them in test_grammar.py has no effect:
14988b1defb6f770c4f74788e8296b88fc31c3936ceGuido van Rossumwarnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
150dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossum                        ".*test.test_grammar$")
151c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossumif sys.maxint > 0x7fffffff:
152c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossum    # Also suppress them in <string>, because for 64-bit platforms,
153c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossum    # that's where test_grammar.py hides them.
154c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossum    warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
155c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossum                            "<string>")
156152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
1579df4e6f6735af274813cf1b611ee1a342955ad63Thomas Wouters# Ignore ImportWarnings that only occur in the source tree,
1589df4e6f6735af274813cf1b611ee1a342955ad63Thomas Wouters# (because of modules with the same name as source-directories in Modules/)
159076ba2129bb08f56c3af9397748ae1df41daba06Thomas Woutersfor mod in ("ctypes", "gzip", "zipfile", "tarfile", "encodings.zlib_codec",
160076ba2129bb08f56c3af9397748ae1df41daba06Thomas Wouters            "test.test_zipimport", "test.test_zlib", "test.test_zipfile",
161076ba2129bb08f56c3af9397748ae1df41daba06Thomas Wouters            "test.test_codecs", "test.string_tests"):
1629df4e6f6735af274813cf1b611ee1a342955ad63Thomas Wouters    warnings.filterwarnings(module=".*%s$" % (mod,),
1639df4e6f6735af274813cf1b611ee1a342955ad63Thomas Wouters                            action="ignore", category=ImportWarning)
1649df4e6f6735af274813cf1b611ee1a342955ad63Thomas Wouters
165bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# MacOSX (a.k.a. Darwin) has a default stack size that is too small
166bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# for deeply recursive regular expressions.  We see this as crashes in
167bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# the Python test suite when running test_re.py and test_sre.py.  The
168bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# fix is to set the stack limit to 2048.
169bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# This approach may also be useful for other Unixy platforms that
170bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# suffer from small default stack limits.
171bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossumif sys.platform == 'darwin':
172bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum    try:
173bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        import resource
174bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum    except ImportError:
175bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        pass
176bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum    else:
177bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
178bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        newsoft = min(hard, max(soft, 1024*2048))
179bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
180bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum
18104f357cffef6d764f2f0ff2671dabde75ec250d1Barry Warsawfrom test import test_support
1823a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
183e2886fd3ca357c4cf7c1584375d9b9bb55d476b7Benjamin PetersonRESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
184f8089c7789d61979fd195e67186a77039534cc87Collin Winter                  'decimal', 'compiler', 'subprocess', 'urlfetch', 'gui',
185f8089c7789d61979fd195e67186a77039534cc87Collin Winter                  'xpickle')
1863a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
1873a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
18808fca5212528e073600c27c70a34eeef445f393bBarry Warsawdef usage(code, msg=''):
18908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    print __doc__
19008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if msg: print msg
19108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(code)
19208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
19308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
194ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arcdef main(tests=None, testdir=None, verbose=0, quiet=False,
1953b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw         exclude=False, single=False, randomize=False, fromfile=None,
196aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald         findleaks=False, use_resources=None, trace=False, coverdir='coverage',
197a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter         runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
1984698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou         random_seed=None, use_mp=None):
1996fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Execute a test suite.
2006fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
2017e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters    This also parses command-line options and modifies its behavior
202004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    accordingly.
2036fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
2046fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    tests -- a list of strings containing test names (optional)
2056fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- the directory in which to look for tests (optional)
2066fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
2076fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    Users other than the Python test suite will certainly want to
2086fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    specify testdir; if it's omitted, the directory containing the
209004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    Python test suite is searched for.
2106fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
2116fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    If the tests argument is omitted, the tests listed on the
2126fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    command-line will be used.  If that's empty, too, then all *.py
2136fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    files beginning with test_ will be used.
214ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro
215ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc    The other default arguments (verbose, quiet, exclude,
216a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter    single, randomize, findleaks, use_resources, trace, coverdir, print_slow and
217a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter    random_seed) allow programmers calling main() directly to set the
21836dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin    values that would normally be set by flags on the command line.
2196fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
220004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
2218dee809410e2d433bb0be5d8a1699736b90db0b5Tim Peters    test_support.record_original_stdout(sys.stdout)
222152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
2234698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsSrf:lu:t:TD:NLR:wM:j:',
224a5573b31532f59a63d9ff24e415592f60f974da4Brett Cannon                                   ['help', 'verbose', 'quiet', 'exclude',
22536dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin                                    'single', 'slow', 'random', 'fromfile',
2263b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw                                    'findleaks', 'use=', 'threshold=', 'trace',
227aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald                                    'coverdir=', 'nocoverdir', 'runleaks',
228abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouters                                    'huntrleaks=', 'verbose2', 'memlimit=',
2294698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                                    'randseed=', 'multiprocess=', 'slaveargs=',
2303b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw                                    ])
231152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except getopt.error, msg:
23208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, msg)
23308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
23408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    # Defaults
235a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter    if random_seed is None:
236a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter        random_seed = random.randrange(10000000)
23708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if use_resources is None:
23808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        use_resources = []
239152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for o, a in opts:
24008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        if o in ('-h', '--help'):
24108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            usage(0)
24208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-v', '--verbose'):
24308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose += 1
24404824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis        elif o in ('-w', '--verbose2'):
24504824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis            verbose2 = True
24608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-q', '--quiet'):
2473b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw            quiet = True;
24808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose = 0
24908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-x', '--exclude'):
2503b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw            exclude = True
25108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-s', '--single'):
2523b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw            single = True
25336dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin        elif o in ('-S', '--slow'):
25436dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin            print_slow = True
25508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-r', '--randomize'):
2563b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw            randomize = True
257a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter        elif o == '--randseed':
258a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter            random_seed = int(a)
259c5000dfc4098f8547461e790a91536a923124261Tim Peters        elif o in ('-f', '--fromfile'):
260c5000dfc4098f8547461e790a91536a923124261Tim Peters            fromfile = a
26108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-l', '--findleaks'):
2623b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw            findleaks = True
2630179a18034b2316a70655d0f05bfbb20a0881f17Skip Montanaro        elif o in ('-L', '--runleaks'):
2640179a18034b2316a70655d0f05bfbb20a0881f17Skip Montanaro            runleaks = True
2659e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum        elif o in ('-t', '--threshold'):
2669e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum            import gc
2679e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum            gc.set_threshold(int(a))
2683b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw        elif o in ('-T', '--coverage'):
2693b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw            trace = True
270aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald        elif o in ('-D', '--coverdir'):
271aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald            coverdir = os.path.join(os.getcwd(), a)
272aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald        elif o in ('-N', '--nocoverdir'):
273aee4da6b83e49de68fed0c6b999aa109eab98f0dWalter Dörwald            coverdir = None
27461147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson        elif o in ('-R', '--huntrleaks'):
27561147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson            huntrleaks = a.split(':')
27661147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson            if len(huntrleaks) != 3:
27761147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson                print a, huntrleaks
27861147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson                usage(2, '-R takes three colon-separated arguments')
27961147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson            if len(huntrleaks[0]) == 0:
28061147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson                huntrleaks[0] = 5
28161147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson            else:
28261147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson                huntrleaks[0] = int(huntrleaks[0])
28361147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson            if len(huntrleaks[1]) == 0:
28461147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson                huntrleaks[1] = 4
28561147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson            else:
28661147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson                huntrleaks[1] = int(huntrleaks[1])
28761147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson            if len(huntrleaks[2]) == 0:
28861147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson                huntrleaks[2] = "reflog.txt"
289abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouters        elif o in ('-M', '--memlimit'):
290abd08884a685d3724798664f7c2f0aab7a6640c8Thomas Wouters            test_support.set_memlimit(a)
29108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-u', '--use'):
292fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            u = [x.lower() for x in a.split(',')]
293fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            for r in u:
2943a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                if r == 'all':
2954dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    use_resources[:] = RESOURCE_NAMES
2964dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    continue
2974dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                remove = False
2984dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                if r[0] == '-':
2994dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    remove = True
3004dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    r = r[1:]
3013a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                if r not in RESOURCE_NAMES:
3023a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                    usage(1, 'Invalid -u/--use option: ' + a)
3034dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                if remove:
3044dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    if r in use_resources:
3054dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                        use_resources.remove(r)
3064dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                elif r not in use_resources:
307e41abab33b0b467acd6bdc7d73ce4b5cef4fd5bfAndrew MacIntyre                    use_resources.append(r)
3084698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        elif o in ('-j', '--multiprocess'):
3094698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            use_mp = int(a)
3104698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        elif o == '--slaveargs':
3114698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            args, kwargs = json.loads(a)
3124698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            try:
3134698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                result = runtest(*args, **kwargs)
3144698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            except BaseException, e:
3154698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                result = -3, e.__class__.__name__
3164698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            print   # Force a newline (just in case)
3174698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            print json.dumps(result)
3184698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            sys.exit(0)
319c5000dfc4098f8547461e790a91536a923124261Tim Peters    if single and fromfile:
320c5000dfc4098f8547461e790a91536a923124261Tim Peters        usage(2, "-s and -f don't go together!")
3214698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    if use_mp and trace:
3224698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        usage(2, "-T and -j don't go together!")
3234698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    if use_mp and findleaks:
3244698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        usage(2, "-l and -j don't go together!")
32508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
326152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    good = []
327152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    bad = []
328152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    skipped = []
3299a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake    resource_denieds = []
330e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
331d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer    if findleaks:
332a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        try:
333a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw            import gc
334a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        except ImportError:
3358a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            print 'No GC available, disabling findleaks.'
3363b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw            findleaks = False
337a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        else:
3388a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # Uncomment the line below to report garbage that is not
3398a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # freeable by reference counting alone.  By default only
3408a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # garbage that is not collectable by the GC is reported.
3418a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            #gc.set_debug(gc.DEBUG_SAVEALL)
342d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            found_garbage = []
343a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
344e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
345e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        from tempfile import gettempdir
346e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        filename = os.path.join(gettempdir(), 'pynexttest')
347e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        try:
348e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp = open(filename, 'r')
349fc170b1fd5db978f4e8d4c23c138a7b59df681ecEric S. Raymond            next = fp.read().strip()
350e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            tests = [next]
351e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp.close()
352e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        except IOError:
353e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            pass
354c5000dfc4098f8547461e790a91536a923124261Tim Peters
355c5000dfc4098f8547461e790a91536a923124261Tim Peters    if fromfile:
356c5000dfc4098f8547461e790a91536a923124261Tim Peters        tests = []
357c5000dfc4098f8547461e790a91536a923124261Tim Peters        fp = open(fromfile)
358c5000dfc4098f8547461e790a91536a923124261Tim Peters        for line in fp:
359c5000dfc4098f8547461e790a91536a923124261Tim Peters            guts = line.split() # assuming no test has whitespace in its name
360c5000dfc4098f8547461e790a91536a923124261Tim Peters            if guts and not guts[0].startswith('#'):
361c5000dfc4098f8547461e790a91536a923124261Tim Peters                tests.extend(guts)
362c5000dfc4098f8547461e790a91536a923124261Tim Peters        fp.close()
363c5000dfc4098f8547461e790a91536a923124261Tim Peters
364c5000dfc4098f8547461e790a91536a923124261Tim Peters    # Strip .py extensions.
365c5000dfc4098f8547461e790a91536a923124261Tim Peters    if args:
366c5000dfc4098f8547461e790a91536a923124261Tim Peters        args = map(removepy, args)
367c5000dfc4098f8547461e790a91536a923124261Tim Peters    if tests:
368c5000dfc4098f8547461e790a91536a923124261Tim Peters        tests = map(removepy, tests)
369c5000dfc4098f8547461e790a91536a923124261Tim Peters
3706c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    stdtests = STDTESTS[:]
3716c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    nottests = NOTTESTS[:]
372152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if exclude:
3736c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        for arg in args:
3746c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum            if arg in stdtests:
3756c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum                stdtests.remove(arg)
3766c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        nottests[:0] = args
37741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        args = []
378747e1cade657e1e15c0f51d898de901da723e6a2Guido van Rossum    tests = tests or args or findtests(testdir, stdtests, nottests)
379e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
380e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        tests = tests[:1]
381ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro    if randomize:
382a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter        random.seed(random_seed)
383a199f0198600996c6a9de3a3d914f0bc2101d244Collin Winter        print "Using random seed", random_seed
384ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro        random.shuffle(tests)
3853b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw    if trace:
3863b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw        import trace
3873b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw        tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
3883b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw                             trace=False, count=True)
38936dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin    test_times = []
39008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    test_support.use_resources = use_resources
3915796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum    save_modules = sys.modules.keys()
3924698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou
3934698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    def accumulate_result(test, result):
3944698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        ok, test_time = result
3954698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        test_times.append((test_time, test))
3964698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        if ok > 0:
3974698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            good.append(test)
3984698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        elif ok == 0:
3994698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            bad.append(test)
40041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        else:
4014698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            skipped.append(test)
4024698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            if ok == -2:
4034698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                resource_denieds.append(test)
4044698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou
4054698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    if use_mp:
4064698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        from threading import Thread
4074698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        from Queue import Queue, Empty
4084698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        from subprocess import Popen, PIPE, STDOUT
4094698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        from collections import deque
4104698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        debug_output_pat = re.compile(r"\[\d+ refs\]$")
4114698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        pending = deque()
4124698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        output = Queue()
4134698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        for test in tests:
4144698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            args_tuple = (
4154698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                (test, verbose, quiet, testdir),
4164698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                dict(huntrleaks=huntrleaks, use_resources=use_resources)
4174698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            )
4184698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            pending.append((test, args_tuple))
4194698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        def work():
4204698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            # A worker thread.
42114ca327f998511da5e89f819204c54fa582dd696Neal Norwitz            try:
4224698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                while True:
4234698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    try:
4244698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                        test, args_tuple = pending.popleft()
4254698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    except IndexError:
4264698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                        output.put((None, None, None))
4274698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                        return
4284698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    if not quiet:
4294698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                        print test
4304698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                        sys.stdout.flush()
4314698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    popen = Popen([sys.executable, '-m', 'test.regrtest',
4324698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                                   '--slaveargs', json.dumps(args_tuple)],
4334698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                                   stdout=PIPE, stderr=STDOUT,
4344698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                                   universal_newlines=True, close_fds=True)
4354698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    out = popen.communicate()[0].strip()
4364698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    out = debug_output_pat.sub("", out)
4374698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    out, _, result = out.strip().rpartition("\n")
4384698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    result = json.loads(result)
4394698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    output.put((test, out.strip(), result))
4404698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            except BaseException:
4414698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                output.put((None, None, None))
44214ca327f998511da5e89f819204c54fa582dd696Neal Norwitz                raise
4434698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        workers = [Thread(target=work) for i in range(use_mp)]
4444698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        for worker in workers:
4454698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            worker.start()
4464698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        finished = 0
4474698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        while finished < use_mp:
4484698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            test, out, result = output.get()
4494698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            if test is None:
4504698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                finished += 1
4514698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                continue
4524698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            if out:
4534698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                print out
4544698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            if result[0] == -3:
4554698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                assert result[1] == 'KeyboardInterrupt'
4564698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                pending.clear()
4574698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                raise KeyboardInterrupt   # What else?
4584698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            accumulate_result(test, result)
4594698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        for worker in workers:
4604698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            worker.join()
4614698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    else:
4624698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        for test in tests:
4634698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            if not quiet:
4644698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                print test
4654698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                sys.stdout.flush()
4664698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            if trace:
4674698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                # If we're tracing code coverage, then we don't exit with status
4684698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                # if on a false return value from main.
4694698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                tracer.runctx('runtest(test, verbose, quiet, testdir)',
4704698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                              globals=globals(), locals=vars())
4713b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw            else:
4724698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                try:
4734698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    result = runtest(test, verbose, quiet,
4744698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                                     testdir, huntrleaks)
4754698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    accumulate_result(test, result)
4764698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                except KeyboardInterrupt:
4774698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    # print a newline separate from the ^C
4784698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    print
4794698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    break
4804698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                except:
4814698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    raise
4824698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            if findleaks:
4834698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                gc.collect()
4844698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                if gc.garbage:
4854698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    print "Warning: test created", len(gc.garbage),
4864698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    print "uncollectable object(s)."
4874698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    # move the uncollectable objects somewhere so we don't see
4884698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    # them again
4894698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    found_garbage.extend(gc.garbage)
4904698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    del gc.garbage[:]
4914698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            # Unload the newly imported modules (best effort finalization)
4924698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            for module in sys.modules.keys():
4934698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                if module not in save_modules and module.startswith("test."):
4944698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                    test_support.unload(module)
4957a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton
4967a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    # The lists won't be sorted if running with -r
4977a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    good.sort()
4987a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    bad.sort()
4997a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    skipped.sort()
500e0c446bb4ad67294f42d4cb53b4ff28413bd8ddeTim Peters
501152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if good and not quiet:
50241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not bad and not skipped and len(good) > 1:
50341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print "All",
50441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print count(len(good), "test"), "OK."
50536dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin    if print_slow:
50636dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin        test_times.sort(reverse=True)
50736dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin        print "10 slowest tests:"
50836dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin        for time, test in test_times[:10]:
50936dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin            print "%s: %.1fs" % (test, time)
510152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if bad:
511a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(bad), "test"), "failed:"
512a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(bad)
513152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if skipped and not quiet:
514a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(skipped), "test"), "skipped:"
515a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(skipped)
516e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
517b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        e = _ExpectedSkips()
518a2be2d624a47e420266606f0cb2a2e030797f650Tim Peters        plat = sys.platform
519b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if e.isvalid():
520a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            surprise = set(skipped) - e.getexpected() - set(resource_denieds)
521b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if surprise:
522b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print count(len(surprise), "skip"), \
523a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                      "unexpected on", plat + ":"
524a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                printlist(surprise)
525b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            else:
526b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print "Those skips are all expected on", plat + "."
527b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        else:
528b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "Ask someone to teach regrtest.py about which tests are"
529b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "expected to get skipped on", plat + "."
530b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
53104824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis    if verbose2 and bad:
53204824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis        print "Re-running failed tests in verbose mode"
53304824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis        for test in bad:
534922dd7d49da75b07e27f917db0166f67bdbef3d3Tim Peters            print "Re-running test %r in verbose mode" % test
535922dd7d49da75b07e27f917db0166f67bdbef3d3Tim Peters            sys.stdout.flush()
53604824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis            try:
5375fe5cf6df20607033096c05d68cef7222a35697cNeal Norwitz                test_support.verbose = True
5384698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou                ok = runtest(test, True, quiet, testdir,
53904824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis                             huntrleaks)
54004824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis            except KeyboardInterrupt:
54104824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis                # print a newline separate from the ^C
54204824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis                print
54304824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis                break
54404824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis            except:
54504824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis                raise
54604824ce8ed3e4e936487758ca6672b6dec75a8a7Martin v. Löwis
547e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
548e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        alltests = findtests(testdir, stdtests, nottests)
549e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        for i in range(len(alltests)):
550e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            if tests[0] == alltests[i]:
551e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                if i == len(alltests) - 1:
552e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    os.unlink(filename)
553e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                else:
554e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp = open(filename, 'w')
555e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.write(alltests[i+1] + '\n')
556e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.close()
557e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                break
558e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        else:
559e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            os.unlink(filename)
560e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
5613b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw    if trace:
5623b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw        r = tracer.results()
5633b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw        r.write_results(show_missing=True, summary=True, coverdir=coverdir)
5643b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw
5650179a18034b2316a70655d0f05bfbb20a0881f17Skip Montanaro    if runleaks:
5660179a18034b2316a70655d0f05bfbb20a0881f17Skip Montanaro        os.system("leaks %d" % os.getpid())
5670179a18034b2316a70655d0f05bfbb20a0881f17Skip Montanaro
5685943b4ac1067e5011b66697396d5df93b5ef9af0Tim Peters    sys.exit(len(bad) > 0)
56908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
570152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
5716fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumSTDTESTS = [
572152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_grammar',
573152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_opcodes',
574f567ca3e1ae851ea6e7418da3df47e034841a08dCollin Winter    'test_dict',
575152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_builtin',
576152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_exceptions',
577152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_types',
5785545314ba7d14abda0a5f6bc50cbef122167f205Collin Winter    'test_unittest',
5795545314ba7d14abda0a5f6bc50cbef122167f205Collin Winter    'test_doctest',
5805545314ba7d14abda0a5f6bc50cbef122167f205Collin Winter    'test_doctest2',
581152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum   ]
582152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
5836fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumNOTTESTS = [
584152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_support',
58562e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future1',
58662e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future2',
587152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    ]
588152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
5896fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossumdef findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
590152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    """Return a list of all applicable test modules."""
5916fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
592152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    names = os.listdir(testdir)
593152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests = []
594152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for name in names:
595e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        if name[:5] == "test_" and name[-3:] == os.extsep+"py":
59641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            modname = name[:-3]
59741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if modname not in stdtests and modname not in nottests:
59841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                tests.append(modname)
599152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests.sort()
600152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return stdtests + tests
601152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
6024698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitroudef runtest(test, verbose, quiet,
6034698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            testdir=None, huntrleaks=False, use_resources=None):
6046fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Run a single test.
605e55848695347c67effeb08aedcf2ce3d256524cdTim Peters
6066fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    test -- the name of the test
6076fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    verbose -- if true, print more messages
608f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick    quiet -- if true, don't print 'skipped' messages (probably redundant)
60936dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin    test_times -- a list of (time, test_name) pairs
6106fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- test directory
611e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    huntrleaks -- run multiple times to test for leaks; requires a debug
612e55848695347c67effeb08aedcf2ce3d256524cdTim Peters                  build; a triple corresponding to -R's three arguments
613e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    Return:
614e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        -2  test skipped because resource denied
615e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        -1  test skipped for some other reason
616e55848695347c67effeb08aedcf2ce3d256524cdTim Peters         0  test failed
617e55848695347c67effeb08aedcf2ce3d256524cdTim Peters         1  test passed
6186fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
61906c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
6204698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    test_support.verbose = verbose  # Tell tests to be moderately quiet
6214698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    if use_resources is not None:
6224698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        test_support.use_resources = use_resources
623e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    try:
6244698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        return runtest_inner(test, verbose, quiet,
62536dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin                             testdir, huntrleaks)
626e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    finally:
627e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        cleanup_test_droppings(test, verbose)
628e55848695347c67effeb08aedcf2ce3d256524cdTim Peters
6294698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitroudef runtest_inner(test, verbose, quiet,
63036dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin                  testdir=None, huntrleaks=False):
631152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    test_support.unload(test)
6323b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw    if not testdir:
6333b6d025d9bc6a0109e9a2ebd28a4864e8007193aBarry Warsaw        testdir = findtestdir()
6349390cc15da5cd6920bd41bb4cd146d5d0601345fTim Peters    if verbose:
635ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        capture_stdout = None
6360fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    else:
637ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        capture_stdout = cStringIO.StringIO()
63806c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
6394698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    test_time = 0.0
6400f489743ef18ab2da39695d945c79b7a24df8554Collin Winter    refleak = False  # True if the test leaked references.
641152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
642342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters        save_stdout = sys.stdout
64341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        try:
644ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc            if capture_stdout:
645ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc                sys.stdout = capture_stdout
646408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            if test.startswith('test.'):
647408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                abstest = test
648408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            else:
649408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                # Always import it from the test package
650408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                abstest = 'test.' + test
65136dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin            start_time = time.time()
652408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            the_package = __import__(abstest, globals(), locals(), [])
653408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            the_module = getattr(the_package, test)
654980c4fc04d82e650810a3111eea5c5b32f5883a6Georg Brandl            # Old tests run to completion simply as a side-effect of
655980c4fc04d82e650810a3111eea5c5b32f5883a6Georg Brandl            # being imported.  For tests based on unittest or doctest,
656980c4fc04d82e650810a3111eea5c5b32f5883a6Georg Brandl            # explicitly invoke their test_main() function (if it exists).
657d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            indirect_test = getattr(the_module, "test_main", None)
658d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            if indirect_test is not None:
659d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters                indirect_test()
66061147f63d9eb20bdd34d5f7549f8379155aefd60Michael W. Hudson            if huntrleaks:
6610f489743ef18ab2da39695d945c79b7a24df8554Collin Winter                refleak = dash_R(the_module, test, indirect_test, huntrleaks)
66236dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8Jeffrey Yasskin            test_time = time.time() - start_time
66341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        finally:
664342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters            sys.stdout = save_stdout
6659a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake    except test_support.ResourceDenied, msg:
6669a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake        if not quiet:
6679a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake            print test, "skipped --", msg
6689a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake            sys.stdout.flush()
6694698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        return -2, test_time
670612f1d5f48d609b4a1b0afd4d64499ff4e5f629dR. David Murray    except unittest.SkipTest, msg:
671f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        if not quiet:
672de4742b87f7775fc3d9fa76cd640e7cdd5ef69a2Fred Drake            print test, "skipped --", msg
6733cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum            sys.stdout.flush()
6744698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        return -1, test_time
675fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake    except KeyboardInterrupt:
676fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake        raise
677152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except test_support.TestFailed, msg:
67841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print "test", test, "failed --", msg
6793cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum        sys.stdout.flush()
6804698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        return 0, test_time
6819e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossum    except:
68241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        type, value = sys.exc_info()[:2]
68327c4b39025eb9e20f9d7a36b6aa0bb9c97f9bba5Fred Drake        print "test", test, "crashed --", str(type) + ":", value
6843cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum        sys.stdout.flush()
68541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if verbose:
68641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            traceback.print_exc(file=sys.stdout)
6873cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum            sys.stdout.flush()
6884698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        return 0, test_time
689152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
6900f489743ef18ab2da39695d945c79b7a24df8554Collin Winter        if refleak:
6914698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            return 0, test_time
692ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        # Except in verbose mode, tests should not print anything
693ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        if verbose or huntrleaks:
6944698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            return 1, test_time
695ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        output = capture_stdout.getvalue()
696ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        if not output:
6974698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            return 1, test_time
6980fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        print "test", test, "produced unexpected output:"
699ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        print "*" * 70
700ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        print output
701ea13dc629caed2dd44b1ba5b611e1ba2ac1fd96fAmaury Forgeot d'Arc        print "*" * 70
7023cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum        sys.stdout.flush()
7034698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        return 0, test_time
7040fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum
705e55848695347c67effeb08aedcf2ce3d256524cdTim Petersdef cleanup_test_droppings(testname, verbose):
706e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    import shutil
707a9b4d4777a4018e7fcaa92b6e587992819501b5eBenjamin Peterson    import stat
708e55848695347c67effeb08aedcf2ce3d256524cdTim Peters
709e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    # Try to clean up junk commonly left behind.  While tests shouldn't leave
710e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    # any files or directories behind, when a test fails that can be tedious
711e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    # for it to arrange.  The consequences can be especially nasty on Windows,
712e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    # since if a test leaves a file open, it cannot be deleted by name (while
713e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    # there's nothing we can do about that here either, we can display the
714e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    # name of the offending test, which is a real help).
715e55848695347c67effeb08aedcf2ce3d256524cdTim Peters    for name in (test_support.TESTFN,
716e55848695347c67effeb08aedcf2ce3d256524cdTim Peters                 "db_home",
717e55848695347c67effeb08aedcf2ce3d256524cdTim Peters                ):
718e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        if not os.path.exists(name):
719e55848695347c67effeb08aedcf2ce3d256524cdTim Peters            continue
720e55848695347c67effeb08aedcf2ce3d256524cdTim Peters
721e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        if os.path.isdir(name):
722e55848695347c67effeb08aedcf2ce3d256524cdTim Peters            kind, nuker = "directory", shutil.rmtree
723e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        elif os.path.isfile(name):
724e55848695347c67effeb08aedcf2ce3d256524cdTim Peters            kind, nuker = "file", os.unlink
725e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        else:
726e55848695347c67effeb08aedcf2ce3d256524cdTim Peters            raise SystemError("os.path says %r exists but is neither "
727e55848695347c67effeb08aedcf2ce3d256524cdTim Peters                              "directory nor file" % name)
728e55848695347c67effeb08aedcf2ce3d256524cdTim Peters
729e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        if verbose:
730e55848695347c67effeb08aedcf2ce3d256524cdTim Peters            print "%r left behind %s %r" % (testname, kind, name)
731e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        try:
732a9b4d4777a4018e7fcaa92b6e587992819501b5eBenjamin Peterson            # if we have chmod, fix possible permissions problems
733a9b4d4777a4018e7fcaa92b6e587992819501b5eBenjamin Peterson            # that might prevent cleanup
734a9b4d4777a4018e7fcaa92b6e587992819501b5eBenjamin Peterson            if (hasattr(os, 'chmod')):
735a9b4d4777a4018e7fcaa92b6e587992819501b5eBenjamin Peterson                os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
736e55848695347c67effeb08aedcf2ce3d256524cdTim Peters            nuker(name)
737e55848695347c67effeb08aedcf2ce3d256524cdTim Peters        except Exception, msg:
738e55848695347c67effeb08aedcf2ce3d256524cdTim Peters            print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
739e55848695347c67effeb08aedcf2ce3d256524cdTim Peters                "removed: %s" % (testname, kind, name, msg))
740e55848695347c67effeb08aedcf2ce3d256524cdTim Peters
74106c5c008193164f04ebcc14ca5176080cf303c54Tim Petersdef dash_R(the_module, test, indirect_test, huntrleaks):
7420f489743ef18ab2da39695d945c79b7a24df8554Collin Winter    """Run a test multiple times, looking for reference leaks.
7430f489743ef18ab2da39695d945c79b7a24df8554Collin Winter
7440f489743ef18ab2da39695d945c79b7a24df8554Collin Winter    Returns:
7450f489743ef18ab2da39695d945c79b7a24df8554Collin Winter        False if the test didn't leak references; True if we detected refleaks.
7460f489743ef18ab2da39695d945c79b7a24df8554Collin Winter    """
74706c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    # This code is hackish and inelegant, but it seems to do the job.
748dffbf5f5421cbeb20237280c0bd70f989269f844Georg Brandl    import copy_reg, _abcoll, io
74906c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
75006c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    if not hasattr(sys, 'gettotalrefcount'):
75106c5c008193164f04ebcc14ca5176080cf303c54Tim Peters        raise Exception("Tracking reference leaks requires a debug build "
75206c5c008193164f04ebcc14ca5176080cf303c54Tim Peters                        "of Python")
75306c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
75406c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    # Save current values for dash_R_cleanup() to restore.
75506c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    fs = warnings.filters[:]
756dffbf5f5421cbeb20237280c0bd70f989269f844Georg Brandl    ps = copy_reg.dispatch_table.copy()
75706c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    pic = sys.path_importer_cache.copy()
75864c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossum    abcs = {}
7594d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc    modules = _abcoll, io
7604d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc    for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
7614d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc        # XXX isinstance(abc, ABCMeta) leads to infinite recursion
7624d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc        if not hasattr(abc, '_abc_registry'):
7636b29dd05c8fff4fc69ab4d68baef86fb7e91548cChristian Heimes            continue
76464c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossum        for obj in abc.__subclasses__() + [abc]:
76564c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossum            abcs[obj] = obj._abc_registry.copy()
76664c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossum
76706c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    if indirect_test:
76806c5c008193164f04ebcc14ca5176080cf303c54Tim Peters        def run_the_test():
76906c5c008193164f04ebcc14ca5176080cf303c54Tim Peters            indirect_test()
77006c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    else:
77106c5c008193164f04ebcc14ca5176080cf303c54Tim Peters        def run_the_test():
77206c5c008193164f04ebcc14ca5176080cf303c54Tim Peters            reload(the_module)
77306c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
77406c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    deltas = []
77506c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    nwarmup, ntracked, fname = huntrleaks
77606c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    repcount = nwarmup + ntracked
77706c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    print >> sys.stderr, "beginning", repcount, "repetitions"
77806c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
77964c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossum    dash_R_cleanup(fs, ps, pic, abcs)
78006c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    for i in range(repcount):
78106c5c008193164f04ebcc14ca5176080cf303c54Tim Peters        rc = sys.gettotalrefcount()
78206c5c008193164f04ebcc14ca5176080cf303c54Tim Peters        run_the_test()
78306c5c008193164f04ebcc14ca5176080cf303c54Tim Peters        sys.stderr.write('.')
78464c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossum        dash_R_cleanup(fs, ps, pic, abcs)
78506c5c008193164f04ebcc14ca5176080cf303c54Tim Peters        if i >= nwarmup:
78606c5c008193164f04ebcc14ca5176080cf303c54Tim Peters            deltas.append(sys.gettotalrefcount() - rc - 2)
78706c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    print >> sys.stderr
78806c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    if any(deltas):
789d9841039dbd0e37746d46f6e46ce1d82b85a21b3Neal Norwitz        msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
790d9841039dbd0e37746d46f6e46ce1d82b85a21b3Neal Norwitz        print >> sys.stderr, msg
7914698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou        with open(fname, "a") as refrep:
7924698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            print >> refrep, msg
7934698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou            refrep.flush()
7940f489743ef18ab2da39695d945c79b7a24df8554Collin Winter        return True
7950f489743ef18ab2da39695d945c79b7a24df8554Collin Winter    return False
79606c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
79764c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossumdef dash_R_cleanup(fs, ps, pic, abcs):
798dffbf5f5421cbeb20237280c0bd70f989269f844Georg Brandl    import gc, copy_reg
7990aa6e1b8fb8c3ae656518a7e319a5f697158e7bfBrett Cannon    import _strptime, linecache
8000aa6e1b8fb8c3ae656518a7e319a5f697158e7bfBrett Cannon    dircache = test_support.import_module('dircache', deprecated=True)
80106c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    import urlparse, urllib, urllib2, mimetypes, doctest
8024d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc    import struct, filecmp
80306c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    from distutils.dir_util import _path_created
80406c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
805607bff1ebe81e869697e228322da4c308e8753a5Amaury Forgeot d'Arc    # Clear the warnings registry, so they can be displayed again
806607bff1ebe81e869697e228322da4c308e8753a5Amaury Forgeot d'Arc    for mod in sys.modules.values():
807607bff1ebe81e869697e228322da4c308e8753a5Amaury Forgeot d'Arc        if hasattr(mod, '__warningregistry__'):
808607bff1ebe81e869697e228322da4c308e8753a5Amaury Forgeot d'Arc            del mod.__warningregistry__
809607bff1ebe81e869697e228322da4c308e8753a5Amaury Forgeot d'Arc
81006c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    # Restore some original values.
81106c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    warnings.filters[:] = fs
812dffbf5f5421cbeb20237280c0bd70f989269f844Georg Brandl    copy_reg.dispatch_table.clear()
813dffbf5f5421cbeb20237280c0bd70f989269f844Georg Brandl    copy_reg.dispatch_table.update(ps)
81406c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    sys.path_importer_cache.clear()
81506c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    sys.path_importer_cache.update(pic)
81606c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
817908caac52e8e62baa1ee54e4e650e1cd3ac37907Christian Heimes    # clear type cache
818422051a3675271e179995ad4a0f056ff94395d55Christian Heimes    sys._clear_type_cache()
819908caac52e8e62baa1ee54e4e650e1cd3ac37907Christian Heimes
82064c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossum    # Clear ABC registries, restoring previously saved ABC registries.
8214d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc    for abc, registry in abcs.items():
8224d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc        abc._abc_registry = registry.copy()
8234d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc        abc._abc_cache.clear()
8244d0c1170ef1eb0d0acbbcc6da0fa5a7c6cba4a10Amaury Forgeot d'Arc        abc._abc_negative_cache.clear()
82564c06e327d48150fc548cf18a4a7ae0b890e69faGuido van Rossum
82606c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    # Clear assorted module caches.
82706c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    _path_created.clear()
82806c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    re.purge()
82906c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    _strptime._regex_cache.clear()
83006c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    urlparse.clear_cache()
83106c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    urllib.urlcleanup()
83206c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    urllib2.install_opener(None)
83306c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    dircache.reset()
83406c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    linecache.clearcache()
83506c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    mimetypes._default_mime_types()
836c27d655c00ec08f44abea646ae06456cbcca84b6Tim Peters    filecmp._cache.clear()
83776d19f68e4c824bbcba890d924f20a6133ee0326Christian Heimes    struct._clearcache()
83806c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    doctest.master = None
83906c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
84006c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    # Collect cyclic trash.
84106c5c008193164f04ebcc14ca5176080cf303c54Tim Peters    gc.collect()
84206c5c008193164f04ebcc14ca5176080cf303c54Tim Peters
843152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef findtestdir():
844152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if __name__ == '__main__':
84541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = sys.argv[0]
846152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
84741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = __file__
848152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    testdir = os.path.dirname(file) or os.curdir
849152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return testdir
850152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
851c5000dfc4098f8547461e790a91536a923124261Tim Petersdef removepy(name):
852c5000dfc4098f8547461e790a91536a923124261Tim Peters    if name.endswith(os.extsep + "py"):
853c5000dfc4098f8547461e790a91536a923124261Tim Peters        name = name[:-3]
854c5000dfc4098f8547461e790a91536a923124261Tim Peters    return name
855c5000dfc4098f8547461e790a91536a923124261Tim Peters
856152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef count(n, word):
857152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if n == 1:
85841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %s" % (n, word)
859152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
86041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %ss" % (n, word)
861152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
862a45da92484ceececf1cf32b4dfb16004945b001eTim Petersdef printlist(x, width=70, indent=4):
8637c7efe90737d4636633127a95a6cab1a55d57cf4Tim Peters    """Print the elements of iterable x to stdout.
864a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
865a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg width (default 70) is the maximum line length.
866a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg indent (default 4) is the number of blanks with which to
867a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    begin each line.
868a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """
869a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
870ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    from textwrap import fill
871ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    blanks = ' ' * indent
872ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    print fill(' '.join(map(str, x)), width,
873ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters               initial_indent=blanks, subsequent_indent=blanks)
874a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
875de14a30d1d70073d36f207fe432e4adad5178399Tim Peters# Map sys.platform to a string containing the basenames of tests
876de14a30d1d70073d36f207fe432e4adad5178399Tim Peters# expected to be skipped on that platform.
8772a182dbf3f2520ad753792068391775d102b13dfTim Peters#
8782a182dbf3f2520ad753792068391775d102b13dfTim Peters# Special cases:
8792a182dbf3f2520ad753792068391775d102b13dfTim Peters#     test_pep277
8802a182dbf3f2520ad753792068391775d102b13dfTim Peters#         The _ExpectedSkips constructor adds this to the set of expected
8812a182dbf3f2520ad753792068391775d102b13dfTim Peters#         skips if not os.path.supports_unicode_filenames.
88255b61d21d8e8409fbb6ca23421f8a3a5c23f5513Neal Norwitz#     test_timeout
88355b61d21d8e8409fbb6ca23421f8a3a5c23f5513Neal Norwitz#         Controlled by test_timeout.skip_expected.  Requires the network
88455b61d21d8e8409fbb6ca23421f8a3a5c23f5513Neal Norwitz#         resource and a socket module.
885b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl#
886b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl# Tests that are expected to be skipped everywhere except on one platform
887b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl# are also handled separately.
888de14a30d1d70073d36f207fe432e4adad5178399Tim Peters
889f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum_expectations = {
890f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'win32':
891f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
892c7c516aa5140d255f18ffd2e8569434f0904f5dbTim Peters        test__locale
893823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
89478e35f931128d017d5955841eac8c397ff32595cTim Peters        test_bsddb3
895f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_commands
896f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_crypt
897d703057752d52cef6082a920879a0b62cdeffacaTim Peters        test_curses
898f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dbm
899f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
900f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fcntl
901f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fork1
9020e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
903f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gdbm
904f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_grp
905fd8e6e599051de07cdb8e9abc9dbadf37c5fca0cTim Peters        test_ioctl
906f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
9070e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
908f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_mhlib
909f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_openpty
910efc4b121694888e00072f5a079de5496afecb05aTim Peters        test_ossaudiodev
91127d9ee32abac7a580b1ffc980522535bdd20f09bGeorg Brandl        test_pipes
912f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_poll
913003eb3088283927e3155f2e2317d3d516edd9645Tim Peters        test_posix
914f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pty
915f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pwd
9161e33ffa5c719ec611e182681c4a5f2ceb62a08f5Tim Peters        test_resource
917f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_signal
918cea2cc4a21e7e2ba84f6dc11682821e502bd1f5fTim Peters        test_threadsignals
919f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_timing
920b84de02f75c906fbcf519b4c89b9dbdd18837276Tim Peters        test_wait3
921b84de02f75c906fbcf519b4c89b9dbdd18837276Tim Peters        test_wait4
922f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
923f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'linux2':
924f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
925823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
926f66dacdb017c7481c3ba4f0743d5446146de33c8Guido van Rossum        test_curses
927f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
928f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
9290e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
9304507ec70cff35468f4b1767382f38ecebd4a29a2Guido van Rossum        test_ossaudiodev
931f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
93249a806edbb298f2a5be3598bd80c21392cb6968dJack Jansen   'mac':
933aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """
934679751455798fab6425fda749a19e783e58b210eJack Jansen        test_atexit
935aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_bsddb
936823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
937679751455798fab6425fda749a19e783e58b210eJack Jansen        test_bsddb3
938679751455798fab6425fda749a19e783e58b210eJack Jansen        test_bz2
939aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_commands
940aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_crypt
941b3be216b41a4755556a887baa6ab440279fbe1dcJack Jansen        test_curses
942aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dbm
943aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dl
944aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fcntl
945aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fork1
9460e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
947aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_grp
948c4d6bdd58a58b365556abfe60c9f5b5f73c555f8Jack Jansen        test_ioctl
949aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_largefile
950aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_locale
9510e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
952aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_mmap
953aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_openpty
954679751455798fab6425fda749a19e783e58b210eJack Jansen        test_ossaudiodev
955aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_poll
956679751455798fab6425fda749a19e783e58b210eJack Jansen        test_popen
957aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_popen2
9585bb97e66dcbb110877ac17209c7d2641db6f6006Jack Jansen        test_posix
959aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pty
960aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pwd
961679751455798fab6425fda749a19e783e58b210eJack Jansen        test_resource
962aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_signal
963aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sundry
964c4d6bdd58a58b365556abfe60c9f5b5f73c555f8Jack Jansen        test_tarfile
965aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_timing
966aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """,
96721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis    'unixware7':
9680ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """
9690ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_bsddb
970823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
9710ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_dl
9720e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
9730ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_largefile
9740e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
9750ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_minidom
9760ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_openpty
9770ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_pyexpat
9780ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sax
9790ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sundry
9800ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """,
98121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis    'openunix8':
98221ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        """
98321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_bsddb
984823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
98521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_dl
9860e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
98721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_largefile
9880e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
98921ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_minidom
99021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_openpty
99121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_pyexpat
99221ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sax
99321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sundry
99421ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        """,
99521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis    'sco_sv3':
99621ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        """
99721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_asynchat
99821ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_bsddb
999823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
100021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_dl
100121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_fork1
10020e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
100321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_gettext
100421ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_largefile
100521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_locale
10060e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
100721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_minidom
100821ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_openpty
100921ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_pyexpat
101021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_queue
101121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sax
101221ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sundry
101321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_thread
101421ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_threaded_import
101521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_threadedtempfile
101621ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_threading
101721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        """,
1018e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum    'riscos':
1019e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        """
1020e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_asynchat
1021a94568a7535de60f1144e4eea0d027b87017a4b4Martin v. Löwis        test_atexit
1022e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_bsddb
1023823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
1024a94568a7535de60f1144e4eea0d027b87017a4b4Martin v. Löwis        test_bsddb3
1025e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_commands
1026e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_crypt
1027e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_dbm
1028e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_dl
1029e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_fcntl
1030e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_fork1
10310e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
1032e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_gdbm
1033e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_grp
1034e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_largefile
1035e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_locale
10360e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
1037e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_mmap
1038e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_openpty
1039e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_poll
1040e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_popen2
1041e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_pty
1042e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_pwd
1043e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_strop
1044e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_sundry
1045e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_thread
1046e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threaded_import
1047e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threadedtempfile
1048e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threading
1049e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_timing
1050e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        """,
10518a97f4a380a7a356730e48406f8269c3efe5e6ebJack Jansen    'darwin':
1052398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        """
10532bfb94c871caeae622174485264f407d9df354b9Brett Cannon        test__locale
1054acda3394bbfb1db3b22673a80cb2d7e3c68b3da9Jack Jansen        test_bsddb
10559d4270070a5d0c3bcd381d52024d811f3b0a0e39Guido van Rossum        test_bsddb3
1056398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_curses
10570e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
1058398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_gdbm
1059398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_largefile
1060acda3394bbfb1db3b22673a80cb2d7e3c68b3da9Jack Jansen        test_locale
10610e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
1062398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_minidom
1063acda3394bbfb1db3b22673a80cb2d7e3c68b3da9Jack Jansen        test_ossaudiodev
1064398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_poll
1065398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        """,
106611c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum    'sunos5':
106711c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        """
106811c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_bsddb
1069823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
107011c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_curses
107111c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_dbm
10720e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
10730e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
107411c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_gdbm
107511c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_gzip
107611c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_openpty
107711c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_zipfile
107811c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_zlib
1079ed375e18d10d37bfea1769aa1fe69795df6cbc10Jeremy Hylton        """,
1080b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro    'hp-ux11':
1081b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        """
1082b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_bsddb
1083823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
1084b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_curses
1085b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_dl
10860e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
1087b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gdbm
1088b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gzip
1089b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_largefile
1090b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_locale
10910e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
1092b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_minidom
1093b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_openpty
1094b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_pyexpat
1095b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_sax
1096b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_zipfile
1097b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_zlib
1098b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        """,
1099f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis    'atheos':
1100c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        """
1101823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
1102c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_curses
1103c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_dl
1104c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_gdbm
11050e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
1106c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_largefile
1107c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_locale
11080e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
1109c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_mhlib
1110c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_mmap
1111c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_poll
1112c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_popen2
1113c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_resource
1114c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        """,
111525115940604e6051aa2fb16be88c6b8f64577251Jason Tishler    'cygwin':
111625115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        """
1117823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
1118b0f89e05ad9aaf229033bbc81be43c1f826e3930Tim Peters        test_bsddb3
111925115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_curses
112025115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_dbm
11210e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
1122c23f39ca9dc540ace879fcf9746254d94293b86fJason Tishler        test_ioctl
11230e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
112425115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_largefile
112525115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_locale
11265c4ded2c3b59aa134b82ab17cdfe7ab633194ca6Jason Tishler        test_ossaudiodev
112725115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_socketserver
112825115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        """,
1129fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre    'os2emx':
1130fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        """
1131fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_audioop
1132823ba28b0d436f83ebfc5b9df0d475e60e8ae5eeSkip Montanaro        test_bsddb185
1133fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_bsddb3
1134fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_commands
1135fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_curses
1136fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_dl
11370e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
11380e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
1139fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_largefile
1140fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_mhlib
1141fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_mmap
1142fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_openpty
1143fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_ossaudiodev
1144fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_pty
1145fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_resource
1146fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_signal
1147fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        """,
1148944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum    'freebsd4':
1149944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        """
1150944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        test_bsddb
1151944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        test_bsddb3
11520e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
1153f64700a512e89c322f46f3cabda3bf58573eda54Hye-Shik Chang        test_gdbm
1154944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        test_locale
1155944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        test_ossaudiodev
1156944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        test_pep277
1157f64700a512e89c322f46f3cabda3bf58573eda54Hye-Shik Chang        test_pty
1158944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        test_socketserver
1159f64700a512e89c322f46f3cabda3bf58573eda54Hye-Shik Chang        test_tcl
1160bbb7efd72b3360f0523087cff6868f8fa02fe754Guilherme Polo        test_tk
11617a77ee88af00b853aae328dbb3c87d91a1313052Guilherme Polo        test_ttk_guionly
11627a77ee88af00b853aae328dbb3c87d91a1313052Guilherme Polo        test_ttk_textonly
1163944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        test_timeout
1164944a6c32d7f78445e3516636d9fcf1c62e1663ffGuido van Rossum        test_urllibnet
116537040cdace1982772e5f35e4acfa13861d72065dJesse Noller        test_multiprocessing
116656f88113b7272be8403f9b722c943e679e23d362Martin v. Löwis        """,
11678ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum    'aix5':
11688ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        """
11698ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_bsddb
11708ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_bsddb185
11718ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_bsddb3
11728ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_bz2
11738ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_dl
11740e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
11758ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_gdbm
11768ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_gzip
11770e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_kqueue
11788ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_ossaudiodev
11798ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_tcl
1180bbb7efd72b3360f0523087cff6868f8fa02fe754Guilherme Polo        test_tk
11817a77ee88af00b853aae328dbb3c87d91a1313052Guilherme Polo        test_ttk_guionly
11827a77ee88af00b853aae328dbb3c87d91a1313052Guilherme Polo        test_ttk_textonly
11838ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_zipimport
11848ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        test_zlib
11858ee3e5aa9306a00573817e237bed4a482473e818Guido van Rossum        """,
11866da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis    'openbsd3':
11876da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        """
11886da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_bsddb
11896da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_bsddb3
11906da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_ctypes
11916da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_dl
11920e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
11936da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_gdbm
11946da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_locale
11956da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_normalization
11966da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_ossaudiodev
11976da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_pep277
11986da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        test_tcl
1199bbb7efd72b3360f0523087cff6868f8fa02fe754Guilherme Polo        test_tk
12007a77ee88af00b853aae328dbb3c87d91a1313052Guilherme Polo        test_ttk_guionly
12017a77ee88af00b853aae328dbb3c87d91a1313052Guilherme Polo        test_ttk_textonly
120237040cdace1982772e5f35e4acfa13861d72065dJesse Noller        test_multiprocessing
12036da56f9428896f635a794ad523bd88190758e6abMartin v. Löwis        """,
12040870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl    'netbsd3':
12050870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        """
12060870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_bsddb
12070870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_bsddb185
12080870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_bsddb3
12090870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_ctypes
12100870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_curses
12110870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_dl
12120e9ab5f2f0f907b57c70557e21633ce8c341d1d1Christian Heimes        test_epoll
12130870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_gdbm
12140870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_locale
12150870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_ossaudiodev
12160870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_pep277
12170870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        test_tcl
1218bbb7efd72b3360f0523087cff6868f8fa02fe754Guilherme Polo        test_tk
12197a77ee88af00b853aae328dbb3c87d91a1313052Guilherme Polo        test_ttk_guionly
12207a77ee88af00b853aae328dbb3c87d91a1313052Guilherme Polo        test_ttk_textonly
122137040cdace1982772e5f35e4acfa13861d72065dJesse Noller        test_multiprocessing
12220870687f449140ad2620af5b6f5f44896e8c1cd5Georg Brandl        """,
1223f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum}
122432d0c1b458bbdda8d8895f5b5bedfb4644f839e7Martin v. Löwis_expectations['freebsd5'] = _expectations['freebsd4']
1225f64700a512e89c322f46f3cabda3bf58573eda54Hye-Shik Chang_expectations['freebsd6'] = _expectations['freebsd4']
12264e422817eb1bc5a6a42365001ad45683ae07e559Hye-Shik Chang_expectations['freebsd7'] = _expectations['freebsd4']
1227ea684743daa0c198ab327d07832eca48a9578c68Hye-Shik Chang_expectations['freebsd8'] = _expectations['freebsd4']
1228f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum
1229b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _ExpectedSkips:
1230b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self):
12312a182dbf3f2520ad753792068391775d102b13dfTim Peters        import os.path
123255b61d21d8e8409fbb6ca23421f8a3a5c23f5513Neal Norwitz        from test import test_timeout
12331b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters
12347c7efe90737d4636633127a95a6cab1a55d57cf4Tim Peters        self.valid = False
1235de14a30d1d70073d36f207fe432e4adad5178399Tim Peters        if sys.platform in _expectations:
1236f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            s = _expectations[sys.platform]
1237a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.expected = set(s.split())
12381b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters
1239b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl            # expected to be skipped on every platform, even Linux
1240b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl            self.expected.add('test_linuxaudiodev')
1241b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl
12422a182dbf3f2520ad753792068391775d102b13dfTim Peters            if not os.path.supports_unicode_filenames:
12432a182dbf3f2520ad753792068391775d102b13dfTim Peters                self.expected.add('test_pep277')
12441b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters
124555b61d21d8e8409fbb6ca23421f8a3a5c23f5513Neal Norwitz            if test_timeout.skip_expected:
124655b61d21d8e8409fbb6ca23421f8a3a5c23f5513Neal Norwitz                self.expected.add('test_timeout')
124755b61d21d8e8409fbb6ca23421f8a3a5c23f5513Neal Norwitz
1248fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis            if sys.maxint == 9223372036854775807L:
1249fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis                self.expected.add('test_imageop')
1250fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis
12516afc5e02fa775517fa0b6455906a8c203baf9cd2Jack Jansen            if not sys.platform in ("mac", "darwin"):
12528f40f0635b9d233cf731c442c2ee21101c0f768cAmaury Forgeot d'Arc                MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
1253b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                            "test_plistlib", "test_scriptpackages",
1254b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                            "test_applesingle"]
12557035c98c5c0eec7f88fab146e72b2a7e4aaf64a5Neal Norwitz                for skip in MAC_ONLY:
12567035c98c5c0eec7f88fab146e72b2a7e4aaf64a5Neal Norwitz                    self.expected.add(skip)
12576f5a2b52ae769ba1833aef8a52b6ab89921ee8c6Benjamin Peterson            elif len(u'\0'.encode('unicode-internal')) == 4:
12586f5a2b52ae769ba1833aef8a52b6ab89921ee8c6Benjamin Peterson                self.expected.add("test_macostools")
12596f5a2b52ae769ba1833aef8a52b6ab89921ee8c6Benjamin Peterson
1260ecd79eb7dbde19ea2adbf2a912caa5b284b477b9Tim Peters
1261ecd79eb7dbde19ea2adbf2a912caa5b284b477b9Tim Peters            if sys.platform != "win32":
1262b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                # test_sqlite is only reliable on Windows where the library
1263b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                # is distributed with Python
12647035c98c5c0eec7f88fab146e72b2a7e4aaf64a5Neal Norwitz                WIN_ONLY = ["test_unicode_file", "test_winreg",
1265b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                            "test_winsound", "test_startfile",
1266b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                            "test_sqlite"]
12677035c98c5c0eec7f88fab146e72b2a7e4aaf64a5Neal Norwitz                for skip in WIN_ONLY:
12687035c98c5c0eec7f88fab146e72b2a7e4aaf64a5Neal Norwitz                    self.expected.add(skip)
1269f2715e076435b74638acb81512c2ee014f75aea2Tim Peters
1270dc48b74497b67a449dd622fdaa7d69e7bff65a5eBrett Cannon            if sys.platform != 'irix':
1271b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1272b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                             "test_gl", "test_imgfile"]
1273dc48b74497b67a449dd622fdaa7d69e7bff65a5eBrett Cannon                for skip in IRIX_ONLY:
1274dc48b74497b67a449dd622fdaa7d69e7bff65a5eBrett Cannon                    self.expected.add(skip)
1275dc48b74497b67a449dd622fdaa7d69e7bff65a5eBrett Cannon
1276b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl            if sys.platform != 'sunos5':
1277b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                self.expected.add('test_sunaudiodev')
1278b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl                self.expected.add('test_nis')
1279b2e208f9010e4b1abbbd560d3d4a8f66fa5861d6Georg Brandl
1280d290b04ee3645f8dd2e30c329c5ead2db16ece62Steven Bethard            if not sys.py3kwarning:
1281d290b04ee3645f8dd2e30c329c5ead2db16ece62Steven Bethard                self.expected.add('test_py3kwarn')
1282e8e22cf3c0d9e977bc9f13cfc535c026f92bc7aaSteven Bethard
12837c7efe90737d4636633127a95a6cab1a55d57cf4Tim Peters            self.valid = True
1284b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
1285b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def isvalid(self):
1286b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return true iff _ExpectedSkips knows about the current platform."
1287b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.valid
1288b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
1289b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def getexpected(self):
1290b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """Return set of test names we expect to skip on current platform.
1291b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
1292b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.isvalid() must be true.
1293b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """
1294b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
1295b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        assert self.isvalid()
1296b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.expected
1297b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
1298152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumif __name__ == '__main__':
1299408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # Remove regrtest.py's own directory from the module search path.  This
1300408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # prevents relative imports from working, and relative imports will screw
1301408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # up the testing framework.  E.g. if both test.test_support and
1302408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # test_support are imported, they will not contain the same globals, and
1303408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # much of the testing framework relies on the globals in the
1304408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # test.test_support module.
1305408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
1306408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    i = pathlen = len(sys.path)
1307408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    while i >= 0:
1308408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        i -= 1
1309408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
1310408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            del sys.path[i]
13114698d9928ef1547e86a3f692e0c8d77e3f5e869cAntoine Pitrou    if '--slaveargs' not in sys.argv and len(sys.path) == pathlen:
1312408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        print 'Could not find %r in sys.path to remove it' % mydir
131308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    main()
1314