blob: 6b49dafd9368f49a7574f412cf878ffade7494a4 [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
Victor Stinner453a6852017-05-09 17:06:34 +020030-S/--slowest -- 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)
Serhiy Storchaka74f0db82017-05-04 00:23:50 +030040-m/--match PAT -- match test cases and methods with glob pattern PAT
Victor Stinner24c2c202017-06-16 17:30:03 +020041--matchfile FILENAME -- filters tests using a text file, one pattern per line
Serhiy Storchaka74f0db82017-05-04 00:23:50 +030042-G/--failfast -- fail as soon as a test fails (only with -v or -W)
Georg Brandl83191702009-10-27 20:55:44 +000043-u/--use RES1,RES2,...
44 -- specify which special resource intensive tests to run
45-M/--memlimit LIMIT
46 -- run very large memory-consuming tests
47
48Special runs
49
50-l/--findleaks -- if GC is available detect tests that leak memory
51-L/--runleaks -- run the leaks(1) command just before exit
52-R/--huntrleaks RUNCOUNTS
53 -- search for reference leaks (needs debug build, v. slow)
54-j/--multiprocess PROCESSES
55 -- run PROCESSES processes at once
R. David Murray3bfa8832010-04-26 16:54:57 +000056-T/--coverage -- turn on code coverage tracing using the trace module
Georg Brandl83191702009-10-27 20:55:44 +000057-D/--coverdir DIRECTORY
58 -- Directory where coverage files are put
59-N/--nocoverdir -- Put coverage files alongside modules
60-t/--threshold THRESHOLD
61 -- call gc.set_threshold(THRESHOLD)
R. David Murray3bfa8832010-04-26 16:54:57 +000062-F/--forever -- run the specified tests in a loop, until an error happens
Brett Cannon95374782015-10-02 16:21:34 -070063-P/--pgo -- enable Profile Guided Optimization training
Victor Stinnerd2aff602017-05-09 13:57:20 +020064--testdir -- execute test files in the specified directory
65 (instead of the Python stdlib test suite)
Victor Stinner453a6852017-05-09 17:06:34 +020066--list-tests -- only write the name of tests that will be run,
67 don't execute them
Victor Stinner24c2c202017-06-16 17:30:03 +020068--list-cases -- only write the name of test cases that will be run,
69 don't execute them
Victor Stinnerfea98bf2017-06-27 16:56:43 +020070--fail-env-changed -- if a test file alters the environment, mark the test
71 as failed
Guido van Rossum152494a1996-12-20 03:12:20 +000072
R. David Murray3bfa8832010-04-26 16:54:57 +000073
74Additional Option Details:
Guido van Rossumf58ed251997-03-07 21:04:33 +000075
Serhiy Storchakac72e66a2015-11-02 15:06:09 +020076-r randomizes test execution order. You can use --randseed=int to provide an
Collin Wintera199f012009-03-29 03:44:19 +000077int seed value for the randomizer; this is useful for reproducing troublesome
78test orders.
79
R. David Murray3bfa8832010-04-26 16:54:57 +000080-s On the first invocation of regrtest using -s, the first test file found
81or the first test file given on the command line is run, and the name of
82the next test is recorded in a file named pynexttest. If run from the
83Python build directory, pynexttest is located in the 'build' subdirectory,
84otherwise it is located in tempfile.gettempdir(). On subsequent runs,
85the test in pynexttest is run, and the next test is written to pynexttest.
86When the last test has been run, pynexttest is deleted. In this way it
87is possible to single step through the test files. This is useful when
88doing memory analysis on the Python interpreter, which process tends to
89consume too many resources to run the full regression test non-stop.
Barry Warsawe11e3de1999-01-28 19:51:51 +000090
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000091-f reads the names of tests from the file given as f's argument, one
92or more test names per line. Whitespace is ignored. Blank lines and
93lines beginning with '#' are ignored. This is especially useful for
94whittling down failures involving interactions among tests.
Tim Petersc5000df2002-06-02 21:42:01 +000095
Skip Montanaro0179a182004-06-06 15:53:18 +000096-L causes the leaks(1) command to be run just before exit if it exists.
97leaks(1) is available on Mac OS X and presumably on some other
98FreeBSD-derived systems.
99
Michael W. Hudson61147f62004-08-03 11:33:28 +0000100-R runs each test several times and examines sys.gettotalrefcount() to
101see if the test appears to be leaking references. The argument should
102be of the form stab:run:fname where 'stab' is the number of times the
103test is run to let gettotalrefcount settle down, 'run' is the number
104of times further it is run and 'fname' is the name of the file the
105reports are written to. These parameters all have defaults (5, 4 and
Florent Xicluna12d750d2010-03-06 14:38:09 +0000106"reflog.txt" respectively), and the minimal invocation is '-R :'.
Michael W. Hudson61147f62004-08-03 11:33:28 +0000107
Thomas Woutersabd08882006-04-26 15:53:30 +0000108-M runs tests that require an exorbitant amount of memory. These tests
109typically try to ascertain containers keep working when containing more than
Armin Rigo97ff0472006-08-09 15:37:26 +00001102 billion objects, which only works on 64-bit systems. There are also some
111tests that try to exhaust the address space of the process, which only makes
112sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
Thomas Woutersabd08882006-04-26 15:53:30 +0000113which is a string in the form of '2.5Gb', determines howmuch memory the
114tests will limit themselves to (but they may go slightly over.) The number
115shouldn't be more memory than the machine has (including swap memory). You
116should also keep in mind that swap memory is generally much, much slower
117than RAM, and setting memlimit to all available RAM or higher will heavily
118tax the machine. On the other hand, it is no use running these tests with a
119limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
120to use more than memlimit memory will be skipped. The big-memory tests
121generally run very, very long.
122
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000123-u is used to specify which special resource intensive tests to run,
124such as those requiring large file support or network connectivity.
125The argument is a comma-separated list of words indicating the
126resources to test. Currently only the following are defined:
Barry Warsaw08fca522001-08-20 22:33:46 +0000127
Fred Drake3a15dac2002-04-11 16:39:16 +0000128 all - Enable all special resources.
129
Guido van Rossum315aa362003-03-11 14:46:48 +0000130 audio - Tests that use the audio device. (There are known
131 cases of broken audio drivers that can crash Python or
132 even the Linux kernel.)
133
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000134 curses - Tests that use curses and will modify the terminal's
135 state and output modes.
Tim Peters1633a2e2001-10-30 05:56:40 +0000136
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000137 largefile - It is okay to run some test that may create huge
138 files. These tests can take a long time and may
139 consume >2GB of disk space temporarily.
Barry Warsaw08fca522001-08-20 22:33:46 +0000140
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000141 network - It is okay to run tests that use external network
142 resource, e.g. testing SSL support for sockets.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +0000143
144 bsddb - It is okay to run the bsddb testsuite, which takes
145 a long time to complete.
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000146
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000147 decimal - Test the decimal module against a large suite that
148 verifies compliance with standards.
149
Antoine Pitroud989f822010-10-14 15:43:25 +0000150 cpu - Used for certain CPU-heavy tests.
Jeremy Hylton4336eda2004-08-07 19:25:33 +0000151
Tim Peterseba28be2005-03-28 01:08:02 +0000152 subprocess Run all tests for the subprocess module.
Peter Astrandf7f1bb72005-03-03 20:47:37 +0000153
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000154 urlfetch - It is okay to download files required on testing.
155
Guilherme Polob1a98de2009-01-28 20:03:26 +0000156 gui - Run tests that require a running GUI.
157
Collin Winterf8089c72009-04-09 16:46:46 +0000158 xpickle - Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
159 test backwards compatibility. These tests take a long time
160 to run.
161
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000162To enable all resources except one, use '-uall,-<resource>'. For
163example, to run all the tests except for the bsddb tests, give the
164option '-uall,-bsddb'.
Victor Stinner24c2c202017-06-16 17:30:03 +0200165
166--matchfile filters tests using a text file, one pattern per line.
167Pattern examples:
168
169- test method: test_stat_attributes
170- test class: FileTests
171- test identifier: test_os.FileTests.test_stat_attributes
Guido van Rossum152494a1996-12-20 03:12:20 +0000172"""
173
Michael Foord91a2c892010-04-08 00:04:24 +0000174import StringIO
Victor Stinner453a6852017-05-09 17:06:34 +0200175import datetime
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000176import getopt
Victor Stinner5430c142018-06-26 23:57:12 +0200177import imp
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000178import json
Victor Stinner5430c142018-06-26 23:57:12 +0200179import math
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000180import os
Victor Stinner5430c142018-06-26 23:57:12 +0200181import platform
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000182import random
183import re
Serhiy Storchakabb801312013-02-10 12:01:31 +0200184import shutil
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000185import sys
Victor Stinner5430c142018-06-26 23:57:12 +0200186import sysconfig
187import tempfile
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000188import time
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000189import traceback
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000190import unittest
Victor Stinner5430c142018-06-26 23:57:12 +0200191import warnings
Guido van Rossumdc15c272002-08-12 21:55:51 +0000192
Guido van Rossum152494a1996-12-20 03:12:20 +0000193
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000194# Some times __path__ and __file__ are not absolute (e.g. while running from
195# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
196# imports might fail. This affects only the modules imported before os.chdir().
197# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
198# they are found in the CWD their __file__ and __path__ will be relative (this
199# happens before the chdir). All the modules imported after the chdir, are
200# not found in the CWD, and since the other paths in sys.path[1:] are absolute
201# (site.py absolutize them), the __file__ and __path__ will be absolute too.
202# Therefore it is necessary to absolutize manually the __file__ and __path__ of
203# the packages to prevent later imports to fail when the CWD is different.
204for module in sys.modules.itervalues():
205 if hasattr(module, '__path__'):
206 module.__path__ = [os.path.abspath(path) for path in module.__path__]
207 if hasattr(module, '__file__'):
208 module.__file__ = os.path.abspath(module.__file__)
209
210
Guido van Rossumbb484652002-12-02 09:56:21 +0000211# MacOSX (a.k.a. Darwin) has a default stack size that is too small
212# for deeply recursive regular expressions. We see this as crashes in
213# the Python test suite when running test_re.py and test_sre.py. The
214# fix is to set the stack limit to 2048.
215# This approach may also be useful for other Unixy platforms that
216# suffer from small default stack limits.
217if sys.platform == 'darwin':
218 try:
219 import resource
220 except ImportError:
221 pass
222 else:
223 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
224 newsoft = min(hard, max(soft, 1024*2048))
225 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
226
Zachary Ware47343722015-07-16 00:24:48 -0500227# Windows, Tkinter, and resetting the environment after each test don't
228# mix well. To alleviate test failures due to Tcl/Tk not being able to
229# find its library, get the necessary environment massage done once early.
230if sys.platform == 'win32':
231 try:
232 import FixTk
233 except Exception:
234 pass
235
Georg Brandl4045e882009-10-29 20:53:00 +0000236# Test result constants.
237PASSED = 1
238FAILED = 0
239ENV_CHANGED = -1
240SKIPPED = -2
241RESOURCE_DENIED = -3
242INTERRUPTED = -4
Victor Stinnerc991eb22017-05-03 17:28:28 +0200243CHILD_ERROR = -5 # error in a child process
Georg Brandl4045e882009-10-29 20:53:00 +0000244
Victor Stinner453a6852017-05-09 17:06:34 +0200245# Minimum duration of a test to display its duration or to mention that
246# the test is running in background
247PROGRESS_MIN_TIME = 30.0 # seconds
248
249# Display the running tests if nothing happened last N seconds
250PROGRESS_UPDATE = 30.0 # seconds
251
Victor Stinnera30d5872018-06-04 22:25:54 +0200252from test import support
Fred Drake3a15dac2002-04-11 16:39:16 +0000253
Victor Stinner80ebc432017-07-21 02:12:14 +0200254ALL_RESOURCES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
255 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
256 'xpickle')
257
258# Other resources excluded from --use=all:
259#
260# - extralagefile (ex: test_zipfile64): really too slow to be enabled
261# "by default"
262RESOURCE_NAMES = ALL_RESOURCES + ('extralargefile',)
Fred Drake3a15dac2002-04-11 16:39:16 +0000263
Florent Xicluna12735662010-04-23 18:10:12 +0000264TEMPDIR = os.path.abspath(tempfile.gettempdir())
265
Fred Drake3a15dac2002-04-11 16:39:16 +0000266
Barry Warsaw08fca522001-08-20 22:33:46 +0000267def usage(code, msg=''):
268 print __doc__
269 if msg: print msg
270 sys.exit(code)
271
272
Victor Stinner453a6852017-05-09 17:06:34 +0200273def format_duration(seconds):
Victor Stinner5430c142018-06-26 23:57:12 +0200274 ms = int(math.ceil(seconds * 1e3))
275 seconds, ms = divmod(ms, 1000)
276 minutes, seconds = divmod(seconds, 60)
277 hours, minutes = divmod(minutes, 60)
Victor Stinner453a6852017-05-09 17:06:34 +0200278
Victor Stinner5430c142018-06-26 23:57:12 +0200279 parts = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200280 if hours:
Victor Stinner5430c142018-06-26 23:57:12 +0200281 parts.append('%s hour' % hours)
282 if minutes:
283 parts.append('%s min' % minutes)
284 if seconds:
285 parts.append('%s sec' % seconds)
286 if ms:
287 parts.append('%s ms' % ms)
288 if not parts:
289 return '0 ms'
290
291 parts = parts[:2]
292 return ' '.join(parts)
Victor Stinner453a6852017-05-09 17:06:34 +0200293
294
295_FORMAT_TEST_RESULT = {
296 PASSED: '%s passed',
297 FAILED: '%s failed',
298 ENV_CHANGED: '%s failed (env changed)',
299 SKIPPED: '%s skipped',
300 RESOURCE_DENIED: '%s skipped (resource denied)',
301 INTERRUPTED: '%s interrupted',
302 CHILD_ERROR: '%s crashed',
303}
304
305
306def format_test_result(test_name, result):
307 fmt = _FORMAT_TEST_RESULT.get(result, "%s")
308 return fmt % test_name
309
310
Victor Stinner02d42922017-08-21 18:01:11 +0200311def cpu_count():
312 # first try os.sysconf() to prevent loading the big multiprocessing module
313 try:
314 return os.sysconf('SC_NPROCESSORS_ONLN')
315 except (AttributeError, ValueError):
316 pass
317
318 # try multiprocessing.cpu_count()
319 try:
320 import multiprocessing
321 except ImportError:
322 pass
323 else:
324 return multiprocessing.cpu_count()
325
326 return None
327
328
Victor Stinner8767de22017-07-05 10:52:06 +0200329def unload_test_modules(save_modules):
330 # Unload the newly imported modules (best effort finalization)
331 for module in sys.modules.keys():
332 if module not in save_modules and module.startswith("test."):
Victor Stinnera30d5872018-06-04 22:25:54 +0200333 support.unload(module)
Victor Stinner8767de22017-07-05 10:52:06 +0200334
335
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000336def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000337 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000338 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000339 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000340 random_seed=None, use_mp=None, verbose3=False, forever=False,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300341 header=False, pgo=False, failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000342 """Execute a test suite.
343
Thomas Wouters7e474022000-07-16 12:04:32 +0000344 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000345 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000346
347 tests -- a list of strings containing test names (optional)
348 testdir -- the directory in which to look for tests (optional)
349
350 Users other than the Python test suite will certainly want to
351 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000352 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000353
354 If the tests argument is omitted, the tests listed on the
355 command-line will be used. If that's empty, too, then all *.py
356 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000357
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000358 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000359 single, randomize, findleaks, use_resources, trace, coverdir,
360 print_slow, and random_seed) allow programmers calling main()
361 directly to set the values that would normally be set by flags
362 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000363 """
Victor Stinner453a6852017-05-09 17:06:34 +0200364 regrtest_start_time = time.time()
Fred Drake004d5e62000-10-23 17:22:08 +0000365
Victor Stinnera30d5872018-06-04 22:25:54 +0200366 support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000367 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300368 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:PGm:',
Georg Brandl71a015a2009-10-27 20:52:02 +0000369 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Victor Stinner453a6852017-05-09 17:06:34 +0200370 'exclude', 'single', 'slow', 'slowest', 'randomize', 'fromfile=',
371 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000372 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
373 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300374 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo',
Victor Stinner24c2c202017-06-16 17:30:03 +0200375 'failfast', 'match=', 'testdir=', 'list-tests', 'list-cases',
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200376 'coverage', 'matchfile=', 'fail-env-changed'])
Guido van Rossum152494a1996-12-20 03:12:20 +0000377 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000378 usage(2, msg)
379
380 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000381 if random_seed is None:
382 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000383 if use_resources is None:
384 use_resources = []
Victor Stinnerd2aff602017-05-09 13:57:20 +0200385 slaveargs = None
Victor Stinner453a6852017-05-09 17:06:34 +0200386 list_tests = False
Victor Stinner24c2c202017-06-16 17:30:03 +0200387 list_cases_opt = False
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200388 fail_env_changed = False
Guido van Rossum152494a1996-12-20 03:12:20 +0000389 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000390 if o in ('-h', '--help'):
391 usage(0)
392 elif o in ('-v', '--verbose'):
393 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000394 elif o in ('-w', '--verbose2'):
395 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000396 elif o in ('-W', '--verbose3'):
397 verbose3 = True
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300398 elif o in ('-G', '--failfast'):
399 failfast = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000400 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000401 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000402 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000403 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000404 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000405 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000406 single = True
Victor Stinner453a6852017-05-09 17:06:34 +0200407 elif o in ('-S', '--slow', '--slowest'):
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000408 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000409 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000410 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000411 elif o == '--randseed':
412 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000413 elif o in ('-f', '--fromfile'):
414 fromfile = a
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300415 elif o in ('-m', '--match'):
Victor Stinner24c2c202017-06-16 17:30:03 +0200416 if match_tests is None:
417 match_tests = []
418 match_tests.append(a)
419 elif o == '--matchfile':
420 if match_tests is None:
421 match_tests = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200422 filename = os.path.join(support.SAVEDCWD, a)
Victor Stinner24c2c202017-06-16 17:30:03 +0200423 with open(filename) as fp:
424 for line in fp:
425 match_tests.append(line.strip())
Barry Warsaw08fca522001-08-20 22:33:46 +0000426 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000427 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000428 elif o in ('-L', '--runleaks'):
429 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000430 elif o in ('-t', '--threshold'):
431 import gc
432 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000433 elif o in ('-T', '--coverage'):
434 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000435 elif o in ('-D', '--coverdir'):
436 coverdir = os.path.join(os.getcwd(), a)
437 elif o in ('-N', '--nocoverdir'):
438 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000439 elif o in ('-R', '--huntrleaks'):
440 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000441 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000442 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000443 usage(2, '-R takes 2 or 3 colon-separated arguments')
444 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000445 huntrleaks[0] = 5
446 else:
447 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000448 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000449 huntrleaks[1] = 4
450 else:
451 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000452 if len(huntrleaks) == 2 or not huntrleaks[2]:
453 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000454 elif o in ('-M', '--memlimit'):
Victor Stinnera30d5872018-06-04 22:25:54 +0200455 support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000456 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000457 u = [x.lower() for x in a.split(',')]
458 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000459 if r == 'all':
Victor Stinner80ebc432017-07-21 02:12:14 +0200460 use_resources[:] = ALL_RESOURCES
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000461 continue
462 remove = False
463 if r[0] == '-':
464 remove = True
465 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000466 if r not in RESOURCE_NAMES:
467 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000468 if remove:
469 if r in use_resources:
470 use_resources.remove(r)
471 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000472 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000473 elif o in ('-F', '--forever'):
474 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000475 elif o in ('-j', '--multiprocess'):
476 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000477 elif o == '--header':
478 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000479 elif o == '--slaveargs':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200480 slaveargs = a
Brett Cannon95374782015-10-02 16:21:34 -0700481 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700482 pgo = True
Victor Stinner453a6852017-05-09 17:06:34 +0200483 elif o == '--testdir':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200484 testdir = a
Victor Stinner453a6852017-05-09 17:06:34 +0200485 elif o == '--list-tests':
486 list_tests = True
Victor Stinner24c2c202017-06-16 17:30:03 +0200487 elif o == '--list-cases':
488 list_cases_opt = True
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200489 elif o == '--fail-env-changed':
490 fail_env_changed = True
R. David Murrayda826892009-11-15 00:04:32 +0000491 else:
492 print >>sys.stderr, ("No handler for option {}. Please "
493 "report this as a bug at http://bugs.python.org.").format(o)
494 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000495 if single and fromfile:
496 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000497 if use_mp and trace:
498 usage(2, "-T and -j don't go together!")
499 if use_mp and findleaks:
500 usage(2, "-l and -j don't go together!")
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300501 if failfast and not (verbose or verbose3):
502 usage("-G/--failfast needs either -v or -W")
Barry Warsaw08fca522001-08-20 22:33:46 +0000503
Victor Stinnerd2aff602017-05-09 13:57:20 +0200504 if testdir:
505 testdir = os.path.abspath(testdir)
506
507 # Prepend test directory to sys.path, so runtest() will be able
508 # to locate tests
509 sys.path.insert(0, testdir)
510
Victor Stinner30509872017-07-05 09:16:47 +0200511 # Make sure that '' and Lib/test/ are not in sys.path
512 regrtest_dir = os.path.abspath(os.path.dirname(__file__))
513 for path in ('', regrtest_dir):
514 try:
515 sys.path.remove(path)
516 except ValueError:
517 pass
518
Victor Stinner5430c142018-06-26 23:57:12 +0200519 if huntrleaks:
520 warmup, repetitions, _ = huntrleaks
521 if warmup < 1 or repetitions < 1:
522 msg = ("Invalid values for the --huntrleaks/-R parameters. The "
523 "number of warmups and repetitions must be at least 1 "
524 "each (1:1).")
525 print >>sys.stderr, msg
526 sys.exit(2)
527
Victor Stinnerd2aff602017-05-09 13:57:20 +0200528 if slaveargs is not None:
529 args, kwargs = json.loads(slaveargs)
Victor Stinner8bb08632017-06-16 12:14:09 +0200530 if kwargs['huntrleaks']:
531 warm_caches()
Victor Stinnerd2aff602017-05-09 13:57:20 +0200532 if testdir:
533 kwargs['testdir'] = testdir
534 try:
535 result = runtest(*args, **kwargs)
536 except BaseException, e:
537 result = INTERRUPTED, e.__class__.__name__
538 print # Force a newline (just in case)
539 print json.dumps(result)
540 sys.exit(0)
541
Victor Stinner8bb08632017-06-16 12:14:09 +0200542 if huntrleaks:
543 warm_caches()
544
Guido van Rossum152494a1996-12-20 03:12:20 +0000545 good = []
546 bad = []
547 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000548 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000549 environment_changed = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200550 rerun = []
Victor Stinnerb4f8bc52018-06-09 18:59:19 +0200551 first_result = None
Florent Xicluna75c66762010-03-30 16:31:14 +0000552 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000553
Neil Schemenauerd569f232000-09-22 15:29:28 +0000554 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000555 try:
556 import gc
557 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000558 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000559 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000560 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000561 # Uncomment the line below to report garbage that is not
562 # freeable by reference counting alone. By default only
563 # garbage that is not collectable by the GC is reported.
564 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000565 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000566
Barry Warsawe11e3de1999-01-28 19:51:51 +0000567 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000568 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000569 try:
570 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000571 next_test = fp.read().strip()
572 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000573 fp.close()
574 except IOError:
575 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000576
577 if fromfile:
578 tests = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200579 fp = open(os.path.join(support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000580 for line in fp:
581 guts = line.split() # assuming no test has whitespace in its name
582 if guts and not guts[0].startswith('#'):
583 tests.extend(guts)
584 fp.close()
585
586 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000587 removepy(args)
588 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000589
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000590 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000591 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000592 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000593 for arg in args:
594 if arg in stdtests:
595 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000596 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000597 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000598
Victor Stinner02b4d672018-06-06 23:33:31 +0200599 if huntrleaks:
600 # FIXME: bpo-31731: test_io hangs with --huntrleaks
601 print("Warning: bpo-31731: test_io hangs with --huntrleaks: "
602 "exclude the test")
603 nottests.add('test_io')
604
Victor Stinner0fbac702017-08-21 23:57:06 +0200605 display_header = (verbose or header or not (quiet or single or tests or args)) and (not pgo)
R. David Murray98e3df32009-12-16 11:49:46 +0000606 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000607 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000608 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000609 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000610 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000611 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000612 except IndexError:
613 next_single_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200614
615 if list_tests:
616 for name in selected:
617 print(name)
618 sys.exit(0)
619
Victor Stinner24c2c202017-06-16 17:30:03 +0200620 if list_cases_opt:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200621 list_cases(testdir, selected, match_tests)
Victor Stinner24c2c202017-06-16 17:30:03 +0200622 sys.exit(0)
623
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000624 if trace:
625 import trace
Victor Stinnera5bb6242017-05-11 11:30:23 +0200626 tracer = trace.Trace(trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000627
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000628 test_times = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200629 support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800630 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000631
632 def accumulate_result(test, result):
633 ok, test_time = result
Victor Stinnerc991eb22017-05-03 17:28:28 +0200634 if ok not in (CHILD_ERROR, INTERRUPTED):
635 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000636 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000637 good.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200638 elif ok in (FAILED, CHILD_ERROR):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000639 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000640 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000641 environment_changed.append(test)
642 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000643 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000644 elif ok == RESOURCE_DENIED:
645 skipped.append(test)
646 resource_denieds.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200647 elif ok != INTERRUPTED:
648 raise ValueError("invalid test result: %r" % ok)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000649
R. David Murray7f7eea62009-11-14 15:18:22 +0000650 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000651 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000652 while True:
653 for test in tests:
654 yield test
655 if bad:
656 return
Victor Stinnerd7955b82017-07-03 15:07:53 +0200657 if fail_env_changed and environment_changed:
658 return
R. David Murray7f7eea62009-11-14 15:18:22 +0000659 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200660 test_count = ''
661 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000662 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000663 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200664 test_count = '/{}'.format(len(selected))
665 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000666
Victor Stinner453a6852017-05-09 17:06:34 +0200667 def display_progress(test_index, test):
668 # "[ 51/405/1] test_tcl"
Victor Stinner02d42922017-08-21 18:01:11 +0200669 line = "{1:{0}}{2}".format(test_count_width, test_index, test_count)
Victor Stinnera30d5872018-06-04 22:25:54 +0200670 fails = len(bad) + len(environment_changed)
671 if fails and not pgo:
672 line = '{}/{}'.format(line, fails)
Victor Stinner02d42922017-08-21 18:01:11 +0200673 line = '[{}]'.format(line)
674
675 # add the system load prefix: "load avg: 1.80 "
676 if hasattr(os, 'getloadavg'):
677 load_avg_1min = os.getloadavg()[0]
678 line = "load avg: {:.2f} {}".format(load_avg_1min, line)
Victor Stinner453a6852017-05-09 17:06:34 +0200679
680 # add the timestamp prefix: "0:01:05 "
681 test_time = time.time() - regrtest_start_time
682 test_time = datetime.timedelta(seconds=int(test_time))
683 line = "%s %s" % (test_time, line)
684
Victor Stinner02d42922017-08-21 18:01:11 +0200685 # add the test name
686 line = "{} {}".format(line, test)
687
Victor Stinner453a6852017-05-09 17:06:34 +0200688 print(line)
689 sys.stdout.flush()
690
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200691 # For a partial run, we do not need to clutter the output.
Victor Stinner0fbac702017-08-21 23:57:06 +0200692 if display_header:
693 # Print basic platform information
694 print "==", platform.python_implementation(), \
695 " ".join(sys.version.split())
696 print "== ", platform.platform(aliased=True), \
697 "%s-endian" % sys.byteorder
698 print "== ", os.getcwd()
699 ncpu = cpu_count()
700 if ncpu:
701 print "== CPU count:", ncpu
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200702
Victor Stinner5430c142018-06-26 23:57:12 +0200703 if huntrleaks:
704 warmup, repetitions, _ = huntrleaks
705 if warmup < 3:
706 print("WARNING: Running tests with --huntrleaks/-R and less than "
707 "3 warmup repetitions can give false positives!")
708
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200709 if randomize:
710 random.seed(random_seed)
711 print "Using random seed", random_seed
712 random.shuffle(selected)
713
Antoine Pitrou4698d992009-05-31 14:20:14 +0000714 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000715 try:
716 from threading import Thread
717 except ImportError:
718 print "Multiprocess option requires thread support"
719 sys.exit(2)
Victor Stinner453a6852017-05-09 17:06:34 +0200720 from Queue import Queue, Empty
Georg Brandla4f46e12010-02-07 17:03:15 +0000721 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000722 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000723 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000724 def tests_and_args():
725 for test in tests:
726 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000727 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700728 dict(huntrleaks=huntrleaks, use_resources=use_resources,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300729 failfast=failfast,
730 match_tests=match_tests,
Brett Cannoneb2cb972015-10-16 12:30:20 -0700731 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000732 )
733 yield (test, args_tuple)
734 pending = tests_and_args()
Victor Stinnera30d5872018-06-04 22:25:54 +0200735 opt_args = support.args_from_interpreter_flags()
Antoine Pitroua226c912010-10-14 11:15:50 +0000736 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700737 # required to spawn a new process with PGO flag on/off
738 if pgo:
739 base_cmd = base_cmd + ['--pgo']
Victor Stinner453a6852017-05-09 17:06:34 +0200740
741 class MultiprocessThread(Thread):
742 current_test = None
743 start_time = None
744
745 def runtest(self):
746 try:
747 test, args_tuple = next(pending)
748 except StopIteration:
749 output.put((None, None, None, None))
750 return True
751
752 # -E is needed by some tests, e.g. test_import
753 args = base_cmd + ['--slaveargs', json.dumps(args_tuple)]
754 if testdir:
755 args.extend(('--testdir', testdir))
756 try:
757 self.start_time = time.time()
758 self.current_test = test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200759 popen = Popen(args,
760 stdout=PIPE, stderr=PIPE,
761 universal_newlines=True,
762 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000763 stdout, stderr = popen.communicate()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200764 retcode = popen.wait()
Victor Stinner453a6852017-05-09 17:06:34 +0200765 finally:
766 self.current_test = None
Victor Stinnerc991eb22017-05-03 17:28:28 +0200767
Victor Stinner453a6852017-05-09 17:06:34 +0200768 # Strip last refcount output line if it exists, since it
769 # comes from the shutdown of the interpreter in the subcommand.
770 stderr = debug_output_pat.sub("", stderr)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200771
Victor Stinner453a6852017-05-09 17:06:34 +0200772 if retcode == 0:
773 stdout, _, result = stdout.strip().rpartition("\n")
774 if not result:
775 output.put((None, None, None, None))
776 return True
Victor Stinnerc991eb22017-05-03 17:28:28 +0200777
Victor Stinner453a6852017-05-09 17:06:34 +0200778 result = json.loads(result)
779 else:
780 result = (CHILD_ERROR, "Exit code %s" % retcode)
Victor Stinner228da422017-05-05 10:28:35 +0200781
Victor Stinner453a6852017-05-09 17:06:34 +0200782 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
783 return False
Victor Stinnerc991eb22017-05-03 17:28:28 +0200784
Victor Stinner453a6852017-05-09 17:06:34 +0200785 def run(self):
786 try:
787 stop = False
788 while not stop:
789 stop = self.runtest()
790 except BaseException:
791 output.put((None, None, None, None))
792 raise
793
794 workers = [MultiprocessThread() for i in range(use_mp)]
795 print("Run tests in parallel using %s child processes"
796 % len(workers))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000797 for worker in workers:
798 worker.start()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200799
Victor Stinner453a6852017-05-09 17:06:34 +0200800 def get_running(workers):
801 running = []
802 for worker in workers:
803 current_test = worker.current_test
804 if not current_test:
805 continue
806 dt = time.time() - worker.start_time
807 if dt >= PROGRESS_MIN_TIME:
Victor Stinnera30d5872018-06-04 22:25:54 +0200808 running.append('%s (%s)' % (current_test, format_duration(dt)))
Victor Stinner453a6852017-05-09 17:06:34 +0200809 return running
810
Antoine Pitrou4698d992009-05-31 14:20:14 +0000811 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200812 test_index = 1
Victor Stinner453a6852017-05-09 17:06:34 +0200813 get_timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME)
R. David Murray7f7eea62009-11-14 15:18:22 +0000814 try:
815 while finished < use_mp:
Victor Stinner453a6852017-05-09 17:06:34 +0200816 try:
817 item = output.get(timeout=get_timeout)
818 except Empty:
819 running = get_running(workers)
820 if running and not pgo:
821 print('running: %s' % ', '.join(running))
Victor Stinner1da37ad2018-05-28 13:30:42 +0200822 sys.stdout.flush()
Victor Stinner453a6852017-05-09 17:06:34 +0200823 continue
824
825 test, stdout, stderr, result = item
R. David Murray7f7eea62009-11-14 15:18:22 +0000826 if test is None:
827 finished += 1
828 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000829 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200830 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200831 ok, test_time = result
832 text = format_test_result(test, ok)
833 if (ok not in (CHILD_ERROR, INTERRUPTED)
834 and test_time >= PROGRESS_MIN_TIME
835 and not pgo):
Victor Stinner5430c142018-06-26 23:57:12 +0200836 text += ' (%s)' % format_duration(test_time)
Victor Stinner453a6852017-05-09 17:06:34 +0200837 running = get_running(workers)
838 if running and not pgo:
839 text += ' -- running: %s' % ', '.join(running)
840 display_progress(test_index, text)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200841
842 if stdout:
Victor Stinner1da37ad2018-05-28 13:30:42 +0200843 print(stdout)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200844 sys.stdout.flush()
845 if stderr and not pgo:
846 print >>sys.stderr, stderr
847 sys.stderr.flush()
848
849 if result[0] == INTERRUPTED:
850 assert result[1] == 'KeyboardInterrupt'
851 raise KeyboardInterrupt # What else?
852
Victor Stinner32b1ff92014-09-05 12:12:11 +0200853 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000854 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000855 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000856 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000857 for worker in workers:
858 worker.join()
859 else:
Victor Stinner453a6852017-05-09 17:06:34 +0200860 print("Run tests sequentially")
861
862 previous_test = None
Brett Cannon65918e02015-10-02 16:22:32 -0700863 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000864 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200865 text = test
866 if previous_test:
867 text = '%s -- %s' % (text, previous_test)
868 display_progress(test_index, text)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200869
870 def local_runtest():
871 result = runtest(test, verbose, quiet, huntrleaks, None, pgo,
872 failfast=failfast,
873 match_tests=match_tests,
874 testdir=testdir)
875 accumulate_result(test, result)
876 return result
877
878 start_time = time.time()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000879 if trace:
880 # If we're tracing code coverage, then we don't exit with status
881 # if on a false return value from main.
Victor Stinnera5bb6242017-05-11 11:30:23 +0200882 ns = dict(locals())
883 tracer.runctx('result = local_runtest()',
884 globals=globals(), locals=ns)
885 result = ns['result']
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000886 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000887 try:
Victor Stinnera5bb6242017-05-11 11:30:23 +0200888 result = local_runtest()
Georg Brandl4045e882009-10-29 20:53:00 +0000889 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700890 if not pgo:
891 print "Re-running test %r in verbose mode" % test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200892 runtest(test, True, quiet, huntrleaks, None, pgo,
893 testdir=testdir)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000894 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000895 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000896 break
897 except:
898 raise
Victor Stinner453a6852017-05-09 17:06:34 +0200899
Victor Stinnera5bb6242017-05-11 11:30:23 +0200900 test_time = time.time() - start_time
901 previous_test = format_test_result(test, result[0])
902 if test_time >= PROGRESS_MIN_TIME:
903 previous_test = "%s in %s" % (previous_test,
904 format_duration(test_time))
905 elif result[0] == PASSED:
906 # be quiet: say nothing if the test passed shortly
907 previous_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200908
Antoine Pitrou4698d992009-05-31 14:20:14 +0000909 if findleaks:
910 gc.collect()
911 if gc.garbage:
912 print "Warning: test created", len(gc.garbage),
913 print "uncollectable object(s)."
914 # move the uncollectable objects somewhere so we don't see
915 # them again
916 found_garbage.extend(gc.garbage)
917 del gc.garbage[:]
Victor Stinner8767de22017-07-05 10:52:06 +0200918
919 unload_test_modules(save_modules)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000920
Victor Stinnera30d5872018-06-04 22:25:54 +0200921
922 def get_tests_result():
923 result = []
924 if bad:
925 result.append("FAILURE")
926 elif fail_env_changed and environment_changed:
927 result.append("ENV CHANGED")
928
929 if interrupted:
930 result.append("INTERRUPTED")
931
932 if not result:
933 result.append("SUCCESS")
934
Victor Stinnerb4f8bc52018-06-09 18:59:19 +0200935 result = ', '.join(result)
936 if first_result:
937 result = '%s then %s' % (first_result, result)
938 return result
Victor Stinnera30d5872018-06-04 22:25:54 +0200939
940
941 def display_result():
Florent Xicluna75c66762010-03-30 16:31:14 +0000942 # print a newline after ^C
943 print
Victor Stinnera30d5872018-06-04 22:25:54 +0200944 print("== Tests result: %s ==" % get_tests_result())
Barry Warsawe11e3de1999-01-28 19:51:51 +0000945
Victor Stinnera30d5872018-06-04 22:25:54 +0200946 if interrupted and not pgo:
947 print
948 print "Test suite interrupted by signal SIGINT."
949 omitted = set(selected) - set(good) - set(bad) - set(skipped)
950 print count(len(omitted), "test"), "omitted:"
951 printlist(omitted)
952
953 if good and not quiet and not pgo:
954 print
955 if not bad and not skipped and not interrupted and len(good) > 1:
956 print "All",
957 print count(len(good), "test"), "OK."
958
959 if print_slow:
960 test_times.sort(reverse=True)
961 print
962 print "10 slowest tests:"
963 for test_time, test in test_times[:10]:
964 print("- %s: %.1fs" % (test, test_time))
965
966 if bad and not pgo:
967 print
968 print count(len(bad), "test"), "failed:"
969 printlist(bad)
970
971 if environment_changed and not pgo:
972 print
973 print "{} altered the execution environment:".format(
974 count(len(environment_changed), "test"))
975 printlist(environment_changed)
976
977 if skipped and not quiet and not pgo:
978 print
979 print count(len(skipped), "test"), "skipped:"
980 printlist(skipped)
981
982 e = _ExpectedSkips()
983 plat = sys.platform
984 if e.isvalid():
985 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
986 if surprise:
987 print count(len(surprise), "skip"), \
988 "unexpected on", plat + ":"
989 printlist(surprise)
990 else:
991 print "Those skips are all expected on", plat + "."
Tim Petersb5b7b782001-08-12 01:20:39 +0000992 else:
Victor Stinnera30d5872018-06-04 22:25:54 +0200993 print "Ask someone to teach regrtest.py about which tests are"
994 print "expected to get skipped on", plat + "."
995
996 if rerun:
997 print
998 print("%s:" % count(len(rerun), "re-run test"))
999 printlist(rerun)
1000
1001
1002 display_result()
Tim Petersb5b7b782001-08-12 01:20:39 +00001003
Martin v. Löwis04824ce2006-03-10 21:26:16 +00001004 if verbose2 and bad:
Victor Stinnerb4f8bc52018-06-09 18:59:19 +02001005 first_result = get_tests_result()
1006
Victor Stinnera30d5872018-06-04 22:25:54 +02001007 print
Martin v. Löwis04824ce2006-03-10 21:26:16 +00001008 print "Re-running failed tests in verbose mode"
Victor Stinnera30d5872018-06-04 22:25:54 +02001009 rerun = bad[:]
1010 for test in rerun:
Tim Peters922dd7d2006-03-10 23:37:10 +00001011 print "Re-running test %r in verbose mode" % test
1012 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +00001013 try:
Victor Stinnera30d5872018-06-04 22:25:54 +02001014 support.verbose = True
Victor Stinnerd2aff602017-05-09 13:57:20 +02001015 ok = runtest(test, True, quiet, huntrleaks, None, pgo,
Victor Stinnera30d5872018-06-04 22:25:54 +02001016 match_tests=match_tests, testdir=testdir)
Martin v. Löwis04824ce2006-03-10 21:26:16 +00001017 except KeyboardInterrupt:
1018 # print a newline separate from the ^C
1019 print
1020 break
Zachary Warea4777f12015-08-04 21:53:21 -05001021 else:
1022 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
1023 bad.remove(test)
1024 else:
1025 if bad:
1026 print count(len(bad), "test"), "failed again:"
1027 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +00001028
Victor Stinnera30d5872018-06-04 22:25:54 +02001029 display_result()
1030
Barry Warsawe11e3de1999-01-28 19:51:51 +00001031 if single:
R. David Murray98e3df32009-12-16 11:49:46 +00001032 if next_single_test:
1033 with open(filename, 'w') as fp:
1034 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +00001035 else:
1036 os.unlink(filename)
1037
Barry Warsaw3b6d0252004-02-07 22:43:03 +00001038 if trace:
1039 r = tracer.results()
1040 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
1041
Skip Montanaro0179a182004-06-06 15:53:18 +00001042 if runleaks:
1043 os.system("leaks %d" % os.getpid())
1044
Victor Stinner453a6852017-05-09 17:06:34 +02001045 print
1046 duration = time.time() - regrtest_start_time
1047 print("Total duration: %s" % format_duration(duration))
1048
Victor Stinnera30d5872018-06-04 22:25:54 +02001049 print("Tests result: %s" % get_tests_result())
Victor Stinner453a6852017-05-09 17:06:34 +02001050
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001051 if bad:
1052 sys.exit(2)
1053 if interrupted:
1054 sys.exit(130)
1055 if fail_env_changed and environment_changed:
1056 sys.exit(3)
1057 sys.exit(0)
Barry Warsaw08fca522001-08-20 22:33:46 +00001058
Guido van Rossum152494a1996-12-20 03:12:20 +00001059
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001060STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +00001061 'test_grammar',
1062 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +00001063 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +00001064 'test_builtin',
1065 'test_exceptions',
1066 'test_types',
Collin Winter55453142007-03-08 19:58:14 +00001067 'test_unittest',
1068 'test_doctest',
1069 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +00001070]
Guido van Rossum152494a1996-12-20 03:12:20 +00001071
Florent Xicluna12d750d2010-03-06 14:38:09 +00001072NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +00001073 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +00001074 'test_future1',
1075 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +00001076}
Guido van Rossum152494a1996-12-20 03:12:20 +00001077
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001078def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +00001079 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +00001080 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +00001081 names = os.listdir(testdir)
1082 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +00001083 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +00001084 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +00001085 modname, ext = os.path.splitext(name)
1086 if modname[:5] == "test_" and ext == ".py" and modname not in others:
1087 tests.append(modname)
1088 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +00001089
Antoine Pitrou4698d992009-05-31 14:20:14 +00001090def runtest(test, verbose, quiet,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001091 huntrleaks=False, use_resources=None, pgo=False,
Victor Stinnerd2aff602017-05-09 13:57:20 +02001092 failfast=False, match_tests=None, testdir=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001093 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +00001094
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001095 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001096 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +00001097 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +00001098 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +00001099 huntrleaks -- run multiple times to test for leaks; requires a debug
1100 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -07001101 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -07001102 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -07001103
Georg Brandl4045e882009-10-29 20:53:00 +00001104 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +02001105 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +00001106 INTERRUPTED KeyboardInterrupt when run under -j
1107 RESOURCE_DENIED test skipped because resource denied
1108 SKIPPED test skipped for some other reason
1109 ENV_CHANGED test failed because it changed the execution environment
1110 FAILED test failed
1111 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001112 """
Tim Peters06c5c002006-06-05 00:55:26 +00001113
Victor Stinnera30d5872018-06-04 22:25:54 +02001114 support.verbose = verbose # Tell tests to be moderately quiet
Antoine Pitrou4698d992009-05-31 14:20:14 +00001115 if use_resources is not None:
Victor Stinnera30d5872018-06-04 22:25:54 +02001116 support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +00001117 try:
Victor Stinnera30d5872018-06-04 22:25:54 +02001118 support.set_match_tests(match_tests)
1119 # reset the environment_altered flag to detect if a test altered
1120 # the environment
1121 support.environment_altered = False
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001122 if failfast:
Victor Stinnera30d5872018-06-04 22:25:54 +02001123 support.failfast = True
1124
Victor Stinnerd2aff602017-05-09 13:57:20 +02001125 return runtest_inner(test, verbose, quiet, huntrleaks, pgo, testdir)
Tim Peterse5584862006-06-09 19:24:44 +00001126 finally:
1127 cleanup_test_droppings(test, verbose)
1128
R. David Murray14dcd432009-10-14 13:58:07 +00001129
1130# Unit tests are supposed to leave the execution environment unchanged
1131# once they complete. But sometimes tests have bugs, especially when
1132# tests fail, and the changes to environment go on to mess up other
1133# tests. This can cause issues with buildbot stability, since tests
1134# are run in random order and so problems may appear to come and go.
1135# There are a few things we can save and restore to mitigate this, and
1136# the following context manager handles this task.
1137
1138class saved_test_environment:
1139 """Save bits of the test environment and restore them at block exit.
1140
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001141 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +00001142 #stuff
1143
1144 Unless quiet is True, a warning is printed to stderr if any of
1145 the saved items was changed by the test. The attribute 'changed'
1146 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001147
1148 If verbose is more than 1, the before and after state of changed
1149 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +00001150 """
1151
1152 changed = False
1153
Brett Cannon95374782015-10-02 16:21:34 -07001154 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +00001155 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001156 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +00001157 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -07001158 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +00001159
1160 # To add things to save and restore, add a name XXX to the resources list
1161 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
1162 # return the value to be saved and compared against a second call to the
1163 # get function when test execution completes. restore_XXX should accept
1164 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001165 # and only if a change in the value is detected.
1166 #
1167 # Note: XXX will have any '.' replaced with '_' characters when determining
1168 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +00001169
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001170 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001171 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001172 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001173 )
R. David Murray14dcd432009-10-14 13:58:07 +00001174
1175 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001176 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001177 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +00001178 sys.argv = saved_argv[1]
1179 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001180
1181 def get_cwd(self):
1182 return os.getcwd()
1183 def restore_cwd(self, saved_cwd):
1184 os.chdir(saved_cwd)
1185
1186 def get_sys_stdout(self):
1187 return sys.stdout
1188 def restore_sys_stdout(self, saved_stdout):
1189 sys.stdout = saved_stdout
1190
1191 def get_sys_stderr(self):
1192 return sys.stderr
1193 def restore_sys_stderr(self, saved_stderr):
1194 sys.stderr = saved_stderr
1195
1196 def get_sys_stdin(self):
1197 return sys.stdin
1198 def restore_sys_stdin(self, saved_stdin):
1199 sys.stdin = saved_stdin
1200
1201 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001202 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +00001203 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +00001204 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +00001205 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +00001206 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +00001207
1208 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001209 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001210 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +00001211 sys.path = saved_path[1]
1212 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001213
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001214 def get_asyncore_socket_map(self):
1215 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001216 # XXX Making a copy keeps objects alive until __exit__ gets called.
1217 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001218 def restore_asyncore_socket_map(self, saved_map):
1219 asyncore = sys.modules.get('asyncore')
1220 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001221 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001222 asyncore.socket_map.update(saved_map)
1223
Victor Stinnera30d5872018-06-04 22:25:54 +02001224 def get_support_TESTFN(self):
1225 if os.path.isfile(support.TESTFN):
Vinay Sajipda563bf2012-03-06 20:07:15 +00001226 result = 'f'
Victor Stinnera30d5872018-06-04 22:25:54 +02001227 elif os.path.isdir(support.TESTFN):
Vinay Sajipda563bf2012-03-06 20:07:15 +00001228 result = 'd'
1229 else:
1230 result = None
1231 return result
Victor Stinnera30d5872018-06-04 22:25:54 +02001232 def restore_support_TESTFN(self, saved_value):
Vinay Sajipda563bf2012-03-06 20:07:15 +00001233 if saved_value is None:
Victor Stinnera30d5872018-06-04 22:25:54 +02001234 if os.path.isfile(support.TESTFN):
1235 os.unlink(support.TESTFN)
1236 elif os.path.isdir(support.TESTFN):
1237 shutil.rmtree(support.TESTFN)
Vinay Sajipda563bf2012-03-06 20:07:15 +00001238
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001239 def get_files(self):
1240 return sorted(fn + ('/' if os.path.isdir(fn) else '')
1241 for fn in os.listdir(os.curdir))
1242 def restore_files(self, saved_value):
Victor Stinnera30d5872018-06-04 22:25:54 +02001243 fn = support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001244 if fn not in saved_value and (fn + '/') not in saved_value:
1245 if os.path.isfile(fn):
Victor Stinnera30d5872018-06-04 22:25:54 +02001246 support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001247 elif os.path.isdir(fn):
Victor Stinnera30d5872018-06-04 22:25:54 +02001248 support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001249
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001250 def resource_info(self):
1251 for name in self.resources:
1252 method_suffix = name.replace('.', '_')
1253 get_name = 'get_' + method_suffix
1254 restore_name = 'restore_' + method_suffix
1255 yield name, getattr(self, get_name), getattr(self, restore_name)
1256
R. David Murray14dcd432009-10-14 13:58:07 +00001257 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001258 self.saved_values = dict((name, get()) for name, get, restore
1259 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +00001260 return self
1261
1262 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001263 saved_values = self.saved_values
1264 del self.saved_values
Victor Stinnera30d5872018-06-04 22:25:54 +02001265
1266 # Read support.environment_altered, set by support helper functions
1267 self.changed |= support.environment_altered
1268
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001269 for name, get, restore in self.resource_info():
1270 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001271 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001272 # Check for changes to the resource's value
1273 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +00001274 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001275 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -07001276 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001277 print >>sys.stderr, (
1278 "Warning -- {} was modified by {}".format(
1279 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +02001280 print >>sys.stderr, (
1281 " Before: {}\n After: {} ".format(
1282 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001283 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
1284 # matters at least as much as value. For others (e.g. cwd),
1285 # identity is irrelevant. Should we add a mechanism to check
1286 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +00001287 return False
1288
1289
Victor Stinner1247e2c2017-08-10 16:45:38 +02001290def post_test_cleanup():
Victor Stinnera30d5872018-06-04 22:25:54 +02001291 support.reap_children()
Victor Stinner1247e2c2017-08-10 16:45:38 +02001292
Victor Stinnerd2aff602017-05-09 13:57:20 +02001293def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None):
Victor Stinnera30d5872018-06-04 22:25:54 +02001294 support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +00001295 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001296 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001297 else:
Michael Foord91a2c892010-04-08 00:04:24 +00001298 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +00001299
Antoine Pitrou4698d992009-05-31 14:20:14 +00001300 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +00001301 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +00001302 try:
Tim Peters342ca752001-09-25 19:13:20 +00001303 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +00001304 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001305 if capture_stdout:
1306 sys.stdout = capture_stdout
Victor Stinner24c2c202017-06-16 17:30:03 +02001307 abstest = get_abs_module(testdir, test)
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001308 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -07001309 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +00001310 start_time = time.time()
1311 the_package = __import__(abstest, globals(), locals(), [])
Victor Stinnerd2aff602017-05-09 13:57:20 +02001312 if abstest.startswith('test.'):
1313 the_module = getattr(the_package, test)
1314 else:
1315 the_module = the_package
R. David Murray14dcd432009-10-14 13:58:07 +00001316 # Old tests run to completion simply as a side-effect of
1317 # being imported. For tests based on unittest or doctest,
1318 # explicitly invoke their test_main() function (if it exists).
1319 indirect_test = getattr(the_module, "test_main", None)
R. David Murray14dcd432009-10-14 13:58:07 +00001320 if huntrleaks:
1321 refleak = dash_R(the_module, test, indirect_test,
1322 huntrleaks)
Victor Stinner5430c142018-06-26 23:57:12 +02001323 else:
1324 if indirect_test is not None:
1325 indirect_test()
R. David Murray14dcd432009-10-14 13:58:07 +00001326 test_time = time.time() - start_time
Victor Stinner1247e2c2017-08-10 16:45:38 +02001327 post_test_cleanup()
Guido van Rossum41360a41998-03-26 19:42:58 +00001328 finally:
Tim Peters342ca752001-09-25 19:13:20 +00001329 sys.stdout = save_stdout
Victor Stinnera30d5872018-06-04 22:25:54 +02001330 except support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001331 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +00001332 print test, "skipped --", msg
1333 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001334 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +00001335 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001336 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +00001337 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001338 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001339 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +00001340 except KeyboardInterrupt:
1341 raise
Victor Stinnera30d5872018-06-04 22:25:54 +02001342 except support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001343 if not pgo:
1344 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +00001345 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001346 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001347 except:
Guido van Rossum41360a41998-03-26 19:42:58 +00001348 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -07001349 if not pgo:
1350 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +00001351 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -07001352 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +00001353 traceback.print_exc(file=sys.stderr)
1354 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001355 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001356 else:
Collin Winter0f489742009-05-14 23:26:30 +00001357 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +00001358 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +00001359 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +00001360 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001361 # Except in verbose mode, tests should not print anything
1362 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001363 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001364 output = capture_stdout.getvalue()
1365 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001366 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001367 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001368 print "*" * 70
1369 print output
1370 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001371 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001372 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001373
Tim Peterse5584862006-06-09 19:24:44 +00001374def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001375 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001376 import gc
1377
1378 # First kill any dangling references to open files etc.
1379 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001380
1381 # Try to clean up junk commonly left behind. While tests shouldn't leave
1382 # any files or directories behind, when a test fails that can be tedious
1383 # for it to arrange. The consequences can be especially nasty on Windows,
1384 # since if a test leaves a file open, it cannot be deleted by name (while
1385 # there's nothing we can do about that here either, we can display the
1386 # name of the offending test, which is a real help).
Victor Stinnera30d5872018-06-04 22:25:54 +02001387 for name in (support.TESTFN,
Tim Peterse5584862006-06-09 19:24:44 +00001388 "db_home",
1389 ):
1390 if not os.path.exists(name):
1391 continue
1392
1393 if os.path.isdir(name):
1394 kind, nuker = "directory", shutil.rmtree
1395 elif os.path.isfile(name):
1396 kind, nuker = "file", os.unlink
1397 else:
1398 raise SystemError("os.path says %r exists but is neither "
1399 "directory nor file" % name)
1400
1401 if verbose:
1402 print "%r left behind %s %r" % (testname, kind, name)
1403 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001404 # if we have chmod, fix possible permissions problems
1405 # that might prevent cleanup
1406 if (hasattr(os, 'chmod')):
1407 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001408 nuker(name)
1409 except Exception, msg:
1410 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1411 "removed: %s" % (testname, kind, name, msg))
1412
Tim Peters06c5c002006-06-05 00:55:26 +00001413def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001414 """Run a test multiple times, looking for reference leaks.
1415
1416 Returns:
1417 False if the test didn't leak references; True if we detected refleaks.
1418 """
Tim Peters06c5c002006-06-05 00:55:26 +00001419 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001420 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001421
1422 if not hasattr(sys, 'gettotalrefcount'):
1423 raise Exception("Tracking reference leaks requires a debug build "
1424 "of Python")
1425
1426 # Save current values for dash_R_cleanup() to restore.
1427 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001428 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001429 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001430 try:
1431 import zipimport
1432 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001433 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001434 else:
1435 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001436 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001437 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001438 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1439 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1440 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001441 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001442 for obj in abc.__subclasses__() + [abc]:
1443 abcs[obj] = obj._abc_registry.copy()
1444
Tim Peters06c5c002006-06-05 00:55:26 +00001445 if indirect_test:
1446 def run_the_test():
1447 indirect_test()
1448 else:
1449 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001450 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001451
1452 deltas = []
1453 nwarmup, ntracked, fname = huntrleaks
Victor Stinnera30d5872018-06-04 22:25:54 +02001454 fname = os.path.join(support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001455 repcount = nwarmup + ntracked
Victor Stinner64856ad2018-06-05 12:36:31 +02001456 rc_deltas = [0] * ntracked
1457 fd_deltas = [0] * ntracked
1458
Tim Peters06c5c002006-06-05 00:55:26 +00001459 print >> sys.stderr, "beginning", repcount, "repetitions"
1460 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001461 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Victor Stinner64856ad2018-06-05 12:36:31 +02001462 # initialize variables to make pyflakes quiet
1463 rc_before = fd_before = 0
Tim Peters06c5c002006-06-05 00:55:26 +00001464 for i in range(repcount):
Tim Peters06c5c002006-06-05 00:55:26 +00001465 run_the_test()
1466 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001467 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001468 rc_after = sys.gettotalrefcount()
Victor Stinner64856ad2018-06-05 12:36:31 +02001469 fd_after = support.fd_count()
Tim Peters06c5c002006-06-05 00:55:26 +00001470 if i >= nwarmup:
Victor Stinner64856ad2018-06-05 12:36:31 +02001471 rc_deltas[i - nwarmup] = rc_after - rc_before
1472 fd_deltas[i - nwarmup] = fd_after - fd_before
1473 rc_before = rc_after
1474 fd_before = fd_after
Tim Peters06c5c002006-06-05 00:55:26 +00001475 print >> sys.stderr
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001476
Victor Stinner64856ad2018-06-05 12:36:31 +02001477 # These checkers return False on success, True on failure
1478 def check_rc_deltas(deltas):
1479 # Checker for reference counters and memomry blocks.
1480 #
1481 # bpo-30776: Try to ignore false positives:
1482 #
1483 # [3, 0, 0]
1484 # [0, 1, 0]
1485 # [8, -8, 1]
1486 #
1487 # Expected leaks:
1488 #
1489 # [5, 5, 6]
1490 # [10, 1, 1]
1491 return all(delta >= 1 for delta in deltas)
1492
1493 def check_fd_deltas(deltas):
1494 return any(deltas)
1495
1496 failed = False
1497 for deltas, item_name, checker in [
1498 (rc_deltas, 'references', check_rc_deltas),
1499 (fd_deltas, 'file descriptors', check_fd_deltas)
1500 ]:
1501 if checker(deltas):
1502 msg = '%s leaked %s %s, sum=%s' % (test, deltas, item_name, sum(deltas))
1503 print >> sys.stderr, msg
1504 with open(fname, "a") as refrep:
1505 print >> refrep, msg
1506 refrep.flush()
1507 failed = True
1508 return failed
Tim Peters06c5c002006-06-05 00:55:26 +00001509
Benjamin Peterson55035792014-02-16 14:51:17 -05001510def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001511 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001512
Tim Peters06c5c002006-06-05 00:55:26 +00001513 # Restore some original values.
1514 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001515 copy_reg.dispatch_table.clear()
1516 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001517 sys.path_importer_cache.clear()
1518 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001519 try:
1520 import zipimport
1521 except ImportError:
1522 pass # Run unmodified on platforms without zipimport support
1523 else:
1524 zipimport._zip_directory_cache.clear()
1525 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001526
Christian Heimes908caac2008-01-27 23:34:59 +00001527 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001528 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001529
Guido van Rossum64c06e32007-11-22 00:55:51 +00001530 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001531 for abc, registry in abcs.items():
1532 abc._abc_registry = registry.copy()
1533 abc._abc_cache.clear()
1534 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001535
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001536 clear_caches()
1537
1538def clear_caches():
1539 import gc
1540
1541 # Clear the warnings registry, so they can be displayed again
1542 for mod in sys.modules.values():
1543 if hasattr(mod, '__warningregistry__'):
1544 del mod.__warningregistry__
1545
Tim Peters06c5c002006-06-05 00:55:26 +00001546 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001547 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001548 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001549 distutils_dir_util = sys.modules['distutils.dir_util']
1550 except KeyError:
1551 pass
1552 else:
1553 distutils_dir_util._path_created.clear()
1554
1555 re.purge()
1556
1557 try:
1558 _strptime = sys.modules['_strptime']
1559 except KeyError:
1560 pass
1561 else:
1562 _strptime._regex_cache.clear()
1563
1564 try:
1565 urlparse = sys.modules['urlparse']
1566 except KeyError:
1567 pass
1568 else:
1569 urlparse.clear_cache()
1570
1571 try:
1572 urllib = sys.modules['urllib']
1573 except KeyError:
1574 pass
1575 else:
1576 urllib.urlcleanup()
1577
1578 try:
1579 urllib2 = sys.modules['urllib2']
1580 except KeyError:
1581 pass
1582 else:
1583 urllib2.install_opener(None)
1584
1585 try:
1586 dircache = sys.modules['dircache']
1587 except KeyError:
1588 pass
1589 else:
1590 dircache.reset()
1591
1592 try:
1593 linecache = sys.modules['linecache']
1594 except KeyError:
1595 pass
1596 else:
1597 linecache.clearcache()
1598
1599 try:
1600 mimetypes = sys.modules['mimetypes']
1601 except KeyError:
1602 pass
1603 else:
1604 mimetypes._default_mime_types()
1605
1606 try:
1607 filecmp = sys.modules['filecmp']
1608 except KeyError:
1609 pass
1610 else:
1611 filecmp._cache.clear()
1612
1613 try:
1614 struct = sys.modules['struct']
1615 except KeyError:
1616 pass
1617 else:
1618 struct._clearcache()
1619
1620 try:
1621 doctest = sys.modules['doctest']
1622 except KeyError:
1623 pass
1624 else:
1625 doctest.master = None
1626
1627 try:
1628 ctypes = sys.modules['ctypes']
1629 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001630 pass
1631 else:
1632 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001633
1634 # Collect cyclic trash.
1635 gc.collect()
1636
Victor Stinner8bb08632017-06-16 12:14:09 +02001637def warm_caches():
1638 """Create explicitly internal singletons which are created on demand
1639 to prevent false positive when hunting reference leaks."""
1640 # char cache
1641 for i in range(256):
1642 chr(i)
1643 # unicode cache
1644 for i in range(256):
1645 unichr(i)
1646 # int cache
1647 list(range(-5, 257))
1648
Florent Xicluna0932dc52010-03-06 08:07:44 +00001649def findtestdir(path=None):
1650 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001651
Florent Xicluna0932dc52010-03-06 08:07:44 +00001652def removepy(names):
1653 if not names:
1654 return
1655 for idx, name in enumerate(names):
1656 basename, ext = os.path.splitext(name)
1657 if ext == '.py':
1658 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001659
Guido van Rossum152494a1996-12-20 03:12:20 +00001660def count(n, word):
1661 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001662 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001663 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001664 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001665
Victor Stinner24c2c202017-06-16 17:30:03 +02001666def printlist(x, width=70, indent=4, file=None):
Tim Peters7c7efe92002-08-23 17:55:54 +00001667 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001668
1669 Optional arg width (default 70) is the maximum line length.
1670 Optional arg indent (default 4) is the number of blanks with which to
1671 begin each line.
1672 """
1673
Tim Petersba78bc42002-07-04 19:45:06 +00001674 from textwrap import fill
1675 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001676 # Print the sorted list: 'x' may be a '--random' list or a set()
Victor Stinner24c2c202017-06-16 17:30:03 +02001677 print >>file, fill(' '.join(str(elt) for elt in sorted(x)), width,
1678 initial_indent=blanks, subsequent_indent=blanks)
1679
1680def get_abs_module(testdir, test):
1681 if test.startswith('test.') or testdir:
1682 return test
1683 else:
1684 # Always import it from the test package
1685 return 'test.' + test
1686
1687def _list_cases(suite):
1688 for test in suite:
1689 if isinstance(test, unittest.TestSuite):
1690 _list_cases(test)
1691 elif isinstance(test, unittest.TestCase):
Victor Stinnera30d5872018-06-04 22:25:54 +02001692 if support.match_test(test):
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001693 print(test.id())
Victor Stinner24c2c202017-06-16 17:30:03 +02001694
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001695def list_cases(testdir, selected, match_tests):
Victor Stinnera30d5872018-06-04 22:25:54 +02001696 support.verbose = False
1697 support.set_match_tests(match_tests)
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001698
Victor Stinner8767de22017-07-05 10:52:06 +02001699 save_modules = set(sys.modules)
Victor Stinner24c2c202017-06-16 17:30:03 +02001700 skipped = []
1701 for test in selected:
1702 abstest = get_abs_module(testdir, test)
1703 try:
1704 suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
1705 _list_cases(suite)
1706 except unittest.SkipTest:
1707 skipped.append(test)
1708
Victor Stinner8767de22017-07-05 10:52:06 +02001709 unload_test_modules(save_modules)
1710
Victor Stinner24c2c202017-06-16 17:30:03 +02001711 if skipped:
1712 print >>sys.stderr
1713 print >>sys.stderr, count(len(skipped), "test"), "skipped:"
1714 printlist(skipped, file=sys.stderr)
Tim Petersa45da922001-08-12 03:45:50 +00001715
Tim Petersde14a302002-04-01 05:04:46 +00001716# Map sys.platform to a string containing the basenames of tests
1717# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001718#
1719# Special cases:
1720# test_pep277
1721# The _ExpectedSkips constructor adds this to the set of expected
1722# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001723# test_timeout
1724# Controlled by test_timeout.skip_expected. Requires the network
1725# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001726#
1727# Tests that are expected to be skipped everywhere except on one platform
1728# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001729
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001730_expectations = {
1731 'win32':
1732 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001733 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001734 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001735 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001736 test_commands
1737 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001738 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001739 test_dbm
1740 test_dl
1741 test_fcntl
1742 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001743 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001744 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001745 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001746 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001747 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001748 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001749 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001750 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001751 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001752 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001753 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001754 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001755 test_pty
1756 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001757 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001758 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001759 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001760 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001761 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001762 test_wait3
1763 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001764 """,
1765 'linux2':
1766 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001767 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001768 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001769 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001770 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001771 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001772 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001773 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001774 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001775 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001776 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001777 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001778 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001779 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001780 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001781 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001782 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001783 test_openpty
1784 test_pyexpat
1785 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001786 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001787 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001788 'openunix8':
1789 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001790 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001791 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001792 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001793 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001794 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001795 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001796 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001797 test_openpty
1798 test_pyexpat
1799 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001800 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001801 """,
1802 'sco_sv3':
1803 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001804 test_asynchat
1805 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001806 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001807 test_dl
1808 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001809 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001810 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001811 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001812 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001813 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001814 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001815 test_openpty
1816 test_pyexpat
1817 test_queue
1818 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001819 test_sundry
1820 test_thread
1821 test_threaded_import
1822 test_threadedtempfile
1823 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001824 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001825 'riscos':
1826 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001827 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001828 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001829 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001830 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001831 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001832 test_commands
1833 test_crypt
1834 test_dbm
1835 test_dl
1836 test_fcntl
1837 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001838 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001839 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001840 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001841 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001842 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001843 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001844 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001845 test_openpty
1846 test_poll
1847 test_popen2
1848 test_pty
1849 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001850 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001851 test_sundry
1852 test_thread
1853 test_threaded_import
1854 test_threadedtempfile
1855 test_threading
1856 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001857 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001858 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001859 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001860 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001861 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001862 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001863 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001864 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001865 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001866 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001867 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001868 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001869 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001870 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001871 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001872 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001873 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001874 'sunos5':
1875 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001876 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001877 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001878 test_curses
1879 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001880 test_epoll
1881 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001882 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001883 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001884 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001885 test_zipfile
1886 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001887 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001888 'hp-ux11':
1889 """
Skip Montanarob3230212002-03-15 02:54:03 +00001890 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001891 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001892 test_curses
1893 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001894 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001895 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001896 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001897 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001898 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001899 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001900 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001901 test_openpty
1902 test_pyexpat
1903 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001904 test_zipfile
1905 test_zlib
1906 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001907 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001908 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001909 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001910 test_curses
1911 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001912 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001913 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001914 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001915 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001916 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001917 test_mhlib
1918 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001919 test_poll
1920 test_popen2
1921 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001922 """,
Jason Tishler25115942002-12-05 15:18:15 +00001923 'cygwin':
1924 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001925 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001926 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001927 test_curses
1928 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001929 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001930 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001931 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001932 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001933 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001934 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001935 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001936 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001937 'os2emx':
1938 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001939 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001940 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001941 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001942 test_commands
1943 test_curses
1944 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001945 test_epoll
1946 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001947 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001948 test_mhlib
1949 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001950 test_openpty
1951 test_ossaudiodev
1952 test_pty
1953 test_resource
1954 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001955 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001956 'freebsd4':
1957 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001958 test_bsddb
1959 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001960 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001961 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001962 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001963 test_ossaudiodev
1964 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001965 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001966 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001967 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001968 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001969 test_ttk_guionly
1970 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001971 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001972 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001973 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001974 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001975 'aix5':
1976 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001977 test_bsddb
1978 test_bsddb185
1979 test_bsddb3
1980 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001981 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001982 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001983 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001984 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001985 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001986 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001987 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001988 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001989 test_ttk_guionly
1990 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001991 test_zipimport
1992 test_zlib
1993 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001994 'openbsd3':
1995 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001996 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001997 test_bsddb
1998 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001999 test_ctypes
2000 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00002001 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00002002 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00002003 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00002004 test_normalization
2005 test_ossaudiodev
2006 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00002007 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00002008 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00002009 test_ttk_guionly
2010 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00002011 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00002012 """,
Georg Brandl08706872006-06-21 17:53:17 +00002013 'netbsd3':
2014 """
Florent Xicluna27e02402010-03-24 17:32:58 +00002015 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00002016 test_bsddb
2017 test_bsddb185
2018 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00002019 test_ctypes
2020 test_curses
2021 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00002022 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00002023 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00002024 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00002025 test_ossaudiodev
2026 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00002027 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00002028 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00002029 test_ttk_guionly
2030 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00002031 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00002032 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00002033}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00002034_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00002035_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00002036_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00002037_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00002038
Tim Petersb5b7b782001-08-12 01:20:39 +00002039class _ExpectedSkips:
2040 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00002041 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00002042 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00002043
Tim Peters7c7efe92002-08-23 17:55:54 +00002044 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00002045 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00002046 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00002047 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00002048
Georg Brandlb2e208f2007-07-12 09:24:04 +00002049 # expected to be skipped on every platform, even Linux
2050 self.expected.add('test_linuxaudiodev')
2051
Tim Peters2a182db2002-10-09 01:07:11 +00002052 if not os.path.supports_unicode_filenames:
2053 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00002054
Neal Norwitz55b61d22003-02-28 19:57:03 +00002055 if test_timeout.skip_expected:
2056 self.expected.add('test_timeout')
2057
Martin v. Löwisfba73692004-11-13 11:13:35 +00002058 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00002059 self.expected.add('test_imageop')
2060
Ronald Oussoren9545a232010-05-05 19:09:31 +00002061 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00002062 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00002063 "test_plistlib", "test_scriptpackages",
2064 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00002065 for skip in MAC_ONLY:
2066 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00002067 elif len(u'\0'.encode('unicode-internal')) == 4:
2068 self.expected.add("test_macostools")
2069
Tim Petersecd79eb2003-01-29 00:35:32 +00002070
2071 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00002072 # test_sqlite is only reliable on Windows where the library
2073 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00002074 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00002075 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02002076 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00002077 for skip in WIN_ONLY:
2078 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00002079
Brett Cannondc48b742007-05-20 07:09:50 +00002080 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00002081 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
2082 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00002083 for skip in IRIX_ONLY:
2084 self.expected.add(skip)
2085
Georg Brandlb2e208f2007-07-12 09:24:04 +00002086 if sys.platform != 'sunos5':
2087 self.expected.add('test_sunaudiodev')
2088 self.expected.add('test_nis')
2089
Steven Bethardd290b042008-03-21 21:01:18 +00002090 if not sys.py3kwarning:
2091 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00002092
Tim Peters7c7efe92002-08-23 17:55:54 +00002093 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00002094
2095 def isvalid(self):
2096 "Return true iff _ExpectedSkips knows about the current platform."
2097 return self.valid
2098
2099 def getexpected(self):
2100 """Return set of test names we expect to skip on current platform.
2101
2102 self.isvalid() must be true.
2103 """
2104
2105 assert self.isvalid()
2106 return self.expected
2107
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03002108def main_in_temp_cwd():
2109 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02002110 global TEMPDIR
2111
Florent Xicluna0932dc52010-03-06 08:07:44 +00002112 # When tests are run from the Python build directory, it is best practice
2113 # to keep the test files in a subfolder. It eases the cleanup of leftover
2114 # files using command "make distclean".
2115 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00002116 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
2117 TEMPDIR = os.path.abspath(TEMPDIR)
2118 if not os.path.exists(TEMPDIR):
2119 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002120
2121 # Define a writable temp dir that will be used as cwd while running
2122 # the tests. The name of the dir includes the pid to allow parallel
2123 # testing (see the -j option).
2124 TESTCWD = 'test_python_{}'.format(os.getpid())
2125
Florent Xicluna12735662010-04-23 18:10:12 +00002126 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002127
2128 # Run the tests in a context manager that temporary changes the CWD to a
2129 # temporary and writable directory. If it's not possible to create or
2130 # change the CWD, the original CWD will be used. The original CWD is
Victor Stinnera30d5872018-06-04 22:25:54 +02002131 # available from support.SAVEDCWD.
2132 with support.temp_cwd(TESTCWD, quiet=True):
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002133 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03002134
2135if __name__ == '__main__':
2136 # findtestdir() gets the dirname out of __file__, so we have to make it
2137 # absolute before changing the working directory.
2138 # For example __file__ may be relative when running trace or profile.
2139 # See issue #9323.
2140 global __file__
2141 __file__ = os.path.abspath(__file__)
2142
2143 # sanity check
2144 assert __file__ == os.path.abspath(sys.argv[0])
2145
2146 main_in_temp_cwd()