blob: e49bcb962fb8de2851a6af5e50dd25c2bdf35499 [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
Victor Stinnerc991eb22017-05-03 17:28:28 +0200223CHILD_ERROR = -5 # error in a child process
Georg Brandl4045e882009-10-29 20:53:00 +0000224
Barry Warsaw04f357c2002-07-23 19:04:11 +0000225from test import test_support
Fred Drake3a15dac2002-04-11 16:39:16 +0000226
Benjamin Petersone2886fd2008-07-18 14:26:35 +0000227RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
Antoine Pitroud989f822010-10-14 15:43:25 +0000228 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
Collin Winterf8089c72009-04-09 16:46:46 +0000229 'xpickle')
Fred Drake3a15dac2002-04-11 16:39:16 +0000230
Florent Xicluna12735662010-04-23 18:10:12 +0000231TEMPDIR = os.path.abspath(tempfile.gettempdir())
232
Fred Drake3a15dac2002-04-11 16:39:16 +0000233
Barry Warsaw08fca522001-08-20 22:33:46 +0000234def usage(code, msg=''):
235 print __doc__
236 if msg: print msg
237 sys.exit(code)
238
239
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000240def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000241 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000242 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000243 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000244 random_seed=None, use_mp=None, verbose3=False, forever=False,
Brett Cannon95374782015-10-02 16:21:34 -0700245 header=False, pgo=False):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000246 """Execute a test suite.
247
Thomas Wouters7e474022000-07-16 12:04:32 +0000248 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000249 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000250
251 tests -- a list of strings containing test names (optional)
252 testdir -- the directory in which to look for tests (optional)
253
254 Users other than the Python test suite will certainly want to
255 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000256 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000257
258 If the tests argument is omitted, the tests listed on the
259 command-line will be used. If that's empty, too, then all *.py
260 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000261
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000262 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000263 single, randomize, findleaks, use_resources, trace, coverdir,
264 print_slow, and random_seed) allow programmers calling main()
265 directly to set the values that would normally be set by flags
266 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000267 """
Fred Drake004d5e62000-10-23 17:22:08 +0000268
Tim Peters8dee8092001-09-25 20:05:11 +0000269 test_support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000270 try:
Brett Cannon95374782015-10-02 16:21:34 -0700271 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:P',
Georg Brandl71a015a2009-10-27 20:52:02 +0000272 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Chris Jerdonek3684c792012-12-27 18:14:01 -0800273 'exclude', 'single', 'slow', 'randomize', 'fromfile=', 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000274 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
275 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Brett Cannon95374782015-10-02 16:21:34 -0700276 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo'])
Guido van Rossum152494a1996-12-20 03:12:20 +0000277 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000278 usage(2, msg)
279
280 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000281 if random_seed is None:
282 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000283 if use_resources is None:
284 use_resources = []
Guido van Rossum152494a1996-12-20 03:12:20 +0000285 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000286 if o in ('-h', '--help'):
287 usage(0)
288 elif o in ('-v', '--verbose'):
289 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000290 elif o in ('-w', '--verbose2'):
291 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000292 elif o in ('-W', '--verbose3'):
293 verbose3 = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000294 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000295 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000296 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000297 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000298 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000299 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000300 single = True
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000301 elif o in ('-S', '--slow'):
302 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000303 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000304 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000305 elif o == '--randseed':
306 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000307 elif o in ('-f', '--fromfile'):
308 fromfile = a
Barry Warsaw08fca522001-08-20 22:33:46 +0000309 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000310 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000311 elif o in ('-L', '--runleaks'):
312 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000313 elif o in ('-t', '--threshold'):
314 import gc
315 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000316 elif o in ('-T', '--coverage'):
317 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000318 elif o in ('-D', '--coverdir'):
319 coverdir = os.path.join(os.getcwd(), a)
320 elif o in ('-N', '--nocoverdir'):
321 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000322 elif o in ('-R', '--huntrleaks'):
323 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000324 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000325 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000326 usage(2, '-R takes 2 or 3 colon-separated arguments')
327 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000328 huntrleaks[0] = 5
329 else:
330 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000331 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000332 huntrleaks[1] = 4
333 else:
334 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000335 if len(huntrleaks) == 2 or not huntrleaks[2]:
336 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000337 elif o in ('-M', '--memlimit'):
338 test_support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000339 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000340 u = [x.lower() for x in a.split(',')]
341 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000342 if r == 'all':
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000343 use_resources[:] = RESOURCE_NAMES
344 continue
345 remove = False
346 if r[0] == '-':
347 remove = True
348 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000349 if r not in RESOURCE_NAMES:
350 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000351 if remove:
352 if r in use_resources:
353 use_resources.remove(r)
354 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000355 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000356 elif o in ('-F', '--forever'):
357 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000358 elif o in ('-j', '--multiprocess'):
359 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000360 elif o == '--header':
361 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000362 elif o == '--slaveargs':
363 args, kwargs = json.loads(a)
364 try:
365 result = runtest(*args, **kwargs)
366 except BaseException, e:
Georg Brandl4045e882009-10-29 20:53:00 +0000367 result = INTERRUPTED, e.__class__.__name__
Antoine Pitrou4698d992009-05-31 14:20:14 +0000368 print # Force a newline (just in case)
369 print json.dumps(result)
370 sys.exit(0)
Brett Cannon95374782015-10-02 16:21:34 -0700371 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700372 pgo = True
R. David Murrayda826892009-11-15 00:04:32 +0000373 else:
374 print >>sys.stderr, ("No handler for option {}. Please "
375 "report this as a bug at http://bugs.python.org.").format(o)
376 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000377 if single and fromfile:
378 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000379 if use_mp and trace:
380 usage(2, "-T and -j don't go together!")
381 if use_mp and findleaks:
382 usage(2, "-l and -j don't go together!")
Barry Warsaw08fca522001-08-20 22:33:46 +0000383
Guido van Rossum152494a1996-12-20 03:12:20 +0000384 good = []
385 bad = []
386 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000387 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000388 environment_changed = []
Florent Xicluna75c66762010-03-30 16:31:14 +0000389 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000390
Neil Schemenauerd569f232000-09-22 15:29:28 +0000391 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000392 try:
393 import gc
394 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000395 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000396 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000397 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000398 # Uncomment the line below to report garbage that is not
399 # freeable by reference counting alone. By default only
400 # garbage that is not collectable by the GC is reported.
401 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000402 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000403
Barry Warsawe11e3de1999-01-28 19:51:51 +0000404 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000405 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000406 try:
407 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000408 next_test = fp.read().strip()
409 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000410 fp.close()
411 except IOError:
412 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000413
414 if fromfile:
415 tests = []
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000416 fp = open(os.path.join(test_support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000417 for line in fp:
418 guts = line.split() # assuming no test has whitespace in its name
419 if guts and not guts[0].startswith('#'):
420 tests.extend(guts)
421 fp.close()
422
423 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000424 removepy(args)
425 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000426
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000427 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000428 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000429 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000430 for arg in args:
431 if arg in stdtests:
432 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000433 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000434 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000435
436 # For a partial run, we do not need to clutter the output.
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000437 if verbose or header or not (quiet or single or tests or args):
Brett Cannon95374782015-10-02 16:21:34 -0700438 if not pgo:
439 # Print basic platform information
440 print "==", platform.python_implementation(), \
441 " ".join(sys.version.split())
442 print "== ", platform.platform(aliased=True), \
443 "%s-endian" % sys.byteorder
444 print "== ", os.getcwd()
445 print "Testing with flags:", sys.flags
Florent Xicluna58526412010-03-06 17:24:36 +0000446
R. David Murray98e3df32009-12-16 11:49:46 +0000447 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000448 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000449 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000450 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000451 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000452 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000453 except IndexError:
454 next_single_test = None
Skip Montanaroab1c7912000-06-30 16:39:27 +0000455 if randomize:
Collin Wintera199f012009-03-29 03:44:19 +0000456 random.seed(random_seed)
457 print "Using random seed", random_seed
Florent Xicluna75c66762010-03-30 16:31:14 +0000458 random.shuffle(selected)
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000459 if trace:
460 import trace
461 tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
462 trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000463
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000464 test_times = []
Barry Warsaw08fca522001-08-20 22:33:46 +0000465 test_support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800466 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000467
468 def accumulate_result(test, result):
469 ok, test_time = result
Victor Stinnerc991eb22017-05-03 17:28:28 +0200470 if ok not in (CHILD_ERROR, INTERRUPTED):
471 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000472 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000473 good.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000474 elif ok == FAILED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000475 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000476 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000477 environment_changed.append(test)
478 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000479 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000480 elif ok == RESOURCE_DENIED:
481 skipped.append(test)
482 resource_denieds.append(test)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200483 else:
484 # CHILD_ERROR
485 bad.append(test)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000486
R. David Murray7f7eea62009-11-14 15:18:22 +0000487 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000488 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000489 while True:
490 for test in tests:
491 yield test
492 if bad:
493 return
494 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200495 test_count = ''
496 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000497 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000498 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200499 test_count = '/{}'.format(len(selected))
500 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000501
Antoine Pitrou4698d992009-05-31 14:20:14 +0000502 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000503 try:
504 from threading import Thread
505 except ImportError:
506 print "Multiprocess option requires thread support"
507 sys.exit(2)
Georg Brandla4f46e12010-02-07 17:03:15 +0000508 from Queue import Queue
509 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000510 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000511 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000512 def tests_and_args():
513 for test in tests:
514 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000515 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700516 dict(huntrleaks=huntrleaks, use_resources=use_resources,
517 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000518 )
519 yield (test, args_tuple)
520 pending = tests_and_args()
Antoine Pitroua226c912010-10-14 11:15:50 +0000521 opt_args = test_support.args_from_interpreter_flags()
522 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700523 # required to spawn a new process with PGO flag on/off
524 if pgo:
525 base_cmd = base_cmd + ['--pgo']
Antoine Pitrou4698d992009-05-31 14:20:14 +0000526 def work():
527 # A worker thread.
Neal Norwitz14ca3272006-02-28 18:05:43 +0000528 try:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000529 while True:
530 try:
R. David Murray7f7eea62009-11-14 15:18:22 +0000531 test, args_tuple = next(pending)
532 except StopIteration:
R. David Murray282396f2009-10-18 21:12:37 +0000533 output.put((None, None, None, None))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000534 return
Antoine Pitrou79c3bd82009-06-29 14:14:56 +0000535 # -E is needed by some tests, e.g. test_import
Antoine Pitroua226c912010-10-14 11:15:50 +0000536 popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
R. David Murray282396f2009-10-18 21:12:37 +0000537 stdout=PIPE, stderr=PIPE,
Antoine Pitrou0dd8e1d2010-08-18 20:45:10 +0000538 universal_newlines=True,
539 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000540 stdout, stderr = popen.communicate()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200541 retcode = popen.wait()
542
R. David Murray282396f2009-10-18 21:12:37 +0000543 # Strip last refcount output line if it exists, since it
544 # comes from the shutdown of the interpreter in the subcommand.
545 stderr = debug_output_pat.sub("", stderr)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200546
547 if retcode != 0:
548 result = (CHILD_ERROR, "Exit code %s" % retcode)
549 output.put((test, stdout.rstrip(), stderr.rstrip(),
550 result))
551
R. David Murray282396f2009-10-18 21:12:37 +0000552 stdout, _, result = stdout.strip().rpartition("\n")
R. David Murray7f7eea62009-11-14 15:18:22 +0000553 if not result:
554 output.put((None, None, None, None))
555 return
Antoine Pitrou4698d992009-05-31 14:20:14 +0000556 result = json.loads(result)
R. David Murray282396f2009-10-18 21:12:37 +0000557 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000558 except BaseException:
R. David Murray282396f2009-10-18 21:12:37 +0000559 output.put((None, None, None, None))
Neal Norwitz14ca3272006-02-28 18:05:43 +0000560 raise
Victor Stinnerc991eb22017-05-03 17:28:28 +0200561
Antoine Pitrou4698d992009-05-31 14:20:14 +0000562 workers = [Thread(target=work) for i in range(use_mp)]
563 for worker in workers:
564 worker.start()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200565
Antoine Pitrou4698d992009-05-31 14:20:14 +0000566 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200567 test_index = 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000568 try:
569 while finished < use_mp:
570 test, stdout, stderr, result = output.get()
571 if test is None:
572 finished += 1
573 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000574 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200575 if not quiet:
576 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
577 print(fmt.format(
578 test_count_width, test_index, test_count,
579 len(bad), test))
Victor Stinnerc991eb22017-05-03 17:28:28 +0200580
581 if stdout:
582 print stdout
583 sys.stdout.flush()
584 if stderr and not pgo:
585 print >>sys.stderr, stderr
586 sys.stderr.flush()
587
588 if result[0] == INTERRUPTED:
589 assert result[1] == 'KeyboardInterrupt'
590 raise KeyboardInterrupt # What else?
591
Victor Stinner32b1ff92014-09-05 12:12:11 +0200592 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000593 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000594 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000595 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000596 for worker in workers:
597 worker.join()
598 else:
Brett Cannon65918e02015-10-02 16:22:32 -0700599 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000600 if not quiet:
Victor Stinner32b1ff92014-09-05 12:12:11 +0200601 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
602 print(fmt.format(
603 test_count_width, test_index, test_count, len(bad), test))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000604 sys.stdout.flush()
605 if trace:
606 # If we're tracing code coverage, then we don't exit with status
607 # if on a false return value from main.
R. David Murray561b96f2011-02-11 17:25:54 +0000608 tracer.runctx('runtest(test, verbose, quiet)',
Antoine Pitrou4698d992009-05-31 14:20:14 +0000609 globals=globals(), locals=vars())
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000610 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000611 try:
Brett Cannon95374782015-10-02 16:21:34 -0700612 result = runtest(test, verbose, quiet, huntrleaks, None, pgo)
Georg Brandl4045e882009-10-29 20:53:00 +0000613 accumulate_result(test, result)
614 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700615 if not pgo:
616 print "Re-running test %r in verbose mode" % test
617 runtest(test, True, quiet, huntrleaks, None, pgo)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000618 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000619 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000620 break
621 except:
622 raise
623 if findleaks:
624 gc.collect()
625 if gc.garbage:
626 print "Warning: test created", len(gc.garbage),
627 print "uncollectable object(s)."
628 # move the uncollectable objects somewhere so we don't see
629 # them again
630 found_garbage.extend(gc.garbage)
631 del gc.garbage[:]
632 # Unload the newly imported modules (best effort finalization)
633 for module in sys.modules.keys():
634 if module not in save_modules and module.startswith("test."):
635 test_support.unload(module)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000636
Brett Cannon95374782015-10-02 16:21:34 -0700637 if interrupted and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000638 # print a newline after ^C
639 print
640 print "Test suite interrupted by signal SIGINT."
641 omitted = set(selected) - set(good) - set(bad) - set(skipped)
642 print count(len(omitted), "test"), "omitted:"
643 printlist(omitted)
Brett Cannon95374782015-10-02 16:21:34 -0700644 if good and not quiet and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000645 if not bad and not skipped and not interrupted and len(good) > 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000646 print "All",
647 print count(len(good), "test"), "OK."
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000648 if print_slow:
649 test_times.sort(reverse=True)
650 print "10 slowest tests:"
651 for time, test in test_times[:10]:
652 print "%s: %.1fs" % (test, time)
Brett Cannon95374782015-10-02 16:21:34 -0700653 if bad and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500654 print count(len(bad), "test"), "failed:"
655 printlist(bad)
Brett Cannon95374782015-10-02 16:21:34 -0700656 if environment_changed and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500657 print "{} altered the execution environment:".format(
658 count(len(environment_changed), "test"))
659 printlist(environment_changed)
Brett Cannon95374782015-10-02 16:21:34 -0700660 if skipped and not quiet and not pgo:
Tim Petersa45da922001-08-12 03:45:50 +0000661 print count(len(skipped), "test"), "skipped:"
662 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000663
Tim Petersb5b7b782001-08-12 01:20:39 +0000664 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000665 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000666 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000667 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000668 if surprise:
669 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000670 "unexpected on", plat + ":"
671 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000672 else:
673 print "Those skips are all expected on", plat + "."
674 else:
675 print "Ask someone to teach regrtest.py about which tests are"
676 print "expected to get skipped on", plat + "."
677
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000678 if verbose2 and bad:
679 print "Re-running failed tests in verbose mode"
Zachary Warea4777f12015-08-04 21:53:21 -0500680 for test in bad[:]:
Tim Peters922dd7d2006-03-10 23:37:10 +0000681 print "Re-running test %r in verbose mode" % test
682 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000683 try:
Neal Norwitz5fe5cf62008-03-18 17:58:02 +0000684 test_support.verbose = True
Brett Cannon95374782015-10-02 16:21:34 -0700685 ok = runtest(test, True, quiet, huntrleaks, None, pgo)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000686 except KeyboardInterrupt:
687 # print a newline separate from the ^C
688 print
689 break
Zachary Warea4777f12015-08-04 21:53:21 -0500690 else:
691 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
692 bad.remove(test)
693 else:
694 if bad:
695 print count(len(bad), "test"), "failed again:"
696 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000697
Barry Warsawe11e3de1999-01-28 19:51:51 +0000698 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000699 if next_single_test:
700 with open(filename, 'w') as fp:
701 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000702 else:
703 os.unlink(filename)
704
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000705 if trace:
706 r = tracer.results()
707 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
708
Skip Montanaro0179a182004-06-06 15:53:18 +0000709 if runleaks:
710 os.system("leaks %d" % os.getpid())
711
Florent Xicluna75c66762010-03-30 16:31:14 +0000712 sys.exit(len(bad) > 0 or interrupted)
Barry Warsaw08fca522001-08-20 22:33:46 +0000713
Guido van Rossum152494a1996-12-20 03:12:20 +0000714
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000715STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000716 'test_grammar',
717 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +0000718 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000719 'test_builtin',
720 'test_exceptions',
721 'test_types',
Collin Winter55453142007-03-08 19:58:14 +0000722 'test_unittest',
723 'test_doctest',
724 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000725]
Guido van Rossum152494a1996-12-20 03:12:20 +0000726
Florent Xicluna12d750d2010-03-06 14:38:09 +0000727NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +0000728 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000729 'test_future1',
730 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000731}
Guido van Rossum152494a1996-12-20 03:12:20 +0000732
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000733def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000734 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +0000735 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +0000736 names = os.listdir(testdir)
737 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +0000738 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +0000739 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +0000740 modname, ext = os.path.splitext(name)
741 if modname[:5] == "test_" and ext == ".py" and modname not in others:
742 tests.append(modname)
743 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +0000744
Antoine Pitrou4698d992009-05-31 14:20:14 +0000745def runtest(test, verbose, quiet,
Brett Cannon95374782015-10-02 16:21:34 -0700746 huntrleaks=False, use_resources=None, pgo=False):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000747 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +0000748
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000749 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000750 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000751 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000752 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +0000753 huntrleaks -- run multiple times to test for leaks; requires a debug
754 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -0700755 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -0700756 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -0700757
Georg Brandl4045e882009-10-29 20:53:00 +0000758 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +0200759 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +0000760 INTERRUPTED KeyboardInterrupt when run under -j
761 RESOURCE_DENIED test skipped because resource denied
762 SKIPPED test skipped for some other reason
763 ENV_CHANGED test failed because it changed the execution environment
764 FAILED test failed
765 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000766 """
Tim Peters06c5c002006-06-05 00:55:26 +0000767
Antoine Pitrou4698d992009-05-31 14:20:14 +0000768 test_support.verbose = verbose # Tell tests to be moderately quiet
769 if use_resources is not None:
770 test_support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +0000771 try:
Brett Cannon95374782015-10-02 16:21:34 -0700772 return runtest_inner(test, verbose, quiet, huntrleaks, pgo)
Tim Peterse5584862006-06-09 19:24:44 +0000773 finally:
774 cleanup_test_droppings(test, verbose)
775
R. David Murray14dcd432009-10-14 13:58:07 +0000776
777# Unit tests are supposed to leave the execution environment unchanged
778# once they complete. But sometimes tests have bugs, especially when
779# tests fail, and the changes to environment go on to mess up other
780# tests. This can cause issues with buildbot stability, since tests
781# are run in random order and so problems may appear to come and go.
782# There are a few things we can save and restore to mitigate this, and
783# the following context manager handles this task.
784
785class saved_test_environment:
786 """Save bits of the test environment and restore them at block exit.
787
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000788 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +0000789 #stuff
790
791 Unless quiet is True, a warning is printed to stderr if any of
792 the saved items was changed by the test. The attribute 'changed'
793 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000794
795 If verbose is more than 1, the before and after state of changed
796 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +0000797 """
798
799 changed = False
800
Brett Cannon95374782015-10-02 16:21:34 -0700801 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +0000802 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000803 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +0000804 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -0700805 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +0000806
807 # To add things to save and restore, add a name XXX to the resources list
808 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
809 # return the value to be saved and compared against a second call to the
810 # get function when test execution completes. restore_XXX should accept
811 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000812 # and only if a change in the value is detected.
813 #
814 # Note: XXX will have any '.' replaced with '_' characters when determining
815 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +0000816
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000817 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +0000818 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300819 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +0000820 )
R. David Murray14dcd432009-10-14 13:58:07 +0000821
822 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000823 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +0000824 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +0000825 sys.argv = saved_argv[1]
826 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +0000827
828 def get_cwd(self):
829 return os.getcwd()
830 def restore_cwd(self, saved_cwd):
831 os.chdir(saved_cwd)
832
833 def get_sys_stdout(self):
834 return sys.stdout
835 def restore_sys_stdout(self, saved_stdout):
836 sys.stdout = saved_stdout
837
838 def get_sys_stderr(self):
839 return sys.stderr
840 def restore_sys_stderr(self, saved_stderr):
841 sys.stderr = saved_stderr
842
843 def get_sys_stdin(self):
844 return sys.stdin
845 def restore_sys_stdin(self, saved_stdin):
846 sys.stdin = saved_stdin
847
848 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000849 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +0000850 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +0000851 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +0000852 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +0000853 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +0000854
855 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000856 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +0000857 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +0000858 sys.path = saved_path[1]
859 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +0000860
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000861 def get_asyncore_socket_map(self):
862 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000863 # XXX Making a copy keeps objects alive until __exit__ gets called.
864 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000865 def restore_asyncore_socket_map(self, saved_map):
866 asyncore = sys.modules.get('asyncore')
867 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000868 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000869 asyncore.socket_map.update(saved_map)
870
Vinay Sajipda563bf2012-03-06 20:07:15 +0000871 def get_test_support_TESTFN(self):
872 if os.path.isfile(test_support.TESTFN):
873 result = 'f'
874 elif os.path.isdir(test_support.TESTFN):
875 result = 'd'
876 else:
877 result = None
878 return result
879 def restore_test_support_TESTFN(self, saved_value):
880 if saved_value is None:
881 if os.path.isfile(test_support.TESTFN):
882 os.unlink(test_support.TESTFN)
883 elif os.path.isdir(test_support.TESTFN):
884 shutil.rmtree(test_support.TESTFN)
885
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300886 def get_files(self):
887 return sorted(fn + ('/' if os.path.isdir(fn) else '')
888 for fn in os.listdir(os.curdir))
889 def restore_files(self, saved_value):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200890 fn = test_support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300891 if fn not in saved_value and (fn + '/') not in saved_value:
892 if os.path.isfile(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200893 test_support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300894 elif os.path.isdir(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200895 test_support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300896
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000897 def resource_info(self):
898 for name in self.resources:
899 method_suffix = name.replace('.', '_')
900 get_name = 'get_' + method_suffix
901 restore_name = 'restore_' + method_suffix
902 yield name, getattr(self, get_name), getattr(self, restore_name)
903
R. David Murray14dcd432009-10-14 13:58:07 +0000904 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000905 self.saved_values = dict((name, get()) for name, get, restore
906 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +0000907 return self
908
909 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000910 saved_values = self.saved_values
911 del self.saved_values
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000912 for name, get, restore in self.resource_info():
913 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000914 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000915 # Check for changes to the resource's value
916 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +0000917 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000918 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -0700919 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000920 print >>sys.stderr, (
921 "Warning -- {} was modified by {}".format(
922 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +0200923 print >>sys.stderr, (
924 " Before: {}\n After: {} ".format(
925 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000926 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
927 # matters at least as much as value. For others (e.g. cwd),
928 # identity is irrelevant. Should we add a mechanism to check
929 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +0000930 return False
931
932
Brett Cannon95374782015-10-02 16:21:34 -0700933def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False):
Guido van Rossum152494a1996-12-20 03:12:20 +0000934 test_support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +0000935 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000936 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000937 else:
Michael Foord91a2c892010-04-08 00:04:24 +0000938 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +0000939
Antoine Pitrou4698d992009-05-31 14:20:14 +0000940 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +0000941 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +0000942 try:
Tim Peters342ca752001-09-25 19:13:20 +0000943 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +0000944 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000945 if capture_stdout:
946 sys.stdout = capture_stdout
Barry Warsaw408b6d32002-07-30 23:27:12 +0000947 if test.startswith('test.'):
948 abstest = test
949 else:
950 # Always import it from the test package
951 abstest = 'test.' + test
Serhiy Storchakaac33bd72016-11-11 11:42:25 +0200952 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -0700953 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +0000954 start_time = time.time()
955 the_package = __import__(abstest, globals(), locals(), [])
956 the_module = getattr(the_package, test)
957 # Old tests run to completion simply as a side-effect of
958 # being imported. For tests based on unittest or doctest,
959 # explicitly invoke their test_main() function (if it exists).
960 indirect_test = getattr(the_module, "test_main", None)
961 if indirect_test is not None:
962 indirect_test()
963 if huntrleaks:
964 refleak = dash_R(the_module, test, indirect_test,
965 huntrleaks)
966 test_time = time.time() - start_time
Guido van Rossum41360a41998-03-26 19:42:58 +0000967 finally:
Tim Peters342ca752001-09-25 19:13:20 +0000968 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +0000969 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700970 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +0000971 print test, "skipped --", msg
972 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000973 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +0000974 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700975 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +0000976 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000977 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000978 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +0000979 except KeyboardInterrupt:
980 raise
Guido van Rossum152494a1996-12-20 03:12:20 +0000981 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700982 if not pgo:
983 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +0000984 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000985 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +0000986 except:
Guido van Rossum41360a41998-03-26 19:42:58 +0000987 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -0700988 if not pgo:
989 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +0000990 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -0700991 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +0000992 traceback.print_exc(file=sys.stderr)
993 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000994 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +0000995 else:
Collin Winter0f489742009-05-14 23:26:30 +0000996 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +0000997 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +0000998 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +0000999 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001000 # Except in verbose mode, tests should not print anything
1001 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001002 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001003 output = capture_stdout.getvalue()
1004 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001005 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001006 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001007 print "*" * 70
1008 print output
1009 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001010 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001011 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001012
Tim Peterse5584862006-06-09 19:24:44 +00001013def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001014 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001015 import gc
1016
1017 # First kill any dangling references to open files etc.
1018 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001019
1020 # Try to clean up junk commonly left behind. While tests shouldn't leave
1021 # any files or directories behind, when a test fails that can be tedious
1022 # for it to arrange. The consequences can be especially nasty on Windows,
1023 # since if a test leaves a file open, it cannot be deleted by name (while
1024 # there's nothing we can do about that here either, we can display the
1025 # name of the offending test, which is a real help).
1026 for name in (test_support.TESTFN,
1027 "db_home",
1028 ):
1029 if not os.path.exists(name):
1030 continue
1031
1032 if os.path.isdir(name):
1033 kind, nuker = "directory", shutil.rmtree
1034 elif os.path.isfile(name):
1035 kind, nuker = "file", os.unlink
1036 else:
1037 raise SystemError("os.path says %r exists but is neither "
1038 "directory nor file" % name)
1039
1040 if verbose:
1041 print "%r left behind %s %r" % (testname, kind, name)
1042 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001043 # if we have chmod, fix possible permissions problems
1044 # that might prevent cleanup
1045 if (hasattr(os, 'chmod')):
1046 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001047 nuker(name)
1048 except Exception, msg:
1049 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1050 "removed: %s" % (testname, kind, name, msg))
1051
Tim Peters06c5c002006-06-05 00:55:26 +00001052def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001053 """Run a test multiple times, looking for reference leaks.
1054
1055 Returns:
1056 False if the test didn't leak references; True if we detected refleaks.
1057 """
Tim Peters06c5c002006-06-05 00:55:26 +00001058 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001059 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001060
1061 if not hasattr(sys, 'gettotalrefcount'):
1062 raise Exception("Tracking reference leaks requires a debug build "
1063 "of Python")
1064
1065 # Save current values for dash_R_cleanup() to restore.
1066 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001067 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001068 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001069 try:
1070 import zipimport
1071 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001072 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001073 else:
1074 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001075 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001076 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001077 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1078 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1079 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001080 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001081 for obj in abc.__subclasses__() + [abc]:
1082 abcs[obj] = obj._abc_registry.copy()
1083
Tim Peters06c5c002006-06-05 00:55:26 +00001084 if indirect_test:
1085 def run_the_test():
1086 indirect_test()
1087 else:
1088 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001089 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001090
1091 deltas = []
1092 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001093 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001094 repcount = nwarmup + ntracked
1095 print >> sys.stderr, "beginning", repcount, "repetitions"
1096 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001097 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001098 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001099 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001100 run_the_test()
1101 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001102 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001103 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001104 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001105 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001106 print >> sys.stderr
1107 if any(deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001108 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1109 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001110 with open(fname, "a") as refrep:
1111 print >> refrep, msg
1112 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001113 return True
1114 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001115
Benjamin Peterson55035792014-02-16 14:51:17 -05001116def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001117 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001118
Tim Peters06c5c002006-06-05 00:55:26 +00001119 # Restore some original values.
1120 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001121 copy_reg.dispatch_table.clear()
1122 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001123 sys.path_importer_cache.clear()
1124 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001125 try:
1126 import zipimport
1127 except ImportError:
1128 pass # Run unmodified on platforms without zipimport support
1129 else:
1130 zipimport._zip_directory_cache.clear()
1131 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001132
Christian Heimes908caac2008-01-27 23:34:59 +00001133 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001134 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001135
Guido van Rossum64c06e32007-11-22 00:55:51 +00001136 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001137 for abc, registry in abcs.items():
1138 abc._abc_registry = registry.copy()
1139 abc._abc_cache.clear()
1140 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001141
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001142 clear_caches()
1143
1144def clear_caches():
1145 import gc
1146
1147 # Clear the warnings registry, so they can be displayed again
1148 for mod in sys.modules.values():
1149 if hasattr(mod, '__warningregistry__'):
1150 del mod.__warningregistry__
1151
Tim Peters06c5c002006-06-05 00:55:26 +00001152 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001153 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001154 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001155 distutils_dir_util = sys.modules['distutils.dir_util']
1156 except KeyError:
1157 pass
1158 else:
1159 distutils_dir_util._path_created.clear()
1160
1161 re.purge()
1162
1163 try:
1164 _strptime = sys.modules['_strptime']
1165 except KeyError:
1166 pass
1167 else:
1168 _strptime._regex_cache.clear()
1169
1170 try:
1171 urlparse = sys.modules['urlparse']
1172 except KeyError:
1173 pass
1174 else:
1175 urlparse.clear_cache()
1176
1177 try:
1178 urllib = sys.modules['urllib']
1179 except KeyError:
1180 pass
1181 else:
1182 urllib.urlcleanup()
1183
1184 try:
1185 urllib2 = sys.modules['urllib2']
1186 except KeyError:
1187 pass
1188 else:
1189 urllib2.install_opener(None)
1190
1191 try:
1192 dircache = sys.modules['dircache']
1193 except KeyError:
1194 pass
1195 else:
1196 dircache.reset()
1197
1198 try:
1199 linecache = sys.modules['linecache']
1200 except KeyError:
1201 pass
1202 else:
1203 linecache.clearcache()
1204
1205 try:
1206 mimetypes = sys.modules['mimetypes']
1207 except KeyError:
1208 pass
1209 else:
1210 mimetypes._default_mime_types()
1211
1212 try:
1213 filecmp = sys.modules['filecmp']
1214 except KeyError:
1215 pass
1216 else:
1217 filecmp._cache.clear()
1218
1219 try:
1220 struct = sys.modules['struct']
1221 except KeyError:
1222 pass
1223 else:
1224 struct._clearcache()
1225
1226 try:
1227 doctest = sys.modules['doctest']
1228 except KeyError:
1229 pass
1230 else:
1231 doctest.master = None
1232
1233 try:
1234 ctypes = sys.modules['ctypes']
1235 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001236 pass
1237 else:
1238 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001239
1240 # Collect cyclic trash.
1241 gc.collect()
1242
Florent Xicluna0932dc52010-03-06 08:07:44 +00001243def findtestdir(path=None):
1244 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001245
Florent Xicluna0932dc52010-03-06 08:07:44 +00001246def removepy(names):
1247 if not names:
1248 return
1249 for idx, name in enumerate(names):
1250 basename, ext = os.path.splitext(name)
1251 if ext == '.py':
1252 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001253
Guido van Rossum152494a1996-12-20 03:12:20 +00001254def count(n, word):
1255 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001256 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001257 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001258 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001259
Tim Petersa45da922001-08-12 03:45:50 +00001260def printlist(x, width=70, indent=4):
Tim Peters7c7efe92002-08-23 17:55:54 +00001261 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001262
1263 Optional arg width (default 70) is the maximum line length.
1264 Optional arg indent (default 4) is the number of blanks with which to
1265 begin each line.
1266 """
1267
Tim Petersba78bc42002-07-04 19:45:06 +00001268 from textwrap import fill
1269 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001270 # Print the sorted list: 'x' may be a '--random' list or a set()
1271 print fill(' '.join(str(elt) for elt in sorted(x)), width,
Tim Petersba78bc42002-07-04 19:45:06 +00001272 initial_indent=blanks, subsequent_indent=blanks)
Tim Petersa45da922001-08-12 03:45:50 +00001273
Tim Petersde14a302002-04-01 05:04:46 +00001274# Map sys.platform to a string containing the basenames of tests
1275# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001276#
1277# Special cases:
1278# test_pep277
1279# The _ExpectedSkips constructor adds this to the set of expected
1280# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001281# test_timeout
1282# Controlled by test_timeout.skip_expected. Requires the network
1283# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001284#
1285# Tests that are expected to be skipped everywhere except on one platform
1286# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001287
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001288_expectations = {
1289 'win32':
1290 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001291 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001292 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001293 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001294 test_commands
1295 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001296 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001297 test_dbm
1298 test_dl
1299 test_fcntl
1300 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001301 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001302 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001303 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001304 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001305 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001306 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001307 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001308 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001309 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001310 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001311 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001312 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001313 test_pty
1314 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001315 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001316 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001317 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001318 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001319 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001320 test_wait3
1321 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001322 """,
1323 'linux2':
1324 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001325 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001326 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001327 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001328 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001329 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001330 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001331 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001332 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001333 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001334 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001335 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001336 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001337 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001338 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001339 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001340 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001341 test_openpty
1342 test_pyexpat
1343 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001344 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001345 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001346 'openunix8':
1347 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001348 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001349 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001350 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001351 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001352 test_largefile
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_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001358 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001359 """,
1360 'sco_sv3':
1361 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001362 test_asynchat
1363 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001364 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001365 test_dl
1366 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001367 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001368 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001369 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001370 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001371 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001372 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001373 test_openpty
1374 test_pyexpat
1375 test_queue
1376 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001377 test_sundry
1378 test_thread
1379 test_threaded_import
1380 test_threadedtempfile
1381 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001382 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001383 'riscos':
1384 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001385 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001386 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001387 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001388 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001389 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001390 test_commands
1391 test_crypt
1392 test_dbm
1393 test_dl
1394 test_fcntl
1395 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001396 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001397 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001398 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001399 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001400 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001401 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001402 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001403 test_openpty
1404 test_poll
1405 test_popen2
1406 test_pty
1407 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001408 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001409 test_sundry
1410 test_thread
1411 test_threaded_import
1412 test_threadedtempfile
1413 test_threading
1414 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001415 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001416 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001417 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001418 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001419 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001420 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001421 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001422 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001423 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001424 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001425 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001426 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001427 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001428 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001429 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001430 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001431 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001432 'sunos5':
1433 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001434 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001435 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001436 test_curses
1437 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001438 test_epoll
1439 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001440 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001441 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001442 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001443 test_zipfile
1444 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001445 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001446 'hp-ux11':
1447 """
Skip Montanarob3230212002-03-15 02:54:03 +00001448 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001449 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001450 test_curses
1451 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001452 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001453 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001454 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001455 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001456 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001457 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001458 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001459 test_openpty
1460 test_pyexpat
1461 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001462 test_zipfile
1463 test_zlib
1464 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001465 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001466 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001467 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001468 test_curses
1469 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001470 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001471 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001472 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001473 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001474 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001475 test_mhlib
1476 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001477 test_poll
1478 test_popen2
1479 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001480 """,
Jason Tishler25115942002-12-05 15:18:15 +00001481 'cygwin':
1482 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001483 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001484 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001485 test_curses
1486 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001487 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001488 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001489 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001490 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001491 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001492 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001493 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001494 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001495 'os2emx':
1496 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001497 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001498 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001499 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001500 test_commands
1501 test_curses
1502 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001503 test_epoll
1504 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001505 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001506 test_mhlib
1507 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001508 test_openpty
1509 test_ossaudiodev
1510 test_pty
1511 test_resource
1512 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001513 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001514 'freebsd4':
1515 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001516 test_bsddb
1517 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001518 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001519 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001520 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001521 test_ossaudiodev
1522 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001523 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001524 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001525 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001526 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001527 test_ttk_guionly
1528 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001529 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001530 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001531 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001532 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001533 'aix5':
1534 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001535 test_bsddb
1536 test_bsddb185
1537 test_bsddb3
1538 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001539 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001540 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001541 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001542 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001543 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001544 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001545 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001546 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001547 test_ttk_guionly
1548 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001549 test_zipimport
1550 test_zlib
1551 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001552 'openbsd3':
1553 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001554 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001555 test_bsddb
1556 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001557 test_ctypes
1558 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001559 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001560 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001561 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001562 test_normalization
1563 test_ossaudiodev
1564 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001565 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001566 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001567 test_ttk_guionly
1568 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001569 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001570 """,
Georg Brandl08706872006-06-21 17:53:17 +00001571 'netbsd3':
1572 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001573 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001574 test_bsddb
1575 test_bsddb185
1576 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001577 test_ctypes
1578 test_curses
1579 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001580 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001581 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001582 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001583 test_ossaudiodev
1584 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001585 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001586 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001587 test_ttk_guionly
1588 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001589 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001590 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001591}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001592_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001593_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001594_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001595_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001596
Tim Petersb5b7b782001-08-12 01:20:39 +00001597class _ExpectedSkips:
1598 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001599 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001600 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001601
Tim Peters7c7efe92002-08-23 17:55:54 +00001602 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001603 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001604 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001605 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001606
Georg Brandlb2e208f2007-07-12 09:24:04 +00001607 # expected to be skipped on every platform, even Linux
1608 self.expected.add('test_linuxaudiodev')
1609
Tim Peters2a182db2002-10-09 01:07:11 +00001610 if not os.path.supports_unicode_filenames:
1611 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001612
Neal Norwitz55b61d22003-02-28 19:57:03 +00001613 if test_timeout.skip_expected:
1614 self.expected.add('test_timeout')
1615
Martin v. Löwisfba73692004-11-13 11:13:35 +00001616 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001617 self.expected.add('test_imageop')
1618
Ronald Oussoren9545a232010-05-05 19:09:31 +00001619 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001620 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001621 "test_plistlib", "test_scriptpackages",
1622 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001623 for skip in MAC_ONLY:
1624 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001625 elif len(u'\0'.encode('unicode-internal')) == 4:
1626 self.expected.add("test_macostools")
1627
Tim Petersecd79eb2003-01-29 00:35:32 +00001628
1629 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001630 # test_sqlite is only reliable on Windows where the library
1631 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001632 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001633 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001634 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001635 for skip in WIN_ONLY:
1636 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001637
Brett Cannondc48b742007-05-20 07:09:50 +00001638 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001639 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1640 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001641 for skip in IRIX_ONLY:
1642 self.expected.add(skip)
1643
Georg Brandlb2e208f2007-07-12 09:24:04 +00001644 if sys.platform != 'sunos5':
1645 self.expected.add('test_sunaudiodev')
1646 self.expected.add('test_nis')
1647
Steven Bethardd290b042008-03-21 21:01:18 +00001648 if not sys.py3kwarning:
1649 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001650
Tim Peters7c7efe92002-08-23 17:55:54 +00001651 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001652
1653 def isvalid(self):
1654 "Return true iff _ExpectedSkips knows about the current platform."
1655 return self.valid
1656
1657 def getexpected(self):
1658 """Return set of test names we expect to skip on current platform.
1659
1660 self.isvalid() must be true.
1661 """
1662
1663 assert self.isvalid()
1664 return self.expected
1665
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001666def main_in_temp_cwd():
1667 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02001668 global TEMPDIR
1669
Florent Xicluna0932dc52010-03-06 08:07:44 +00001670 # When tests are run from the Python build directory, it is best practice
1671 # to keep the test files in a subfolder. It eases the cleanup of leftover
1672 # files using command "make distclean".
1673 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00001674 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
1675 TEMPDIR = os.path.abspath(TEMPDIR)
1676 if not os.path.exists(TEMPDIR):
1677 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001678
1679 # Define a writable temp dir that will be used as cwd while running
1680 # the tests. The name of the dir includes the pid to allow parallel
1681 # testing (see the -j option).
1682 TESTCWD = 'test_python_{}'.format(os.getpid())
1683
Florent Xicluna12735662010-04-23 18:10:12 +00001684 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001685
1686 # Run the tests in a context manager that temporary changes the CWD to a
1687 # temporary and writable directory. If it's not possible to create or
1688 # change the CWD, the original CWD will be used. The original CWD is
1689 # available from test_support.SAVEDCWD.
1690 with test_support.temp_cwd(TESTCWD, quiet=True):
1691 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001692
1693if __name__ == '__main__':
1694 # findtestdir() gets the dirname out of __file__, so we have to make it
1695 # absolute before changing the working directory.
1696 # For example __file__ may be relative when running trace or profile.
1697 # See issue #9323.
1698 global __file__
1699 __file__ = os.path.abspath(__file__)
1700
1701 # sanity check
1702 assert __file__ == os.path.abspath(sys.argv[0])
1703
1704 main_in_temp_cwd()