blob: 6160b3d07d505cb1b5bcc258a56ef275225f2d93 [file] [log] [blame]
Guido van Rossum152494a1996-12-20 03:12:20 +00001#! /usr/bin/env python
2
3"""Regression test.
4
5This will find all modules whose name is "test_*" in the test
6directory, and run them. Various command line options provide
7additional facilities.
8
9Command line options:
10
Michael W. Hudson61147f62004-08-03 11:33:28 +000011-v: verbose -- run tests in verbose mode with output to stdout
12-q: quiet -- don't print anything except if a test fails
13-g: generate -- write the output file for a test instead of comparing it
14-x: exclude -- arguments are tests to *exclude*
15-s: single -- run only a single test (see below)
16-r: random -- randomize test execution order
17-f: fromfile -- read names of tests to run from a file (see below)
18-l: findleaks -- if GC is available detect tests that leak memory
19-u: use -- specify which special resource intensive tests to run
20-h: help -- print this text and exit
21-t: threshold -- call gc.set_threshold(N)
22-T: coverage -- turn on code coverage using the trace module
Walter Dörwaldaee4da62004-11-12 18:51:27 +000023-D: coverdir -- Directory where coverage files are put
24-N: nocoverdir -- Put coverage files alongside modules
Michael W. Hudson61147f62004-08-03 11:33:28 +000025-L: runleaks -- run the leaks(1) command just before exit
26-R: huntrleaks -- search for reference leaks (needs debug build, v. slow)
Guido van Rossum152494a1996-12-20 03:12:20 +000027
28If non-option arguments are present, they are names for tests to run,
29unless -x is given, in which case they are names for tests not to run.
30If no test names are given, all tests are run.
Guido van Rossumf58ed251997-03-07 21:04:33 +000031
Guido van Rossuma4122201997-08-18 20:08:24 +000032-v is incompatible with -g and does not compare test output files.
Barry Warsawe11e3de1999-01-28 19:51:51 +000033
Barry Warsaw3b6d0252004-02-07 22:43:03 +000034-T turns on code coverage tracing with the trace module.
35
Walter Dörwaldaee4da62004-11-12 18:51:27 +000036-D specifies the directory where coverage files are put.
37
38-N Put coverage files alongside modules.
39
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000040-s means to run only a single test and exit. This is useful when
41doing memory analysis on the Python interpreter (which tend to consume
42too many resources to run the full regression test non-stop). The
43file /tmp/pynexttest is read to find the next test to run. If this
44file is missing, the first test_*.py file in testdir or on the command
45line is used. (actually tempfile.gettempdir() is used instead of
46/tmp).
Barry Warsawe11e3de1999-01-28 19:51:51 +000047
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000048-f reads the names of tests from the file given as f's argument, one
49or more test names per line. Whitespace is ignored. Blank lines and
50lines beginning with '#' are ignored. This is especially useful for
51whittling down failures involving interactions among tests.
Tim Petersc5000df2002-06-02 21:42:01 +000052
Skip Montanaro0179a182004-06-06 15:53:18 +000053-L causes the leaks(1) command to be run just before exit if it exists.
54leaks(1) is available on Mac OS X and presumably on some other
55FreeBSD-derived systems.
56
Michael W. Hudson61147f62004-08-03 11:33:28 +000057-R runs each test several times and examines sys.gettotalrefcount() to
58see if the test appears to be leaking references. The argument should
59be of the form stab:run:fname where 'stab' is the number of times the
60test is run to let gettotalrefcount settle down, 'run' is the number
61of times further it is run and 'fname' is the name of the file the
62reports are written to. These parameters all have defaults (5, 4 and
63"reflog.txt" respectively), so the minimal invocation is '-R ::'.
64
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000065-u is used to specify which special resource intensive tests to run,
66such as those requiring large file support or network connectivity.
67The argument is a comma-separated list of words indicating the
68resources to test. Currently only the following are defined:
Barry Warsaw08fca522001-08-20 22:33:46 +000069
Fred Drake3a15dac2002-04-11 16:39:16 +000070 all - Enable all special resources.
71
Guido van Rossum315aa362003-03-11 14:46:48 +000072 audio - Tests that use the audio device. (There are known
73 cases of broken audio drivers that can crash Python or
74 even the Linux kernel.)
75
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000076 curses - Tests that use curses and will modify the terminal's
77 state and output modes.
Tim Peters1633a2e2001-10-30 05:56:40 +000078
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000079 largefile - It is okay to run some test that may create huge
80 files. These tests can take a long time and may
81 consume >2GB of disk space temporarily.
Barry Warsaw08fca522001-08-20 22:33:46 +000082
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000083 network - It is okay to run tests that use external network
84 resource, e.g. testing SSL support for sockets.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +000085
86 bsddb - It is okay to run the bsddb testsuite, which takes
87 a long time to complete.
Fred Drake4dd0f7e2002-11-26 21:44:56 +000088
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000089 decimal - Test the decimal module against a large suite that
90 verifies compliance with standards.
91
Jeremy Hylton4336eda2004-08-07 19:25:33 +000092 compiler - Test the compiler package by compiling all the source
93 in the standard library and test suite. This takes
94 a long time.
95
Tim Peterseba28be2005-03-28 01:08:02 +000096 subprocess Run all tests for the subprocess module.
Peter Astrandf7f1bb72005-03-03 20:47:37 +000097
Fred Drake4dd0f7e2002-11-26 21:44:56 +000098To enable all resources except one, use '-uall,-<resource>'. For
99example, to run all the tests except for the bsddb tests, give the
100option '-uall,-bsddb'.
Guido van Rossum152494a1996-12-20 03:12:20 +0000101"""
102
Guido van Rossum152494a1996-12-20 03:12:20 +0000103import os
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000104import sys
Guido van Rossum152494a1996-12-20 03:12:20 +0000105import getopt
Skip Montanaroab1c7912000-06-30 16:39:27 +0000106import random
Guido van Rossumdc15c272002-08-12 21:55:51 +0000107import warnings
Michael W. Hudson61147f62004-08-03 11:33:28 +0000108import sre
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000109import cStringIO
110import traceback
Guido van Rossumdc15c272002-08-12 21:55:51 +0000111
112# I see no other way to suppress these warnings;
113# putting them in test_grammar.py has no effect:
Guido van Rossum88b1def2002-08-14 17:54:48 +0000114warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
Guido van Rossumdc15c272002-08-12 21:55:51 +0000115 ".*test.test_grammar$")
Guido van Rossumc34c4fc2002-09-19 00:42:16 +0000116if sys.maxint > 0x7fffffff:
117 # Also suppress them in <string>, because for 64-bit platforms,
118 # that's where test_grammar.py hides them.
119 warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
120 "<string>")
Guido van Rossum152494a1996-12-20 03:12:20 +0000121
Guido van Rossumbb484652002-12-02 09:56:21 +0000122# MacOSX (a.k.a. Darwin) has a default stack size that is too small
123# for deeply recursive regular expressions. We see this as crashes in
124# the Python test suite when running test_re.py and test_sre.py. The
125# fix is to set the stack limit to 2048.
126# This approach may also be useful for other Unixy platforms that
127# suffer from small default stack limits.
128if sys.platform == 'darwin':
129 try:
130 import resource
131 except ImportError:
132 pass
133 else:
134 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
135 newsoft = min(hard, max(soft, 1024*2048))
136 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
137
Barry Warsaw04f357c2002-07-23 19:04:11 +0000138from test import test_support
Fred Drake3a15dac2002-04-11 16:39:16 +0000139
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000140RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
Peter Astrandf7f1bb72005-03-03 20:47:37 +0000141 'decimal', 'compiler', 'subprocess')
Fred Drake3a15dac2002-04-11 16:39:16 +0000142
143
Barry Warsaw08fca522001-08-20 22:33:46 +0000144def usage(code, msg=''):
145 print __doc__
146 if msg: print msg
147 sys.exit(code)
148
149
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000150def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False,
151 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000152 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
153 runleaks=False, huntrleaks=False):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000154 """Execute a test suite.
155
Thomas Wouters7e474022000-07-16 12:04:32 +0000156 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000157 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000158
159 tests -- a list of strings containing test names (optional)
160 testdir -- the directory in which to look for tests (optional)
161
162 Users other than the Python test suite will certainly want to
163 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000164 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000165
166 If the tests argument is omitted, the tests listed on the
167 command-line will be used. If that's empty, too, then all *.py
168 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000169
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000170 The other default arguments (verbose, quiet, generate, exclude, single,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000171 randomize, findleaks, use_resources, trace and coverdir) allow programmers
172 calling main() directly to set the values that would normally be set by
173 flags on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000174 """
Fred Drake004d5e62000-10-23 17:22:08 +0000175
Tim Peters8dee8092001-09-25 20:05:11 +0000176 test_support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000177 try:
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000178 opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:',
Barry Warsaw08fca522001-08-20 22:33:46 +0000179 ['help', 'verbose', 'quiet', 'generate',
Tim Petersc5000df2002-06-02 21:42:01 +0000180 'exclude', 'single', 'random', 'fromfile',
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000181 'findleaks', 'use=', 'threshold=', 'trace',
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000182 'coverdir=', 'nocoverdir', 'runleaks',
183 'huntrleaks='
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000184 ])
Guido van Rossum152494a1996-12-20 03:12:20 +0000185 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000186 usage(2, msg)
187
188 # Defaults
189 if use_resources is None:
190 use_resources = []
Guido van Rossum152494a1996-12-20 03:12:20 +0000191 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000192 if o in ('-h', '--help'):
193 usage(0)
194 elif o in ('-v', '--verbose'):
195 verbose += 1
196 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000197 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000198 verbose = 0
199 elif o in ('-g', '--generate'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000200 generate = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000201 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000202 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000203 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000204 single = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000205 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000206 randomize = True
Tim Petersc5000df2002-06-02 21:42:01 +0000207 elif o in ('-f', '--fromfile'):
208 fromfile = a
Barry Warsaw08fca522001-08-20 22:33:46 +0000209 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000210 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000211 elif o in ('-L', '--runleaks'):
212 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000213 elif o in ('-t', '--threshold'):
214 import gc
215 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000216 elif o in ('-T', '--coverage'):
217 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000218 elif o in ('-D', '--coverdir'):
219 coverdir = os.path.join(os.getcwd(), a)
220 elif o in ('-N', '--nocoverdir'):
221 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000222 elif o in ('-R', '--huntrleaks'):
223 huntrleaks = a.split(':')
224 if len(huntrleaks) != 3:
225 print a, huntrleaks
226 usage(2, '-R takes three colon-separated arguments')
227 if len(huntrleaks[0]) == 0:
228 huntrleaks[0] = 5
229 else:
230 huntrleaks[0] = int(huntrleaks[0])
231 if len(huntrleaks[1]) == 0:
232 huntrleaks[1] = 4
233 else:
234 huntrleaks[1] = int(huntrleaks[1])
235 if len(huntrleaks[2]) == 0:
236 huntrleaks[2] = "reflog.txt"
Barry Warsaw08fca522001-08-20 22:33:46 +0000237 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000238 u = [x.lower() for x in a.split(',')]
239 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000240 if r == 'all':
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000241 use_resources[:] = RESOURCE_NAMES
242 continue
243 remove = False
244 if r[0] == '-':
245 remove = True
246 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000247 if r not in RESOURCE_NAMES:
248 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000249 if remove:
250 if r in use_resources:
251 use_resources.remove(r)
252 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000253 use_resources.append(r)
Guido van Rossuma4122201997-08-18 20:08:24 +0000254 if generate and verbose:
Barry Warsaw08fca522001-08-20 22:33:46 +0000255 usage(2, "-g and -v don't go together!")
Tim Petersc5000df2002-06-02 21:42:01 +0000256 if single and fromfile:
257 usage(2, "-s and -f don't go together!")
Barry Warsaw08fca522001-08-20 22:33:46 +0000258
Guido van Rossum152494a1996-12-20 03:12:20 +0000259 good = []
260 bad = []
261 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000262 resource_denieds = []
Barry Warsawe11e3de1999-01-28 19:51:51 +0000263
Neil Schemenauerd569f232000-09-22 15:29:28 +0000264 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000265 try:
266 import gc
267 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000268 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000269 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000270 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000271 # Uncomment the line below to report garbage that is not
272 # freeable by reference counting alone. By default only
273 # garbage that is not collectable by the GC is reported.
274 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000275 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000276
Barry Warsawe11e3de1999-01-28 19:51:51 +0000277 if single:
278 from tempfile import gettempdir
279 filename = os.path.join(gettempdir(), 'pynexttest')
280 try:
281 fp = open(filename, 'r')
Eric S. Raymondfc170b12001-02-09 11:51:27 +0000282 next = fp.read().strip()
Barry Warsawe11e3de1999-01-28 19:51:51 +0000283 tests = [next]
284 fp.close()
285 except IOError:
286 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000287
288 if fromfile:
289 tests = []
290 fp = open(fromfile)
291 for line in fp:
292 guts = line.split() # assuming no test has whitespace in its name
293 if guts and not guts[0].startswith('#'):
294 tests.extend(guts)
295 fp.close()
296
297 # Strip .py extensions.
298 if args:
299 args = map(removepy, args)
300 if tests:
301 tests = map(removepy, tests)
302
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000303 stdtests = STDTESTS[:]
304 nottests = NOTTESTS[:]
Guido van Rossum152494a1996-12-20 03:12:20 +0000305 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000306 for arg in args:
307 if arg in stdtests:
308 stdtests.remove(arg)
309 nottests[:0] = args
Guido van Rossum41360a41998-03-26 19:42:58 +0000310 args = []
Guido van Rossum747e1ca1998-08-24 13:48:36 +0000311 tests = tests or args or findtests(testdir, stdtests, nottests)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000312 if single:
313 tests = tests[:1]
Skip Montanaroab1c7912000-06-30 16:39:27 +0000314 if randomize:
315 random.shuffle(tests)
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000316 if trace:
317 import trace
318 tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
319 trace=False, count=True)
Guido van Rossum41360a41998-03-26 19:42:58 +0000320 test_support.verbose = verbose # Tell tests to be moderately quiet
Barry Warsaw08fca522001-08-20 22:33:46 +0000321 test_support.use_resources = use_resources
Guido van Rossum5796d262000-04-21 21:35:06 +0000322 save_modules = sys.modules.keys()
Guido van Rossum152494a1996-12-20 03:12:20 +0000323 for test in tests:
Guido van Rossum41360a41998-03-26 19:42:58 +0000324 if not quiet:
325 print test
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000326 sys.stdout.flush()
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000327 if trace:
328 # If we're tracing code coverage, then we don't exit with status
329 # if on a false return value from main.
330 tracer.runctx('runtest(test, generate, verbose, quiet, testdir)',
331 globals=globals(), locals=vars())
Guido van Rossum41360a41998-03-26 19:42:58 +0000332 else:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000333 ok = runtest(test, generate, verbose, quiet, testdir, huntrleaks)
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000334 if ok > 0:
335 good.append(test)
336 elif ok == 0:
337 bad.append(test)
338 else:
339 skipped.append(test)
340 if ok == -2:
341 resource_denieds.append(test)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000342 if findleaks:
343 gc.collect()
344 if gc.garbage:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000345 print "Warning: test created", len(gc.garbage),
346 print "uncollectable object(s)."
347 # move the uncollectable objects somewhere so we don't see
348 # them again
Neil Schemenauerd569f232000-09-22 15:29:28 +0000349 found_garbage.extend(gc.garbage)
350 del gc.garbage[:]
Guido van Rossum5796d262000-04-21 21:35:06 +0000351 # Unload the newly imported modules (best effort finalization)
352 for module in sys.modules.keys():
Guido van Rossum51931142000-05-05 14:27:39 +0000353 if module not in save_modules and module.startswith("test."):
Guido van Rossum5796d262000-04-21 21:35:06 +0000354 test_support.unload(module)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000355
356 # The lists won't be sorted if running with -r
357 good.sort()
358 bad.sort()
359 skipped.sort()
Tim Peterse0c446b2001-10-18 21:57:37 +0000360
Guido van Rossum152494a1996-12-20 03:12:20 +0000361 if good and not quiet:
Guido van Rossum41360a41998-03-26 19:42:58 +0000362 if not bad and not skipped and len(good) > 1:
363 print "All",
364 print count(len(good), "test"), "OK."
Tim Peters1a4d77b2000-12-30 22:21:22 +0000365 if verbose:
Barry Warsaw408b6d32002-07-30 23:27:12 +0000366 print "CAUTION: stdout isn't compared in verbose mode:"
367 print "a test that passes in verbose mode may fail without it."
Guido van Rossum152494a1996-12-20 03:12:20 +0000368 if bad:
Tim Petersa45da922001-08-12 03:45:50 +0000369 print count(len(bad), "test"), "failed:"
370 printlist(bad)
Guido van Rossum152494a1996-12-20 03:12:20 +0000371 if skipped and not quiet:
Tim Petersa45da922001-08-12 03:45:50 +0000372 print count(len(skipped), "test"), "skipped:"
373 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000374
Tim Petersb5b7b782001-08-12 01:20:39 +0000375 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000376 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000377 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000378 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000379 if surprise:
380 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000381 "unexpected on", plat + ":"
382 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000383 else:
384 print "Those skips are all expected on", plat + "."
385 else:
386 print "Ask someone to teach regrtest.py about which tests are"
387 print "expected to get skipped on", plat + "."
388
Barry Warsawe11e3de1999-01-28 19:51:51 +0000389 if single:
390 alltests = findtests(testdir, stdtests, nottests)
391 for i in range(len(alltests)):
392 if tests[0] == alltests[i]:
393 if i == len(alltests) - 1:
394 os.unlink(filename)
395 else:
396 fp = open(filename, 'w')
397 fp.write(alltests[i+1] + '\n')
398 fp.close()
399 break
400 else:
401 os.unlink(filename)
402
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000403 if trace:
404 r = tracer.results()
405 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
406
Skip Montanaro0179a182004-06-06 15:53:18 +0000407 if runleaks:
408 os.system("leaks %d" % os.getpid())
409
Tim Peters5943b4a2003-07-23 00:30:39 +0000410 sys.exit(len(bad) > 0)
Barry Warsaw08fca522001-08-20 22:33:46 +0000411
Guido van Rossum152494a1996-12-20 03:12:20 +0000412
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000413STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000414 'test_grammar',
415 'test_opcodes',
416 'test_operations',
417 'test_builtin',
418 'test_exceptions',
419 'test_types',
420 ]
421
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000422NOTTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000423 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000424 'test_future1',
425 'test_future2',
Jeremy Hylton8471a352001-08-20 20:33:42 +0000426 'test_future3',
Guido van Rossum152494a1996-12-20 03:12:20 +0000427 ]
428
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000429def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000430 """Return a list of all applicable test modules."""
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000431 if not testdir: testdir = findtestdir()
Guido van Rossum152494a1996-12-20 03:12:20 +0000432 names = os.listdir(testdir)
433 tests = []
434 for name in names:
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000435 if name[:5] == "test_" and name[-3:] == os.extsep+"py":
Guido van Rossum41360a41998-03-26 19:42:58 +0000436 modname = name[:-3]
437 if modname not in stdtests and modname not in nottests:
438 tests.append(modname)
Guido van Rossum152494a1996-12-20 03:12:20 +0000439 tests.sort()
440 return stdtests + tests
441
Michael W. Hudson61147f62004-08-03 11:33:28 +0000442def runtest(test, generate, verbose, quiet, testdir=None, huntrleaks=False):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000443 """Run a single test.
444 test -- the name of the test
445 generate -- if true, generate output, instead of running the test
446 and comparing it to a previously created output file
447 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000448 quiet -- if true, don't print 'skipped' messages (probably redundant)
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000449 testdir -- test directory
450 """
Guido van Rossum152494a1996-12-20 03:12:20 +0000451 test_support.unload(test)
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000452 if not testdir:
453 testdir = findtestdir()
Guido van Rossum152494a1996-12-20 03:12:20 +0000454 outputdir = os.path.join(testdir, "output")
455 outputfile = os.path.join(outputdir, test)
Tim Peters9390cc12001-09-28 20:14:46 +0000456 if verbose:
Guido van Rossum41360a41998-03-26 19:42:58 +0000457 cfp = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000458 else:
Raymond Hettinger74e67662003-05-17 20:44:12 +0000459 cfp = cStringIO.StringIO()
Michael W. Hudson61147f62004-08-03 11:33:28 +0000460 if huntrleaks:
461 refrep = open(huntrleaks[2], "a")
Guido van Rossum152494a1996-12-20 03:12:20 +0000462 try:
Tim Peters342ca752001-09-25 19:13:20 +0000463 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +0000464 try:
465 if cfp:
466 sys.stdout = cfp
467 print test # Output file starts with test name
Barry Warsaw408b6d32002-07-30 23:27:12 +0000468 if test.startswith('test.'):
469 abstest = test
470 else:
471 # Always import it from the test package
472 abstest = 'test.' + test
473 the_package = __import__(abstest, globals(), locals(), [])
474 the_module = getattr(the_package, test)
Tim Petersd9742212001-05-22 18:28:25 +0000475 # Most tests run to completion simply as a side-effect of
476 # being imported. For the benefit of tests that can't run
477 # that way (like test_threaded_import), explicitly invoke
478 # their test_main() function (if it exists).
479 indirect_test = getattr(the_module, "test_main", None)
480 if indirect_test is not None:
481 indirect_test()
Michael W. Hudson61147f62004-08-03 11:33:28 +0000482 if huntrleaks:
483 # This code *is* hackish and inelegant, yes.
484 # But it seems to do the job.
485 import copy_reg
486 fs = warnings.filters[:]
487 ps = copy_reg.dispatch_table.copy()
488 pic = sys.path_importer_cache.copy()
489 import gc
490 def cleanup():
491 import _strptime, urlparse, warnings, dircache
492 from distutils.dir_util import _path_created
493 _path_created.clear()
494 warnings.filters[:] = fs
495 gc.collect()
496 sre.purge()
497 _strptime._regex_cache.clear()
498 urlparse.clear_cache()
499 copy_reg.dispatch_table.clear()
500 copy_reg.dispatch_table.update(ps)
501 sys.path_importer_cache.clear()
502 sys.path_importer_cache.update(pic)
503 dircache.reset()
504 if indirect_test:
505 def run_the_test():
506 indirect_test()
507 else:
508 def run_the_test():
509 reload(the_module)
510 deltas = []
511 repcount = huntrleaks[0] + huntrleaks[1]
512 print >> sys.stderr, "beginning", repcount, "repetitions"
513 print >> sys.stderr, \
514 ("1234567890"*(repcount//10 + 1))[:repcount]
515 for i in range(repcount):
516 rc = sys.gettotalrefcount()
517 run_the_test()
518 sys.stderr.write('.')
519 cleanup()
520 deltas.append(sys.gettotalrefcount() - rc - 2)
521 print >>sys.stderr
522 if max(map(abs, deltas[-huntrleaks[1]:])) > 0:
Michael W. Hudsone667e662004-08-12 18:27:48 +0000523 print >>sys.stderr, test, 'leaked', \
524 deltas[-huntrleaks[1]:], 'references'
Michael W. Hudson61147f62004-08-03 11:33:28 +0000525 print >>refrep, test, 'leaked', \
526 deltas[-huntrleaks[1]:], 'references'
527 # The end of the huntrleaks hackishness.
Guido van Rossum41360a41998-03-26 19:42:58 +0000528 finally:
Tim Peters342ca752001-09-25 19:13:20 +0000529 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +0000530 except test_support.ResourceDenied, msg:
531 if not quiet:
532 print test, "skipped --", msg
533 sys.stdout.flush()
534 return -2
Thomas Wouters3af826e2000-08-04 13:17:51 +0000535 except (ImportError, test_support.TestSkipped), msg:
Trent Mickf29f47b2000-08-11 19:02:59 +0000536 if not quiet:
Fred Drakede4742b2002-10-17 20:36:08 +0000537 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000538 sys.stdout.flush()
Guido van Rossum41360a41998-03-26 19:42:58 +0000539 return -1
Fred Drakefe5c22a2000-08-18 16:04:05 +0000540 except KeyboardInterrupt:
541 raise
Guido van Rossum152494a1996-12-20 03:12:20 +0000542 except test_support.TestFailed, msg:
Guido van Rossum41360a41998-03-26 19:42:58 +0000543 print "test", test, "failed --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000544 sys.stdout.flush()
Guido van Rossum41360a41998-03-26 19:42:58 +0000545 return 0
Guido van Rossum9e48b271997-07-16 01:56:13 +0000546 except:
Guido van Rossum41360a41998-03-26 19:42:58 +0000547 type, value = sys.exc_info()[:2]
Fred Drake27c4b392000-08-23 20:34:40 +0000548 print "test", test, "crashed --", str(type) + ":", value
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000549 sys.stdout.flush()
Guido van Rossum41360a41998-03-26 19:42:58 +0000550 if verbose:
551 traceback.print_exc(file=sys.stdout)
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000552 sys.stdout.flush()
Guido van Rossum41360a41998-03-26 19:42:58 +0000553 return 0
Guido van Rossum152494a1996-12-20 03:12:20 +0000554 else:
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000555 if not cfp:
556 return 1
557 output = cfp.getvalue()
Fred Drakee51fe8d2001-05-29 17:10:51 +0000558 if generate:
Fred Drakee51fe8d2001-05-29 17:10:51 +0000559 if output == test + "\n":
560 if os.path.exists(outputfile):
561 # Write it since it already exists (and the contents
562 # may have changed), but let the user know it isn't
563 # needed:
Fred Drakee51fe8d2001-05-29 17:10:51 +0000564 print "output file", outputfile, \
565 "is no longer needed; consider removing it"
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000566 else:
567 # We don't need it, so don't create it.
568 return 1
569 fp = open(outputfile, "w")
570 fp.write(output)
571 fp.close()
572 return 1
573 if os.path.exists(outputfile):
574 fp = open(outputfile, "r")
575 expected = fp.read()
576 fp.close()
577 else:
578 expected = test + "\n"
Michael W. Hudson61147f62004-08-03 11:33:28 +0000579 if output == expected or huntrleaks:
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000580 return 1
581 print "test", test, "produced unexpected output:"
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000582 sys.stdout.flush()
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000583 reportdiff(expected, output)
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000584 sys.stdout.flush()
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000585 return 0
586
587def reportdiff(expected, output):
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000588 import difflib
Tim Petersc377b162001-09-22 05:31:03 +0000589 print "*" * 70
590 a = expected.splitlines(1)
591 b = output.splitlines(1)
Guido van Rossumcf691932001-09-21 21:06:22 +0000592 sm = difflib.SequenceMatcher(a=a, b=b)
593 tuples = sm.get_opcodes()
Tim Petersc377b162001-09-22 05:31:03 +0000594
Guido van Rossumcf691932001-09-21 21:06:22 +0000595 def pair(x0, x1):
Tim Petersc377b162001-09-22 05:31:03 +0000596 # x0:x1 are 0-based slice indices; convert to 1-based line indices.
Guido van Rossumcf691932001-09-21 21:06:22 +0000597 x0 += 1
598 if x0 >= x1:
Tim Petersc377b162001-09-22 05:31:03 +0000599 return "line " + str(x0)
Guido van Rossumcf691932001-09-21 21:06:22 +0000600 else:
Tim Petersc377b162001-09-22 05:31:03 +0000601 return "lines %d-%d" % (x0, x1)
602
Guido van Rossumcf691932001-09-21 21:06:22 +0000603 for op, a0, a1, b0, b1 in tuples:
604 if op == 'equal':
605 pass
Tim Petersc377b162001-09-22 05:31:03 +0000606
Guido van Rossumcf691932001-09-21 21:06:22 +0000607 elif op == 'delete':
Tim Petersc377b162001-09-22 05:31:03 +0000608 print "***", pair(a0, a1), "of expected output missing:"
Guido van Rossumcf691932001-09-21 21:06:22 +0000609 for line in a[a0:a1]:
Tim Petersc377b162001-09-22 05:31:03 +0000610 print "-", line,
611
Guido van Rossumcf691932001-09-21 21:06:22 +0000612 elif op == 'replace':
Tim Petersc377b162001-09-22 05:31:03 +0000613 print "*** mismatch between", pair(a0, a1), "of expected", \
614 "output and", pair(b0, b1), "of actual output:"
615 for line in difflib.ndiff(a[a0:a1], b[b0:b1]):
616 print line,
617
Guido van Rossumcf691932001-09-21 21:06:22 +0000618 elif op == 'insert':
Tim Petersc377b162001-09-22 05:31:03 +0000619 print "***", pair(b0, b1), "of actual output doesn't appear", \
620 "in expected output after line", str(a1)+":"
Guido van Rossumcf691932001-09-21 21:06:22 +0000621 for line in b[b0:b1]:
Tim Petersc377b162001-09-22 05:31:03 +0000622 print "+", line,
623
Guido van Rossumcf691932001-09-21 21:06:22 +0000624 else:
625 print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1)
Tim Petersc377b162001-09-22 05:31:03 +0000626
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000627 print "*" * 70
Guido van Rossum152494a1996-12-20 03:12:20 +0000628
629def findtestdir():
630 if __name__ == '__main__':
Guido van Rossum41360a41998-03-26 19:42:58 +0000631 file = sys.argv[0]
Guido van Rossum152494a1996-12-20 03:12:20 +0000632 else:
Guido van Rossum41360a41998-03-26 19:42:58 +0000633 file = __file__
Guido van Rossum152494a1996-12-20 03:12:20 +0000634 testdir = os.path.dirname(file) or os.curdir
635 return testdir
636
Tim Petersc5000df2002-06-02 21:42:01 +0000637def removepy(name):
638 if name.endswith(os.extsep + "py"):
639 name = name[:-3]
640 return name
641
Guido van Rossum152494a1996-12-20 03:12:20 +0000642def count(n, word):
643 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000644 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +0000645 else:
Guido van Rossum41360a41998-03-26 19:42:58 +0000646 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +0000647
Tim Petersa45da922001-08-12 03:45:50 +0000648def printlist(x, width=70, indent=4):
Tim Peters7c7efe92002-08-23 17:55:54 +0000649 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +0000650
651 Optional arg width (default 70) is the maximum line length.
652 Optional arg indent (default 4) is the number of blanks with which to
653 begin each line.
654 """
655
Tim Petersba78bc42002-07-04 19:45:06 +0000656 from textwrap import fill
657 blanks = ' ' * indent
658 print fill(' '.join(map(str, x)), width,
659 initial_indent=blanks, subsequent_indent=blanks)
Tim Petersa45da922001-08-12 03:45:50 +0000660
Tim Petersde14a302002-04-01 05:04:46 +0000661# Map sys.platform to a string containing the basenames of tests
662# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +0000663#
664# Special cases:
665# test_pep277
666# The _ExpectedSkips constructor adds this to the set of expected
667# skips if not os.path.supports_unicode_filenames.
Tim Peters1b445d32002-11-24 18:53:11 +0000668# test_normalization
669# Whether a skip is expected here depends on whether a large test
670# input file has been downloaded. test_normalization.skip_expected
Tim Peters1babdfc2002-11-24 19:19:09 +0000671# controls that.
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000672# test_socket_ssl
673# Controlled by test_socket_ssl.skip_expected. Requires the network
674# resource, and a socket module with ssl support.
Neal Norwitz55b61d22003-02-28 19:57:03 +0000675# test_timeout
676# Controlled by test_timeout.skip_expected. Requires the network
677# resource and a socket module.
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000678# test_codecmaps_*
679# Whether a skip is expected here depends on whether a large test
680# input file has been downloaded. test_codecmaps_*.skip_expected
681# controls that.
Tim Petersde14a302002-04-01 05:04:46 +0000682
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000683_expectations = {
684 'win32':
685 """
Tim Petersc7c516a2003-09-20 22:06:13 +0000686 test__locale
Raymond Hettinger901dc982003-11-20 19:02:02 +0000687 test_applesingle
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000688 test_al
Skip Montanaro823ba282003-05-06 20:36:24 +0000689 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +0000690 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000691 test_cd
692 test_cl
693 test_commands
694 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +0000695 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000696 test_dbm
697 test_dl
698 test_fcntl
699 test_fork1
700 test_gdbm
701 test_gl
702 test_grp
703 test_imgfile
Tim Petersfd8e6e52003-03-04 00:26:38 +0000704 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000705 test_largefile
706 test_linuxaudiodev
707 test_mhlib
708 test_nis
709 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +0000710 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000711 test_poll
Tim Peters003eb302003-02-17 21:48:48 +0000712 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000713 test_pty
714 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +0000715 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000716 test_signal
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000717 test_sunaudiodev
Tim Peterscea2cc42004-08-04 02:32:03 +0000718 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000719 test_timing
720 """,
721 'linux2':
722 """
723 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000724 test_applesingle
Skip Montanaro823ba282003-05-06 20:36:24 +0000725 test_bsddb185
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000726 test_cd
727 test_cl
Guido van Rossumf66dacd2001-10-23 15:10:55 +0000728 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000729 test_dl
730 test_gl
731 test_imgfile
732 test_largefile
Guido van Rossum4507ec72003-02-14 19:29:22 +0000733 test_linuxaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000734 test_nis
735 test_ntpath
Guido van Rossum4507ec72003-02-14 19:29:22 +0000736 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000737 test_sunaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000738 """,
Jack Jansen49a806e2001-08-28 14:49:00 +0000739 'mac':
Guido van Rossumaa782362001-09-02 03:58:41 +0000740 """
741 test_al
Jack Jansen67975142003-01-08 16:31:11 +0000742 test_atexit
Guido van Rossumaa782362001-09-02 03:58:41 +0000743 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +0000744 test_bsddb185
Jack Jansen67975142003-01-08 16:31:11 +0000745 test_bsddb3
746 test_bz2
Guido van Rossumaa782362001-09-02 03:58:41 +0000747 test_cd
748 test_cl
749 test_commands
750 test_crypt
Jack Jansenb3be2162001-11-30 14:16:36 +0000751 test_curses
Guido van Rossumaa782362001-09-02 03:58:41 +0000752 test_dbm
753 test_dl
754 test_fcntl
755 test_fork1
756 test_gl
757 test_grp
Jack Jansenc4d6bdd2003-03-07 15:38:11 +0000758 test_ioctl
Guido van Rossumaa782362001-09-02 03:58:41 +0000759 test_imgfile
760 test_largefile
761 test_linuxaudiodev
762 test_locale
763 test_mmap
764 test_nis
765 test_ntpath
766 test_openpty
Jack Jansen67975142003-01-08 16:31:11 +0000767 test_ossaudiodev
Guido van Rossumaa782362001-09-02 03:58:41 +0000768 test_poll
Jack Jansen67975142003-01-08 16:31:11 +0000769 test_popen
Guido van Rossumaa782362001-09-02 03:58:41 +0000770 test_popen2
Jack Jansen5bb97e62003-02-21 22:33:55 +0000771 test_posix
Guido van Rossumaa782362001-09-02 03:58:41 +0000772 test_pty
773 test_pwd
Jack Jansen67975142003-01-08 16:31:11 +0000774 test_resource
Guido van Rossumaa782362001-09-02 03:58:41 +0000775 test_signal
Guido van Rossumaa782362001-09-02 03:58:41 +0000776 test_sunaudiodev
777 test_sundry
Jack Jansenc4d6bdd2003-03-07 15:38:11 +0000778 test_tarfile
Guido van Rossumaa782362001-09-02 03:58:41 +0000779 test_timing
Guido van Rossumaa782362001-09-02 03:58:41 +0000780 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000781 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +0000782 """
783 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000784 test_applesingle
Martin v. Löwis0ace3262001-09-05 14:38:48 +0000785 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +0000786 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +0000787 test_cd
788 test_cl
789 test_dl
790 test_gl
791 test_imgfile
792 test_largefile
793 test_linuxaudiodev
794 test_minidom
795 test_nis
796 test_ntpath
797 test_openpty
798 test_pyexpat
799 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +0000800 test_sunaudiodev
801 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +0000802 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000803 'openunix8':
804 """
805 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000806 test_applesingle
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000807 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +0000808 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000809 test_cd
810 test_cl
811 test_dl
812 test_gl
813 test_imgfile
814 test_largefile
815 test_linuxaudiodev
816 test_minidom
817 test_nis
818 test_ntpath
819 test_openpty
820 test_pyexpat
821 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000822 test_sunaudiodev
823 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000824 """,
825 'sco_sv3':
826 """
827 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000828 test_applesingle
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000829 test_asynchat
830 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +0000831 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000832 test_cd
833 test_cl
834 test_dl
835 test_fork1
836 test_gettext
837 test_gl
838 test_imgfile
839 test_largefile
840 test_linuxaudiodev
841 test_locale
842 test_minidom
843 test_nis
844 test_ntpath
845 test_openpty
846 test_pyexpat
847 test_queue
848 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000849 test_sunaudiodev
850 test_sundry
851 test_thread
852 test_threaded_import
853 test_threadedtempfile
854 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000855 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000856 'riscos':
857 """
858 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000859 test_applesingle
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000860 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000861 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000862 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +0000863 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000864 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000865 test_cd
866 test_cl
867 test_commands
868 test_crypt
869 test_dbm
870 test_dl
871 test_fcntl
872 test_fork1
873 test_gdbm
874 test_gl
875 test_grp
876 test_imgfile
877 test_largefile
878 test_linuxaudiodev
879 test_locale
880 test_mmap
881 test_nis
882 test_ntpath
883 test_openpty
884 test_poll
885 test_popen2
886 test_pty
887 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000888 test_strop
889 test_sunaudiodev
890 test_sundry
891 test_thread
892 test_threaded_import
893 test_threadedtempfile
894 test_threading
895 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000896 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +0000897 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +0000898 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +0000899 test__locale
Jack Jansen398c2362001-12-02 21:41:36 +0000900 test_al
Jack Jansenacda3392002-12-30 23:03:13 +0000901 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +0000902 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +0000903 test_cd
904 test_cl
905 test_curses
906 test_dl
907 test_gdbm
908 test_gl
909 test_imgfile
910 test_largefile
911 test_linuxaudiodev
Jack Jansenacda3392002-12-30 23:03:13 +0000912 test_locale
Jack Jansen398c2362001-12-02 21:41:36 +0000913 test_minidom
914 test_nis
915 test_ntpath
Jack Jansenacda3392002-12-30 23:03:13 +0000916 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +0000917 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +0000918 test_sunaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +0000919 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +0000920 'sunos5':
921 """
922 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000923 test_applesingle
Guido van Rossum11c3f092002-07-17 15:08:24 +0000924 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +0000925 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +0000926 test_cd
927 test_cl
928 test_curses
929 test_dbm
Guido van Rossum11c3f092002-07-17 15:08:24 +0000930 test_gdbm
931 test_gl
932 test_gzip
933 test_imgfile
934 test_linuxaudiodev
Guido van Rossum11c3f092002-07-17 15:08:24 +0000935 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +0000936 test_zipfile
937 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +0000938 """,
Skip Montanarob3230212002-03-15 02:54:03 +0000939 'hp-ux11':
940 """
941 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000942 test_applesingle
Skip Montanarob3230212002-03-15 02:54:03 +0000943 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +0000944 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +0000945 test_cd
946 test_cl
947 test_curses
948 test_dl
949 test_gdbm
950 test_gl
951 test_gzip
952 test_imgfile
953 test_largefile
954 test_linuxaudiodev
955 test_locale
956 test_minidom
957 test_nis
958 test_ntpath
959 test_openpty
960 test_pyexpat
961 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +0000962 test_sunaudiodev
Skip Montanarob3230212002-03-15 02:54:03 +0000963 test_zipfile
964 test_zlib
965 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000966 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +0000967 """
968 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000969 test_applesingle
Skip Montanaro823ba282003-05-06 20:36:24 +0000970 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +0000971 test_cd
972 test_cl
973 test_curses
974 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +0000975 test_gdbm
976 test_gl
977 test_imgfile
978 test_largefile
979 test_linuxaudiodev
980 test_locale
981 test_mhlib
982 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +0000983 test_nis
984 test_poll
985 test_popen2
986 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +0000987 test_sunaudiodev
Tim Petersc411dba2002-07-16 21:35:23 +0000988 """,
Jason Tishler25115942002-12-05 15:18:15 +0000989 'cygwin':
990 """
991 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +0000992 test_applesingle
Skip Montanaro823ba282003-05-06 20:36:24 +0000993 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +0000994 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +0000995 test_cd
996 test_cl
997 test_curses
998 test_dbm
Jason Tishler25115942002-12-05 15:18:15 +0000999 test_gl
1000 test_imgfile
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001001 test_ioctl
Jason Tishler25115942002-12-05 15:18:15 +00001002 test_largefile
1003 test_linuxaudiodev
1004 test_locale
Jason Tishler25115942002-12-05 15:18:15 +00001005 test_nis
Jason Tishler5c4ded22003-02-05 16:46:01 +00001006 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001007 test_socketserver
1008 test_sunaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001009 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001010 'os2emx':
1011 """
1012 test_al
Guido van Rossum944a6c32003-11-20 22:11:29 +00001013 test_applesingle
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001014 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001015 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001016 test_bsddb3
1017 test_cd
1018 test_cl
1019 test_commands
1020 test_curses
1021 test_dl
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001022 test_gl
1023 test_imgfile
1024 test_largefile
1025 test_linuxaudiodev
1026 test_mhlib
1027 test_mmap
1028 test_nis
1029 test_openpty
1030 test_ossaudiodev
1031 test_pty
1032 test_resource
1033 test_signal
1034 test_sunaudiodev
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001035 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001036 'freebsd4':
1037 """
1038 test_aepack
1039 test_al
1040 test_applesingle
1041 test_bsddb
1042 test_bsddb3
1043 test_cd
1044 test_cl
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001045 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001046 test_gl
1047 test_imgfile
1048 test_linuxaudiodev
1049 test_locale
1050 test_macfs
1051 test_macostools
1052 test_nis
1053 test_normalization
1054 test_ossaudiodev
1055 test_pep277
1056 test_plistlib
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001057 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001058 test_scriptpackages
1059 test_socket_ssl
1060 test_socketserver
1061 test_sunaudiodev
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001062 test_tcl
Guido van Rossum944a6c32003-11-20 22:11:29 +00001063 test_timeout
1064 test_unicode_file
1065 test_urllibnet
1066 test_winreg
1067 test_winsound
Martin v. Löwis56f88112003-06-07 20:01:37 +00001068 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001069}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001070_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001071_expectations['freebsd6'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001072
Tim Petersb5b7b782001-08-12 01:20:39 +00001073class _ExpectedSkips:
1074 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001075 import os.path
Tim Peters1b445d32002-11-24 18:53:11 +00001076 from test import test_normalization
Tim Petersb4ee4eb2002-12-04 03:26:57 +00001077 from test import test_socket_ssl
Neal Norwitz55b61d22003-02-28 19:57:03 +00001078 from test import test_timeout
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001079 from test import test_codecmaps_cn, test_codecmaps_jp
1080 from test import test_codecmaps_kr, test_codecmaps_tw
Hye-Shik Chang5ef60182004-07-19 06:39:37 +00001081 from test import test_codecmaps_hk
Tim Peters1b445d32002-11-24 18:53:11 +00001082
Tim Peters7c7efe92002-08-23 17:55:54 +00001083 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001084 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001085 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001086 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001087
Tim Peters2a182db2002-10-09 01:07:11 +00001088 if not os.path.supports_unicode_filenames:
1089 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001090
1091 if test_normalization.skip_expected:
1092 self.expected.add('test_normalization')
1093
Tim Petersb4ee4eb2002-12-04 03:26:57 +00001094 if test_socket_ssl.skip_expected:
1095 self.expected.add('test_socket_ssl')
1096
Neal Norwitz55b61d22003-02-28 19:57:03 +00001097 if test_timeout.skip_expected:
1098 self.expected.add('test_timeout')
1099
Hye-Shik Chang5ef60182004-07-19 06:39:37 +00001100 for cc in ('cn', 'jp', 'kr', 'tw', 'hk'):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001101 if eval('test_codecmaps_' + cc).skip_expected:
1102 self.expected.add('test_codecmaps_' + cc)
1103
Martin v. Löwisfba73692004-11-13 11:13:35 +00001104 if sys.maxint == 9223372036854775807L:
1105 self.expected.add('test_rgbimg')
1106 self.expected.add('test_imageop')
1107
Jack Jansen6afc5e02003-01-29 16:24:16 +00001108 if not sys.platform in ("mac", "darwin"):
Neal Norwitz7035c982003-03-29 22:01:17 +00001109 MAC_ONLY = ["test_macostools", "test_macfs", "test_aepack",
1110 "test_plistlib", "test_scriptpackages"]
1111 for skip in MAC_ONLY:
1112 self.expected.add(skip)
Tim Petersecd79eb2003-01-29 00:35:32 +00001113
1114 if sys.platform != "win32":
Neal Norwitz7035c982003-03-29 22:01:17 +00001115 WIN_ONLY = ["test_unicode_file", "test_winreg",
1116 "test_winsound"]
1117 for skip in WIN_ONLY:
1118 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001119
Tim Peters7c7efe92002-08-23 17:55:54 +00001120 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001121
1122 def isvalid(self):
1123 "Return true iff _ExpectedSkips knows about the current platform."
1124 return self.valid
1125
1126 def getexpected(self):
1127 """Return set of test names we expect to skip on current platform.
1128
1129 self.isvalid() must be true.
1130 """
1131
1132 assert self.isvalid()
1133 return self.expected
1134
Guido van Rossum152494a1996-12-20 03:12:20 +00001135if __name__ == '__main__':
Barry Warsaw408b6d32002-07-30 23:27:12 +00001136 # Remove regrtest.py's own directory from the module search path. This
1137 # prevents relative imports from working, and relative imports will screw
1138 # up the testing framework. E.g. if both test.test_support and
1139 # test_support are imported, they will not contain the same globals, and
1140 # much of the testing framework relies on the globals in the
1141 # test.test_support module.
1142 mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
1143 i = pathlen = len(sys.path)
1144 while i >= 0:
1145 i -= 1
1146 if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
1147 del sys.path[i]
1148 if len(sys.path) == pathlen:
1149 print 'Could not find %r in sys.path to remove it' % mydir
Barry Warsaw08fca522001-08-20 22:33:46 +00001150 main()