regrtest.py revision 408b6d34de2b1a6ba690557def435adce9314184
1152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum#! /usr/bin/env python
2152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
3152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum"""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
11a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-v: verbose   -- run tests in verbose mode with output to stdout
12a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-q: quiet     -- don't print anything except if a test fails
13a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-g: generate  -- write the output file for a test instead of comparing it
14a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-x: exclude   -- arguments are tests to *exclude*
15a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-s: single    -- run only a single test (see below)
16a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw-r: random    -- randomize test execution order
17c5000dfc4098f8547461e790a91536a923124261Tim Peters-f: fromfile  -- read names of tests to run from a file (see below)
188a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer-l: findleaks -- if GC is available detect tests that leak memory
1908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw-u: use       -- specify which special resource intensive tests to run
2008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw-h: help      -- print this text and exit
219e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum-t: threshold -- call gc.set_threshold(N)
22152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
23152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumIf non-option arguments are present, they are names for tests to run,
24152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumunless -x is given, in which case they are names for tests not to run.
25152494aea24669a3d74460fa460a4ed45696bc75Guido van RossumIf no test names are given, all tests are run.
26f58ed2596706b97c16174a839c1ed6f6b1f87fa6Guido van Rossum
27a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum-v is incompatible with -g and does not compare test output files.
28e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
299e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum-s means to run only a single test and exit.  This is useful when
309e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumdoing memory analysis on the Python interpreter (which tend to consume
319e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumtoo many resources to run the full regression test non-stop).  The
329e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumfile /tmp/pynexttest is read to find the next test to run.  If this
339e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumfile is missing, the first test_*.py file in testdir or on the command
349e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumline is used.  (actually tempfile.gettempdir() is used instead of
359e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum/tmp).
36e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
379e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum-f reads the names of tests from the file given as f's argument, one
389e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumor more test names per line.  Whitespace is ignored.  Blank lines and
399e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumlines beginning with '#' are ignored.  This is especially useful for
409e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumwhittling down failures involving interactions among tests.
41c5000dfc4098f8547461e790a91536a923124261Tim Peters
429e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum-u is used to specify which special resource intensive tests to run,
439e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumsuch as those requiring large file support or network connectivity.
449e9d4f8ed8d467d0558251f43c5decc754712d53Guido van RossumThe argument is a comma-separated list of words indicating the
459e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossumresources to test.  Currently only the following are defined:
4608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
473a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake    all -       Enable all special resources.
483a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
492158df0b4d8358b5efdcac3024e8cc6d6c92d981Andrew M. Kuchling    curses -    Tests that use curses and will modify the terminal's
502158df0b4d8358b5efdcac3024e8cc6d6c92d981Andrew M. Kuchling                state and output modes.
511633a2e3452b40d0e9bb1f15ab16cd6b90f15a19Tim Peters
529e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    largefile - It is okay to run some test that may create huge
539e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                files.  These tests can take a long time and may
549e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                consume >2GB of disk space temporarily.
5508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
569e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    network -   It is okay to run tests that use external network
579e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                resource, e.g. testing SSL support for sockets.
58152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum"""
59152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
60152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport sys
61152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport os
62152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport getopt
639e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossumimport traceback
64ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaroimport random
65ae1bb176bea47b2123bba208733edb42692e9431Fred Drakeimport StringIO
66152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
6704f357cffef6d764f2f0ff2671dabde75ec250d1Barry Warsawfrom test import test_support
683a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
693a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred DrakeRESOURCE_NAMES = ('curses', 'largefile', 'network')
703a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
713a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
7208fca5212528e073600c27c70a34eeef445f393bBarry Warsawdef usage(code, msg=''):
7308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    print __doc__
7408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if msg: print msg
7508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(code)
7608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
7708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
78ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanarodef main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
79c5000dfc4098f8547461e790a91536a923124261Tim Peters         exclude=0, single=0, randomize=0, fromfile=None, findleaks=0,
8008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw         use_resources=None):
816fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Execute a test suite.
826fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
837e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters    This also parses command-line options and modifies its behavior
84004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    accordingly.
856fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
866fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    tests -- a list of strings containing test names (optional)
876fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- the directory in which to look for tests (optional)
886fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
896fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    Users other than the Python test suite will certainly want to
906fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    specify testdir; if it's omitted, the directory containing the
91004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    Python test suite is searched for.
926fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
936fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    If the tests argument is omitted, the tests listed on the
946fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    command-line will be used.  If that's empty, too, then all *.py
956fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    files beginning with test_ will be used.
96ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro
979e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    The other default arguments (verbose, quiet, generate, exclude,
989e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    single, randomize, findleaks, and use_resources) allow programmers
999e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    calling main() directly to set the values that would normally be
1009e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    set by flags on the command line.
101a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
1026fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
103004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
1048dee809410e2d433bb0be5d8a1699736b90db0b5Tim Peters    test_support.record_original_stdout(sys.stdout)
105152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
1069e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum        opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:',
10708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                   ['help', 'verbose', 'quiet', 'generate',
108c5000dfc4098f8547461e790a91536a923124261Tim Peters                                    'exclude', 'single', 'random', 'fromfile',
1099e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                                    'findleaks', 'use=', 'threshold='])
110152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except getopt.error, msg:
11108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, msg)
11208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
11308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    # Defaults
11408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if use_resources is None:
11508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        use_resources = []
116152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for o, a in opts:
11708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        if o in ('-h', '--help'):
11808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            usage(0)
11908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-v', '--verbose'):
12008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose += 1
12108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-q', '--quiet'):
12208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            quiet = 1;
12308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose = 0
12408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-g', '--generate'):
12508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            generate = 1
12608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-x', '--exclude'):
12708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            exclude = 1
12808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-s', '--single'):
12908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            single = 1
13008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-r', '--randomize'):
13108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            randomize = 1
132c5000dfc4098f8547461e790a91536a923124261Tim Peters        elif o in ('-f', '--fromfile'):
133c5000dfc4098f8547461e790a91536a923124261Tim Peters            fromfile = a
13408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-l', '--findleaks'):
13508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            findleaks = 1
1369e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum        elif o in ('-t', '--threshold'):
1379e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum            import gc
1389e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum            gc.set_threshold(int(a))
13908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-u', '--use'):
140fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            u = [x.lower() for x in a.split(',')]
141fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            for r in u:
1423a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                if r == 'all':
1433a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                    use_resources = RESOURCE_NAMES
1443a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                    break
1453a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                if r not in RESOURCE_NAMES:
1463a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                    usage(1, 'Invalid -u/--use option: ' + a)
14704a8da5cdb185322ca519db1e731ba10d7646970Fred Drake                if r not in use_resources:
148e41abab33b0b467acd6bdc7d73ce4b5cef4fd5bfAndrew MacIntyre                    use_resources.append(r)
149a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum    if generate and verbose:
15008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, "-g and -v don't go together!")
151c5000dfc4098f8547461e790a91536a923124261Tim Peters    if single and fromfile:
152c5000dfc4098f8547461e790a91536a923124261Tim Peters        usage(2, "-s and -f don't go together!")
15308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
154152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    good = []
155152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    bad = []
156152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    skipped = []
157e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
158d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer    if findleaks:
159a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        try:
160a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw            import gc
161a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        except ImportError:
1628a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            print 'No GC available, disabling findleaks.'
163d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            findleaks = 0
164a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        else:
1658a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # Uncomment the line below to report garbage that is not
1668a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # freeable by reference counting alone.  By default only
1678a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # garbage that is not collectable by the GC is reported.
1688a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            #gc.set_debug(gc.DEBUG_SAVEALL)
169d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            found_garbage = []
170a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
171e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
172e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        from tempfile import gettempdir
173e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        filename = os.path.join(gettempdir(), 'pynexttest')
174e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        try:
175e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp = open(filename, 'r')
176fc170b1fd5db978f4e8d4c23c138a7b59df681ecEric S. Raymond            next = fp.read().strip()
177e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            tests = [next]
178e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp.close()
179e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        except IOError:
180e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            pass
181c5000dfc4098f8547461e790a91536a923124261Tim Peters
182c5000dfc4098f8547461e790a91536a923124261Tim Peters    if fromfile:
183c5000dfc4098f8547461e790a91536a923124261Tim Peters        tests = []
184c5000dfc4098f8547461e790a91536a923124261Tim Peters        fp = open(fromfile)
185c5000dfc4098f8547461e790a91536a923124261Tim Peters        for line in fp:
186c5000dfc4098f8547461e790a91536a923124261Tim Peters            guts = line.split() # assuming no test has whitespace in its name
187c5000dfc4098f8547461e790a91536a923124261Tim Peters            if guts and not guts[0].startswith('#'):
188c5000dfc4098f8547461e790a91536a923124261Tim Peters                tests.extend(guts)
189c5000dfc4098f8547461e790a91536a923124261Tim Peters        fp.close()
190c5000dfc4098f8547461e790a91536a923124261Tim Peters
191c5000dfc4098f8547461e790a91536a923124261Tim Peters    # Strip .py extensions.
192c5000dfc4098f8547461e790a91536a923124261Tim Peters    if args:
193c5000dfc4098f8547461e790a91536a923124261Tim Peters        args = map(removepy, args)
194c5000dfc4098f8547461e790a91536a923124261Tim Peters    if tests:
195c5000dfc4098f8547461e790a91536a923124261Tim Peters        tests = map(removepy, tests)
196c5000dfc4098f8547461e790a91536a923124261Tim Peters
1976c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    stdtests = STDTESTS[:]
1986c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    nottests = NOTTESTS[:]
199152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if exclude:
2006c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        for arg in args:
2016c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum            if arg in stdtests:
2026c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum                stdtests.remove(arg)
2036c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        nottests[:0] = args
20441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        args = []
205747e1cade657e1e15c0f51d898de901da723e6a2Guido van Rossum    tests = tests or args or findtests(testdir, stdtests, nottests)
206e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
207e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        tests = tests[:1]
208ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro    if randomize:
209ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro        random.shuffle(tests)
21041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum    test_support.verbose = verbose      # Tell tests to be moderately quiet
21108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    test_support.use_resources = use_resources
2125796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum    save_modules = sys.modules.keys()
213152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for test in tests:
21441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not quiet:
21541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print test
216f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        ok = runtest(test, generate, verbose, quiet, testdir)
21741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if ok > 0:
21841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            good.append(test)
21941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        elif ok == 0:
22041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            bad.append(test)
22141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        else:
22241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            skipped.append(test)
223d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer        if findleaks:
224d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            gc.collect()
225d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            if gc.garbage:
2268a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "Warning: test created", len(gc.garbage),
2278a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "uncollectable object(s)."
2288a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # move the uncollectable objects somewhere so we don't see
2298a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # them again
230d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                found_garbage.extend(gc.garbage)
231d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                del gc.garbage[:]
2325796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        # Unload the newly imported modules (best effort finalization)
2335796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        for module in sys.modules.keys():
23451931144427faa001a6db3cfc37380526be256b6Guido van Rossum            if module not in save_modules and module.startswith("test."):
2355796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum                test_support.unload(module)
2367a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton
2377a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    # The lists won't be sorted if running with -r
2387a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    good.sort()
2397a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    bad.sort()
2407a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    skipped.sort()
241e0c446bb4ad67294f42d4cb53b4ff28413bd8ddeTim Peters
242152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if good and not quiet:
24341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not bad and not skipped and len(good) > 1:
24441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print "All",
24541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print count(len(good), "test"), "OK."
2461a4d77b2527ced1052b4faae3d176b125a764325Tim Peters        if verbose:
247408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            print "CAUTION:  stdout isn't compared in verbose mode:"
248408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            print "a test that passes in verbose mode may fail without it."
249152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if bad:
250a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(bad), "test"), "failed:"
251a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(bad)
252152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if skipped and not quiet:
253a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(skipped), "test"), "skipped:"
254a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(skipped)
255e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
256b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        e = _ExpectedSkips()
257a2be2d624a47e420266606f0cb2a2e030797f650Tim Peters        plat = sys.platform
258b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if e.isvalid():
259b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            surprise = _Set(skipped) - e.getexpected()
260b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if surprise:
261b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print count(len(surprise), "skip"), \
262a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                      "unexpected on", plat + ":"
263a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                printlist(surprise)
264b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            else:
265b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print "Those skips are all expected on", plat + "."
266b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        else:
267b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "Ask someone to teach regrtest.py about which tests are"
268b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "expected to get skipped on", plat + "."
269b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
270e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
271e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        alltests = findtests(testdir, stdtests, nottests)
272e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        for i in range(len(alltests)):
273e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            if tests[0] == alltests[i]:
274e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                if i == len(alltests) - 1:
275e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    os.unlink(filename)
276e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                else:
277e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp = open(filename, 'w')
278e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.write(alltests[i+1] + '\n')
279e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.close()
280e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                break
281e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        else:
282e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            os.unlink(filename)
283e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
28408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(len(bad) > 0)
28508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
286152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2876fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumSTDTESTS = [
288152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_grammar',
289152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_opcodes',
290152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_operations',
291152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_builtin',
292152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_exceptions',
293152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_types',
294152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum   ]
295152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2966fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumNOTTESTS = [
297152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_support',
298152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_b1',
299152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_b2',
30062e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future1',
30162e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future2',
3028471a35febdbfbfab51b9d4b5fe51694fe6ca536Jeremy Hylton    'test_future3',
303152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    ]
304152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
3056fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossumdef findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
306152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    """Return a list of all applicable test modules."""
3076fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
308152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    names = os.listdir(testdir)
309152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests = []
310152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for name in names:
311e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        if name[:5] == "test_" and name[-3:] == os.extsep+"py":
31241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            modname = name[:-3]
31341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if modname not in stdtests and modname not in nottests:
31441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                tests.append(modname)
315152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests.sort()
316152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return stdtests + tests
317152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
318f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mickdef runtest(test, generate, verbose, quiet, testdir = None):
3196fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Run a single test.
3206fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    test -- the name of the test
3216fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    generate -- if true, generate output, instead of running the test
3226fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    and comparing it to a previously created output file
3236fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    verbose -- if true, print more messages
324f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick    quiet -- if true, don't print 'skipped' messages (probably redundant)
3256fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- test directory
3266fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
327152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    test_support.unload(test)
3286fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
329152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputdir = os.path.join(testdir, "output")
330152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputfile = os.path.join(outputdir, test)
3319390cc15da5cd6920bd41bb4cd146d5d0601345fTim Peters    if verbose:
33241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        cfp = None
3330fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    else:
33488a56857f65d98e9d2b670eab6e048bda519340aFred Drake        cfp = StringIO.StringIO()
335152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
336342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters        save_stdout = sys.stdout
33741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        try:
33841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if cfp:
33941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                sys.stdout = cfp
34041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                print test              # Output file starts with test name
341408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            if test.startswith('test.'):
342408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                abstest = test
343408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            else:
344408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                # Always import it from the test package
345408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                abstest = 'test.' + test
346408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            the_package = __import__(abstest, globals(), locals(), [])
347408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            the_module = getattr(the_package, test)
348d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # Most tests run to completion simply as a side-effect of
349d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # being imported.  For the benefit of tests that can't run
350d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # that way (like test_threaded_import), explicitly invoke
351d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # their test_main() function (if it exists).
352d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            indirect_test = getattr(the_module, "test_main", None)
353d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            if indirect_test is not None:
354d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters                indirect_test()
35541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        finally:
356342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters            sys.stdout = save_stdout
3573af826ebca80f8a6c782fb590c77ac210ae9e22dThomas Wouters    except (ImportError, test_support.TestSkipped), msg:
358f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        if not quiet:
359eb9490526508dc643c2329771f95a925e5412049Guido van Rossum            print "test", test, "skipped --", msg
36041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return -1
361fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake    except KeyboardInterrupt:
362fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake        raise
363152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except test_support.TestFailed, msg:
36441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print "test", test, "failed --", msg
36541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
3669e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossum    except:
36741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        type, value = sys.exc_info()[:2]
36827c4b39025eb9e20f9d7a36b6aa0bb9c97f9bba5Fred Drake        print "test", test, "crashed --", str(type) + ":", value
36941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if verbose:
37041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            traceback.print_exc(file=sys.stdout)
37141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
372152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
3730fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if not cfp:
3740fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3750fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        output = cfp.getvalue()
376e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake        if generate:
377e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake            if output == test + "\n":
378e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                if os.path.exists(outputfile):
379e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # Write it since it already exists (and the contents
380e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # may have changed), but let the user know it isn't
381e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # needed:
382e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    print "output file", outputfile, \
383e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                          "is no longer needed; consider removing it"
3840fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                else:
3850fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                    # We don't need it, so don't create it.
3860fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                    return 1
3870fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp = open(outputfile, "w")
3880fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.write(output)
3890fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.close()
3900fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3910fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if os.path.exists(outputfile):
3920fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp = open(outputfile, "r")
3930fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            expected = fp.read()
3940fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.close()
3950fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        else:
3960fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            expected = test + "\n"
3970fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if output == expected:
3980fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3990fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        print "test", test, "produced unexpected output:"
4000fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        reportdiff(expected, output)
4010fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        return 0
4020fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum
4030fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossumdef reportdiff(expected, output):
4040fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    import difflib
405c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    print "*" * 70
406c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    a = expected.splitlines(1)
407c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    b = output.splitlines(1)
408cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    sm = difflib.SequenceMatcher(a=a, b=b)
409cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    tuples = sm.get_opcodes()
410c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
411cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    def pair(x0, x1):
412c377b16d12ba325bb108eca575447d66f19294c0Tim Peters        # x0:x1 are 0-based slice indices; convert to 1-based line indices.
413cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        x0 += 1
414cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        if x0 >= x1:
415c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            return "line " + str(x0)
416cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        else:
417c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            return "lines %d-%d" % (x0, x1)
418c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
419cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    for op, a0, a1, b0, b1 in tuples:
420cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        if op == 'equal':
421cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            pass
422c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
423cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'delete':
424c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "***", pair(a0, a1), "of expected output missing:"
425cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            for line in a[a0:a1]:
426c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print "-", line,
427c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
428cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'replace':
429c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "*** mismatch between", pair(a0, a1), "of expected", \
430c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                  "output and", pair(b0, b1), "of actual output:"
431c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            for line in difflib.ndiff(a[a0:a1], b[b0:b1]):
432c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print line,
433c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
434cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'insert':
435c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "***", pair(b0, b1), "of actual output doesn't appear", \
436c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                  "in expected output after line", str(a1)+":"
437cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            for line in b[b0:b1]:
438c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print "+", line,
439c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
440cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        else:
441cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1)
442c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
4430fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    print "*" * 70
444152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
445152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef findtestdir():
446152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if __name__ == '__main__':
44741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = sys.argv[0]
448152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
44941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = __file__
450152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    testdir = os.path.dirname(file) or os.curdir
451152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return testdir
452152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
453c5000dfc4098f8547461e790a91536a923124261Tim Petersdef removepy(name):
454c5000dfc4098f8547461e790a91536a923124261Tim Peters    if name.endswith(os.extsep + "py"):
455c5000dfc4098f8547461e790a91536a923124261Tim Peters        name = name[:-3]
456c5000dfc4098f8547461e790a91536a923124261Tim Peters    return name
457c5000dfc4098f8547461e790a91536a923124261Tim Peters
458152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef count(n, word):
459152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if n == 1:
46041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %s" % (n, word)
461152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
46241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %ss" % (n, word)
463152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
464a45da92484ceececf1cf32b4dfb16004945b001eTim Petersdef printlist(x, width=70, indent=4):
465a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """Print the elements of a sequence to stdout.
466a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
467a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg width (default 70) is the maximum line length.
468a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg indent (default 4) is the number of blanks with which to
469a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    begin each line.
470a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """
471a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
472ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    from textwrap import fill
473ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    blanks = ' ' * indent
474ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    print fill(' '.join(map(str, x)), width,
475ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters               initial_indent=blanks, subsequent_indent=blanks)
476a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
477b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _Set:
478b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self, seq=[]):
479b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = self.data = {}
480b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        for x in seq:
481b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            data[x] = 1
482b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
483b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __len__(self):
484b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return len(self.data)
485b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
486b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __sub__(self, other):
487b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return set of all elements in self not in other."
488b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        result = _Set()
489b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = result.data = self.data.copy()
490b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        for x in other.data:
491b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if x in data:
492b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                del data[x]
493b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return result
494b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
49539f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton    def __iter__(self):
49639f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton        return iter(self.data)
49739f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton
498b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def tolist(self, sorted=1):
499b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return _Set elements as a list."
500b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = self.data.keys()
501b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if sorted:
502b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            data.sort()
503b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return data
504b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
505de14a30d1d70073d36f207fe432e4adad5178399Tim Peters# Map sys.platform to a string containing the basenames of tests
506de14a30d1d70073d36f207fe432e4adad5178399Tim Peters# expected to be skipped on that platform.
507de14a30d1d70073d36f207fe432e4adad5178399Tim Peters
508f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum_expectations = {
509f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'win32':
510f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
511f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
512f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
513f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
514f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_commands
515f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_crypt
516d703057752d52cef6082a920879a0b62cdeffacaTim Peters        test_curses
517f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dbm
518f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
519deb121aec7185f0d8034453203c6be436b2951f5Tim Peters        test_email_codecs
520f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fcntl
521f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fork1
522f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gdbm
523f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
524f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_grp
525f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
526f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
527f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_linuxaudiodev
528f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_mhlib
529de14a30d1d70073d36f207fe432e4adad5178399Tim Peters        test_mpz
530f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
531f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_openpty
532f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_poll
533f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pty
534f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pwd
5351e33ffa5c719ec611e182681c4a5f2ceb62a08f5Tim Peters        test_resource
536f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_signal
53708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        test_socket_ssl
538a86f0c17a1385c07710d894b93a1c13159c0b57fTim Peters        test_socketserver
539f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
540f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_timing
541f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
542f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'linux2':
543f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
544f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
545f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
546f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
547f66dacdb017c7481c3ba4f0743d5446146de33c8Guido van Rossum        test_curses
548f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
5496184c117e9af1cf6178fd34bd7c576ce36107df2Guido van Rossum        test_email_codecs
550f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
551f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
552f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
553f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
554f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_ntpath
55508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        test_socket_ssl
556f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_socketserver
557f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
558f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_unicode_file
559f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_winreg
560f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_winsound
561f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
56249a806edbb298f2a5be3598bd80c21392cb6968dJack Jansen   'mac':
563aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """
564aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_al
565aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_bsddb
566aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cd
567aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cl
568aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_commands
569aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_crypt
570b3be216b41a4755556a887baa6ab440279fbe1dcJack Jansen        test_curses
571aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dbm
572aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dl
573aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fcntl
574aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fork1
575aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_gl
576aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_grp
577aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_imgfile
578aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_largefile
579aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_linuxaudiodev
580aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_locale
581aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_mmap
582aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_nis
583aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_ntpath
584aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_openpty
585aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_poll
586aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_popen2
587aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pty
588aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pwd
589aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_signal
590aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socket_ssl
591aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socketserver
592aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sunaudiodev
593aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sundry
594aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_timing
595aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_unicode_file
596aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_winreg
597aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_winsound
598aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """,
5990ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis    'unixware5':
6000ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """
6010ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_al
6020ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_bsddb
6030ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cd
6040ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cl
6050ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_dl
6060ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_gl
6070ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_imgfile
6080ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_largefile
6090ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_linuxaudiodev
6100ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_minidom
6110ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_nis
6120ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_ntpath
6130ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_openpty
6140ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_pyexpat
6150ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sax
6160ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_socketserver
6170ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sunaudiodev
6180ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sundry
6190ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_unicode_file
6200ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_winreg
6210ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_winsound
6220ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """,
623e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum    'riscos':
624e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        """
625e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_al
626e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_asynchat
627e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_bsddb
628e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_cd
629e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_cl
630e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_commands
631e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_crypt
632e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_dbm
633e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_dl
634e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_fcntl
635e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_fork1
636e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_gdbm
637e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_gl
638e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_grp
639e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_imgfile
640e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_largefile
641e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_linuxaudiodev
642e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_locale
643e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_mmap
644e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_nis
645e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_ntpath
646e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_openpty
647e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_poll
648e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_popen2
649e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_pty
650e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_pwd
651e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_socket_ssl
652e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_socketserver
653e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_strop
654e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_sunaudiodev
655e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_sundry
656e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_thread
657e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threaded_import
658e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threadedtempfile
659e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threading
660e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_timing
661e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_unicode_file
662e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_winreg
663e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_winsound
664e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        """,
6658a97f4a380a7a356730e48406f8269c3efe5e6ebJack Jansen    'darwin':
666398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        """
667398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_al
668398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_cd
669398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_cl
670398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_curses
671398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_dl
672398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_gdbm
673398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_gl
674398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_imgfile
675398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_largefile
676398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_linuxaudiodev
677398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_minidom
678398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_nis
679398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_ntpath
680398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_poll
681398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_socket_ssl
682f839c27027ee0656319b7d7033d898e5b559c96bJack Jansen        test_socketserver
683398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_sunaudiodev
684f839c27027ee0656319b7d7033d898e5b559c96bJack Jansen        test_unicode_file
685398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_winreg
686398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_winsound
687398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        """,
68811c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum    'sunos5':
68911c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        """
69011c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_al
69111c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_bsddb
69211c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_cd
69311c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_cl
69411c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_curses
69511c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_dbm
69611c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_email_codecs
69711c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_gdbm
69811c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_gl
69911c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_gzip
70011c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_imgfile
70111c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_linuxaudiodev
70211c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_mpz
70311c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_openpty
70411c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_socket_ssl
70511c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_socketserver
70611c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_winreg
70711c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_winsound
70811c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_zipfile
70911c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_zlib
710ed375e18d10d37bfea1769aa1fe69795df6cbc10Jeremy Hylton        """,
711b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro    'hp-ux11':
712b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        """
713b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_al
714b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_bsddb
715b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_cd
716b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_cl
717b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_curses
718b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_dl
719b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gdbm
720b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gl
721b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gzip
722b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_imgfile
723b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_largefile
724b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_linuxaudiodev
725b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_locale
726b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_minidom
727b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_nis
728b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_ntpath
729b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_openpty
730b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_pyexpat
731b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_sax
732b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_socket_ssl
733b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_socketserver
734b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_sunaudiodev
735b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_unicode_file
736b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_winreg
737b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_winsound
738b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_zipfile
739b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_zlib
740b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        """,
741f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis    'atheos':
742c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        """
743c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_al
744c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_cd
745c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_cl
746c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_curses
747c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_dl
748c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_email_codecs
749c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_gdbm
750c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_gl
751c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_imgfile
752c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_largefile
753c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_linuxaudiodev
754c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_locale
755c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_mhlib
756c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_mmap
757c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_mpz
758c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_nis
759c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_poll
760c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_popen2
761c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_resource
762c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_socket_ssl
763c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_socketserver
764c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_sunaudiodev
765c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_unicode_file
766c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_winreg
767c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_winsound
768c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        """,
769f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum}
770f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum
771b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _ExpectedSkips:
772b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self):
773b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.valid = 0
774de14a30d1d70073d36f207fe432e4adad5178399Tim Peters        if sys.platform in _expectations:
775f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            s = _expectations[sys.platform]
776b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            self.expected = _Set(s.split())
777f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            self.valid = 1
778b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
779b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def isvalid(self):
780b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return true iff _ExpectedSkips knows about the current platform."
781b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.valid
782b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
783b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def getexpected(self):
784b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """Return set of test names we expect to skip on current platform.
785b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
786b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.isvalid() must be true.
787b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """
788b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
789b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        assert self.isvalid()
790b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.expected
791b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
792152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumif __name__ == '__main__':
793408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # Remove regrtest.py's own directory from the module search path.  This
794408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # prevents relative imports from working, and relative imports will screw
795408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # up the testing framework.  E.g. if both test.test_support and
796408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # test_support are imported, they will not contain the same globals, and
797408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # much of the testing framework relies on the globals in the
798408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # test.test_support module.
799408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
800408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    i = pathlen = len(sys.path)
801408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    while i >= 0:
802408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        i -= 1
803408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
804408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            del sys.path[i]
805408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    if len(sys.path) == pathlen:
806408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        print 'Could not find %r in sys.path to remove it' % mydir
80708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    main()
808