blob: 5702e38f457c6f311716f39d0845a609a535cc1b [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
Serhiy Storchakaac33bd72016-11-11 11:42:25 +0200934 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -0700935 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +0000936 start_time = time.time()
937 the_package = __import__(abstest, globals(), locals(), [])
938 the_module = getattr(the_package, test)
939 # Old tests run to completion simply as a side-effect of
940 # being imported. For tests based on unittest or doctest,
941 # explicitly invoke their test_main() function (if it exists).
942 indirect_test = getattr(the_module, "test_main", None)
943 if indirect_test is not None:
944 indirect_test()
945 if huntrleaks:
946 refleak = dash_R(the_module, test, indirect_test,
947 huntrleaks)
948 test_time = time.time() - start_time
Guido van Rossum41360a41998-03-26 19:42:58 +0000949 finally:
Tim Peters342ca752001-09-25 19:13:20 +0000950 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +0000951 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700952 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +0000953 print test, "skipped --", msg
954 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000955 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +0000956 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700957 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +0000958 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000959 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000960 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +0000961 except KeyboardInterrupt:
962 raise
Guido van Rossum152494a1996-12-20 03:12:20 +0000963 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700964 if not pgo:
965 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +0000966 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000967 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +0000968 except:
Guido van Rossum41360a41998-03-26 19:42:58 +0000969 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -0700970 if not pgo:
971 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +0000972 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -0700973 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +0000974 traceback.print_exc(file=sys.stderr)
975 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000976 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +0000977 else:
Collin Winter0f489742009-05-14 23:26:30 +0000978 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +0000979 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +0000980 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +0000981 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000982 # Except in verbose mode, tests should not print anything
983 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +0000984 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000985 output = capture_stdout.getvalue()
986 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +0000987 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000988 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000989 print "*" * 70
990 print output
991 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000992 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000993 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000994
Tim Peterse5584862006-06-09 19:24:44 +0000995def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +0000996 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +0000997 import gc
998
999 # First kill any dangling references to open files etc.
1000 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001001
1002 # Try to clean up junk commonly left behind. While tests shouldn't leave
1003 # any files or directories behind, when a test fails that can be tedious
1004 # for it to arrange. The consequences can be especially nasty on Windows,
1005 # since if a test leaves a file open, it cannot be deleted by name (while
1006 # there's nothing we can do about that here either, we can display the
1007 # name of the offending test, which is a real help).
1008 for name in (test_support.TESTFN,
1009 "db_home",
1010 ):
1011 if not os.path.exists(name):
1012 continue
1013
1014 if os.path.isdir(name):
1015 kind, nuker = "directory", shutil.rmtree
1016 elif os.path.isfile(name):
1017 kind, nuker = "file", os.unlink
1018 else:
1019 raise SystemError("os.path says %r exists but is neither "
1020 "directory nor file" % name)
1021
1022 if verbose:
1023 print "%r left behind %s %r" % (testname, kind, name)
1024 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001025 # if we have chmod, fix possible permissions problems
1026 # that might prevent cleanup
1027 if (hasattr(os, 'chmod')):
1028 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001029 nuker(name)
1030 except Exception, msg:
1031 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1032 "removed: %s" % (testname, kind, name, msg))
1033
Tim Peters06c5c002006-06-05 00:55:26 +00001034def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001035 """Run a test multiple times, looking for reference leaks.
1036
1037 Returns:
1038 False if the test didn't leak references; True if we detected refleaks.
1039 """
Tim Peters06c5c002006-06-05 00:55:26 +00001040 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001041 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001042
1043 if not hasattr(sys, 'gettotalrefcount'):
1044 raise Exception("Tracking reference leaks requires a debug build "
1045 "of Python")
1046
1047 # Save current values for dash_R_cleanup() to restore.
1048 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001049 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001050 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001051 try:
1052 import zipimport
1053 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001054 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001055 else:
1056 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001057 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001058 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001059 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1060 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1061 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001062 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001063 for obj in abc.__subclasses__() + [abc]:
1064 abcs[obj] = obj._abc_registry.copy()
1065
Tim Peters06c5c002006-06-05 00:55:26 +00001066 if indirect_test:
1067 def run_the_test():
1068 indirect_test()
1069 else:
1070 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001071 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001072
1073 deltas = []
1074 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001075 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001076 repcount = nwarmup + ntracked
1077 print >> sys.stderr, "beginning", repcount, "repetitions"
1078 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001079 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001080 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001081 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001082 run_the_test()
1083 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001084 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001085 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001086 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001087 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001088 print >> sys.stderr
1089 if any(deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001090 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1091 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001092 with open(fname, "a") as refrep:
1093 print >> refrep, msg
1094 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001095 return True
1096 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001097
Benjamin Peterson55035792014-02-16 14:51:17 -05001098def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001099 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001100
Tim Peters06c5c002006-06-05 00:55:26 +00001101 # Restore some original values.
1102 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001103 copy_reg.dispatch_table.clear()
1104 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001105 sys.path_importer_cache.clear()
1106 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001107 try:
1108 import zipimport
1109 except ImportError:
1110 pass # Run unmodified on platforms without zipimport support
1111 else:
1112 zipimport._zip_directory_cache.clear()
1113 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001114
Christian Heimes908caac2008-01-27 23:34:59 +00001115 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001116 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001117
Guido van Rossum64c06e32007-11-22 00:55:51 +00001118 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001119 for abc, registry in abcs.items():
1120 abc._abc_registry = registry.copy()
1121 abc._abc_cache.clear()
1122 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001123
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001124 clear_caches()
1125
1126def clear_caches():
1127 import gc
1128
1129 # Clear the warnings registry, so they can be displayed again
1130 for mod in sys.modules.values():
1131 if hasattr(mod, '__warningregistry__'):
1132 del mod.__warningregistry__
1133
Tim Peters06c5c002006-06-05 00:55:26 +00001134 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001135 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001136 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001137 distutils_dir_util = sys.modules['distutils.dir_util']
1138 except KeyError:
1139 pass
1140 else:
1141 distutils_dir_util._path_created.clear()
1142
1143 re.purge()
1144
1145 try:
1146 _strptime = sys.modules['_strptime']
1147 except KeyError:
1148 pass
1149 else:
1150 _strptime._regex_cache.clear()
1151
1152 try:
1153 urlparse = sys.modules['urlparse']
1154 except KeyError:
1155 pass
1156 else:
1157 urlparse.clear_cache()
1158
1159 try:
1160 urllib = sys.modules['urllib']
1161 except KeyError:
1162 pass
1163 else:
1164 urllib.urlcleanup()
1165
1166 try:
1167 urllib2 = sys.modules['urllib2']
1168 except KeyError:
1169 pass
1170 else:
1171 urllib2.install_opener(None)
1172
1173 try:
1174 dircache = sys.modules['dircache']
1175 except KeyError:
1176 pass
1177 else:
1178 dircache.reset()
1179
1180 try:
1181 linecache = sys.modules['linecache']
1182 except KeyError:
1183 pass
1184 else:
1185 linecache.clearcache()
1186
1187 try:
1188 mimetypes = sys.modules['mimetypes']
1189 except KeyError:
1190 pass
1191 else:
1192 mimetypes._default_mime_types()
1193
1194 try:
1195 filecmp = sys.modules['filecmp']
1196 except KeyError:
1197 pass
1198 else:
1199 filecmp._cache.clear()
1200
1201 try:
1202 struct = sys.modules['struct']
1203 except KeyError:
1204 pass
1205 else:
1206 struct._clearcache()
1207
1208 try:
1209 doctest = sys.modules['doctest']
1210 except KeyError:
1211 pass
1212 else:
1213 doctest.master = None
1214
1215 try:
1216 ctypes = sys.modules['ctypes']
1217 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001218 pass
1219 else:
1220 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001221
1222 # Collect cyclic trash.
1223 gc.collect()
1224
Florent Xicluna0932dc52010-03-06 08:07:44 +00001225def findtestdir(path=None):
1226 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001227
Florent Xicluna0932dc52010-03-06 08:07:44 +00001228def removepy(names):
1229 if not names:
1230 return
1231 for idx, name in enumerate(names):
1232 basename, ext = os.path.splitext(name)
1233 if ext == '.py':
1234 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001235
Guido van Rossum152494a1996-12-20 03:12:20 +00001236def count(n, word):
1237 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001238 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001239 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001240 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001241
Tim Petersa45da922001-08-12 03:45:50 +00001242def printlist(x, width=70, indent=4):
Tim Peters7c7efe92002-08-23 17:55:54 +00001243 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001244
1245 Optional arg width (default 70) is the maximum line length.
1246 Optional arg indent (default 4) is the number of blanks with which to
1247 begin each line.
1248 """
1249
Tim Petersba78bc42002-07-04 19:45:06 +00001250 from textwrap import fill
1251 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001252 # Print the sorted list: 'x' may be a '--random' list or a set()
1253 print fill(' '.join(str(elt) for elt in sorted(x)), width,
Tim Petersba78bc42002-07-04 19:45:06 +00001254 initial_indent=blanks, subsequent_indent=blanks)
Tim Petersa45da922001-08-12 03:45:50 +00001255
Tim Petersde14a302002-04-01 05:04:46 +00001256# Map sys.platform to a string containing the basenames of tests
1257# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001258#
1259# Special cases:
1260# test_pep277
1261# The _ExpectedSkips constructor adds this to the set of expected
1262# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001263# test_timeout
1264# Controlled by test_timeout.skip_expected. Requires the network
1265# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001266#
1267# Tests that are expected to be skipped everywhere except on one platform
1268# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001269
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001270_expectations = {
1271 'win32':
1272 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001273 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001274 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001275 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001276 test_commands
1277 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001278 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001279 test_dbm
1280 test_dl
1281 test_fcntl
1282 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001283 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001284 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001285 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001286 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001287 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001288 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001289 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001290 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001291 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001292 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001293 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001294 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001295 test_pty
1296 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001297 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001298 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001299 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001300 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001301 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001302 test_wait3
1303 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001304 """,
1305 'linux2':
1306 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001307 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001308 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001309 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001310 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001311 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001312 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001313 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001314 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001315 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001316 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001317 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001318 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001319 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001320 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001321 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001322 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001323 test_openpty
1324 test_pyexpat
1325 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001326 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001327 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001328 'openunix8':
1329 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001330 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001331 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001332 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001333 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001334 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001335 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001336 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001337 test_openpty
1338 test_pyexpat
1339 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001340 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001341 """,
1342 'sco_sv3':
1343 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001344 test_asynchat
1345 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001346 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001347 test_dl
1348 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001349 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001350 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001351 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001352 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001353 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001354 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001355 test_openpty
1356 test_pyexpat
1357 test_queue
1358 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001359 test_sundry
1360 test_thread
1361 test_threaded_import
1362 test_threadedtempfile
1363 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001364 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001365 'riscos':
1366 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001367 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001368 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001369 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001370 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001371 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001372 test_commands
1373 test_crypt
1374 test_dbm
1375 test_dl
1376 test_fcntl
1377 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001378 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001379 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001380 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001381 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001382 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001383 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001384 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001385 test_openpty
1386 test_poll
1387 test_popen2
1388 test_pty
1389 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001390 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001391 test_sundry
1392 test_thread
1393 test_threaded_import
1394 test_threadedtempfile
1395 test_threading
1396 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001397 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001398 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001399 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001400 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001401 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001402 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001403 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001404 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001405 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001406 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001407 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001408 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001409 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001410 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001411 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001412 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001413 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001414 'sunos5':
1415 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001416 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001417 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001418 test_curses
1419 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001420 test_epoll
1421 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001422 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001423 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001424 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001425 test_zipfile
1426 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001427 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001428 'hp-ux11':
1429 """
Skip Montanarob3230212002-03-15 02:54:03 +00001430 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001431 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001432 test_curses
1433 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001434 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001435 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001436 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001437 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001438 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001439 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001440 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001441 test_openpty
1442 test_pyexpat
1443 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001444 test_zipfile
1445 test_zlib
1446 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001447 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001448 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001449 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001450 test_curses
1451 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001452 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001453 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001454 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001455 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001456 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001457 test_mhlib
1458 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001459 test_poll
1460 test_popen2
1461 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001462 """,
Jason Tishler25115942002-12-05 15:18:15 +00001463 'cygwin':
1464 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001465 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001466 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001467 test_curses
1468 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001469 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001470 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001471 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001472 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001473 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001474 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001475 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001476 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001477 'os2emx':
1478 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001479 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001480 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001481 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001482 test_commands
1483 test_curses
1484 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001485 test_epoll
1486 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001487 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001488 test_mhlib
1489 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001490 test_openpty
1491 test_ossaudiodev
1492 test_pty
1493 test_resource
1494 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001495 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001496 'freebsd4':
1497 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001498 test_bsddb
1499 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001500 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001501 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001502 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001503 test_ossaudiodev
1504 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001505 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001506 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001507 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001508 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001509 test_ttk_guionly
1510 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001511 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001512 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001513 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001514 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001515 'aix5':
1516 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001517 test_bsddb
1518 test_bsddb185
1519 test_bsddb3
1520 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001521 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001522 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001523 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001524 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001525 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001526 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001527 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001528 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001529 test_ttk_guionly
1530 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001531 test_zipimport
1532 test_zlib
1533 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001534 'openbsd3':
1535 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001536 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001537 test_bsddb
1538 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001539 test_ctypes
1540 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001541 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001542 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001543 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001544 test_normalization
1545 test_ossaudiodev
1546 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001547 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001548 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001549 test_ttk_guionly
1550 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001551 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001552 """,
Georg Brandl08706872006-06-21 17:53:17 +00001553 'netbsd3':
1554 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001555 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001556 test_bsddb
1557 test_bsddb185
1558 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001559 test_ctypes
1560 test_curses
1561 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001562 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001563 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001564 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001565 test_ossaudiodev
1566 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001567 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001568 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001569 test_ttk_guionly
1570 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001571 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001572 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001573}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001574_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001575_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001576_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001577_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001578
Tim Petersb5b7b782001-08-12 01:20:39 +00001579class _ExpectedSkips:
1580 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001581 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001582 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001583
Tim Peters7c7efe92002-08-23 17:55:54 +00001584 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001585 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001586 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001587 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001588
Georg Brandlb2e208f2007-07-12 09:24:04 +00001589 # expected to be skipped on every platform, even Linux
1590 self.expected.add('test_linuxaudiodev')
1591
Tim Peters2a182db2002-10-09 01:07:11 +00001592 if not os.path.supports_unicode_filenames:
1593 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001594
Neal Norwitz55b61d22003-02-28 19:57:03 +00001595 if test_timeout.skip_expected:
1596 self.expected.add('test_timeout')
1597
Martin v. Löwisfba73692004-11-13 11:13:35 +00001598 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001599 self.expected.add('test_imageop')
1600
Ronald Oussoren9545a232010-05-05 19:09:31 +00001601 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001602 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001603 "test_plistlib", "test_scriptpackages",
1604 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001605 for skip in MAC_ONLY:
1606 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001607 elif len(u'\0'.encode('unicode-internal')) == 4:
1608 self.expected.add("test_macostools")
1609
Tim Petersecd79eb2003-01-29 00:35:32 +00001610
1611 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001612 # test_sqlite is only reliable on Windows where the library
1613 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001614 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001615 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001616 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001617 for skip in WIN_ONLY:
1618 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001619
Brett Cannondc48b742007-05-20 07:09:50 +00001620 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001621 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1622 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001623 for skip in IRIX_ONLY:
1624 self.expected.add(skip)
1625
Georg Brandlb2e208f2007-07-12 09:24:04 +00001626 if sys.platform != 'sunos5':
1627 self.expected.add('test_sunaudiodev')
1628 self.expected.add('test_nis')
1629
Steven Bethardd290b042008-03-21 21:01:18 +00001630 if not sys.py3kwarning:
1631 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001632
Tim Peters7c7efe92002-08-23 17:55:54 +00001633 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001634
1635 def isvalid(self):
1636 "Return true iff _ExpectedSkips knows about the current platform."
1637 return self.valid
1638
1639 def getexpected(self):
1640 """Return set of test names we expect to skip on current platform.
1641
1642 self.isvalid() must be true.
1643 """
1644
1645 assert self.isvalid()
1646 return self.expected
1647
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001648def main_in_temp_cwd():
1649 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02001650 global TEMPDIR
1651
Florent Xicluna0932dc52010-03-06 08:07:44 +00001652 # When tests are run from the Python build directory, it is best practice
1653 # to keep the test files in a subfolder. It eases the cleanup of leftover
1654 # files using command "make distclean".
1655 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00001656 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
1657 TEMPDIR = os.path.abspath(TEMPDIR)
1658 if not os.path.exists(TEMPDIR):
1659 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001660
1661 # Define a writable temp dir that will be used as cwd while running
1662 # the tests. The name of the dir includes the pid to allow parallel
1663 # testing (see the -j option).
1664 TESTCWD = 'test_python_{}'.format(os.getpid())
1665
Florent Xicluna12735662010-04-23 18:10:12 +00001666 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001667
1668 # Run the tests in a context manager that temporary changes the CWD to a
1669 # temporary and writable directory. If it's not possible to create or
1670 # change the CWD, the original CWD will be used. The original CWD is
1671 # available from test_support.SAVEDCWD.
1672 with test_support.temp_cwd(TESTCWD, quiet=True):
1673 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001674
1675if __name__ == '__main__':
1676 # findtestdir() gets the dirname out of __file__, so we have to make it
1677 # absolute before changing the working directory.
1678 # For example __file__ may be relative when running trace or profile.
1679 # See issue #9323.
1680 global __file__
1681 __file__ = os.path.abspath(__file__)
1682
1683 # sanity check
1684 assert __file__ == os.path.abspath(sys.argv[0])
1685
1686 main_in_temp_cwd()