blob: 6852860887ce98386ade654e0cd82faaf9e1345d [file] [log] [blame]
Guido van Rossum152494a1996-12-20 03:12:20 +00001#! /usr/bin/env python
2
R. David Murray3bfa8832010-04-26 16:54:57 +00003"""
4Usage:
Guido van Rossum152494a1996-12-20 03:12:20 +00005
R. David Murray3bfa8832010-04-26 16:54:57 +00006python -m test.regrtest [options] [test_name1 [test_name2 ...]]
7python path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
Guido van Rossum152494a1996-12-20 03:12:20 +00008
R. David Murray3bfa8832010-04-26 16:54:57 +00009
10If no arguments or options are provided, finds all files matching
11the pattern "test_*" in the Lib/test subdirectory and runs
12them in alphabetical order (but see -M and -u, below, for exceptions).
13
14For more rigorous testing, it is useful to use the following
15command line:
16
17python -E -tt -Wd -3 -m test.regrtest [options] [test_name1 ...]
18
19
20Options:
Guido van Rossum152494a1996-12-20 03:12:20 +000021
Georg Brandl83191702009-10-27 20:55:44 +000022-h/--help -- print this text and exit
23
24Verbosity
25
26-v/--verbose -- run tests in verbose mode with output to stdout
27-w/--verbose2 -- re-run failed tests in verbose mode
28-W/--verbose3 -- re-run failed tests in verbose mode immediately
R. David Murray3bfa8832010-04-26 16:54:57 +000029-q/--quiet -- no output unless one or more tests fail
Victor Stinner453a6852017-05-09 17:06:34 +020030-S/--slowest -- print the slowest 10 tests
Antoine Pitrou8c688be2011-01-03 20:49:01 +000031 --header -- print header with interpreter info
Georg Brandl83191702009-10-27 20:55:44 +000032
33Selecting tests
34
Chris Jerdonek3684c792012-12-27 18:14:01 -080035-r/--randomize -- randomize test execution order (see below)
Antoine Pitrou8c688be2011-01-03 20:49:01 +000036 --randseed -- pass a random seed to reproduce a previous random run
Georg Brandl83191702009-10-27 20:55:44 +000037-f/--fromfile -- read names of tests to run from a file (see below)
38-x/--exclude -- arguments are tests to *exclude*
R. David Murray3bfa8832010-04-26 16:54:57 +000039-s/--single -- single step through a set of tests (see below)
Serhiy Storchaka74f0db82017-05-04 00:23:50 +030040-m/--match PAT -- match test cases and methods with glob pattern PAT
Victor Stinner24c2c202017-06-16 17:30:03 +020041--matchfile FILENAME -- filters tests using a text file, one pattern per line
Serhiy Storchaka74f0db82017-05-04 00:23:50 +030042-G/--failfast -- fail as soon as a test fails (only with -v or -W)
Georg Brandl83191702009-10-27 20:55:44 +000043-u/--use RES1,RES2,...
44 -- specify which special resource intensive tests to run
45-M/--memlimit LIMIT
46 -- run very large memory-consuming tests
47
48Special runs
49
50-l/--findleaks -- if GC is available detect tests that leak memory
51-L/--runleaks -- run the leaks(1) command just before exit
52-R/--huntrleaks RUNCOUNTS
53 -- search for reference leaks (needs debug build, v. slow)
54-j/--multiprocess PROCESSES
55 -- run PROCESSES processes at once
R. David Murray3bfa8832010-04-26 16:54:57 +000056-T/--coverage -- turn on code coverage tracing using the trace module
Georg Brandl83191702009-10-27 20:55:44 +000057-D/--coverdir DIRECTORY
58 -- Directory where coverage files are put
59-N/--nocoverdir -- Put coverage files alongside modules
60-t/--threshold THRESHOLD
61 -- call gc.set_threshold(THRESHOLD)
R. David Murray3bfa8832010-04-26 16:54:57 +000062-F/--forever -- run the specified tests in a loop, until an error happens
Brett Cannon95374782015-10-02 16:21:34 -070063-P/--pgo -- enable Profile Guided Optimization training
Victor Stinnerd2aff602017-05-09 13:57:20 +020064--testdir -- execute test files in the specified directory
65 (instead of the Python stdlib test suite)
Victor Stinner453a6852017-05-09 17:06:34 +020066--list-tests -- only write the name of tests that will be run,
67 don't execute them
Victor Stinner24c2c202017-06-16 17:30:03 +020068--list-cases -- only write the name of test cases that will be run,
69 don't execute them
Victor Stinnerfea98bf2017-06-27 16:56:43 +020070--fail-env-changed -- if a test file alters the environment, mark the test
71 as failed
Guido van Rossum152494a1996-12-20 03:12:20 +000072
R. David Murray3bfa8832010-04-26 16:54:57 +000073
74Additional Option Details:
Guido van Rossumf58ed251997-03-07 21:04:33 +000075
Serhiy Storchakac72e66a2015-11-02 15:06:09 +020076-r randomizes test execution order. You can use --randseed=int to provide an
Collin Wintera199f012009-03-29 03:44:19 +000077int seed value for the randomizer; this is useful for reproducing troublesome
78test orders.
79
R. David Murray3bfa8832010-04-26 16:54:57 +000080-s On the first invocation of regrtest using -s, the first test file found
81or the first test file given on the command line is run, and the name of
82the next test is recorded in a file named pynexttest. If run from the
83Python build directory, pynexttest is located in the 'build' subdirectory,
84otherwise it is located in tempfile.gettempdir(). On subsequent runs,
85the test in pynexttest is run, and the next test is written to pynexttest.
86When the last test has been run, pynexttest is deleted. In this way it
87is possible to single step through the test files. This is useful when
88doing memory analysis on the Python interpreter, which process tends to
89consume too many resources to run the full regression test non-stop.
Barry Warsawe11e3de1999-01-28 19:51:51 +000090
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000091-f reads the names of tests from the file given as f's argument, one
92or more test names per line. Whitespace is ignored. Blank lines and
93lines beginning with '#' are ignored. This is especially useful for
94whittling down failures involving interactions among tests.
Tim Petersc5000df2002-06-02 21:42:01 +000095
Skip Montanaro0179a182004-06-06 15:53:18 +000096-L causes the leaks(1) command to be run just before exit if it exists.
97leaks(1) is available on Mac OS X and presumably on some other
98FreeBSD-derived systems.
99
Michael W. Hudson61147f62004-08-03 11:33:28 +0000100-R runs each test several times and examines sys.gettotalrefcount() to
101see if the test appears to be leaking references. The argument should
102be of the form stab:run:fname where 'stab' is the number of times the
103test is run to let gettotalrefcount settle down, 'run' is the number
104of times further it is run and 'fname' is the name of the file the
105reports are written to. These parameters all have defaults (5, 4 and
Florent Xicluna12d750d2010-03-06 14:38:09 +0000106"reflog.txt" respectively), and the minimal invocation is '-R :'.
Michael W. Hudson61147f62004-08-03 11:33:28 +0000107
Thomas Woutersabd08882006-04-26 15:53:30 +0000108-M runs tests that require an exorbitant amount of memory. These tests
109typically try to ascertain containers keep working when containing more than
Armin Rigo97ff0472006-08-09 15:37:26 +00001102 billion objects, which only works on 64-bit systems. There are also some
111tests that try to exhaust the address space of the process, which only makes
112sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
Thomas Woutersabd08882006-04-26 15:53:30 +0000113which is a string in the form of '2.5Gb', determines howmuch memory the
114tests will limit themselves to (but they may go slightly over.) The number
115shouldn't be more memory than the machine has (including swap memory). You
116should also keep in mind that swap memory is generally much, much slower
117than RAM, and setting memlimit to all available RAM or higher will heavily
118tax the machine. On the other hand, it is no use running these tests with a
119limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
120to use more than memlimit memory will be skipped. The big-memory tests
121generally run very, very long.
122
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000123-u is used to specify which special resource intensive tests to run,
124such as those requiring large file support or network connectivity.
125The argument is a comma-separated list of words indicating the
126resources to test. Currently only the following are defined:
Barry Warsaw08fca522001-08-20 22:33:46 +0000127
Fred Drake3a15dac2002-04-11 16:39:16 +0000128 all - Enable all special resources.
129
Guido van Rossum315aa362003-03-11 14:46:48 +0000130 audio - Tests that use the audio device. (There are known
131 cases of broken audio drivers that can crash Python or
132 even the Linux kernel.)
133
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000134 curses - Tests that use curses and will modify the terminal's
135 state and output modes.
Tim Peters1633a2e2001-10-30 05:56:40 +0000136
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000137 largefile - It is okay to run some test that may create huge
138 files. These tests can take a long time and may
139 consume >2GB of disk space temporarily.
Barry Warsaw08fca522001-08-20 22:33:46 +0000140
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000141 network - It is okay to run tests that use external network
142 resource, e.g. testing SSL support for sockets.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +0000143
144 bsddb - It is okay to run the bsddb testsuite, which takes
145 a long time to complete.
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000146
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000147 decimal - Test the decimal module against a large suite that
148 verifies compliance with standards.
149
Antoine Pitroud989f822010-10-14 15:43:25 +0000150 cpu - Used for certain CPU-heavy tests.
Jeremy Hylton4336eda2004-08-07 19:25:33 +0000151
Tim Peterseba28be2005-03-28 01:08:02 +0000152 subprocess Run all tests for the subprocess module.
Peter Astrandf7f1bb72005-03-03 20:47:37 +0000153
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000154 urlfetch - It is okay to download files required on testing.
155
Guilherme Polob1a98de2009-01-28 20:03:26 +0000156 gui - Run tests that require a running GUI.
157
Collin Winterf8089c72009-04-09 16:46:46 +0000158 xpickle - Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
159 test backwards compatibility. These tests take a long time
160 to run.
161
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000162To enable all resources except one, use '-uall,-<resource>'. For
163example, to run all the tests except for the bsddb tests, give the
164option '-uall,-bsddb'.
Victor Stinner24c2c202017-06-16 17:30:03 +0200165
166--matchfile filters tests using a text file, one pattern per line.
167Pattern examples:
168
169- test method: test_stat_attributes
170- test class: FileTests
171- test identifier: test_os.FileTests.test_stat_attributes
Guido van Rossum152494a1996-12-20 03:12:20 +0000172"""
173
Michael Foord91a2c892010-04-08 00:04:24 +0000174import StringIO
Victor Stinner453a6852017-05-09 17:06:34 +0200175import datetime
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000176import getopt
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000177import json
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000178import os
179import random
180import re
Serhiy Storchakabb801312013-02-10 12:01:31 +0200181import shutil
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000182import sys
183import time
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000184import traceback
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000185import warnings
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000186import unittest
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000187import tempfile
Ezio Melottidde5b942010-02-03 05:37:26 +0000188import imp
Florent Xiclunab7c20022010-03-06 09:11:55 +0000189import platform
Florent Xicluna0932dc52010-03-06 08:07:44 +0000190import sysconfig
Guido van Rossumdc15c272002-08-12 21:55:51 +0000191
Guido van Rossum152494a1996-12-20 03:12:20 +0000192
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000193# Some times __path__ and __file__ are not absolute (e.g. while running from
194# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
195# imports might fail. This affects only the modules imported before os.chdir().
196# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
197# they are found in the CWD their __file__ and __path__ will be relative (this
198# happens before the chdir). All the modules imported after the chdir, are
199# not found in the CWD, and since the other paths in sys.path[1:] are absolute
200# (site.py absolutize them), the __file__ and __path__ will be absolute too.
201# Therefore it is necessary to absolutize manually the __file__ and __path__ of
202# the packages to prevent later imports to fail when the CWD is different.
203for module in sys.modules.itervalues():
204 if hasattr(module, '__path__'):
205 module.__path__ = [os.path.abspath(path) for path in module.__path__]
206 if hasattr(module, '__file__'):
207 module.__file__ = os.path.abspath(module.__file__)
208
209
Guido van Rossumbb484652002-12-02 09:56:21 +0000210# MacOSX (a.k.a. Darwin) has a default stack size that is too small
211# for deeply recursive regular expressions. We see this as crashes in
212# the Python test suite when running test_re.py and test_sre.py. The
213# fix is to set the stack limit to 2048.
214# This approach may also be useful for other Unixy platforms that
215# suffer from small default stack limits.
216if sys.platform == 'darwin':
217 try:
218 import resource
219 except ImportError:
220 pass
221 else:
222 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
223 newsoft = min(hard, max(soft, 1024*2048))
224 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
225
Zachary Ware47343722015-07-16 00:24:48 -0500226# Windows, Tkinter, and resetting the environment after each test don't
227# mix well. To alleviate test failures due to Tcl/Tk not being able to
228# find its library, get the necessary environment massage done once early.
229if sys.platform == 'win32':
230 try:
231 import FixTk
232 except Exception:
233 pass
234
Georg Brandl4045e882009-10-29 20:53:00 +0000235# Test result constants.
236PASSED = 1
237FAILED = 0
238ENV_CHANGED = -1
239SKIPPED = -2
240RESOURCE_DENIED = -3
241INTERRUPTED = -4
Victor Stinnerc991eb22017-05-03 17:28:28 +0200242CHILD_ERROR = -5 # error in a child process
Georg Brandl4045e882009-10-29 20:53:00 +0000243
Victor Stinner453a6852017-05-09 17:06:34 +0200244# Minimum duration of a test to display its duration or to mention that
245# the test is running in background
246PROGRESS_MIN_TIME = 30.0 # seconds
247
248# Display the running tests if nothing happened last N seconds
249PROGRESS_UPDATE = 30.0 # seconds
250
Barry Warsaw04f357c2002-07-23 19:04:11 +0000251from test import test_support
Fred Drake3a15dac2002-04-11 16:39:16 +0000252
Benjamin Petersone2886fd2008-07-18 14:26:35 +0000253RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
Antoine Pitroud989f822010-10-14 15:43:25 +0000254 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
Collin Winterf8089c72009-04-09 16:46:46 +0000255 'xpickle')
Fred Drake3a15dac2002-04-11 16:39:16 +0000256
Florent Xicluna12735662010-04-23 18:10:12 +0000257TEMPDIR = os.path.abspath(tempfile.gettempdir())
258
Fred Drake3a15dac2002-04-11 16:39:16 +0000259
Barry Warsaw08fca522001-08-20 22:33:46 +0000260def usage(code, msg=''):
261 print __doc__
262 if msg: print msg
263 sys.exit(code)
264
265
Victor Stinner453a6852017-05-09 17:06:34 +0200266def format_duration(seconds):
267 if seconds < 1.0:
268 return '%.0f ms' % (seconds * 1e3)
269 if seconds < 60.0:
270 return '%.0f sec' % seconds
271
272 minutes, seconds = divmod(seconds, 60.0)
273 return '%.0f min %.0f sec' % (minutes, seconds)
274
275
276_FORMAT_TEST_RESULT = {
277 PASSED: '%s passed',
278 FAILED: '%s failed',
279 ENV_CHANGED: '%s failed (env changed)',
280 SKIPPED: '%s skipped',
281 RESOURCE_DENIED: '%s skipped (resource denied)',
282 INTERRUPTED: '%s interrupted',
283 CHILD_ERROR: '%s crashed',
284}
285
286
287def format_test_result(test_name, result):
288 fmt = _FORMAT_TEST_RESULT.get(result, "%s")
289 return fmt % test_name
290
291
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000292def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000293 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000294 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000295 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000296 random_seed=None, use_mp=None, verbose3=False, forever=False,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300297 header=False, pgo=False, failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000298 """Execute a test suite.
299
Thomas Wouters7e474022000-07-16 12:04:32 +0000300 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000301 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000302
303 tests -- a list of strings containing test names (optional)
304 testdir -- the directory in which to look for tests (optional)
305
306 Users other than the Python test suite will certainly want to
307 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000308 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000309
310 If the tests argument is omitted, the tests listed on the
311 command-line will be used. If that's empty, too, then all *.py
312 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000313
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000314 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000315 single, randomize, findleaks, use_resources, trace, coverdir,
316 print_slow, and random_seed) allow programmers calling main()
317 directly to set the values that would normally be set by flags
318 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000319 """
Victor Stinner453a6852017-05-09 17:06:34 +0200320 regrtest_start_time = time.time()
Fred Drake004d5e62000-10-23 17:22:08 +0000321
Tim Peters8dee8092001-09-25 20:05:11 +0000322 test_support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000323 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300324 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:PGm:',
Georg Brandl71a015a2009-10-27 20:52:02 +0000325 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Victor Stinner453a6852017-05-09 17:06:34 +0200326 'exclude', 'single', 'slow', 'slowest', 'randomize', 'fromfile=',
327 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000328 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
329 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300330 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo',
Victor Stinner24c2c202017-06-16 17:30:03 +0200331 'failfast', 'match=', 'testdir=', 'list-tests', 'list-cases',
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200332 'coverage', 'matchfile=', 'fail-env-changed'])
Guido van Rossum152494a1996-12-20 03:12:20 +0000333 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000334 usage(2, msg)
335
336 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000337 if random_seed is None:
338 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000339 if use_resources is None:
340 use_resources = []
Victor Stinnerd2aff602017-05-09 13:57:20 +0200341 slaveargs = None
Victor Stinner453a6852017-05-09 17:06:34 +0200342 list_tests = False
Victor Stinner24c2c202017-06-16 17:30:03 +0200343 list_cases_opt = False
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200344 fail_env_changed = False
Guido van Rossum152494a1996-12-20 03:12:20 +0000345 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000346 if o in ('-h', '--help'):
347 usage(0)
348 elif o in ('-v', '--verbose'):
349 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000350 elif o in ('-w', '--verbose2'):
351 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000352 elif o in ('-W', '--verbose3'):
353 verbose3 = True
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300354 elif o in ('-G', '--failfast'):
355 failfast = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000356 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000357 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000358 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000359 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000360 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000361 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000362 single = True
Victor Stinner453a6852017-05-09 17:06:34 +0200363 elif o in ('-S', '--slow', '--slowest'):
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000364 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000365 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000366 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000367 elif o == '--randseed':
368 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000369 elif o in ('-f', '--fromfile'):
370 fromfile = a
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300371 elif o in ('-m', '--match'):
Victor Stinner24c2c202017-06-16 17:30:03 +0200372 if match_tests is None:
373 match_tests = []
374 match_tests.append(a)
375 elif o == '--matchfile':
376 if match_tests is None:
377 match_tests = []
378 filename = os.path.join(test_support.SAVEDCWD, a)
379 with open(filename) as fp:
380 for line in fp:
381 match_tests.append(line.strip())
Barry Warsaw08fca522001-08-20 22:33:46 +0000382 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000383 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000384 elif o in ('-L', '--runleaks'):
385 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000386 elif o in ('-t', '--threshold'):
387 import gc
388 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000389 elif o in ('-T', '--coverage'):
390 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000391 elif o in ('-D', '--coverdir'):
392 coverdir = os.path.join(os.getcwd(), a)
393 elif o in ('-N', '--nocoverdir'):
394 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000395 elif o in ('-R', '--huntrleaks'):
396 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000397 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000398 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000399 usage(2, '-R takes 2 or 3 colon-separated arguments')
400 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000401 huntrleaks[0] = 5
402 else:
403 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000404 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000405 huntrleaks[1] = 4
406 else:
407 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000408 if len(huntrleaks) == 2 or not huntrleaks[2]:
409 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000410 elif o in ('-M', '--memlimit'):
411 test_support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000412 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000413 u = [x.lower() for x in a.split(',')]
414 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000415 if r == 'all':
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000416 use_resources[:] = RESOURCE_NAMES
417 continue
418 remove = False
419 if r[0] == '-':
420 remove = True
421 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000422 if r not in RESOURCE_NAMES:
423 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000424 if remove:
425 if r in use_resources:
426 use_resources.remove(r)
427 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000428 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000429 elif o in ('-F', '--forever'):
430 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000431 elif o in ('-j', '--multiprocess'):
432 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000433 elif o == '--header':
434 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000435 elif o == '--slaveargs':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200436 slaveargs = a
Brett Cannon95374782015-10-02 16:21:34 -0700437 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700438 pgo = True
Victor Stinner453a6852017-05-09 17:06:34 +0200439 elif o == '--testdir':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200440 testdir = a
Victor Stinner453a6852017-05-09 17:06:34 +0200441 elif o == '--list-tests':
442 list_tests = True
Victor Stinner24c2c202017-06-16 17:30:03 +0200443 elif o == '--list-cases':
444 list_cases_opt = True
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200445 elif o == '--fail-env-changed':
446 fail_env_changed = True
R. David Murrayda826892009-11-15 00:04:32 +0000447 else:
448 print >>sys.stderr, ("No handler for option {}. Please "
449 "report this as a bug at http://bugs.python.org.").format(o)
450 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000451 if single and fromfile:
452 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000453 if use_mp and trace:
454 usage(2, "-T and -j don't go together!")
455 if use_mp and findleaks:
456 usage(2, "-l and -j don't go together!")
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300457 if failfast and not (verbose or verbose3):
458 usage("-G/--failfast needs either -v or -W")
Barry Warsaw08fca522001-08-20 22:33:46 +0000459
Victor Stinnerd2aff602017-05-09 13:57:20 +0200460 if testdir:
461 testdir = os.path.abspath(testdir)
462
463 # Prepend test directory to sys.path, so runtest() will be able
464 # to locate tests
465 sys.path.insert(0, testdir)
466
467 if slaveargs is not None:
468 args, kwargs = json.loads(slaveargs)
Victor Stinner8bb08632017-06-16 12:14:09 +0200469 if kwargs['huntrleaks']:
470 warm_caches()
Victor Stinnerd2aff602017-05-09 13:57:20 +0200471 if testdir:
472 kwargs['testdir'] = testdir
473 try:
474 result = runtest(*args, **kwargs)
475 except BaseException, e:
476 result = INTERRUPTED, e.__class__.__name__
477 print # Force a newline (just in case)
478 print json.dumps(result)
479 sys.exit(0)
480
Victor Stinner8bb08632017-06-16 12:14:09 +0200481 if huntrleaks:
482 warm_caches()
483
Guido van Rossum152494a1996-12-20 03:12:20 +0000484 good = []
485 bad = []
486 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000487 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000488 environment_changed = []
Florent Xicluna75c66762010-03-30 16:31:14 +0000489 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000490
Neil Schemenauerd569f232000-09-22 15:29:28 +0000491 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000492 try:
493 import gc
494 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000495 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000496 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000497 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000498 # Uncomment the line below to report garbage that is not
499 # freeable by reference counting alone. By default only
500 # garbage that is not collectable by the GC is reported.
501 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000502 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000503
Barry Warsawe11e3de1999-01-28 19:51:51 +0000504 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000505 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000506 try:
507 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000508 next_test = fp.read().strip()
509 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000510 fp.close()
511 except IOError:
512 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000513
514 if fromfile:
515 tests = []
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000516 fp = open(os.path.join(test_support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000517 for line in fp:
518 guts = line.split() # assuming no test has whitespace in its name
519 if guts and not guts[0].startswith('#'):
520 tests.extend(guts)
521 fp.close()
522
523 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000524 removepy(args)
525 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000526
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000527 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000528 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000529 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000530 for arg in args:
531 if arg in stdtests:
532 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000533 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000534 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000535
536 # For a partial run, we do not need to clutter the output.
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000537 if verbose or header or not (quiet or single or tests or args):
Brett Cannon95374782015-10-02 16:21:34 -0700538 if not pgo:
539 # Print basic platform information
540 print "==", platform.python_implementation(), \
541 " ".join(sys.version.split())
542 print "== ", platform.platform(aliased=True), \
543 "%s-endian" % sys.byteorder
544 print "== ", os.getcwd()
545 print "Testing with flags:", sys.flags
Florent Xicluna58526412010-03-06 17:24:36 +0000546
R. David Murray98e3df32009-12-16 11:49:46 +0000547 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000548 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000549 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000550 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000551 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000552 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000553 except IndexError:
554 next_single_test = None
Skip Montanaroab1c7912000-06-30 16:39:27 +0000555 if randomize:
Collin Wintera199f012009-03-29 03:44:19 +0000556 random.seed(random_seed)
557 print "Using random seed", random_seed
Florent Xicluna75c66762010-03-30 16:31:14 +0000558 random.shuffle(selected)
Victor Stinner453a6852017-05-09 17:06:34 +0200559
560 if list_tests:
561 for name in selected:
562 print(name)
563 sys.exit(0)
564
Victor Stinner24c2c202017-06-16 17:30:03 +0200565 if list_cases_opt:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200566 list_cases(testdir, selected, match_tests)
Victor Stinner24c2c202017-06-16 17:30:03 +0200567 sys.exit(0)
568
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000569 if trace:
570 import trace
Victor Stinnera5bb6242017-05-11 11:30:23 +0200571 tracer = trace.Trace(trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000572
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000573 test_times = []
Barry Warsaw08fca522001-08-20 22:33:46 +0000574 test_support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800575 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000576
577 def accumulate_result(test, result):
578 ok, test_time = result
Victor Stinnerc991eb22017-05-03 17:28:28 +0200579 if ok not in (CHILD_ERROR, INTERRUPTED):
580 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000581 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000582 good.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200583 elif ok in (FAILED, CHILD_ERROR):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000584 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000585 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000586 environment_changed.append(test)
587 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000588 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000589 elif ok == RESOURCE_DENIED:
590 skipped.append(test)
591 resource_denieds.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200592 elif ok != INTERRUPTED:
593 raise ValueError("invalid test result: %r" % ok)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000594
R. David Murray7f7eea62009-11-14 15:18:22 +0000595 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000596 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000597 while True:
598 for test in tests:
599 yield test
600 if bad:
601 return
Victor Stinnerd7955b82017-07-03 15:07:53 +0200602 if fail_env_changed and environment_changed:
603 return
R. David Murray7f7eea62009-11-14 15:18:22 +0000604 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200605 test_count = ''
606 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000607 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000608 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200609 test_count = '/{}'.format(len(selected))
610 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000611
Victor Stinner453a6852017-05-09 17:06:34 +0200612 def display_progress(test_index, test):
613 # "[ 51/405/1] test_tcl"
614 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
615 line = fmt.format(test_count_width, test_index, test_count,
616 len(bad), test)
617
618 # add the timestamp prefix: "0:01:05 "
619 test_time = time.time() - regrtest_start_time
620 test_time = datetime.timedelta(seconds=int(test_time))
621 line = "%s %s" % (test_time, line)
622
623 print(line)
624 sys.stdout.flush()
625
Antoine Pitrou4698d992009-05-31 14:20:14 +0000626 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000627 try:
628 from threading import Thread
629 except ImportError:
630 print "Multiprocess option requires thread support"
631 sys.exit(2)
Victor Stinner453a6852017-05-09 17:06:34 +0200632 from Queue import Queue, Empty
Georg Brandla4f46e12010-02-07 17:03:15 +0000633 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000634 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000635 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000636 def tests_and_args():
637 for test in tests:
638 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000639 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700640 dict(huntrleaks=huntrleaks, use_resources=use_resources,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300641 failfast=failfast,
642 match_tests=match_tests,
Brett Cannoneb2cb972015-10-16 12:30:20 -0700643 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000644 )
645 yield (test, args_tuple)
646 pending = tests_and_args()
Antoine Pitroua226c912010-10-14 11:15:50 +0000647 opt_args = test_support.args_from_interpreter_flags()
648 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700649 # required to spawn a new process with PGO flag on/off
650 if pgo:
651 base_cmd = base_cmd + ['--pgo']
Victor Stinner453a6852017-05-09 17:06:34 +0200652
653 class MultiprocessThread(Thread):
654 current_test = None
655 start_time = None
656
657 def runtest(self):
658 try:
659 test, args_tuple = next(pending)
660 except StopIteration:
661 output.put((None, None, None, None))
662 return True
663
664 # -E is needed by some tests, e.g. test_import
665 args = base_cmd + ['--slaveargs', json.dumps(args_tuple)]
666 if testdir:
667 args.extend(('--testdir', testdir))
668 try:
669 self.start_time = time.time()
670 self.current_test = test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200671 popen = Popen(args,
672 stdout=PIPE, stderr=PIPE,
673 universal_newlines=True,
674 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000675 stdout, stderr = popen.communicate()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200676 retcode = popen.wait()
Victor Stinner453a6852017-05-09 17:06:34 +0200677 finally:
678 self.current_test = None
Victor Stinnerc991eb22017-05-03 17:28:28 +0200679
Victor Stinner453a6852017-05-09 17:06:34 +0200680 # Strip last refcount output line if it exists, since it
681 # comes from the shutdown of the interpreter in the subcommand.
682 stderr = debug_output_pat.sub("", stderr)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200683
Victor Stinner453a6852017-05-09 17:06:34 +0200684 if retcode == 0:
685 stdout, _, result = stdout.strip().rpartition("\n")
686 if not result:
687 output.put((None, None, None, None))
688 return True
Victor Stinnerc991eb22017-05-03 17:28:28 +0200689
Victor Stinner453a6852017-05-09 17:06:34 +0200690 result = json.loads(result)
691 else:
692 result = (CHILD_ERROR, "Exit code %s" % retcode)
Victor Stinner228da422017-05-05 10:28:35 +0200693
Victor Stinner453a6852017-05-09 17:06:34 +0200694 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
695 return False
Victor Stinnerc991eb22017-05-03 17:28:28 +0200696
Victor Stinner453a6852017-05-09 17:06:34 +0200697 def run(self):
698 try:
699 stop = False
700 while not stop:
701 stop = self.runtest()
702 except BaseException:
703 output.put((None, None, None, None))
704 raise
705
706 workers = [MultiprocessThread() for i in range(use_mp)]
707 print("Run tests in parallel using %s child processes"
708 % len(workers))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000709 for worker in workers:
710 worker.start()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200711
Victor Stinner453a6852017-05-09 17:06:34 +0200712 def get_running(workers):
713 running = []
714 for worker in workers:
715 current_test = worker.current_test
716 if not current_test:
717 continue
718 dt = time.time() - worker.start_time
719 if dt >= PROGRESS_MIN_TIME:
720 running.append('%s (%.0f sec)' % (current_test, dt))
721 return running
722
Antoine Pitrou4698d992009-05-31 14:20:14 +0000723 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200724 test_index = 1
Victor Stinner453a6852017-05-09 17:06:34 +0200725 get_timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME)
R. David Murray7f7eea62009-11-14 15:18:22 +0000726 try:
727 while finished < use_mp:
Victor Stinner453a6852017-05-09 17:06:34 +0200728 try:
729 item = output.get(timeout=get_timeout)
730 except Empty:
731 running = get_running(workers)
732 if running and not pgo:
733 print('running: %s' % ', '.join(running))
734 continue
735
736 test, stdout, stderr, result = item
R. David Murray7f7eea62009-11-14 15:18:22 +0000737 if test is None:
738 finished += 1
739 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000740 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200741 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200742 ok, test_time = result
743 text = format_test_result(test, ok)
744 if (ok not in (CHILD_ERROR, INTERRUPTED)
745 and test_time >= PROGRESS_MIN_TIME
746 and not pgo):
747 text += ' (%.0f sec)' % test_time
748 running = get_running(workers)
749 if running and not pgo:
750 text += ' -- running: %s' % ', '.join(running)
751 display_progress(test_index, text)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200752
753 if stdout:
754 print stdout
755 sys.stdout.flush()
756 if stderr and not pgo:
757 print >>sys.stderr, stderr
758 sys.stderr.flush()
759
760 if result[0] == INTERRUPTED:
761 assert result[1] == 'KeyboardInterrupt'
762 raise KeyboardInterrupt # What else?
763
Victor Stinner32b1ff92014-09-05 12:12:11 +0200764 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000765 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000766 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000767 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000768 for worker in workers:
769 worker.join()
770 else:
Victor Stinner453a6852017-05-09 17:06:34 +0200771 print("Run tests sequentially")
772
773 previous_test = None
Brett Cannon65918e02015-10-02 16:22:32 -0700774 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000775 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200776 text = test
777 if previous_test:
778 text = '%s -- %s' % (text, previous_test)
779 display_progress(test_index, text)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200780
781 def local_runtest():
782 result = runtest(test, verbose, quiet, huntrleaks, None, pgo,
783 failfast=failfast,
784 match_tests=match_tests,
785 testdir=testdir)
786 accumulate_result(test, result)
787 return result
788
789 start_time = time.time()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000790 if trace:
791 # If we're tracing code coverage, then we don't exit with status
792 # if on a false return value from main.
Victor Stinnera5bb6242017-05-11 11:30:23 +0200793 ns = dict(locals())
794 tracer.runctx('result = local_runtest()',
795 globals=globals(), locals=ns)
796 result = ns['result']
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000797 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000798 try:
Victor Stinnera5bb6242017-05-11 11:30:23 +0200799 result = local_runtest()
Georg Brandl4045e882009-10-29 20:53:00 +0000800 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700801 if not pgo:
802 print "Re-running test %r in verbose mode" % test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200803 runtest(test, True, quiet, huntrleaks, None, pgo,
804 testdir=testdir)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000805 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000806 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000807 break
808 except:
809 raise
Victor Stinner453a6852017-05-09 17:06:34 +0200810
Victor Stinnera5bb6242017-05-11 11:30:23 +0200811 test_time = time.time() - start_time
812 previous_test = format_test_result(test, result[0])
813 if test_time >= PROGRESS_MIN_TIME:
814 previous_test = "%s in %s" % (previous_test,
815 format_duration(test_time))
816 elif result[0] == PASSED:
817 # be quiet: say nothing if the test passed shortly
818 previous_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200819
Antoine Pitrou4698d992009-05-31 14:20:14 +0000820 if findleaks:
821 gc.collect()
822 if gc.garbage:
823 print "Warning: test created", len(gc.garbage),
824 print "uncollectable object(s)."
825 # move the uncollectable objects somewhere so we don't see
826 # them again
827 found_garbage.extend(gc.garbage)
828 del gc.garbage[:]
829 # Unload the newly imported modules (best effort finalization)
830 for module in sys.modules.keys():
831 if module not in save_modules and module.startswith("test."):
832 test_support.unload(module)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000833
Brett Cannon95374782015-10-02 16:21:34 -0700834 if interrupted and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000835 # print a newline after ^C
836 print
837 print "Test suite interrupted by signal SIGINT."
838 omitted = set(selected) - set(good) - set(bad) - set(skipped)
839 print count(len(omitted), "test"), "omitted:"
840 printlist(omitted)
Brett Cannon95374782015-10-02 16:21:34 -0700841 if good and not quiet and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000842 if not bad and not skipped and not interrupted and len(good) > 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000843 print "All",
844 print count(len(good), "test"), "OK."
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000845 if print_slow:
846 test_times.sort(reverse=True)
847 print "10 slowest tests:"
Victor Stinner453a6852017-05-09 17:06:34 +0200848 for test_time, test in test_times[:10]:
849 print("- %s: %.1fs" % (test, test_time))
Brett Cannon95374782015-10-02 16:21:34 -0700850 if bad and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500851 print count(len(bad), "test"), "failed:"
852 printlist(bad)
Brett Cannon95374782015-10-02 16:21:34 -0700853 if environment_changed and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500854 print "{} altered the execution environment:".format(
855 count(len(environment_changed), "test"))
856 printlist(environment_changed)
Brett Cannon95374782015-10-02 16:21:34 -0700857 if skipped and not quiet and not pgo:
Tim Petersa45da922001-08-12 03:45:50 +0000858 print count(len(skipped), "test"), "skipped:"
859 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000860
Tim Petersb5b7b782001-08-12 01:20:39 +0000861 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000862 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000863 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000864 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000865 if surprise:
866 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000867 "unexpected on", plat + ":"
868 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000869 else:
870 print "Those skips are all expected on", plat + "."
871 else:
872 print "Ask someone to teach regrtest.py about which tests are"
873 print "expected to get skipped on", plat + "."
874
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000875 if verbose2 and bad:
876 print "Re-running failed tests in verbose mode"
Zachary Warea4777f12015-08-04 21:53:21 -0500877 for test in bad[:]:
Tim Peters922dd7d2006-03-10 23:37:10 +0000878 print "Re-running test %r in verbose mode" % test
879 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000880 try:
Neal Norwitz5fe5cf62008-03-18 17:58:02 +0000881 test_support.verbose = True
Victor Stinnerd2aff602017-05-09 13:57:20 +0200882 ok = runtest(test, True, quiet, huntrleaks, None, pgo,
883 testdir=testdir)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000884 except KeyboardInterrupt:
885 # print a newline separate from the ^C
886 print
887 break
Zachary Warea4777f12015-08-04 21:53:21 -0500888 else:
889 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
890 bad.remove(test)
891 else:
892 if bad:
893 print count(len(bad), "test"), "failed again:"
894 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000895
Barry Warsawe11e3de1999-01-28 19:51:51 +0000896 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000897 if next_single_test:
898 with open(filename, 'w') as fp:
899 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000900 else:
901 os.unlink(filename)
902
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000903 if trace:
904 r = tracer.results()
905 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
906
Skip Montanaro0179a182004-06-06 15:53:18 +0000907 if runleaks:
908 os.system("leaks %d" % os.getpid())
909
Victor Stinner453a6852017-05-09 17:06:34 +0200910 print
911 duration = time.time() - regrtest_start_time
912 print("Total duration: %s" % format_duration(duration))
913
914 if bad:
915 result = "FAILURE"
916 elif interrupted:
917 result = "INTERRUPTED"
Victor Stinnerd7955b82017-07-03 15:07:53 +0200918 elif fail_env_changed and environment_changed:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200919 result = "ENV CHANGED"
Victor Stinner453a6852017-05-09 17:06:34 +0200920 else:
921 result = "SUCCESS"
922 print("Tests result: %s" % result)
923
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200924 if bad:
925 sys.exit(2)
926 if interrupted:
927 sys.exit(130)
928 if fail_env_changed and environment_changed:
929 sys.exit(3)
930 sys.exit(0)
Barry Warsaw08fca522001-08-20 22:33:46 +0000931
Guido van Rossum152494a1996-12-20 03:12:20 +0000932
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000933STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000934 'test_grammar',
935 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +0000936 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000937 'test_builtin',
938 'test_exceptions',
939 'test_types',
Collin Winter55453142007-03-08 19:58:14 +0000940 'test_unittest',
941 'test_doctest',
942 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000943]
Guido van Rossum152494a1996-12-20 03:12:20 +0000944
Florent Xicluna12d750d2010-03-06 14:38:09 +0000945NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +0000946 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000947 'test_future1',
948 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000949}
Guido van Rossum152494a1996-12-20 03:12:20 +0000950
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000951def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000952 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +0000953 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +0000954 names = os.listdir(testdir)
955 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +0000956 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +0000957 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +0000958 modname, ext = os.path.splitext(name)
959 if modname[:5] == "test_" and ext == ".py" and modname not in others:
960 tests.append(modname)
961 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +0000962
Antoine Pitrou4698d992009-05-31 14:20:14 +0000963def runtest(test, verbose, quiet,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300964 huntrleaks=False, use_resources=None, pgo=False,
Victor Stinnerd2aff602017-05-09 13:57:20 +0200965 failfast=False, match_tests=None, testdir=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000966 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +0000967
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000968 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000969 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000970 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000971 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +0000972 huntrleaks -- run multiple times to test for leaks; requires a debug
973 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -0700974 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -0700975 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -0700976
Georg Brandl4045e882009-10-29 20:53:00 +0000977 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +0200978 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +0000979 INTERRUPTED KeyboardInterrupt when run under -j
980 RESOURCE_DENIED test skipped because resource denied
981 SKIPPED test skipped for some other reason
982 ENV_CHANGED test failed because it changed the execution environment
983 FAILED test failed
984 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000985 """
Tim Peters06c5c002006-06-05 00:55:26 +0000986
Antoine Pitrou4698d992009-05-31 14:20:14 +0000987 test_support.verbose = verbose # Tell tests to be moderately quiet
988 if use_resources is not None:
989 test_support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +0000990 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300991 test_support.match_tests = match_tests
992 if failfast:
993 test_support.failfast = True
Victor Stinnerd2aff602017-05-09 13:57:20 +0200994 return runtest_inner(test, verbose, quiet, huntrleaks, pgo, testdir)
Tim Peterse5584862006-06-09 19:24:44 +0000995 finally:
996 cleanup_test_droppings(test, verbose)
997
R. David Murray14dcd432009-10-14 13:58:07 +0000998
999# Unit tests are supposed to leave the execution environment unchanged
1000# once they complete. But sometimes tests have bugs, especially when
1001# tests fail, and the changes to environment go on to mess up other
1002# tests. This can cause issues with buildbot stability, since tests
1003# are run in random order and so problems may appear to come and go.
1004# There are a few things we can save and restore to mitigate this, and
1005# the following context manager handles this task.
1006
1007class saved_test_environment:
1008 """Save bits of the test environment and restore them at block exit.
1009
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001010 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +00001011 #stuff
1012
1013 Unless quiet is True, a warning is printed to stderr if any of
1014 the saved items was changed by the test. The attribute 'changed'
1015 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001016
1017 If verbose is more than 1, the before and after state of changed
1018 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +00001019 """
1020
1021 changed = False
1022
Brett Cannon95374782015-10-02 16:21:34 -07001023 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +00001024 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001025 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +00001026 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -07001027 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +00001028
1029 # To add things to save and restore, add a name XXX to the resources list
1030 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
1031 # return the value to be saved and compared against a second call to the
1032 # get function when test execution completes. restore_XXX should accept
1033 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001034 # and only if a change in the value is detected.
1035 #
1036 # Note: XXX will have any '.' replaced with '_' characters when determining
1037 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +00001038
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001039 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001040 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001041 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001042 )
R. David Murray14dcd432009-10-14 13:58:07 +00001043
1044 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001045 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001046 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +00001047 sys.argv = saved_argv[1]
1048 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001049
1050 def get_cwd(self):
1051 return os.getcwd()
1052 def restore_cwd(self, saved_cwd):
1053 os.chdir(saved_cwd)
1054
1055 def get_sys_stdout(self):
1056 return sys.stdout
1057 def restore_sys_stdout(self, saved_stdout):
1058 sys.stdout = saved_stdout
1059
1060 def get_sys_stderr(self):
1061 return sys.stderr
1062 def restore_sys_stderr(self, saved_stderr):
1063 sys.stderr = saved_stderr
1064
1065 def get_sys_stdin(self):
1066 return sys.stdin
1067 def restore_sys_stdin(self, saved_stdin):
1068 sys.stdin = saved_stdin
1069
1070 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001071 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +00001072 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +00001073 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +00001074 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +00001075 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +00001076
1077 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001078 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001079 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +00001080 sys.path = saved_path[1]
1081 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001082
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001083 def get_asyncore_socket_map(self):
1084 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001085 # XXX Making a copy keeps objects alive until __exit__ gets called.
1086 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001087 def restore_asyncore_socket_map(self, saved_map):
1088 asyncore = sys.modules.get('asyncore')
1089 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001090 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001091 asyncore.socket_map.update(saved_map)
1092
Vinay Sajipda563bf2012-03-06 20:07:15 +00001093 def get_test_support_TESTFN(self):
1094 if os.path.isfile(test_support.TESTFN):
1095 result = 'f'
1096 elif os.path.isdir(test_support.TESTFN):
1097 result = 'd'
1098 else:
1099 result = None
1100 return result
1101 def restore_test_support_TESTFN(self, saved_value):
1102 if saved_value is None:
1103 if os.path.isfile(test_support.TESTFN):
1104 os.unlink(test_support.TESTFN)
1105 elif os.path.isdir(test_support.TESTFN):
1106 shutil.rmtree(test_support.TESTFN)
1107
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001108 def get_files(self):
1109 return sorted(fn + ('/' if os.path.isdir(fn) else '')
1110 for fn in os.listdir(os.curdir))
1111 def restore_files(self, saved_value):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001112 fn = test_support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001113 if fn not in saved_value and (fn + '/') not in saved_value:
1114 if os.path.isfile(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001115 test_support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001116 elif os.path.isdir(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001117 test_support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001118
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001119 def resource_info(self):
1120 for name in self.resources:
1121 method_suffix = name.replace('.', '_')
1122 get_name = 'get_' + method_suffix
1123 restore_name = 'restore_' + method_suffix
1124 yield name, getattr(self, get_name), getattr(self, restore_name)
1125
R. David Murray14dcd432009-10-14 13:58:07 +00001126 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001127 self.saved_values = dict((name, get()) for name, get, restore
1128 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +00001129 return self
1130
1131 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001132 saved_values = self.saved_values
1133 del self.saved_values
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001134 for name, get, restore in self.resource_info():
1135 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001136 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001137 # Check for changes to the resource's value
1138 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +00001139 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001140 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -07001141 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001142 print >>sys.stderr, (
1143 "Warning -- {} was modified by {}".format(
1144 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +02001145 print >>sys.stderr, (
1146 " Before: {}\n After: {} ".format(
1147 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001148 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
1149 # matters at least as much as value. For others (e.g. cwd),
1150 # identity is irrelevant. Should we add a mechanism to check
1151 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +00001152 return False
1153
1154
Victor Stinnerd2aff602017-05-09 13:57:20 +02001155def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None):
Guido van Rossum152494a1996-12-20 03:12:20 +00001156 test_support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +00001157 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001158 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001159 else:
Michael Foord91a2c892010-04-08 00:04:24 +00001160 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +00001161
Antoine Pitrou4698d992009-05-31 14:20:14 +00001162 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +00001163 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +00001164 try:
Tim Peters342ca752001-09-25 19:13:20 +00001165 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +00001166 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001167 if capture_stdout:
1168 sys.stdout = capture_stdout
Victor Stinner24c2c202017-06-16 17:30:03 +02001169 abstest = get_abs_module(testdir, test)
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001170 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -07001171 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +00001172 start_time = time.time()
1173 the_package = __import__(abstest, globals(), locals(), [])
Victor Stinnerd2aff602017-05-09 13:57:20 +02001174 if abstest.startswith('test.'):
1175 the_module = getattr(the_package, test)
1176 else:
1177 the_module = the_package
R. David Murray14dcd432009-10-14 13:58:07 +00001178 # Old tests run to completion simply as a side-effect of
1179 # being imported. For tests based on unittest or doctest,
1180 # explicitly invoke their test_main() function (if it exists).
1181 indirect_test = getattr(the_module, "test_main", None)
1182 if indirect_test is not None:
1183 indirect_test()
1184 if huntrleaks:
1185 refleak = dash_R(the_module, test, indirect_test,
1186 huntrleaks)
1187 test_time = time.time() - start_time
Guido van Rossum41360a41998-03-26 19:42:58 +00001188 finally:
Tim Peters342ca752001-09-25 19:13:20 +00001189 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +00001190 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001191 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +00001192 print test, "skipped --", msg
1193 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001194 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +00001195 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001196 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +00001197 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001198 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001199 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +00001200 except KeyboardInterrupt:
1201 raise
Guido van Rossum152494a1996-12-20 03:12:20 +00001202 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001203 if not pgo:
1204 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +00001205 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001206 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001207 except:
Guido van Rossum41360a41998-03-26 19:42:58 +00001208 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -07001209 if not pgo:
1210 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +00001211 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -07001212 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +00001213 traceback.print_exc(file=sys.stderr)
1214 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001215 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001216 else:
Collin Winter0f489742009-05-14 23:26:30 +00001217 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +00001218 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +00001219 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +00001220 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001221 # Except in verbose mode, tests should not print anything
1222 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001223 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001224 output = capture_stdout.getvalue()
1225 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001226 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001227 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001228 print "*" * 70
1229 print output
1230 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001231 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001232 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001233
Tim Peterse5584862006-06-09 19:24:44 +00001234def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001235 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001236 import gc
1237
1238 # First kill any dangling references to open files etc.
1239 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001240
1241 # Try to clean up junk commonly left behind. While tests shouldn't leave
1242 # any files or directories behind, when a test fails that can be tedious
1243 # for it to arrange. The consequences can be especially nasty on Windows,
1244 # since if a test leaves a file open, it cannot be deleted by name (while
1245 # there's nothing we can do about that here either, we can display the
1246 # name of the offending test, which is a real help).
1247 for name in (test_support.TESTFN,
1248 "db_home",
1249 ):
1250 if not os.path.exists(name):
1251 continue
1252
1253 if os.path.isdir(name):
1254 kind, nuker = "directory", shutil.rmtree
1255 elif os.path.isfile(name):
1256 kind, nuker = "file", os.unlink
1257 else:
1258 raise SystemError("os.path says %r exists but is neither "
1259 "directory nor file" % name)
1260
1261 if verbose:
1262 print "%r left behind %s %r" % (testname, kind, name)
1263 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001264 # if we have chmod, fix possible permissions problems
1265 # that might prevent cleanup
1266 if (hasattr(os, 'chmod')):
1267 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001268 nuker(name)
1269 except Exception, msg:
1270 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1271 "removed: %s" % (testname, kind, name, msg))
1272
Tim Peters06c5c002006-06-05 00:55:26 +00001273def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001274 """Run a test multiple times, looking for reference leaks.
1275
1276 Returns:
1277 False if the test didn't leak references; True if we detected refleaks.
1278 """
Tim Peters06c5c002006-06-05 00:55:26 +00001279 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001280 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001281
1282 if not hasattr(sys, 'gettotalrefcount'):
1283 raise Exception("Tracking reference leaks requires a debug build "
1284 "of Python")
1285
1286 # Save current values for dash_R_cleanup() to restore.
1287 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001288 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001289 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001290 try:
1291 import zipimport
1292 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001293 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001294 else:
1295 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001296 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001297 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001298 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1299 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1300 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001301 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001302 for obj in abc.__subclasses__() + [abc]:
1303 abcs[obj] = obj._abc_registry.copy()
1304
Tim Peters06c5c002006-06-05 00:55:26 +00001305 if indirect_test:
1306 def run_the_test():
1307 indirect_test()
1308 else:
1309 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001310 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001311
1312 deltas = []
1313 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001314 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001315 repcount = nwarmup + ntracked
1316 print >> sys.stderr, "beginning", repcount, "repetitions"
1317 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001318 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001319 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001320 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001321 run_the_test()
1322 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001323 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001324 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001325 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001326 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001327 print >> sys.stderr
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001328
1329 # bpo-30776: Try to ignore false positives:
1330 #
1331 # [3, 0, 0]
1332 # [0, 1, 0]
1333 # [8, -8, 1]
1334 #
1335 # Expected leaks:
1336 #
1337 # [5, 5, 6]
1338 # [10, 1, 1]
1339 if all(delta >= 1 for delta in deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001340 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1341 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001342 with open(fname, "a") as refrep:
1343 print >> refrep, msg
1344 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001345 return True
1346 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001347
Benjamin Peterson55035792014-02-16 14:51:17 -05001348def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001349 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001350
Tim Peters06c5c002006-06-05 00:55:26 +00001351 # Restore some original values.
1352 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001353 copy_reg.dispatch_table.clear()
1354 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001355 sys.path_importer_cache.clear()
1356 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001357 try:
1358 import zipimport
1359 except ImportError:
1360 pass # Run unmodified on platforms without zipimport support
1361 else:
1362 zipimport._zip_directory_cache.clear()
1363 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001364
Christian Heimes908caac2008-01-27 23:34:59 +00001365 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001366 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001367
Guido van Rossum64c06e32007-11-22 00:55:51 +00001368 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001369 for abc, registry in abcs.items():
1370 abc._abc_registry = registry.copy()
1371 abc._abc_cache.clear()
1372 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001373
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001374 clear_caches()
1375
1376def clear_caches():
1377 import gc
1378
1379 # Clear the warnings registry, so they can be displayed again
1380 for mod in sys.modules.values():
1381 if hasattr(mod, '__warningregistry__'):
1382 del mod.__warningregistry__
1383
Tim Peters06c5c002006-06-05 00:55:26 +00001384 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001385 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001386 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001387 distutils_dir_util = sys.modules['distutils.dir_util']
1388 except KeyError:
1389 pass
1390 else:
1391 distutils_dir_util._path_created.clear()
1392
1393 re.purge()
1394
1395 try:
1396 _strptime = sys.modules['_strptime']
1397 except KeyError:
1398 pass
1399 else:
1400 _strptime._regex_cache.clear()
1401
1402 try:
1403 urlparse = sys.modules['urlparse']
1404 except KeyError:
1405 pass
1406 else:
1407 urlparse.clear_cache()
1408
1409 try:
1410 urllib = sys.modules['urllib']
1411 except KeyError:
1412 pass
1413 else:
1414 urllib.urlcleanup()
1415
1416 try:
1417 urllib2 = sys.modules['urllib2']
1418 except KeyError:
1419 pass
1420 else:
1421 urllib2.install_opener(None)
1422
1423 try:
1424 dircache = sys.modules['dircache']
1425 except KeyError:
1426 pass
1427 else:
1428 dircache.reset()
1429
1430 try:
1431 linecache = sys.modules['linecache']
1432 except KeyError:
1433 pass
1434 else:
1435 linecache.clearcache()
1436
1437 try:
1438 mimetypes = sys.modules['mimetypes']
1439 except KeyError:
1440 pass
1441 else:
1442 mimetypes._default_mime_types()
1443
1444 try:
1445 filecmp = sys.modules['filecmp']
1446 except KeyError:
1447 pass
1448 else:
1449 filecmp._cache.clear()
1450
1451 try:
1452 struct = sys.modules['struct']
1453 except KeyError:
1454 pass
1455 else:
1456 struct._clearcache()
1457
1458 try:
1459 doctest = sys.modules['doctest']
1460 except KeyError:
1461 pass
1462 else:
1463 doctest.master = None
1464
1465 try:
1466 ctypes = sys.modules['ctypes']
1467 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001468 pass
1469 else:
1470 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001471
1472 # Collect cyclic trash.
1473 gc.collect()
1474
Victor Stinner8bb08632017-06-16 12:14:09 +02001475def warm_caches():
1476 """Create explicitly internal singletons which are created on demand
1477 to prevent false positive when hunting reference leaks."""
1478 # char cache
1479 for i in range(256):
1480 chr(i)
1481 # unicode cache
1482 for i in range(256):
1483 unichr(i)
1484 # int cache
1485 list(range(-5, 257))
1486
Florent Xicluna0932dc52010-03-06 08:07:44 +00001487def findtestdir(path=None):
1488 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001489
Florent Xicluna0932dc52010-03-06 08:07:44 +00001490def removepy(names):
1491 if not names:
1492 return
1493 for idx, name in enumerate(names):
1494 basename, ext = os.path.splitext(name)
1495 if ext == '.py':
1496 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001497
Guido van Rossum152494a1996-12-20 03:12:20 +00001498def count(n, word):
1499 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001500 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001501 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001502 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001503
Victor Stinner24c2c202017-06-16 17:30:03 +02001504def printlist(x, width=70, indent=4, file=None):
Tim Peters7c7efe92002-08-23 17:55:54 +00001505 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001506
1507 Optional arg width (default 70) is the maximum line length.
1508 Optional arg indent (default 4) is the number of blanks with which to
1509 begin each line.
1510 """
1511
Tim Petersba78bc42002-07-04 19:45:06 +00001512 from textwrap import fill
1513 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001514 # Print the sorted list: 'x' may be a '--random' list or a set()
Victor Stinner24c2c202017-06-16 17:30:03 +02001515 print >>file, fill(' '.join(str(elt) for elt in sorted(x)), width,
1516 initial_indent=blanks, subsequent_indent=blanks)
1517
1518def get_abs_module(testdir, test):
1519 if test.startswith('test.') or testdir:
1520 return test
1521 else:
1522 # Always import it from the test package
1523 return 'test.' + test
1524
1525def _list_cases(suite):
1526 for test in suite:
1527 if isinstance(test, unittest.TestSuite):
1528 _list_cases(test)
1529 elif isinstance(test, unittest.TestCase):
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001530 if test_support._match_test(test):
1531 print(test.id())
Victor Stinner24c2c202017-06-16 17:30:03 +02001532
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001533def list_cases(testdir, selected, match_tests):
1534 test_support.verbose = False
1535 test_support.match_tests = match_tests
1536
Victor Stinner24c2c202017-06-16 17:30:03 +02001537 skipped = []
1538 for test in selected:
1539 abstest = get_abs_module(testdir, test)
1540 try:
1541 suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
1542 _list_cases(suite)
1543 except unittest.SkipTest:
1544 skipped.append(test)
1545
1546 if skipped:
1547 print >>sys.stderr
1548 print >>sys.stderr, count(len(skipped), "test"), "skipped:"
1549 printlist(skipped, file=sys.stderr)
Tim Petersa45da922001-08-12 03:45:50 +00001550
Tim Petersde14a302002-04-01 05:04:46 +00001551# Map sys.platform to a string containing the basenames of tests
1552# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001553#
1554# Special cases:
1555# test_pep277
1556# The _ExpectedSkips constructor adds this to the set of expected
1557# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001558# test_timeout
1559# Controlled by test_timeout.skip_expected. Requires the network
1560# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001561#
1562# Tests that are expected to be skipped everywhere except on one platform
1563# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001564
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001565_expectations = {
1566 'win32':
1567 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001568 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001569 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001570 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001571 test_commands
1572 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001573 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001574 test_dbm
1575 test_dl
1576 test_fcntl
1577 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001578 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001579 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001580 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001581 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001582 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001583 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001584 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001585 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001586 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001587 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001588 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001589 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001590 test_pty
1591 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001592 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001593 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001594 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001595 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001596 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001597 test_wait3
1598 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001599 """,
1600 'linux2':
1601 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001602 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001603 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001604 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001605 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001606 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001607 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001608 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001609 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001610 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001611 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001612 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001613 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001614 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001615 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001616 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001617 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001618 test_openpty
1619 test_pyexpat
1620 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001621 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001622 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001623 'openunix8':
1624 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001625 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001626 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001627 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001628 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001629 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001630 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001631 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001632 test_openpty
1633 test_pyexpat
1634 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001635 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001636 """,
1637 'sco_sv3':
1638 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001639 test_asynchat
1640 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001641 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001642 test_dl
1643 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001644 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001645 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001646 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001647 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001648 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001649 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001650 test_openpty
1651 test_pyexpat
1652 test_queue
1653 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001654 test_sundry
1655 test_thread
1656 test_threaded_import
1657 test_threadedtempfile
1658 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001659 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001660 'riscos':
1661 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001662 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001663 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001664 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001665 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001666 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001667 test_commands
1668 test_crypt
1669 test_dbm
1670 test_dl
1671 test_fcntl
1672 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001673 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001674 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001675 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001676 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001677 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001678 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001679 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001680 test_openpty
1681 test_poll
1682 test_popen2
1683 test_pty
1684 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001685 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001686 test_sundry
1687 test_thread
1688 test_threaded_import
1689 test_threadedtempfile
1690 test_threading
1691 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001692 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001693 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001694 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001695 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001696 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001697 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001698 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001699 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001700 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001701 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001702 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001703 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001704 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001705 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001706 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001707 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001708 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001709 'sunos5':
1710 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001711 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001712 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001713 test_curses
1714 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001715 test_epoll
1716 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001717 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001718 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001719 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001720 test_zipfile
1721 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001722 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001723 'hp-ux11':
1724 """
Skip Montanarob3230212002-03-15 02:54:03 +00001725 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001726 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001727 test_curses
1728 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001729 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001730 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001731 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001732 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001733 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001734 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001735 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001736 test_openpty
1737 test_pyexpat
1738 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001739 test_zipfile
1740 test_zlib
1741 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001742 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001743 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001744 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001745 test_curses
1746 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001747 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001748 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001749 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001750 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001751 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001752 test_mhlib
1753 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001754 test_poll
1755 test_popen2
1756 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001757 """,
Jason Tishler25115942002-12-05 15:18:15 +00001758 'cygwin':
1759 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001760 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001761 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001762 test_curses
1763 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001764 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001765 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001766 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001767 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001768 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001769 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001770 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001771 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001772 'os2emx':
1773 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001774 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001775 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001776 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001777 test_commands
1778 test_curses
1779 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001780 test_epoll
1781 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001782 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001783 test_mhlib
1784 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001785 test_openpty
1786 test_ossaudiodev
1787 test_pty
1788 test_resource
1789 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001790 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001791 'freebsd4':
1792 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001793 test_bsddb
1794 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001795 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001796 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001797 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001798 test_ossaudiodev
1799 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001800 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001801 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001802 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001803 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001804 test_ttk_guionly
1805 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001806 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001807 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001808 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001809 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001810 'aix5':
1811 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001812 test_bsddb
1813 test_bsddb185
1814 test_bsddb3
1815 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001816 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001817 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001818 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001819 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001820 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001821 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001822 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001823 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001824 test_ttk_guionly
1825 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001826 test_zipimport
1827 test_zlib
1828 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001829 'openbsd3':
1830 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001831 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001832 test_bsddb
1833 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001834 test_ctypes
1835 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001836 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001837 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001838 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001839 test_normalization
1840 test_ossaudiodev
1841 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001842 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001843 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001844 test_ttk_guionly
1845 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001846 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001847 """,
Georg Brandl08706872006-06-21 17:53:17 +00001848 'netbsd3':
1849 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001850 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001851 test_bsddb
1852 test_bsddb185
1853 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001854 test_ctypes
1855 test_curses
1856 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001857 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001858 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001859 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001860 test_ossaudiodev
1861 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001862 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001863 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001864 test_ttk_guionly
1865 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001866 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001867 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001868}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001869_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001870_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001871_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001872_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001873
Tim Petersb5b7b782001-08-12 01:20:39 +00001874class _ExpectedSkips:
1875 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001876 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001877 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001878
Tim Peters7c7efe92002-08-23 17:55:54 +00001879 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001880 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001881 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001882 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001883
Georg Brandlb2e208f2007-07-12 09:24:04 +00001884 # expected to be skipped on every platform, even Linux
1885 self.expected.add('test_linuxaudiodev')
1886
Tim Peters2a182db2002-10-09 01:07:11 +00001887 if not os.path.supports_unicode_filenames:
1888 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001889
Neal Norwitz55b61d22003-02-28 19:57:03 +00001890 if test_timeout.skip_expected:
1891 self.expected.add('test_timeout')
1892
Martin v. Löwisfba73692004-11-13 11:13:35 +00001893 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001894 self.expected.add('test_imageop')
1895
Ronald Oussoren9545a232010-05-05 19:09:31 +00001896 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001897 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001898 "test_plistlib", "test_scriptpackages",
1899 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001900 for skip in MAC_ONLY:
1901 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001902 elif len(u'\0'.encode('unicode-internal')) == 4:
1903 self.expected.add("test_macostools")
1904
Tim Petersecd79eb2003-01-29 00:35:32 +00001905
1906 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001907 # test_sqlite is only reliable on Windows where the library
1908 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001909 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001910 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001911 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001912 for skip in WIN_ONLY:
1913 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001914
Brett Cannondc48b742007-05-20 07:09:50 +00001915 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001916 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1917 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001918 for skip in IRIX_ONLY:
1919 self.expected.add(skip)
1920
Georg Brandlb2e208f2007-07-12 09:24:04 +00001921 if sys.platform != 'sunos5':
1922 self.expected.add('test_sunaudiodev')
1923 self.expected.add('test_nis')
1924
Steven Bethardd290b042008-03-21 21:01:18 +00001925 if not sys.py3kwarning:
1926 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001927
Tim Peters7c7efe92002-08-23 17:55:54 +00001928 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001929
1930 def isvalid(self):
1931 "Return true iff _ExpectedSkips knows about the current platform."
1932 return self.valid
1933
1934 def getexpected(self):
1935 """Return set of test names we expect to skip on current platform.
1936
1937 self.isvalid() must be true.
1938 """
1939
1940 assert self.isvalid()
1941 return self.expected
1942
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001943def main_in_temp_cwd():
1944 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02001945 global TEMPDIR
1946
Florent Xicluna0932dc52010-03-06 08:07:44 +00001947 # When tests are run from the Python build directory, it is best practice
1948 # to keep the test files in a subfolder. It eases the cleanup of leftover
1949 # files using command "make distclean".
1950 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00001951 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
1952 TEMPDIR = os.path.abspath(TEMPDIR)
1953 if not os.path.exists(TEMPDIR):
1954 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001955
1956 # Define a writable temp dir that will be used as cwd while running
1957 # the tests. The name of the dir includes the pid to allow parallel
1958 # testing (see the -j option).
1959 TESTCWD = 'test_python_{}'.format(os.getpid())
1960
Florent Xicluna12735662010-04-23 18:10:12 +00001961 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001962
1963 # Run the tests in a context manager that temporary changes the CWD to a
1964 # temporary and writable directory. If it's not possible to create or
1965 # change the CWD, the original CWD will be used. The original CWD is
1966 # available from test_support.SAVEDCWD.
1967 with test_support.temp_cwd(TESTCWD, quiet=True):
1968 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001969
1970if __name__ == '__main__':
1971 # findtestdir() gets the dirname out of __file__, so we have to make it
1972 # absolute before changing the working directory.
1973 # For example __file__ may be relative when running trace or profile.
1974 # See issue #9323.
1975 global __file__
1976 __file__ = os.path.abspath(__file__)
1977
1978 # sanity check
1979 assert __file__ == os.path.abspath(sys.argv[0])
1980
1981 main_in_temp_cwd()