1996-12-19 23:12:20 -04:00
|
|
|
#! /usr/bin/env python
|
|
|
|
|
2008-05-05 14:54:01 -03:00
|
|
|
"""Regression test.
|
1996-12-19 23:12:20 -04:00
|
|
|
|
|
|
|
This will find all modules whose name is "test_*" in the test
|
|
|
|
directory, and run them. Various command line options provide
|
|
|
|
additional facilities.
|
|
|
|
|
|
|
|
Command line options:
|
|
|
|
|
2009-10-27 17:55:44 -03:00
|
|
|
-h/--help -- print this text and exit
|
|
|
|
|
|
|
|
Verbosity
|
|
|
|
|
|
|
|
-v/--verbose -- run tests in verbose mode with output to stdout
|
|
|
|
-w/--verbose2 -- re-run failed tests in verbose mode
|
|
|
|
-W/--verbose3 -- re-run failed tests in verbose mode immediately
|
|
|
|
-q/--quiet -- don't print anything except if a test fails
|
|
|
|
-S/--slow -- print the slowest 10 tests
|
|
|
|
|
|
|
|
Selecting tests
|
|
|
|
|
|
|
|
-r/--random -- randomize test execution order
|
|
|
|
-f/--fromfile -- read names of tests to run from a file (see below)
|
|
|
|
-x/--exclude -- arguments are tests to *exclude*
|
|
|
|
-s/--single -- run only a single test (see below)
|
|
|
|
-u/--use RES1,RES2,...
|
|
|
|
-- specify which special resource intensive tests to run
|
|
|
|
-M/--memlimit LIMIT
|
|
|
|
-- run very large memory-consuming tests
|
|
|
|
|
|
|
|
Special runs
|
|
|
|
|
|
|
|
-l/--findleaks -- if GC is available detect tests that leak memory
|
|
|
|
-L/--runleaks -- run the leaks(1) command just before exit
|
|
|
|
-R/--huntrleaks RUNCOUNTS
|
|
|
|
-- search for reference leaks (needs debug build, v. slow)
|
|
|
|
-j/--multiprocess PROCESSES
|
|
|
|
-- run PROCESSES processes at once
|
|
|
|
-T/--coverage -- turn on code coverage using the trace module
|
|
|
|
-D/--coverdir DIRECTORY
|
|
|
|
-- Directory where coverage files are put
|
|
|
|
-N/--nocoverdir -- Put coverage files alongside modules
|
|
|
|
-t/--threshold THRESHOLD
|
|
|
|
-- call gc.set_threshold(THRESHOLD)
|
2009-11-14 11:18:22 -04:00
|
|
|
-F/--forever -- run the selected tests in a loop, until an error happens
|
1996-12-19 23:12:20 -04:00
|
|
|
|
|
|
|
If non-option arguments are present, they are names for tests to run,
|
|
|
|
unless -x is given, in which case they are names for tests not to run.
|
|
|
|
If no test names are given, all tests are run.
|
1997-03-07 17:04:33 -04:00
|
|
|
|
2009-03-29 00:44:19 -03:00
|
|
|
-r randomizes test execution order. You can use --randseed=int to provide a
|
|
|
|
int seed value for the randomizer; this is useful for reproducing troublesome
|
|
|
|
test orders.
|
|
|
|
|
2004-02-07 18:43:03 -04:00
|
|
|
-T turns on code coverage tracing with the trace module.
|
|
|
|
|
2004-11-12 14:51:27 -04:00
|
|
|
-D specifies the directory where coverage files are put.
|
|
|
|
|
|
|
|
-N Put coverage files alongside modules.
|
|
|
|
|
2002-06-07 12:17:03 -03:00
|
|
|
-s means to run only a single test and exit. This is useful when
|
|
|
|
doing memory analysis on the Python interpreter (which tend to consume
|
|
|
|
too many resources to run the full regression test non-stop). The
|
|
|
|
file /tmp/pynexttest is read to find the next test to run. If this
|
|
|
|
file is missing, the first test_*.py file in testdir or on the command
|
|
|
|
line is used. (actually tempfile.gettempdir() is used instead of
|
|
|
|
/tmp).
|
1999-01-28 15:51:51 -04:00
|
|
|
|
2002-06-07 12:17:03 -03:00
|
|
|
-f reads the names of tests from the file given as f's argument, one
|
|
|
|
or more test names per line. Whitespace is ignored. Blank lines and
|
|
|
|
lines beginning with '#' are ignored. This is especially useful for
|
|
|
|
whittling down failures involving interactions among tests.
|
2002-06-02 18:42:01 -03:00
|
|
|
|
2004-06-06 12:53:18 -03:00
|
|
|
-L causes the leaks(1) command to be run just before exit if it exists.
|
|
|
|
leaks(1) is available on Mac OS X and presumably on some other
|
|
|
|
FreeBSD-derived systems.
|
|
|
|
|
2004-08-03 08:33:28 -03:00
|
|
|
-R runs each test several times and examines sys.gettotalrefcount() to
|
|
|
|
see if the test appears to be leaking references. The argument should
|
|
|
|
be of the form stab:run:fname where 'stab' is the number of times the
|
|
|
|
test is run to let gettotalrefcount settle down, 'run' is the number
|
|
|
|
of times further it is run and 'fname' is the name of the file the
|
|
|
|
reports are written to. These parameters all have defaults (5, 4 and
|
|
|
|
"reflog.txt" respectively), so the minimal invocation is '-R ::'.
|
|
|
|
|
2006-04-26 12:53:30 -03:00
|
|
|
-M runs tests that require an exorbitant amount of memory. These tests
|
|
|
|
typically try to ascertain containers keep working when containing more than
|
2006-08-09 12:37:26 -03:00
|
|
|
2 billion objects, which only works on 64-bit systems. There are also some
|
|
|
|
tests that try to exhaust the address space of the process, which only makes
|
|
|
|
sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
|
2006-04-26 12:53:30 -03:00
|
|
|
which is a string in the form of '2.5Gb', determines howmuch memory the
|
|
|
|
tests will limit themselves to (but they may go slightly over.) The number
|
|
|
|
shouldn't be more memory than the machine has (including swap memory). You
|
|
|
|
should also keep in mind that swap memory is generally much, much slower
|
|
|
|
than RAM, and setting memlimit to all available RAM or higher will heavily
|
|
|
|
tax the machine. On the other hand, it is no use running these tests with a
|
|
|
|
limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
|
|
|
|
to use more than memlimit memory will be skipped. The big-memory tests
|
|
|
|
generally run very, very long.
|
|
|
|
|
2002-06-07 12:17:03 -03:00
|
|
|
-u is used to specify which special resource intensive tests to run,
|
|
|
|
such as those requiring large file support or network connectivity.
|
|
|
|
The argument is a comma-separated list of words indicating the
|
|
|
|
resources to test. Currently only the following are defined:
|
2001-08-20 19:33:46 -03:00
|
|
|
|
2002-04-11 13:39:16 -03:00
|
|
|
all - Enable all special resources.
|
|
|
|
|
2003-03-11 10:46:48 -04:00
|
|
|
audio - Tests that use the audio device. (There are known
|
|
|
|
cases of broken audio drivers that can crash Python or
|
|
|
|
even the Linux kernel.)
|
|
|
|
|
2001-10-22 12:26:09 -03:00
|
|
|
curses - Tests that use curses and will modify the terminal's
|
|
|
|
state and output modes.
|
2001-10-30 01:56:40 -04:00
|
|
|
|
2002-06-07 12:17:03 -03:00
|
|
|
largefile - It is okay to run some test that may create huge
|
|
|
|
files. These tests can take a long time and may
|
|
|
|
consume >2GB of disk space temporarily.
|
2001-08-20 19:33:46 -03:00
|
|
|
|
2002-06-07 12:17:03 -03:00
|
|
|
network - It is okay to run tests that use external network
|
|
|
|
resource, e.g. testing SSL support for sockets.
|
2002-11-19 13:47:07 -04:00
|
|
|
|
|
|
|
bsddb - It is okay to run the bsddb testsuite, which takes
|
|
|
|
a long time to complete.
|
2002-11-26 17:44:56 -04:00
|
|
|
|
2004-07-01 08:01:35 -03:00
|
|
|
decimal - Test the decimal module against a large suite that
|
|
|
|
verifies compliance with standards.
|
|
|
|
|
2004-08-07 16:25:33 -03:00
|
|
|
compiler - Test the compiler package by compiling all the source
|
|
|
|
in the standard library and test suite. This takes
|
2005-06-10 08:05:19 -03:00
|
|
|
a long time. Enabling this resource also allows
|
|
|
|
test_tokenize to verify round-trip lexing on every
|
|
|
|
file in the test library.
|
2004-08-07 16:25:33 -03:00
|
|
|
|
2005-03-27 21:08:02 -04:00
|
|
|
subprocess Run all tests for the subprocess module.
|
2005-03-03 16:47:37 -04:00
|
|
|
|
2005-12-10 13:44:27 -04:00
|
|
|
urlfetch - It is okay to download files required on testing.
|
|
|
|
|
2009-01-28 16:03:26 -04:00
|
|
|
gui - Run tests that require a running GUI.
|
|
|
|
|
2009-04-09 13:46:46 -03:00
|
|
|
xpickle - Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
|
|
|
|
test backwards compatibility. These tests take a long time
|
|
|
|
to run.
|
|
|
|
|
2002-11-26 17:44:56 -04:00
|
|
|
To enable all resources except one, use '-uall,-<resource>'. For
|
|
|
|
example, to run all the tests except for the bsddb tests, give the
|
|
|
|
option '-uall,-bsddb'.
|
1996-12-19 23:12:20 -04:00
|
|
|
"""
|
|
|
|
|
2008-03-18 02:45:40 -03:00
|
|
|
import cStringIO
|
1996-12-19 23:12:20 -04:00
|
|
|
import getopt
|
2009-11-14 11:18:22 -04:00
|
|
|
import itertools
|
2010-01-08 15:04:16 -04:00
|
|
|
import json
|
2008-03-18 02:45:40 -03:00
|
|
|
import os
|
2000-06-30 13:39:27 -03:00
|
|
|
import random
|
2006-03-16 02:30:02 -04:00
|
|
|
import re
|
2008-03-18 02:45:40 -03:00
|
|
|
import sys
|
|
|
|
import time
|
2004-02-07 18:43:03 -04:00
|
|
|
import traceback
|
2008-03-18 02:45:40 -03:00
|
|
|
import warnings
|
2009-03-26 17:48:25 -03:00
|
|
|
import unittest
|
2002-08-12 18:55:51 -03:00
|
|
|
|
1996-12-19 23:12:20 -04:00
|
|
|
|
2006-04-27 20:13:20 -03:00
|
|
|
# Ignore ImportWarnings that only occur in the source tree,
|
|
|
|
# (because of modules with the same name as source-directories in Modules/)
|
2006-04-27 20:41:27 -03:00
|
|
|
for mod in ("ctypes", "gzip", "zipfile", "tarfile", "encodings.zlib_codec",
|
|
|
|
"test.test_zipimport", "test.test_zlib", "test.test_zipfile",
|
|
|
|
"test.test_codecs", "test.string_tests"):
|
2006-04-27 20:13:20 -03:00
|
|
|
warnings.filterwarnings(module=".*%s$" % (mod,),
|
|
|
|
action="ignore", category=ImportWarning)
|
|
|
|
|
2002-12-02 05:56:21 -04:00
|
|
|
# MacOSX (a.k.a. Darwin) has a default stack size that is too small
|
|
|
|
# for deeply recursive regular expressions. We see this as crashes in
|
|
|
|
# the Python test suite when running test_re.py and test_sre.py. The
|
|
|
|
# fix is to set the stack limit to 2048.
|
|
|
|
# This approach may also be useful for other Unixy platforms that
|
|
|
|
# suffer from small default stack limits.
|
|
|
|
if sys.platform == 'darwin':
|
|
|
|
try:
|
|
|
|
import resource
|
|
|
|
except ImportError:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
|
|
|
|
newsoft = min(hard, max(soft, 1024*2048))
|
|
|
|
resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
|
|
|
|
|
2009-10-29 17:53:00 -03:00
|
|
|
# Test result constants.
|
|
|
|
PASSED = 1
|
|
|
|
FAILED = 0
|
|
|
|
ENV_CHANGED = -1
|
|
|
|
SKIPPED = -2
|
|
|
|
RESOURCE_DENIED = -3
|
|
|
|
INTERRUPTED = -4
|
|
|
|
|
2002-07-23 16:04:11 -03:00
|
|
|
from test import test_support
|
2002-04-11 13:39:16 -03:00
|
|
|
|
2008-07-18 11:26:35 -03:00
|
|
|
RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
|
2009-04-09 13:46:46 -03:00
|
|
|
'decimal', 'compiler', 'subprocess', 'urlfetch', 'gui',
|
|
|
|
'xpickle')
|
2002-04-11 13:39:16 -03:00
|
|
|
|
|
|
|
|
2001-08-20 19:33:46 -03:00
|
|
|
def usage(code, msg=''):
|
|
|
|
print __doc__
|
|
|
|
if msg: print msg
|
|
|
|
sys.exit(code)
|
|
|
|
|
|
|
|
|
2008-03-29 10:14:52 -03:00
|
|
|
def main(tests=None, testdir=None, verbose=0, quiet=False,
|
2004-02-07 18:43:03 -04:00
|
|
|
exclude=False, single=False, randomize=False, fromfile=None,
|
2004-11-12 14:51:27 -04:00
|
|
|
findleaks=False, use_resources=None, trace=False, coverdir='coverage',
|
2009-03-29 00:44:19 -03:00
|
|
|
runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
|
2009-11-14 11:18:22 -04:00
|
|
|
random_seed=None, use_mp=None, verbose3=False, forever=False):
|
1998-08-01 14:04:08 -03:00
|
|
|
"""Execute a test suite.
|
|
|
|
|
2000-07-16 09:04:32 -03:00
|
|
|
This also parses command-line options and modifies its behavior
|
2000-10-23 14:22:08 -03:00
|
|
|
accordingly.
|
1998-08-01 14:04:08 -03:00
|
|
|
|
|
|
|
tests -- a list of strings containing test names (optional)
|
|
|
|
testdir -- the directory in which to look for tests (optional)
|
|
|
|
|
|
|
|
Users other than the Python test suite will certainly want to
|
|
|
|
specify testdir; if it's omitted, the directory containing the
|
2000-10-23 14:22:08 -03:00
|
|
|
Python test suite is searched for.
|
1998-08-01 14:04:08 -03:00
|
|
|
|
|
|
|
If the tests argument is omitted, the tests listed on the
|
|
|
|
command-line will be used. If that's empty, too, then all *.py
|
|
|
|
files beginning with test_ will be used.
|
2000-06-30 13:39:27 -03:00
|
|
|
|
2008-03-29 10:14:52 -03:00
|
|
|
The other default arguments (verbose, quiet, exclude,
|
2009-03-29 00:44:19 -03:00
|
|
|
single, randomize, findleaks, use_resources, trace, coverdir, print_slow and
|
|
|
|
random_seed) allow programmers calling main() directly to set the
|
2008-03-18 02:45:40 -03:00
|
|
|
values that would normally be set by flags on the command line.
|
1998-08-01 14:04:08 -03:00
|
|
|
"""
|
2000-10-23 14:22:08 -03:00
|
|
|
|
2001-09-25 17:05:11 -03:00
|
|
|
test_support.record_original_stdout(sys.stdout)
|
1996-12-19 23:12:20 -04:00
|
|
|
try:
|
2009-11-14 20:07:00 -04:00
|
|
|
opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:',
|
2009-10-27 17:52:02 -03:00
|
|
|
['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
|
|
|
|
'exclude', 'single', 'slow', 'random', 'fromfile', 'findleaks',
|
|
|
|
'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
|
|
|
|
'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
|
2009-11-14 11:18:22 -04:00
|
|
|
'multiprocess=', 'slaveargs=', 'forever'])
|
1996-12-19 23:12:20 -04:00
|
|
|
except getopt.error, msg:
|
2001-08-20 19:33:46 -03:00
|
|
|
usage(2, msg)
|
|
|
|
|
|
|
|
# Defaults
|
2009-03-29 00:44:19 -03:00
|
|
|
if random_seed is None:
|
|
|
|
random_seed = random.randrange(10000000)
|
2001-08-20 19:33:46 -03:00
|
|
|
if use_resources is None:
|
|
|
|
use_resources = []
|
1996-12-19 23:12:20 -04:00
|
|
|
for o, a in opts:
|
2001-08-20 19:33:46 -03:00
|
|
|
if o in ('-h', '--help'):
|
|
|
|
usage(0)
|
|
|
|
elif o in ('-v', '--verbose'):
|
|
|
|
verbose += 1
|
2006-03-10 17:26:16 -04:00
|
|
|
elif o in ('-w', '--verbose2'):
|
|
|
|
verbose2 = True
|
2009-10-27 17:52:02 -03:00
|
|
|
elif o in ('-W', '--verbose3'):
|
|
|
|
verbose3 = True
|
2001-08-20 19:33:46 -03:00
|
|
|
elif o in ('-q', '--quiet'):
|
2004-02-07 18:43:03 -04:00
|
|
|
quiet = True;
|
2001-08-20 19:33:46 -03:00
|
|
|
verbose = 0
|
|
|
|
elif o in ('-x', '--exclude'):
|
2004-02-07 18:43:03 -04:00
|
|
|
exclude = True
|
2001-08-20 19:33:46 -03:00
|
|
|
elif o in ('-s', '--single'):
|
2004-02-07 18:43:03 -04:00
|
|
|
single = True
|
2008-03-18 02:45:40 -03:00
|
|
|
elif o in ('-S', '--slow'):
|
|
|
|
print_slow = True
|
2001-08-20 19:33:46 -03:00
|
|
|
elif o in ('-r', '--randomize'):
|
2004-02-07 18:43:03 -04:00
|
|
|
randomize = True
|
2009-03-29 00:44:19 -03:00
|
|
|
elif o == '--randseed':
|
|
|
|
random_seed = int(a)
|
2002-06-02 18:42:01 -03:00
|
|
|
elif o in ('-f', '--fromfile'):
|
|
|
|
fromfile = a
|
2001-08-20 19:33:46 -03:00
|
|
|
elif o in ('-l', '--findleaks'):
|
2004-02-07 18:43:03 -04:00
|
|
|
findleaks = True
|
2004-06-06 12:53:18 -03:00
|
|
|
elif o in ('-L', '--runleaks'):
|
|
|
|
runleaks = True
|
2002-06-07 12:17:03 -03:00
|
|
|
elif o in ('-t', '--threshold'):
|
|
|
|
import gc
|
|
|
|
gc.set_threshold(int(a))
|
2004-02-07 18:43:03 -04:00
|
|
|
elif o in ('-T', '--coverage'):
|
|
|
|
trace = True
|
2004-11-12 14:51:27 -04:00
|
|
|
elif o in ('-D', '--coverdir'):
|
|
|
|
coverdir = os.path.join(os.getcwd(), a)
|
|
|
|
elif o in ('-N', '--nocoverdir'):
|
|
|
|
coverdir = None
|
2004-08-03 08:33:28 -03:00
|
|
|
elif o in ('-R', '--huntrleaks'):
|
|
|
|
huntrleaks = a.split(':')
|
|
|
|
if len(huntrleaks) != 3:
|
|
|
|
print a, huntrleaks
|
|
|
|
usage(2, '-R takes three colon-separated arguments')
|
|
|
|
if len(huntrleaks[0]) == 0:
|
|
|
|
huntrleaks[0] = 5
|
|
|
|
else:
|
|
|
|
huntrleaks[0] = int(huntrleaks[0])
|
|
|
|
if len(huntrleaks[1]) == 0:
|
|
|
|
huntrleaks[1] = 4
|
|
|
|
else:
|
|
|
|
huntrleaks[1] = int(huntrleaks[1])
|
|
|
|
if len(huntrleaks[2]) == 0:
|
|
|
|
huntrleaks[2] = "reflog.txt"
|
2006-04-26 12:53:30 -03:00
|
|
|
elif o in ('-M', '--memlimit'):
|
|
|
|
test_support.set_memlimit(a)
|
2001-08-20 19:33:46 -03:00
|
|
|
elif o in ('-u', '--use'):
|
2001-09-06 13:09:41 -03:00
|
|
|
u = [x.lower() for x in a.split(',')]
|
|
|
|
for r in u:
|
2002-04-11 13:39:16 -03:00
|
|
|
if r == 'all':
|
2002-11-26 17:44:56 -04:00
|
|
|
use_resources[:] = RESOURCE_NAMES
|
|
|
|
continue
|
|
|
|
remove = False
|
|
|
|
if r[0] == '-':
|
|
|
|
remove = True
|
|
|
|
r = r[1:]
|
2002-04-11 13:39:16 -03:00
|
|
|
if r not in RESOURCE_NAMES:
|
|
|
|
usage(1, 'Invalid -u/--use option: ' + a)
|
2002-11-26 17:44:56 -04:00
|
|
|
if remove:
|
|
|
|
if r in use_resources:
|
|
|
|
use_resources.remove(r)
|
|
|
|
elif r not in use_resources:
|
2002-04-30 09:11:04 -03:00
|
|
|
use_resources.append(r)
|
2009-11-14 11:18:22 -04:00
|
|
|
elif o in ('-F', '--forever'):
|
|
|
|
forever = True
|
2009-05-31 11:20:14 -03:00
|
|
|
elif o in ('-j', '--multiprocess'):
|
|
|
|
use_mp = int(a)
|
|
|
|
elif o == '--slaveargs':
|
|
|
|
args, kwargs = json.loads(a)
|
|
|
|
try:
|
|
|
|
result = runtest(*args, **kwargs)
|
|
|
|
except BaseException, e:
|
2009-10-29 17:53:00 -03:00
|
|
|
result = INTERRUPTED, e.__class__.__name__
|
2009-05-31 11:20:14 -03:00
|
|
|
print # Force a newline (just in case)
|
|
|
|
print json.dumps(result)
|
|
|
|
sys.exit(0)
|
2009-11-14 20:04:32 -04:00
|
|
|
else:
|
|
|
|
print >>sys.stderr, ("No handler for option {}. Please "
|
|
|
|
"report this as a bug at http://bugs.python.org.").format(o)
|
|
|
|
sys.exit(1)
|
2002-06-02 18:42:01 -03:00
|
|
|
if single and fromfile:
|
|
|
|
usage(2, "-s and -f don't go together!")
|
2009-05-31 11:20:14 -03:00
|
|
|
if use_mp and trace:
|
|
|
|
usage(2, "-T and -j don't go together!")
|
|
|
|
if use_mp and findleaks:
|
|
|
|
usage(2, "-l and -j don't go together!")
|
2001-08-20 19:33:46 -03:00
|
|
|
|
1996-12-19 23:12:20 -04:00
|
|
|
good = []
|
|
|
|
bad = []
|
|
|
|
skipped = []
|
2003-02-03 11:19:30 -04:00
|
|
|
resource_denieds = []
|
2009-10-14 10:58:07 -03:00
|
|
|
environment_changed = []
|
1999-01-28 15:51:51 -04:00
|
|
|
|
2000-09-22 12:29:28 -03:00
|
|
|
if findleaks:
|
2000-08-03 12:50:37 -03:00
|
|
|
try:
|
|
|
|
import gc
|
|
|
|
except ImportError:
|
2000-10-12 22:32:42 -03:00
|
|
|
print 'No GC available, disabling findleaks.'
|
2004-02-07 18:43:03 -04:00
|
|
|
findleaks = False
|
2000-08-03 12:50:37 -03:00
|
|
|
else:
|
2000-10-12 22:32:42 -03:00
|
|
|
# Uncomment the line below to report garbage that is not
|
|
|
|
# freeable by reference counting alone. By default only
|
|
|
|
# garbage that is not collectable by the GC is reported.
|
|
|
|
#gc.set_debug(gc.DEBUG_SAVEALL)
|
2000-09-22 12:29:28 -03:00
|
|
|
found_garbage = []
|
2000-08-03 12:50:37 -03:00
|
|
|
|
1999-01-28 15:51:51 -04:00
|
|
|
if single:
|
|
|
|
from tempfile import gettempdir
|
|
|
|
filename = os.path.join(gettempdir(), 'pynexttest')
|
|
|
|
try:
|
|
|
|
fp = open(filename, 'r')
|
2009-11-14 11:18:22 -04:00
|
|
|
next_test = fp.read().strip()
|
|
|
|
tests = [next_test]
|
1999-01-28 15:51:51 -04:00
|
|
|
fp.close()
|
|
|
|
except IOError:
|
|
|
|
pass
|
2002-06-02 18:42:01 -03:00
|
|
|
|
|
|
|
if fromfile:
|
|
|
|
tests = []
|
|
|
|
fp = open(fromfile)
|
|
|
|
for line in fp:
|
|
|
|
guts = line.split() # assuming no test has whitespace in its name
|
|
|
|
if guts and not guts[0].startswith('#'):
|
|
|
|
tests.extend(guts)
|
|
|
|
fp.close()
|
|
|
|
|
|
|
|
# Strip .py extensions.
|
|
|
|
if args:
|
|
|
|
args = map(removepy, args)
|
|
|
|
if tests:
|
|
|
|
tests = map(removepy, tests)
|
|
|
|
|
1998-08-25 09:29:08 -03:00
|
|
|
stdtests = STDTESTS[:]
|
|
|
|
nottests = NOTTESTS[:]
|
1996-12-19 23:12:20 -04:00
|
|
|
if exclude:
|
1998-08-25 09:29:08 -03:00
|
|
|
for arg in args:
|
|
|
|
if arg in stdtests:
|
|
|
|
stdtests.remove(arg)
|
|
|
|
nottests[:0] = args
|
1998-03-26 15:42:58 -04:00
|
|
|
args = []
|
2009-12-16 07:49:46 -04:00
|
|
|
alltests = findtests(testdir, stdtests, nottests)
|
|
|
|
tests = tests or args or alltests
|
1999-01-28 15:51:51 -04:00
|
|
|
if single:
|
|
|
|
tests = tests[:1]
|
2009-12-16 07:49:46 -04:00
|
|
|
try:
|
|
|
|
next_single_test = alltests[alltests.index(tests[0])+1]
|
|
|
|
except IndexError:
|
|
|
|
next_single_test = None
|
2000-06-30 13:39:27 -03:00
|
|
|
if randomize:
|
2009-03-29 00:44:19 -03:00
|
|
|
random.seed(random_seed)
|
|
|
|
print "Using random seed", random_seed
|
2000-06-30 13:39:27 -03:00
|
|
|
random.shuffle(tests)
|
2004-02-07 18:43:03 -04:00
|
|
|
if trace:
|
|
|
|
import trace
|
|
|
|
tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
|
|
|
|
trace=False, count=True)
|
2009-11-14 11:18:22 -04:00
|
|
|
|
2008-03-18 02:45:40 -03:00
|
|
|
test_times = []
|
2001-08-20 19:33:46 -03:00
|
|
|
test_support.use_resources = use_resources
|
2000-04-21 18:35:06 -03:00
|
|
|
save_modules = sys.modules.keys()
|
2009-05-31 11:20:14 -03:00
|
|
|
|
|
|
|
def accumulate_result(test, result):
|
|
|
|
ok, test_time = result
|
|
|
|
test_times.append((test_time, test))
|
2009-10-29 17:53:00 -03:00
|
|
|
if ok == PASSED:
|
2009-05-31 11:20:14 -03:00
|
|
|
good.append(test)
|
2009-10-29 17:53:00 -03:00
|
|
|
elif ok == FAILED:
|
2009-05-31 11:20:14 -03:00
|
|
|
bad.append(test)
|
2009-10-29 17:53:00 -03:00
|
|
|
elif ok == ENV_CHANGED:
|
|
|
|
bad.append(test)
|
|
|
|
environment_changed.append(test)
|
|
|
|
elif ok == SKIPPED:
|
|
|
|
skipped.append(test)
|
|
|
|
elif ok == RESOURCE_DENIED:
|
2009-05-31 11:20:14 -03:00
|
|
|
skipped.append(test)
|
2009-10-29 17:53:00 -03:00
|
|
|
resource_denieds.append(test)
|
2009-05-31 11:20:14 -03:00
|
|
|
|
2009-11-14 11:18:22 -04:00
|
|
|
if forever:
|
|
|
|
def test_forever(tests=list(tests)):
|
|
|
|
while True:
|
|
|
|
for test in tests:
|
|
|
|
yield test
|
|
|
|
if bad:
|
|
|
|
return
|
|
|
|
tests = test_forever()
|
|
|
|
else:
|
|
|
|
tests = iter(tests)
|
|
|
|
|
2009-05-31 11:20:14 -03:00
|
|
|
if use_mp:
|
|
|
|
from threading import Thread
|
|
|
|
from Queue import Queue, Empty
|
|
|
|
from subprocess import Popen, PIPE, STDOUT
|
|
|
|
from collections import deque
|
|
|
|
debug_output_pat = re.compile(r"\[\d+ refs\]$")
|
|
|
|
pending = deque()
|
|
|
|
output = Queue()
|
2009-11-14 11:18:22 -04:00
|
|
|
def tests_and_args():
|
|
|
|
for test in tests:
|
|
|
|
args_tuple = (
|
|
|
|
(test, verbose, quiet, testdir),
|
|
|
|
dict(huntrleaks=huntrleaks, use_resources=use_resources)
|
|
|
|
)
|
|
|
|
yield (test, args_tuple)
|
|
|
|
pending = tests_and_args()
|
2009-05-31 11:20:14 -03:00
|
|
|
def work():
|
|
|
|
# A worker thread.
|
2006-02-28 14:05:43 -04:00
|
|
|
try:
|
2009-05-31 11:20:14 -03:00
|
|
|
while True:
|
|
|
|
try:
|
2009-11-14 11:18:22 -04:00
|
|
|
test, args_tuple = next(pending)
|
|
|
|
except StopIteration:
|
2009-10-18 18:12:37 -03:00
|
|
|
output.put((None, None, None, None))
|
2009-05-31 11:20:14 -03:00
|
|
|
return
|
2009-06-29 11:14:56 -03:00
|
|
|
# -E is needed by some tests, e.g. test_import
|
|
|
|
popen = Popen([sys.executable, '-E', '-m', 'test.regrtest',
|
2009-05-31 11:20:14 -03:00
|
|
|
'--slaveargs', json.dumps(args_tuple)],
|
2009-10-18 18:12:37 -03:00
|
|
|
stdout=PIPE, stderr=PIPE,
|
2009-05-31 11:20:14 -03:00
|
|
|
universal_newlines=True, close_fds=True)
|
2009-10-18 18:12:37 -03:00
|
|
|
stdout, stderr = popen.communicate()
|
|
|
|
# Strip last refcount output line if it exists, since it
|
|
|
|
# comes from the shutdown of the interpreter in the subcommand.
|
|
|
|
stderr = debug_output_pat.sub("", stderr)
|
|
|
|
stdout, _, result = stdout.strip().rpartition("\n")
|
2009-11-14 11:18:22 -04:00
|
|
|
if not result:
|
|
|
|
output.put((None, None, None, None))
|
|
|
|
return
|
2009-05-31 11:20:14 -03:00
|
|
|
result = json.loads(result)
|
2009-10-18 18:12:37 -03:00
|
|
|
if not quiet:
|
|
|
|
stdout = test+'\n'+stdout
|
|
|
|
output.put((test, stdout.rstrip(), stderr.rstrip(), result))
|
2009-05-31 11:20:14 -03:00
|
|
|
except BaseException:
|
2009-10-18 18:12:37 -03:00
|
|
|
output.put((None, None, None, None))
|
2006-02-28 14:05:43 -04:00
|
|
|
raise
|
2009-05-31 11:20:14 -03:00
|
|
|
workers = [Thread(target=work) for i in range(use_mp)]
|
|
|
|
for worker in workers:
|
|
|
|
worker.start()
|
|
|
|
finished = 0
|
2009-11-14 11:18:22 -04:00
|
|
|
try:
|
|
|
|
while finished < use_mp:
|
|
|
|
test, stdout, stderr, result = output.get()
|
|
|
|
if test is None:
|
|
|
|
finished += 1
|
|
|
|
continue
|
|
|
|
if stdout:
|
|
|
|
print stdout
|
|
|
|
if stderr:
|
|
|
|
print >>sys.stderr, stderr
|
|
|
|
if result[0] == INTERRUPTED:
|
|
|
|
assert result[1] == 'KeyboardInterrupt'
|
|
|
|
raise KeyboardInterrupt # What else?
|
|
|
|
accumulate_result(test, result)
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
pending.close()
|
2009-05-31 11:20:14 -03:00
|
|
|
for worker in workers:
|
|
|
|
worker.join()
|
|
|
|
else:
|
|
|
|
for test in tests:
|
|
|
|
if not quiet:
|
|
|
|
print test
|
|
|
|
sys.stdout.flush()
|
|
|
|
if trace:
|
|
|
|
# If we're tracing code coverage, then we don't exit with status
|
|
|
|
# if on a false return value from main.
|
|
|
|
tracer.runctx('runtest(test, verbose, quiet, testdir)',
|
|
|
|
globals=globals(), locals=vars())
|
2004-02-07 18:43:03 -04:00
|
|
|
else:
|
2009-05-31 11:20:14 -03:00
|
|
|
try:
|
|
|
|
result = runtest(test, verbose, quiet,
|
|
|
|
testdir, huntrleaks)
|
2009-10-29 17:53:00 -03:00
|
|
|
accumulate_result(test, result)
|
|
|
|
if verbose3 and result[0] == FAILED:
|
2009-10-27 17:52:02 -03:00
|
|
|
print "Re-running test %r in verbose mode" % test
|
|
|
|
runtest(test, True, quiet, testdir, huntrleaks)
|
2009-05-31 11:20:14 -03:00
|
|
|
except KeyboardInterrupt:
|
|
|
|
# print a newline separate from the ^C
|
|
|
|
print
|
|
|
|
break
|
|
|
|
except:
|
|
|
|
raise
|
|
|
|
if findleaks:
|
|
|
|
gc.collect()
|
|
|
|
if gc.garbage:
|
|
|
|
print "Warning: test created", len(gc.garbage),
|
|
|
|
print "uncollectable object(s)."
|
|
|
|
# move the uncollectable objects somewhere so we don't see
|
|
|
|
# them again
|
|
|
|
found_garbage.extend(gc.garbage)
|
|
|
|
del gc.garbage[:]
|
|
|
|
# Unload the newly imported modules (best effort finalization)
|
|
|
|
for module in sys.modules.keys():
|
|
|
|
if module not in save_modules and module.startswith("test."):
|
|
|
|
test_support.unload(module)
|
2001-10-17 10:45:28 -03:00
|
|
|
|
|
|
|
# The lists won't be sorted if running with -r
|
|
|
|
good.sort()
|
|
|
|
bad.sort()
|
|
|
|
skipped.sort()
|
2009-10-14 10:58:07 -03:00
|
|
|
environment_changed.sort()
|
2001-10-18 18:57:37 -03:00
|
|
|
|
1996-12-19 23:12:20 -04:00
|
|
|
if good and not quiet:
|
1998-03-26 15:42:58 -04:00
|
|
|
if not bad and not skipped and len(good) > 1:
|
|
|
|
print "All",
|
|
|
|
print count(len(good), "test"), "OK."
|
2008-03-18 02:45:40 -03:00
|
|
|
if print_slow:
|
|
|
|
test_times.sort(reverse=True)
|
|
|
|
print "10 slowest tests:"
|
|
|
|
for time, test in test_times[:10]:
|
|
|
|
print "%s: %.1fs" % (test, time)
|
1996-12-19 23:12:20 -04:00
|
|
|
if bad:
|
2009-10-14 10:58:07 -03:00
|
|
|
bad = set(bad) - set(environment_changed)
|
|
|
|
if bad:
|
|
|
|
print count(len(bad), "test"), "failed:"
|
|
|
|
printlist(bad)
|
|
|
|
if environment_changed:
|
|
|
|
print "{} altered the execution environment:".format(
|
|
|
|
count(len(environment_changed), "test"))
|
|
|
|
printlist(environment_changed)
|
1996-12-19 23:12:20 -04:00
|
|
|
if skipped and not quiet:
|
2001-08-12 00:45:50 -03:00
|
|
|
print count(len(skipped), "test"), "skipped:"
|
|
|
|
printlist(skipped)
|
1999-01-28 15:51:51 -04:00
|
|
|
|
2001-08-11 22:20:39 -03:00
|
|
|
e = _ExpectedSkips()
|
2001-08-11 23:01:09 -03:00
|
|
|
plat = sys.platform
|
2001-08-11 22:20:39 -03:00
|
|
|
if e.isvalid():
|
2003-11-16 12:17:49 -04:00
|
|
|
surprise = set(skipped) - e.getexpected() - set(resource_denieds)
|
2001-08-11 22:20:39 -03:00
|
|
|
if surprise:
|
|
|
|
print count(len(surprise), "skip"), \
|
2001-08-12 00:45:50 -03:00
|
|
|
"unexpected on", plat + ":"
|
|
|
|
printlist(surprise)
|
2001-08-11 22:20:39 -03:00
|
|
|
else:
|
|
|
|
print "Those skips are all expected on", plat + "."
|
|
|
|
else:
|
|
|
|
print "Ask someone to teach regrtest.py about which tests are"
|
|
|
|
print "expected to get skipped on", plat + "."
|
|
|
|
|
2006-03-10 17:26:16 -04:00
|
|
|
if verbose2 and bad:
|
|
|
|
print "Re-running failed tests in verbose mode"
|
|
|
|
for test in bad:
|
2006-03-10 19:37:10 -04:00
|
|
|
print "Re-running test %r in verbose mode" % test
|
|
|
|
sys.stdout.flush()
|
2006-03-10 17:26:16 -04:00
|
|
|
try:
|
2008-03-18 14:58:02 -03:00
|
|
|
test_support.verbose = True
|
2009-05-31 11:20:14 -03:00
|
|
|
ok = runtest(test, True, quiet, testdir,
|
2006-03-10 17:26:16 -04:00
|
|
|
huntrleaks)
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
# print a newline separate from the ^C
|
|
|
|
print
|
|
|
|
break
|
|
|
|
except:
|
|
|
|
raise
|
|
|
|
|
1999-01-28 15:51:51 -04:00
|
|
|
if single:
|
2009-12-16 07:49:46 -04:00
|
|
|
if next_single_test:
|
|
|
|
with open(filename, 'w') as fp:
|
|
|
|
fp.write(next_single_test + '\n')
|
1999-01-28 15:51:51 -04:00
|
|
|
else:
|
|
|
|
os.unlink(filename)
|
|
|
|
|
2004-02-07 18:43:03 -04:00
|
|
|
if trace:
|
|
|
|
r = tracer.results()
|
|
|
|
r.write_results(show_missing=True, summary=True, coverdir=coverdir)
|
|
|
|
|
2004-06-06 12:53:18 -03:00
|
|
|
if runleaks:
|
|
|
|
os.system("leaks %d" % os.getpid())
|
|
|
|
|
2003-07-22 21:30:39 -03:00
|
|
|
sys.exit(len(bad) > 0)
|
2001-08-20 19:33:46 -03:00
|
|
|
|
1996-12-19 23:12:20 -04:00
|
|
|
|
1998-08-01 14:04:08 -03:00
|
|
|
STDTESTS = [
|
1996-12-19 23:12:20 -04:00
|
|
|
'test_grammar',
|
|
|
|
'test_opcodes',
|
2007-03-12 12:57:19 -03:00
|
|
|
'test_dict',
|
1996-12-19 23:12:20 -04:00
|
|
|
'test_builtin',
|
|
|
|
'test_exceptions',
|
|
|
|
'test_types',
|
2007-03-08 15:58:14 -04:00
|
|
|
'test_unittest',
|
|
|
|
'test_doctest',
|
|
|
|
'test_doctest2',
|
1996-12-19 23:12:20 -04:00
|
|
|
]
|
|
|
|
|
1998-08-01 14:04:08 -03:00
|
|
|
NOTTESTS = [
|
1996-12-19 23:12:20 -04:00
|
|
|
'test_support',
|
2001-02-28 13:48:06 -04:00
|
|
|
'test_future1',
|
|
|
|
'test_future2',
|
1996-12-19 23:12:20 -04:00
|
|
|
]
|
|
|
|
|
1998-08-01 14:04:08 -03:00
|
|
|
def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
|
1996-12-19 23:12:20 -04:00
|
|
|
"""Return a list of all applicable test modules."""
|
1998-08-01 14:04:08 -03:00
|
|
|
if not testdir: testdir = findtestdir()
|
1996-12-19 23:12:20 -04:00
|
|
|
names = os.listdir(testdir)
|
|
|
|
tests = []
|
|
|
|
for name in names:
|
2001-10-24 17:42:55 -03:00
|
|
|
if name[:5] == "test_" and name[-3:] == os.extsep+"py":
|
1998-03-26 15:42:58 -04:00
|
|
|
modname = name[:-3]
|
|
|
|
if modname not in stdtests and modname not in nottests:
|
|
|
|
tests.append(modname)
|
1996-12-19 23:12:20 -04:00
|
|
|
tests.sort()
|
|
|
|
return stdtests + tests
|
|
|
|
|
2009-05-31 11:20:14 -03:00
|
|
|
def runtest(test, verbose, quiet,
|
|
|
|
testdir=None, huntrleaks=False, use_resources=None):
|
1998-08-01 14:04:08 -03:00
|
|
|
"""Run a single test.
|
2006-06-09 16:24:44 -03:00
|
|
|
|
1998-08-01 14:04:08 -03:00
|
|
|
test -- the name of the test
|
|
|
|
verbose -- if true, print more messages
|
2000-08-11 16:02:59 -03:00
|
|
|
quiet -- if true, don't print 'skipped' messages (probably redundant)
|
2008-03-18 02:45:40 -03:00
|
|
|
test_times -- a list of (time, test_name) pairs
|
1998-08-01 14:04:08 -03:00
|
|
|
testdir -- test directory
|
2006-06-09 16:24:44 -03:00
|
|
|
huntrleaks -- run multiple times to test for leaks; requires a debug
|
|
|
|
build; a triple corresponding to -R's three arguments
|
2009-10-29 17:53:00 -03:00
|
|
|
Returns one of the test result constants:
|
|
|
|
INTERRUPTED KeyboardInterrupt when run under -j
|
|
|
|
RESOURCE_DENIED test skipped because resource denied
|
|
|
|
SKIPPED test skipped for some other reason
|
|
|
|
ENV_CHANGED test failed because it changed the execution environment
|
|
|
|
FAILED test failed
|
|
|
|
PASSED test passed
|
1998-08-01 14:04:08 -03:00
|
|
|
"""
|
2006-06-04 21:55:26 -03:00
|
|
|
|
2009-05-31 11:20:14 -03:00
|
|
|
test_support.verbose = verbose # Tell tests to be moderately quiet
|
|
|
|
if use_resources is not None:
|
|
|
|
test_support.use_resources = use_resources
|
2006-06-09 16:24:44 -03:00
|
|
|
try:
|
2009-05-31 11:20:14 -03:00
|
|
|
return runtest_inner(test, verbose, quiet,
|
2008-03-18 02:45:40 -03:00
|
|
|
testdir, huntrleaks)
|
2006-06-09 16:24:44 -03:00
|
|
|
finally:
|
|
|
|
cleanup_test_droppings(test, verbose)
|
|
|
|
|
2009-10-14 10:58:07 -03:00
|
|
|
|
|
|
|
# Unit tests are supposed to leave the execution environment unchanged
|
|
|
|
# once they complete. But sometimes tests have bugs, especially when
|
|
|
|
# tests fail, and the changes to environment go on to mess up other
|
|
|
|
# tests. This can cause issues with buildbot stability, since tests
|
|
|
|
# are run in random order and so problems may appear to come and go.
|
|
|
|
# There are a few things we can save and restore to mitigate this, and
|
|
|
|
# the following context manager handles this task.
|
|
|
|
|
|
|
|
class saved_test_environment:
|
|
|
|
"""Save bits of the test environment and restore them at block exit.
|
|
|
|
|
2009-10-17 04:30:40 -03:00
|
|
|
with saved_test_environment(testname, verbose, quiet):
|
2009-10-14 10:58:07 -03:00
|
|
|
#stuff
|
|
|
|
|
|
|
|
Unless quiet is True, a warning is printed to stderr if any of
|
|
|
|
the saved items was changed by the test. The attribute 'changed'
|
|
|
|
is initially False, but is set to True if a change is detected.
|
2009-10-17 04:30:40 -03:00
|
|
|
|
|
|
|
If verbose is more than 1, the before and after state of changed
|
|
|
|
items is also printed.
|
2009-10-14 10:58:07 -03:00
|
|
|
"""
|
|
|
|
|
|
|
|
changed = False
|
|
|
|
|
2009-10-17 04:30:40 -03:00
|
|
|
def __init__(self, testname, verbose=0, quiet=False):
|
2009-10-14 10:58:07 -03:00
|
|
|
self.testname = testname
|
2009-10-17 04:30:40 -03:00
|
|
|
self.verbose = verbose
|
2009-10-14 10:58:07 -03:00
|
|
|
self.quiet = quiet
|
|
|
|
|
|
|
|
# To add things to save and restore, add a name XXX to the resources list
|
|
|
|
# and add corresponding get_XXX/restore_XXX functions. get_XXX should
|
|
|
|
# return the value to be saved and compared against a second call to the
|
|
|
|
# get function when test execution completes. restore_XXX should accept
|
|
|
|
# the saved value and restore the resource using it. It will be called if
|
2009-10-17 04:30:40 -03:00
|
|
|
# and only if a change in the value is detected.
|
|
|
|
#
|
|
|
|
# Note: XXX will have any '.' replaced with '_' characters when determining
|
|
|
|
# the corresponding method names.
|
2009-10-14 10:58:07 -03:00
|
|
|
|
2009-10-17 04:30:40 -03:00
|
|
|
resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
|
|
|
|
'os.environ', 'sys.path')
|
2009-10-14 10:58:07 -03:00
|
|
|
|
|
|
|
def get_sys_argv(self):
|
2009-10-17 12:48:16 -03:00
|
|
|
return id(sys.argv), sys.argv, sys.argv[:]
|
2009-10-14 10:58:07 -03:00
|
|
|
def restore_sys_argv(self, saved_argv):
|
2009-10-17 12:48:16 -03:00
|
|
|
sys.argv = saved_argv[1]
|
|
|
|
sys.argv[:] = saved_argv[2]
|
2009-10-14 10:58:07 -03:00
|
|
|
|
|
|
|
def get_cwd(self):
|
|
|
|
return os.getcwd()
|
|
|
|
def restore_cwd(self, saved_cwd):
|
|
|
|
os.chdir(saved_cwd)
|
|
|
|
|
|
|
|
def get_sys_stdout(self):
|
|
|
|
return sys.stdout
|
|
|
|
def restore_sys_stdout(self, saved_stdout):
|
|
|
|
sys.stdout = saved_stdout
|
|
|
|
|
|
|
|
def get_sys_stderr(self):
|
|
|
|
return sys.stderr
|
|
|
|
def restore_sys_stderr(self, saved_stderr):
|
|
|
|
sys.stderr = saved_stderr
|
|
|
|
|
|
|
|
def get_sys_stdin(self):
|
|
|
|
return sys.stdin
|
|
|
|
def restore_sys_stdin(self, saved_stdin):
|
|
|
|
sys.stdin = saved_stdin
|
|
|
|
|
|
|
|
def get_os_environ(self):
|
2009-10-17 12:48:16 -03:00
|
|
|
return id(os.environ), os.environ, dict(os.environ)
|
2009-10-14 10:58:07 -03:00
|
|
|
def restore_os_environ(self, saved_environ):
|
2009-10-17 12:48:16 -03:00
|
|
|
os.environ = saved_environ[1]
|
2009-10-14 10:58:07 -03:00
|
|
|
os.environ.clear()
|
2009-10-17 12:48:16 -03:00
|
|
|
os.environ.update(saved_environ[2])
|
2009-10-14 10:58:07 -03:00
|
|
|
|
|
|
|
def get_sys_path(self):
|
2009-10-17 12:48:16 -03:00
|
|
|
return id(sys.path), sys.path, sys.path[:]
|
2009-10-14 10:58:07 -03:00
|
|
|
def restore_sys_path(self, saved_path):
|
2009-10-17 12:48:16 -03:00
|
|
|
sys.path = saved_path[1]
|
|
|
|
sys.path[:] = saved_path[2]
|
2009-10-14 10:58:07 -03:00
|
|
|
|
2009-10-17 04:30:40 -03:00
|
|
|
def resource_info(self):
|
|
|
|
for name in self.resources:
|
|
|
|
method_suffix = name.replace('.', '_')
|
|
|
|
get_name = 'get_' + method_suffix
|
|
|
|
restore_name = 'restore_' + method_suffix
|
|
|
|
yield name, getattr(self, get_name), getattr(self, restore_name)
|
|
|
|
|
2009-10-14 10:58:07 -03:00
|
|
|
def __enter__(self):
|
2009-10-17 04:30:40 -03:00
|
|
|
self.saved_values = dict((name, get()) for name, get, restore
|
|
|
|
in self.resource_info())
|
2009-10-14 10:58:07 -03:00
|
|
|
return self
|
|
|
|
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
2009-10-17 04:30:40 -03:00
|
|
|
for name, get, restore in self.resource_info():
|
|
|
|
current = get()
|
|
|
|
original = self.saved_values[name]
|
|
|
|
# Check for changes to the resource's value
|
|
|
|
if current != original:
|
2009-10-14 10:58:07 -03:00
|
|
|
self.changed = True
|
2009-10-17 04:30:40 -03:00
|
|
|
restore(original)
|
2009-10-14 10:58:07 -03:00
|
|
|
if not self.quiet:
|
2009-10-17 04:30:40 -03:00
|
|
|
print >>sys.stderr, (
|
|
|
|
"Warning -- {} was modified by {}".format(
|
|
|
|
name, self.testname))
|
|
|
|
if self.verbose > 1:
|
|
|
|
print >>sys.stderr, (
|
2009-10-17 04:34:27 -03:00
|
|
|
" Before: {}\n After: {} ".format(
|
|
|
|
original, current))
|
2009-10-17 04:30:40 -03:00
|
|
|
# XXX (ncoghlan): for most resources (e.g. sys.path) identity
|
|
|
|
# matters at least as much as value. For others (e.g. cwd),
|
|
|
|
# identity is irrelevant. Should we add a mechanism to check
|
|
|
|
# for substitution in the cases where it matters?
|
2009-10-14 10:58:07 -03:00
|
|
|
return False
|
|
|
|
|
|
|
|
|
2009-05-31 11:20:14 -03:00
|
|
|
def runtest_inner(test, verbose, quiet,
|
2008-03-18 02:45:40 -03:00
|
|
|
testdir=None, huntrleaks=False):
|
1996-12-19 23:12:20 -04:00
|
|
|
test_support.unload(test)
|
2004-02-07 18:43:03 -04:00
|
|
|
if not testdir:
|
|
|
|
testdir = findtestdir()
|
2001-09-28 17:14:46 -03:00
|
|
|
if verbose:
|
2008-03-29 10:14:52 -03:00
|
|
|
capture_stdout = None
|
2001-09-21 17:31:52 -03:00
|
|
|
else:
|
2008-03-29 10:14:52 -03:00
|
|
|
capture_stdout = cStringIO.StringIO()
|
2006-06-04 21:55:26 -03:00
|
|
|
|
2009-05-31 11:20:14 -03:00
|
|
|
test_time = 0.0
|
2009-05-14 20:26:30 -03:00
|
|
|
refleak = False # True if the test leaked references.
|
1996-12-19 23:12:20 -04:00
|
|
|
try:
|
2001-09-25 16:13:20 -03:00
|
|
|
save_stdout = sys.stdout
|
1998-03-26 15:42:58 -04:00
|
|
|
try:
|
2008-03-29 10:14:52 -03:00
|
|
|
if capture_stdout:
|
|
|
|
sys.stdout = capture_stdout
|
2002-07-30 20:27:12 -03:00
|
|
|
if test.startswith('test.'):
|
|
|
|
abstest = test
|
|
|
|
else:
|
|
|
|
# Always import it from the test package
|
|
|
|
abstest = 'test.' + test
|
2009-10-17 04:30:40 -03:00
|
|
|
with saved_test_environment(test, verbose, quiet) as environment:
|
2009-10-14 10:58:07 -03:00
|
|
|
start_time = time.time()
|
|
|
|
the_package = __import__(abstest, globals(), locals(), [])
|
|
|
|
the_module = getattr(the_package, test)
|
|
|
|
# Old tests run to completion simply as a side-effect of
|
|
|
|
# being imported. For tests based on unittest or doctest,
|
|
|
|
# explicitly invoke their test_main() function (if it exists).
|
|
|
|
indirect_test = getattr(the_module, "test_main", None)
|
|
|
|
if indirect_test is not None:
|
|
|
|
indirect_test()
|
|
|
|
if huntrleaks:
|
|
|
|
refleak = dash_R(the_module, test, indirect_test,
|
|
|
|
huntrleaks)
|
|
|
|
test_time = time.time() - start_time
|
1998-03-26 15:42:58 -04:00
|
|
|
finally:
|
2001-09-25 16:13:20 -03:00
|
|
|
sys.stdout = save_stdout
|
2003-02-03 11:19:30 -04:00
|
|
|
except test_support.ResourceDenied, msg:
|
|
|
|
if not quiet:
|
|
|
|
print test, "skipped --", msg
|
|
|
|
sys.stdout.flush()
|
2009-10-29 17:53:00 -03:00
|
|
|
return RESOURCE_DENIED, test_time
|
2009-03-31 16:49:15 -03:00
|
|
|
except unittest.SkipTest, msg:
|
2000-08-11 16:02:59 -03:00
|
|
|
if not quiet:
|
2002-10-17 17:36:08 -03:00
|
|
|
print test, "skipped --", msg
|
2002-09-13 18:28:03 -03:00
|
|
|
sys.stdout.flush()
|
2009-10-29 17:53:00 -03:00
|
|
|
return SKIPPED, test_time
|
2000-08-18 13:04:05 -03:00
|
|
|
except KeyboardInterrupt:
|
|
|
|
raise
|
1996-12-19 23:12:20 -04:00
|
|
|
except test_support.TestFailed, msg:
|
1998-03-26 15:42:58 -04:00
|
|
|
print "test", test, "failed --", msg
|
2002-09-13 18:28:03 -03:00
|
|
|
sys.stdout.flush()
|
2009-10-29 17:53:00 -03:00
|
|
|
return FAILED, test_time
|
1997-07-15 22:56:13 -03:00
|
|
|
except:
|
1998-03-26 15:42:58 -04:00
|
|
|
type, value = sys.exc_info()[:2]
|
2000-08-23 17:34:40 -03:00
|
|
|
print "test", test, "crashed --", str(type) + ":", value
|
2002-09-13 18:28:03 -03:00
|
|
|
sys.stdout.flush()
|
1998-03-26 15:42:58 -04:00
|
|
|
if verbose:
|
|
|
|
traceback.print_exc(file=sys.stdout)
|
2002-09-13 18:28:03 -03:00
|
|
|
sys.stdout.flush()
|
2009-10-29 17:53:00 -03:00
|
|
|
return FAILED, test_time
|
1996-12-19 23:12:20 -04:00
|
|
|
else:
|
2009-05-14 20:26:30 -03:00
|
|
|
if refleak:
|
2009-10-29 17:53:00 -03:00
|
|
|
return FAILED, test_time
|
2009-10-14 10:58:07 -03:00
|
|
|
if environment.changed:
|
2009-10-29 18:44:56 -03:00
|
|
|
return ENV_CHANGED, test_time
|
2008-03-29 10:14:52 -03:00
|
|
|
# Except in verbose mode, tests should not print anything
|
|
|
|
if verbose or huntrleaks:
|
2009-10-29 17:53:00 -03:00
|
|
|
return PASSED, test_time
|
2008-03-29 10:14:52 -03:00
|
|
|
output = capture_stdout.getvalue()
|
|
|
|
if not output:
|
2009-10-29 17:53:00 -03:00
|
|
|
return PASSED, test_time
|
2001-09-21 17:31:52 -03:00
|
|
|
print "test", test, "produced unexpected output:"
|
2008-03-29 10:14:52 -03:00
|
|
|
print "*" * 70
|
|
|
|
print output
|
|
|
|
print "*" * 70
|
2002-09-13 18:28:03 -03:00
|
|
|
sys.stdout.flush()
|
2009-10-29 17:53:00 -03:00
|
|
|
return FAILED, test_time
|
2001-09-21 17:31:52 -03:00
|
|
|
|
2006-06-09 16:24:44 -03:00
|
|
|
def cleanup_test_droppings(testname, verbose):
|
|
|
|
import shutil
|
2009-04-29 19:44:15 -03:00
|
|
|
import stat
|
2006-06-09 16:24:44 -03:00
|
|
|
|
|
|
|
# Try to clean up junk commonly left behind. While tests shouldn't leave
|
|
|
|
# any files or directories behind, when a test fails that can be tedious
|
|
|
|
# for it to arrange. The consequences can be especially nasty on Windows,
|
|
|
|
# since if a test leaves a file open, it cannot be deleted by name (while
|
|
|
|
# there's nothing we can do about that here either, we can display the
|
|
|
|
# name of the offending test, which is a real help).
|
|
|
|
for name in (test_support.TESTFN,
|
|
|
|
"db_home",
|
|
|
|
):
|
|
|
|
if not os.path.exists(name):
|
|
|
|
continue
|
|
|
|
|
|
|
|
if os.path.isdir(name):
|
|
|
|
kind, nuker = "directory", shutil.rmtree
|
|
|
|
elif os.path.isfile(name):
|
|
|
|
kind, nuker = "file", os.unlink
|
|
|
|
else:
|
|
|
|
raise SystemError("os.path says %r exists but is neither "
|
|
|
|
"directory nor file" % name)
|
|
|
|
|
|
|
|
if verbose:
|
|
|
|
print "%r left behind %s %r" % (testname, kind, name)
|
|
|
|
try:
|
2009-04-29 19:44:15 -03:00
|
|
|
# if we have chmod, fix possible permissions problems
|
|
|
|
# that might prevent cleanup
|
|
|
|
if (hasattr(os, 'chmod')):
|
|
|
|
os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
|
2006-06-09 16:24:44 -03:00
|
|
|
nuker(name)
|
|
|
|
except Exception, msg:
|
|
|
|
print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
|
|
|
|
"removed: %s" % (testname, kind, name, msg))
|
|
|
|
|
2006-06-04 21:55:26 -03:00
|
|
|
def dash_R(the_module, test, indirect_test, huntrleaks):
|
2009-05-14 20:26:30 -03:00
|
|
|
"""Run a test multiple times, looking for reference leaks.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
False if the test didn't leak references; True if we detected refleaks.
|
|
|
|
"""
|
2006-06-04 21:55:26 -03:00
|
|
|
# This code is hackish and inelegant, but it seems to do the job.
|
2009-07-28 17:47:55 -03:00
|
|
|
import copy_reg, _abcoll, _pyio
|
2006-06-04 21:55:26 -03:00
|
|
|
|
|
|
|
if not hasattr(sys, 'gettotalrefcount'):
|
|
|
|
raise Exception("Tracking reference leaks requires a debug build "
|
|
|
|
"of Python")
|
|
|
|
|
|
|
|
# Save current values for dash_R_cleanup() to restore.
|
|
|
|
fs = warnings.filters[:]
|
2008-05-20 04:49:57 -03:00
|
|
|
ps = copy_reg.dispatch_table.copy()
|
2006-06-04 21:55:26 -03:00
|
|
|
pic = sys.path_importer_cache.copy()
|
2009-11-15 23:55:51 -04:00
|
|
|
try:
|
|
|
|
import zipimport
|
|
|
|
except ImportError:
|
|
|
|
zdc = None # Run unmodified on platforms without zipimport support
|
|
|
|
else:
|
|
|
|
zdc = zipimport._zip_directory_cache.copy()
|
2007-11-21 20:55:51 -04:00
|
|
|
abcs = {}
|
2009-07-28 17:47:55 -03:00
|
|
|
modules = _abcoll, _pyio
|
2008-04-01 21:25:14 -03:00
|
|
|
for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
|
|
|
|
# XXX isinstance(abc, ABCMeta) leads to infinite recursion
|
|
|
|
if not hasattr(abc, '_abc_registry'):
|
2007-11-30 18:36:10 -04:00
|
|
|
continue
|
2007-11-21 20:55:51 -04:00
|
|
|
for obj in abc.__subclasses__() + [abc]:
|
|
|
|
abcs[obj] = obj._abc_registry.copy()
|
|
|
|
|
2006-06-04 21:55:26 -03:00
|
|
|
if indirect_test:
|
|
|
|
def run_the_test():
|
|
|
|
indirect_test()
|
|
|
|
else:
|
|
|
|
def run_the_test():
|
|
|
|
reload(the_module)
|
|
|
|
|
|
|
|
deltas = []
|
|
|
|
nwarmup, ntracked, fname = huntrleaks
|
|
|
|
repcount = nwarmup + ntracked
|
|
|
|
print >> sys.stderr, "beginning", repcount, "repetitions"
|
|
|
|
print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
|
2009-11-15 23:55:51 -04:00
|
|
|
dash_R_cleanup(fs, ps, pic, zdc, abcs)
|
2006-06-04 21:55:26 -03:00
|
|
|
for i in range(repcount):
|
|
|
|
rc = sys.gettotalrefcount()
|
|
|
|
run_the_test()
|
|
|
|
sys.stderr.write('.')
|
2009-11-15 23:55:51 -04:00
|
|
|
dash_R_cleanup(fs, ps, pic, zdc, abcs)
|
2006-06-04 21:55:26 -03:00
|
|
|
if i >= nwarmup:
|
|
|
|
deltas.append(sys.gettotalrefcount() - rc - 2)
|
|
|
|
print >> sys.stderr
|
|
|
|
if any(deltas):
|
2007-05-11 02:55:15 -03:00
|
|
|
msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
|
|
|
|
print >> sys.stderr, msg
|
2009-05-31 11:20:14 -03:00
|
|
|
with open(fname, "a") as refrep:
|
|
|
|
print >> refrep, msg
|
|
|
|
refrep.flush()
|
2009-05-14 20:26:30 -03:00
|
|
|
return True
|
|
|
|
return False
|
2006-06-04 21:55:26 -03:00
|
|
|
|
2009-11-15 23:55:51 -04:00
|
|
|
def dash_R_cleanup(fs, ps, pic, zdc, abcs):
|
2008-05-20 04:49:57 -03:00
|
|
|
import gc, copy_reg
|
2008-05-10 18:12:57 -03:00
|
|
|
import _strptime, linecache
|
|
|
|
dircache = test_support.import_module('dircache', deprecated=True)
|
2006-06-04 21:55:26 -03:00
|
|
|
import urlparse, urllib, urllib2, mimetypes, doctest
|
2008-04-01 21:25:14 -03:00
|
|
|
import struct, filecmp
|
2006-06-04 21:55:26 -03:00
|
|
|
from distutils.dir_util import _path_created
|
|
|
|
|
2008-04-18 20:31:33 -03:00
|
|
|
# Clear the warnings registry, so they can be displayed again
|
|
|
|
for mod in sys.modules.values():
|
|
|
|
if hasattr(mod, '__warningregistry__'):
|
|
|
|
del mod.__warningregistry__
|
|
|
|
|
2006-06-04 21:55:26 -03:00
|
|
|
# Restore some original values.
|
|
|
|
warnings.filters[:] = fs
|
2008-05-20 04:49:57 -03:00
|
|
|
copy_reg.dispatch_table.clear()
|
|
|
|
copy_reg.dispatch_table.update(ps)
|
2006-06-04 21:55:26 -03:00
|
|
|
sys.path_importer_cache.clear()
|
|
|
|
sys.path_importer_cache.update(pic)
|
2009-11-15 23:55:51 -04:00
|
|
|
try:
|
|
|
|
import zipimport
|
|
|
|
except ImportError:
|
|
|
|
pass # Run unmodified on platforms without zipimport support
|
|
|
|
else:
|
|
|
|
zipimport._zip_directory_cache.clear()
|
|
|
|
zipimport._zip_directory_cache.update(zdc)
|
2006-06-04 21:55:26 -03:00
|
|
|
|
2008-01-27 19:34:59 -04:00
|
|
|
# clear type cache
|
2008-02-04 14:00:12 -04:00
|
|
|
sys._clear_type_cache()
|
2008-01-27 19:34:59 -04:00
|
|
|
|
2007-11-21 20:55:51 -04:00
|
|
|
# Clear ABC registries, restoring previously saved ABC registries.
|
2008-04-01 21:25:14 -03:00
|
|
|
for abc, registry in abcs.items():
|
|
|
|
abc._abc_registry = registry.copy()
|
|
|
|
abc._abc_cache.clear()
|
|
|
|
abc._abc_negative_cache.clear()
|
2007-11-21 20:55:51 -04:00
|
|
|
|
2006-06-04 21:55:26 -03:00
|
|
|
# Clear assorted module caches.
|
|
|
|
_path_created.clear()
|
|
|
|
re.purge()
|
|
|
|
_strptime._regex_cache.clear()
|
|
|
|
urlparse.clear_cache()
|
|
|
|
urllib.urlcleanup()
|
|
|
|
urllib2.install_opener(None)
|
|
|
|
dircache.reset()
|
|
|
|
linecache.clearcache()
|
|
|
|
mimetypes._default_mime_types()
|
2006-06-06 22:04:59 -03:00
|
|
|
filecmp._cache.clear()
|
2008-01-03 22:54:42 -04:00
|
|
|
struct._clearcache()
|
2006-06-04 21:55:26 -03:00
|
|
|
doctest.master = None
|
|
|
|
|
|
|
|
# Collect cyclic trash.
|
|
|
|
gc.collect()
|
|
|
|
|
1996-12-19 23:12:20 -04:00
|
|
|
def findtestdir():
|
|
|
|
if __name__ == '__main__':
|
1998-03-26 15:42:58 -04:00
|
|
|
file = sys.argv[0]
|
1996-12-19 23:12:20 -04:00
|
|
|
else:
|
1998-03-26 15:42:58 -04:00
|
|
|
file = __file__
|
1996-12-19 23:12:20 -04:00
|
|
|
testdir = os.path.dirname(file) or os.curdir
|
|
|
|
return testdir
|
|
|
|
|
2002-06-02 18:42:01 -03:00
|
|
|
def removepy(name):
|
|
|
|
if name.endswith(os.extsep + "py"):
|
|
|
|
name = name[:-3]
|
|
|
|
return name
|
|
|
|
|
1996-12-19 23:12:20 -04:00
|
|
|
def count(n, word):
|
|
|
|
if n == 1:
|
1998-03-26 15:42:58 -04:00
|
|
|
return "%d %s" % (n, word)
|
1996-12-19 23:12:20 -04:00
|
|
|
else:
|
1998-03-26 15:42:58 -04:00
|
|
|
return "%d %ss" % (n, word)
|
1996-12-19 23:12:20 -04:00
|
|
|
|
2001-08-12 00:45:50 -03:00
|
|
|
def printlist(x, width=70, indent=4):
|
2002-08-23 14:55:54 -03:00
|
|
|
"""Print the elements of iterable x to stdout.
|
2001-08-12 00:45:50 -03:00
|
|
|
|
|
|
|
Optional arg width (default 70) is the maximum line length.
|
|
|
|
Optional arg indent (default 4) is the number of blanks with which to
|
|
|
|
begin each line.
|
|
|
|
"""
|
|
|
|
|
2002-07-04 16:45:06 -03:00
|
|
|
from textwrap import fill
|
|
|
|
blanks = ' ' * indent
|
|
|
|
print fill(' '.join(map(str, x)), width,
|
|
|
|
initial_indent=blanks, subsequent_indent=blanks)
|
2001-08-12 00:45:50 -03:00
|
|
|
|
2002-04-01 01:04:46 -04:00
|
|
|
# Map sys.platform to a string containing the basenames of tests
|
|
|
|
# expected to be skipped on that platform.
|
2002-10-08 22:07:11 -03:00
|
|
|
#
|
|
|
|
# Special cases:
|
|
|
|
# test_pep277
|
|
|
|
# The _ExpectedSkips constructor adds this to the set of expected
|
|
|
|
# skips if not os.path.supports_unicode_filenames.
|
2003-02-28 15:57:03 -04:00
|
|
|
# test_timeout
|
|
|
|
# Controlled by test_timeout.skip_expected. Requires the network
|
|
|
|
# resource and a socket module.
|
2007-07-12 06:24:04 -03:00
|
|
|
#
|
|
|
|
# Tests that are expected to be skipped everywhere except on one platform
|
|
|
|
# are also handled separately.
|
2002-04-01 01:04:46 -04:00
|
|
|
|
2001-08-11 23:22:19 -03:00
|
|
|
_expectations = {
|
|
|
|
'win32':
|
|
|
|
"""
|
2003-09-20 19:06:13 -03:00
|
|
|
test__locale
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2002-11-22 16:00:34 -04:00
|
|
|
test_bsddb3
|
2001-08-11 23:22:19 -03:00
|
|
|
test_commands
|
|
|
|
test_crypt
|
2001-10-22 19:06:08 -03:00
|
|
|
test_curses
|
2001-08-11 23:22:19 -03:00
|
|
|
test_dbm
|
|
|
|
test_dl
|
|
|
|
test_fcntl
|
|
|
|
test_fork1
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2001-08-11 23:22:19 -03:00
|
|
|
test_gdbm
|
|
|
|
test_grp
|
2003-03-03 20:26:38 -04:00
|
|
|
test_ioctl
|
2001-08-11 23:22:19 -03:00
|
|
|
test_largefile
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2001-08-11 23:22:19 -03:00
|
|
|
test_mhlib
|
|
|
|
test_openpty
|
2002-12-10 14:47:56 -04:00
|
|
|
test_ossaudiodev
|
2007-08-30 07:38:56 -03:00
|
|
|
test_pipes
|
2001-08-11 23:22:19 -03:00
|
|
|
test_poll
|
2003-02-17 17:48:48 -04:00
|
|
|
test_posix
|
2001-08-11 23:22:19 -03:00
|
|
|
test_pty
|
|
|
|
test_pwd
|
2002-04-23 20:09:02 -03:00
|
|
|
test_resource
|
2001-08-11 23:22:19 -03:00
|
|
|
test_signal
|
2004-08-03 23:32:03 -03:00
|
|
|
test_threadsignals
|
2001-08-11 23:22:19 -03:00
|
|
|
test_timing
|
2006-03-21 22:58:17 -04:00
|
|
|
test_wait3
|
|
|
|
test_wait4
|
2001-08-11 23:22:19 -03:00
|
|
|
""",
|
|
|
|
'linux2':
|
|
|
|
"""
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2001-10-23 12:10:55 -03:00
|
|
|
test_curses
|
2001-08-11 23:22:19 -03:00
|
|
|
test_dl
|
|
|
|
test_largefile
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2003-02-14 15:29:22 -04:00
|
|
|
test_ossaudiodev
|
2001-08-11 23:22:19 -03:00
|
|
|
""",
|
2001-08-28 11:49:00 -03:00
|
|
|
'mac':
|
2001-09-02 00:58:41 -03:00
|
|
|
"""
|
2003-01-08 12:31:11 -04:00
|
|
|
test_atexit
|
2001-09-02 00:58:41 -03:00
|
|
|
test_bsddb
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2003-01-08 12:31:11 -04:00
|
|
|
test_bsddb3
|
|
|
|
test_bz2
|
2001-09-02 00:58:41 -03:00
|
|
|
test_commands
|
|
|
|
test_crypt
|
2001-11-30 10:16:36 -04:00
|
|
|
test_curses
|
2001-09-02 00:58:41 -03:00
|
|
|
test_dbm
|
|
|
|
test_dl
|
|
|
|
test_fcntl
|
|
|
|
test_fork1
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2001-09-02 00:58:41 -03:00
|
|
|
test_grp
|
2003-03-07 11:38:11 -04:00
|
|
|
test_ioctl
|
2001-09-02 00:58:41 -03:00
|
|
|
test_largefile
|
|
|
|
test_locale
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2001-09-02 00:58:41 -03:00
|
|
|
test_mmap
|
|
|
|
test_openpty
|
2003-01-08 12:31:11 -04:00
|
|
|
test_ossaudiodev
|
2001-09-02 00:58:41 -03:00
|
|
|
test_poll
|
2003-01-08 12:31:11 -04:00
|
|
|
test_popen
|
2001-09-02 00:58:41 -03:00
|
|
|
test_popen2
|
2003-02-21 18:33:55 -04:00
|
|
|
test_posix
|
2001-09-02 00:58:41 -03:00
|
|
|
test_pty
|
|
|
|
test_pwd
|
2003-01-08 12:31:11 -04:00
|
|
|
test_resource
|
2001-09-02 00:58:41 -03:00
|
|
|
test_signal
|
|
|
|
test_sundry
|
2003-03-07 11:38:11 -04:00
|
|
|
test_tarfile
|
2001-09-02 00:58:41 -03:00
|
|
|
test_timing
|
|
|
|
""",
|
2002-09-30 13:19:48 -03:00
|
|
|
'unixware7':
|
2001-09-05 11:38:48 -03:00
|
|
|
"""
|
|
|
|
test_bsddb
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2001-09-05 11:38:48 -03:00
|
|
|
test_dl
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2001-09-05 11:38:48 -03:00
|
|
|
test_largefile
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2001-09-05 11:38:48 -03:00
|
|
|
test_minidom
|
|
|
|
test_openpty
|
|
|
|
test_pyexpat
|
|
|
|
test_sax
|
|
|
|
test_sundry
|
|
|
|
""",
|
2002-09-30 13:19:48 -03:00
|
|
|
'openunix8':
|
|
|
|
"""
|
|
|
|
test_bsddb
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2002-09-30 13:19:48 -03:00
|
|
|
test_dl
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2002-09-30 13:19:48 -03:00
|
|
|
test_largefile
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2002-09-30 13:19:48 -03:00
|
|
|
test_minidom
|
|
|
|
test_openpty
|
|
|
|
test_pyexpat
|
|
|
|
test_sax
|
|
|
|
test_sundry
|
|
|
|
""",
|
|
|
|
'sco_sv3':
|
|
|
|
"""
|
|
|
|
test_asynchat
|
|
|
|
test_bsddb
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2002-09-30 13:19:48 -03:00
|
|
|
test_dl
|
|
|
|
test_fork1
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2002-09-30 13:19:48 -03:00
|
|
|
test_gettext
|
|
|
|
test_largefile
|
|
|
|
test_locale
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2002-09-30 13:19:48 -03:00
|
|
|
test_minidom
|
|
|
|
test_openpty
|
|
|
|
test_pyexpat
|
|
|
|
test_queue
|
|
|
|
test_sax
|
|
|
|
test_sundry
|
|
|
|
test_thread
|
|
|
|
test_threaded_import
|
|
|
|
test_threadedtempfile
|
|
|
|
test_threading
|
|
|
|
""",
|
2001-10-24 17:42:55 -03:00
|
|
|
'riscos':
|
|
|
|
"""
|
|
|
|
test_asynchat
|
2003-05-10 04:36:56 -03:00
|
|
|
test_atexit
|
2001-10-24 17:42:55 -03:00
|
|
|
test_bsddb
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2003-05-10 04:36:56 -03:00
|
|
|
test_bsddb3
|
2001-10-24 17:42:55 -03:00
|
|
|
test_commands
|
|
|
|
test_crypt
|
|
|
|
test_dbm
|
|
|
|
test_dl
|
|
|
|
test_fcntl
|
|
|
|
test_fork1
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2001-10-24 17:42:55 -03:00
|
|
|
test_gdbm
|
|
|
|
test_grp
|
|
|
|
test_largefile
|
|
|
|
test_locale
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2001-10-24 17:42:55 -03:00
|
|
|
test_mmap
|
|
|
|
test_openpty
|
|
|
|
test_poll
|
|
|
|
test_popen2
|
|
|
|
test_pty
|
|
|
|
test_pwd
|
|
|
|
test_strop
|
|
|
|
test_sundry
|
|
|
|
test_thread
|
|
|
|
test_threaded_import
|
|
|
|
test_threadedtempfile
|
|
|
|
test_threading
|
|
|
|
test_timing
|
|
|
|
""",
|
2001-12-05 19:27:32 -04:00
|
|
|
'darwin':
|
2001-12-02 17:41:36 -04:00
|
|
|
"""
|
2003-10-13 01:27:47 -03:00
|
|
|
test__locale
|
2002-12-30 19:03:13 -04:00
|
|
|
test_bsddb
|
2002-12-03 06:24:56 -04:00
|
|
|
test_bsddb3
|
2001-12-02 17:41:36 -04:00
|
|
|
test_curses
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2001-12-02 17:41:36 -04:00
|
|
|
test_gdbm
|
|
|
|
test_largefile
|
2002-12-30 19:03:13 -04:00
|
|
|
test_locale
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2001-12-02 17:41:36 -04:00
|
|
|
test_minidom
|
2002-12-30 19:03:13 -04:00
|
|
|
test_ossaudiodev
|
2001-12-02 17:41:36 -04:00
|
|
|
test_poll
|
|
|
|
""",
|
2002-07-17 12:08:24 -03:00
|
|
|
'sunos5':
|
|
|
|
"""
|
|
|
|
test_bsddb
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2002-07-17 12:08:24 -03:00
|
|
|
test_curses
|
|
|
|
test_dbm
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
|
|
|
test_kqueue
|
2002-07-17 12:08:24 -03:00
|
|
|
test_gdbm
|
|
|
|
test_gzip
|
|
|
|
test_openpty
|
|
|
|
test_zipfile
|
|
|
|
test_zlib
|
2002-07-17 12:56:55 -03:00
|
|
|
""",
|
2002-03-14 22:54:03 -04:00
|
|
|
'hp-ux11':
|
|
|
|
"""
|
|
|
|
test_bsddb
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2002-03-14 22:54:03 -04:00
|
|
|
test_curses
|
|
|
|
test_dl
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2002-03-14 22:54:03 -04:00
|
|
|
test_gdbm
|
|
|
|
test_gzip
|
|
|
|
test_largefile
|
|
|
|
test_locale
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2002-03-14 22:54:03 -04:00
|
|
|
test_minidom
|
|
|
|
test_openpty
|
|
|
|
test_pyexpat
|
|
|
|
test_sax
|
|
|
|
test_zipfile
|
|
|
|
test_zlib
|
|
|
|
""",
|
2002-06-11 03:22:31 -03:00
|
|
|
'atheos':
|
2002-07-16 18:35:23 -03:00
|
|
|
"""
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2002-07-16 18:35:23 -03:00
|
|
|
test_curses
|
|
|
|
test_dl
|
|
|
|
test_gdbm
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2002-07-16 18:35:23 -03:00
|
|
|
test_largefile
|
|
|
|
test_locale
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2002-07-16 18:35:23 -03:00
|
|
|
test_mhlib
|
|
|
|
test_mmap
|
|
|
|
test_poll
|
|
|
|
test_popen2
|
|
|
|
test_resource
|
|
|
|
""",
|
2002-12-05 11:18:15 -04:00
|
|
|
'cygwin':
|
|
|
|
"""
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2002-12-05 13:20:25 -04:00
|
|
|
test_bsddb3
|
2002-12-05 11:18:15 -04:00
|
|
|
test_curses
|
|
|
|
test_dbm
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2003-07-22 15:35:58 -03:00
|
|
|
test_ioctl
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2002-12-05 11:18:15 -04:00
|
|
|
test_largefile
|
|
|
|
test_locale
|
2003-02-05 12:46:01 -04:00
|
|
|
test_ossaudiodev
|
2002-12-05 11:18:15 -04:00
|
|
|
test_socketserver
|
|
|
|
""",
|
2002-12-31 07:26:50 -04:00
|
|
|
'os2emx':
|
|
|
|
"""
|
|
|
|
test_audioop
|
2003-05-06 17:36:24 -03:00
|
|
|
test_bsddb185
|
2002-12-31 07:26:50 -04:00
|
|
|
test_bsddb3
|
|
|
|
test_commands
|
|
|
|
test_curses
|
|
|
|
test_dl
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
|
|
|
test_kqueue
|
2002-12-31 07:26:50 -04:00
|
|
|
test_largefile
|
|
|
|
test_mhlib
|
|
|
|
test_mmap
|
|
|
|
test_openpty
|
|
|
|
test_ossaudiodev
|
|
|
|
test_pty
|
|
|
|
test_resource
|
|
|
|
test_signal
|
|
|
|
""",
|
2003-11-20 18:11:29 -04:00
|
|
|
'freebsd4':
|
|
|
|
"""
|
|
|
|
test_bsddb
|
|
|
|
test_bsddb3
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2004-08-18 12:13:41 -03:00
|
|
|
test_gdbm
|
2003-11-20 18:11:29 -04:00
|
|
|
test_locale
|
|
|
|
test_ossaudiodev
|
|
|
|
test_pep277
|
2004-08-18 12:13:41 -03:00
|
|
|
test_pty
|
2003-11-20 18:11:29 -04:00
|
|
|
test_socketserver
|
2004-08-18 12:13:41 -03:00
|
|
|
test_tcl
|
2009-02-09 15:21:21 -04:00
|
|
|
test_tk
|
2009-01-28 15:28:04 -04:00
|
|
|
test_ttk_guionly
|
|
|
|
test_ttk_textonly
|
2003-11-20 18:11:29 -04:00
|
|
|
test_timeout
|
|
|
|
test_urllibnet
|
2008-09-29 21:15:45 -03:00
|
|
|
test_multiprocessing
|
2003-06-07 17:01:37 -03:00
|
|
|
""",
|
2005-09-14 15:09:42 -03:00
|
|
|
'aix5':
|
|
|
|
"""
|
|
|
|
test_bsddb
|
|
|
|
test_bsddb185
|
|
|
|
test_bsddb3
|
|
|
|
test_bz2
|
|
|
|
test_dl
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2005-09-14 15:09:42 -03:00
|
|
|
test_gdbm
|
|
|
|
test_gzip
|
2008-03-21 20:49:44 -03:00
|
|
|
test_kqueue
|
2005-09-14 15:09:42 -03:00
|
|
|
test_ossaudiodev
|
|
|
|
test_tcl
|
2009-02-09 15:21:21 -04:00
|
|
|
test_tk
|
2009-01-28 15:28:04 -04:00
|
|
|
test_ttk_guionly
|
|
|
|
test_ttk_textonly
|
2005-09-14 15:09:42 -03:00
|
|
|
test_zipimport
|
|
|
|
test_zlib
|
|
|
|
""",
|
2006-03-26 06:02:34 -04:00
|
|
|
'openbsd3':
|
|
|
|
"""
|
|
|
|
test_bsddb
|
|
|
|
test_bsddb3
|
|
|
|
test_ctypes
|
|
|
|
test_dl
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2006-03-26 06:02:34 -04:00
|
|
|
test_gdbm
|
|
|
|
test_locale
|
|
|
|
test_normalization
|
|
|
|
test_ossaudiodev
|
|
|
|
test_pep277
|
|
|
|
test_tcl
|
2009-02-09 15:21:21 -04:00
|
|
|
test_tk
|
2009-01-28 15:28:04 -04:00
|
|
|
test_ttk_guionly
|
|
|
|
test_ttk_textonly
|
2008-09-29 21:15:45 -03:00
|
|
|
test_multiprocessing
|
2006-03-26 06:02:34 -04:00
|
|
|
""",
|
2006-06-21 14:53:17 -03:00
|
|
|
'netbsd3':
|
|
|
|
"""
|
|
|
|
test_bsddb
|
|
|
|
test_bsddb185
|
|
|
|
test_bsddb3
|
|
|
|
test_ctypes
|
|
|
|
test_curses
|
|
|
|
test_dl
|
2008-03-21 20:49:44 -03:00
|
|
|
test_epoll
|
2006-06-21 14:53:17 -03:00
|
|
|
test_gdbm
|
|
|
|
test_locale
|
|
|
|
test_ossaudiodev
|
|
|
|
test_pep277
|
|
|
|
test_tcl
|
2009-02-09 15:21:21 -04:00
|
|
|
test_tk
|
2009-01-28 15:28:04 -04:00
|
|
|
test_ttk_guionly
|
|
|
|
test_ttk_textonly
|
2008-09-29 21:15:45 -03:00
|
|
|
test_multiprocessing
|
2006-06-21 14:53:17 -03:00
|
|
|
""",
|
2001-08-11 23:22:19 -03:00
|
|
|
}
|
2004-07-26 09:09:13 -03:00
|
|
|
_expectations['freebsd5'] = _expectations['freebsd4']
|
2004-08-18 12:13:41 -03:00
|
|
|
_expectations['freebsd6'] = _expectations['freebsd4']
|
2005-07-16 23:36:59 -03:00
|
|
|
_expectations['freebsd7'] = _expectations['freebsd4']
|
2007-10-28 09:38:09 -03:00
|
|
|
_expectations['freebsd8'] = _expectations['freebsd4']
|
2001-08-11 23:22:19 -03:00
|
|
|
|
2001-08-11 22:20:39 -03:00
|
|
|
class _ExpectedSkips:
|
|
|
|
def __init__(self):
|
2002-10-08 22:07:11 -03:00
|
|
|
import os.path
|
2003-02-28 15:57:03 -04:00
|
|
|
from test import test_timeout
|
2002-11-24 14:53:11 -04:00
|
|
|
|
2002-08-23 14:55:54 -03:00
|
|
|
self.valid = False
|
2002-04-01 01:04:46 -04:00
|
|
|
if sys.platform in _expectations:
|
2001-08-11 23:22:19 -03:00
|
|
|
s = _expectations[sys.platform]
|
2003-11-16 12:17:49 -04:00
|
|
|
self.expected = set(s.split())
|
2002-11-24 14:53:11 -04:00
|
|
|
|
2007-07-12 06:24:04 -03:00
|
|
|
# expected to be skipped on every platform, even Linux
|
|
|
|
self.expected.add('test_linuxaudiodev')
|
|
|
|
|
2002-10-08 22:07:11 -03:00
|
|
|
if not os.path.supports_unicode_filenames:
|
|
|
|
self.expected.add('test_pep277')
|
2002-11-24 14:53:11 -04:00
|
|
|
|
2003-02-28 15:57:03 -04:00
|
|
|
if test_timeout.skip_expected:
|
|
|
|
self.expected.add('test_timeout')
|
|
|
|
|
2004-11-13 07:13:35 -04:00
|
|
|
if sys.maxint == 9223372036854775807L:
|
|
|
|
self.expected.add('test_imageop')
|
|
|
|
|
2003-01-29 12:24:16 -04:00
|
|
|
if not sys.platform in ("mac", "darwin"):
|
2008-06-19 16:57:39 -03:00
|
|
|
MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
|
2007-07-12 06:24:04 -03:00
|
|
|
"test_plistlib", "test_scriptpackages",
|
|
|
|
"test_applesingle"]
|
2003-03-29 18:01:17 -04:00
|
|
|
for skip in MAC_ONLY:
|
|
|
|
self.expected.add(skip)
|
2008-06-19 18:39:06 -03:00
|
|
|
elif len(u'\0'.encode('unicode-internal')) == 4:
|
|
|
|
self.expected.add("test_macostools")
|
|
|
|
|
2003-01-28 20:35:32 -04:00
|
|
|
|
|
|
|
if sys.platform != "win32":
|
2007-07-12 06:24:04 -03:00
|
|
|
# test_sqlite is only reliable on Windows where the library
|
|
|
|
# is distributed with Python
|
2003-03-29 18:01:17 -04:00
|
|
|
WIN_ONLY = ["test_unicode_file", "test_winreg",
|
2007-07-12 06:24:04 -03:00
|
|
|
"test_winsound", "test_startfile",
|
|
|
|
"test_sqlite"]
|
2003-03-29 18:01:17 -04:00
|
|
|
for skip in WIN_ONLY:
|
|
|
|
self.expected.add(skip)
|
2003-02-18 22:35:07 -04:00
|
|
|
|
2007-05-20 04:09:50 -03:00
|
|
|
if sys.platform != 'irix':
|
2007-07-12 06:24:04 -03:00
|
|
|
IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
|
|
|
|
"test_gl", "test_imgfile"]
|
2007-05-20 04:09:50 -03:00
|
|
|
for skip in IRIX_ONLY:
|
|
|
|
self.expected.add(skip)
|
|
|
|
|
2007-07-12 06:24:04 -03:00
|
|
|
if sys.platform != 'sunos5':
|
|
|
|
self.expected.add('test_sunaudiodev')
|
|
|
|
self.expected.add('test_nis')
|
|
|
|
|
2008-03-21 18:01:18 -03:00
|
|
|
if not sys.py3kwarning:
|
|
|
|
self.expected.add('test_py3kwarn')
|
2008-03-18 18:30:13 -03:00
|
|
|
|
2002-08-23 14:55:54 -03:00
|
|
|
self.valid = True
|
2001-08-11 22:20:39 -03:00
|
|
|
|
|
|
|
def isvalid(self):
|
|
|
|
"Return true iff _ExpectedSkips knows about the current platform."
|
|
|
|
return self.valid
|
|
|
|
|
|
|
|
def getexpected(self):
|
|
|
|
"""Return set of test names we expect to skip on current platform.
|
|
|
|
|
|
|
|
self.isvalid() must be true.
|
|
|
|
"""
|
|
|
|
|
|
|
|
assert self.isvalid()
|
|
|
|
return self.expected
|
|
|
|
|
1996-12-19 23:12:20 -04:00
|
|
|
if __name__ == '__main__':
|
2002-07-30 20:27:12 -03:00
|
|
|
# Remove regrtest.py's own directory from the module search path. This
|
|
|
|
# prevents relative imports from working, and relative imports will screw
|
|
|
|
# up the testing framework. E.g. if both test.test_support and
|
|
|
|
# test_support are imported, they will not contain the same globals, and
|
|
|
|
# much of the testing framework relies on the globals in the
|
|
|
|
# test.test_support module.
|
|
|
|
mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
|
2009-10-28 11:03:43 -03:00
|
|
|
i = len(sys.path)
|
2002-07-30 20:27:12 -03:00
|
|
|
while i >= 0:
|
|
|
|
i -= 1
|
|
|
|
if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
|
|
|
|
del sys.path[i]
|
2001-08-20 19:33:46 -03:00
|
|
|
main()
|