regrtest.py revision 9e9d4f8ed8d467d0558251f43c5decc754712d53
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
67152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport test_support
68152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
693a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
703a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred DrakeRESOURCE_NAMES = ('curses', 'largefile', 'network')
713a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
723a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
7308fca5212528e073600c27c70a34eeef445f393bBarry Warsawdef usage(code, msg=''):
7408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    print __doc__
7508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if msg: print msg
7608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(code)
7708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
7808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
79ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanarodef main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
80c5000dfc4098f8547461e790a91536a923124261Tim Peters         exclude=0, single=0, randomize=0, fromfile=None, findleaks=0,
8108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw         use_resources=None):
826fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Execute a test suite.
836fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
847e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters    This also parses command-line options and modifies its behavior
85004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    accordingly.
866fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
876fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    tests -- a list of strings containing test names (optional)
886fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- the directory in which to look for tests (optional)
896fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
906fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    Users other than the Python test suite will certainly want to
916fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    specify testdir; if it's omitted, the directory containing the
92004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    Python test suite is searched for.
936fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
946fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    If the tests argument is omitted, the tests listed on the
956fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    command-line will be used.  If that's empty, too, then all *.py
966fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    files beginning with test_ will be used.
97ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro
989e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    The other default arguments (verbose, quiet, generate, exclude,
999e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    single, randomize, findleaks, and use_resources) allow programmers
1009e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    calling main() directly to set the values that would normally be
1019e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    set by flags on the command line.
102a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
1036fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
104004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
1058dee809410e2d433bb0be5d8a1699736b90db0b5Tim Peters    test_support.record_original_stdout(sys.stdout)
106152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
1079e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum        opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:',
10808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                   ['help', 'verbose', 'quiet', 'generate',
109c5000dfc4098f8547461e790a91536a923124261Tim Peters                                    'exclude', 'single', 'random', 'fromfile',
1109e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                                    'findleaks', 'use=', 'threshold='])
111152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except getopt.error, msg:
11208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, msg)
11308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
11408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    # Defaults
11508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if use_resources is None:
11608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        use_resources = []
117152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for o, a in opts:
11808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        if o in ('-h', '--help'):
11908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            usage(0)
12008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-v', '--verbose'):
12108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose += 1
12208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-q', '--quiet'):
12308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            quiet = 1;
12408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose = 0
12508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-g', '--generate'):
12608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            generate = 1
12708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-x', '--exclude'):
12808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            exclude = 1
12908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-s', '--single'):
13008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            single = 1
13108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-r', '--randomize'):
13208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            randomize = 1
133c5000dfc4098f8547461e790a91536a923124261Tim Peters        elif o in ('-f', '--fromfile'):
134c5000dfc4098f8547461e790a91536a923124261Tim Peters            fromfile = a
13508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-l', '--findleaks'):
13608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            findleaks = 1
1379e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum        elif o in ('-t', '--threshold'):
1389e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum            import gc
1399e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum            gc.set_threshold(int(a))
14008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-u', '--use'):
141fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            u = [x.lower() for x in a.split(',')]
142fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            for r in u:
1433a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                if r == 'all':
1443a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                    use_resources = RESOURCE_NAMES
1453a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                    break
1463a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                if r not in RESOURCE_NAMES:
1473a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                    usage(1, 'Invalid -u/--use option: ' + a)
14804a8da5cdb185322ca519db1e731ba10d7646970Fred Drake                if r not in use_resources:
149e41abab33b0b467acd6bdc7d73ce4b5cef4fd5bfAndrew MacIntyre                    use_resources.append(r)
150a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum    if generate and verbose:
15108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, "-g and -v don't go together!")
152c5000dfc4098f8547461e790a91536a923124261Tim Peters    if single and fromfile:
153c5000dfc4098f8547461e790a91536a923124261Tim Peters        usage(2, "-s and -f don't go together!")
15408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
155152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    good = []
156152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    bad = []
157152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    skipped = []
158e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
159d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer    if findleaks:
160a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        try:
161a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw            import gc
162a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        except ImportError:
1638a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            print 'No GC available, disabling findleaks.'
164d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            findleaks = 0
165a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        else:
1668a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # Uncomment the line below to report garbage that is not
1678a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # freeable by reference counting alone.  By default only
1688a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # garbage that is not collectable by the GC is reported.
1698a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            #gc.set_debug(gc.DEBUG_SAVEALL)
170d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            found_garbage = []
171a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
172e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
173e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        from tempfile import gettempdir
174e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        filename = os.path.join(gettempdir(), 'pynexttest')
175e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        try:
176e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp = open(filename, 'r')
177fc170b1fd5db978f4e8d4c23c138a7b59df681ecEric S. Raymond            next = fp.read().strip()
178e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            tests = [next]
179e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp.close()
180e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        except IOError:
181e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            pass
182c5000dfc4098f8547461e790a91536a923124261Tim Peters
183c5000dfc4098f8547461e790a91536a923124261Tim Peters    if fromfile:
184c5000dfc4098f8547461e790a91536a923124261Tim Peters        tests = []
185c5000dfc4098f8547461e790a91536a923124261Tim Peters        fp = open(fromfile)
186c5000dfc4098f8547461e790a91536a923124261Tim Peters        for line in fp:
187c5000dfc4098f8547461e790a91536a923124261Tim Peters            guts = line.split() # assuming no test has whitespace in its name
188c5000dfc4098f8547461e790a91536a923124261Tim Peters            if guts and not guts[0].startswith('#'):
189c5000dfc4098f8547461e790a91536a923124261Tim Peters                tests.extend(guts)
190c5000dfc4098f8547461e790a91536a923124261Tim Peters        fp.close()
191c5000dfc4098f8547461e790a91536a923124261Tim Peters
192c5000dfc4098f8547461e790a91536a923124261Tim Peters    # Strip .py extensions.
193c5000dfc4098f8547461e790a91536a923124261Tim Peters    if args:
194c5000dfc4098f8547461e790a91536a923124261Tim Peters        args = map(removepy, args)
195c5000dfc4098f8547461e790a91536a923124261Tim Peters    if tests:
196c5000dfc4098f8547461e790a91536a923124261Tim Peters        tests = map(removepy, tests)
197c5000dfc4098f8547461e790a91536a923124261Tim Peters
1986c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    stdtests = STDTESTS[:]
1996c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    nottests = NOTTESTS[:]
200152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if exclude:
2016c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        for arg in args:
2026c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum            if arg in stdtests:
2036c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum                stdtests.remove(arg)
2046c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        nottests[:0] = args
20541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        args = []
206747e1cade657e1e15c0f51d898de901da723e6a2Guido van Rossum    tests = tests or args or findtests(testdir, stdtests, nottests)
207e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
208e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        tests = tests[:1]
209ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro    if randomize:
210ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro        random.shuffle(tests)
21141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum    test_support.verbose = verbose      # Tell tests to be moderately quiet
21208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    test_support.use_resources = use_resources
2135796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum    save_modules = sys.modules.keys()
214152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for test in tests:
21541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not quiet:
21641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print test
217f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        ok = runtest(test, generate, verbose, quiet, testdir)
21841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if ok > 0:
21941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            good.append(test)
22041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        elif ok == 0:
22141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            bad.append(test)
22241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        else:
22341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            skipped.append(test)
224d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer        if findleaks:
225d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            gc.collect()
226d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            if gc.garbage:
2278a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "Warning: test created", len(gc.garbage),
2288a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "uncollectable object(s)."
2298a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # move the uncollectable objects somewhere so we don't see
2308a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # them again
231d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                found_garbage.extend(gc.garbage)
232d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                del gc.garbage[:]
2335796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        # Unload the newly imported modules (best effort finalization)
2345796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        for module in sys.modules.keys():
23551931144427faa001a6db3cfc37380526be256b6Guido van Rossum            if module not in save_modules and module.startswith("test."):
2365796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum                test_support.unload(module)
2377a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton
2387a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    # The lists won't be sorted if running with -r
2397a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    good.sort()
2407a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    bad.sort()
2417a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    skipped.sort()
242e0c446bb4ad67294f42d4cb53b4ff28413bd8ddeTim Peters
243152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if good and not quiet:
24441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not bad and not skipped and len(good) > 1:
24541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print "All",
24641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print count(len(good), "test"), "OK."
2471a4d77b2527ced1052b4faae3d176b125a764325Tim Peters        if verbose:
2481a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print "CAUTION:  stdout isn't compared in verbose mode:  a test"
2491a4d77b2527ced1052b4faae3d176b125a764325Tim Peters            print "that passes in verbose mode may fail without it."
250152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if bad:
251a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(bad), "test"), "failed:"
252a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(bad)
253152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if skipped and not quiet:
254a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(skipped), "test"), "skipped:"
255a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(skipped)
256e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
257b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        e = _ExpectedSkips()
258a2be2d624a47e420266606f0cb2a2e030797f650Tim Peters        plat = sys.platform
259b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if e.isvalid():
260b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            surprise = _Set(skipped) - e.getexpected()
261b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if surprise:
262b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print count(len(surprise), "skip"), \
263a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                      "unexpected on", plat + ":"
264a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                printlist(surprise)
265b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            else:
266b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print "Those skips are all expected on", plat + "."
267b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        else:
268b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "Ask someone to teach regrtest.py about which tests are"
269b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "expected to get skipped on", plat + "."
270b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
271e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
272e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        alltests = findtests(testdir, stdtests, nottests)
273e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        for i in range(len(alltests)):
274e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            if tests[0] == alltests[i]:
275e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                if i == len(alltests) - 1:
276e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    os.unlink(filename)
277e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                else:
278e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp = open(filename, 'w')
279e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.write(alltests[i+1] + '\n')
280e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.close()
281e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                break
282e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        else:
283e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            os.unlink(filename)
284e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
28508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(len(bad) > 0)
28608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
287152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2886fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumSTDTESTS = [
289152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_grammar',
290152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_opcodes',
291152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_operations',
292152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_builtin',
293152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_exceptions',
294152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_types',
295152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum   ]
296152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
2976fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumNOTTESTS = [
298152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_support',
299152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_b1',
300152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_b2',
30162e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future1',
30262e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future2',
3038471a35febdbfbfab51b9d4b5fe51694fe6ca536Jeremy Hylton    'test_future3',
304152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    ]
305152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
3066fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossumdef findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
307152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    """Return a list of all applicable test modules."""
3086fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
309152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    names = os.listdir(testdir)
310152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests = []
311152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for name in names:
312e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        if name[:5] == "test_" and name[-3:] == os.extsep+"py":
31341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            modname = name[:-3]
31441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if modname not in stdtests and modname not in nottests:
31541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                tests.append(modname)
316152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests.sort()
317152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return stdtests + tests
318152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
319f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mickdef runtest(test, generate, verbose, quiet, testdir = None):
3206fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Run a single test.
3216fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    test -- the name of the test
3226fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    generate -- if true, generate output, instead of running the test
3236fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    and comparing it to a previously created output file
3246fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    verbose -- if true, print more messages
325f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick    quiet -- if true, don't print 'skipped' messages (probably redundant)
3266fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- test directory
3276fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
328152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    test_support.unload(test)
3296fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
330152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputdir = os.path.join(testdir, "output")
331152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputfile = os.path.join(outputdir, test)
3329390cc15da5cd6920bd41bb4cd146d5d0601345fTim Peters    if verbose:
33341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        cfp = None
3340fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    else:
33588a56857f65d98e9d2b670eab6e048bda519340aFred Drake        cfp = StringIO.StringIO()
336152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
337342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters        save_stdout = sys.stdout
33841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        try:
33941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if cfp:
34041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                sys.stdout = cfp
34141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                print test              # Output file starts with test name
342d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            the_module = __import__(test, globals(), locals(), [])
343d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # Most tests run to completion simply as a side-effect of
344d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # being imported.  For the benefit of tests that can't run
345d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # that way (like test_threaded_import), explicitly invoke
346d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # their test_main() function (if it exists).
347d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            indirect_test = getattr(the_module, "test_main", None)
348d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            if indirect_test is not None:
349d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters                indirect_test()
35041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        finally:
351342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters            sys.stdout = save_stdout
3523af826ebca80f8a6c782fb590c77ac210ae9e22dThomas Wouters    except (ImportError, test_support.TestSkipped), msg:
353f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        if not quiet:
354eb9490526508dc643c2329771f95a925e5412049Guido van Rossum            print "test", test, "skipped --", msg
35541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return -1
356fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake    except KeyboardInterrupt:
357fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake        raise
358152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except test_support.TestFailed, msg:
35941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print "test", test, "failed --", msg
36041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
3619e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossum    except:
36241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        type, value = sys.exc_info()[:2]
36327c4b39025eb9e20f9d7a36b6aa0bb9c97f9bba5Fred Drake        print "test", test, "crashed --", str(type) + ":", value
36441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if verbose:
36541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            traceback.print_exc(file=sys.stdout)
36641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
367152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
3680fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if not cfp:
3690fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3700fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        output = cfp.getvalue()
371e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake        if generate:
372e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake            if output == test + "\n":
373e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                if os.path.exists(outputfile):
374e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # Write it since it already exists (and the contents
375e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # may have changed), but let the user know it isn't
376e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # needed:
377e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    print "output file", outputfile, \
378e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                          "is no longer needed; consider removing it"
3790fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                else:
3800fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                    # We don't need it, so don't create it.
3810fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                    return 1
3820fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp = open(outputfile, "w")
3830fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.write(output)
3840fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.close()
3850fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3860fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if os.path.exists(outputfile):
3870fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp = open(outputfile, "r")
3880fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            expected = fp.read()
3890fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.close()
3900fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        else:
3910fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            expected = test + "\n"
3920fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if output == expected:
3930fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
3940fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        print "test", test, "produced unexpected output:"
3950fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        reportdiff(expected, output)
3960fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        return 0
3970fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum
3980fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossumdef reportdiff(expected, output):
3990fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    import difflib
400c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    print "*" * 70
401c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    a = expected.splitlines(1)
402c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    b = output.splitlines(1)
403cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    sm = difflib.SequenceMatcher(a=a, b=b)
404cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    tuples = sm.get_opcodes()
405c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
406cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    def pair(x0, x1):
407c377b16d12ba325bb108eca575447d66f19294c0Tim Peters        # x0:x1 are 0-based slice indices; convert to 1-based line indices.
408cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        x0 += 1
409cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        if x0 >= x1:
410c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            return "line " + str(x0)
411cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        else:
412c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            return "lines %d-%d" % (x0, x1)
413c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
414cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    for op, a0, a1, b0, b1 in tuples:
415cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        if op == 'equal':
416cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            pass
417c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
418cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'delete':
419c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "***", pair(a0, a1), "of expected output missing:"
420cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            for line in a[a0:a1]:
421c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print "-", line,
422c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
423cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'replace':
424c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "*** mismatch between", pair(a0, a1), "of expected", \
425c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                  "output and", pair(b0, b1), "of actual output:"
426c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            for line in difflib.ndiff(a[a0:a1], b[b0:b1]):
427c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print line,
428c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
429cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'insert':
430c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "***", pair(b0, b1), "of actual output doesn't appear", \
431c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                  "in expected output after line", str(a1)+":"
432cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            for line in b[b0:b1]:
433c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print "+", line,
434c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
435cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        else:
436cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1)
437c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
4380fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    print "*" * 70
439152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
440152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef findtestdir():
441152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if __name__ == '__main__':
44241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = sys.argv[0]
443152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
44441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = __file__
445152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    testdir = os.path.dirname(file) or os.curdir
446152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return testdir
447152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
448c5000dfc4098f8547461e790a91536a923124261Tim Petersdef removepy(name):
449c5000dfc4098f8547461e790a91536a923124261Tim Peters    if name.endswith(os.extsep + "py"):
450c5000dfc4098f8547461e790a91536a923124261Tim Peters        name = name[:-3]
451c5000dfc4098f8547461e790a91536a923124261Tim Peters    return name
452c5000dfc4098f8547461e790a91536a923124261Tim Peters
453152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef count(n, word):
454152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if n == 1:
45541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %s" % (n, word)
456152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
45741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %ss" % (n, word)
458152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
459a45da92484ceececf1cf32b4dfb16004945b001eTim Petersdef printlist(x, width=70, indent=4):
460a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """Print the elements of a sequence to stdout.
461a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
462a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg width (default 70) is the maximum line length.
463a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg indent (default 4) is the number of blanks with which to
464a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    begin each line.
465a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """
466a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
467a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    line = ' ' * indent
468a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    for one in map(str, x):
469a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        w = len(line) + len(one)
470a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        if line[-1:] == ' ':
471a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            pad = ''
472a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        else:
473a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            pad = ' '
474a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            w += 1
475a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        if w > width:
476a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            print line
477a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            line = ' ' * indent + one
478a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        else:
479a45da92484ceececf1cf32b4dfb16004945b001eTim Peters            line += pad + one
480a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    if len(line) > indent:
481a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print line
482a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
483b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _Set:
484b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self, seq=[]):
485b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = self.data = {}
486b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        for x in seq:
487b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            data[x] = 1
488b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
489b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __len__(self):
490b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return len(self.data)
491b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
492b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __sub__(self, other):
493b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return set of all elements in self not in other."
494b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        result = _Set()
495b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = result.data = self.data.copy()
496b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        for x in other.data:
497b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if x in data:
498b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                del data[x]
499b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return result
500b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
50139f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton    def __iter__(self):
50239f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton        return iter(self.data)
50339f77bc90e16a6f3fffc7f770bc7bc6bd2c7a0a8Jeremy Hylton
504b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def tolist(self, sorted=1):
505b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return _Set elements as a list."
506b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        data = self.data.keys()
507b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if sorted:
508b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            data.sort()
509b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return data
510b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
511de14a30d1d70073d36f207fe432e4adad5178399Tim Peters# Map sys.platform to a string containing the basenames of tests
512de14a30d1d70073d36f207fe432e4adad5178399Tim Peters# expected to be skipped on that platform.
513de14a30d1d70073d36f207fe432e4adad5178399Tim Peters
514f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum_expectations = {
515f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'win32':
516f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
517f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
518f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
519f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
520f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_commands
521f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_crypt
522d703057752d52cef6082a920879a0b62cdeffacaTim Peters        test_curses
523f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dbm
524f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
525deb121aec7185f0d8034453203c6be436b2951f5Tim Peters        test_email_codecs
526f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fcntl
527f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fork1
528f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gdbm
529f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
530f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_grp
531f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
532f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
533f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_linuxaudiodev
534f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_mhlib
535de14a30d1d70073d36f207fe432e4adad5178399Tim Peters        test_mpz
536f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
537f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_openpty
538f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_poll
539f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pty
540f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pwd
5411e33ffa5c719ec611e182681c4a5f2ceb62a08f5Tim Peters        test_resource
542f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_signal
54308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        test_socket_ssl
544a86f0c17a1385c07710d894b93a1c13159c0b57fTim Peters        test_socketserver
545f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
546f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_timing
547f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
548f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'linux2':
549f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
550f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
551f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
552f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
553f66dacdb017c7481c3ba4f0743d5446146de33c8Guido van Rossum        test_curses
554f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
5556184c117e9af1cf6178fd34bd7c576ce36107df2Guido van Rossum        test_email_codecs
556f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
557f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
558f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
559f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
560f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_ntpath
56108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        test_socket_ssl
562f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_socketserver
563f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
564f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_unicode_file
565f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_winreg
566f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_winsound
567f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
56849a806edbb298f2a5be3598bd80c21392cb6968dJack Jansen   'mac':
569aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """
570aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_al
571aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_bsddb
572aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cd
573aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cl
574aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_commands
575aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_crypt
576b3be216b41a4755556a887baa6ab440279fbe1dcJack Jansen        test_curses
577aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dbm
578aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dl
579aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fcntl
580aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fork1
581aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_gl
582aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_grp
583aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_imgfile
584aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_largefile
585aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_linuxaudiodev
586aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_locale
587aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_mmap
588aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_nis
589aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_ntpath
590aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_openpty
591aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_poll
592aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_popen2
593aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pty
594aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pwd
595aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_signal
596aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socket_ssl
597aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socketserver
598aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sunaudiodev
599aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sundry
600aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_timing
601aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_unicode_file
602aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_winreg
603aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_winsound
604aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """,
6050ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis    'unixware5':
6060ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """
6070ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_al
6080ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_bsddb
6090ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cd
6100ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cl
6110ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_dl
6120ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_gl
6130ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_imgfile
6140ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_largefile
6150ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_linuxaudiodev
6160ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_minidom
6170ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_nis
6180ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_ntpath
6190ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_openpty
6200ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_pyexpat
6210ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sax
6220ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_socketserver
6230ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sunaudiodev
6240ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sundry
6250ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_unicode_file
6260ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_winreg
6270ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_winsound
6280ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """,
629e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum    'riscos':
630e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        """
631e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_al
632e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_asynchat
633e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_bsddb
634e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_cd
635e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_cl
636e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_commands
637e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_crypt
638e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_dbm
639e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_dl
640e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_fcntl
641e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_fork1
642e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_gdbm
643e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_gl
644e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_grp
645e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_imgfile
646e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_largefile
647e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_linuxaudiodev
648e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_locale
649e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_mmap
650e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_nis
651e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_ntpath
652e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_openpty
653e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_poll
654e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_popen2
655e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_pty
656e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_pwd
657e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_socket_ssl
658e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_socketserver
659e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_strop
660e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_sunaudiodev
661e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_sundry
662e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_thread
663e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threaded_import
664e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threadedtempfile
665e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threading
666e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_timing
667e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_unicode_file
668e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_winreg
669e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_winsound
670e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        """,
6718a97f4a380a7a356730e48406f8269c3efe5e6ebJack Jansen    'darwin':
672398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        """
673398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_al
674398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_cd
675398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_cl
676398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_curses
677398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_dl
678398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_gdbm
679398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_gl
680398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_imgfile
681398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_largefile
682398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_linuxaudiodev
683398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_minidom
684398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_nis
685398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_ntpath
686398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_poll
687398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_socket_ssl
688f839c27027ee0656319b7d7033d898e5b559c96bJack Jansen        test_socketserver
689398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_sunaudiodev
690f839c27027ee0656319b7d7033d898e5b559c96bJack Jansen        test_unicode_file
691398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_winreg
692398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_winsound
693398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        """,
694b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro    'hp-ux11':
695b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        """
696b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_al
697b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_bsddb
698b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_cd
699b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_cl
700b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_curses
701b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_dl
702b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gdbm
703b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gl
704b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gzip
705b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_imgfile
706b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_largefile
707b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_linuxaudiodev
708b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_locale
709b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_minidom
710b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_nis
711b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_ntpath
712b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_openpty
713b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_pyexpat
714b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_sax
715b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_socket_ssl
716b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_socketserver
717b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_sunaudiodev
718b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_unicode_file
719b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_winreg
720b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_winsound
721b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_zipfile
722b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_zlib
723b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        """,
724f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum}
725f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum
726b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _ExpectedSkips:
727b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self):
728b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.valid = 0
729de14a30d1d70073d36f207fe432e4adad5178399Tim Peters        if sys.platform in _expectations:
730f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            s = _expectations[sys.platform]
731b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            self.expected = _Set(s.split())
732f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            self.valid = 1
733b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
734b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def isvalid(self):
735b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return true iff _ExpectedSkips knows about the current platform."
736b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.valid
737b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
738b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def getexpected(self):
739b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """Return set of test names we expect to skip on current platform.
740b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
741b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.isvalid() must be true.
742b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """
743b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
744b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        assert self.isvalid()
745b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.expected
746b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
747152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumif __name__ == '__main__':
74808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    main()
749