blob: c4f27814029c045d5409a88942868f37b5ea414e [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
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000177import json
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000178import os
179import random
180import re
Serhiy Storchakabb801312013-02-10 12:01:31 +0200181import shutil
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000182import sys
183import time
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000184import traceback
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000185import warnings
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000186import unittest
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000187import tempfile
Ezio Melottidde5b942010-02-03 05:37:26 +0000188import imp
Florent Xiclunab7c20022010-03-06 09:11:55 +0000189import platform
Florent Xicluna0932dc52010-03-06 08:07:44 +0000190import sysconfig
Guido van Rossumdc15c272002-08-12 21:55:51 +0000191
Guido van Rossum152494a1996-12-20 03:12:20 +0000192
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000193# Some times __path__ and __file__ are not absolute (e.g. while running from
194# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
195# imports might fail. This affects only the modules imported before os.chdir().
196# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
197# they are found in the CWD their __file__ and __path__ will be relative (this
198# happens before the chdir). All the modules imported after the chdir, are
199# not found in the CWD, and since the other paths in sys.path[1:] are absolute
200# (site.py absolutize them), the __file__ and __path__ will be absolute too.
201# Therefore it is necessary to absolutize manually the __file__ and __path__ of
202# the packages to prevent later imports to fail when the CWD is different.
203for module in sys.modules.itervalues():
204 if hasattr(module, '__path__'):
205 module.__path__ = [os.path.abspath(path) for path in module.__path__]
206 if hasattr(module, '__file__'):
207 module.__file__ = os.path.abspath(module.__file__)
208
209
Guido van Rossumbb484652002-12-02 09:56:21 +0000210# MacOSX (a.k.a. Darwin) has a default stack size that is too small
211# for deeply recursive regular expressions. We see this as crashes in
212# the Python test suite when running test_re.py and test_sre.py. The
213# fix is to set the stack limit to 2048.
214# This approach may also be useful for other Unixy platforms that
215# suffer from small default stack limits.
216if sys.platform == 'darwin':
217 try:
218 import resource
219 except ImportError:
220 pass
221 else:
222 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
223 newsoft = min(hard, max(soft, 1024*2048))
224 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
225
Zachary Ware47343722015-07-16 00:24:48 -0500226# Windows, Tkinter, and resetting the environment after each test don't
227# mix well. To alleviate test failures due to Tcl/Tk not being able to
228# find its library, get the necessary environment massage done once early.
229if sys.platform == 'win32':
230 try:
231 import FixTk
232 except Exception:
233 pass
234
Georg Brandl4045e882009-10-29 20:53:00 +0000235# Test result constants.
236PASSED = 1
237FAILED = 0
238ENV_CHANGED = -1
239SKIPPED = -2
240RESOURCE_DENIED = -3
241INTERRUPTED = -4
Victor Stinnerc991eb22017-05-03 17:28:28 +0200242CHILD_ERROR = -5 # error in a child process
Georg Brandl4045e882009-10-29 20:53:00 +0000243
Victor Stinner453a6852017-05-09 17:06:34 +0200244# Minimum duration of a test to display its duration or to mention that
245# the test is running in background
246PROGRESS_MIN_TIME = 30.0 # seconds
247
248# Display the running tests if nothing happened last N seconds
249PROGRESS_UPDATE = 30.0 # seconds
250
Barry Warsaw04f357c2002-07-23 19:04:11 +0000251from test import test_support
Fred Drake3a15dac2002-04-11 16:39:16 +0000252
Victor Stinner80ebc432017-07-21 02:12:14 +0200253ALL_RESOURCES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
254 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
255 'xpickle')
256
257# Other resources excluded from --use=all:
258#
259# - extralagefile (ex: test_zipfile64): really too slow to be enabled
260# "by default"
261RESOURCE_NAMES = ALL_RESOURCES + ('extralargefile',)
Fred Drake3a15dac2002-04-11 16:39:16 +0000262
Florent Xicluna12735662010-04-23 18:10:12 +0000263TEMPDIR = os.path.abspath(tempfile.gettempdir())
264
Fred Drake3a15dac2002-04-11 16:39:16 +0000265
Barry Warsaw08fca522001-08-20 22:33:46 +0000266def usage(code, msg=''):
267 print __doc__
268 if msg: print msg
269 sys.exit(code)
270
271
Victor Stinner453a6852017-05-09 17:06:34 +0200272def format_duration(seconds):
273 if seconds < 1.0:
274 return '%.0f ms' % (seconds * 1e3)
275 if seconds < 60.0:
276 return '%.0f sec' % seconds
277
278 minutes, seconds = divmod(seconds, 60.0)
279 return '%.0f min %.0f sec' % (minutes, seconds)
280
281
282_FORMAT_TEST_RESULT = {
283 PASSED: '%s passed',
284 FAILED: '%s failed',
285 ENV_CHANGED: '%s failed (env changed)',
286 SKIPPED: '%s skipped',
287 RESOURCE_DENIED: '%s skipped (resource denied)',
288 INTERRUPTED: '%s interrupted',
289 CHILD_ERROR: '%s crashed',
290}
291
292
293def format_test_result(test_name, result):
294 fmt = _FORMAT_TEST_RESULT.get(result, "%s")
295 return fmt % test_name
296
297
Victor Stinner02d42922017-08-21 18:01:11 +0200298def cpu_count():
299 # first try os.sysconf() to prevent loading the big multiprocessing module
300 try:
301 return os.sysconf('SC_NPROCESSORS_ONLN')
302 except (AttributeError, ValueError):
303 pass
304
305 # try multiprocessing.cpu_count()
306 try:
307 import multiprocessing
308 except ImportError:
309 pass
310 else:
311 return multiprocessing.cpu_count()
312
313 return None
314
315
Victor Stinner8767de22017-07-05 10:52:06 +0200316def unload_test_modules(save_modules):
317 # Unload the newly imported modules (best effort finalization)
318 for module in sys.modules.keys():
319 if module not in save_modules and module.startswith("test."):
320 test_support.unload(module)
321
322
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000323def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000324 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000325 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000326 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000327 random_seed=None, use_mp=None, verbose3=False, forever=False,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300328 header=False, pgo=False, failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000329 """Execute a test suite.
330
Thomas Wouters7e474022000-07-16 12:04:32 +0000331 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000332 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000333
334 tests -- a list of strings containing test names (optional)
335 testdir -- the directory in which to look for tests (optional)
336
337 Users other than the Python test suite will certainly want to
338 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000339 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000340
341 If the tests argument is omitted, the tests listed on the
342 command-line will be used. If that's empty, too, then all *.py
343 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000344
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000345 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000346 single, randomize, findleaks, use_resources, trace, coverdir,
347 print_slow, and random_seed) allow programmers calling main()
348 directly to set the values that would normally be set by flags
349 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000350 """
Victor Stinner453a6852017-05-09 17:06:34 +0200351 regrtest_start_time = time.time()
Fred Drake004d5e62000-10-23 17:22:08 +0000352
Tim Peters8dee8092001-09-25 20:05:11 +0000353 test_support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000354 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300355 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:PGm:',
Georg Brandl71a015a2009-10-27 20:52:02 +0000356 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Victor Stinner453a6852017-05-09 17:06:34 +0200357 'exclude', 'single', 'slow', 'slowest', 'randomize', 'fromfile=',
358 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000359 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
360 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300361 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo',
Victor Stinner24c2c202017-06-16 17:30:03 +0200362 'failfast', 'match=', 'testdir=', 'list-tests', 'list-cases',
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200363 'coverage', 'matchfile=', 'fail-env-changed'])
Guido van Rossum152494a1996-12-20 03:12:20 +0000364 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000365 usage(2, msg)
366
367 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000368 if random_seed is None:
369 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000370 if use_resources is None:
371 use_resources = []
Victor Stinnerd2aff602017-05-09 13:57:20 +0200372 slaveargs = None
Victor Stinner453a6852017-05-09 17:06:34 +0200373 list_tests = False
Victor Stinner24c2c202017-06-16 17:30:03 +0200374 list_cases_opt = False
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200375 fail_env_changed = False
Guido van Rossum152494a1996-12-20 03:12:20 +0000376 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000377 if o in ('-h', '--help'):
378 usage(0)
379 elif o in ('-v', '--verbose'):
380 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000381 elif o in ('-w', '--verbose2'):
382 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000383 elif o in ('-W', '--verbose3'):
384 verbose3 = True
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300385 elif o in ('-G', '--failfast'):
386 failfast = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000387 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000388 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000389 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000390 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000391 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000392 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000393 single = True
Victor Stinner453a6852017-05-09 17:06:34 +0200394 elif o in ('-S', '--slow', '--slowest'):
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000395 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000396 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000397 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000398 elif o == '--randseed':
399 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000400 elif o in ('-f', '--fromfile'):
401 fromfile = a
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300402 elif o in ('-m', '--match'):
Victor Stinner24c2c202017-06-16 17:30:03 +0200403 if match_tests is None:
404 match_tests = []
405 match_tests.append(a)
406 elif o == '--matchfile':
407 if match_tests is None:
408 match_tests = []
409 filename = os.path.join(test_support.SAVEDCWD, a)
410 with open(filename) as fp:
411 for line in fp:
412 match_tests.append(line.strip())
Barry Warsaw08fca522001-08-20 22:33:46 +0000413 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000414 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000415 elif o in ('-L', '--runleaks'):
416 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000417 elif o in ('-t', '--threshold'):
418 import gc
419 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000420 elif o in ('-T', '--coverage'):
421 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000422 elif o in ('-D', '--coverdir'):
423 coverdir = os.path.join(os.getcwd(), a)
424 elif o in ('-N', '--nocoverdir'):
425 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000426 elif o in ('-R', '--huntrleaks'):
427 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000428 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000429 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000430 usage(2, '-R takes 2 or 3 colon-separated arguments')
431 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000432 huntrleaks[0] = 5
433 else:
434 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000435 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000436 huntrleaks[1] = 4
437 else:
438 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000439 if len(huntrleaks) == 2 or not huntrleaks[2]:
440 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000441 elif o in ('-M', '--memlimit'):
442 test_support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000443 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000444 u = [x.lower() for x in a.split(',')]
445 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000446 if r == 'all':
Victor Stinner80ebc432017-07-21 02:12:14 +0200447 use_resources[:] = ALL_RESOURCES
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000448 continue
449 remove = False
450 if r[0] == '-':
451 remove = True
452 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000453 if r not in RESOURCE_NAMES:
454 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000455 if remove:
456 if r in use_resources:
457 use_resources.remove(r)
458 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000459 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000460 elif o in ('-F', '--forever'):
461 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000462 elif o in ('-j', '--multiprocess'):
463 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000464 elif o == '--header':
465 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000466 elif o == '--slaveargs':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200467 slaveargs = a
Brett Cannon95374782015-10-02 16:21:34 -0700468 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700469 pgo = True
Victor Stinner453a6852017-05-09 17:06:34 +0200470 elif o == '--testdir':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200471 testdir = a
Victor Stinner453a6852017-05-09 17:06:34 +0200472 elif o == '--list-tests':
473 list_tests = True
Victor Stinner24c2c202017-06-16 17:30:03 +0200474 elif o == '--list-cases':
475 list_cases_opt = True
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200476 elif o == '--fail-env-changed':
477 fail_env_changed = True
R. David Murrayda826892009-11-15 00:04:32 +0000478 else:
479 print >>sys.stderr, ("No handler for option {}. Please "
480 "report this as a bug at http://bugs.python.org.").format(o)
481 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000482 if single and fromfile:
483 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000484 if use_mp and trace:
485 usage(2, "-T and -j don't go together!")
486 if use_mp and findleaks:
487 usage(2, "-l and -j don't go together!")
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300488 if failfast and not (verbose or verbose3):
489 usage("-G/--failfast needs either -v or -W")
Barry Warsaw08fca522001-08-20 22:33:46 +0000490
Victor Stinnerd2aff602017-05-09 13:57:20 +0200491 if testdir:
492 testdir = os.path.abspath(testdir)
493
494 # Prepend test directory to sys.path, so runtest() will be able
495 # to locate tests
496 sys.path.insert(0, testdir)
497
Victor Stinner30509872017-07-05 09:16:47 +0200498 # Make sure that '' and Lib/test/ are not in sys.path
499 regrtest_dir = os.path.abspath(os.path.dirname(__file__))
500 for path in ('', regrtest_dir):
501 try:
502 sys.path.remove(path)
503 except ValueError:
504 pass
505
Victor Stinnerd2aff602017-05-09 13:57:20 +0200506 if slaveargs is not None:
507 args, kwargs = json.loads(slaveargs)
Victor Stinner8bb08632017-06-16 12:14:09 +0200508 if kwargs['huntrleaks']:
509 warm_caches()
Victor Stinnerd2aff602017-05-09 13:57:20 +0200510 if testdir:
511 kwargs['testdir'] = testdir
512 try:
513 result = runtest(*args, **kwargs)
514 except BaseException, e:
515 result = INTERRUPTED, e.__class__.__name__
516 print # Force a newline (just in case)
517 print json.dumps(result)
518 sys.exit(0)
519
Victor Stinner8bb08632017-06-16 12:14:09 +0200520 if huntrleaks:
521 warm_caches()
522
Guido van Rossum152494a1996-12-20 03:12:20 +0000523 good = []
524 bad = []
525 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000526 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000527 environment_changed = []
Florent Xicluna75c66762010-03-30 16:31:14 +0000528 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000529
Neil Schemenauerd569f232000-09-22 15:29:28 +0000530 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000531 try:
532 import gc
533 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000534 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000535 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000536 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000537 # Uncomment the line below to report garbage that is not
538 # freeable by reference counting alone. By default only
539 # garbage that is not collectable by the GC is reported.
540 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000541 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000542
Barry Warsawe11e3de1999-01-28 19:51:51 +0000543 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000544 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000545 try:
546 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000547 next_test = fp.read().strip()
548 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000549 fp.close()
550 except IOError:
551 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000552
553 if fromfile:
554 tests = []
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000555 fp = open(os.path.join(test_support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000556 for line in fp:
557 guts = line.split() # assuming no test has whitespace in its name
558 if guts and not guts[0].startswith('#'):
559 tests.extend(guts)
560 fp.close()
561
562 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000563 removepy(args)
564 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000565
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000566 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000567 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000568 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000569 for arg in args:
570 if arg in stdtests:
571 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000572 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000573 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000574
Victor Stinner0fbac702017-08-21 23:57:06 +0200575 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 +0000576 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000577 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000578 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000579 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000580 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000581 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000582 except IndexError:
583 next_single_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200584
585 if list_tests:
586 for name in selected:
587 print(name)
588 sys.exit(0)
589
Victor Stinner24c2c202017-06-16 17:30:03 +0200590 if list_cases_opt:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200591 list_cases(testdir, selected, match_tests)
Victor Stinner24c2c202017-06-16 17:30:03 +0200592 sys.exit(0)
593
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000594 if trace:
595 import trace
Victor Stinnera5bb6242017-05-11 11:30:23 +0200596 tracer = trace.Trace(trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000597
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000598 test_times = []
Barry Warsaw08fca522001-08-20 22:33:46 +0000599 test_support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800600 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000601
602 def accumulate_result(test, result):
603 ok, test_time = result
Victor Stinnerc991eb22017-05-03 17:28:28 +0200604 if ok not in (CHILD_ERROR, INTERRUPTED):
605 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000606 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000607 good.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200608 elif ok in (FAILED, CHILD_ERROR):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000609 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000610 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000611 environment_changed.append(test)
612 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000613 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000614 elif ok == RESOURCE_DENIED:
615 skipped.append(test)
616 resource_denieds.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200617 elif ok != INTERRUPTED:
618 raise ValueError("invalid test result: %r" % ok)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000619
R. David Murray7f7eea62009-11-14 15:18:22 +0000620 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000621 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000622 while True:
623 for test in tests:
624 yield test
625 if bad:
626 return
Victor Stinnerd7955b82017-07-03 15:07:53 +0200627 if fail_env_changed and environment_changed:
628 return
R. David Murray7f7eea62009-11-14 15:18:22 +0000629 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200630 test_count = ''
631 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000632 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000633 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200634 test_count = '/{}'.format(len(selected))
635 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000636
Victor Stinner453a6852017-05-09 17:06:34 +0200637 def display_progress(test_index, test):
638 # "[ 51/405/1] test_tcl"
Victor Stinner02d42922017-08-21 18:01:11 +0200639 line = "{1:{0}}{2}".format(test_count_width, test_index, test_count)
640 if bad and not pgo:
641 line = '{}/{}'.format(line, len(bad))
642 line = '[{}]'.format(line)
643
644 # add the system load prefix: "load avg: 1.80 "
645 if hasattr(os, 'getloadavg'):
646 load_avg_1min = os.getloadavg()[0]
647 line = "load avg: {:.2f} {}".format(load_avg_1min, line)
Victor Stinner453a6852017-05-09 17:06:34 +0200648
649 # add the timestamp prefix: "0:01:05 "
650 test_time = time.time() - regrtest_start_time
651 test_time = datetime.timedelta(seconds=int(test_time))
652 line = "%s %s" % (test_time, line)
653
Victor Stinner02d42922017-08-21 18:01:11 +0200654 # add the test name
655 line = "{} {}".format(line, test)
656
Victor Stinner453a6852017-05-09 17:06:34 +0200657 print(line)
658 sys.stdout.flush()
659
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200660 # For a partial run, we do not need to clutter the output.
Victor Stinner0fbac702017-08-21 23:57:06 +0200661 if display_header:
662 # Print basic platform information
663 print "==", platform.python_implementation(), \
664 " ".join(sys.version.split())
665 print "== ", platform.platform(aliased=True), \
666 "%s-endian" % sys.byteorder
667 print "== ", os.getcwd()
668 ncpu = cpu_count()
669 if ncpu:
670 print "== CPU count:", ncpu
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200671
672 if randomize:
673 random.seed(random_seed)
674 print "Using random seed", random_seed
675 random.shuffle(selected)
676
Antoine Pitrou4698d992009-05-31 14:20:14 +0000677 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000678 try:
679 from threading import Thread
680 except ImportError:
681 print "Multiprocess option requires thread support"
682 sys.exit(2)
Victor Stinner453a6852017-05-09 17:06:34 +0200683 from Queue import Queue, Empty
Georg Brandla4f46e12010-02-07 17:03:15 +0000684 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000685 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000686 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000687 def tests_and_args():
688 for test in tests:
689 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000690 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700691 dict(huntrleaks=huntrleaks, use_resources=use_resources,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300692 failfast=failfast,
693 match_tests=match_tests,
Brett Cannoneb2cb972015-10-16 12:30:20 -0700694 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000695 )
696 yield (test, args_tuple)
697 pending = tests_and_args()
Antoine Pitroua226c912010-10-14 11:15:50 +0000698 opt_args = test_support.args_from_interpreter_flags()
699 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700700 # required to spawn a new process with PGO flag on/off
701 if pgo:
702 base_cmd = base_cmd + ['--pgo']
Victor Stinner453a6852017-05-09 17:06:34 +0200703
704 class MultiprocessThread(Thread):
705 current_test = None
706 start_time = None
707
708 def runtest(self):
709 try:
710 test, args_tuple = next(pending)
711 except StopIteration:
712 output.put((None, None, None, None))
713 return True
714
715 # -E is needed by some tests, e.g. test_import
716 args = base_cmd + ['--slaveargs', json.dumps(args_tuple)]
717 if testdir:
718 args.extend(('--testdir', testdir))
719 try:
720 self.start_time = time.time()
721 self.current_test = test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200722 popen = Popen(args,
723 stdout=PIPE, stderr=PIPE,
724 universal_newlines=True,
725 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000726 stdout, stderr = popen.communicate()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200727 retcode = popen.wait()
Victor Stinner453a6852017-05-09 17:06:34 +0200728 finally:
729 self.current_test = None
Victor Stinnerc991eb22017-05-03 17:28:28 +0200730
Victor Stinner453a6852017-05-09 17:06:34 +0200731 # Strip last refcount output line if it exists, since it
732 # comes from the shutdown of the interpreter in the subcommand.
733 stderr = debug_output_pat.sub("", stderr)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200734
Victor Stinner453a6852017-05-09 17:06:34 +0200735 if retcode == 0:
736 stdout, _, result = stdout.strip().rpartition("\n")
737 if not result:
738 output.put((None, None, None, None))
739 return True
Victor Stinnerc991eb22017-05-03 17:28:28 +0200740
Victor Stinner453a6852017-05-09 17:06:34 +0200741 result = json.loads(result)
742 else:
743 result = (CHILD_ERROR, "Exit code %s" % retcode)
Victor Stinner228da422017-05-05 10:28:35 +0200744
Victor Stinner453a6852017-05-09 17:06:34 +0200745 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
746 return False
Victor Stinnerc991eb22017-05-03 17:28:28 +0200747
Victor Stinner453a6852017-05-09 17:06:34 +0200748 def run(self):
749 try:
750 stop = False
751 while not stop:
752 stop = self.runtest()
753 except BaseException:
754 output.put((None, None, None, None))
755 raise
756
757 workers = [MultiprocessThread() for i in range(use_mp)]
758 print("Run tests in parallel using %s child processes"
759 % len(workers))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000760 for worker in workers:
761 worker.start()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200762
Victor Stinner453a6852017-05-09 17:06:34 +0200763 def get_running(workers):
764 running = []
765 for worker in workers:
766 current_test = worker.current_test
767 if not current_test:
768 continue
769 dt = time.time() - worker.start_time
770 if dt >= PROGRESS_MIN_TIME:
771 running.append('%s (%.0f sec)' % (current_test, dt))
772 return running
773
Antoine Pitrou4698d992009-05-31 14:20:14 +0000774 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200775 test_index = 1
Victor Stinner453a6852017-05-09 17:06:34 +0200776 get_timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME)
R. David Murray7f7eea62009-11-14 15:18:22 +0000777 try:
778 while finished < use_mp:
Victor Stinner453a6852017-05-09 17:06:34 +0200779 try:
780 item = output.get(timeout=get_timeout)
781 except Empty:
782 running = get_running(workers)
783 if running and not pgo:
784 print('running: %s' % ', '.join(running))
Victor Stinner1da37ad2018-05-28 13:30:42 +0200785 sys.stdout.flush()
Victor Stinner453a6852017-05-09 17:06:34 +0200786 continue
787
788 test, stdout, stderr, result = item
R. David Murray7f7eea62009-11-14 15:18:22 +0000789 if test is None:
790 finished += 1
791 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000792 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200793 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200794 ok, test_time = result
795 text = format_test_result(test, ok)
796 if (ok not in (CHILD_ERROR, INTERRUPTED)
797 and test_time >= PROGRESS_MIN_TIME
798 and not pgo):
799 text += ' (%.0f sec)' % test_time
800 running = get_running(workers)
801 if running and not pgo:
802 text += ' -- running: %s' % ', '.join(running)
803 display_progress(test_index, text)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200804
805 if stdout:
Victor Stinner1da37ad2018-05-28 13:30:42 +0200806 print(stdout)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200807 sys.stdout.flush()
808 if stderr and not pgo:
809 print >>sys.stderr, stderr
810 sys.stderr.flush()
811
812 if result[0] == INTERRUPTED:
813 assert result[1] == 'KeyboardInterrupt'
814 raise KeyboardInterrupt # What else?
815
Victor Stinner32b1ff92014-09-05 12:12:11 +0200816 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000817 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000818 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000819 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000820 for worker in workers:
821 worker.join()
822 else:
Victor Stinner453a6852017-05-09 17:06:34 +0200823 print("Run tests sequentially")
824
825 previous_test = None
Brett Cannon65918e02015-10-02 16:22:32 -0700826 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000827 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200828 text = test
829 if previous_test:
830 text = '%s -- %s' % (text, previous_test)
831 display_progress(test_index, text)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200832
833 def local_runtest():
834 result = runtest(test, verbose, quiet, huntrleaks, None, pgo,
835 failfast=failfast,
836 match_tests=match_tests,
837 testdir=testdir)
838 accumulate_result(test, result)
839 return result
840
841 start_time = time.time()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000842 if trace:
843 # If we're tracing code coverage, then we don't exit with status
844 # if on a false return value from main.
Victor Stinnera5bb6242017-05-11 11:30:23 +0200845 ns = dict(locals())
846 tracer.runctx('result = local_runtest()',
847 globals=globals(), locals=ns)
848 result = ns['result']
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000849 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000850 try:
Victor Stinnera5bb6242017-05-11 11:30:23 +0200851 result = local_runtest()
Georg Brandl4045e882009-10-29 20:53:00 +0000852 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700853 if not pgo:
854 print "Re-running test %r in verbose mode" % test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200855 runtest(test, True, quiet, huntrleaks, None, pgo,
856 testdir=testdir)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000857 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000858 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000859 break
860 except:
861 raise
Victor Stinner453a6852017-05-09 17:06:34 +0200862
Victor Stinnera5bb6242017-05-11 11:30:23 +0200863 test_time = time.time() - start_time
864 previous_test = format_test_result(test, result[0])
865 if test_time >= PROGRESS_MIN_TIME:
866 previous_test = "%s in %s" % (previous_test,
867 format_duration(test_time))
868 elif result[0] == PASSED:
869 # be quiet: say nothing if the test passed shortly
870 previous_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200871
Antoine Pitrou4698d992009-05-31 14:20:14 +0000872 if findleaks:
873 gc.collect()
874 if gc.garbage:
875 print "Warning: test created", len(gc.garbage),
876 print "uncollectable object(s)."
877 # move the uncollectable objects somewhere so we don't see
878 # them again
879 found_garbage.extend(gc.garbage)
880 del gc.garbage[:]
Victor Stinner8767de22017-07-05 10:52:06 +0200881
882 unload_test_modules(save_modules)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000883
Brett Cannon95374782015-10-02 16:21:34 -0700884 if interrupted and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000885 # print a newline after ^C
886 print
887 print "Test suite interrupted by signal SIGINT."
888 omitted = set(selected) - set(good) - set(bad) - set(skipped)
889 print count(len(omitted), "test"), "omitted:"
890 printlist(omitted)
Brett Cannon95374782015-10-02 16:21:34 -0700891 if good and not quiet and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000892 if not bad and not skipped and not interrupted and len(good) > 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000893 print "All",
894 print count(len(good), "test"), "OK."
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000895 if print_slow:
896 test_times.sort(reverse=True)
897 print "10 slowest tests:"
Victor Stinner453a6852017-05-09 17:06:34 +0200898 for test_time, test in test_times[:10]:
899 print("- %s: %.1fs" % (test, test_time))
Brett Cannon95374782015-10-02 16:21:34 -0700900 if bad and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500901 print count(len(bad), "test"), "failed:"
902 printlist(bad)
Brett Cannon95374782015-10-02 16:21:34 -0700903 if environment_changed and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500904 print "{} altered the execution environment:".format(
905 count(len(environment_changed), "test"))
906 printlist(environment_changed)
Brett Cannon95374782015-10-02 16:21:34 -0700907 if skipped and not quiet and not pgo:
Tim Petersa45da922001-08-12 03:45:50 +0000908 print count(len(skipped), "test"), "skipped:"
909 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000910
Tim Petersb5b7b782001-08-12 01:20:39 +0000911 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000912 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000913 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000914 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000915 if surprise:
916 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000917 "unexpected on", plat + ":"
918 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000919 else:
920 print "Those skips are all expected on", plat + "."
921 else:
922 print "Ask someone to teach regrtest.py about which tests are"
923 print "expected to get skipped on", plat + "."
924
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000925 if verbose2 and bad:
926 print "Re-running failed tests in verbose mode"
Zachary Warea4777f12015-08-04 21:53:21 -0500927 for test in bad[:]:
Tim Peters922dd7d2006-03-10 23:37:10 +0000928 print "Re-running test %r in verbose mode" % test
929 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000930 try:
Neal Norwitz5fe5cf62008-03-18 17:58:02 +0000931 test_support.verbose = True
Victor Stinnerd2aff602017-05-09 13:57:20 +0200932 ok = runtest(test, True, quiet, huntrleaks, None, pgo,
933 testdir=testdir)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000934 except KeyboardInterrupt:
935 # print a newline separate from the ^C
936 print
937 break
Zachary Warea4777f12015-08-04 21:53:21 -0500938 else:
939 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
940 bad.remove(test)
941 else:
942 if bad:
943 print count(len(bad), "test"), "failed again:"
944 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000945
Barry Warsawe11e3de1999-01-28 19:51:51 +0000946 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000947 if next_single_test:
948 with open(filename, 'w') as fp:
949 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000950 else:
951 os.unlink(filename)
952
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000953 if trace:
954 r = tracer.results()
955 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
956
Skip Montanaro0179a182004-06-06 15:53:18 +0000957 if runleaks:
958 os.system("leaks %d" % os.getpid())
959
Victor Stinner453a6852017-05-09 17:06:34 +0200960 print
961 duration = time.time() - regrtest_start_time
962 print("Total duration: %s" % format_duration(duration))
963
964 if bad:
965 result = "FAILURE"
966 elif interrupted:
967 result = "INTERRUPTED"
Victor Stinnerd7955b82017-07-03 15:07:53 +0200968 elif fail_env_changed and environment_changed:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200969 result = "ENV CHANGED"
Victor Stinner453a6852017-05-09 17:06:34 +0200970 else:
971 result = "SUCCESS"
972 print("Tests result: %s" % result)
973
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200974 if bad:
975 sys.exit(2)
976 if interrupted:
977 sys.exit(130)
978 if fail_env_changed and environment_changed:
979 sys.exit(3)
980 sys.exit(0)
Barry Warsaw08fca522001-08-20 22:33:46 +0000981
Guido van Rossum152494a1996-12-20 03:12:20 +0000982
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000983STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000984 'test_grammar',
985 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +0000986 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000987 'test_builtin',
988 'test_exceptions',
989 'test_types',
Collin Winter55453142007-03-08 19:58:14 +0000990 'test_unittest',
991 'test_doctest',
992 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000993]
Guido van Rossum152494a1996-12-20 03:12:20 +0000994
Florent Xicluna12d750d2010-03-06 14:38:09 +0000995NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +0000996 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000997 'test_future1',
998 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000999}
Guido van Rossum152494a1996-12-20 03:12:20 +00001000
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001001def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +00001002 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +00001003 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +00001004 names = os.listdir(testdir)
1005 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +00001006 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +00001007 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +00001008 modname, ext = os.path.splitext(name)
1009 if modname[:5] == "test_" and ext == ".py" and modname not in others:
1010 tests.append(modname)
1011 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +00001012
Antoine Pitrou4698d992009-05-31 14:20:14 +00001013def runtest(test, verbose, quiet,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001014 huntrleaks=False, use_resources=None, pgo=False,
Victor Stinnerd2aff602017-05-09 13:57:20 +02001015 failfast=False, match_tests=None, testdir=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001016 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +00001017
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001018 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001019 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +00001020 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +00001021 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +00001022 huntrleaks -- run multiple times to test for leaks; requires a debug
1023 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -07001024 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -07001025 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -07001026
Georg Brandl4045e882009-10-29 20:53:00 +00001027 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +02001028 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +00001029 INTERRUPTED KeyboardInterrupt when run under -j
1030 RESOURCE_DENIED test skipped because resource denied
1031 SKIPPED test skipped for some other reason
1032 ENV_CHANGED test failed because it changed the execution environment
1033 FAILED test failed
1034 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001035 """
Tim Peters06c5c002006-06-05 00:55:26 +00001036
Antoine Pitrou4698d992009-05-31 14:20:14 +00001037 test_support.verbose = verbose # Tell tests to be moderately quiet
1038 if use_resources is not None:
1039 test_support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +00001040 try:
Victor Stinner35d99832017-11-23 18:34:59 +01001041 test_support.set_match_tests(match_tests)
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001042 if failfast:
1043 test_support.failfast = True
Victor Stinnerd2aff602017-05-09 13:57:20 +02001044 return runtest_inner(test, verbose, quiet, huntrleaks, pgo, testdir)
Tim Peterse5584862006-06-09 19:24:44 +00001045 finally:
1046 cleanup_test_droppings(test, verbose)
1047
R. David Murray14dcd432009-10-14 13:58:07 +00001048
1049# Unit tests are supposed to leave the execution environment unchanged
1050# once they complete. But sometimes tests have bugs, especially when
1051# tests fail, and the changes to environment go on to mess up other
1052# tests. This can cause issues with buildbot stability, since tests
1053# are run in random order and so problems may appear to come and go.
1054# There are a few things we can save and restore to mitigate this, and
1055# the following context manager handles this task.
1056
1057class saved_test_environment:
1058 """Save bits of the test environment and restore them at block exit.
1059
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001060 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +00001061 #stuff
1062
1063 Unless quiet is True, a warning is printed to stderr if any of
1064 the saved items was changed by the test. The attribute 'changed'
1065 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001066
1067 If verbose is more than 1, the before and after state of changed
1068 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +00001069 """
1070
1071 changed = False
1072
Brett Cannon95374782015-10-02 16:21:34 -07001073 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +00001074 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001075 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +00001076 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -07001077 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +00001078
1079 # To add things to save and restore, add a name XXX to the resources list
1080 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
1081 # return the value to be saved and compared against a second call to the
1082 # get function when test execution completes. restore_XXX should accept
1083 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001084 # and only if a change in the value is detected.
1085 #
1086 # Note: XXX will have any '.' replaced with '_' characters when determining
1087 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +00001088
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001089 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001090 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001091 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001092 )
R. David Murray14dcd432009-10-14 13:58:07 +00001093
1094 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001095 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001096 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +00001097 sys.argv = saved_argv[1]
1098 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001099
1100 def get_cwd(self):
1101 return os.getcwd()
1102 def restore_cwd(self, saved_cwd):
1103 os.chdir(saved_cwd)
1104
1105 def get_sys_stdout(self):
1106 return sys.stdout
1107 def restore_sys_stdout(self, saved_stdout):
1108 sys.stdout = saved_stdout
1109
1110 def get_sys_stderr(self):
1111 return sys.stderr
1112 def restore_sys_stderr(self, saved_stderr):
1113 sys.stderr = saved_stderr
1114
1115 def get_sys_stdin(self):
1116 return sys.stdin
1117 def restore_sys_stdin(self, saved_stdin):
1118 sys.stdin = saved_stdin
1119
1120 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001121 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +00001122 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +00001123 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +00001124 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +00001125 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +00001126
1127 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001128 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001129 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +00001130 sys.path = saved_path[1]
1131 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001132
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001133 def get_asyncore_socket_map(self):
1134 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001135 # XXX Making a copy keeps objects alive until __exit__ gets called.
1136 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001137 def restore_asyncore_socket_map(self, saved_map):
1138 asyncore = sys.modules.get('asyncore')
1139 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001140 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001141 asyncore.socket_map.update(saved_map)
1142
Vinay Sajipda563bf2012-03-06 20:07:15 +00001143 def get_test_support_TESTFN(self):
1144 if os.path.isfile(test_support.TESTFN):
1145 result = 'f'
1146 elif os.path.isdir(test_support.TESTFN):
1147 result = 'd'
1148 else:
1149 result = None
1150 return result
1151 def restore_test_support_TESTFN(self, saved_value):
1152 if saved_value is None:
1153 if os.path.isfile(test_support.TESTFN):
1154 os.unlink(test_support.TESTFN)
1155 elif os.path.isdir(test_support.TESTFN):
1156 shutil.rmtree(test_support.TESTFN)
1157
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001158 def get_files(self):
1159 return sorted(fn + ('/' if os.path.isdir(fn) else '')
1160 for fn in os.listdir(os.curdir))
1161 def restore_files(self, saved_value):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001162 fn = test_support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001163 if fn not in saved_value and (fn + '/') not in saved_value:
1164 if os.path.isfile(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001165 test_support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001166 elif os.path.isdir(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001167 test_support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001168
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001169 def resource_info(self):
1170 for name in self.resources:
1171 method_suffix = name.replace('.', '_')
1172 get_name = 'get_' + method_suffix
1173 restore_name = 'restore_' + method_suffix
1174 yield name, getattr(self, get_name), getattr(self, restore_name)
1175
R. David Murray14dcd432009-10-14 13:58:07 +00001176 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001177 self.saved_values = dict((name, get()) for name, get, restore
1178 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +00001179 return self
1180
1181 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001182 saved_values = self.saved_values
1183 del self.saved_values
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001184 for name, get, restore in self.resource_info():
1185 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001186 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001187 # Check for changes to the resource's value
1188 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +00001189 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001190 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -07001191 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001192 print >>sys.stderr, (
1193 "Warning -- {} was modified by {}".format(
1194 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +02001195 print >>sys.stderr, (
1196 " Before: {}\n After: {} ".format(
1197 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001198 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
1199 # matters at least as much as value. For others (e.g. cwd),
1200 # identity is irrelevant. Should we add a mechanism to check
1201 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +00001202 return False
1203
1204
Victor Stinner1247e2c2017-08-10 16:45:38 +02001205def post_test_cleanup():
1206 test_support.reap_children()
1207
Victor Stinnerd2aff602017-05-09 13:57:20 +02001208def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None):
Guido van Rossum152494a1996-12-20 03:12:20 +00001209 test_support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +00001210 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001211 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001212 else:
Michael Foord91a2c892010-04-08 00:04:24 +00001213 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +00001214
Antoine Pitrou4698d992009-05-31 14:20:14 +00001215 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +00001216 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +00001217 try:
Tim Peters342ca752001-09-25 19:13:20 +00001218 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +00001219 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001220 if capture_stdout:
1221 sys.stdout = capture_stdout
Victor Stinner24c2c202017-06-16 17:30:03 +02001222 abstest = get_abs_module(testdir, test)
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001223 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -07001224 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +00001225 start_time = time.time()
1226 the_package = __import__(abstest, globals(), locals(), [])
Victor Stinnerd2aff602017-05-09 13:57:20 +02001227 if abstest.startswith('test.'):
1228 the_module = getattr(the_package, test)
1229 else:
1230 the_module = the_package
R. David Murray14dcd432009-10-14 13:58:07 +00001231 # Old tests run to completion simply as a side-effect of
1232 # being imported. For tests based on unittest or doctest,
1233 # explicitly invoke their test_main() function (if it exists).
1234 indirect_test = getattr(the_module, "test_main", None)
1235 if indirect_test is not None:
1236 indirect_test()
1237 if huntrleaks:
1238 refleak = dash_R(the_module, test, indirect_test,
1239 huntrleaks)
1240 test_time = time.time() - start_time
Victor Stinner1247e2c2017-08-10 16:45:38 +02001241 post_test_cleanup()
Guido van Rossum41360a41998-03-26 19:42:58 +00001242 finally:
Tim Peters342ca752001-09-25 19:13:20 +00001243 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +00001244 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001245 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +00001246 print test, "skipped --", msg
1247 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001248 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +00001249 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001250 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +00001251 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001252 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001253 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +00001254 except KeyboardInterrupt:
1255 raise
Guido van Rossum152494a1996-12-20 03:12:20 +00001256 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001257 if not pgo:
1258 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +00001259 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001260 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001261 except:
Guido van Rossum41360a41998-03-26 19:42:58 +00001262 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -07001263 if not pgo:
1264 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +00001265 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -07001266 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +00001267 traceback.print_exc(file=sys.stderr)
1268 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001269 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001270 else:
Collin Winter0f489742009-05-14 23:26:30 +00001271 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +00001272 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +00001273 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +00001274 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001275 # Except in verbose mode, tests should not print anything
1276 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001277 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001278 output = capture_stdout.getvalue()
1279 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001280 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001281 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001282 print "*" * 70
1283 print output
1284 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001285 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001286 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001287
Tim Peterse5584862006-06-09 19:24:44 +00001288def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001289 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001290 import gc
1291
1292 # First kill any dangling references to open files etc.
1293 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001294
1295 # Try to clean up junk commonly left behind. While tests shouldn't leave
1296 # any files or directories behind, when a test fails that can be tedious
1297 # for it to arrange. The consequences can be especially nasty on Windows,
1298 # since if a test leaves a file open, it cannot be deleted by name (while
1299 # there's nothing we can do about that here either, we can display the
1300 # name of the offending test, which is a real help).
1301 for name in (test_support.TESTFN,
1302 "db_home",
1303 ):
1304 if not os.path.exists(name):
1305 continue
1306
1307 if os.path.isdir(name):
1308 kind, nuker = "directory", shutil.rmtree
1309 elif os.path.isfile(name):
1310 kind, nuker = "file", os.unlink
1311 else:
1312 raise SystemError("os.path says %r exists but is neither "
1313 "directory nor file" % name)
1314
1315 if verbose:
1316 print "%r left behind %s %r" % (testname, kind, name)
1317 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001318 # if we have chmod, fix possible permissions problems
1319 # that might prevent cleanup
1320 if (hasattr(os, 'chmod')):
1321 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001322 nuker(name)
1323 except Exception, msg:
1324 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1325 "removed: %s" % (testname, kind, name, msg))
1326
Tim Peters06c5c002006-06-05 00:55:26 +00001327def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001328 """Run a test multiple times, looking for reference leaks.
1329
1330 Returns:
1331 False if the test didn't leak references; True if we detected refleaks.
1332 """
Tim Peters06c5c002006-06-05 00:55:26 +00001333 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001334 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001335
1336 if not hasattr(sys, 'gettotalrefcount'):
1337 raise Exception("Tracking reference leaks requires a debug build "
1338 "of Python")
1339
1340 # Save current values for dash_R_cleanup() to restore.
1341 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001342 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001343 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001344 try:
1345 import zipimport
1346 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001347 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001348 else:
1349 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001350 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001351 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001352 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1353 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1354 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001355 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001356 for obj in abc.__subclasses__() + [abc]:
1357 abcs[obj] = obj._abc_registry.copy()
1358
Tim Peters06c5c002006-06-05 00:55:26 +00001359 if indirect_test:
1360 def run_the_test():
1361 indirect_test()
1362 else:
1363 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001364 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001365
1366 deltas = []
1367 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001368 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001369 repcount = nwarmup + ntracked
1370 print >> sys.stderr, "beginning", repcount, "repetitions"
1371 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001372 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001373 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001374 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001375 run_the_test()
1376 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001377 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001378 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001379 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001380 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001381 print >> sys.stderr
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001382
1383 # bpo-30776: Try to ignore false positives:
1384 #
1385 # [3, 0, 0]
1386 # [0, 1, 0]
1387 # [8, -8, 1]
1388 #
1389 # Expected leaks:
1390 #
1391 # [5, 5, 6]
1392 # [10, 1, 1]
1393 if all(delta >= 1 for delta in deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001394 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1395 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001396 with open(fname, "a") as refrep:
1397 print >> refrep, msg
1398 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001399 return True
1400 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001401
Benjamin Peterson55035792014-02-16 14:51:17 -05001402def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001403 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001404
Tim Peters06c5c002006-06-05 00:55:26 +00001405 # Restore some original values.
1406 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001407 copy_reg.dispatch_table.clear()
1408 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001409 sys.path_importer_cache.clear()
1410 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001411 try:
1412 import zipimport
1413 except ImportError:
1414 pass # Run unmodified on platforms without zipimport support
1415 else:
1416 zipimport._zip_directory_cache.clear()
1417 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001418
Christian Heimes908caac2008-01-27 23:34:59 +00001419 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001420 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001421
Guido van Rossum64c06e32007-11-22 00:55:51 +00001422 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001423 for abc, registry in abcs.items():
1424 abc._abc_registry = registry.copy()
1425 abc._abc_cache.clear()
1426 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001427
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001428 clear_caches()
1429
1430def clear_caches():
1431 import gc
1432
1433 # Clear the warnings registry, so they can be displayed again
1434 for mod in sys.modules.values():
1435 if hasattr(mod, '__warningregistry__'):
1436 del mod.__warningregistry__
1437
Tim Peters06c5c002006-06-05 00:55:26 +00001438 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001439 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001440 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001441 distutils_dir_util = sys.modules['distutils.dir_util']
1442 except KeyError:
1443 pass
1444 else:
1445 distutils_dir_util._path_created.clear()
1446
1447 re.purge()
1448
1449 try:
1450 _strptime = sys.modules['_strptime']
1451 except KeyError:
1452 pass
1453 else:
1454 _strptime._regex_cache.clear()
1455
1456 try:
1457 urlparse = sys.modules['urlparse']
1458 except KeyError:
1459 pass
1460 else:
1461 urlparse.clear_cache()
1462
1463 try:
1464 urllib = sys.modules['urllib']
1465 except KeyError:
1466 pass
1467 else:
1468 urllib.urlcleanup()
1469
1470 try:
1471 urllib2 = sys.modules['urllib2']
1472 except KeyError:
1473 pass
1474 else:
1475 urllib2.install_opener(None)
1476
1477 try:
1478 dircache = sys.modules['dircache']
1479 except KeyError:
1480 pass
1481 else:
1482 dircache.reset()
1483
1484 try:
1485 linecache = sys.modules['linecache']
1486 except KeyError:
1487 pass
1488 else:
1489 linecache.clearcache()
1490
1491 try:
1492 mimetypes = sys.modules['mimetypes']
1493 except KeyError:
1494 pass
1495 else:
1496 mimetypes._default_mime_types()
1497
1498 try:
1499 filecmp = sys.modules['filecmp']
1500 except KeyError:
1501 pass
1502 else:
1503 filecmp._cache.clear()
1504
1505 try:
1506 struct = sys.modules['struct']
1507 except KeyError:
1508 pass
1509 else:
1510 struct._clearcache()
1511
1512 try:
1513 doctest = sys.modules['doctest']
1514 except KeyError:
1515 pass
1516 else:
1517 doctest.master = None
1518
1519 try:
1520 ctypes = sys.modules['ctypes']
1521 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001522 pass
1523 else:
1524 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001525
1526 # Collect cyclic trash.
1527 gc.collect()
1528
Victor Stinner8bb08632017-06-16 12:14:09 +02001529def warm_caches():
1530 """Create explicitly internal singletons which are created on demand
1531 to prevent false positive when hunting reference leaks."""
1532 # char cache
1533 for i in range(256):
1534 chr(i)
1535 # unicode cache
1536 for i in range(256):
1537 unichr(i)
1538 # int cache
1539 list(range(-5, 257))
1540
Florent Xicluna0932dc52010-03-06 08:07:44 +00001541def findtestdir(path=None):
1542 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001543
Florent Xicluna0932dc52010-03-06 08:07:44 +00001544def removepy(names):
1545 if not names:
1546 return
1547 for idx, name in enumerate(names):
1548 basename, ext = os.path.splitext(name)
1549 if ext == '.py':
1550 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001551
Guido van Rossum152494a1996-12-20 03:12:20 +00001552def count(n, word):
1553 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001554 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001555 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001556 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001557
Victor Stinner24c2c202017-06-16 17:30:03 +02001558def printlist(x, width=70, indent=4, file=None):
Tim Peters7c7efe92002-08-23 17:55:54 +00001559 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001560
1561 Optional arg width (default 70) is the maximum line length.
1562 Optional arg indent (default 4) is the number of blanks with which to
1563 begin each line.
1564 """
1565
Tim Petersba78bc42002-07-04 19:45:06 +00001566 from textwrap import fill
1567 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001568 # Print the sorted list: 'x' may be a '--random' list or a set()
Victor Stinner24c2c202017-06-16 17:30:03 +02001569 print >>file, fill(' '.join(str(elt) for elt in sorted(x)), width,
1570 initial_indent=blanks, subsequent_indent=blanks)
1571
1572def get_abs_module(testdir, test):
1573 if test.startswith('test.') or testdir:
1574 return test
1575 else:
1576 # Always import it from the test package
1577 return 'test.' + test
1578
1579def _list_cases(suite):
1580 for test in suite:
1581 if isinstance(test, unittest.TestSuite):
1582 _list_cases(test)
1583 elif isinstance(test, unittest.TestCase):
Victor Stinner35d99832017-11-23 18:34:59 +01001584 if test_support.match_test(test):
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001585 print(test.id())
Victor Stinner24c2c202017-06-16 17:30:03 +02001586
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001587def list_cases(testdir, selected, match_tests):
1588 test_support.verbose = False
Victor Stinner35d99832017-11-23 18:34:59 +01001589 test_support.set_match_tests(match_tests)
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001590
Victor Stinner8767de22017-07-05 10:52:06 +02001591 save_modules = set(sys.modules)
Victor Stinner24c2c202017-06-16 17:30:03 +02001592 skipped = []
1593 for test in selected:
1594 abstest = get_abs_module(testdir, test)
1595 try:
1596 suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
1597 _list_cases(suite)
1598 except unittest.SkipTest:
1599 skipped.append(test)
1600
Victor Stinner8767de22017-07-05 10:52:06 +02001601 unload_test_modules(save_modules)
1602
Victor Stinner24c2c202017-06-16 17:30:03 +02001603 if skipped:
1604 print >>sys.stderr
1605 print >>sys.stderr, count(len(skipped), "test"), "skipped:"
1606 printlist(skipped, file=sys.stderr)
Tim Petersa45da922001-08-12 03:45:50 +00001607
Tim Petersde14a302002-04-01 05:04:46 +00001608# Map sys.platform to a string containing the basenames of tests
1609# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001610#
1611# Special cases:
1612# test_pep277
1613# The _ExpectedSkips constructor adds this to the set of expected
1614# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001615# test_timeout
1616# Controlled by test_timeout.skip_expected. Requires the network
1617# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001618#
1619# Tests that are expected to be skipped everywhere except on one platform
1620# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001621
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001622_expectations = {
1623 'win32':
1624 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001625 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001626 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001627 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001628 test_commands
1629 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001630 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001631 test_dbm
1632 test_dl
1633 test_fcntl
1634 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001635 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001636 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001637 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001638 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001639 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001640 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001641 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001642 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001643 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001644 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001645 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001646 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001647 test_pty
1648 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001649 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001650 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001651 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001652 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001653 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001654 test_wait3
1655 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001656 """,
1657 'linux2':
1658 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001659 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001660 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001661 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001662 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001663 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001664 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001665 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001666 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001667 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001668 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001669 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001670 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001671 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001672 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001673 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001674 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001675 test_openpty
1676 test_pyexpat
1677 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001678 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001679 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001680 'openunix8':
1681 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001682 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001683 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001684 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001685 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001686 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001687 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001688 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001689 test_openpty
1690 test_pyexpat
1691 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001692 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001693 """,
1694 'sco_sv3':
1695 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001696 test_asynchat
1697 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001698 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001699 test_dl
1700 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001701 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001702 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001703 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001704 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001705 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001706 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001707 test_openpty
1708 test_pyexpat
1709 test_queue
1710 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001711 test_sundry
1712 test_thread
1713 test_threaded_import
1714 test_threadedtempfile
1715 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001716 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001717 'riscos':
1718 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001719 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001720 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001721 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001722 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001723 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001724 test_commands
1725 test_crypt
1726 test_dbm
1727 test_dl
1728 test_fcntl
1729 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001730 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001731 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001732 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001733 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001734 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001735 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001736 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001737 test_openpty
1738 test_poll
1739 test_popen2
1740 test_pty
1741 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001742 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001743 test_sundry
1744 test_thread
1745 test_threaded_import
1746 test_threadedtempfile
1747 test_threading
1748 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001749 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001750 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001751 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001752 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001753 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001754 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001755 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001756 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001757 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001758 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001759 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001760 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001761 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001762 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001763 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001764 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001765 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001766 'sunos5':
1767 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001768 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001769 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001770 test_curses
1771 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001772 test_epoll
1773 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001774 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001775 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001776 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001777 test_zipfile
1778 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001779 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001780 'hp-ux11':
1781 """
Skip Montanarob3230212002-03-15 02:54:03 +00001782 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001783 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001784 test_curses
1785 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001786 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001787 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001788 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001789 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001790 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001791 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001792 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001793 test_openpty
1794 test_pyexpat
1795 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001796 test_zipfile
1797 test_zlib
1798 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001799 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001800 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001801 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001802 test_curses
1803 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001804 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001805 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001806 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001807 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001808 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001809 test_mhlib
1810 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001811 test_poll
1812 test_popen2
1813 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001814 """,
Jason Tishler25115942002-12-05 15:18:15 +00001815 'cygwin':
1816 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001817 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001818 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001819 test_curses
1820 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001821 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001822 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001823 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001824 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001825 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001826 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001827 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001828 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001829 'os2emx':
1830 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001831 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001832 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001833 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001834 test_commands
1835 test_curses
1836 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001837 test_epoll
1838 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001839 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001840 test_mhlib
1841 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001842 test_openpty
1843 test_ossaudiodev
1844 test_pty
1845 test_resource
1846 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001847 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001848 'freebsd4':
1849 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001850 test_bsddb
1851 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001852 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001853 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001854 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001855 test_ossaudiodev
1856 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001857 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001858 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001859 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001860 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001861 test_ttk_guionly
1862 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001863 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001864 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001865 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001866 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001867 'aix5':
1868 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001869 test_bsddb
1870 test_bsddb185
1871 test_bsddb3
1872 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001873 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001874 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001875 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001876 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001877 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001878 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001879 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001880 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001881 test_ttk_guionly
1882 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001883 test_zipimport
1884 test_zlib
1885 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001886 'openbsd3':
1887 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001888 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001889 test_bsddb
1890 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001891 test_ctypes
1892 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001893 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001894 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001895 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001896 test_normalization
1897 test_ossaudiodev
1898 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001899 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001900 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001901 test_ttk_guionly
1902 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001903 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001904 """,
Georg Brandl08706872006-06-21 17:53:17 +00001905 'netbsd3':
1906 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001907 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001908 test_bsddb
1909 test_bsddb185
1910 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001911 test_ctypes
1912 test_curses
1913 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001914 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001915 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001916 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001917 test_ossaudiodev
1918 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001919 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001920 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001921 test_ttk_guionly
1922 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001923 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001924 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001925}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001926_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001927_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001928_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001929_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001930
Tim Petersb5b7b782001-08-12 01:20:39 +00001931class _ExpectedSkips:
1932 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001933 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001934 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001935
Tim Peters7c7efe92002-08-23 17:55:54 +00001936 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001937 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001938 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001939 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001940
Georg Brandlb2e208f2007-07-12 09:24:04 +00001941 # expected to be skipped on every platform, even Linux
1942 self.expected.add('test_linuxaudiodev')
1943
Tim Peters2a182db2002-10-09 01:07:11 +00001944 if not os.path.supports_unicode_filenames:
1945 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001946
Neal Norwitz55b61d22003-02-28 19:57:03 +00001947 if test_timeout.skip_expected:
1948 self.expected.add('test_timeout')
1949
Martin v. Löwisfba73692004-11-13 11:13:35 +00001950 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001951 self.expected.add('test_imageop')
1952
Ronald Oussoren9545a232010-05-05 19:09:31 +00001953 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001954 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001955 "test_plistlib", "test_scriptpackages",
1956 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001957 for skip in MAC_ONLY:
1958 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001959 elif len(u'\0'.encode('unicode-internal')) == 4:
1960 self.expected.add("test_macostools")
1961
Tim Petersecd79eb2003-01-29 00:35:32 +00001962
1963 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001964 # test_sqlite is only reliable on Windows where the library
1965 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001966 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001967 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001968 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001969 for skip in WIN_ONLY:
1970 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001971
Brett Cannondc48b742007-05-20 07:09:50 +00001972 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001973 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1974 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001975 for skip in IRIX_ONLY:
1976 self.expected.add(skip)
1977
Georg Brandlb2e208f2007-07-12 09:24:04 +00001978 if sys.platform != 'sunos5':
1979 self.expected.add('test_sunaudiodev')
1980 self.expected.add('test_nis')
1981
Steven Bethardd290b042008-03-21 21:01:18 +00001982 if not sys.py3kwarning:
1983 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001984
Tim Peters7c7efe92002-08-23 17:55:54 +00001985 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001986
1987 def isvalid(self):
1988 "Return true iff _ExpectedSkips knows about the current platform."
1989 return self.valid
1990
1991 def getexpected(self):
1992 """Return set of test names we expect to skip on current platform.
1993
1994 self.isvalid() must be true.
1995 """
1996
1997 assert self.isvalid()
1998 return self.expected
1999
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03002000def main_in_temp_cwd():
2001 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02002002 global TEMPDIR
2003
Florent Xicluna0932dc52010-03-06 08:07:44 +00002004 # When tests are run from the Python build directory, it is best practice
2005 # to keep the test files in a subfolder. It eases the cleanup of leftover
2006 # files using command "make distclean".
2007 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00002008 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
2009 TEMPDIR = os.path.abspath(TEMPDIR)
2010 if not os.path.exists(TEMPDIR):
2011 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002012
2013 # Define a writable temp dir that will be used as cwd while running
2014 # the tests. The name of the dir includes the pid to allow parallel
2015 # testing (see the -j option).
2016 TESTCWD = 'test_python_{}'.format(os.getpid())
2017
Florent Xicluna12735662010-04-23 18:10:12 +00002018 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002019
2020 # Run the tests in a context manager that temporary changes the CWD to a
2021 # temporary and writable directory. If it's not possible to create or
2022 # change the CWD, the original CWD will be used. The original CWD is
2023 # available from test_support.SAVEDCWD.
2024 with test_support.temp_cwd(TESTCWD, quiet=True):
2025 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03002026
2027if __name__ == '__main__':
2028 # findtestdir() gets the dirname out of __file__, so we have to make it
2029 # absolute before changing the working directory.
2030 # For example __file__ may be relative when running trace or profile.
2031 # See issue #9323.
2032 global __file__
2033 __file__ = os.path.abspath(__file__)
2034
2035 # sanity check
2036 assert __file__ == os.path.abspath(sys.argv[0])
2037
2038 main_in_temp_cwd()