blob: e834394ce952373653ec9ba496059abceeee4043 [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
Victor Stinnera30d5872018-06-04 22:25:54 +0200251from test import 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)
Victor Stinnera30d5872018-06-04 22:25:54 +0200279 hours, minutes = divmod(minutes, 60.0)
280 if hours:
281 return '%.0f hour %.0f min' % (hours, minutes)
282 else:
283 return '%.0f min %.0f sec' % (minutes, seconds)
Victor Stinner453a6852017-05-09 17:06:34 +0200284
285
286_FORMAT_TEST_RESULT = {
287 PASSED: '%s passed',
288 FAILED: '%s failed',
289 ENV_CHANGED: '%s failed (env changed)',
290 SKIPPED: '%s skipped',
291 RESOURCE_DENIED: '%s skipped (resource denied)',
292 INTERRUPTED: '%s interrupted',
293 CHILD_ERROR: '%s crashed',
294}
295
296
297def format_test_result(test_name, result):
298 fmt = _FORMAT_TEST_RESULT.get(result, "%s")
299 return fmt % test_name
300
301
Victor Stinner02d42922017-08-21 18:01:11 +0200302def cpu_count():
303 # first try os.sysconf() to prevent loading the big multiprocessing module
304 try:
305 return os.sysconf('SC_NPROCESSORS_ONLN')
306 except (AttributeError, ValueError):
307 pass
308
309 # try multiprocessing.cpu_count()
310 try:
311 import multiprocessing
312 except ImportError:
313 pass
314 else:
315 return multiprocessing.cpu_count()
316
317 return None
318
319
Victor Stinner8767de22017-07-05 10:52:06 +0200320def unload_test_modules(save_modules):
321 # Unload the newly imported modules (best effort finalization)
322 for module in sys.modules.keys():
323 if module not in save_modules and module.startswith("test."):
Victor Stinnera30d5872018-06-04 22:25:54 +0200324 support.unload(module)
Victor Stinner8767de22017-07-05 10:52:06 +0200325
326
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000327def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000328 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000329 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000330 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000331 random_seed=None, use_mp=None, verbose3=False, forever=False,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300332 header=False, pgo=False, failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000333 """Execute a test suite.
334
Thomas Wouters7e474022000-07-16 12:04:32 +0000335 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000336 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000337
338 tests -- a list of strings containing test names (optional)
339 testdir -- the directory in which to look for tests (optional)
340
341 Users other than the Python test suite will certainly want to
342 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000343 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000344
345 If the tests argument is omitted, the tests listed on the
346 command-line will be used. If that's empty, too, then all *.py
347 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000348
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000349 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000350 single, randomize, findleaks, use_resources, trace, coverdir,
351 print_slow, and random_seed) allow programmers calling main()
352 directly to set the values that would normally be set by flags
353 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000354 """
Victor Stinner453a6852017-05-09 17:06:34 +0200355 regrtest_start_time = time.time()
Fred Drake004d5e62000-10-23 17:22:08 +0000356
Victor Stinnera30d5872018-06-04 22:25:54 +0200357 support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000358 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300359 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:PGm:',
Georg Brandl71a015a2009-10-27 20:52:02 +0000360 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Victor Stinner453a6852017-05-09 17:06:34 +0200361 'exclude', 'single', 'slow', 'slowest', 'randomize', 'fromfile=',
362 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000363 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
364 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300365 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo',
Victor Stinner24c2c202017-06-16 17:30:03 +0200366 'failfast', 'match=', 'testdir=', 'list-tests', 'list-cases',
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200367 'coverage', 'matchfile=', 'fail-env-changed'])
Guido van Rossum152494a1996-12-20 03:12:20 +0000368 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000369 usage(2, msg)
370
371 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000372 if random_seed is None:
373 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000374 if use_resources is None:
375 use_resources = []
Victor Stinnerd2aff602017-05-09 13:57:20 +0200376 slaveargs = None
Victor Stinner453a6852017-05-09 17:06:34 +0200377 list_tests = False
Victor Stinner24c2c202017-06-16 17:30:03 +0200378 list_cases_opt = False
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200379 fail_env_changed = False
Guido van Rossum152494a1996-12-20 03:12:20 +0000380 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000381 if o in ('-h', '--help'):
382 usage(0)
383 elif o in ('-v', '--verbose'):
384 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000385 elif o in ('-w', '--verbose2'):
386 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000387 elif o in ('-W', '--verbose3'):
388 verbose3 = True
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300389 elif o in ('-G', '--failfast'):
390 failfast = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000391 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000392 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000393 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000394 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000395 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000396 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000397 single = True
Victor Stinner453a6852017-05-09 17:06:34 +0200398 elif o in ('-S', '--slow', '--slowest'):
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000399 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000400 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000401 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000402 elif o == '--randseed':
403 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000404 elif o in ('-f', '--fromfile'):
405 fromfile = a
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300406 elif o in ('-m', '--match'):
Victor Stinner24c2c202017-06-16 17:30:03 +0200407 if match_tests is None:
408 match_tests = []
409 match_tests.append(a)
410 elif o == '--matchfile':
411 if match_tests is None:
412 match_tests = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200413 filename = os.path.join(support.SAVEDCWD, a)
Victor Stinner24c2c202017-06-16 17:30:03 +0200414 with open(filename) as fp:
415 for line in fp:
416 match_tests.append(line.strip())
Barry Warsaw08fca522001-08-20 22:33:46 +0000417 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000418 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000419 elif o in ('-L', '--runleaks'):
420 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000421 elif o in ('-t', '--threshold'):
422 import gc
423 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000424 elif o in ('-T', '--coverage'):
425 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000426 elif o in ('-D', '--coverdir'):
427 coverdir = os.path.join(os.getcwd(), a)
428 elif o in ('-N', '--nocoverdir'):
429 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000430 elif o in ('-R', '--huntrleaks'):
431 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000432 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000433 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000434 usage(2, '-R takes 2 or 3 colon-separated arguments')
435 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000436 huntrleaks[0] = 5
437 else:
438 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000439 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000440 huntrleaks[1] = 4
441 else:
442 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000443 if len(huntrleaks) == 2 or not huntrleaks[2]:
444 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000445 elif o in ('-M', '--memlimit'):
Victor Stinnera30d5872018-06-04 22:25:54 +0200446 support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000447 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000448 u = [x.lower() for x in a.split(',')]
449 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000450 if r == 'all':
Victor Stinner80ebc432017-07-21 02:12:14 +0200451 use_resources[:] = ALL_RESOURCES
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000452 continue
453 remove = False
454 if r[0] == '-':
455 remove = True
456 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000457 if r not in RESOURCE_NAMES:
458 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000459 if remove:
460 if r in use_resources:
461 use_resources.remove(r)
462 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000463 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000464 elif o in ('-F', '--forever'):
465 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000466 elif o in ('-j', '--multiprocess'):
467 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000468 elif o == '--header':
469 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000470 elif o == '--slaveargs':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200471 slaveargs = a
Brett Cannon95374782015-10-02 16:21:34 -0700472 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700473 pgo = True
Victor Stinner453a6852017-05-09 17:06:34 +0200474 elif o == '--testdir':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200475 testdir = a
Victor Stinner453a6852017-05-09 17:06:34 +0200476 elif o == '--list-tests':
477 list_tests = True
Victor Stinner24c2c202017-06-16 17:30:03 +0200478 elif o == '--list-cases':
479 list_cases_opt = True
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200480 elif o == '--fail-env-changed':
481 fail_env_changed = True
R. David Murrayda826892009-11-15 00:04:32 +0000482 else:
483 print >>sys.stderr, ("No handler for option {}. Please "
484 "report this as a bug at http://bugs.python.org.").format(o)
485 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000486 if single and fromfile:
487 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000488 if use_mp and trace:
489 usage(2, "-T and -j don't go together!")
490 if use_mp and findleaks:
491 usage(2, "-l and -j don't go together!")
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300492 if failfast and not (verbose or verbose3):
493 usage("-G/--failfast needs either -v or -W")
Barry Warsaw08fca522001-08-20 22:33:46 +0000494
Victor Stinnerd2aff602017-05-09 13:57:20 +0200495 if testdir:
496 testdir = os.path.abspath(testdir)
497
498 # Prepend test directory to sys.path, so runtest() will be able
499 # to locate tests
500 sys.path.insert(0, testdir)
501
Victor Stinner30509872017-07-05 09:16:47 +0200502 # Make sure that '' and Lib/test/ are not in sys.path
503 regrtest_dir = os.path.abspath(os.path.dirname(__file__))
504 for path in ('', regrtest_dir):
505 try:
506 sys.path.remove(path)
507 except ValueError:
508 pass
509
Victor Stinnerd2aff602017-05-09 13:57:20 +0200510 if slaveargs is not None:
511 args, kwargs = json.loads(slaveargs)
Victor Stinner8bb08632017-06-16 12:14:09 +0200512 if kwargs['huntrleaks']:
513 warm_caches()
Victor Stinnerd2aff602017-05-09 13:57:20 +0200514 if testdir:
515 kwargs['testdir'] = testdir
516 try:
517 result = runtest(*args, **kwargs)
518 except BaseException, e:
519 result = INTERRUPTED, e.__class__.__name__
520 print # Force a newline (just in case)
521 print json.dumps(result)
522 sys.exit(0)
523
Victor Stinner8bb08632017-06-16 12:14:09 +0200524 if huntrleaks:
525 warm_caches()
526
Guido van Rossum152494a1996-12-20 03:12:20 +0000527 good = []
528 bad = []
529 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000530 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000531 environment_changed = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200532 rerun = []
Florent Xicluna75c66762010-03-30 16:31:14 +0000533 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000534
Neil Schemenauerd569f232000-09-22 15:29:28 +0000535 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000536 try:
537 import gc
538 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000539 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000540 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000541 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000542 # Uncomment the line below to report garbage that is not
543 # freeable by reference counting alone. By default only
544 # garbage that is not collectable by the GC is reported.
545 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000546 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000547
Barry Warsawe11e3de1999-01-28 19:51:51 +0000548 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000549 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000550 try:
551 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000552 next_test = fp.read().strip()
553 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000554 fp.close()
555 except IOError:
556 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000557
558 if fromfile:
559 tests = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200560 fp = open(os.path.join(support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000561 for line in fp:
562 guts = line.split() # assuming no test has whitespace in its name
563 if guts and not guts[0].startswith('#'):
564 tests.extend(guts)
565 fp.close()
566
567 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000568 removepy(args)
569 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000570
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000571 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000572 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000573 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000574 for arg in args:
575 if arg in stdtests:
576 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000577 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000578 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000579
Victor Stinner0fbac702017-08-21 23:57:06 +0200580 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 +0000581 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000582 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000583 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000584 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000585 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000586 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000587 except IndexError:
588 next_single_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200589
590 if list_tests:
591 for name in selected:
592 print(name)
593 sys.exit(0)
594
Victor Stinner24c2c202017-06-16 17:30:03 +0200595 if list_cases_opt:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200596 list_cases(testdir, selected, match_tests)
Victor Stinner24c2c202017-06-16 17:30:03 +0200597 sys.exit(0)
598
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000599 if trace:
600 import trace
Victor Stinnera5bb6242017-05-11 11:30:23 +0200601 tracer = trace.Trace(trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000602
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000603 test_times = []
Victor Stinnera30d5872018-06-04 22:25:54 +0200604 support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800605 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000606
607 def accumulate_result(test, result):
608 ok, test_time = result
Victor Stinnerc991eb22017-05-03 17:28:28 +0200609 if ok not in (CHILD_ERROR, INTERRUPTED):
610 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000611 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000612 good.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200613 elif ok in (FAILED, CHILD_ERROR):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000614 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000615 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000616 environment_changed.append(test)
617 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000618 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000619 elif ok == RESOURCE_DENIED:
620 skipped.append(test)
621 resource_denieds.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200622 elif ok != INTERRUPTED:
623 raise ValueError("invalid test result: %r" % ok)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000624
R. David Murray7f7eea62009-11-14 15:18:22 +0000625 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000626 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000627 while True:
628 for test in tests:
629 yield test
630 if bad:
631 return
Victor Stinnerd7955b82017-07-03 15:07:53 +0200632 if fail_env_changed and environment_changed:
633 return
R. David Murray7f7eea62009-11-14 15:18:22 +0000634 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200635 test_count = ''
636 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000637 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000638 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200639 test_count = '/{}'.format(len(selected))
640 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000641
Victor Stinner453a6852017-05-09 17:06:34 +0200642 def display_progress(test_index, test):
643 # "[ 51/405/1] test_tcl"
Victor Stinner02d42922017-08-21 18:01:11 +0200644 line = "{1:{0}}{2}".format(test_count_width, test_index, test_count)
Victor Stinnera30d5872018-06-04 22:25:54 +0200645 fails = len(bad) + len(environment_changed)
646 if fails and not pgo:
647 line = '{}/{}'.format(line, fails)
Victor Stinner02d42922017-08-21 18:01:11 +0200648 line = '[{}]'.format(line)
649
650 # add the system load prefix: "load avg: 1.80 "
651 if hasattr(os, 'getloadavg'):
652 load_avg_1min = os.getloadavg()[0]
653 line = "load avg: {:.2f} {}".format(load_avg_1min, line)
Victor Stinner453a6852017-05-09 17:06:34 +0200654
655 # add the timestamp prefix: "0:01:05 "
656 test_time = time.time() - regrtest_start_time
657 test_time = datetime.timedelta(seconds=int(test_time))
658 line = "%s %s" % (test_time, line)
659
Victor Stinner02d42922017-08-21 18:01:11 +0200660 # add the test name
661 line = "{} {}".format(line, test)
662
Victor Stinner453a6852017-05-09 17:06:34 +0200663 print(line)
664 sys.stdout.flush()
665
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200666 # For a partial run, we do not need to clutter the output.
Victor Stinner0fbac702017-08-21 23:57:06 +0200667 if display_header:
668 # Print basic platform information
669 print "==", platform.python_implementation(), \
670 " ".join(sys.version.split())
671 print "== ", platform.platform(aliased=True), \
672 "%s-endian" % sys.byteorder
673 print "== ", os.getcwd()
674 ncpu = cpu_count()
675 if ncpu:
676 print "== CPU count:", ncpu
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200677
678 if randomize:
679 random.seed(random_seed)
680 print "Using random seed", random_seed
681 random.shuffle(selected)
682
Antoine Pitrou4698d992009-05-31 14:20:14 +0000683 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000684 try:
685 from threading import Thread
686 except ImportError:
687 print "Multiprocess option requires thread support"
688 sys.exit(2)
Victor Stinner453a6852017-05-09 17:06:34 +0200689 from Queue import Queue, Empty
Georg Brandla4f46e12010-02-07 17:03:15 +0000690 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000691 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000692 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000693 def tests_and_args():
694 for test in tests:
695 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000696 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700697 dict(huntrleaks=huntrleaks, use_resources=use_resources,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300698 failfast=failfast,
699 match_tests=match_tests,
Brett Cannoneb2cb972015-10-16 12:30:20 -0700700 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000701 )
702 yield (test, args_tuple)
703 pending = tests_and_args()
Victor Stinnera30d5872018-06-04 22:25:54 +0200704 opt_args = support.args_from_interpreter_flags()
Antoine Pitroua226c912010-10-14 11:15:50 +0000705 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700706 # required to spawn a new process with PGO flag on/off
707 if pgo:
708 base_cmd = base_cmd + ['--pgo']
Victor Stinner453a6852017-05-09 17:06:34 +0200709
710 class MultiprocessThread(Thread):
711 current_test = None
712 start_time = None
713
714 def runtest(self):
715 try:
716 test, args_tuple = next(pending)
717 except StopIteration:
718 output.put((None, None, None, None))
719 return True
720
721 # -E is needed by some tests, e.g. test_import
722 args = base_cmd + ['--slaveargs', json.dumps(args_tuple)]
723 if testdir:
724 args.extend(('--testdir', testdir))
725 try:
726 self.start_time = time.time()
727 self.current_test = test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200728 popen = Popen(args,
729 stdout=PIPE, stderr=PIPE,
730 universal_newlines=True,
731 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000732 stdout, stderr = popen.communicate()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200733 retcode = popen.wait()
Victor Stinner453a6852017-05-09 17:06:34 +0200734 finally:
735 self.current_test = None
Victor Stinnerc991eb22017-05-03 17:28:28 +0200736
Victor Stinner453a6852017-05-09 17:06:34 +0200737 # Strip last refcount output line if it exists, since it
738 # comes from the shutdown of the interpreter in the subcommand.
739 stderr = debug_output_pat.sub("", stderr)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200740
Victor Stinner453a6852017-05-09 17:06:34 +0200741 if retcode == 0:
742 stdout, _, result = stdout.strip().rpartition("\n")
743 if not result:
744 output.put((None, None, None, None))
745 return True
Victor Stinnerc991eb22017-05-03 17:28:28 +0200746
Victor Stinner453a6852017-05-09 17:06:34 +0200747 result = json.loads(result)
748 else:
749 result = (CHILD_ERROR, "Exit code %s" % retcode)
Victor Stinner228da422017-05-05 10:28:35 +0200750
Victor Stinner453a6852017-05-09 17:06:34 +0200751 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
752 return False
Victor Stinnerc991eb22017-05-03 17:28:28 +0200753
Victor Stinner453a6852017-05-09 17:06:34 +0200754 def run(self):
755 try:
756 stop = False
757 while not stop:
758 stop = self.runtest()
759 except BaseException:
760 output.put((None, None, None, None))
761 raise
762
763 workers = [MultiprocessThread() for i in range(use_mp)]
764 print("Run tests in parallel using %s child processes"
765 % len(workers))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000766 for worker in workers:
767 worker.start()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200768
Victor Stinner453a6852017-05-09 17:06:34 +0200769 def get_running(workers):
770 running = []
771 for worker in workers:
772 current_test = worker.current_test
773 if not current_test:
774 continue
775 dt = time.time() - worker.start_time
776 if dt >= PROGRESS_MIN_TIME:
Victor Stinnera30d5872018-06-04 22:25:54 +0200777 running.append('%s (%s)' % (current_test, format_duration(dt)))
Victor Stinner453a6852017-05-09 17:06:34 +0200778 return running
779
Antoine Pitrou4698d992009-05-31 14:20:14 +0000780 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200781 test_index = 1
Victor Stinner453a6852017-05-09 17:06:34 +0200782 get_timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME)
R. David Murray7f7eea62009-11-14 15:18:22 +0000783 try:
784 while finished < use_mp:
Victor Stinner453a6852017-05-09 17:06:34 +0200785 try:
786 item = output.get(timeout=get_timeout)
787 except Empty:
788 running = get_running(workers)
789 if running and not pgo:
790 print('running: %s' % ', '.join(running))
Victor Stinner1da37ad2018-05-28 13:30:42 +0200791 sys.stdout.flush()
Victor Stinner453a6852017-05-09 17:06:34 +0200792 continue
793
794 test, stdout, stderr, result = item
R. David Murray7f7eea62009-11-14 15:18:22 +0000795 if test is None:
796 finished += 1
797 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000798 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200799 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200800 ok, test_time = result
801 text = format_test_result(test, ok)
802 if (ok not in (CHILD_ERROR, INTERRUPTED)
803 and test_time >= PROGRESS_MIN_TIME
804 and not pgo):
805 text += ' (%.0f sec)' % test_time
806 running = get_running(workers)
807 if running and not pgo:
808 text += ' -- running: %s' % ', '.join(running)
809 display_progress(test_index, text)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200810
811 if stdout:
Victor Stinner1da37ad2018-05-28 13:30:42 +0200812 print(stdout)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200813 sys.stdout.flush()
814 if stderr and not pgo:
815 print >>sys.stderr, stderr
816 sys.stderr.flush()
817
818 if result[0] == INTERRUPTED:
819 assert result[1] == 'KeyboardInterrupt'
820 raise KeyboardInterrupt # What else?
821
Victor Stinner32b1ff92014-09-05 12:12:11 +0200822 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000823 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000824 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000825 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000826 for worker in workers:
827 worker.join()
828 else:
Victor Stinner453a6852017-05-09 17:06:34 +0200829 print("Run tests sequentially")
830
831 previous_test = None
Brett Cannon65918e02015-10-02 16:22:32 -0700832 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000833 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200834 text = test
835 if previous_test:
836 text = '%s -- %s' % (text, previous_test)
837 display_progress(test_index, text)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200838
839 def local_runtest():
840 result = runtest(test, verbose, quiet, huntrleaks, None, pgo,
841 failfast=failfast,
842 match_tests=match_tests,
843 testdir=testdir)
844 accumulate_result(test, result)
845 return result
846
847 start_time = time.time()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000848 if trace:
849 # If we're tracing code coverage, then we don't exit with status
850 # if on a false return value from main.
Victor Stinnera5bb6242017-05-11 11:30:23 +0200851 ns = dict(locals())
852 tracer.runctx('result = local_runtest()',
853 globals=globals(), locals=ns)
854 result = ns['result']
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000855 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000856 try:
Victor Stinnera5bb6242017-05-11 11:30:23 +0200857 result = local_runtest()
Georg Brandl4045e882009-10-29 20:53:00 +0000858 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700859 if not pgo:
860 print "Re-running test %r in verbose mode" % test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200861 runtest(test, True, quiet, huntrleaks, None, pgo,
862 testdir=testdir)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000863 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000864 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000865 break
866 except:
867 raise
Victor Stinner453a6852017-05-09 17:06:34 +0200868
Victor Stinnera5bb6242017-05-11 11:30:23 +0200869 test_time = time.time() - start_time
870 previous_test = format_test_result(test, result[0])
871 if test_time >= PROGRESS_MIN_TIME:
872 previous_test = "%s in %s" % (previous_test,
873 format_duration(test_time))
874 elif result[0] == PASSED:
875 # be quiet: say nothing if the test passed shortly
876 previous_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200877
Antoine Pitrou4698d992009-05-31 14:20:14 +0000878 if findleaks:
879 gc.collect()
880 if gc.garbage:
881 print "Warning: test created", len(gc.garbage),
882 print "uncollectable object(s)."
883 # move the uncollectable objects somewhere so we don't see
884 # them again
885 found_garbage.extend(gc.garbage)
886 del gc.garbage[:]
Victor Stinner8767de22017-07-05 10:52:06 +0200887
888 unload_test_modules(save_modules)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000889
Victor Stinnera30d5872018-06-04 22:25:54 +0200890
891 def get_tests_result():
892 result = []
893 if bad:
894 result.append("FAILURE")
895 elif fail_env_changed and environment_changed:
896 result.append("ENV CHANGED")
897
898 if interrupted:
899 result.append("INTERRUPTED")
900
901 if not result:
902 result.append("SUCCESS")
903
904 return ', '.join(result)
905
906
907 def display_result():
Florent Xicluna75c66762010-03-30 16:31:14 +0000908 # print a newline after ^C
909 print
Victor Stinnera30d5872018-06-04 22:25:54 +0200910 print("== Tests result: %s ==" % get_tests_result())
Barry Warsawe11e3de1999-01-28 19:51:51 +0000911
Victor Stinnera30d5872018-06-04 22:25:54 +0200912 if interrupted and not pgo:
913 print
914 print "Test suite interrupted by signal SIGINT."
915 omitted = set(selected) - set(good) - set(bad) - set(skipped)
916 print count(len(omitted), "test"), "omitted:"
917 printlist(omitted)
918
919 if good and not quiet and not pgo:
920 print
921 if not bad and not skipped and not interrupted and len(good) > 1:
922 print "All",
923 print count(len(good), "test"), "OK."
924
925 if print_slow:
926 test_times.sort(reverse=True)
927 print
928 print "10 slowest tests:"
929 for test_time, test in test_times[:10]:
930 print("- %s: %.1fs" % (test, test_time))
931
932 if bad and not pgo:
933 print
934 print count(len(bad), "test"), "failed:"
935 printlist(bad)
936
937 if environment_changed and not pgo:
938 print
939 print "{} altered the execution environment:".format(
940 count(len(environment_changed), "test"))
941 printlist(environment_changed)
942
943 if skipped and not quiet and not pgo:
944 print
945 print count(len(skipped), "test"), "skipped:"
946 printlist(skipped)
947
948 e = _ExpectedSkips()
949 plat = sys.platform
950 if e.isvalid():
951 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
952 if surprise:
953 print count(len(surprise), "skip"), \
954 "unexpected on", plat + ":"
955 printlist(surprise)
956 else:
957 print "Those skips are all expected on", plat + "."
Tim Petersb5b7b782001-08-12 01:20:39 +0000958 else:
Victor Stinnera30d5872018-06-04 22:25:54 +0200959 print "Ask someone to teach regrtest.py about which tests are"
960 print "expected to get skipped on", plat + "."
961
962 if rerun:
963 print
964 print("%s:" % count(len(rerun), "re-run test"))
965 printlist(rerun)
966
967
968 display_result()
Tim Petersb5b7b782001-08-12 01:20:39 +0000969
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000970 if verbose2 and bad:
Victor Stinnera30d5872018-06-04 22:25:54 +0200971 print
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000972 print "Re-running failed tests in verbose mode"
Victor Stinnera30d5872018-06-04 22:25:54 +0200973 rerun = bad[:]
974 for test in rerun:
Tim Peters922dd7d2006-03-10 23:37:10 +0000975 print "Re-running test %r in verbose mode" % test
976 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000977 try:
Victor Stinnera30d5872018-06-04 22:25:54 +0200978 support.verbose = True
Victor Stinnerd2aff602017-05-09 13:57:20 +0200979 ok = runtest(test, True, quiet, huntrleaks, None, pgo,
Victor Stinnera30d5872018-06-04 22:25:54 +0200980 match_tests=match_tests, testdir=testdir)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000981 except KeyboardInterrupt:
982 # print a newline separate from the ^C
983 print
984 break
Zachary Warea4777f12015-08-04 21:53:21 -0500985 else:
986 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
987 bad.remove(test)
988 else:
989 if bad:
990 print count(len(bad), "test"), "failed again:"
991 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000992
Victor Stinnera30d5872018-06-04 22:25:54 +0200993 display_result()
994
Barry Warsawe11e3de1999-01-28 19:51:51 +0000995 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000996 if next_single_test:
997 with open(filename, 'w') as fp:
998 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000999 else:
1000 os.unlink(filename)
1001
Barry Warsaw3b6d0252004-02-07 22:43:03 +00001002 if trace:
1003 r = tracer.results()
1004 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
1005
Skip Montanaro0179a182004-06-06 15:53:18 +00001006 if runleaks:
1007 os.system("leaks %d" % os.getpid())
1008
Victor Stinner453a6852017-05-09 17:06:34 +02001009 print
1010 duration = time.time() - regrtest_start_time
1011 print("Total duration: %s" % format_duration(duration))
1012
Victor Stinnera30d5872018-06-04 22:25:54 +02001013 print("Tests result: %s" % get_tests_result())
Victor Stinner453a6852017-05-09 17:06:34 +02001014
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001015 if bad:
1016 sys.exit(2)
1017 if interrupted:
1018 sys.exit(130)
1019 if fail_env_changed and environment_changed:
1020 sys.exit(3)
1021 sys.exit(0)
Barry Warsaw08fca522001-08-20 22:33:46 +00001022
Guido van Rossum152494a1996-12-20 03:12:20 +00001023
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001024STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +00001025 'test_grammar',
1026 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +00001027 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +00001028 'test_builtin',
1029 'test_exceptions',
1030 'test_types',
Collin Winter55453142007-03-08 19:58:14 +00001031 'test_unittest',
1032 'test_doctest',
1033 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +00001034]
Guido van Rossum152494a1996-12-20 03:12:20 +00001035
Florent Xicluna12d750d2010-03-06 14:38:09 +00001036NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +00001037 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +00001038 'test_future1',
1039 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +00001040}
Guido van Rossum152494a1996-12-20 03:12:20 +00001041
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001042def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +00001043 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +00001044 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +00001045 names = os.listdir(testdir)
1046 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +00001047 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +00001048 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +00001049 modname, ext = os.path.splitext(name)
1050 if modname[:5] == "test_" and ext == ".py" and modname not in others:
1051 tests.append(modname)
1052 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +00001053
Antoine Pitrou4698d992009-05-31 14:20:14 +00001054def runtest(test, verbose, quiet,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001055 huntrleaks=False, use_resources=None, pgo=False,
Victor Stinnerd2aff602017-05-09 13:57:20 +02001056 failfast=False, match_tests=None, testdir=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001057 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +00001058
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001059 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001060 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +00001061 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +00001062 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +00001063 huntrleaks -- run multiple times to test for leaks; requires a debug
1064 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -07001065 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -07001066 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -07001067
Georg Brandl4045e882009-10-29 20:53:00 +00001068 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +02001069 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +00001070 INTERRUPTED KeyboardInterrupt when run under -j
1071 RESOURCE_DENIED test skipped because resource denied
1072 SKIPPED test skipped for some other reason
1073 ENV_CHANGED test failed because it changed the execution environment
1074 FAILED test failed
1075 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001076 """
Tim Peters06c5c002006-06-05 00:55:26 +00001077
Victor Stinnera30d5872018-06-04 22:25:54 +02001078 support.verbose = verbose # Tell tests to be moderately quiet
Antoine Pitrou4698d992009-05-31 14:20:14 +00001079 if use_resources is not None:
Victor Stinnera30d5872018-06-04 22:25:54 +02001080 support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +00001081 try:
Victor Stinnera30d5872018-06-04 22:25:54 +02001082 support.set_match_tests(match_tests)
1083 # reset the environment_altered flag to detect if a test altered
1084 # the environment
1085 support.environment_altered = False
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001086 if failfast:
Victor Stinnera30d5872018-06-04 22:25:54 +02001087 support.failfast = True
1088
Victor Stinnerd2aff602017-05-09 13:57:20 +02001089 return runtest_inner(test, verbose, quiet, huntrleaks, pgo, testdir)
Tim Peterse5584862006-06-09 19:24:44 +00001090 finally:
1091 cleanup_test_droppings(test, verbose)
1092
R. David Murray14dcd432009-10-14 13:58:07 +00001093
1094# Unit tests are supposed to leave the execution environment unchanged
1095# once they complete. But sometimes tests have bugs, especially when
1096# tests fail, and the changes to environment go on to mess up other
1097# tests. This can cause issues with buildbot stability, since tests
1098# are run in random order and so problems may appear to come and go.
1099# There are a few things we can save and restore to mitigate this, and
1100# the following context manager handles this task.
1101
1102class saved_test_environment:
1103 """Save bits of the test environment and restore them at block exit.
1104
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001105 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +00001106 #stuff
1107
1108 Unless quiet is True, a warning is printed to stderr if any of
1109 the saved items was changed by the test. The attribute 'changed'
1110 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001111
1112 If verbose is more than 1, the before and after state of changed
1113 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +00001114 """
1115
1116 changed = False
1117
Brett Cannon95374782015-10-02 16:21:34 -07001118 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +00001119 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001120 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +00001121 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -07001122 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +00001123
1124 # To add things to save and restore, add a name XXX to the resources list
1125 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
1126 # return the value to be saved and compared against a second call to the
1127 # get function when test execution completes. restore_XXX should accept
1128 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001129 # and only if a change in the value is detected.
1130 #
1131 # Note: XXX will have any '.' replaced with '_' characters when determining
1132 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +00001133
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001134 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001135 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001136 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001137 )
R. David Murray14dcd432009-10-14 13:58:07 +00001138
1139 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001140 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001141 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +00001142 sys.argv = saved_argv[1]
1143 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001144
1145 def get_cwd(self):
1146 return os.getcwd()
1147 def restore_cwd(self, saved_cwd):
1148 os.chdir(saved_cwd)
1149
1150 def get_sys_stdout(self):
1151 return sys.stdout
1152 def restore_sys_stdout(self, saved_stdout):
1153 sys.stdout = saved_stdout
1154
1155 def get_sys_stderr(self):
1156 return sys.stderr
1157 def restore_sys_stderr(self, saved_stderr):
1158 sys.stderr = saved_stderr
1159
1160 def get_sys_stdin(self):
1161 return sys.stdin
1162 def restore_sys_stdin(self, saved_stdin):
1163 sys.stdin = saved_stdin
1164
1165 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001166 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +00001167 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +00001168 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +00001169 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +00001170 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +00001171
1172 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001173 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001174 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +00001175 sys.path = saved_path[1]
1176 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001177
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001178 def get_asyncore_socket_map(self):
1179 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001180 # XXX Making a copy keeps objects alive until __exit__ gets called.
1181 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001182 def restore_asyncore_socket_map(self, saved_map):
1183 asyncore = sys.modules.get('asyncore')
1184 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001185 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001186 asyncore.socket_map.update(saved_map)
1187
Victor Stinnera30d5872018-06-04 22:25:54 +02001188 def get_support_TESTFN(self):
1189 if os.path.isfile(support.TESTFN):
Vinay Sajipda563bf2012-03-06 20:07:15 +00001190 result = 'f'
Victor Stinnera30d5872018-06-04 22:25:54 +02001191 elif os.path.isdir(support.TESTFN):
Vinay Sajipda563bf2012-03-06 20:07:15 +00001192 result = 'd'
1193 else:
1194 result = None
1195 return result
Victor Stinnera30d5872018-06-04 22:25:54 +02001196 def restore_support_TESTFN(self, saved_value):
Vinay Sajipda563bf2012-03-06 20:07:15 +00001197 if saved_value is None:
Victor Stinnera30d5872018-06-04 22:25:54 +02001198 if os.path.isfile(support.TESTFN):
1199 os.unlink(support.TESTFN)
1200 elif os.path.isdir(support.TESTFN):
1201 shutil.rmtree(support.TESTFN)
Vinay Sajipda563bf2012-03-06 20:07:15 +00001202
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001203 def get_files(self):
1204 return sorted(fn + ('/' if os.path.isdir(fn) else '')
1205 for fn in os.listdir(os.curdir))
1206 def restore_files(self, saved_value):
Victor Stinnera30d5872018-06-04 22:25:54 +02001207 fn = support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001208 if fn not in saved_value and (fn + '/') not in saved_value:
1209 if os.path.isfile(fn):
Victor Stinnera30d5872018-06-04 22:25:54 +02001210 support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001211 elif os.path.isdir(fn):
Victor Stinnera30d5872018-06-04 22:25:54 +02001212 support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001213
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001214 def resource_info(self):
1215 for name in self.resources:
1216 method_suffix = name.replace('.', '_')
1217 get_name = 'get_' + method_suffix
1218 restore_name = 'restore_' + method_suffix
1219 yield name, getattr(self, get_name), getattr(self, restore_name)
1220
R. David Murray14dcd432009-10-14 13:58:07 +00001221 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001222 self.saved_values = dict((name, get()) for name, get, restore
1223 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +00001224 return self
1225
1226 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001227 saved_values = self.saved_values
1228 del self.saved_values
Victor Stinnera30d5872018-06-04 22:25:54 +02001229
1230 # Read support.environment_altered, set by support helper functions
1231 self.changed |= support.environment_altered
1232
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001233 for name, get, restore in self.resource_info():
1234 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001235 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001236 # Check for changes to the resource's value
1237 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +00001238 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001239 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -07001240 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001241 print >>sys.stderr, (
1242 "Warning -- {} was modified by {}".format(
1243 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +02001244 print >>sys.stderr, (
1245 " Before: {}\n After: {} ".format(
1246 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001247 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
1248 # matters at least as much as value. For others (e.g. cwd),
1249 # identity is irrelevant. Should we add a mechanism to check
1250 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +00001251 return False
1252
1253
Victor Stinner1247e2c2017-08-10 16:45:38 +02001254def post_test_cleanup():
Victor Stinnera30d5872018-06-04 22:25:54 +02001255 support.reap_children()
Victor Stinner1247e2c2017-08-10 16:45:38 +02001256
Victor Stinnerd2aff602017-05-09 13:57:20 +02001257def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None):
Victor Stinnera30d5872018-06-04 22:25:54 +02001258 support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +00001259 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001260 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001261 else:
Michael Foord91a2c892010-04-08 00:04:24 +00001262 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +00001263
Antoine Pitrou4698d992009-05-31 14:20:14 +00001264 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +00001265 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +00001266 try:
Tim Peters342ca752001-09-25 19:13:20 +00001267 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +00001268 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001269 if capture_stdout:
1270 sys.stdout = capture_stdout
Victor Stinner24c2c202017-06-16 17:30:03 +02001271 abstest = get_abs_module(testdir, test)
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001272 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -07001273 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +00001274 start_time = time.time()
1275 the_package = __import__(abstest, globals(), locals(), [])
Victor Stinnerd2aff602017-05-09 13:57:20 +02001276 if abstest.startswith('test.'):
1277 the_module = getattr(the_package, test)
1278 else:
1279 the_module = the_package
R. David Murray14dcd432009-10-14 13:58:07 +00001280 # Old tests run to completion simply as a side-effect of
1281 # being imported. For tests based on unittest or doctest,
1282 # explicitly invoke their test_main() function (if it exists).
1283 indirect_test = getattr(the_module, "test_main", None)
1284 if indirect_test is not None:
1285 indirect_test()
1286 if huntrleaks:
1287 refleak = dash_R(the_module, test, indirect_test,
1288 huntrleaks)
1289 test_time = time.time() - start_time
Victor Stinner1247e2c2017-08-10 16:45:38 +02001290 post_test_cleanup()
Guido van Rossum41360a41998-03-26 19:42:58 +00001291 finally:
Tim Peters342ca752001-09-25 19:13:20 +00001292 sys.stdout = save_stdout
Victor Stinnera30d5872018-06-04 22:25:54 +02001293 except support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001294 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +00001295 print test, "skipped --", msg
1296 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001297 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +00001298 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001299 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +00001300 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001301 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001302 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +00001303 except KeyboardInterrupt:
1304 raise
Victor Stinnera30d5872018-06-04 22:25:54 +02001305 except support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001306 if not pgo:
1307 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +00001308 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001309 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001310 except:
Guido van Rossum41360a41998-03-26 19:42:58 +00001311 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -07001312 if not pgo:
1313 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +00001314 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -07001315 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +00001316 traceback.print_exc(file=sys.stderr)
1317 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001318 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001319 else:
Collin Winter0f489742009-05-14 23:26:30 +00001320 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +00001321 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +00001322 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +00001323 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001324 # Except in verbose mode, tests should not print anything
1325 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001326 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001327 output = capture_stdout.getvalue()
1328 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001329 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001330 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001331 print "*" * 70
1332 print output
1333 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001334 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001335 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001336
Tim Peterse5584862006-06-09 19:24:44 +00001337def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001338 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001339 import gc
1340
1341 # First kill any dangling references to open files etc.
1342 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001343
1344 # Try to clean up junk commonly left behind. While tests shouldn't leave
1345 # any files or directories behind, when a test fails that can be tedious
1346 # for it to arrange. The consequences can be especially nasty on Windows,
1347 # since if a test leaves a file open, it cannot be deleted by name (while
1348 # there's nothing we can do about that here either, we can display the
1349 # name of the offending test, which is a real help).
Victor Stinnera30d5872018-06-04 22:25:54 +02001350 for name in (support.TESTFN,
Tim Peterse5584862006-06-09 19:24:44 +00001351 "db_home",
1352 ):
1353 if not os.path.exists(name):
1354 continue
1355
1356 if os.path.isdir(name):
1357 kind, nuker = "directory", shutil.rmtree
1358 elif os.path.isfile(name):
1359 kind, nuker = "file", os.unlink
1360 else:
1361 raise SystemError("os.path says %r exists but is neither "
1362 "directory nor file" % name)
1363
1364 if verbose:
1365 print "%r left behind %s %r" % (testname, kind, name)
1366 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001367 # if we have chmod, fix possible permissions problems
1368 # that might prevent cleanup
1369 if (hasattr(os, 'chmod')):
1370 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001371 nuker(name)
1372 except Exception, msg:
1373 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1374 "removed: %s" % (testname, kind, name, msg))
1375
Tim Peters06c5c002006-06-05 00:55:26 +00001376def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001377 """Run a test multiple times, looking for reference leaks.
1378
1379 Returns:
1380 False if the test didn't leak references; True if we detected refleaks.
1381 """
Tim Peters06c5c002006-06-05 00:55:26 +00001382 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001383 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001384
1385 if not hasattr(sys, 'gettotalrefcount'):
1386 raise Exception("Tracking reference leaks requires a debug build "
1387 "of Python")
1388
1389 # Save current values for dash_R_cleanup() to restore.
1390 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001391 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001392 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001393 try:
1394 import zipimport
1395 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001396 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001397 else:
1398 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001399 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001400 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001401 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1402 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1403 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001404 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001405 for obj in abc.__subclasses__() + [abc]:
1406 abcs[obj] = obj._abc_registry.copy()
1407
Tim Peters06c5c002006-06-05 00:55:26 +00001408 if indirect_test:
1409 def run_the_test():
1410 indirect_test()
1411 else:
1412 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001413 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001414
1415 deltas = []
1416 nwarmup, ntracked, fname = huntrleaks
Victor Stinnera30d5872018-06-04 22:25:54 +02001417 fname = os.path.join(support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001418 repcount = nwarmup + ntracked
1419 print >> sys.stderr, "beginning", repcount, "repetitions"
1420 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001421 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001422 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001423 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001424 run_the_test()
1425 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001426 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001427 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001428 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001429 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001430 print >> sys.stderr
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001431
1432 # bpo-30776: Try to ignore false positives:
1433 #
1434 # [3, 0, 0]
1435 # [0, 1, 0]
1436 # [8, -8, 1]
1437 #
1438 # Expected leaks:
1439 #
1440 # [5, 5, 6]
1441 # [10, 1, 1]
1442 if all(delta >= 1 for delta in deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001443 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1444 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001445 with open(fname, "a") as refrep:
1446 print >> refrep, msg
1447 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001448 return True
1449 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001450
Benjamin Peterson55035792014-02-16 14:51:17 -05001451def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001452 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001453
Tim Peters06c5c002006-06-05 00:55:26 +00001454 # Restore some original values.
1455 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001456 copy_reg.dispatch_table.clear()
1457 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001458 sys.path_importer_cache.clear()
1459 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001460 try:
1461 import zipimport
1462 except ImportError:
1463 pass # Run unmodified on platforms without zipimport support
1464 else:
1465 zipimport._zip_directory_cache.clear()
1466 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001467
Christian Heimes908caac2008-01-27 23:34:59 +00001468 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001469 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001470
Guido van Rossum64c06e32007-11-22 00:55:51 +00001471 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001472 for abc, registry in abcs.items():
1473 abc._abc_registry = registry.copy()
1474 abc._abc_cache.clear()
1475 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001476
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001477 clear_caches()
1478
1479def clear_caches():
1480 import gc
1481
1482 # Clear the warnings registry, so they can be displayed again
1483 for mod in sys.modules.values():
1484 if hasattr(mod, '__warningregistry__'):
1485 del mod.__warningregistry__
1486
Tim Peters06c5c002006-06-05 00:55:26 +00001487 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001488 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001489 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001490 distutils_dir_util = sys.modules['distutils.dir_util']
1491 except KeyError:
1492 pass
1493 else:
1494 distutils_dir_util._path_created.clear()
1495
1496 re.purge()
1497
1498 try:
1499 _strptime = sys.modules['_strptime']
1500 except KeyError:
1501 pass
1502 else:
1503 _strptime._regex_cache.clear()
1504
1505 try:
1506 urlparse = sys.modules['urlparse']
1507 except KeyError:
1508 pass
1509 else:
1510 urlparse.clear_cache()
1511
1512 try:
1513 urllib = sys.modules['urllib']
1514 except KeyError:
1515 pass
1516 else:
1517 urllib.urlcleanup()
1518
1519 try:
1520 urllib2 = sys.modules['urllib2']
1521 except KeyError:
1522 pass
1523 else:
1524 urllib2.install_opener(None)
1525
1526 try:
1527 dircache = sys.modules['dircache']
1528 except KeyError:
1529 pass
1530 else:
1531 dircache.reset()
1532
1533 try:
1534 linecache = sys.modules['linecache']
1535 except KeyError:
1536 pass
1537 else:
1538 linecache.clearcache()
1539
1540 try:
1541 mimetypes = sys.modules['mimetypes']
1542 except KeyError:
1543 pass
1544 else:
1545 mimetypes._default_mime_types()
1546
1547 try:
1548 filecmp = sys.modules['filecmp']
1549 except KeyError:
1550 pass
1551 else:
1552 filecmp._cache.clear()
1553
1554 try:
1555 struct = sys.modules['struct']
1556 except KeyError:
1557 pass
1558 else:
1559 struct._clearcache()
1560
1561 try:
1562 doctest = sys.modules['doctest']
1563 except KeyError:
1564 pass
1565 else:
1566 doctest.master = None
1567
1568 try:
1569 ctypes = sys.modules['ctypes']
1570 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001571 pass
1572 else:
1573 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001574
1575 # Collect cyclic trash.
1576 gc.collect()
1577
Victor Stinner8bb08632017-06-16 12:14:09 +02001578def warm_caches():
1579 """Create explicitly internal singletons which are created on demand
1580 to prevent false positive when hunting reference leaks."""
1581 # char cache
1582 for i in range(256):
1583 chr(i)
1584 # unicode cache
1585 for i in range(256):
1586 unichr(i)
1587 # int cache
1588 list(range(-5, 257))
1589
Florent Xicluna0932dc52010-03-06 08:07:44 +00001590def findtestdir(path=None):
1591 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001592
Florent Xicluna0932dc52010-03-06 08:07:44 +00001593def removepy(names):
1594 if not names:
1595 return
1596 for idx, name in enumerate(names):
1597 basename, ext = os.path.splitext(name)
1598 if ext == '.py':
1599 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001600
Guido van Rossum152494a1996-12-20 03:12:20 +00001601def count(n, word):
1602 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001603 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001604 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001605 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001606
Victor Stinner24c2c202017-06-16 17:30:03 +02001607def printlist(x, width=70, indent=4, file=None):
Tim Peters7c7efe92002-08-23 17:55:54 +00001608 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001609
1610 Optional arg width (default 70) is the maximum line length.
1611 Optional arg indent (default 4) is the number of blanks with which to
1612 begin each line.
1613 """
1614
Tim Petersba78bc42002-07-04 19:45:06 +00001615 from textwrap import fill
1616 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001617 # Print the sorted list: 'x' may be a '--random' list or a set()
Victor Stinner24c2c202017-06-16 17:30:03 +02001618 print >>file, fill(' '.join(str(elt) for elt in sorted(x)), width,
1619 initial_indent=blanks, subsequent_indent=blanks)
1620
1621def get_abs_module(testdir, test):
1622 if test.startswith('test.') or testdir:
1623 return test
1624 else:
1625 # Always import it from the test package
1626 return 'test.' + test
1627
1628def _list_cases(suite):
1629 for test in suite:
1630 if isinstance(test, unittest.TestSuite):
1631 _list_cases(test)
1632 elif isinstance(test, unittest.TestCase):
Victor Stinnera30d5872018-06-04 22:25:54 +02001633 if support.match_test(test):
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001634 print(test.id())
Victor Stinner24c2c202017-06-16 17:30:03 +02001635
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001636def list_cases(testdir, selected, match_tests):
Victor Stinnera30d5872018-06-04 22:25:54 +02001637 support.verbose = False
1638 support.set_match_tests(match_tests)
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001639
Victor Stinner8767de22017-07-05 10:52:06 +02001640 save_modules = set(sys.modules)
Victor Stinner24c2c202017-06-16 17:30:03 +02001641 skipped = []
1642 for test in selected:
1643 abstest = get_abs_module(testdir, test)
1644 try:
1645 suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
1646 _list_cases(suite)
1647 except unittest.SkipTest:
1648 skipped.append(test)
1649
Victor Stinner8767de22017-07-05 10:52:06 +02001650 unload_test_modules(save_modules)
1651
Victor Stinner24c2c202017-06-16 17:30:03 +02001652 if skipped:
1653 print >>sys.stderr
1654 print >>sys.stderr, count(len(skipped), "test"), "skipped:"
1655 printlist(skipped, file=sys.stderr)
Tim Petersa45da922001-08-12 03:45:50 +00001656
Tim Petersde14a302002-04-01 05:04:46 +00001657# Map sys.platform to a string containing the basenames of tests
1658# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001659#
1660# Special cases:
1661# test_pep277
1662# The _ExpectedSkips constructor adds this to the set of expected
1663# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001664# test_timeout
1665# Controlled by test_timeout.skip_expected. Requires the network
1666# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001667#
1668# Tests that are expected to be skipped everywhere except on one platform
1669# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001670
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001671_expectations = {
1672 'win32':
1673 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001674 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001675 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001676 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001677 test_commands
1678 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001679 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001680 test_dbm
1681 test_dl
1682 test_fcntl
1683 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001684 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001685 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001686 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001687 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001688 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001689 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001690 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001691 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001692 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001693 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001694 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001695 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001696 test_pty
1697 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001698 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001699 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001700 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001701 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001702 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001703 test_wait3
1704 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001705 """,
1706 'linux2':
1707 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001708 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001709 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001710 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001711 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001712 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001713 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001714 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001715 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001716 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001717 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001718 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001719 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001720 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001721 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001722 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001723 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001724 test_openpty
1725 test_pyexpat
1726 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001727 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001728 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001729 'openunix8':
1730 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001731 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001732 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001733 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001734 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001735 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001736 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001737 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001738 test_openpty
1739 test_pyexpat
1740 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001741 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001742 """,
1743 'sco_sv3':
1744 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001745 test_asynchat
1746 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001747 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001748 test_dl
1749 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001750 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001751 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001752 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001753 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001754 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001755 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001756 test_openpty
1757 test_pyexpat
1758 test_queue
1759 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001760 test_sundry
1761 test_thread
1762 test_threaded_import
1763 test_threadedtempfile
1764 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001765 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001766 'riscos':
1767 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001768 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001769 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001770 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001771 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001772 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001773 test_commands
1774 test_crypt
1775 test_dbm
1776 test_dl
1777 test_fcntl
1778 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001779 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001780 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001781 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001782 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001783 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001784 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001785 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001786 test_openpty
1787 test_poll
1788 test_popen2
1789 test_pty
1790 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001791 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001792 test_sundry
1793 test_thread
1794 test_threaded_import
1795 test_threadedtempfile
1796 test_threading
1797 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001798 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001799 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001800 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001801 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001802 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001803 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001804 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001805 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001806 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001807 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001808 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001809 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001810 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001811 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001812 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001813 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001814 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001815 'sunos5':
1816 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001817 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001818 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001819 test_curses
1820 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001821 test_epoll
1822 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001823 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001824 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001825 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001826 test_zipfile
1827 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001828 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001829 'hp-ux11':
1830 """
Skip Montanarob3230212002-03-15 02:54:03 +00001831 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001832 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001833 test_curses
1834 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001835 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001836 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001837 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001838 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001839 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001840 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001841 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001842 test_openpty
1843 test_pyexpat
1844 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001845 test_zipfile
1846 test_zlib
1847 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001848 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001849 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001850 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001851 test_curses
1852 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001853 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001854 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001855 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001856 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001857 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001858 test_mhlib
1859 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001860 test_poll
1861 test_popen2
1862 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001863 """,
Jason Tishler25115942002-12-05 15:18:15 +00001864 'cygwin':
1865 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001866 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001867 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001868 test_curses
1869 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001870 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001871 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001872 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001873 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001874 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001875 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001876 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001877 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001878 'os2emx':
1879 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001880 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001881 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001882 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001883 test_commands
1884 test_curses
1885 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001886 test_epoll
1887 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001888 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001889 test_mhlib
1890 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001891 test_openpty
1892 test_ossaudiodev
1893 test_pty
1894 test_resource
1895 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001896 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001897 'freebsd4':
1898 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001899 test_bsddb
1900 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001901 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001902 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001903 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001904 test_ossaudiodev
1905 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001906 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001907 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001908 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001909 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001910 test_ttk_guionly
1911 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001912 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001913 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001914 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001915 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001916 'aix5':
1917 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001918 test_bsddb
1919 test_bsddb185
1920 test_bsddb3
1921 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001922 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001923 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001924 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001925 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001926 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001927 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001928 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001929 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001930 test_ttk_guionly
1931 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001932 test_zipimport
1933 test_zlib
1934 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001935 'openbsd3':
1936 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001937 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001938 test_bsddb
1939 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001940 test_ctypes
1941 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001942 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001943 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001944 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001945 test_normalization
1946 test_ossaudiodev
1947 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001948 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001949 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001950 test_ttk_guionly
1951 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001952 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001953 """,
Georg Brandl08706872006-06-21 17:53:17 +00001954 'netbsd3':
1955 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001956 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001957 test_bsddb
1958 test_bsddb185
1959 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001960 test_ctypes
1961 test_curses
1962 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001963 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001964 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001965 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001966 test_ossaudiodev
1967 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001968 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001969 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001970 test_ttk_guionly
1971 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001972 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001973 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001974}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001975_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001976_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001977_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001978_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001979
Tim Petersb5b7b782001-08-12 01:20:39 +00001980class _ExpectedSkips:
1981 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001982 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001983 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001984
Tim Peters7c7efe92002-08-23 17:55:54 +00001985 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001986 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001987 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001988 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001989
Georg Brandlb2e208f2007-07-12 09:24:04 +00001990 # expected to be skipped on every platform, even Linux
1991 self.expected.add('test_linuxaudiodev')
1992
Tim Peters2a182db2002-10-09 01:07:11 +00001993 if not os.path.supports_unicode_filenames:
1994 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001995
Neal Norwitz55b61d22003-02-28 19:57:03 +00001996 if test_timeout.skip_expected:
1997 self.expected.add('test_timeout')
1998
Martin v. Löwisfba73692004-11-13 11:13:35 +00001999 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00002000 self.expected.add('test_imageop')
2001
Ronald Oussoren9545a232010-05-05 19:09:31 +00002002 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00002003 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00002004 "test_plistlib", "test_scriptpackages",
2005 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00002006 for skip in MAC_ONLY:
2007 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00002008 elif len(u'\0'.encode('unicode-internal')) == 4:
2009 self.expected.add("test_macostools")
2010
Tim Petersecd79eb2003-01-29 00:35:32 +00002011
2012 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00002013 # test_sqlite is only reliable on Windows where the library
2014 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00002015 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00002016 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02002017 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00002018 for skip in WIN_ONLY:
2019 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00002020
Brett Cannondc48b742007-05-20 07:09:50 +00002021 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00002022 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
2023 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00002024 for skip in IRIX_ONLY:
2025 self.expected.add(skip)
2026
Georg Brandlb2e208f2007-07-12 09:24:04 +00002027 if sys.platform != 'sunos5':
2028 self.expected.add('test_sunaudiodev')
2029 self.expected.add('test_nis')
2030
Steven Bethardd290b042008-03-21 21:01:18 +00002031 if not sys.py3kwarning:
2032 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00002033
Tim Peters7c7efe92002-08-23 17:55:54 +00002034 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00002035
2036 def isvalid(self):
2037 "Return true iff _ExpectedSkips knows about the current platform."
2038 return self.valid
2039
2040 def getexpected(self):
2041 """Return set of test names we expect to skip on current platform.
2042
2043 self.isvalid() must be true.
2044 """
2045
2046 assert self.isvalid()
2047 return self.expected
2048
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03002049def main_in_temp_cwd():
2050 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02002051 global TEMPDIR
2052
Florent Xicluna0932dc52010-03-06 08:07:44 +00002053 # When tests are run from the Python build directory, it is best practice
2054 # to keep the test files in a subfolder. It eases the cleanup of leftover
2055 # files using command "make distclean".
2056 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00002057 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
2058 TEMPDIR = os.path.abspath(TEMPDIR)
2059 if not os.path.exists(TEMPDIR):
2060 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002061
2062 # Define a writable temp dir that will be used as cwd while running
2063 # the tests. The name of the dir includes the pid to allow parallel
2064 # testing (see the -j option).
2065 TESTCWD = 'test_python_{}'.format(os.getpid())
2066
Florent Xicluna12735662010-04-23 18:10:12 +00002067 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002068
2069 # Run the tests in a context manager that temporary changes the CWD to a
2070 # temporary and writable directory. If it's not possible to create or
2071 # change the CWD, the original CWD will be used. The original CWD is
Victor Stinnera30d5872018-06-04 22:25:54 +02002072 # available from support.SAVEDCWD.
2073 with support.temp_cwd(TESTCWD, quiet=True):
Ezio Melotti8f6a2872010-02-10 21:40:33 +00002074 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03002075
2076if __name__ == '__main__':
2077 # findtestdir() gets the dirname out of __file__, so we have to make it
2078 # absolute before changing the working directory.
2079 # For example __file__ may be relative when running trace or profile.
2080 # See issue #9323.
2081 global __file__
2082 __file__ = os.path.abspath(__file__)
2083
2084 # sanity check
2085 assert __file__ == os.path.abspath(sys.argv[0])
2086
2087 main_in_temp_cwd()