blob: 6df8f86d95799ad395d6ab953d0a9595f7ed4a33 [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))
785 continue
786
787 test, stdout, stderr, result = item
R. David Murray7f7eea62009-11-14 15:18:22 +0000788 if test is None:
789 finished += 1
790 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000791 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200792 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200793 ok, test_time = result
794 text = format_test_result(test, ok)
795 if (ok not in (CHILD_ERROR, INTERRUPTED)
796 and test_time >= PROGRESS_MIN_TIME
797 and not pgo):
798 text += ' (%.0f sec)' % test_time
799 running = get_running(workers)
800 if running and not pgo:
801 text += ' -- running: %s' % ', '.join(running)
802 display_progress(test_index, text)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200803
804 if stdout:
805 print stdout
806 sys.stdout.flush()
807 if stderr and not pgo:
808 print >>sys.stderr, stderr
809 sys.stderr.flush()
810
811 if result[0] == INTERRUPTED:
812 assert result[1] == 'KeyboardInterrupt'
813 raise KeyboardInterrupt # What else?
814
Victor Stinner32b1ff92014-09-05 12:12:11 +0200815 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000816 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000817 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000818 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000819 for worker in workers:
820 worker.join()
821 else:
Victor Stinner453a6852017-05-09 17:06:34 +0200822 print("Run tests sequentially")
823
824 previous_test = None
Brett Cannon65918e02015-10-02 16:22:32 -0700825 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000826 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200827 text = test
828 if previous_test:
829 text = '%s -- %s' % (text, previous_test)
830 display_progress(test_index, text)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200831
832 def local_runtest():
833 result = runtest(test, verbose, quiet, huntrleaks, None, pgo,
834 failfast=failfast,
835 match_tests=match_tests,
836 testdir=testdir)
837 accumulate_result(test, result)
838 return result
839
840 start_time = time.time()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000841 if trace:
842 # If we're tracing code coverage, then we don't exit with status
843 # if on a false return value from main.
Victor Stinnera5bb6242017-05-11 11:30:23 +0200844 ns = dict(locals())
845 tracer.runctx('result = local_runtest()',
846 globals=globals(), locals=ns)
847 result = ns['result']
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000848 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000849 try:
Victor Stinnera5bb6242017-05-11 11:30:23 +0200850 result = local_runtest()
Georg Brandl4045e882009-10-29 20:53:00 +0000851 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700852 if not pgo:
853 print "Re-running test %r in verbose mode" % test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200854 runtest(test, True, quiet, huntrleaks, None, pgo,
855 testdir=testdir)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000856 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000857 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000858 break
859 except:
860 raise
Victor Stinner453a6852017-05-09 17:06:34 +0200861
Victor Stinnera5bb6242017-05-11 11:30:23 +0200862 test_time = time.time() - start_time
863 previous_test = format_test_result(test, result[0])
864 if test_time >= PROGRESS_MIN_TIME:
865 previous_test = "%s in %s" % (previous_test,
866 format_duration(test_time))
867 elif result[0] == PASSED:
868 # be quiet: say nothing if the test passed shortly
869 previous_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200870
Antoine Pitrou4698d992009-05-31 14:20:14 +0000871 if findleaks:
872 gc.collect()
873 if gc.garbage:
874 print "Warning: test created", len(gc.garbage),
875 print "uncollectable object(s)."
876 # move the uncollectable objects somewhere so we don't see
877 # them again
878 found_garbage.extend(gc.garbage)
879 del gc.garbage[:]
Victor Stinner8767de22017-07-05 10:52:06 +0200880
881 unload_test_modules(save_modules)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000882
Brett Cannon95374782015-10-02 16:21:34 -0700883 if interrupted and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000884 # print a newline after ^C
885 print
886 print "Test suite interrupted by signal SIGINT."
887 omitted = set(selected) - set(good) - set(bad) - set(skipped)
888 print count(len(omitted), "test"), "omitted:"
889 printlist(omitted)
Brett Cannon95374782015-10-02 16:21:34 -0700890 if good and not quiet and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000891 if not bad and not skipped and not interrupted and len(good) > 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000892 print "All",
893 print count(len(good), "test"), "OK."
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000894 if print_slow:
895 test_times.sort(reverse=True)
896 print "10 slowest tests:"
Victor Stinner453a6852017-05-09 17:06:34 +0200897 for test_time, test in test_times[:10]:
898 print("- %s: %.1fs" % (test, test_time))
Brett Cannon95374782015-10-02 16:21:34 -0700899 if bad and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500900 print count(len(bad), "test"), "failed:"
901 printlist(bad)
Brett Cannon95374782015-10-02 16:21:34 -0700902 if environment_changed and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500903 print "{} altered the execution environment:".format(
904 count(len(environment_changed), "test"))
905 printlist(environment_changed)
Brett Cannon95374782015-10-02 16:21:34 -0700906 if skipped and not quiet and not pgo:
Tim Petersa45da922001-08-12 03:45:50 +0000907 print count(len(skipped), "test"), "skipped:"
908 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000909
Tim Petersb5b7b782001-08-12 01:20:39 +0000910 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000911 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000912 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000913 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000914 if surprise:
915 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000916 "unexpected on", plat + ":"
917 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000918 else:
919 print "Those skips are all expected on", plat + "."
920 else:
921 print "Ask someone to teach regrtest.py about which tests are"
922 print "expected to get skipped on", plat + "."
923
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000924 if verbose2 and bad:
925 print "Re-running failed tests in verbose mode"
Zachary Warea4777f12015-08-04 21:53:21 -0500926 for test in bad[:]:
Tim Peters922dd7d2006-03-10 23:37:10 +0000927 print "Re-running test %r in verbose mode" % test
928 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000929 try:
Neal Norwitz5fe5cf62008-03-18 17:58:02 +0000930 test_support.verbose = True
Victor Stinnerd2aff602017-05-09 13:57:20 +0200931 ok = runtest(test, True, quiet, huntrleaks, None, pgo,
932 testdir=testdir)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000933 except KeyboardInterrupt:
934 # print a newline separate from the ^C
935 print
936 break
Zachary Warea4777f12015-08-04 21:53:21 -0500937 else:
938 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
939 bad.remove(test)
940 else:
941 if bad:
942 print count(len(bad), "test"), "failed again:"
943 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000944
Barry Warsawe11e3de1999-01-28 19:51:51 +0000945 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000946 if next_single_test:
947 with open(filename, 'w') as fp:
948 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000949 else:
950 os.unlink(filename)
951
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000952 if trace:
953 r = tracer.results()
954 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
955
Skip Montanaro0179a182004-06-06 15:53:18 +0000956 if runleaks:
957 os.system("leaks %d" % os.getpid())
958
Victor Stinner453a6852017-05-09 17:06:34 +0200959 print
960 duration = time.time() - regrtest_start_time
961 print("Total duration: %s" % format_duration(duration))
962
963 if bad:
964 result = "FAILURE"
965 elif interrupted:
966 result = "INTERRUPTED"
Victor Stinnerd7955b82017-07-03 15:07:53 +0200967 elif fail_env_changed and environment_changed:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200968 result = "ENV CHANGED"
Victor Stinner453a6852017-05-09 17:06:34 +0200969 else:
970 result = "SUCCESS"
971 print("Tests result: %s" % result)
972
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200973 if bad:
974 sys.exit(2)
975 if interrupted:
976 sys.exit(130)
977 if fail_env_changed and environment_changed:
978 sys.exit(3)
979 sys.exit(0)
Barry Warsaw08fca522001-08-20 22:33:46 +0000980
Guido van Rossum152494a1996-12-20 03:12:20 +0000981
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000982STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000983 'test_grammar',
984 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +0000985 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000986 'test_builtin',
987 'test_exceptions',
988 'test_types',
Collin Winter55453142007-03-08 19:58:14 +0000989 'test_unittest',
990 'test_doctest',
991 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000992]
Guido van Rossum152494a1996-12-20 03:12:20 +0000993
Florent Xicluna12d750d2010-03-06 14:38:09 +0000994NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +0000995 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000996 'test_future1',
997 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000998}
Guido van Rossum152494a1996-12-20 03:12:20 +0000999
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001000def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +00001001 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +00001002 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +00001003 names = os.listdir(testdir)
1004 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +00001005 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +00001006 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +00001007 modname, ext = os.path.splitext(name)
1008 if modname[:5] == "test_" and ext == ".py" and modname not in others:
1009 tests.append(modname)
1010 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +00001011
Antoine Pitrou4698d992009-05-31 14:20:14 +00001012def runtest(test, verbose, quiet,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001013 huntrleaks=False, use_resources=None, pgo=False,
Victor Stinnerd2aff602017-05-09 13:57:20 +02001014 failfast=False, match_tests=None, testdir=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001015 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +00001016
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001017 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001018 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +00001019 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +00001020 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +00001021 huntrleaks -- run multiple times to test for leaks; requires a debug
1022 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -07001023 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -07001024 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -07001025
Georg Brandl4045e882009-10-29 20:53:00 +00001026 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +02001027 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +00001028 INTERRUPTED KeyboardInterrupt when run under -j
1029 RESOURCE_DENIED test skipped because resource denied
1030 SKIPPED test skipped for some other reason
1031 ENV_CHANGED test failed because it changed the execution environment
1032 FAILED test failed
1033 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001034 """
Tim Peters06c5c002006-06-05 00:55:26 +00001035
Antoine Pitrou4698d992009-05-31 14:20:14 +00001036 test_support.verbose = verbose # Tell tests to be moderately quiet
1037 if use_resources is not None:
1038 test_support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +00001039 try:
Victor Stinner35d99832017-11-23 18:34:59 +01001040 test_support.set_match_tests(match_tests)
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001041 if failfast:
1042 test_support.failfast = True
Victor Stinnerd2aff602017-05-09 13:57:20 +02001043 return runtest_inner(test, verbose, quiet, huntrleaks, pgo, testdir)
Tim Peterse5584862006-06-09 19:24:44 +00001044 finally:
1045 cleanup_test_droppings(test, verbose)
1046
R. David Murray14dcd432009-10-14 13:58:07 +00001047
1048# Unit tests are supposed to leave the execution environment unchanged
1049# once they complete. But sometimes tests have bugs, especially when
1050# tests fail, and the changes to environment go on to mess up other
1051# tests. This can cause issues with buildbot stability, since tests
1052# are run in random order and so problems may appear to come and go.
1053# There are a few things we can save and restore to mitigate this, and
1054# the following context manager handles this task.
1055
1056class saved_test_environment:
1057 """Save bits of the test environment and restore them at block exit.
1058
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001059 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +00001060 #stuff
1061
1062 Unless quiet is True, a warning is printed to stderr if any of
1063 the saved items was changed by the test. The attribute 'changed'
1064 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001065
1066 If verbose is more than 1, the before and after state of changed
1067 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +00001068 """
1069
1070 changed = False
1071
Brett Cannon95374782015-10-02 16:21:34 -07001072 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +00001073 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001074 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +00001075 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -07001076 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +00001077
1078 # To add things to save and restore, add a name XXX to the resources list
1079 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
1080 # return the value to be saved and compared against a second call to the
1081 # get function when test execution completes. restore_XXX should accept
1082 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001083 # and only if a change in the value is detected.
1084 #
1085 # Note: XXX will have any '.' replaced with '_' characters when determining
1086 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +00001087
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001088 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001089 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001090 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001091 )
R. David Murray14dcd432009-10-14 13:58:07 +00001092
1093 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001094 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001095 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +00001096 sys.argv = saved_argv[1]
1097 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001098
1099 def get_cwd(self):
1100 return os.getcwd()
1101 def restore_cwd(self, saved_cwd):
1102 os.chdir(saved_cwd)
1103
1104 def get_sys_stdout(self):
1105 return sys.stdout
1106 def restore_sys_stdout(self, saved_stdout):
1107 sys.stdout = saved_stdout
1108
1109 def get_sys_stderr(self):
1110 return sys.stderr
1111 def restore_sys_stderr(self, saved_stderr):
1112 sys.stderr = saved_stderr
1113
1114 def get_sys_stdin(self):
1115 return sys.stdin
1116 def restore_sys_stdin(self, saved_stdin):
1117 sys.stdin = saved_stdin
1118
1119 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001120 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +00001121 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +00001122 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +00001123 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +00001124 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +00001125
1126 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001127 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001128 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +00001129 sys.path = saved_path[1]
1130 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001131
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001132 def get_asyncore_socket_map(self):
1133 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001134 # XXX Making a copy keeps objects alive until __exit__ gets called.
1135 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001136 def restore_asyncore_socket_map(self, saved_map):
1137 asyncore = sys.modules.get('asyncore')
1138 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001139 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001140 asyncore.socket_map.update(saved_map)
1141
Vinay Sajipda563bf2012-03-06 20:07:15 +00001142 def get_test_support_TESTFN(self):
1143 if os.path.isfile(test_support.TESTFN):
1144 result = 'f'
1145 elif os.path.isdir(test_support.TESTFN):
1146 result = 'd'
1147 else:
1148 result = None
1149 return result
1150 def restore_test_support_TESTFN(self, saved_value):
1151 if saved_value is None:
1152 if os.path.isfile(test_support.TESTFN):
1153 os.unlink(test_support.TESTFN)
1154 elif os.path.isdir(test_support.TESTFN):
1155 shutil.rmtree(test_support.TESTFN)
1156
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001157 def get_files(self):
1158 return sorted(fn + ('/' if os.path.isdir(fn) else '')
1159 for fn in os.listdir(os.curdir))
1160 def restore_files(self, saved_value):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001161 fn = test_support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001162 if fn not in saved_value and (fn + '/') not in saved_value:
1163 if os.path.isfile(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001164 test_support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001165 elif os.path.isdir(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001166 test_support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001167
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001168 def resource_info(self):
1169 for name in self.resources:
1170 method_suffix = name.replace('.', '_')
1171 get_name = 'get_' + method_suffix
1172 restore_name = 'restore_' + method_suffix
1173 yield name, getattr(self, get_name), getattr(self, restore_name)
1174
R. David Murray14dcd432009-10-14 13:58:07 +00001175 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001176 self.saved_values = dict((name, get()) for name, get, restore
1177 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +00001178 return self
1179
1180 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001181 saved_values = self.saved_values
1182 del self.saved_values
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001183 for name, get, restore in self.resource_info():
1184 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001185 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001186 # Check for changes to the resource's value
1187 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +00001188 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001189 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -07001190 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001191 print >>sys.stderr, (
1192 "Warning -- {} was modified by {}".format(
1193 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +02001194 print >>sys.stderr, (
1195 " Before: {}\n After: {} ".format(
1196 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001197 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
1198 # matters at least as much as value. For others (e.g. cwd),
1199 # identity is irrelevant. Should we add a mechanism to check
1200 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +00001201 return False
1202
1203
Victor Stinner1247e2c2017-08-10 16:45:38 +02001204def post_test_cleanup():
1205 test_support.reap_children()
1206
Victor Stinnerd2aff602017-05-09 13:57:20 +02001207def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None):
Guido van Rossum152494a1996-12-20 03:12:20 +00001208 test_support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +00001209 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001210 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001211 else:
Michael Foord91a2c892010-04-08 00:04:24 +00001212 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +00001213
Antoine Pitrou4698d992009-05-31 14:20:14 +00001214 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +00001215 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +00001216 try:
Tim Peters342ca752001-09-25 19:13:20 +00001217 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +00001218 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001219 if capture_stdout:
1220 sys.stdout = capture_stdout
Victor Stinner24c2c202017-06-16 17:30:03 +02001221 abstest = get_abs_module(testdir, test)
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001222 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -07001223 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +00001224 start_time = time.time()
1225 the_package = __import__(abstest, globals(), locals(), [])
Victor Stinnerd2aff602017-05-09 13:57:20 +02001226 if abstest.startswith('test.'):
1227 the_module = getattr(the_package, test)
1228 else:
1229 the_module = the_package
R. David Murray14dcd432009-10-14 13:58:07 +00001230 # Old tests run to completion simply as a side-effect of
1231 # being imported. For tests based on unittest or doctest,
1232 # explicitly invoke their test_main() function (if it exists).
1233 indirect_test = getattr(the_module, "test_main", None)
1234 if indirect_test is not None:
1235 indirect_test()
1236 if huntrleaks:
1237 refleak = dash_R(the_module, test, indirect_test,
1238 huntrleaks)
1239 test_time = time.time() - start_time
Victor Stinner1247e2c2017-08-10 16:45:38 +02001240 post_test_cleanup()
Guido van Rossum41360a41998-03-26 19:42:58 +00001241 finally:
Tim Peters342ca752001-09-25 19:13:20 +00001242 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +00001243 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001244 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +00001245 print test, "skipped --", msg
1246 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001247 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +00001248 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001249 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +00001250 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001251 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001252 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +00001253 except KeyboardInterrupt:
1254 raise
Guido van Rossum152494a1996-12-20 03:12:20 +00001255 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001256 if not pgo:
1257 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +00001258 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001259 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001260 except:
Guido van Rossum41360a41998-03-26 19:42:58 +00001261 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -07001262 if not pgo:
1263 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +00001264 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -07001265 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +00001266 traceback.print_exc(file=sys.stderr)
1267 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001268 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001269 else:
Collin Winter0f489742009-05-14 23:26:30 +00001270 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +00001271 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +00001272 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +00001273 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001274 # Except in verbose mode, tests should not print anything
1275 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001276 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001277 output = capture_stdout.getvalue()
1278 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001279 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001280 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001281 print "*" * 70
1282 print output
1283 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001284 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001285 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001286
Tim Peterse5584862006-06-09 19:24:44 +00001287def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001288 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001289 import gc
1290
1291 # First kill any dangling references to open files etc.
1292 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001293
1294 # Try to clean up junk commonly left behind. While tests shouldn't leave
1295 # any files or directories behind, when a test fails that can be tedious
1296 # for it to arrange. The consequences can be especially nasty on Windows,
1297 # since if a test leaves a file open, it cannot be deleted by name (while
1298 # there's nothing we can do about that here either, we can display the
1299 # name of the offending test, which is a real help).
1300 for name in (test_support.TESTFN,
1301 "db_home",
1302 ):
1303 if not os.path.exists(name):
1304 continue
1305
1306 if os.path.isdir(name):
1307 kind, nuker = "directory", shutil.rmtree
1308 elif os.path.isfile(name):
1309 kind, nuker = "file", os.unlink
1310 else:
1311 raise SystemError("os.path says %r exists but is neither "
1312 "directory nor file" % name)
1313
1314 if verbose:
1315 print "%r left behind %s %r" % (testname, kind, name)
1316 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001317 # if we have chmod, fix possible permissions problems
1318 # that might prevent cleanup
1319 if (hasattr(os, 'chmod')):
1320 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001321 nuker(name)
1322 except Exception, msg:
1323 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1324 "removed: %s" % (testname, kind, name, msg))
1325
Tim Peters06c5c002006-06-05 00:55:26 +00001326def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001327 """Run a test multiple times, looking for reference leaks.
1328
1329 Returns:
1330 False if the test didn't leak references; True if we detected refleaks.
1331 """
Tim Peters06c5c002006-06-05 00:55:26 +00001332 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001333 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001334
1335 if not hasattr(sys, 'gettotalrefcount'):
1336 raise Exception("Tracking reference leaks requires a debug build "
1337 "of Python")
1338
1339 # Save current values for dash_R_cleanup() to restore.
1340 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001341 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001342 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001343 try:
1344 import zipimport
1345 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001346 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001347 else:
1348 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001349 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001350 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001351 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1352 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1353 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001354 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001355 for obj in abc.__subclasses__() + [abc]:
1356 abcs[obj] = obj._abc_registry.copy()
1357
Tim Peters06c5c002006-06-05 00:55:26 +00001358 if indirect_test:
1359 def run_the_test():
1360 indirect_test()
1361 else:
1362 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001363 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001364
1365 deltas = []
1366 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001367 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001368 repcount = nwarmup + ntracked
1369 print >> sys.stderr, "beginning", repcount, "repetitions"
1370 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001371 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001372 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001373 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001374 run_the_test()
1375 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001376 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001377 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001378 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001379 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001380 print >> sys.stderr
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001381
1382 # bpo-30776: Try to ignore false positives:
1383 #
1384 # [3, 0, 0]
1385 # [0, 1, 0]
1386 # [8, -8, 1]
1387 #
1388 # Expected leaks:
1389 #
1390 # [5, 5, 6]
1391 # [10, 1, 1]
1392 if all(delta >= 1 for delta in deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001393 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1394 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001395 with open(fname, "a") as refrep:
1396 print >> refrep, msg
1397 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001398 return True
1399 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001400
Benjamin Peterson55035792014-02-16 14:51:17 -05001401def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001402 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001403
Tim Peters06c5c002006-06-05 00:55:26 +00001404 # Restore some original values.
1405 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001406 copy_reg.dispatch_table.clear()
1407 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001408 sys.path_importer_cache.clear()
1409 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001410 try:
1411 import zipimport
1412 except ImportError:
1413 pass # Run unmodified on platforms without zipimport support
1414 else:
1415 zipimport._zip_directory_cache.clear()
1416 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001417
Christian Heimes908caac2008-01-27 23:34:59 +00001418 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001419 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001420
Guido van Rossum64c06e32007-11-22 00:55:51 +00001421 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001422 for abc, registry in abcs.items():
1423 abc._abc_registry = registry.copy()
1424 abc._abc_cache.clear()
1425 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001426
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001427 clear_caches()
1428
1429def clear_caches():
1430 import gc
1431
1432 # Clear the warnings registry, so they can be displayed again
1433 for mod in sys.modules.values():
1434 if hasattr(mod, '__warningregistry__'):
1435 del mod.__warningregistry__
1436
Tim Peters06c5c002006-06-05 00:55:26 +00001437 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001438 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001439 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001440 distutils_dir_util = sys.modules['distutils.dir_util']
1441 except KeyError:
1442 pass
1443 else:
1444 distutils_dir_util._path_created.clear()
1445
1446 re.purge()
1447
1448 try:
1449 _strptime = sys.modules['_strptime']
1450 except KeyError:
1451 pass
1452 else:
1453 _strptime._regex_cache.clear()
1454
1455 try:
1456 urlparse = sys.modules['urlparse']
1457 except KeyError:
1458 pass
1459 else:
1460 urlparse.clear_cache()
1461
1462 try:
1463 urllib = sys.modules['urllib']
1464 except KeyError:
1465 pass
1466 else:
1467 urllib.urlcleanup()
1468
1469 try:
1470 urllib2 = sys.modules['urllib2']
1471 except KeyError:
1472 pass
1473 else:
1474 urllib2.install_opener(None)
1475
1476 try:
1477 dircache = sys.modules['dircache']
1478 except KeyError:
1479 pass
1480 else:
1481 dircache.reset()
1482
1483 try:
1484 linecache = sys.modules['linecache']
1485 except KeyError:
1486 pass
1487 else:
1488 linecache.clearcache()
1489
1490 try:
1491 mimetypes = sys.modules['mimetypes']
1492 except KeyError:
1493 pass
1494 else:
1495 mimetypes._default_mime_types()
1496
1497 try:
1498 filecmp = sys.modules['filecmp']
1499 except KeyError:
1500 pass
1501 else:
1502 filecmp._cache.clear()
1503
1504 try:
1505 struct = sys.modules['struct']
1506 except KeyError:
1507 pass
1508 else:
1509 struct._clearcache()
1510
1511 try:
1512 doctest = sys.modules['doctest']
1513 except KeyError:
1514 pass
1515 else:
1516 doctest.master = None
1517
1518 try:
1519 ctypes = sys.modules['ctypes']
1520 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001521 pass
1522 else:
1523 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001524
1525 # Collect cyclic trash.
1526 gc.collect()
1527
Victor Stinner8bb08632017-06-16 12:14:09 +02001528def warm_caches():
1529 """Create explicitly internal singletons which are created on demand
1530 to prevent false positive when hunting reference leaks."""
1531 # char cache
1532 for i in range(256):
1533 chr(i)
1534 # unicode cache
1535 for i in range(256):
1536 unichr(i)
1537 # int cache
1538 list(range(-5, 257))
1539
Florent Xicluna0932dc52010-03-06 08:07:44 +00001540def findtestdir(path=None):
1541 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001542
Florent Xicluna0932dc52010-03-06 08:07:44 +00001543def removepy(names):
1544 if not names:
1545 return
1546 for idx, name in enumerate(names):
1547 basename, ext = os.path.splitext(name)
1548 if ext == '.py':
1549 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001550
Guido van Rossum152494a1996-12-20 03:12:20 +00001551def count(n, word):
1552 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001553 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001554 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001555 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001556
Victor Stinner24c2c202017-06-16 17:30:03 +02001557def printlist(x, width=70, indent=4, file=None):
Tim Peters7c7efe92002-08-23 17:55:54 +00001558 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001559
1560 Optional arg width (default 70) is the maximum line length.
1561 Optional arg indent (default 4) is the number of blanks with which to
1562 begin each line.
1563 """
1564
Tim Petersba78bc42002-07-04 19:45:06 +00001565 from textwrap import fill
1566 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001567 # Print the sorted list: 'x' may be a '--random' list or a set()
Victor Stinner24c2c202017-06-16 17:30:03 +02001568 print >>file, fill(' '.join(str(elt) for elt in sorted(x)), width,
1569 initial_indent=blanks, subsequent_indent=blanks)
1570
1571def get_abs_module(testdir, test):
1572 if test.startswith('test.') or testdir:
1573 return test
1574 else:
1575 # Always import it from the test package
1576 return 'test.' + test
1577
1578def _list_cases(suite):
1579 for test in suite:
1580 if isinstance(test, unittest.TestSuite):
1581 _list_cases(test)
1582 elif isinstance(test, unittest.TestCase):
Victor Stinner35d99832017-11-23 18:34:59 +01001583 if test_support.match_test(test):
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001584 print(test.id())
Victor Stinner24c2c202017-06-16 17:30:03 +02001585
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001586def list_cases(testdir, selected, match_tests):
1587 test_support.verbose = False
Victor Stinner35d99832017-11-23 18:34:59 +01001588 test_support.set_match_tests(match_tests)
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001589
Victor Stinner8767de22017-07-05 10:52:06 +02001590 save_modules = set(sys.modules)
Victor Stinner24c2c202017-06-16 17:30:03 +02001591 skipped = []
1592 for test in selected:
1593 abstest = get_abs_module(testdir, test)
1594 try:
1595 suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
1596 _list_cases(suite)
1597 except unittest.SkipTest:
1598 skipped.append(test)
1599
Victor Stinner8767de22017-07-05 10:52:06 +02001600 unload_test_modules(save_modules)
1601
Victor Stinner24c2c202017-06-16 17:30:03 +02001602 if skipped:
1603 print >>sys.stderr
1604 print >>sys.stderr, count(len(skipped), "test"), "skipped:"
1605 printlist(skipped, file=sys.stderr)
Tim Petersa45da922001-08-12 03:45:50 +00001606
Tim Petersde14a302002-04-01 05:04:46 +00001607# Map sys.platform to a string containing the basenames of tests
1608# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001609#
1610# Special cases:
1611# test_pep277
1612# The _ExpectedSkips constructor adds this to the set of expected
1613# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001614# test_timeout
1615# Controlled by test_timeout.skip_expected. Requires the network
1616# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001617#
1618# Tests that are expected to be skipped everywhere except on one platform
1619# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001620
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001621_expectations = {
1622 'win32':
1623 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001624 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001625 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001626 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001627 test_commands
1628 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001629 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001630 test_dbm
1631 test_dl
1632 test_fcntl
1633 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001634 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001635 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001636 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001637 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001638 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001639 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001640 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001641 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001642 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001643 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001644 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001645 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001646 test_pty
1647 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001648 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001649 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001650 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001651 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001652 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001653 test_wait3
1654 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001655 """,
1656 'linux2':
1657 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001658 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001659 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001660 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001661 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001662 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001663 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001664 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001665 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001666 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001667 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001668 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001669 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001670 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001671 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001672 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001673 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001674 test_openpty
1675 test_pyexpat
1676 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001677 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001678 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001679 'openunix8':
1680 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001681 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001682 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001683 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001684 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001685 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001686 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001687 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001688 test_openpty
1689 test_pyexpat
1690 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001691 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001692 """,
1693 'sco_sv3':
1694 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001695 test_asynchat
1696 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001697 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001698 test_dl
1699 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001700 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001701 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001702 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001703 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001704 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001705 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001706 test_openpty
1707 test_pyexpat
1708 test_queue
1709 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001710 test_sundry
1711 test_thread
1712 test_threaded_import
1713 test_threadedtempfile
1714 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001715 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001716 'riscos':
1717 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001718 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001719 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001720 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001721 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001722 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001723 test_commands
1724 test_crypt
1725 test_dbm
1726 test_dl
1727 test_fcntl
1728 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001729 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001730 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001731 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001732 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001733 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001734 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001735 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001736 test_openpty
1737 test_poll
1738 test_popen2
1739 test_pty
1740 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001741 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001742 test_sundry
1743 test_thread
1744 test_threaded_import
1745 test_threadedtempfile
1746 test_threading
1747 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001748 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001749 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001750 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001751 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001752 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001753 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001754 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001755 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001756 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001757 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001758 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001759 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001760 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001761 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001762 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001763 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001764 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001765 'sunos5':
1766 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001767 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001768 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001769 test_curses
1770 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001771 test_epoll
1772 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001773 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001774 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001775 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001776 test_zipfile
1777 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001778 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001779 'hp-ux11':
1780 """
Skip Montanarob3230212002-03-15 02:54:03 +00001781 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001782 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001783 test_curses
1784 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001785 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001786 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001787 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001788 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001789 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001790 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001791 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001792 test_openpty
1793 test_pyexpat
1794 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001795 test_zipfile
1796 test_zlib
1797 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001798 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001799 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001800 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001801 test_curses
1802 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001803 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001804 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001805 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001806 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001807 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001808 test_mhlib
1809 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001810 test_poll
1811 test_popen2
1812 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001813 """,
Jason Tishler25115942002-12-05 15:18:15 +00001814 'cygwin':
1815 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001816 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001817 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001818 test_curses
1819 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001820 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001821 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001822 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001823 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001824 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001825 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001826 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001827 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001828 'os2emx':
1829 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001830 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001831 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001832 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001833 test_commands
1834 test_curses
1835 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001836 test_epoll
1837 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001838 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001839 test_mhlib
1840 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001841 test_openpty
1842 test_ossaudiodev
1843 test_pty
1844 test_resource
1845 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001846 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001847 'freebsd4':
1848 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001849 test_bsddb
1850 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001851 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001852 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001853 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001854 test_ossaudiodev
1855 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001856 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001857 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001858 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001859 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001860 test_ttk_guionly
1861 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001862 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001863 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001864 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001865 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001866 'aix5':
1867 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001868 test_bsddb
1869 test_bsddb185
1870 test_bsddb3
1871 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001872 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001873 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001874 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001875 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001876 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001877 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001878 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001879 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001880 test_ttk_guionly
1881 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001882 test_zipimport
1883 test_zlib
1884 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001885 'openbsd3':
1886 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001887 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001888 test_bsddb
1889 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001890 test_ctypes
1891 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001892 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001893 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001894 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001895 test_normalization
1896 test_ossaudiodev
1897 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001898 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001899 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001900 test_ttk_guionly
1901 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001902 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001903 """,
Georg Brandl08706872006-06-21 17:53:17 +00001904 'netbsd3':
1905 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001906 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001907 test_bsddb
1908 test_bsddb185
1909 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001910 test_ctypes
1911 test_curses
1912 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001913 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001914 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001915 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001916 test_ossaudiodev
1917 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001918 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001919 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001920 test_ttk_guionly
1921 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001922 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001923 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001924}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001925_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001926_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001927_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001928_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001929
Tim Petersb5b7b782001-08-12 01:20:39 +00001930class _ExpectedSkips:
1931 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001932 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001933 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001934
Tim Peters7c7efe92002-08-23 17:55:54 +00001935 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001936 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001937 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001938 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001939
Georg Brandlb2e208f2007-07-12 09:24:04 +00001940 # expected to be skipped on every platform, even Linux
1941 self.expected.add('test_linuxaudiodev')
1942
Tim Peters2a182db2002-10-09 01:07:11 +00001943 if not os.path.supports_unicode_filenames:
1944 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001945
Neal Norwitz55b61d22003-02-28 19:57:03 +00001946 if test_timeout.skip_expected:
1947 self.expected.add('test_timeout')
1948
Martin v. Löwisfba73692004-11-13 11:13:35 +00001949 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001950 self.expected.add('test_imageop')
1951
Ronald Oussoren9545a232010-05-05 19:09:31 +00001952 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001953 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001954 "test_plistlib", "test_scriptpackages",
1955 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001956 for skip in MAC_ONLY:
1957 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001958 elif len(u'\0'.encode('unicode-internal')) == 4:
1959 self.expected.add("test_macostools")
1960
Tim Petersecd79eb2003-01-29 00:35:32 +00001961
1962 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001963 # test_sqlite is only reliable on Windows where the library
1964 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001965 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001966 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001967 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001968 for skip in WIN_ONLY:
1969 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001970
Brett Cannondc48b742007-05-20 07:09:50 +00001971 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001972 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1973 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001974 for skip in IRIX_ONLY:
1975 self.expected.add(skip)
1976
Georg Brandlb2e208f2007-07-12 09:24:04 +00001977 if sys.platform != 'sunos5':
1978 self.expected.add('test_sunaudiodev')
1979 self.expected.add('test_nis')
1980
Steven Bethardd290b042008-03-21 21:01:18 +00001981 if not sys.py3kwarning:
1982 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001983
Tim Peters7c7efe92002-08-23 17:55:54 +00001984 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001985
1986 def isvalid(self):
1987 "Return true iff _ExpectedSkips knows about the current platform."
1988 return self.valid
1989
1990 def getexpected(self):
1991 """Return set of test names we expect to skip on current platform.
1992
1993 self.isvalid() must be true.
1994 """
1995
1996 assert self.isvalid()
1997 return self.expected
1998
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001999def main_in_temp_cwd():
2000 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02002001 global TEMPDIR
2002
Florent Xicluna0932dc52010-03-06 08:07:44 +00002003 # When tests are run from the Python build directory, it is best practice
2004 # to keep the test files in a subfolder. It eases the cleanup of leftover
2005 # files using command "make distclean".
2006 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00002007 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
2008 TEMPDIR = os.path.abspath(TEMPDIR)
2009 if not os.path.exists(TEMPDIR):
2010 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002011
2012 # Define a writable temp dir that will be used as cwd while running
2013 # the tests. The name of the dir includes the pid to allow parallel
2014 # testing (see the -j option).
2015 TESTCWD = 'test_python_{}'.format(os.getpid())
2016
Florent Xicluna12735662010-04-23 18:10:12 +00002017 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002018
2019 # Run the tests in a context manager that temporary changes the CWD to a
2020 # temporary and writable directory. If it's not possible to create or
2021 # change the CWD, the original CWD will be used. The original CWD is
2022 # available from test_support.SAVEDCWD.
2023 with test_support.temp_cwd(TESTCWD, quiet=True):
2024 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03002025
2026if __name__ == '__main__':
2027 # findtestdir() gets the dirname out of __file__, so we have to make it
2028 # absolute before changing the working directory.
2029 # For example __file__ may be relative when running trace or profile.
2030 # See issue #9323.
2031 global __file__
2032 __file__ = os.path.abspath(__file__)
2033
2034 # sanity check
2035 assert __file__ == os.path.abspath(sys.argv[0])
2036
2037 main_in_temp_cwd()