regrtest.py revision f2715e076435b74638acb81512c2ee014f75aea2
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.
581c6b1a2b4ea38955a3f0514f4709bafd0be96c5eMartin v. Löwis
591c6b1a2b4ea38955a3f0514f4709bafd0be96c5eMartin v. Löwis    bsddb -     It is okay to run the bsddb testsuite, which takes
601c6b1a2b4ea38955a3f0514f4709bafd0be96c5eMartin v. Löwis                a long time to complete.
614dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake
624dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred DrakeTo enable all resources except one, use '-uall,-<resource>'.  For
634dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drakeexample, to run all the tests except for the bsddb tests, give the
644dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drakeoption '-uall,-bsddb'.
65152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum"""
66152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
67152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport sys
68152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport os
69152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumimport getopt
709e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossumimport traceback
71ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaroimport random
72ae1bb176bea47b2123bba208733edb42692e9431Fred Drakeimport StringIO
73dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossumimport warnings
747c7efe90737d4636633127a95a6cab1a55d57cf4Tim Petersfrom sets import Set
75dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossum
76dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossum# I see no other way to suppress these warnings;
77dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossum# putting them in test_grammar.py has no effect:
7888b1defb6f770c4f74788e8296b88fc31c3936ceGuido van Rossumwarnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
79dc15c27f505930a69c73f8c2baf1f9caff9252efGuido van Rossum                        ".*test.test_grammar$")
80c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossumif sys.maxint > 0x7fffffff:
81c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossum    # Also suppress them in <string>, because for 64-bit platforms,
82c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossum    # that's where test_grammar.py hides them.
83c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossum    warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
84c34c4fc3ab497ec1dd4f8c921798927d1b6d13e2Guido van Rossum                            "<string>")
85152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
86bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# MacOSX (a.k.a. Darwin) has a default stack size that is too small
87bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# for deeply recursive regular expressions.  We see this as crashes in
88bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# the Python test suite when running test_re.py and test_sre.py.  The
89bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# fix is to set the stack limit to 2048.
90bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# This approach may also be useful for other Unixy platforms that
91bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum# suffer from small default stack limits.
92bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossumif sys.platform == 'darwin':
93bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum    try:
94bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        import resource
95bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum    except ImportError:
96bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        pass
97bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum    else:
98bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
99bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        newsoft = min(hard, max(soft, 1024*2048))
100bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum        resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
101bb48465273d2aa98fc7669e99b0d5fb1c57962deGuido van Rossum
10204f357cffef6d764f2f0ff2671dabde75ec250d1Barry Warsawfrom test import test_support
1033a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
1041c6b1a2b4ea38955a3f0514f4709bafd0be96c5eMartin v. LöwisRESOURCE_NAMES = ('curses', 'largefile', 'network', 'bsddb')
1053a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
1063a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake
10708fca5212528e073600c27c70a34eeef445f393bBarry Warsawdef usage(code, msg=''):
10808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    print __doc__
10908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if msg: print msg
11008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(code)
11108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
11208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
113ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanarodef main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
114c5000dfc4098f8547461e790a91536a923124261Tim Peters         exclude=0, single=0, randomize=0, fromfile=None, findleaks=0,
11508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw         use_resources=None):
1166fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Execute a test suite.
1176fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
1187e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters    This also parses command-line options and modifies its behavior
119004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    accordingly.
1206fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
1216fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    tests -- a list of strings containing test names (optional)
1226fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- the directory in which to look for tests (optional)
1236fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
1246fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    Users other than the Python test suite will certainly want to
1256fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    specify testdir; if it's omitted, the directory containing the
126004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake    Python test suite is searched for.
1276fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum
1286fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    If the tests argument is omitted, the tests listed on the
1296fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    command-line will be used.  If that's empty, too, then all *.py
1306fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    files beginning with test_ will be used.
131ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro
1329e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    The other default arguments (verbose, quiet, generate, exclude,
1339e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    single, randomize, findleaks, and use_resources) allow programmers
1349e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    calling main() directly to set the values that would normally be
1359e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum    set by flags on the command line.
136a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
1376fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
138004d5e6880940ddbb38460986ac62ee0f1bae97dFred Drake
1398dee809410e2d433bb0be5d8a1699736b90db0b5Tim Peters    test_support.record_original_stdout(sys.stdout)
140152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
1419e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum        opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:',
14208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw                                   ['help', 'verbose', 'quiet', 'generate',
143c5000dfc4098f8547461e790a91536a923124261Tim Peters                                    'exclude', 'single', 'random', 'fromfile',
1449e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum                                    'findleaks', 'use=', 'threshold='])
145152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except getopt.error, msg:
14608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, msg)
14708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
14808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    # Defaults
14908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    if use_resources is None:
15008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        use_resources = []
151152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for o, a in opts:
15208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        if o in ('-h', '--help'):
15308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            usage(0)
15408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-v', '--verbose'):
15508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose += 1
15608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-q', '--quiet'):
15708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            quiet = 1;
15808fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            verbose = 0
15908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-g', '--generate'):
16008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            generate = 1
16108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-x', '--exclude'):
16208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            exclude = 1
16308fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-s', '--single'):
16408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            single = 1
16508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-r', '--randomize'):
16608fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            randomize = 1
167c5000dfc4098f8547461e790a91536a923124261Tim Peters        elif o in ('-f', '--fromfile'):
168c5000dfc4098f8547461e790a91536a923124261Tim Peters            fromfile = a
16908fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-l', '--findleaks'):
17008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw            findleaks = 1
1719e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum        elif o in ('-t', '--threshold'):
1729e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum            import gc
1739e9d4f8ed8d467d0558251f43c5decc754712d53Guido van Rossum            gc.set_threshold(int(a))
17408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        elif o in ('-u', '--use'):
175fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            u = [x.lower() for x in a.split(',')]
176fe3f6969f54cfd3df24f54572a809e0deb47064fGuido van Rossum            for r in u:
1773a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                if r == 'all':
1784dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    use_resources[:] = RESOURCE_NAMES
1794dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    continue
1804dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                remove = False
1814dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                if r[0] == '-':
1824dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    remove = True
1834dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    r = r[1:]
1843a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                if r not in RESOURCE_NAMES:
1853a15dace3606d6ea9d59486c5d080a1cb4192ff4Fred Drake                    usage(1, 'Invalid -u/--use option: ' + a)
1864dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                if remove:
1874dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                    if r in use_resources:
1884dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                        use_resources.remove(r)
1894dd0f7ef7a0a7e7abe2043bbf8804fde962a8de3Fred Drake                elif r not in use_resources:
190e41abab33b0b467acd6bdc7d73ce4b5cef4fd5bfAndrew MacIntyre                    use_resources.append(r)
191a412220bbf8ef8391eb38b35d62520cfbc2fc039Guido van Rossum    if generate and verbose:
19208fca5212528e073600c27c70a34eeef445f393bBarry Warsaw        usage(2, "-g and -v don't go together!")
193c5000dfc4098f8547461e790a91536a923124261Tim Peters    if single and fromfile:
194c5000dfc4098f8547461e790a91536a923124261Tim Peters        usage(2, "-s and -f don't go together!")
19508fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
196152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    good = []
197152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    bad = []
198152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    skipped = []
1999a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake    resource_denieds = []
200e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
201d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer    if findleaks:
202a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        try:
203a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw            import gc
204a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        except ImportError:
2058a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            print 'No GC available, disabling findleaks.'
206d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            findleaks = 0
207a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw        else:
2088a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # Uncomment the line below to report garbage that is not
2098a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # freeable by reference counting alone.  By default only
2108a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            # garbage that is not collectable by the GC is reported.
2118a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer            #gc.set_debug(gc.DEBUG_SAVEALL)
212d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            found_garbage = []
213a873b03ebb24076b3664ba694eeed4ab07d176d9Barry Warsaw
214e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
215e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        from tempfile import gettempdir
216e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        filename = os.path.join(gettempdir(), 'pynexttest')
217e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        try:
218e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp = open(filename, 'r')
219fc170b1fd5db978f4e8d4c23c138a7b59df681ecEric S. Raymond            next = fp.read().strip()
220e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            tests = [next]
221e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            fp.close()
222e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        except IOError:
223e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            pass
224c5000dfc4098f8547461e790a91536a923124261Tim Peters
225c5000dfc4098f8547461e790a91536a923124261Tim Peters    if fromfile:
226c5000dfc4098f8547461e790a91536a923124261Tim Peters        tests = []
227c5000dfc4098f8547461e790a91536a923124261Tim Peters        fp = open(fromfile)
228c5000dfc4098f8547461e790a91536a923124261Tim Peters        for line in fp:
229c5000dfc4098f8547461e790a91536a923124261Tim Peters            guts = line.split() # assuming no test has whitespace in its name
230c5000dfc4098f8547461e790a91536a923124261Tim Peters            if guts and not guts[0].startswith('#'):
231c5000dfc4098f8547461e790a91536a923124261Tim Peters                tests.extend(guts)
232c5000dfc4098f8547461e790a91536a923124261Tim Peters        fp.close()
233c5000dfc4098f8547461e790a91536a923124261Tim Peters
234c5000dfc4098f8547461e790a91536a923124261Tim Peters    # Strip .py extensions.
235c5000dfc4098f8547461e790a91536a923124261Tim Peters    if args:
236c5000dfc4098f8547461e790a91536a923124261Tim Peters        args = map(removepy, args)
237c5000dfc4098f8547461e790a91536a923124261Tim Peters    if tests:
238c5000dfc4098f8547461e790a91536a923124261Tim Peters        tests = map(removepy, tests)
239c5000dfc4098f8547461e790a91536a923124261Tim Peters
2406c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    stdtests = STDTESTS[:]
2416c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum    nottests = NOTTESTS[:]
242152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if exclude:
2436c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        for arg in args:
2446c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum            if arg in stdtests:
2456c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum                stdtests.remove(arg)
2466c74fea07d42ac6bc3bc078fb13f903f6cdbbcb9Guido van Rossum        nottests[:0] = args
24741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        args = []
248747e1cade657e1e15c0f51d898de901da723e6a2Guido van Rossum    tests = tests or args or findtests(testdir, stdtests, nottests)
249e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
250e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        tests = tests[:1]
251ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro    if randomize:
252ab1c7918f683e540ae5651c1b585ecda16ae352dSkip Montanaro        random.shuffle(tests)
25341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum    test_support.verbose = verbose      # Tell tests to be moderately quiet
25408fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    test_support.use_resources = use_resources
2555796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum    save_modules = sys.modules.keys()
256152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for test in tests:
25741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not quiet:
25841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print test
2593cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum            sys.stdout.flush()
260f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        ok = runtest(test, generate, verbose, quiet, testdir)
26141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if ok > 0:
26241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            good.append(test)
26341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        elif ok == 0:
26441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            bad.append(test)
26541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        else:
26641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            skipped.append(test)
2679a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake            if ok == -2:
2689a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake                resource_denieds.append(test)
269d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer        if findleaks:
270d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            gc.collect()
271d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer            if gc.garbage:
2728a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "Warning: test created", len(gc.garbage),
2738a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                print "uncollectable object(s)."
2748a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # move the uncollectable objects somewhere so we don't see
2758a00abc0ff6544a7004a86b4c96e23ca23ac66dcNeil Schemenauer                # them again
276d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                found_garbage.extend(gc.garbage)
277d569f23da94babd616751cd46eea38963e4edfa1Neil Schemenauer                del gc.garbage[:]
2785796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        # Unload the newly imported modules (best effort finalization)
2795796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum        for module in sys.modules.keys():
28051931144427faa001a6db3cfc37380526be256b6Guido van Rossum            if module not in save_modules and module.startswith("test."):
2815796d26794eee634a4a06637d99d8d5c58da2bdbGuido van Rossum                test_support.unload(module)
2827a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton
2837a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    # The lists won't be sorted if running with -r
2847a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    good.sort()
2857a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    bad.sort()
2867a1ea0e88034cdc03d546f0947fc8ecb30f4435fJeremy Hylton    skipped.sort()
287e0c446bb4ad67294f42d4cb53b4ff28413bd8ddeTim Peters
288152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if good and not quiet:
28941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if not bad and not skipped and len(good) > 1:
29041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            print "All",
29141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print count(len(good), "test"), "OK."
2921a4d77b2527ced1052b4faae3d176b125a764325Tim Peters        if verbose:
293408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            print "CAUTION:  stdout isn't compared in verbose mode:"
294408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            print "a test that passes in verbose mode may fail without it."
295152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if bad:
296a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(bad), "test"), "failed:"
297a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(bad)
298152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if skipped and not quiet:
299a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        print count(len(skipped), "test"), "skipped:"
300a45da92484ceececf1cf32b4dfb16004945b001eTim Peters        printlist(skipped)
301e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
302b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        e = _ExpectedSkips()
303a2be2d624a47e420266606f0cb2a2e030797f650Tim Peters        plat = sys.platform
304b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        if e.isvalid():
3059a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake            surprise = Set(skipped) - e.getexpected() - Set(resource_denieds)
306b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            if surprise:
307b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print count(len(surprise), "skip"), \
308a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                      "unexpected on", plat + ":"
309a45da92484ceececf1cf32b4dfb16004945b001eTim Peters                printlist(surprise)
310b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            else:
311b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters                print "Those skips are all expected on", plat + "."
312b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        else:
313b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "Ask someone to teach regrtest.py about which tests are"
314b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters            print "expected to get skipped on", plat + "."
315b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
316e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw    if single:
317e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        alltests = findtests(testdir, stdtests, nottests)
318e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        for i in range(len(alltests)):
319e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            if tests[0] == alltests[i]:
320e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                if i == len(alltests) - 1:
321e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    os.unlink(filename)
322e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                else:
323e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp = open(filename, 'w')
324e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.write(alltests[i+1] + '\n')
325e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                    fp.close()
326e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw                break
327e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw        else:
328e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw            os.unlink(filename)
329e11e3dee3e4f467d51c9d36e24b0b09e64eab295Barry Warsaw
33008fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    sys.exit(len(bad) > 0)
33108fca5212528e073600c27c70a34eeef445f393bBarry Warsaw
332152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
3336fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumSTDTESTS = [
334152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_grammar',
335152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_opcodes',
336152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_operations',
337152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_builtin',
338152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_exceptions',
339152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_types',
340152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum   ]
341152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
3426fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van RossumNOTTESTS = [
343152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    'test_support',
34462e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future1',
34562e2c7e3dfffd8465a54b99fc6d3c2a60acab350Jeremy Hylton    'test_future2',
3468471a35febdbfbfab51b9d4b5fe51694fe6ca536Jeremy Hylton    'test_future3',
347152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    ]
348152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
3496fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossumdef findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
350152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    """Return a list of all applicable test modules."""
3516fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
352152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    names = os.listdir(testdir)
353152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests = []
354152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    for name in names:
355e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        if name[:5] == "test_" and name[-3:] == os.extsep+"py":
35641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            modname = name[:-3]
35741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if modname not in stdtests and modname not in nottests:
35841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                tests.append(modname)
359152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    tests.sort()
360152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return stdtests + tests
361152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
362f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mickdef runtest(test, generate, verbose, quiet, testdir = None):
3636fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """Run a single test.
3646fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    test -- the name of the test
3656fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    generate -- if true, generate output, instead of running the test
3666fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    and comparing it to a previously created output file
3676fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    verbose -- if true, print more messages
368f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick    quiet -- if true, don't print 'skipped' messages (probably redundant)
3696fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    testdir -- test directory
3706fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    """
371152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    test_support.unload(test)
3726fd83b7b38d0b2a8c9ff5e5b553a1ea6f7306ef4Guido van Rossum    if not testdir: testdir = findtestdir()
373152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputdir = os.path.join(testdir, "output")
374152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    outputfile = os.path.join(outputdir, test)
3759390cc15da5cd6920bd41bb4cd146d5d0601345fTim Peters    if verbose:
37641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        cfp = None
3770fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    else:
37888a56857f65d98e9d2b670eab6e048bda519340aFred Drake        cfp = StringIO.StringIO()
379152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    try:
380342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters        save_stdout = sys.stdout
38141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        try:
38241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            if cfp:
38341360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                sys.stdout = cfp
38441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum                print test              # Output file starts with test name
385408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            if test.startswith('test.'):
386408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                abstest = test
387408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            else:
388408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                # Always import it from the test package
389408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw                abstest = 'test.' + test
390408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            the_package = __import__(abstest, globals(), locals(), [])
391408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            the_module = getattr(the_package, test)
392d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # Most tests run to completion simply as a side-effect of
393d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # being imported.  For the benefit of tests that can't run
394d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # that way (like test_threaded_import), explicitly invoke
395d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            # their test_main() function (if it exists).
396d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            indirect_test = getattr(the_module, "test_main", None)
397d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters            if indirect_test is not None:
398d97422115e9ed6498bc7a6f792a0bf8f278f9097Tim Peters                indirect_test()
39941360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        finally:
400342ca75d9552ff5c606c465d1392a32e44257fe5Tim Peters            sys.stdout = save_stdout
4019a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake    except test_support.ResourceDenied, msg:
4029a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake        if not quiet:
4039a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake            print test, "skipped --", msg
4049a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake            sys.stdout.flush()
4059a0db07c2ffd4e4b3ae75d5820dc6b4152b3582bFred Drake        return -2
4063af826ebca80f8a6c782fb590c77ac210ae9e22dThomas Wouters    except (ImportError, test_support.TestSkipped), msg:
407f29f47b38beae54db959d0dd2f0800d5dd3fc174Trent Mick        if not quiet:
408de4742b87f7775fc3d9fa76cd640e7cdd5ef69a2Fred Drake            print test, "skipped --", msg
4093cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum            sys.stdout.flush()
41041360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return -1
411fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake    except KeyboardInterrupt:
412fe5c22a85e6740012143cdbdc384bd2ebc788c27Fred Drake        raise
413152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    except test_support.TestFailed, msg:
41441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        print "test", test, "failed --", msg
4153cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum        sys.stdout.flush()
41641360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
4179e48b272b96aabf597b7aedd358ab890ddbf4c98Guido van Rossum    except:
41841360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        type, value = sys.exc_info()[:2]
41927c4b39025eb9e20f9d7a36b6aa0bb9c97f9bba5Fred Drake        print "test", test, "crashed --", str(type) + ":", value
4203cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum        sys.stdout.flush()
42141360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        if verbose:
42241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum            traceback.print_exc(file=sys.stdout)
4233cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum            sys.stdout.flush()
42441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return 0
425152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
4260fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if not cfp:
4270fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
4280fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        output = cfp.getvalue()
429e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake        if generate:
430e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake            if output == test + "\n":
431e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                if os.path.exists(outputfile):
432e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # Write it since it already exists (and the contents
433e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # may have changed), but let the user know it isn't
434e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    # needed:
435e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                    print "output file", outputfile, \
436e51fe8d0a3d2a3fc83fd4f02521b0808c073bf50Fred Drake                          "is no longer needed; consider removing it"
4370fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                else:
4380fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                    # We don't need it, so don't create it.
4390fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum                    return 1
4400fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp = open(outputfile, "w")
4410fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.write(output)
4420fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.close()
4430fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
4440fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if os.path.exists(outputfile):
4450fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp = open(outputfile, "r")
4460fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            expected = fp.read()
4470fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            fp.close()
4480fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        else:
4490fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            expected = test + "\n"
4500fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        if output == expected:
4510fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum            return 1
4520fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        print "test", test, "produced unexpected output:"
4533cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum        sys.stdout.flush()
4540fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        reportdiff(expected, output)
4553cda93ebf60e501350f42fdab72c18eab54718fcGuido van Rossum        sys.stdout.flush()
4560fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum        return 0
4570fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum
4580fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossumdef reportdiff(expected, output):
4590fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    import difflib
460c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    print "*" * 70
461c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    a = expected.splitlines(1)
462c377b16d12ba325bb108eca575447d66f19294c0Tim Peters    b = output.splitlines(1)
463cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    sm = difflib.SequenceMatcher(a=a, b=b)
464cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    tuples = sm.get_opcodes()
465c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
466cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    def pair(x0, x1):
467c377b16d12ba325bb108eca575447d66f19294c0Tim Peters        # x0:x1 are 0-based slice indices; convert to 1-based line indices.
468cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        x0 += 1
469cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        if x0 >= x1:
470c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            return "line " + str(x0)
471cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        else:
472c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            return "lines %d-%d" % (x0, x1)
473c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
474cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum    for op, a0, a1, b0, b1 in tuples:
475cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        if op == 'equal':
476cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            pass
477c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
478cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'delete':
479c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "***", pair(a0, a1), "of expected output missing:"
480cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            for line in a[a0:a1]:
481c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print "-", line,
482c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
483cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'replace':
484c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "*** mismatch between", pair(a0, a1), "of expected", \
485c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                  "output and", pair(b0, b1), "of actual output:"
486c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            for line in difflib.ndiff(a[a0:a1], b[b0:b1]):
487c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print line,
488c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
489cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        elif op == 'insert':
490c377b16d12ba325bb108eca575447d66f19294c0Tim Peters            print "***", pair(b0, b1), "of actual output doesn't appear", \
491c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                  "in expected output after line", str(a1)+":"
492cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            for line in b[b0:b1]:
493c377b16d12ba325bb108eca575447d66f19294c0Tim Peters                print "+", line,
494c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
495cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum        else:
496cf691935bb1a59bd7ff680b26b0b0040b7e25449Guido van Rossum            print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1)
497c377b16d12ba325bb108eca575447d66f19294c0Tim Peters
4980fcca4e815e3dbb28c73108376079a94ad6ee8deGuido van Rossum    print "*" * 70
499152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
500152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef findtestdir():
501152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if __name__ == '__main__':
50241360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = sys.argv[0]
503152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
50441360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        file = __file__
505152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    testdir = os.path.dirname(file) or os.curdir
506152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    return testdir
507152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
508c5000dfc4098f8547461e790a91536a923124261Tim Petersdef removepy(name):
509c5000dfc4098f8547461e790a91536a923124261Tim Peters    if name.endswith(os.extsep + "py"):
510c5000dfc4098f8547461e790a91536a923124261Tim Peters        name = name[:-3]
511c5000dfc4098f8547461e790a91536a923124261Tim Peters    return name
512c5000dfc4098f8547461e790a91536a923124261Tim Peters
513152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumdef count(n, word):
514152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    if n == 1:
51541360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %s" % (n, word)
516152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum    else:
51741360a4696f488e49e5409b3b1baf1fff6ae0044Guido van Rossum        return "%d %ss" % (n, word)
518152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossum
519a45da92484ceececf1cf32b4dfb16004945b001eTim Petersdef printlist(x, width=70, indent=4):
5207c7efe90737d4636633127a95a6cab1a55d57cf4Tim Peters    """Print the elements of iterable x to stdout.
521a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
522a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg width (default 70) is the maximum line length.
523a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    Optional arg indent (default 4) is the number of blanks with which to
524a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    begin each line.
525a45da92484ceececf1cf32b4dfb16004945b001eTim Peters    """
526a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
527ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    from textwrap import fill
528ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    blanks = ' ' * indent
529ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters    print fill(' '.join(map(str, x)), width,
530ba78bc4a3216b51398bab59157572a51c38b9ef4Tim Peters               initial_indent=blanks, subsequent_indent=blanks)
531a45da92484ceececf1cf32b4dfb16004945b001eTim Peters
532de14a30d1d70073d36f207fe432e4adad5178399Tim Peters# Map sys.platform to a string containing the basenames of tests
533de14a30d1d70073d36f207fe432e4adad5178399Tim Peters# expected to be skipped on that platform.
5342a182dbf3f2520ad753792068391775d102b13dfTim Peters#
5352a182dbf3f2520ad753792068391775d102b13dfTim Peters# Special cases:
5362a182dbf3f2520ad753792068391775d102b13dfTim Peters#     test_pep277
5372a182dbf3f2520ad753792068391775d102b13dfTim Peters#         The _ExpectedSkips constructor adds this to the set of expected
5382a182dbf3f2520ad753792068391775d102b13dfTim Peters#         skips if not os.path.supports_unicode_filenames.
5391b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters#     test_normalization
5401b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters#         Whether a skip is expected here depends on whether a large test
5411b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters#         input file has been downloaded.  test_normalization.skip_expected
5421babdfc48afc60afe5ae708f77dad8a641bf36ecTim Peters#         controls that.
543b4ee4eb3b308d55bd0d8d5a1abb2015950934c77Tim Peters#     test_socket_ssl
544b4ee4eb3b308d55bd0d8d5a1abb2015950934c77Tim Peters#         Controlled by test_socket_ssl.skip_expected.  Requires the network
545b4ee4eb3b308d55bd0d8d5a1abb2015950934c77Tim Peters#         resource, and a socket module with ssl support.
546de14a30d1d70073d36f207fe432e4adad5178399Tim Peters
547f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum_expectations = {
548f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'win32':
549f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
550f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
55178e35f931128d017d5955841eac8c397ff32595cTim Peters        test_bsddb3
552f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
553f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
554f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_commands
555f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_crypt
556d703057752d52cef6082a920879a0b62cdeffacaTim Peters        test_curses
557f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dbm
558f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
559deb121aec7185f0d8034453203c6be436b2951f5Tim Peters        test_email_codecs
560f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fcntl
561f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_fork1
562f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gdbm
563f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
564f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_grp
56540e1ce4d73f8843b937465e93f639c00b0a73597Tim Peters        test_iconv_codecs
566f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
567f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
568f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_linuxaudiodev
569f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_mhlib
570de14a30d1d70073d36f207fe432e4adad5178399Tim Peters        test_mpz
571f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
572f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_openpty
573efc4b121694888e00072f5a079de5496afecb05aTim Peters        test_ossaudiodev
574f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_poll
575003eb3088283927e3155f2e2317d3d516edd9645Tim Peters        test_posix
576f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pty
577f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_pwd
5781e33ffa5c719ec611e182681c4a5f2ceb62a08f5Tim Peters        test_resource
579f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_signal
580a86f0c17a1385c07710d894b93a1c13159c0b57fTim Peters        test_socketserver
581f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
582f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_timing
583f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
584f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum    'linux2':
585f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """
586f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_al
587f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cd
588f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_cl
589f66dacdb017c7481c3ba4f0743d5446146de33c8Guido van Rossum        test_curses
590f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_dl
5916184c117e9af1cf6178fd34bd7c576ce36107df2Guido van Rossum        test_email_codecs
592f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_gl
593f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_imgfile
594f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_largefile
5954507ec70cff35468f4b1767382f38ecebd4a29a2Guido van Rossum        test_linuxaudiodev
596f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_nis
597f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_ntpath
5984507ec70cff35468f4b1767382f38ecebd4a29a2Guido van Rossum        test_ossaudiodev
599f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_socketserver
600f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_sunaudiodev
601f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        test_unicode_file
602f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum        """,
60349a806edbb298f2a5be3598bd80c21392cb6968dJack Jansen   'mac':
604aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """
605aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_al
606679751455798fab6425fda749a19e783e58b210eJack Jansen        test_atexit
607aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_bsddb
608679751455798fab6425fda749a19e783e58b210eJack Jansen        test_bsddb3
609679751455798fab6425fda749a19e783e58b210eJack Jansen        test_bz2
610aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cd
611aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_cl
612aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_commands
613aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_crypt
614b3be216b41a4755556a887baa6ab440279fbe1dcJack Jansen        test_curses
615aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dbm
616aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_dl
617679751455798fab6425fda749a19e783e58b210eJack Jansen        test_email_codecs
618aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fcntl
619aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_fork1
620aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_gl
621aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_grp
62240e1ce4d73f8843b937465e93f639c00b0a73597Tim Peters        test_iconv_codecs
623aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_imgfile
624aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_largefile
625aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_linuxaudiodev
626aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_locale
627aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_mmap
628679751455798fab6425fda749a19e783e58b210eJack Jansen        test_mpz
629aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_nis
630aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_ntpath
631aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_openpty
632679751455798fab6425fda749a19e783e58b210eJack Jansen        test_ossaudiodev
633aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_poll
634679751455798fab6425fda749a19e783e58b210eJack Jansen        test_popen
635aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_popen2
636aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pty
637aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_pwd
638679751455798fab6425fda749a19e783e58b210eJack Jansen        test_resource
639aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_signal
640aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_socketserver
641aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sunaudiodev
642aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_sundry
643aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_timing
644aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        test_unicode_file
645aa78236636d62a07af4759b64ea89452c6690c7eGuido van Rossum        """,
64621ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis    'unixware7':
6470ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """
6480ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_al
6490ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_bsddb
6500ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cd
6510ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_cl
6520ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_dl
6530ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_gl
6540ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_imgfile
6550ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_largefile
6560ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_linuxaudiodev
6570ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_minidom
6580ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_nis
6590ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_ntpath
6600ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_openpty
6610ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_pyexpat
6620ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sax
6630ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_socketserver
6640ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sunaudiodev
6650ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_sundry
6660ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        test_unicode_file
6670ace326ed2ec73dfa515c89ad06fcddd6fafa4ceMartin v. Löwis        """,
66821ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis    'openunix8':
66921ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        """
67021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_al
67121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_bsddb
67221ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_cd
67321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_cl
67421ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_dl
67521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_gl
67621ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_imgfile
67721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_largefile
67821ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_linuxaudiodev
67921ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_minidom
68021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_nis
68121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_ntpath
68221ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_openpty
68321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_pyexpat
68421ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sax
68521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_socketserver
68621ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sunaudiodev
68721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sundry
68821ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_unicode_file
68921ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        """,
69021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis    'sco_sv3':
69121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        """
69221ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_al
69321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_asynchat
69421ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_bsddb
69521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_cd
69621ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_cl
69721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_dl
69821ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_fork1
69921ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_gettext
70021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_gl
70121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_imgfile
70221ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_largefile
70321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_linuxaudiodev
70421ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_locale
70521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_minidom
70621ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_nis
70721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_ntpath
70821ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_openpty
70921ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_pyexpat
71021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_queue
71121ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sax
71221ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_socketserver
71321ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sunaudiodev
71421ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_sundry
71521ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_thread
71621ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_threaded_import
71721ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_threadedtempfile
71821ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_threading
71921ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        test_unicode_file
72021ee4091e10c6f05360bbb60e49aa3639408a612Martin v. Löwis        """,
721e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum    'riscos':
722e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        """
723e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_al
724e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_asynchat
725e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_bsddb
726e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_cd
727e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_cl
728e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_commands
729e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_crypt
730e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_dbm
731e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_dl
732e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_fcntl
733e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_fork1
734e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_gdbm
735e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_gl
736e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_grp
737e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_imgfile
738e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_largefile
739e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_linuxaudiodev
740e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_locale
741e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_mmap
742e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_nis
743e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_ntpath
744e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_openpty
745e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_poll
746e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_popen2
747e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_pty
748e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_pwd
749e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_socketserver
750e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_strop
751e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_sunaudiodev
752e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_sundry
753e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_thread
754e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threaded_import
755e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threadedtempfile
756e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_threading
757e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_timing
758e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        test_unicode_file
759e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        """,
7608a97f4a380a7a356730e48406f8269c3efe5e6ebJack Jansen    'darwin':
761398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        """
762398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_al
763acda3394bbfb1db3b22673a80cb2d7e3c68b3da9Jack Jansen        test_bsddb
7649d4270070a5d0c3bcd381d52024d811f3b0a0e39Guido van Rossum        test_bsddb3
765398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_cd
766398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_cl
767398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_curses
768398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_dl
7699d4270070a5d0c3bcd381d52024d811f3b0a0e39Guido van Rossum        test_email_codecs
770398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_gdbm
771398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_gl
772398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_imgfile
773398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_largefile
774398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_linuxaudiodev
775acda3394bbfb1db3b22673a80cb2d7e3c68b3da9Jack Jansen        test_locale
776398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_minidom
7779d4270070a5d0c3bcd381d52024d811f3b0a0e39Guido van Rossum        test_mpz
778398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_nis
779398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_ntpath
780acda3394bbfb1db3b22673a80cb2d7e3c68b3da9Jack Jansen        test_ossaudiodev
781398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_poll
782f839c27027ee0656319b7d7033d898e5b559c96bJack Jansen        test_socketserver
783398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        test_sunaudiodev
784f839c27027ee0656319b7d7033d898e5b559c96bJack Jansen        test_unicode_file
785398c236c1ba358a43a34137dc9ca670d76f7eb84Jack Jansen        """,
78611c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum    'sunos5':
78711c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        """
78811c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_al
78911c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_bsddb
79011c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_cd
79111c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_cl
79211c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_curses
79311c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_dbm
79411c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_email_codecs
79511c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_gdbm
79611c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_gl
79711c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_gzip
79811c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_imgfile
79911c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_linuxaudiodev
80011c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_mpz
80111c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_openpty
80211c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_socketserver
80311c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_zipfile
80411c3f0999f932e3697347dde15f99a8ad9f9216dGuido van Rossum        test_zlib
805ed375e18d10d37bfea1769aa1fe69795df6cbc10Jeremy Hylton        """,
806b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro    'hp-ux11':
807b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        """
808b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_al
809b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_bsddb
810b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_cd
811b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_cl
812b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_curses
813b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_dl
814b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gdbm
815b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gl
816b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_gzip
817b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_imgfile
818b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_largefile
819b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_linuxaudiodev
820b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_locale
821b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_minidom
822b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_nis
823b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_ntpath
824b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_openpty
825b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_pyexpat
826b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_sax
827b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_socketserver
828b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_sunaudiodev
829b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_unicode_file
830b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_zipfile
831b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        test_zlib
832b32302176e127a94b714f90c858b6e9c476fc7feSkip Montanaro        """,
833f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis    'atheos':
834c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        """
835c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_al
836c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_cd
837c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_cl
838c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_curses
839c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_dl
840c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_email_codecs
841c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_gdbm
842c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_gl
843c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_imgfile
844c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_largefile
845c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_linuxaudiodev
846c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_locale
847c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_mhlib
848c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_mmap
849c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_mpz
850c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_nis
851c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_poll
852c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_popen2
853c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_resource
854c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_socketserver
855c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_sunaudiodev
856c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        test_unicode_file
857c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters        """,
85825115940604e6051aa2fb16be88c6b8f64577251Jason Tishler    'cygwin':
85925115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        """
86025115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_al
861b0f89e05ad9aaf229033bbc81be43c1f826e3930Tim Peters        test_bsddb3
86225115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_cd
86325115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_cl
86425115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_curses
86525115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_dbm
86625115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_email_codecs
86725115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_gl
86825115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_imgfile
86925115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_largefile
87025115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_linuxaudiodev
87125115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_locale
87225115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_mpz
87325115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_nis
8745c4ded2c3b59aa134b82ab17cdfe7ab633194ca6Jason Tishler        test_ossaudiodev
87525115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_socketserver
87625115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_sunaudiodev
87725115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        test_unicode_file
87825115940604e6051aa2fb16be88c6b8f64577251Jason Tishler        """,
879fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre    'os2emx':
880fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        """
881fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_al
882fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_audioop
883fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_bsddb3
884fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_cd
885fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_cl
886fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_commands
887fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_curses
888fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_dl
889fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_email_codecs
890fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_gl
89140e1ce4d73f8843b937465e93f639c00b0a73597Tim Peters        test_iconv_codecs
892fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_imgfile
893fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_largefile
894fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_linuxaudiodev
895fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_mhlib
896fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_mmap
897fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_nis
898fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_openpty
899fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_ossaudiodev
900fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_pty
901fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_resource
902fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_signal
903fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_sunaudiodev
904fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        test_unicode_file
905fd07e7dda709edacc16a851da981a628d61ffd72Andrew MacIntyre        """,
906f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum}
907f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum
908b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Petersclass _ExpectedSkips:
909b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def __init__(self):
9102a182dbf3f2520ad753792068391775d102b13dfTim Peters        import os.path
9111b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters        from test import test_normalization
912b4ee4eb3b308d55bd0d8d5a1abb2015950934c77Tim Peters        from test import test_socket_ssl
9131b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters
9147c7efe90737d4636633127a95a6cab1a55d57cf4Tim Peters        self.valid = False
915de14a30d1d70073d36f207fe432e4adad5178399Tim Peters        if sys.platform in _expectations:
916f73e30c3e3ba6f2779eadf6bf4c21c6bf3e4c075Guido van Rossum            s = _expectations[sys.platform]
9177c7efe90737d4636633127a95a6cab1a55d57cf4Tim Peters            self.expected = Set(s.split())
9181b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters
9192a182dbf3f2520ad753792068391775d102b13dfTim Peters            if not os.path.supports_unicode_filenames:
9202a182dbf3f2520ad753792068391775d102b13dfTim Peters                self.expected.add('test_pep277')
9211b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters
9221b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters            if test_normalization.skip_expected:
9231b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters                self.expected.add('test_normalization')
9241b445d3fcfcc06e5360e83b978efdb9b1c980278Tim Peters
925b4ee4eb3b308d55bd0d8d5a1abb2015950934c77Tim Peters            if test_socket_ssl.skip_expected:
926b4ee4eb3b308d55bd0d8d5a1abb2015950934c77Tim Peters                self.expected.add('test_socket_ssl')
927b4ee4eb3b308d55bd0d8d5a1abb2015950934c77Tim Peters
9286afc5e02fa775517fa0b6455906a8c203baf9cd2Jack Jansen            if not sys.platform in ("mac", "darwin"):
929ecd79eb7dbde19ea2adbf2a912caa5b284b477b9Tim Peters                self.expected.add("test_macostools")
930ecd79eb7dbde19ea2adbf2a912caa5b284b477b9Tim Peters                self.expected.add("test_macfs")
9316afc5e02fa775517fa0b6455906a8c203baf9cd2Jack Jansen                self.expected.add("test_aepack")
932ecd79eb7dbde19ea2adbf2a912caa5b284b477b9Tim Peters
933ecd79eb7dbde19ea2adbf2a912caa5b284b477b9Tim Peters            if sys.platform != "win32":
934ecd79eb7dbde19ea2adbf2a912caa5b284b477b9Tim Peters                self.expected.add("test_winreg")
935ecd79eb7dbde19ea2adbf2a912caa5b284b477b9Tim Peters                self.expected.add("test_winsound")
936f2715e076435b74638acb81512c2ee014f75aea2Tim Peters
9377c7efe90737d4636633127a95a6cab1a55d57cf4Tim Peters            self.valid = True
938b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
939b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def isvalid(self):
940b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        "Return true iff _ExpectedSkips knows about the current platform."
941b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.valid
942b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
943b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters    def getexpected(self):
944b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """Return set of test names we expect to skip on current platform.
945b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
946b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        self.isvalid() must be true.
947b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        """
948b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
949b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        assert self.isvalid()
950b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters        return self.expected
951b5b7b78414e5f1a42ab4205c110626c9cd7a79b9Tim Peters
952152494aea24669a3d74460fa460a4ed45696bc75Guido van Rossumif __name__ == '__main__':
953408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # Remove regrtest.py's own directory from the module search path.  This
954408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # prevents relative imports from working, and relative imports will screw
955408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # up the testing framework.  E.g. if both test.test_support and
956408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # test_support are imported, they will not contain the same globals, and
957408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # much of the testing framework relies on the globals in the
958408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    # test.test_support module.
959408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
960408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    i = pathlen = len(sys.path)
961408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    while i >= 0:
962408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        i -= 1
963408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
964408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw            del sys.path[i]
965408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw    if len(sys.path) == pathlen:
966408b6d34de2b1a6ba690557def435adce9314184Barry Warsaw        print 'Could not find %r in sys.path to remove it' % mydir
96708fca5212528e073600c27c70a34eeef445f393bBarry Warsaw    main()
968