blob: b6883b570a9b1987ad7a27872f2a93d6d581f420 [file] [log] [blame]
Guido van Rossum152494a1996-12-20 03:12:20 +00001#! /usr/bin/env python
2
R. David Murray3bfa8832010-04-26 16:54:57 +00003"""
4Usage:
Guido van Rossum152494a1996-12-20 03:12:20 +00005
R. David Murray3bfa8832010-04-26 16:54:57 +00006python -m test.regrtest [options] [test_name1 [test_name2 ...]]
7python path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
Guido van Rossum152494a1996-12-20 03:12:20 +00008
R. David Murray3bfa8832010-04-26 16:54:57 +00009
10If no arguments or options are provided, finds all files matching
11the pattern "test_*" in the Lib/test subdirectory and runs
12them in alphabetical order (but see -M and -u, below, for exceptions).
13
14For more rigorous testing, it is useful to use the following
15command line:
16
17python -E -tt -Wd -3 -m test.regrtest [options] [test_name1 ...]
18
19
20Options:
Guido van Rossum152494a1996-12-20 03:12:20 +000021
Georg Brandl83191702009-10-27 20:55:44 +000022-h/--help -- print this text and exit
23
24Verbosity
25
26-v/--verbose -- run tests in verbose mode with output to stdout
27-w/--verbose2 -- re-run failed tests in verbose mode
28-W/--verbose3 -- re-run failed tests in verbose mode immediately
R. David Murray3bfa8832010-04-26 16:54:57 +000029-q/--quiet -- no output unless one or more tests fail
Georg Brandl83191702009-10-27 20:55:44 +000030-S/--slow -- print the slowest 10 tests
Antoine Pitrou8c688be2011-01-03 20:49:01 +000031 --header -- print header with interpreter info
Georg Brandl83191702009-10-27 20:55:44 +000032
33Selecting tests
34
Chris Jerdonek3684c792012-12-27 18:14:01 -080035-r/--randomize -- randomize test execution order (see below)
Antoine Pitrou8c688be2011-01-03 20:49:01 +000036 --randseed -- pass a random seed to reproduce a previous random run
Georg Brandl83191702009-10-27 20:55:44 +000037-f/--fromfile -- read names of tests to run from a file (see below)
38-x/--exclude -- arguments are tests to *exclude*
R. David Murray3bfa8832010-04-26 16:54:57 +000039-s/--single -- single step through a set of tests (see below)
Georg Brandl83191702009-10-27 20:55:44 +000040-u/--use RES1,RES2,...
41 -- specify which special resource intensive tests to run
42-M/--memlimit LIMIT
43 -- run very large memory-consuming tests
44
45Special runs
46
47-l/--findleaks -- if GC is available detect tests that leak memory
48-L/--runleaks -- run the leaks(1) command just before exit
49-R/--huntrleaks RUNCOUNTS
50 -- search for reference leaks (needs debug build, v. slow)
51-j/--multiprocess PROCESSES
52 -- run PROCESSES processes at once
R. David Murray3bfa8832010-04-26 16:54:57 +000053-T/--coverage -- turn on code coverage tracing using the trace module
Georg Brandl83191702009-10-27 20:55:44 +000054-D/--coverdir DIRECTORY
55 -- Directory where coverage files are put
56-N/--nocoverdir -- Put coverage files alongside modules
57-t/--threshold THRESHOLD
58 -- call gc.set_threshold(THRESHOLD)
R. David Murray3bfa8832010-04-26 16:54:57 +000059-F/--forever -- run the specified tests in a loop, until an error happens
Brett Cannon95374782015-10-02 16:21:34 -070060-P/--pgo -- enable Profile Guided Optimization training
Guido van Rossum152494a1996-12-20 03:12:20 +000061
R. David Murray3bfa8832010-04-26 16:54:57 +000062
63Additional Option Details:
Guido van Rossumf58ed251997-03-07 21:04:33 +000064
Serhiy Storchakac72e66a2015-11-02 15:06:09 +020065-r randomizes test execution order. You can use --randseed=int to provide an
Collin Wintera199f012009-03-29 03:44:19 +000066int seed value for the randomizer; this is useful for reproducing troublesome
67test orders.
68
R. David Murray3bfa8832010-04-26 16:54:57 +000069-s On the first invocation of regrtest using -s, the first test file found
70or the first test file given on the command line is run, and the name of
71the next test is recorded in a file named pynexttest. If run from the
72Python build directory, pynexttest is located in the 'build' subdirectory,
73otherwise it is located in tempfile.gettempdir(). On subsequent runs,
74the test in pynexttest is run, and the next test is written to pynexttest.
75When the last test has been run, pynexttest is deleted. In this way it
76is possible to single step through the test files. This is useful when
77doing memory analysis on the Python interpreter, which process tends to
78consume too many resources to run the full regression test non-stop.
Barry Warsawe11e3de1999-01-28 19:51:51 +000079
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000080-f reads the names of tests from the file given as f's argument, one
81or more test names per line. Whitespace is ignored. Blank lines and
82lines beginning with '#' are ignored. This is especially useful for
83whittling down failures involving interactions among tests.
Tim Petersc5000df2002-06-02 21:42:01 +000084
Skip Montanaro0179a182004-06-06 15:53:18 +000085-L causes the leaks(1) command to be run just before exit if it exists.
86leaks(1) is available on Mac OS X and presumably on some other
87FreeBSD-derived systems.
88
Michael W. Hudson61147f62004-08-03 11:33:28 +000089-R runs each test several times and examines sys.gettotalrefcount() to
90see if the test appears to be leaking references. The argument should
91be of the form stab:run:fname where 'stab' is the number of times the
92test is run to let gettotalrefcount settle down, 'run' is the number
93of times further it is run and 'fname' is the name of the file the
94reports are written to. These parameters all have defaults (5, 4 and
Florent Xicluna12d750d2010-03-06 14:38:09 +000095"reflog.txt" respectively), and the minimal invocation is '-R :'.
Michael W. Hudson61147f62004-08-03 11:33:28 +000096
Thomas Woutersabd08882006-04-26 15:53:30 +000097-M runs tests that require an exorbitant amount of memory. These tests
98typically try to ascertain containers keep working when containing more than
Armin Rigo97ff0472006-08-09 15:37:26 +0000992 billion objects, which only works on 64-bit systems. There are also some
100tests that try to exhaust the address space of the process, which only makes
101sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
Thomas Woutersabd08882006-04-26 15:53:30 +0000102which is a string in the form of '2.5Gb', determines howmuch memory the
103tests will limit themselves to (but they may go slightly over.) The number
104shouldn't be more memory than the machine has (including swap memory). You
105should also keep in mind that swap memory is generally much, much slower
106than RAM, and setting memlimit to all available RAM or higher will heavily
107tax the machine. On the other hand, it is no use running these tests with a
108limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
109to use more than memlimit memory will be skipped. The big-memory tests
110generally run very, very long.
111
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000112-u is used to specify which special resource intensive tests to run,
113such as those requiring large file support or network connectivity.
114The argument is a comma-separated list of words indicating the
115resources to test. Currently only the following are defined:
Barry Warsaw08fca522001-08-20 22:33:46 +0000116
Fred Drake3a15dac2002-04-11 16:39:16 +0000117 all - Enable all special resources.
118
Guido van Rossum315aa362003-03-11 14:46:48 +0000119 audio - Tests that use the audio device. (There are known
120 cases of broken audio drivers that can crash Python or
121 even the Linux kernel.)
122
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000123 curses - Tests that use curses and will modify the terminal's
124 state and output modes.
Tim Peters1633a2e2001-10-30 05:56:40 +0000125
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000126 largefile - It is okay to run some test that may create huge
127 files. These tests can take a long time and may
128 consume >2GB of disk space temporarily.
Barry Warsaw08fca522001-08-20 22:33:46 +0000129
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000130 network - It is okay to run tests that use external network
131 resource, e.g. testing SSL support for sockets.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +0000132
133 bsddb - It is okay to run the bsddb testsuite, which takes
134 a long time to complete.
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000135
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000136 decimal - Test the decimal module against a large suite that
137 verifies compliance with standards.
138
Antoine Pitroud989f822010-10-14 15:43:25 +0000139 cpu - Used for certain CPU-heavy tests.
Jeremy Hylton4336eda2004-08-07 19:25:33 +0000140
Tim Peterseba28be2005-03-28 01:08:02 +0000141 subprocess Run all tests for the subprocess module.
Peter Astrandf7f1bb72005-03-03 20:47:37 +0000142
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000143 urlfetch - It is okay to download files required on testing.
144
Guilherme Polob1a98de2009-01-28 20:03:26 +0000145 gui - Run tests that require a running GUI.
146
Collin Winterf8089c72009-04-09 16:46:46 +0000147 xpickle - Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
148 test backwards compatibility. These tests take a long time
149 to run.
150
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000151To enable all resources except one, use '-uall,-<resource>'. For
152example, to run all the tests except for the bsddb tests, give the
153option '-uall,-bsddb'.
Guido van Rossum152494a1996-12-20 03:12:20 +0000154"""
155
Michael Foord91a2c892010-04-08 00:04:24 +0000156import StringIO
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000157import getopt
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000158import json
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000159import os
160import random
161import re
Serhiy Storchakabb801312013-02-10 12:01:31 +0200162import shutil
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000163import sys
164import time
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000165import traceback
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000166import warnings
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000167import unittest
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000168import tempfile
Ezio Melottidde5b942010-02-03 05:37:26 +0000169import imp
Florent Xiclunab7c20022010-03-06 09:11:55 +0000170import platform
Florent Xicluna0932dc52010-03-06 08:07:44 +0000171import sysconfig
Guido van Rossumdc15c272002-08-12 21:55:51 +0000172
Guido van Rossum152494a1996-12-20 03:12:20 +0000173
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000174# Some times __path__ and __file__ are not absolute (e.g. while running from
175# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
176# imports might fail. This affects only the modules imported before os.chdir().
177# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
178# they are found in the CWD their __file__ and __path__ will be relative (this
179# happens before the chdir). All the modules imported after the chdir, are
180# not found in the CWD, and since the other paths in sys.path[1:] are absolute
181# (site.py absolutize them), the __file__ and __path__ will be absolute too.
182# Therefore it is necessary to absolutize manually the __file__ and __path__ of
183# the packages to prevent later imports to fail when the CWD is different.
184for module in sys.modules.itervalues():
185 if hasattr(module, '__path__'):
186 module.__path__ = [os.path.abspath(path) for path in module.__path__]
187 if hasattr(module, '__file__'):
188 module.__file__ = os.path.abspath(module.__file__)
189
190
Guido van Rossumbb484652002-12-02 09:56:21 +0000191# MacOSX (a.k.a. Darwin) has a default stack size that is too small
192# for deeply recursive regular expressions. We see this as crashes in
193# the Python test suite when running test_re.py and test_sre.py. The
194# fix is to set the stack limit to 2048.
195# This approach may also be useful for other Unixy platforms that
196# suffer from small default stack limits.
197if sys.platform == 'darwin':
198 try:
199 import resource
200 except ImportError:
201 pass
202 else:
203 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
204 newsoft = min(hard, max(soft, 1024*2048))
205 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
206
Zachary Ware47343722015-07-16 00:24:48 -0500207# Windows, Tkinter, and resetting the environment after each test don't
208# mix well. To alleviate test failures due to Tcl/Tk not being able to
209# find its library, get the necessary environment massage done once early.
210if sys.platform == 'win32':
211 try:
212 import FixTk
213 except Exception:
214 pass
215
Georg Brandl4045e882009-10-29 20:53:00 +0000216# Test result constants.
217PASSED = 1
218FAILED = 0
219ENV_CHANGED = -1
220SKIPPED = -2
221RESOURCE_DENIED = -3
222INTERRUPTED = -4
223
Barry Warsaw04f357c2002-07-23 19:04:11 +0000224from test import test_support
Fred Drake3a15dac2002-04-11 16:39:16 +0000225
Benjamin Petersone2886fd2008-07-18 14:26:35 +0000226RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
Antoine Pitroud989f822010-10-14 15:43:25 +0000227 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
Collin Winterf8089c72009-04-09 16:46:46 +0000228 'xpickle')
Fred Drake3a15dac2002-04-11 16:39:16 +0000229
Florent Xicluna12735662010-04-23 18:10:12 +0000230TEMPDIR = os.path.abspath(tempfile.gettempdir())
231
Fred Drake3a15dac2002-04-11 16:39:16 +0000232
Barry Warsaw08fca522001-08-20 22:33:46 +0000233def usage(code, msg=''):
234 print __doc__
235 if msg: print msg
236 sys.exit(code)
237
238
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000239def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000240 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000241 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000242 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000243 random_seed=None, use_mp=None, verbose3=False, forever=False,
Brett Cannon95374782015-10-02 16:21:34 -0700244 header=False, pgo=False):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000245 """Execute a test suite.
246
Thomas Wouters7e474022000-07-16 12:04:32 +0000247 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000248 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000249
250 tests -- a list of strings containing test names (optional)
251 testdir -- the directory in which to look for tests (optional)
252
253 Users other than the Python test suite will certainly want to
254 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000255 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000256
257 If the tests argument is omitted, the tests listed on the
258 command-line will be used. If that's empty, too, then all *.py
259 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000260
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000261 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000262 single, randomize, findleaks, use_resources, trace, coverdir,
263 print_slow, and random_seed) allow programmers calling main()
264 directly to set the values that would normally be set by flags
265 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000266 """
Fred Drake004d5e62000-10-23 17:22:08 +0000267
Tim Peters8dee8092001-09-25 20:05:11 +0000268 test_support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000269 try:
Brett Cannon95374782015-10-02 16:21:34 -0700270 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:P',
Georg Brandl71a015a2009-10-27 20:52:02 +0000271 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Chris Jerdonek3684c792012-12-27 18:14:01 -0800272 'exclude', 'single', 'slow', 'randomize', 'fromfile=', 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000273 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
274 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Brett Cannon95374782015-10-02 16:21:34 -0700275 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo'])
Guido van Rossum152494a1996-12-20 03:12:20 +0000276 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000277 usage(2, msg)
278
279 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000280 if random_seed is None:
281 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000282 if use_resources is None:
283 use_resources = []
Guido van Rossum152494a1996-12-20 03:12:20 +0000284 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000285 if o in ('-h', '--help'):
286 usage(0)
287 elif o in ('-v', '--verbose'):
288 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000289 elif o in ('-w', '--verbose2'):
290 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000291 elif o in ('-W', '--verbose3'):
292 verbose3 = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000293 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000294 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000295 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000296 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000297 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000298 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000299 single = True
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000300 elif o in ('-S', '--slow'):
301 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000302 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000303 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000304 elif o == '--randseed':
305 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000306 elif o in ('-f', '--fromfile'):
307 fromfile = a
Barry Warsaw08fca522001-08-20 22:33:46 +0000308 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000309 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000310 elif o in ('-L', '--runleaks'):
311 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000312 elif o in ('-t', '--threshold'):
313 import gc
314 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000315 elif o in ('-T', '--coverage'):
316 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000317 elif o in ('-D', '--coverdir'):
318 coverdir = os.path.join(os.getcwd(), a)
319 elif o in ('-N', '--nocoverdir'):
320 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000321 elif o in ('-R', '--huntrleaks'):
322 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000323 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000324 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000325 usage(2, '-R takes 2 or 3 colon-separated arguments')
326 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000327 huntrleaks[0] = 5
328 else:
329 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000330 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000331 huntrleaks[1] = 4
332 else:
333 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000334 if len(huntrleaks) == 2 or not huntrleaks[2]:
335 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000336 elif o in ('-M', '--memlimit'):
337 test_support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000338 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000339 u = [x.lower() for x in a.split(',')]
340 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000341 if r == 'all':
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000342 use_resources[:] = RESOURCE_NAMES
343 continue
344 remove = False
345 if r[0] == '-':
346 remove = True
347 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000348 if r not in RESOURCE_NAMES:
349 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000350 if remove:
351 if r in use_resources:
352 use_resources.remove(r)
353 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000354 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000355 elif o in ('-F', '--forever'):
356 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000357 elif o in ('-j', '--multiprocess'):
358 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000359 elif o == '--header':
360 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000361 elif o == '--slaveargs':
362 args, kwargs = json.loads(a)
363 try:
364 result = runtest(*args, **kwargs)
365 except BaseException, e:
Georg Brandl4045e882009-10-29 20:53:00 +0000366 result = INTERRUPTED, e.__class__.__name__
Antoine Pitrou4698d992009-05-31 14:20:14 +0000367 print # Force a newline (just in case)
368 print json.dumps(result)
369 sys.exit(0)
Brett Cannon95374782015-10-02 16:21:34 -0700370 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700371 pgo = True
R. David Murrayda826892009-11-15 00:04:32 +0000372 else:
373 print >>sys.stderr, ("No handler for option {}. Please "
374 "report this as a bug at http://bugs.python.org.").format(o)
375 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000376 if single and fromfile:
377 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000378 if use_mp and trace:
379 usage(2, "-T and -j don't go together!")
380 if use_mp and findleaks:
381 usage(2, "-l and -j don't go together!")
Barry Warsaw08fca522001-08-20 22:33:46 +0000382
Guido van Rossum152494a1996-12-20 03:12:20 +0000383 good = []
384 bad = []
385 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000386 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000387 environment_changed = []
Florent Xicluna75c66762010-03-30 16:31:14 +0000388 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000389
Neil Schemenauerd569f232000-09-22 15:29:28 +0000390 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000391 try:
392 import gc
393 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000394 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000395 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000396 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000397 # Uncomment the line below to report garbage that is not
398 # freeable by reference counting alone. By default only
399 # garbage that is not collectable by the GC is reported.
400 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000401 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000402
Barry Warsawe11e3de1999-01-28 19:51:51 +0000403 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000404 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000405 try:
406 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000407 next_test = fp.read().strip()
408 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000409 fp.close()
410 except IOError:
411 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000412
413 if fromfile:
414 tests = []
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000415 fp = open(os.path.join(test_support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000416 for line in fp:
417 guts = line.split() # assuming no test has whitespace in its name
418 if guts and not guts[0].startswith('#'):
419 tests.extend(guts)
420 fp.close()
421
422 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000423 removepy(args)
424 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000425
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000426 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000427 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000428 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000429 for arg in args:
430 if arg in stdtests:
431 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000432 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000433 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000434
435 # For a partial run, we do not need to clutter the output.
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000436 if verbose or header or not (quiet or single or tests or args):
Brett Cannon95374782015-10-02 16:21:34 -0700437 if not pgo:
438 # Print basic platform information
439 print "==", platform.python_implementation(), \
440 " ".join(sys.version.split())
441 print "== ", platform.platform(aliased=True), \
442 "%s-endian" % sys.byteorder
443 print "== ", os.getcwd()
444 print "Testing with flags:", sys.flags
Florent Xicluna58526412010-03-06 17:24:36 +0000445
R. David Murray98e3df32009-12-16 11:49:46 +0000446 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000447 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000448 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000449 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000450 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000451 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000452 except IndexError:
453 next_single_test = None
Skip Montanaroab1c7912000-06-30 16:39:27 +0000454 if randomize:
Collin Wintera199f012009-03-29 03:44:19 +0000455 random.seed(random_seed)
456 print "Using random seed", random_seed
Florent Xicluna75c66762010-03-30 16:31:14 +0000457 random.shuffle(selected)
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000458 if trace:
459 import trace
460 tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
461 trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000462
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000463 test_times = []
Barry Warsaw08fca522001-08-20 22:33:46 +0000464 test_support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800465 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000466
467 def accumulate_result(test, result):
468 ok, test_time = result
469 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000470 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000471 good.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000472 elif ok == FAILED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000473 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000474 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000475 environment_changed.append(test)
476 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000477 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000478 elif ok == RESOURCE_DENIED:
479 skipped.append(test)
480 resource_denieds.append(test)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000481
R. David Murray7f7eea62009-11-14 15:18:22 +0000482 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000483 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000484 while True:
485 for test in tests:
486 yield test
487 if bad:
488 return
489 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200490 test_count = ''
491 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000492 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000493 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200494 test_count = '/{}'.format(len(selected))
495 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000496
Antoine Pitrou4698d992009-05-31 14:20:14 +0000497 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000498 try:
499 from threading import Thread
500 except ImportError:
501 print "Multiprocess option requires thread support"
502 sys.exit(2)
Georg Brandla4f46e12010-02-07 17:03:15 +0000503 from Queue import Queue
504 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000505 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000506 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000507 def tests_and_args():
508 for test in tests:
509 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000510 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700511 dict(huntrleaks=huntrleaks, use_resources=use_resources,
512 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000513 )
514 yield (test, args_tuple)
515 pending = tests_and_args()
Antoine Pitroua226c912010-10-14 11:15:50 +0000516 opt_args = test_support.args_from_interpreter_flags()
517 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700518 # required to spawn a new process with PGO flag on/off
519 if pgo:
520 base_cmd = base_cmd + ['--pgo']
Antoine Pitrou4698d992009-05-31 14:20:14 +0000521 def work():
522 # A worker thread.
Neal Norwitz14ca3272006-02-28 18:05:43 +0000523 try:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000524 while True:
525 try:
R. David Murray7f7eea62009-11-14 15:18:22 +0000526 test, args_tuple = next(pending)
527 except StopIteration:
R. David Murray282396f2009-10-18 21:12:37 +0000528 output.put((None, None, None, None))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000529 return
Antoine Pitrou79c3bd82009-06-29 14:14:56 +0000530 # -E is needed by some tests, e.g. test_import
Antoine Pitroua226c912010-10-14 11:15:50 +0000531 popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
R. David Murray282396f2009-10-18 21:12:37 +0000532 stdout=PIPE, stderr=PIPE,
Antoine Pitrou0dd8e1d2010-08-18 20:45:10 +0000533 universal_newlines=True,
534 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000535 stdout, stderr = popen.communicate()
536 # Strip last refcount output line if it exists, since it
537 # comes from the shutdown of the interpreter in the subcommand.
538 stderr = debug_output_pat.sub("", stderr)
539 stdout, _, result = stdout.strip().rpartition("\n")
R. David Murray7f7eea62009-11-14 15:18:22 +0000540 if not result:
541 output.put((None, None, None, None))
542 return
Antoine Pitrou4698d992009-05-31 14:20:14 +0000543 result = json.loads(result)
R. David Murray282396f2009-10-18 21:12:37 +0000544 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000545 except BaseException:
R. David Murray282396f2009-10-18 21:12:37 +0000546 output.put((None, None, None, None))
Neal Norwitz14ca3272006-02-28 18:05:43 +0000547 raise
Antoine Pitrou4698d992009-05-31 14:20:14 +0000548 workers = [Thread(target=work) for i in range(use_mp)]
549 for worker in workers:
550 worker.start()
551 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200552 test_index = 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000553 try:
554 while finished < use_mp:
555 test, stdout, stderr, result = output.get()
556 if test is None:
557 finished += 1
558 continue
559 if stdout:
560 print stdout
Brett Cannon95374782015-10-02 16:21:34 -0700561 if stderr and not pgo:
R. David Murray7f7eea62009-11-14 15:18:22 +0000562 print >>sys.stderr, stderr
Antoine Pitroucf807c02012-06-27 17:41:07 +0200563 sys.stdout.flush()
564 sys.stderr.flush()
R. David Murray7f7eea62009-11-14 15:18:22 +0000565 if result[0] == INTERRUPTED:
566 assert result[1] == 'KeyboardInterrupt'
567 raise KeyboardInterrupt # What else?
568 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200569 if not quiet:
570 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
571 print(fmt.format(
572 test_count_width, test_index, test_count,
573 len(bad), test))
574 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000575 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000576 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000577 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000578 for worker in workers:
579 worker.join()
580 else:
Brett Cannon65918e02015-10-02 16:22:32 -0700581 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000582 if not quiet:
Victor Stinner32b1ff92014-09-05 12:12:11 +0200583 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
584 print(fmt.format(
585 test_count_width, test_index, test_count, len(bad), test))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000586 sys.stdout.flush()
587 if trace:
588 # If we're tracing code coverage, then we don't exit with status
589 # if on a false return value from main.
R. David Murray561b96f2011-02-11 17:25:54 +0000590 tracer.runctx('runtest(test, verbose, quiet)',
Antoine Pitrou4698d992009-05-31 14:20:14 +0000591 globals=globals(), locals=vars())
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000592 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000593 try:
Brett Cannon95374782015-10-02 16:21:34 -0700594 result = runtest(test, verbose, quiet, huntrleaks, None, pgo)
Georg Brandl4045e882009-10-29 20:53:00 +0000595 accumulate_result(test, result)
596 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700597 if not pgo:
598 print "Re-running test %r in verbose mode" % test
599 runtest(test, True, quiet, huntrleaks, None, pgo)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000600 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000601 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000602 break
603 except:
604 raise
605 if findleaks:
606 gc.collect()
607 if gc.garbage:
608 print "Warning: test created", len(gc.garbage),
609 print "uncollectable object(s)."
610 # move the uncollectable objects somewhere so we don't see
611 # them again
612 found_garbage.extend(gc.garbage)
613 del gc.garbage[:]
614 # Unload the newly imported modules (best effort finalization)
615 for module in sys.modules.keys():
616 if module not in save_modules and module.startswith("test."):
617 test_support.unload(module)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000618
Brett Cannon95374782015-10-02 16:21:34 -0700619 if interrupted and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000620 # print a newline after ^C
621 print
622 print "Test suite interrupted by signal SIGINT."
623 omitted = set(selected) - set(good) - set(bad) - set(skipped)
624 print count(len(omitted), "test"), "omitted:"
625 printlist(omitted)
Brett Cannon95374782015-10-02 16:21:34 -0700626 if good and not quiet and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000627 if not bad and not skipped and not interrupted and len(good) > 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000628 print "All",
629 print count(len(good), "test"), "OK."
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000630 if print_slow:
631 test_times.sort(reverse=True)
632 print "10 slowest tests:"
633 for time, test in test_times[:10]:
634 print "%s: %.1fs" % (test, time)
Brett Cannon95374782015-10-02 16:21:34 -0700635 if bad and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500636 print count(len(bad), "test"), "failed:"
637 printlist(bad)
Brett Cannon95374782015-10-02 16:21:34 -0700638 if environment_changed and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500639 print "{} altered the execution environment:".format(
640 count(len(environment_changed), "test"))
641 printlist(environment_changed)
Brett Cannon95374782015-10-02 16:21:34 -0700642 if skipped and not quiet and not pgo:
Tim Petersa45da922001-08-12 03:45:50 +0000643 print count(len(skipped), "test"), "skipped:"
644 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000645
Tim Petersb5b7b782001-08-12 01:20:39 +0000646 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000647 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000648 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000649 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000650 if surprise:
651 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000652 "unexpected on", plat + ":"
653 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000654 else:
655 print "Those skips are all expected on", plat + "."
656 else:
657 print "Ask someone to teach regrtest.py about which tests are"
658 print "expected to get skipped on", plat + "."
659
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000660 if verbose2 and bad:
661 print "Re-running failed tests in verbose mode"
Zachary Warea4777f12015-08-04 21:53:21 -0500662 for test in bad[:]:
Tim Peters922dd7d2006-03-10 23:37:10 +0000663 print "Re-running test %r in verbose mode" % test
664 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000665 try:
Neal Norwitz5fe5cf62008-03-18 17:58:02 +0000666 test_support.verbose = True
Brett Cannon95374782015-10-02 16:21:34 -0700667 ok = runtest(test, True, quiet, huntrleaks, None, pgo)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000668 except KeyboardInterrupt:
669 # print a newline separate from the ^C
670 print
671 break
Zachary Warea4777f12015-08-04 21:53:21 -0500672 else:
673 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
674 bad.remove(test)
675 else:
676 if bad:
677 print count(len(bad), "test"), "failed again:"
678 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000679
Barry Warsawe11e3de1999-01-28 19:51:51 +0000680 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000681 if next_single_test:
682 with open(filename, 'w') as fp:
683 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000684 else:
685 os.unlink(filename)
686
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000687 if trace:
688 r = tracer.results()
689 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
690
Skip Montanaro0179a182004-06-06 15:53:18 +0000691 if runleaks:
692 os.system("leaks %d" % os.getpid())
693
Florent Xicluna75c66762010-03-30 16:31:14 +0000694 sys.exit(len(bad) > 0 or interrupted)
Barry Warsaw08fca522001-08-20 22:33:46 +0000695
Guido van Rossum152494a1996-12-20 03:12:20 +0000696
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000697STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000698 'test_grammar',
699 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +0000700 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000701 'test_builtin',
702 'test_exceptions',
703 'test_types',
Collin Winter55453142007-03-08 19:58:14 +0000704 'test_unittest',
705 'test_doctest',
706 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000707]
Guido van Rossum152494a1996-12-20 03:12:20 +0000708
Florent Xicluna12d750d2010-03-06 14:38:09 +0000709NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +0000710 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000711 'test_future1',
712 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000713}
Guido van Rossum152494a1996-12-20 03:12:20 +0000714
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000715def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000716 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +0000717 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +0000718 names = os.listdir(testdir)
719 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +0000720 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +0000721 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +0000722 modname, ext = os.path.splitext(name)
723 if modname[:5] == "test_" and ext == ".py" and modname not in others:
724 tests.append(modname)
725 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +0000726
Antoine Pitrou4698d992009-05-31 14:20:14 +0000727def runtest(test, verbose, quiet,
Brett Cannon95374782015-10-02 16:21:34 -0700728 huntrleaks=False, use_resources=None, pgo=False):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000729 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +0000730
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000731 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000732 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000733 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000734 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +0000735 huntrleaks -- run multiple times to test for leaks; requires a debug
736 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -0700737 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -0700738 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -0700739
Georg Brandl4045e882009-10-29 20:53:00 +0000740 Returns one of the test result constants:
741 INTERRUPTED KeyboardInterrupt when run under -j
742 RESOURCE_DENIED test skipped because resource denied
743 SKIPPED test skipped for some other reason
744 ENV_CHANGED test failed because it changed the execution environment
745 FAILED test failed
746 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000747 """
Tim Peters06c5c002006-06-05 00:55:26 +0000748
Antoine Pitrou4698d992009-05-31 14:20:14 +0000749 test_support.verbose = verbose # Tell tests to be moderately quiet
750 if use_resources is not None:
751 test_support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +0000752 try:
Brett Cannon95374782015-10-02 16:21:34 -0700753 return runtest_inner(test, verbose, quiet, huntrleaks, pgo)
Tim Peterse5584862006-06-09 19:24:44 +0000754 finally:
755 cleanup_test_droppings(test, verbose)
756
R. David Murray14dcd432009-10-14 13:58:07 +0000757
758# Unit tests are supposed to leave the execution environment unchanged
759# once they complete. But sometimes tests have bugs, especially when
760# tests fail, and the changes to environment go on to mess up other
761# tests. This can cause issues with buildbot stability, since tests
762# are run in random order and so problems may appear to come and go.
763# There are a few things we can save and restore to mitigate this, and
764# the following context manager handles this task.
765
766class saved_test_environment:
767 """Save bits of the test environment and restore them at block exit.
768
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000769 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +0000770 #stuff
771
772 Unless quiet is True, a warning is printed to stderr if any of
773 the saved items was changed by the test. The attribute 'changed'
774 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000775
776 If verbose is more than 1, the before and after state of changed
777 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +0000778 """
779
780 changed = False
781
Brett Cannon95374782015-10-02 16:21:34 -0700782 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +0000783 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000784 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +0000785 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -0700786 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +0000787
788 # To add things to save and restore, add a name XXX to the resources list
789 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
790 # return the value to be saved and compared against a second call to the
791 # get function when test execution completes. restore_XXX should accept
792 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000793 # and only if a change in the value is detected.
794 #
795 # Note: XXX will have any '.' replaced with '_' characters when determining
796 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +0000797
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000798 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +0000799 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300800 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +0000801 )
R. David Murray14dcd432009-10-14 13:58:07 +0000802
803 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000804 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +0000805 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +0000806 sys.argv = saved_argv[1]
807 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +0000808
809 def get_cwd(self):
810 return os.getcwd()
811 def restore_cwd(self, saved_cwd):
812 os.chdir(saved_cwd)
813
814 def get_sys_stdout(self):
815 return sys.stdout
816 def restore_sys_stdout(self, saved_stdout):
817 sys.stdout = saved_stdout
818
819 def get_sys_stderr(self):
820 return sys.stderr
821 def restore_sys_stderr(self, saved_stderr):
822 sys.stderr = saved_stderr
823
824 def get_sys_stdin(self):
825 return sys.stdin
826 def restore_sys_stdin(self, saved_stdin):
827 sys.stdin = saved_stdin
828
829 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000830 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +0000831 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +0000832 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +0000833 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +0000834 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +0000835
836 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000837 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +0000838 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +0000839 sys.path = saved_path[1]
840 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +0000841
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000842 def get_asyncore_socket_map(self):
843 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000844 # XXX Making a copy keeps objects alive until __exit__ gets called.
845 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000846 def restore_asyncore_socket_map(self, saved_map):
847 asyncore = sys.modules.get('asyncore')
848 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000849 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000850 asyncore.socket_map.update(saved_map)
851
Vinay Sajipda563bf2012-03-06 20:07:15 +0000852 def get_test_support_TESTFN(self):
853 if os.path.isfile(test_support.TESTFN):
854 result = 'f'
855 elif os.path.isdir(test_support.TESTFN):
856 result = 'd'
857 else:
858 result = None
859 return result
860 def restore_test_support_TESTFN(self, saved_value):
861 if saved_value is None:
862 if os.path.isfile(test_support.TESTFN):
863 os.unlink(test_support.TESTFN)
864 elif os.path.isdir(test_support.TESTFN):
865 shutil.rmtree(test_support.TESTFN)
866
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300867 def get_files(self):
868 return sorted(fn + ('/' if os.path.isdir(fn) else '')
869 for fn in os.listdir(os.curdir))
870 def restore_files(self, saved_value):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200871 fn = test_support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300872 if fn not in saved_value and (fn + '/') not in saved_value:
873 if os.path.isfile(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200874 test_support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300875 elif os.path.isdir(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200876 test_support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300877
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000878 def resource_info(self):
879 for name in self.resources:
880 method_suffix = name.replace('.', '_')
881 get_name = 'get_' + method_suffix
882 restore_name = 'restore_' + method_suffix
883 yield name, getattr(self, get_name), getattr(self, restore_name)
884
R. David Murray14dcd432009-10-14 13:58:07 +0000885 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000886 self.saved_values = dict((name, get()) for name, get, restore
887 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +0000888 return self
889
890 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000891 saved_values = self.saved_values
892 del self.saved_values
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000893 for name, get, restore in self.resource_info():
894 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000895 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000896 # Check for changes to the resource's value
897 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +0000898 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000899 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -0700900 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000901 print >>sys.stderr, (
902 "Warning -- {} was modified by {}".format(
903 name, self.testname))
Brett Cannon95374782015-10-02 16:21:34 -0700904 if self.verbose > 1 and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000905 print >>sys.stderr, (
Nick Coghlana3e97ad2009-10-17 07:34:27 +0000906 " Before: {}\n After: {} ".format(
907 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000908 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
909 # matters at least as much as value. For others (e.g. cwd),
910 # identity is irrelevant. Should we add a mechanism to check
911 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +0000912 return False
913
914
Brett Cannon95374782015-10-02 16:21:34 -0700915def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False):
Guido van Rossum152494a1996-12-20 03:12:20 +0000916 test_support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +0000917 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000918 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000919 else:
Michael Foord91a2c892010-04-08 00:04:24 +0000920 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +0000921
Antoine Pitrou4698d992009-05-31 14:20:14 +0000922 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +0000923 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +0000924 try:
Tim Peters342ca752001-09-25 19:13:20 +0000925 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +0000926 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000927 if capture_stdout:
928 sys.stdout = capture_stdout
Barry Warsaw408b6d32002-07-30 23:27:12 +0000929 if test.startswith('test.'):
930 abstest = test
931 else:
932 # Always import it from the test package
933 abstest = 'test.' + test
Brett Cannon95374782015-10-02 16:21:34 -0700934 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +0000935 start_time = time.time()
936 the_package = __import__(abstest, globals(), locals(), [])
937 the_module = getattr(the_package, test)
938 # Old tests run to completion simply as a side-effect of
939 # being imported. For tests based on unittest or doctest,
940 # explicitly invoke their test_main() function (if it exists).
941 indirect_test = getattr(the_module, "test_main", None)
942 if indirect_test is not None:
943 indirect_test()
944 if huntrleaks:
945 refleak = dash_R(the_module, test, indirect_test,
946 huntrleaks)
947 test_time = time.time() - start_time
Guido van Rossum41360a41998-03-26 19:42:58 +0000948 finally:
Tim Peters342ca752001-09-25 19:13:20 +0000949 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +0000950 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700951 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +0000952 print test, "skipped --", msg
953 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000954 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +0000955 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700956 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +0000957 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000958 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000959 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +0000960 except KeyboardInterrupt:
961 raise
Guido van Rossum152494a1996-12-20 03:12:20 +0000962 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700963 if not pgo:
964 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +0000965 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000966 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +0000967 except:
Guido van Rossum41360a41998-03-26 19:42:58 +0000968 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -0700969 if not pgo:
970 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +0000971 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -0700972 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +0000973 traceback.print_exc(file=sys.stderr)
974 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000975 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +0000976 else:
Collin Winter0f489742009-05-14 23:26:30 +0000977 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +0000978 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +0000979 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +0000980 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000981 # Except in verbose mode, tests should not print anything
982 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +0000983 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000984 output = capture_stdout.getvalue()
985 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +0000986 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000987 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000988 print "*" * 70
989 print output
990 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000991 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000992 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000993
Tim Peterse5584862006-06-09 19:24:44 +0000994def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +0000995 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +0000996 import gc
997
998 # First kill any dangling references to open files etc.
999 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001000
1001 # Try to clean up junk commonly left behind. While tests shouldn't leave
1002 # any files or directories behind, when a test fails that can be tedious
1003 # for it to arrange. The consequences can be especially nasty on Windows,
1004 # since if a test leaves a file open, it cannot be deleted by name (while
1005 # there's nothing we can do about that here either, we can display the
1006 # name of the offending test, which is a real help).
1007 for name in (test_support.TESTFN,
1008 "db_home",
1009 ):
1010 if not os.path.exists(name):
1011 continue
1012
1013 if os.path.isdir(name):
1014 kind, nuker = "directory", shutil.rmtree
1015 elif os.path.isfile(name):
1016 kind, nuker = "file", os.unlink
1017 else:
1018 raise SystemError("os.path says %r exists but is neither "
1019 "directory nor file" % name)
1020
1021 if verbose:
1022 print "%r left behind %s %r" % (testname, kind, name)
1023 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001024 # if we have chmod, fix possible permissions problems
1025 # that might prevent cleanup
1026 if (hasattr(os, 'chmod')):
1027 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001028 nuker(name)
1029 except Exception, msg:
1030 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1031 "removed: %s" % (testname, kind, name, msg))
1032
Tim Peters06c5c002006-06-05 00:55:26 +00001033def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001034 """Run a test multiple times, looking for reference leaks.
1035
1036 Returns:
1037 False if the test didn't leak references; True if we detected refleaks.
1038 """
Tim Peters06c5c002006-06-05 00:55:26 +00001039 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001040 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001041
1042 if not hasattr(sys, 'gettotalrefcount'):
1043 raise Exception("Tracking reference leaks requires a debug build "
1044 "of Python")
1045
1046 # Save current values for dash_R_cleanup() to restore.
1047 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001048 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001049 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001050 try:
1051 import zipimport
1052 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001053 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001054 else:
1055 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001056 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001057 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001058 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1059 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1060 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001061 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001062 for obj in abc.__subclasses__() + [abc]:
1063 abcs[obj] = obj._abc_registry.copy()
1064
Tim Peters06c5c002006-06-05 00:55:26 +00001065 if indirect_test:
1066 def run_the_test():
1067 indirect_test()
1068 else:
1069 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001070 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001071
1072 deltas = []
1073 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001074 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001075 repcount = nwarmup + ntracked
1076 print >> sys.stderr, "beginning", repcount, "repetitions"
1077 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001078 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001079 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001080 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001081 run_the_test()
1082 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001083 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001084 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001085 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001086 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001087 print >> sys.stderr
1088 if any(deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001089 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1090 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001091 with open(fname, "a") as refrep:
1092 print >> refrep, msg
1093 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001094 return True
1095 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001096
Benjamin Peterson55035792014-02-16 14:51:17 -05001097def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001098 import gc, copy_reg
Brett Cannon0aa6e1b2008-05-10 21:12:57 +00001099 import _strptime, linecache
1100 dircache = test_support.import_module('dircache', deprecated=True)
Tim Peters06c5c002006-06-05 00:55:26 +00001101 import urlparse, urllib, urllib2, mimetypes, doctest
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001102 import struct, filecmp
Tim Peters06c5c002006-06-05 00:55:26 +00001103 from distutils.dir_util import _path_created
1104
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001105 # Clear the warnings registry, so they can be displayed again
1106 for mod in sys.modules.values():
1107 if hasattr(mod, '__warningregistry__'):
1108 del mod.__warningregistry__
1109
Tim Peters06c5c002006-06-05 00:55:26 +00001110 # Restore some original values.
1111 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001112 copy_reg.dispatch_table.clear()
1113 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001114 sys.path_importer_cache.clear()
1115 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001116 try:
1117 import zipimport
1118 except ImportError:
1119 pass # Run unmodified on platforms without zipimport support
1120 else:
1121 zipimport._zip_directory_cache.clear()
1122 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001123
Christian Heimes908caac2008-01-27 23:34:59 +00001124 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001125 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001126
Guido van Rossum64c06e32007-11-22 00:55:51 +00001127 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001128 for abc, registry in abcs.items():
1129 abc._abc_registry = registry.copy()
1130 abc._abc_cache.clear()
1131 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001132
Tim Peters06c5c002006-06-05 00:55:26 +00001133 # Clear assorted module caches.
1134 _path_created.clear()
1135 re.purge()
1136 _strptime._regex_cache.clear()
1137 urlparse.clear_cache()
1138 urllib.urlcleanup()
1139 urllib2.install_opener(None)
1140 dircache.reset()
1141 linecache.clearcache()
1142 mimetypes._default_mime_types()
Tim Petersc27d6552006-06-07 01:04:59 +00001143 filecmp._cache.clear()
Christian Heimes76d19f62008-01-04 02:54:42 +00001144 struct._clearcache()
Tim Peters06c5c002006-06-05 00:55:26 +00001145 doctest.master = None
Meador Inge0e303172011-11-25 22:25:06 -06001146 try:
1147 import ctypes
1148 except ImportError:
1149 # Don't worry about resetting the cache if ctypes is not supported
1150 pass
1151 else:
1152 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001153
1154 # Collect cyclic trash.
1155 gc.collect()
1156
Florent Xicluna0932dc52010-03-06 08:07:44 +00001157def findtestdir(path=None):
1158 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001159
Florent Xicluna0932dc52010-03-06 08:07:44 +00001160def removepy(names):
1161 if not names:
1162 return
1163 for idx, name in enumerate(names):
1164 basename, ext = os.path.splitext(name)
1165 if ext == '.py':
1166 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001167
Guido van Rossum152494a1996-12-20 03:12:20 +00001168def count(n, word):
1169 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001170 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001171 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001172 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001173
Tim Petersa45da922001-08-12 03:45:50 +00001174def printlist(x, width=70, indent=4):
Tim Peters7c7efe92002-08-23 17:55:54 +00001175 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001176
1177 Optional arg width (default 70) is the maximum line length.
1178 Optional arg indent (default 4) is the number of blanks with which to
1179 begin each line.
1180 """
1181
Tim Petersba78bc42002-07-04 19:45:06 +00001182 from textwrap import fill
1183 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001184 # Print the sorted list: 'x' may be a '--random' list or a set()
1185 print fill(' '.join(str(elt) for elt in sorted(x)), width,
Tim Petersba78bc42002-07-04 19:45:06 +00001186 initial_indent=blanks, subsequent_indent=blanks)
Tim Petersa45da922001-08-12 03:45:50 +00001187
Tim Petersde14a302002-04-01 05:04:46 +00001188# Map sys.platform to a string containing the basenames of tests
1189# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001190#
1191# Special cases:
1192# test_pep277
1193# The _ExpectedSkips constructor adds this to the set of expected
1194# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001195# test_timeout
1196# Controlled by test_timeout.skip_expected. Requires the network
1197# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001198#
1199# Tests that are expected to be skipped everywhere except on one platform
1200# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001201
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001202_expectations = {
1203 'win32':
1204 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001205 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001206 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001207 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001208 test_commands
1209 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001210 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001211 test_dbm
1212 test_dl
1213 test_fcntl
1214 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001215 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001216 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001217 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001218 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001219 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001220 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001221 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001222 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001223 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001224 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001225 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001226 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001227 test_pty
1228 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001229 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001230 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001231 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001232 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001233 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001234 test_wait3
1235 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001236 """,
1237 'linux2':
1238 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001239 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001240 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001241 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001242 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001243 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001244 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001245 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001246 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001247 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001248 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001249 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001250 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001251 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001252 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001253 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001254 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001255 test_openpty
1256 test_pyexpat
1257 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001258 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001259 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001260 'openunix8':
1261 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001262 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001263 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001264 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001265 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001266 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001267 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001268 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001269 test_openpty
1270 test_pyexpat
1271 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001272 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001273 """,
1274 'sco_sv3':
1275 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001276 test_asynchat
1277 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001278 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001279 test_dl
1280 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001281 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001282 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001283 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001284 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001285 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001286 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001287 test_openpty
1288 test_pyexpat
1289 test_queue
1290 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001291 test_sundry
1292 test_thread
1293 test_threaded_import
1294 test_threadedtempfile
1295 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001296 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001297 'riscos':
1298 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001299 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001300 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001301 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001302 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001303 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001304 test_commands
1305 test_crypt
1306 test_dbm
1307 test_dl
1308 test_fcntl
1309 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001310 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001311 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001312 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001313 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001314 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001315 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001316 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001317 test_openpty
1318 test_poll
1319 test_popen2
1320 test_pty
1321 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001322 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001323 test_sundry
1324 test_thread
1325 test_threaded_import
1326 test_threadedtempfile
1327 test_threading
1328 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001329 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001330 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001331 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001332 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001333 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001334 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001335 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001336 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001337 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001338 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001339 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001340 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001341 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001342 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001343 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001344 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001345 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001346 'sunos5':
1347 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001348 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001349 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001350 test_curses
1351 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001352 test_epoll
1353 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001354 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001355 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001356 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001357 test_zipfile
1358 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001359 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001360 'hp-ux11':
1361 """
Skip Montanarob3230212002-03-15 02:54:03 +00001362 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001363 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001364 test_curses
1365 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001366 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001367 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001368 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001369 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001370 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001371 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001372 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001373 test_openpty
1374 test_pyexpat
1375 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001376 test_zipfile
1377 test_zlib
1378 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001379 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001380 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001381 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001382 test_curses
1383 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001384 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001385 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001386 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001387 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001388 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001389 test_mhlib
1390 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001391 test_poll
1392 test_popen2
1393 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001394 """,
Jason Tishler25115942002-12-05 15:18:15 +00001395 'cygwin':
1396 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001397 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001398 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001399 test_curses
1400 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001401 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001402 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001403 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001404 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001405 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001406 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001407 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001408 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001409 'os2emx':
1410 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001411 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001412 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001413 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001414 test_commands
1415 test_curses
1416 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001417 test_epoll
1418 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001419 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001420 test_mhlib
1421 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001422 test_openpty
1423 test_ossaudiodev
1424 test_pty
1425 test_resource
1426 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001427 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001428 'freebsd4':
1429 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001430 test_bsddb
1431 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001432 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001433 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001434 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001435 test_ossaudiodev
1436 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001437 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001438 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001439 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001440 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001441 test_ttk_guionly
1442 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001443 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001444 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001445 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001446 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001447 'aix5':
1448 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001449 test_bsddb
1450 test_bsddb185
1451 test_bsddb3
1452 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001453 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001454 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001455 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001456 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001457 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001458 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001459 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001460 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001461 test_ttk_guionly
1462 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001463 test_zipimport
1464 test_zlib
1465 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001466 'openbsd3':
1467 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001468 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001469 test_bsddb
1470 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001471 test_ctypes
1472 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001473 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001474 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001475 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001476 test_normalization
1477 test_ossaudiodev
1478 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001479 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001480 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001481 test_ttk_guionly
1482 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001483 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001484 """,
Georg Brandl08706872006-06-21 17:53:17 +00001485 'netbsd3':
1486 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001487 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001488 test_bsddb
1489 test_bsddb185
1490 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001491 test_ctypes
1492 test_curses
1493 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001494 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001495 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001496 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001497 test_ossaudiodev
1498 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001499 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001500 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001501 test_ttk_guionly
1502 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001503 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001504 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001505}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001506_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001507_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001508_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001509_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001510
Tim Petersb5b7b782001-08-12 01:20:39 +00001511class _ExpectedSkips:
1512 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001513 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001514 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001515
Tim Peters7c7efe92002-08-23 17:55:54 +00001516 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001517 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001518 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001519 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001520
Georg Brandlb2e208f2007-07-12 09:24:04 +00001521 # expected to be skipped on every platform, even Linux
1522 self.expected.add('test_linuxaudiodev')
1523
Tim Peters2a182db2002-10-09 01:07:11 +00001524 if not os.path.supports_unicode_filenames:
1525 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001526
Neal Norwitz55b61d22003-02-28 19:57:03 +00001527 if test_timeout.skip_expected:
1528 self.expected.add('test_timeout')
1529
Martin v. Löwisfba73692004-11-13 11:13:35 +00001530 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001531 self.expected.add('test_imageop')
1532
Ronald Oussoren9545a232010-05-05 19:09:31 +00001533 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001534 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001535 "test_plistlib", "test_scriptpackages",
1536 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001537 for skip in MAC_ONLY:
1538 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001539 elif len(u'\0'.encode('unicode-internal')) == 4:
1540 self.expected.add("test_macostools")
1541
Tim Petersecd79eb2003-01-29 00:35:32 +00001542
1543 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001544 # test_sqlite is only reliable on Windows where the library
1545 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001546 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001547 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001548 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001549 for skip in WIN_ONLY:
1550 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001551
Brett Cannondc48b742007-05-20 07:09:50 +00001552 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001553 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1554 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001555 for skip in IRIX_ONLY:
1556 self.expected.add(skip)
1557
Georg Brandlb2e208f2007-07-12 09:24:04 +00001558 if sys.platform != 'sunos5':
1559 self.expected.add('test_sunaudiodev')
1560 self.expected.add('test_nis')
1561
Steven Bethardd290b042008-03-21 21:01:18 +00001562 if not sys.py3kwarning:
1563 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001564
Tim Peters7c7efe92002-08-23 17:55:54 +00001565 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001566
1567 def isvalid(self):
1568 "Return true iff _ExpectedSkips knows about the current platform."
1569 return self.valid
1570
1571 def getexpected(self):
1572 """Return set of test names we expect to skip on current platform.
1573
1574 self.isvalid() must be true.
1575 """
1576
1577 assert self.isvalid()
1578 return self.expected
1579
Guido van Rossum152494a1996-12-20 03:12:20 +00001580if __name__ == '__main__':
Florent Xicluna92847452010-09-13 17:36:36 +00001581 # findtestdir() gets the dirname out of __file__, so we have to make it
1582 # absolute before changing the working directory.
1583 # For example __file__ may be relative when running trace or profile.
1584 # See issue #9323.
1585 __file__ = os.path.abspath(__file__)
1586
1587 # sanity check
Florent Xicluna0932dc52010-03-06 08:07:44 +00001588 assert __file__ == os.path.abspath(sys.argv[0])
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001589
Florent Xicluna0932dc52010-03-06 08:07:44 +00001590 # When tests are run from the Python build directory, it is best practice
1591 # to keep the test files in a subfolder. It eases the cleanup of leftover
1592 # files using command "make distclean".
1593 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00001594 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
1595 TEMPDIR = os.path.abspath(TEMPDIR)
1596 if not os.path.exists(TEMPDIR):
1597 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001598
1599 # Define a writable temp dir that will be used as cwd while running
1600 # the tests. The name of the dir includes the pid to allow parallel
1601 # testing (see the -j option).
1602 TESTCWD = 'test_python_{}'.format(os.getpid())
1603
Florent Xicluna12735662010-04-23 18:10:12 +00001604 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001605
1606 # Run the tests in a context manager that temporary changes the CWD to a
1607 # temporary and writable directory. If it's not possible to create or
1608 # change the CWD, the original CWD will be used. The original CWD is
1609 # available from test_support.SAVEDCWD.
1610 with test_support.temp_cwd(TESTCWD, quiet=True):
1611 main()