blob: 7096de8469ab182d005fde28078af207ccc98fd7 [file] [log] [blame]
Guido van Rossum152494a1996-12-20 03:12:20 +00001#! /usr/bin/env python
2
R. David Murray3bfa8832010-04-26 16:54:57 +00003"""
4Usage:
Guido van Rossum152494a1996-12-20 03:12:20 +00005
R. David Murray3bfa8832010-04-26 16:54:57 +00006python -m test.regrtest [options] [test_name1 [test_name2 ...]]
7python path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
Guido van Rossum152494a1996-12-20 03:12:20 +00008
R. David Murray3bfa8832010-04-26 16:54:57 +00009
10If no arguments or options are provided, finds all files matching
11the pattern "test_*" in the Lib/test subdirectory and runs
12them in alphabetical order (but see -M and -u, below, for exceptions).
13
14For more rigorous testing, it is useful to use the following
15command line:
16
17python -E -tt -Wd -3 -m test.regrtest [options] [test_name1 ...]
18
19
20Options:
Guido van Rossum152494a1996-12-20 03:12:20 +000021
Georg Brandl83191702009-10-27 20:55:44 +000022-h/--help -- print this text and exit
23
24Verbosity
25
26-v/--verbose -- run tests in verbose mode with output to stdout
27-w/--verbose2 -- re-run failed tests in verbose mode
28-W/--verbose3 -- re-run failed tests in verbose mode immediately
R. David Murray3bfa8832010-04-26 16:54:57 +000029-q/--quiet -- no output unless one or more tests fail
Victor Stinner453a6852017-05-09 17:06:34 +020030-S/--slowest -- print the slowest 10 tests
Antoine Pitrou8c688be2011-01-03 20:49:01 +000031 --header -- print header with interpreter info
Georg Brandl83191702009-10-27 20:55:44 +000032
33Selecting tests
34
Chris Jerdonek3684c792012-12-27 18:14:01 -080035-r/--randomize -- randomize test execution order (see below)
Antoine Pitrou8c688be2011-01-03 20:49:01 +000036 --randseed -- pass a random seed to reproduce a previous random run
Georg Brandl83191702009-10-27 20:55:44 +000037-f/--fromfile -- read names of tests to run from a file (see below)
38-x/--exclude -- arguments are tests to *exclude*
R. David Murray3bfa8832010-04-26 16:54:57 +000039-s/--single -- single step through a set of tests (see below)
Serhiy Storchaka74f0db82017-05-04 00:23:50 +030040-m/--match PAT -- match test cases and methods with glob pattern PAT
Victor Stinner24c2c202017-06-16 17:30:03 +020041--matchfile FILENAME -- filters tests using a text file, one pattern per line
Serhiy Storchaka74f0db82017-05-04 00:23:50 +030042-G/--failfast -- fail as soon as a test fails (only with -v or -W)
Georg Brandl83191702009-10-27 20:55:44 +000043-u/--use RES1,RES2,...
44 -- specify which special resource intensive tests to run
45-M/--memlimit LIMIT
46 -- run very large memory-consuming tests
47
48Special runs
49
50-l/--findleaks -- if GC is available detect tests that leak memory
51-L/--runleaks -- run the leaks(1) command just before exit
52-R/--huntrleaks RUNCOUNTS
53 -- search for reference leaks (needs debug build, v. slow)
54-j/--multiprocess PROCESSES
55 -- run PROCESSES processes at once
R. David Murray3bfa8832010-04-26 16:54:57 +000056-T/--coverage -- turn on code coverage tracing using the trace module
Georg Brandl83191702009-10-27 20:55:44 +000057-D/--coverdir DIRECTORY
58 -- Directory where coverage files are put
59-N/--nocoverdir -- Put coverage files alongside modules
60-t/--threshold THRESHOLD
61 -- call gc.set_threshold(THRESHOLD)
R. David Murray3bfa8832010-04-26 16:54:57 +000062-F/--forever -- run the specified tests in a loop, until an error happens
Brett Cannon95374782015-10-02 16:21:34 -070063-P/--pgo -- enable Profile Guided Optimization training
Victor Stinnerd2aff602017-05-09 13:57:20 +020064--testdir -- execute test files in the specified directory
65 (instead of the Python stdlib test suite)
Victor Stinner453a6852017-05-09 17:06:34 +020066--list-tests -- only write the name of tests that will be run,
67 don't execute them
Victor Stinner24c2c202017-06-16 17:30:03 +020068--list-cases -- only write the name of test cases that will be run,
69 don't execute them
Victor Stinnerfea98bf2017-06-27 16:56:43 +020070--fail-env-changed -- if a test file alters the environment, mark the test
71 as failed
Guido van Rossum152494a1996-12-20 03:12:20 +000072
R. David Murray3bfa8832010-04-26 16:54:57 +000073
74Additional Option Details:
Guido van Rossumf58ed251997-03-07 21:04:33 +000075
Serhiy Storchakac72e66a2015-11-02 15:06:09 +020076-r randomizes test execution order. You can use --randseed=int to provide an
Collin Wintera199f012009-03-29 03:44:19 +000077int seed value for the randomizer; this is useful for reproducing troublesome
78test orders.
79
R. David Murray3bfa8832010-04-26 16:54:57 +000080-s On the first invocation of regrtest using -s, the first test file found
81or the first test file given on the command line is run, and the name of
82the next test is recorded in a file named pynexttest. If run from the
83Python build directory, pynexttest is located in the 'build' subdirectory,
84otherwise it is located in tempfile.gettempdir(). On subsequent runs,
85the test in pynexttest is run, and the next test is written to pynexttest.
86When the last test has been run, pynexttest is deleted. In this way it
87is possible to single step through the test files. This is useful when
88doing memory analysis on the Python interpreter, which process tends to
89consume too many resources to run the full regression test non-stop.
Barry Warsawe11e3de1999-01-28 19:51:51 +000090
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000091-f reads the names of tests from the file given as f's argument, one
92or more test names per line. Whitespace is ignored. Blank lines and
93lines beginning with '#' are ignored. This is especially useful for
94whittling down failures involving interactions among tests.
Tim Petersc5000df2002-06-02 21:42:01 +000095
Skip Montanaro0179a182004-06-06 15:53:18 +000096-L causes the leaks(1) command to be run just before exit if it exists.
97leaks(1) is available on Mac OS X and presumably on some other
98FreeBSD-derived systems.
99
Michael W. Hudson61147f62004-08-03 11:33:28 +0000100-R runs each test several times and examines sys.gettotalrefcount() to
101see if the test appears to be leaking references. The argument should
102be of the form stab:run:fname where 'stab' is the number of times the
103test is run to let gettotalrefcount settle down, 'run' is the number
104of times further it is run and 'fname' is the name of the file the
105reports are written to. These parameters all have defaults (5, 4 and
Florent Xicluna12d750d2010-03-06 14:38:09 +0000106"reflog.txt" respectively), and the minimal invocation is '-R :'.
Michael W. Hudson61147f62004-08-03 11:33:28 +0000107
Thomas Woutersabd08882006-04-26 15:53:30 +0000108-M runs tests that require an exorbitant amount of memory. These tests
109typically try to ascertain containers keep working when containing more than
Armin Rigo97ff0472006-08-09 15:37:26 +00001102 billion objects, which only works on 64-bit systems. There are also some
111tests that try to exhaust the address space of the process, which only makes
112sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
Thomas Woutersabd08882006-04-26 15:53:30 +0000113which is a string in the form of '2.5Gb', determines howmuch memory the
114tests will limit themselves to (but they may go slightly over.) The number
115shouldn't be more memory than the machine has (including swap memory). You
116should also keep in mind that swap memory is generally much, much slower
117than RAM, and setting memlimit to all available RAM or higher will heavily
118tax the machine. On the other hand, it is no use running these tests with a
119limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
120to use more than memlimit memory will be skipped. The big-memory tests
121generally run very, very long.
122
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000123-u is used to specify which special resource intensive tests to run,
124such as those requiring large file support or network connectivity.
125The argument is a comma-separated list of words indicating the
126resources to test. Currently only the following are defined:
Barry Warsaw08fca522001-08-20 22:33:46 +0000127
Fred Drake3a15dac2002-04-11 16:39:16 +0000128 all - Enable all special resources.
129
Guido van Rossum315aa362003-03-11 14:46:48 +0000130 audio - Tests that use the audio device. (There are known
131 cases of broken audio drivers that can crash Python or
132 even the Linux kernel.)
133
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000134 curses - Tests that use curses and will modify the terminal's
135 state and output modes.
Tim Peters1633a2e2001-10-30 05:56:40 +0000136
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000137 largefile - It is okay to run some test that may create huge
138 files. These tests can take a long time and may
139 consume >2GB of disk space temporarily.
Barry Warsaw08fca522001-08-20 22:33:46 +0000140
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000141 network - It is okay to run tests that use external network
142 resource, e.g. testing SSL support for sockets.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +0000143
144 bsddb - It is okay to run the bsddb testsuite, which takes
145 a long time to complete.
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000146
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000147 decimal - Test the decimal module against a large suite that
148 verifies compliance with standards.
149
Antoine Pitroud989f822010-10-14 15:43:25 +0000150 cpu - Used for certain CPU-heavy tests.
Jeremy Hylton4336eda2004-08-07 19:25:33 +0000151
Tim Peterseba28be2005-03-28 01:08:02 +0000152 subprocess Run all tests for the subprocess module.
Peter Astrandf7f1bb72005-03-03 20:47:37 +0000153
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000154 urlfetch - It is okay to download files required on testing.
155
Guilherme Polob1a98de2009-01-28 20:03:26 +0000156 gui - Run tests that require a running GUI.
157
Collin Winterf8089c72009-04-09 16:46:46 +0000158 xpickle - Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
159 test backwards compatibility. These tests take a long time
160 to run.
161
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000162To enable all resources except one, use '-uall,-<resource>'. For
163example, to run all the tests except for the bsddb tests, give the
164option '-uall,-bsddb'.
Victor Stinner24c2c202017-06-16 17:30:03 +0200165
166--matchfile filters tests using a text file, one pattern per line.
167Pattern examples:
168
169- test method: test_stat_attributes
170- test class: FileTests
171- test identifier: test_os.FileTests.test_stat_attributes
Guido van Rossum152494a1996-12-20 03:12:20 +0000172"""
173
Michael Foord91a2c892010-04-08 00:04:24 +0000174import StringIO
Victor Stinner453a6852017-05-09 17:06:34 +0200175import datetime
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000176import getopt
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000177import json
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000178import os
179import random
180import re
Serhiy Storchakabb801312013-02-10 12:01:31 +0200181import shutil
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000182import sys
183import time
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000184import traceback
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000185import warnings
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000186import unittest
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000187import tempfile
Ezio Melottidde5b942010-02-03 05:37:26 +0000188import imp
Florent Xiclunab7c20022010-03-06 09:11:55 +0000189import platform
Florent Xicluna0932dc52010-03-06 08:07:44 +0000190import sysconfig
Guido van Rossumdc15c272002-08-12 21:55:51 +0000191
Guido van Rossum152494a1996-12-20 03:12:20 +0000192
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000193# Some times __path__ and __file__ are not absolute (e.g. while running from
194# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
195# imports might fail. This affects only the modules imported before os.chdir().
196# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
197# they are found in the CWD their __file__ and __path__ will be relative (this
198# happens before the chdir). All the modules imported after the chdir, are
199# not found in the CWD, and since the other paths in sys.path[1:] are absolute
200# (site.py absolutize them), the __file__ and __path__ will be absolute too.
201# Therefore it is necessary to absolutize manually the __file__ and __path__ of
202# the packages to prevent later imports to fail when the CWD is different.
203for module in sys.modules.itervalues():
204 if hasattr(module, '__path__'):
205 module.__path__ = [os.path.abspath(path) for path in module.__path__]
206 if hasattr(module, '__file__'):
207 module.__file__ = os.path.abspath(module.__file__)
208
209
Guido van Rossumbb484652002-12-02 09:56:21 +0000210# MacOSX (a.k.a. Darwin) has a default stack size that is too small
211# for deeply recursive regular expressions. We see this as crashes in
212# the Python test suite when running test_re.py and test_sre.py. The
213# fix is to set the stack limit to 2048.
214# This approach may also be useful for other Unixy platforms that
215# suffer from small default stack limits.
216if sys.platform == 'darwin':
217 try:
218 import resource
219 except ImportError:
220 pass
221 else:
222 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
223 newsoft = min(hard, max(soft, 1024*2048))
224 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
225
Zachary Ware47343722015-07-16 00:24:48 -0500226# Windows, Tkinter, and resetting the environment after each test don't
227# mix well. To alleviate test failures due to Tcl/Tk not being able to
228# find its library, get the necessary environment massage done once early.
229if sys.platform == 'win32':
230 try:
231 import FixTk
232 except Exception:
233 pass
234
Georg Brandl4045e882009-10-29 20:53:00 +0000235# Test result constants.
236PASSED = 1
237FAILED = 0
238ENV_CHANGED = -1
239SKIPPED = -2
240RESOURCE_DENIED = -3
241INTERRUPTED = -4
Victor Stinnerc991eb22017-05-03 17:28:28 +0200242CHILD_ERROR = -5 # error in a child process
Georg Brandl4045e882009-10-29 20:53:00 +0000243
Victor Stinner453a6852017-05-09 17:06:34 +0200244# Minimum duration of a test to display its duration or to mention that
245# the test is running in background
246PROGRESS_MIN_TIME = 30.0 # seconds
247
248# Display the running tests if nothing happened last N seconds
249PROGRESS_UPDATE = 30.0 # seconds
250
Barry Warsaw04f357c2002-07-23 19:04:11 +0000251from test import test_support
Fred Drake3a15dac2002-04-11 16:39:16 +0000252
Victor Stinner80ebc432017-07-21 02:12:14 +0200253ALL_RESOURCES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
254 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
255 'xpickle')
256
257# Other resources excluded from --use=all:
258#
259# - extralagefile (ex: test_zipfile64): really too slow to be enabled
260# "by default"
261RESOURCE_NAMES = ALL_RESOURCES + ('extralargefile',)
Fred Drake3a15dac2002-04-11 16:39:16 +0000262
Florent Xicluna12735662010-04-23 18:10:12 +0000263TEMPDIR = os.path.abspath(tempfile.gettempdir())
264
Fred Drake3a15dac2002-04-11 16:39:16 +0000265
Barry Warsaw08fca522001-08-20 22:33:46 +0000266def usage(code, msg=''):
267 print __doc__
268 if msg: print msg
269 sys.exit(code)
270
271
Victor Stinner453a6852017-05-09 17:06:34 +0200272def format_duration(seconds):
273 if seconds < 1.0:
274 return '%.0f ms' % (seconds * 1e3)
275 if seconds < 60.0:
276 return '%.0f sec' % seconds
277
278 minutes, seconds = divmod(seconds, 60.0)
279 return '%.0f min %.0f sec' % (minutes, seconds)
280
281
282_FORMAT_TEST_RESULT = {
283 PASSED: '%s passed',
284 FAILED: '%s failed',
285 ENV_CHANGED: '%s failed (env changed)',
286 SKIPPED: '%s skipped',
287 RESOURCE_DENIED: '%s skipped (resource denied)',
288 INTERRUPTED: '%s interrupted',
289 CHILD_ERROR: '%s crashed',
290}
291
292
293def format_test_result(test_name, result):
294 fmt = _FORMAT_TEST_RESULT.get(result, "%s")
295 return fmt % test_name
296
297
Victor Stinner8767de22017-07-05 10:52:06 +0200298def unload_test_modules(save_modules):
299 # Unload the newly imported modules (best effort finalization)
300 for module in sys.modules.keys():
301 if module not in save_modules and module.startswith("test."):
302 test_support.unload(module)
303
304
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000305def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000306 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000307 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000308 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000309 random_seed=None, use_mp=None, verbose3=False, forever=False,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300310 header=False, pgo=False, failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000311 """Execute a test suite.
312
Thomas Wouters7e474022000-07-16 12:04:32 +0000313 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000314 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000315
316 tests -- a list of strings containing test names (optional)
317 testdir -- the directory in which to look for tests (optional)
318
319 Users other than the Python test suite will certainly want to
320 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000321 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000322
323 If the tests argument is omitted, the tests listed on the
324 command-line will be used. If that's empty, too, then all *.py
325 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000326
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000327 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000328 single, randomize, findleaks, use_resources, trace, coverdir,
329 print_slow, and random_seed) allow programmers calling main()
330 directly to set the values that would normally be set by flags
331 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000332 """
Victor Stinner453a6852017-05-09 17:06:34 +0200333 regrtest_start_time = time.time()
Fred Drake004d5e62000-10-23 17:22:08 +0000334
Tim Peters8dee8092001-09-25 20:05:11 +0000335 test_support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000336 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300337 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:PGm:',
Georg Brandl71a015a2009-10-27 20:52:02 +0000338 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Victor Stinner453a6852017-05-09 17:06:34 +0200339 'exclude', 'single', 'slow', 'slowest', 'randomize', 'fromfile=',
340 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000341 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
342 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300343 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo',
Victor Stinner24c2c202017-06-16 17:30:03 +0200344 'failfast', 'match=', 'testdir=', 'list-tests', 'list-cases',
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200345 'coverage', 'matchfile=', 'fail-env-changed'])
Guido van Rossum152494a1996-12-20 03:12:20 +0000346 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000347 usage(2, msg)
348
349 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000350 if random_seed is None:
351 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000352 if use_resources is None:
353 use_resources = []
Victor Stinnerd2aff602017-05-09 13:57:20 +0200354 slaveargs = None
Victor Stinner453a6852017-05-09 17:06:34 +0200355 list_tests = False
Victor Stinner24c2c202017-06-16 17:30:03 +0200356 list_cases_opt = False
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200357 fail_env_changed = False
Guido van Rossum152494a1996-12-20 03:12:20 +0000358 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000359 if o in ('-h', '--help'):
360 usage(0)
361 elif o in ('-v', '--verbose'):
362 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000363 elif o in ('-w', '--verbose2'):
364 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000365 elif o in ('-W', '--verbose3'):
366 verbose3 = True
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300367 elif o in ('-G', '--failfast'):
368 failfast = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000369 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000370 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000371 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000372 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000373 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000374 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000375 single = True
Victor Stinner453a6852017-05-09 17:06:34 +0200376 elif o in ('-S', '--slow', '--slowest'):
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000377 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000378 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000379 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000380 elif o == '--randseed':
381 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000382 elif o in ('-f', '--fromfile'):
383 fromfile = a
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300384 elif o in ('-m', '--match'):
Victor Stinner24c2c202017-06-16 17:30:03 +0200385 if match_tests is None:
386 match_tests = []
387 match_tests.append(a)
388 elif o == '--matchfile':
389 if match_tests is None:
390 match_tests = []
391 filename = os.path.join(test_support.SAVEDCWD, a)
392 with open(filename) as fp:
393 for line in fp:
394 match_tests.append(line.strip())
Barry Warsaw08fca522001-08-20 22:33:46 +0000395 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000396 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000397 elif o in ('-L', '--runleaks'):
398 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000399 elif o in ('-t', '--threshold'):
400 import gc
401 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000402 elif o in ('-T', '--coverage'):
403 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000404 elif o in ('-D', '--coverdir'):
405 coverdir = os.path.join(os.getcwd(), a)
406 elif o in ('-N', '--nocoverdir'):
407 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000408 elif o in ('-R', '--huntrleaks'):
409 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000410 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000411 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000412 usage(2, '-R takes 2 or 3 colon-separated arguments')
413 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000414 huntrleaks[0] = 5
415 else:
416 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000417 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000418 huntrleaks[1] = 4
419 else:
420 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000421 if len(huntrleaks) == 2 or not huntrleaks[2]:
422 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000423 elif o in ('-M', '--memlimit'):
424 test_support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000425 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000426 u = [x.lower() for x in a.split(',')]
427 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000428 if r == 'all':
Victor Stinner80ebc432017-07-21 02:12:14 +0200429 use_resources[:] = ALL_RESOURCES
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000430 continue
431 remove = False
432 if r[0] == '-':
433 remove = True
434 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000435 if r not in RESOURCE_NAMES:
436 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000437 if remove:
438 if r in use_resources:
439 use_resources.remove(r)
440 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000441 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000442 elif o in ('-F', '--forever'):
443 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000444 elif o in ('-j', '--multiprocess'):
445 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000446 elif o == '--header':
447 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000448 elif o == '--slaveargs':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200449 slaveargs = a
Brett Cannon95374782015-10-02 16:21:34 -0700450 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700451 pgo = True
Victor Stinner453a6852017-05-09 17:06:34 +0200452 elif o == '--testdir':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200453 testdir = a
Victor Stinner453a6852017-05-09 17:06:34 +0200454 elif o == '--list-tests':
455 list_tests = True
Victor Stinner24c2c202017-06-16 17:30:03 +0200456 elif o == '--list-cases':
457 list_cases_opt = True
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200458 elif o == '--fail-env-changed':
459 fail_env_changed = True
R. David Murrayda826892009-11-15 00:04:32 +0000460 else:
461 print >>sys.stderr, ("No handler for option {}. Please "
462 "report this as a bug at http://bugs.python.org.").format(o)
463 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000464 if single and fromfile:
465 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000466 if use_mp and trace:
467 usage(2, "-T and -j don't go together!")
468 if use_mp and findleaks:
469 usage(2, "-l and -j don't go together!")
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300470 if failfast and not (verbose or verbose3):
471 usage("-G/--failfast needs either -v or -W")
Barry Warsaw08fca522001-08-20 22:33:46 +0000472
Victor Stinnerd2aff602017-05-09 13:57:20 +0200473 if testdir:
474 testdir = os.path.abspath(testdir)
475
476 # Prepend test directory to sys.path, so runtest() will be able
477 # to locate tests
478 sys.path.insert(0, testdir)
479
Victor Stinner30509872017-07-05 09:16:47 +0200480 # Make sure that '' and Lib/test/ are not in sys.path
481 regrtest_dir = os.path.abspath(os.path.dirname(__file__))
482 for path in ('', regrtest_dir):
483 try:
484 sys.path.remove(path)
485 except ValueError:
486 pass
487
Victor Stinnerd2aff602017-05-09 13:57:20 +0200488 if slaveargs is not None:
489 args, kwargs = json.loads(slaveargs)
Victor Stinner8bb08632017-06-16 12:14:09 +0200490 if kwargs['huntrleaks']:
491 warm_caches()
Victor Stinnerd2aff602017-05-09 13:57:20 +0200492 if testdir:
493 kwargs['testdir'] = testdir
494 try:
495 result = runtest(*args, **kwargs)
496 except BaseException, e:
497 result = INTERRUPTED, e.__class__.__name__
498 print # Force a newline (just in case)
499 print json.dumps(result)
500 sys.exit(0)
501
Victor Stinner8bb08632017-06-16 12:14:09 +0200502 if huntrleaks:
503 warm_caches()
504
Guido van Rossum152494a1996-12-20 03:12:20 +0000505 good = []
506 bad = []
507 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000508 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000509 environment_changed = []
Florent Xicluna75c66762010-03-30 16:31:14 +0000510 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000511
Neil Schemenauerd569f232000-09-22 15:29:28 +0000512 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000513 try:
514 import gc
515 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000516 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000517 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000518 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000519 # Uncomment the line below to report garbage that is not
520 # freeable by reference counting alone. By default only
521 # garbage that is not collectable by the GC is reported.
522 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000523 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000524
Barry Warsawe11e3de1999-01-28 19:51:51 +0000525 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000526 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000527 try:
528 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000529 next_test = fp.read().strip()
530 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000531 fp.close()
532 except IOError:
533 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000534
535 if fromfile:
536 tests = []
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000537 fp = open(os.path.join(test_support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000538 for line in fp:
539 guts = line.split() # assuming no test has whitespace in its name
540 if guts and not guts[0].startswith('#'):
541 tests.extend(guts)
542 fp.close()
543
544 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000545 removepy(args)
546 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000547
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000548 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000549 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000550 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000551 for arg in args:
552 if arg in stdtests:
553 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000554 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000555 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000556
R. David Murray98e3df32009-12-16 11:49:46 +0000557 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000558 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000559 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000560 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000561 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000562 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000563 except IndexError:
564 next_single_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200565
566 if list_tests:
567 for name in selected:
568 print(name)
569 sys.exit(0)
570
Victor Stinner24c2c202017-06-16 17:30:03 +0200571 if list_cases_opt:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200572 list_cases(testdir, selected, match_tests)
Victor Stinner24c2c202017-06-16 17:30:03 +0200573 sys.exit(0)
574
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000575 if trace:
576 import trace
Victor Stinnera5bb6242017-05-11 11:30:23 +0200577 tracer = trace.Trace(trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000578
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000579 test_times = []
Barry Warsaw08fca522001-08-20 22:33:46 +0000580 test_support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800581 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000582
583 def accumulate_result(test, result):
584 ok, test_time = result
Victor Stinnerc991eb22017-05-03 17:28:28 +0200585 if ok not in (CHILD_ERROR, INTERRUPTED):
586 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000587 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000588 good.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200589 elif ok in (FAILED, CHILD_ERROR):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000590 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000591 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000592 environment_changed.append(test)
593 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000594 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000595 elif ok == RESOURCE_DENIED:
596 skipped.append(test)
597 resource_denieds.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200598 elif ok != INTERRUPTED:
599 raise ValueError("invalid test result: %r" % ok)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000600
R. David Murray7f7eea62009-11-14 15:18:22 +0000601 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000602 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000603 while True:
604 for test in tests:
605 yield test
606 if bad:
607 return
Victor Stinnerd7955b82017-07-03 15:07:53 +0200608 if fail_env_changed and environment_changed:
609 return
R. David Murray7f7eea62009-11-14 15:18:22 +0000610 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200611 test_count = ''
612 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000613 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000614 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200615 test_count = '/{}'.format(len(selected))
616 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000617
Victor Stinner453a6852017-05-09 17:06:34 +0200618 def display_progress(test_index, test):
619 # "[ 51/405/1] test_tcl"
620 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
621 line = fmt.format(test_count_width, test_index, test_count,
622 len(bad), test)
623
624 # add the timestamp prefix: "0:01:05 "
625 test_time = time.time() - regrtest_start_time
626 test_time = datetime.timedelta(seconds=int(test_time))
627 line = "%s %s" % (test_time, line)
628
629 print(line)
630 sys.stdout.flush()
631
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200632 # For a partial run, we do not need to clutter the output.
633 if verbose or header or not (quiet or single or tests or args):
634 if not pgo:
635 # Print basic platform information
636 print "==", platform.python_implementation(), \
637 " ".join(sys.version.split())
638 print "== ", platform.platform(aliased=True), \
639 "%s-endian" % sys.byteorder
640 print "== ", os.getcwd()
641 print "Testing with flags:", sys.flags
642
643 if randomize:
644 random.seed(random_seed)
645 print "Using random seed", random_seed
646 random.shuffle(selected)
647
Antoine Pitrou4698d992009-05-31 14:20:14 +0000648 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000649 try:
650 from threading import Thread
651 except ImportError:
652 print "Multiprocess option requires thread support"
653 sys.exit(2)
Victor Stinner453a6852017-05-09 17:06:34 +0200654 from Queue import Queue, Empty
Georg Brandla4f46e12010-02-07 17:03:15 +0000655 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000656 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000657 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000658 def tests_and_args():
659 for test in tests:
660 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000661 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700662 dict(huntrleaks=huntrleaks, use_resources=use_resources,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300663 failfast=failfast,
664 match_tests=match_tests,
Brett Cannoneb2cb972015-10-16 12:30:20 -0700665 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000666 )
667 yield (test, args_tuple)
668 pending = tests_and_args()
Antoine Pitroua226c912010-10-14 11:15:50 +0000669 opt_args = test_support.args_from_interpreter_flags()
670 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700671 # required to spawn a new process with PGO flag on/off
672 if pgo:
673 base_cmd = base_cmd + ['--pgo']
Victor Stinner453a6852017-05-09 17:06:34 +0200674
675 class MultiprocessThread(Thread):
676 current_test = None
677 start_time = None
678
679 def runtest(self):
680 try:
681 test, args_tuple = next(pending)
682 except StopIteration:
683 output.put((None, None, None, None))
684 return True
685
686 # -E is needed by some tests, e.g. test_import
687 args = base_cmd + ['--slaveargs', json.dumps(args_tuple)]
688 if testdir:
689 args.extend(('--testdir', testdir))
690 try:
691 self.start_time = time.time()
692 self.current_test = test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200693 popen = Popen(args,
694 stdout=PIPE, stderr=PIPE,
695 universal_newlines=True,
696 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000697 stdout, stderr = popen.communicate()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200698 retcode = popen.wait()
Victor Stinner453a6852017-05-09 17:06:34 +0200699 finally:
700 self.current_test = None
Victor Stinnerc991eb22017-05-03 17:28:28 +0200701
Victor Stinner453a6852017-05-09 17:06:34 +0200702 # Strip last refcount output line if it exists, since it
703 # comes from the shutdown of the interpreter in the subcommand.
704 stderr = debug_output_pat.sub("", stderr)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200705
Victor Stinner453a6852017-05-09 17:06:34 +0200706 if retcode == 0:
707 stdout, _, result = stdout.strip().rpartition("\n")
708 if not result:
709 output.put((None, None, None, None))
710 return True
Victor Stinnerc991eb22017-05-03 17:28:28 +0200711
Victor Stinner453a6852017-05-09 17:06:34 +0200712 result = json.loads(result)
713 else:
714 result = (CHILD_ERROR, "Exit code %s" % retcode)
Victor Stinner228da422017-05-05 10:28:35 +0200715
Victor Stinner453a6852017-05-09 17:06:34 +0200716 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
717 return False
Victor Stinnerc991eb22017-05-03 17:28:28 +0200718
Victor Stinner453a6852017-05-09 17:06:34 +0200719 def run(self):
720 try:
721 stop = False
722 while not stop:
723 stop = self.runtest()
724 except BaseException:
725 output.put((None, None, None, None))
726 raise
727
728 workers = [MultiprocessThread() for i in range(use_mp)]
729 print("Run tests in parallel using %s child processes"
730 % len(workers))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000731 for worker in workers:
732 worker.start()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200733
Victor Stinner453a6852017-05-09 17:06:34 +0200734 def get_running(workers):
735 running = []
736 for worker in workers:
737 current_test = worker.current_test
738 if not current_test:
739 continue
740 dt = time.time() - worker.start_time
741 if dt >= PROGRESS_MIN_TIME:
742 running.append('%s (%.0f sec)' % (current_test, dt))
743 return running
744
Antoine Pitrou4698d992009-05-31 14:20:14 +0000745 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200746 test_index = 1
Victor Stinner453a6852017-05-09 17:06:34 +0200747 get_timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME)
R. David Murray7f7eea62009-11-14 15:18:22 +0000748 try:
749 while finished < use_mp:
Victor Stinner453a6852017-05-09 17:06:34 +0200750 try:
751 item = output.get(timeout=get_timeout)
752 except Empty:
753 running = get_running(workers)
754 if running and not pgo:
755 print('running: %s' % ', '.join(running))
756 continue
757
758 test, stdout, stderr, result = item
R. David Murray7f7eea62009-11-14 15:18:22 +0000759 if test is None:
760 finished += 1
761 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000762 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200763 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200764 ok, test_time = result
765 text = format_test_result(test, ok)
766 if (ok not in (CHILD_ERROR, INTERRUPTED)
767 and test_time >= PROGRESS_MIN_TIME
768 and not pgo):
769 text += ' (%.0f sec)' % test_time
770 running = get_running(workers)
771 if running and not pgo:
772 text += ' -- running: %s' % ', '.join(running)
773 display_progress(test_index, text)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200774
775 if stdout:
776 print stdout
777 sys.stdout.flush()
778 if stderr and not pgo:
779 print >>sys.stderr, stderr
780 sys.stderr.flush()
781
782 if result[0] == INTERRUPTED:
783 assert result[1] == 'KeyboardInterrupt'
784 raise KeyboardInterrupt # What else?
785
Victor Stinner32b1ff92014-09-05 12:12:11 +0200786 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000787 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000788 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000789 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000790 for worker in workers:
791 worker.join()
792 else:
Victor Stinner453a6852017-05-09 17:06:34 +0200793 print("Run tests sequentially")
794
795 previous_test = None
Brett Cannon65918e02015-10-02 16:22:32 -0700796 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000797 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200798 text = test
799 if previous_test:
800 text = '%s -- %s' % (text, previous_test)
801 display_progress(test_index, text)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200802
803 def local_runtest():
804 result = runtest(test, verbose, quiet, huntrleaks, None, pgo,
805 failfast=failfast,
806 match_tests=match_tests,
807 testdir=testdir)
808 accumulate_result(test, result)
809 return result
810
811 start_time = time.time()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000812 if trace:
813 # If we're tracing code coverage, then we don't exit with status
814 # if on a false return value from main.
Victor Stinnera5bb6242017-05-11 11:30:23 +0200815 ns = dict(locals())
816 tracer.runctx('result = local_runtest()',
817 globals=globals(), locals=ns)
818 result = ns['result']
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000819 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000820 try:
Victor Stinnera5bb6242017-05-11 11:30:23 +0200821 result = local_runtest()
Georg Brandl4045e882009-10-29 20:53:00 +0000822 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700823 if not pgo:
824 print "Re-running test %r in verbose mode" % test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200825 runtest(test, True, quiet, huntrleaks, None, pgo,
826 testdir=testdir)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000827 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000828 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000829 break
830 except:
831 raise
Victor Stinner453a6852017-05-09 17:06:34 +0200832
Victor Stinnera5bb6242017-05-11 11:30:23 +0200833 test_time = time.time() - start_time
834 previous_test = format_test_result(test, result[0])
835 if test_time >= PROGRESS_MIN_TIME:
836 previous_test = "%s in %s" % (previous_test,
837 format_duration(test_time))
838 elif result[0] == PASSED:
839 # be quiet: say nothing if the test passed shortly
840 previous_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200841
Antoine Pitrou4698d992009-05-31 14:20:14 +0000842 if findleaks:
843 gc.collect()
844 if gc.garbage:
845 print "Warning: test created", len(gc.garbage),
846 print "uncollectable object(s)."
847 # move the uncollectable objects somewhere so we don't see
848 # them again
849 found_garbage.extend(gc.garbage)
850 del gc.garbage[:]
Victor Stinner8767de22017-07-05 10:52:06 +0200851
852 unload_test_modules(save_modules)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000853
Brett Cannon95374782015-10-02 16:21:34 -0700854 if interrupted and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000855 # print a newline after ^C
856 print
857 print "Test suite interrupted by signal SIGINT."
858 omitted = set(selected) - set(good) - set(bad) - set(skipped)
859 print count(len(omitted), "test"), "omitted:"
860 printlist(omitted)
Brett Cannon95374782015-10-02 16:21:34 -0700861 if good and not quiet and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000862 if not bad and not skipped and not interrupted and len(good) > 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000863 print "All",
864 print count(len(good), "test"), "OK."
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000865 if print_slow:
866 test_times.sort(reverse=True)
867 print "10 slowest tests:"
Victor Stinner453a6852017-05-09 17:06:34 +0200868 for test_time, test in test_times[:10]:
869 print("- %s: %.1fs" % (test, test_time))
Brett Cannon95374782015-10-02 16:21:34 -0700870 if bad and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500871 print count(len(bad), "test"), "failed:"
872 printlist(bad)
Brett Cannon95374782015-10-02 16:21:34 -0700873 if environment_changed and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500874 print "{} altered the execution environment:".format(
875 count(len(environment_changed), "test"))
876 printlist(environment_changed)
Brett Cannon95374782015-10-02 16:21:34 -0700877 if skipped and not quiet and not pgo:
Tim Petersa45da922001-08-12 03:45:50 +0000878 print count(len(skipped), "test"), "skipped:"
879 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000880
Tim Petersb5b7b782001-08-12 01:20:39 +0000881 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000882 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000883 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000884 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000885 if surprise:
886 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000887 "unexpected on", plat + ":"
888 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000889 else:
890 print "Those skips are all expected on", plat + "."
891 else:
892 print "Ask someone to teach regrtest.py about which tests are"
893 print "expected to get skipped on", plat + "."
894
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000895 if verbose2 and bad:
896 print "Re-running failed tests in verbose mode"
Zachary Warea4777f12015-08-04 21:53:21 -0500897 for test in bad[:]:
Tim Peters922dd7d2006-03-10 23:37:10 +0000898 print "Re-running test %r in verbose mode" % test
899 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000900 try:
Neal Norwitz5fe5cf62008-03-18 17:58:02 +0000901 test_support.verbose = True
Victor Stinnerd2aff602017-05-09 13:57:20 +0200902 ok = runtest(test, True, quiet, huntrleaks, None, pgo,
903 testdir=testdir)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000904 except KeyboardInterrupt:
905 # print a newline separate from the ^C
906 print
907 break
Zachary Warea4777f12015-08-04 21:53:21 -0500908 else:
909 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
910 bad.remove(test)
911 else:
912 if bad:
913 print count(len(bad), "test"), "failed again:"
914 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000915
Barry Warsawe11e3de1999-01-28 19:51:51 +0000916 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000917 if next_single_test:
918 with open(filename, 'w') as fp:
919 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000920 else:
921 os.unlink(filename)
922
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000923 if trace:
924 r = tracer.results()
925 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
926
Skip Montanaro0179a182004-06-06 15:53:18 +0000927 if runleaks:
928 os.system("leaks %d" % os.getpid())
929
Victor Stinner453a6852017-05-09 17:06:34 +0200930 print
931 duration = time.time() - regrtest_start_time
932 print("Total duration: %s" % format_duration(duration))
933
934 if bad:
935 result = "FAILURE"
936 elif interrupted:
937 result = "INTERRUPTED"
Victor Stinnerd7955b82017-07-03 15:07:53 +0200938 elif fail_env_changed and environment_changed:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200939 result = "ENV CHANGED"
Victor Stinner453a6852017-05-09 17:06:34 +0200940 else:
941 result = "SUCCESS"
942 print("Tests result: %s" % result)
943
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200944 if bad:
945 sys.exit(2)
946 if interrupted:
947 sys.exit(130)
948 if fail_env_changed and environment_changed:
949 sys.exit(3)
950 sys.exit(0)
Barry Warsaw08fca522001-08-20 22:33:46 +0000951
Guido van Rossum152494a1996-12-20 03:12:20 +0000952
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000953STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000954 'test_grammar',
955 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +0000956 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000957 'test_builtin',
958 'test_exceptions',
959 'test_types',
Collin Winter55453142007-03-08 19:58:14 +0000960 'test_unittest',
961 'test_doctest',
962 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000963]
Guido van Rossum152494a1996-12-20 03:12:20 +0000964
Florent Xicluna12d750d2010-03-06 14:38:09 +0000965NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +0000966 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000967 'test_future1',
968 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000969}
Guido van Rossum152494a1996-12-20 03:12:20 +0000970
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000971def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000972 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +0000973 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +0000974 names = os.listdir(testdir)
975 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +0000976 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +0000977 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +0000978 modname, ext = os.path.splitext(name)
979 if modname[:5] == "test_" and ext == ".py" and modname not in others:
980 tests.append(modname)
981 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +0000982
Antoine Pitrou4698d992009-05-31 14:20:14 +0000983def runtest(test, verbose, quiet,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300984 huntrleaks=False, use_resources=None, pgo=False,
Victor Stinnerd2aff602017-05-09 13:57:20 +0200985 failfast=False, match_tests=None, testdir=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000986 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +0000987
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000988 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000989 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000990 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000991 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +0000992 huntrleaks -- run multiple times to test for leaks; requires a debug
993 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -0700994 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -0700995 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -0700996
Georg Brandl4045e882009-10-29 20:53:00 +0000997 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +0200998 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +0000999 INTERRUPTED KeyboardInterrupt when run under -j
1000 RESOURCE_DENIED test skipped because resource denied
1001 SKIPPED test skipped for some other reason
1002 ENV_CHANGED test failed because it changed the execution environment
1003 FAILED test failed
1004 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +00001005 """
Tim Peters06c5c002006-06-05 00:55:26 +00001006
Antoine Pitrou4698d992009-05-31 14:20:14 +00001007 test_support.verbose = verbose # Tell tests to be moderately quiet
1008 if use_resources is not None:
1009 test_support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +00001010 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001011 test_support.match_tests = match_tests
1012 if failfast:
1013 test_support.failfast = True
Victor Stinnerd2aff602017-05-09 13:57:20 +02001014 return runtest_inner(test, verbose, quiet, huntrleaks, pgo, testdir)
Tim Peterse5584862006-06-09 19:24:44 +00001015 finally:
1016 cleanup_test_droppings(test, verbose)
1017
R. David Murray14dcd432009-10-14 13:58:07 +00001018
1019# Unit tests are supposed to leave the execution environment unchanged
1020# once they complete. But sometimes tests have bugs, especially when
1021# tests fail, and the changes to environment go on to mess up other
1022# tests. This can cause issues with buildbot stability, since tests
1023# are run in random order and so problems may appear to come and go.
1024# There are a few things we can save and restore to mitigate this, and
1025# the following context manager handles this task.
1026
1027class saved_test_environment:
1028 """Save bits of the test environment and restore them at block exit.
1029
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001030 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +00001031 #stuff
1032
1033 Unless quiet is True, a warning is printed to stderr if any of
1034 the saved items was changed by the test. The attribute 'changed'
1035 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001036
1037 If verbose is more than 1, the before and after state of changed
1038 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +00001039 """
1040
1041 changed = False
1042
Brett Cannon95374782015-10-02 16:21:34 -07001043 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +00001044 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001045 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +00001046 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -07001047 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +00001048
1049 # To add things to save and restore, add a name XXX to the resources list
1050 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
1051 # return the value to be saved and compared against a second call to the
1052 # get function when test execution completes. restore_XXX should accept
1053 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001054 # and only if a change in the value is detected.
1055 #
1056 # Note: XXX will have any '.' replaced with '_' characters when determining
1057 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +00001058
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001059 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001060 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001061 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001062 )
R. David Murray14dcd432009-10-14 13:58:07 +00001063
1064 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001065 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001066 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +00001067 sys.argv = saved_argv[1]
1068 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001069
1070 def get_cwd(self):
1071 return os.getcwd()
1072 def restore_cwd(self, saved_cwd):
1073 os.chdir(saved_cwd)
1074
1075 def get_sys_stdout(self):
1076 return sys.stdout
1077 def restore_sys_stdout(self, saved_stdout):
1078 sys.stdout = saved_stdout
1079
1080 def get_sys_stderr(self):
1081 return sys.stderr
1082 def restore_sys_stderr(self, saved_stderr):
1083 sys.stderr = saved_stderr
1084
1085 def get_sys_stdin(self):
1086 return sys.stdin
1087 def restore_sys_stdin(self, saved_stdin):
1088 sys.stdin = saved_stdin
1089
1090 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001091 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +00001092 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +00001093 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +00001094 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +00001095 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +00001096
1097 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001098 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001099 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +00001100 sys.path = saved_path[1]
1101 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001102
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001103 def get_asyncore_socket_map(self):
1104 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001105 # XXX Making a copy keeps objects alive until __exit__ gets called.
1106 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001107 def restore_asyncore_socket_map(self, saved_map):
1108 asyncore = sys.modules.get('asyncore')
1109 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001110 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001111 asyncore.socket_map.update(saved_map)
1112
Vinay Sajipda563bf2012-03-06 20:07:15 +00001113 def get_test_support_TESTFN(self):
1114 if os.path.isfile(test_support.TESTFN):
1115 result = 'f'
1116 elif os.path.isdir(test_support.TESTFN):
1117 result = 'd'
1118 else:
1119 result = None
1120 return result
1121 def restore_test_support_TESTFN(self, saved_value):
1122 if saved_value is None:
1123 if os.path.isfile(test_support.TESTFN):
1124 os.unlink(test_support.TESTFN)
1125 elif os.path.isdir(test_support.TESTFN):
1126 shutil.rmtree(test_support.TESTFN)
1127
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001128 def get_files(self):
1129 return sorted(fn + ('/' if os.path.isdir(fn) else '')
1130 for fn in os.listdir(os.curdir))
1131 def restore_files(self, saved_value):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001132 fn = test_support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001133 if fn not in saved_value and (fn + '/') not in saved_value:
1134 if os.path.isfile(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001135 test_support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001136 elif os.path.isdir(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001137 test_support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001138
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001139 def resource_info(self):
1140 for name in self.resources:
1141 method_suffix = name.replace('.', '_')
1142 get_name = 'get_' + method_suffix
1143 restore_name = 'restore_' + method_suffix
1144 yield name, getattr(self, get_name), getattr(self, restore_name)
1145
R. David Murray14dcd432009-10-14 13:58:07 +00001146 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001147 self.saved_values = dict((name, get()) for name, get, restore
1148 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +00001149 return self
1150
1151 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001152 saved_values = self.saved_values
1153 del self.saved_values
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001154 for name, get, restore in self.resource_info():
1155 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001156 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001157 # Check for changes to the resource's value
1158 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +00001159 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001160 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -07001161 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001162 print >>sys.stderr, (
1163 "Warning -- {} was modified by {}".format(
1164 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +02001165 print >>sys.stderr, (
1166 " Before: {}\n After: {} ".format(
1167 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001168 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
1169 # matters at least as much as value. For others (e.g. cwd),
1170 # identity is irrelevant. Should we add a mechanism to check
1171 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +00001172 return False
1173
1174
Victor Stinner1247e2c2017-08-10 16:45:38 +02001175def post_test_cleanup():
1176 test_support.reap_children()
1177
Victor Stinnerd2aff602017-05-09 13:57:20 +02001178def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None):
Guido van Rossum152494a1996-12-20 03:12:20 +00001179 test_support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +00001180 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001181 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001182 else:
Michael Foord91a2c892010-04-08 00:04:24 +00001183 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +00001184
Antoine Pitrou4698d992009-05-31 14:20:14 +00001185 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +00001186 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +00001187 try:
Tim Peters342ca752001-09-25 19:13:20 +00001188 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +00001189 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001190 if capture_stdout:
1191 sys.stdout = capture_stdout
Victor Stinner24c2c202017-06-16 17:30:03 +02001192 abstest = get_abs_module(testdir, test)
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001193 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -07001194 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +00001195 start_time = time.time()
1196 the_package = __import__(abstest, globals(), locals(), [])
Victor Stinnerd2aff602017-05-09 13:57:20 +02001197 if abstest.startswith('test.'):
1198 the_module = getattr(the_package, test)
1199 else:
1200 the_module = the_package
R. David Murray14dcd432009-10-14 13:58:07 +00001201 # Old tests run to completion simply as a side-effect of
1202 # being imported. For tests based on unittest or doctest,
1203 # explicitly invoke their test_main() function (if it exists).
1204 indirect_test = getattr(the_module, "test_main", None)
1205 if indirect_test is not None:
1206 indirect_test()
1207 if huntrleaks:
1208 refleak = dash_R(the_module, test, indirect_test,
1209 huntrleaks)
1210 test_time = time.time() - start_time
Victor Stinner1247e2c2017-08-10 16:45:38 +02001211 post_test_cleanup()
Guido van Rossum41360a41998-03-26 19:42:58 +00001212 finally:
Tim Peters342ca752001-09-25 19:13:20 +00001213 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +00001214 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001215 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +00001216 print test, "skipped --", msg
1217 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001218 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +00001219 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001220 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +00001221 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001222 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001223 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +00001224 except KeyboardInterrupt:
1225 raise
Guido van Rossum152494a1996-12-20 03:12:20 +00001226 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001227 if not pgo:
1228 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +00001229 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001230 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001231 except:
Guido van Rossum41360a41998-03-26 19:42:58 +00001232 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -07001233 if not pgo:
1234 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +00001235 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -07001236 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +00001237 traceback.print_exc(file=sys.stderr)
1238 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001239 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001240 else:
Collin Winter0f489742009-05-14 23:26:30 +00001241 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +00001242 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +00001243 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +00001244 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001245 # Except in verbose mode, tests should not print anything
1246 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001247 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001248 output = capture_stdout.getvalue()
1249 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001250 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001251 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001252 print "*" * 70
1253 print output
1254 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001255 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001256 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001257
Tim Peterse5584862006-06-09 19:24:44 +00001258def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001259 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001260 import gc
1261
1262 # First kill any dangling references to open files etc.
1263 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001264
1265 # Try to clean up junk commonly left behind. While tests shouldn't leave
1266 # any files or directories behind, when a test fails that can be tedious
1267 # for it to arrange. The consequences can be especially nasty on Windows,
1268 # since if a test leaves a file open, it cannot be deleted by name (while
1269 # there's nothing we can do about that here either, we can display the
1270 # name of the offending test, which is a real help).
1271 for name in (test_support.TESTFN,
1272 "db_home",
1273 ):
1274 if not os.path.exists(name):
1275 continue
1276
1277 if os.path.isdir(name):
1278 kind, nuker = "directory", shutil.rmtree
1279 elif os.path.isfile(name):
1280 kind, nuker = "file", os.unlink
1281 else:
1282 raise SystemError("os.path says %r exists but is neither "
1283 "directory nor file" % name)
1284
1285 if verbose:
1286 print "%r left behind %s %r" % (testname, kind, name)
1287 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001288 # if we have chmod, fix possible permissions problems
1289 # that might prevent cleanup
1290 if (hasattr(os, 'chmod')):
1291 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001292 nuker(name)
1293 except Exception, msg:
1294 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1295 "removed: %s" % (testname, kind, name, msg))
1296
Tim Peters06c5c002006-06-05 00:55:26 +00001297def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001298 """Run a test multiple times, looking for reference leaks.
1299
1300 Returns:
1301 False if the test didn't leak references; True if we detected refleaks.
1302 """
Tim Peters06c5c002006-06-05 00:55:26 +00001303 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001304 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001305
1306 if not hasattr(sys, 'gettotalrefcount'):
1307 raise Exception("Tracking reference leaks requires a debug build "
1308 "of Python")
1309
1310 # Save current values for dash_R_cleanup() to restore.
1311 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001312 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001313 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001314 try:
1315 import zipimport
1316 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001317 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001318 else:
1319 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001320 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001321 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001322 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1323 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1324 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001325 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001326 for obj in abc.__subclasses__() + [abc]:
1327 abcs[obj] = obj._abc_registry.copy()
1328
Tim Peters06c5c002006-06-05 00:55:26 +00001329 if indirect_test:
1330 def run_the_test():
1331 indirect_test()
1332 else:
1333 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001334 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001335
1336 deltas = []
1337 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001338 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001339 repcount = nwarmup + ntracked
1340 print >> sys.stderr, "beginning", repcount, "repetitions"
1341 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001342 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001343 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001344 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001345 run_the_test()
1346 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001347 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001348 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001349 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001350 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001351 print >> sys.stderr
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001352
1353 # bpo-30776: Try to ignore false positives:
1354 #
1355 # [3, 0, 0]
1356 # [0, 1, 0]
1357 # [8, -8, 1]
1358 #
1359 # Expected leaks:
1360 #
1361 # [5, 5, 6]
1362 # [10, 1, 1]
1363 if all(delta >= 1 for delta in deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001364 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1365 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001366 with open(fname, "a") as refrep:
1367 print >> refrep, msg
1368 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001369 return True
1370 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001371
Benjamin Peterson55035792014-02-16 14:51:17 -05001372def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001373 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001374
Tim Peters06c5c002006-06-05 00:55:26 +00001375 # Restore some original values.
1376 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001377 copy_reg.dispatch_table.clear()
1378 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001379 sys.path_importer_cache.clear()
1380 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001381 try:
1382 import zipimport
1383 except ImportError:
1384 pass # Run unmodified on platforms without zipimport support
1385 else:
1386 zipimport._zip_directory_cache.clear()
1387 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001388
Christian Heimes908caac2008-01-27 23:34:59 +00001389 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001390 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001391
Guido van Rossum64c06e32007-11-22 00:55:51 +00001392 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001393 for abc, registry in abcs.items():
1394 abc._abc_registry = registry.copy()
1395 abc._abc_cache.clear()
1396 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001397
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001398 clear_caches()
1399
1400def clear_caches():
1401 import gc
1402
1403 # Clear the warnings registry, so they can be displayed again
1404 for mod in sys.modules.values():
1405 if hasattr(mod, '__warningregistry__'):
1406 del mod.__warningregistry__
1407
Tim Peters06c5c002006-06-05 00:55:26 +00001408 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001409 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001410 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001411 distutils_dir_util = sys.modules['distutils.dir_util']
1412 except KeyError:
1413 pass
1414 else:
1415 distutils_dir_util._path_created.clear()
1416
1417 re.purge()
1418
1419 try:
1420 _strptime = sys.modules['_strptime']
1421 except KeyError:
1422 pass
1423 else:
1424 _strptime._regex_cache.clear()
1425
1426 try:
1427 urlparse = sys.modules['urlparse']
1428 except KeyError:
1429 pass
1430 else:
1431 urlparse.clear_cache()
1432
1433 try:
1434 urllib = sys.modules['urllib']
1435 except KeyError:
1436 pass
1437 else:
1438 urllib.urlcleanup()
1439
1440 try:
1441 urllib2 = sys.modules['urllib2']
1442 except KeyError:
1443 pass
1444 else:
1445 urllib2.install_opener(None)
1446
1447 try:
1448 dircache = sys.modules['dircache']
1449 except KeyError:
1450 pass
1451 else:
1452 dircache.reset()
1453
1454 try:
1455 linecache = sys.modules['linecache']
1456 except KeyError:
1457 pass
1458 else:
1459 linecache.clearcache()
1460
1461 try:
1462 mimetypes = sys.modules['mimetypes']
1463 except KeyError:
1464 pass
1465 else:
1466 mimetypes._default_mime_types()
1467
1468 try:
1469 filecmp = sys.modules['filecmp']
1470 except KeyError:
1471 pass
1472 else:
1473 filecmp._cache.clear()
1474
1475 try:
1476 struct = sys.modules['struct']
1477 except KeyError:
1478 pass
1479 else:
1480 struct._clearcache()
1481
1482 try:
1483 doctest = sys.modules['doctest']
1484 except KeyError:
1485 pass
1486 else:
1487 doctest.master = None
1488
1489 try:
1490 ctypes = sys.modules['ctypes']
1491 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001492 pass
1493 else:
1494 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001495
1496 # Collect cyclic trash.
1497 gc.collect()
1498
Victor Stinner8bb08632017-06-16 12:14:09 +02001499def warm_caches():
1500 """Create explicitly internal singletons which are created on demand
1501 to prevent false positive when hunting reference leaks."""
1502 # char cache
1503 for i in range(256):
1504 chr(i)
1505 # unicode cache
1506 for i in range(256):
1507 unichr(i)
1508 # int cache
1509 list(range(-5, 257))
1510
Florent Xicluna0932dc52010-03-06 08:07:44 +00001511def findtestdir(path=None):
1512 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001513
Florent Xicluna0932dc52010-03-06 08:07:44 +00001514def removepy(names):
1515 if not names:
1516 return
1517 for idx, name in enumerate(names):
1518 basename, ext = os.path.splitext(name)
1519 if ext == '.py':
1520 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001521
Guido van Rossum152494a1996-12-20 03:12:20 +00001522def count(n, word):
1523 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001524 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001525 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001526 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001527
Victor Stinner24c2c202017-06-16 17:30:03 +02001528def printlist(x, width=70, indent=4, file=None):
Tim Peters7c7efe92002-08-23 17:55:54 +00001529 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001530
1531 Optional arg width (default 70) is the maximum line length.
1532 Optional arg indent (default 4) is the number of blanks with which to
1533 begin each line.
1534 """
1535
Tim Petersba78bc42002-07-04 19:45:06 +00001536 from textwrap import fill
1537 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001538 # Print the sorted list: 'x' may be a '--random' list or a set()
Victor Stinner24c2c202017-06-16 17:30:03 +02001539 print >>file, fill(' '.join(str(elt) for elt in sorted(x)), width,
1540 initial_indent=blanks, subsequent_indent=blanks)
1541
1542def get_abs_module(testdir, test):
1543 if test.startswith('test.') or testdir:
1544 return test
1545 else:
1546 # Always import it from the test package
1547 return 'test.' + test
1548
1549def _list_cases(suite):
1550 for test in suite:
1551 if isinstance(test, unittest.TestSuite):
1552 _list_cases(test)
1553 elif isinstance(test, unittest.TestCase):
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001554 if test_support._match_test(test):
1555 print(test.id())
Victor Stinner24c2c202017-06-16 17:30:03 +02001556
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001557def list_cases(testdir, selected, match_tests):
1558 test_support.verbose = False
1559 test_support.match_tests = match_tests
1560
Victor Stinner8767de22017-07-05 10:52:06 +02001561 save_modules = set(sys.modules)
Victor Stinner24c2c202017-06-16 17:30:03 +02001562 skipped = []
1563 for test in selected:
1564 abstest = get_abs_module(testdir, test)
1565 try:
1566 suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
1567 _list_cases(suite)
1568 except unittest.SkipTest:
1569 skipped.append(test)
1570
Victor Stinner8767de22017-07-05 10:52:06 +02001571 unload_test_modules(save_modules)
1572
Victor Stinner24c2c202017-06-16 17:30:03 +02001573 if skipped:
1574 print >>sys.stderr
1575 print >>sys.stderr, count(len(skipped), "test"), "skipped:"
1576 printlist(skipped, file=sys.stderr)
Tim Petersa45da922001-08-12 03:45:50 +00001577
Tim Petersde14a302002-04-01 05:04:46 +00001578# Map sys.platform to a string containing the basenames of tests
1579# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001580#
1581# Special cases:
1582# test_pep277
1583# The _ExpectedSkips constructor adds this to the set of expected
1584# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001585# test_timeout
1586# Controlled by test_timeout.skip_expected. Requires the network
1587# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001588#
1589# Tests that are expected to be skipped everywhere except on one platform
1590# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001591
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001592_expectations = {
1593 'win32':
1594 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001595 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001596 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001597 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001598 test_commands
1599 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001600 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001601 test_dbm
1602 test_dl
1603 test_fcntl
1604 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001605 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001606 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001607 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001608 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001609 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001610 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001611 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001612 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001613 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001614 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001615 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001616 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001617 test_pty
1618 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001619 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001620 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001621 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001622 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001623 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001624 test_wait3
1625 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001626 """,
1627 'linux2':
1628 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001629 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001630 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001631 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001632 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001633 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001634 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001635 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001636 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001637 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001638 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001639 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001640 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001641 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001642 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001643 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001644 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001645 test_openpty
1646 test_pyexpat
1647 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001648 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001649 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001650 'openunix8':
1651 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001652 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001653 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001654 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001655 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001656 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001657 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001658 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001659 test_openpty
1660 test_pyexpat
1661 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001662 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001663 """,
1664 'sco_sv3':
1665 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001666 test_asynchat
1667 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001668 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001669 test_dl
1670 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001671 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001672 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001673 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001674 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001675 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001676 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001677 test_openpty
1678 test_pyexpat
1679 test_queue
1680 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001681 test_sundry
1682 test_thread
1683 test_threaded_import
1684 test_threadedtempfile
1685 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001686 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001687 'riscos':
1688 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001689 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001690 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001691 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001692 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001693 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001694 test_commands
1695 test_crypt
1696 test_dbm
1697 test_dl
1698 test_fcntl
1699 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001700 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001701 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001702 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001703 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001704 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001705 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001706 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001707 test_openpty
1708 test_poll
1709 test_popen2
1710 test_pty
1711 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001712 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001713 test_sundry
1714 test_thread
1715 test_threaded_import
1716 test_threadedtempfile
1717 test_threading
1718 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001719 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001720 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001721 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001722 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001723 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001724 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001725 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001726 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001727 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001728 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001729 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001730 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001731 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001732 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001733 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001734 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001735 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001736 'sunos5':
1737 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001738 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001739 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001740 test_curses
1741 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001742 test_epoll
1743 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001744 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001745 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001746 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001747 test_zipfile
1748 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001749 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001750 'hp-ux11':
1751 """
Skip Montanarob3230212002-03-15 02:54:03 +00001752 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001753 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001754 test_curses
1755 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001756 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001757 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001758 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001759 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001760 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001761 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001762 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001763 test_openpty
1764 test_pyexpat
1765 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001766 test_zipfile
1767 test_zlib
1768 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001769 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001770 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001771 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001772 test_curses
1773 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001774 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001775 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001776 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001777 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001778 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001779 test_mhlib
1780 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001781 test_poll
1782 test_popen2
1783 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001784 """,
Jason Tishler25115942002-12-05 15:18:15 +00001785 'cygwin':
1786 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001787 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001788 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001789 test_curses
1790 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001791 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001792 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001793 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001794 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001795 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001796 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001797 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001798 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001799 'os2emx':
1800 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001801 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001802 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001803 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001804 test_commands
1805 test_curses
1806 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001807 test_epoll
1808 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001809 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001810 test_mhlib
1811 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001812 test_openpty
1813 test_ossaudiodev
1814 test_pty
1815 test_resource
1816 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001817 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001818 'freebsd4':
1819 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001820 test_bsddb
1821 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001822 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001823 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001824 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001825 test_ossaudiodev
1826 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001827 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001828 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001829 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001830 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001831 test_ttk_guionly
1832 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001833 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001834 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001835 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001836 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001837 'aix5':
1838 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001839 test_bsddb
1840 test_bsddb185
1841 test_bsddb3
1842 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001843 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001844 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001845 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001846 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001847 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001848 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001849 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001850 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001851 test_ttk_guionly
1852 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001853 test_zipimport
1854 test_zlib
1855 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001856 'openbsd3':
1857 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001858 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001859 test_bsddb
1860 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001861 test_ctypes
1862 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001863 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001864 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001865 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001866 test_normalization
1867 test_ossaudiodev
1868 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001869 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001870 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001871 test_ttk_guionly
1872 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001873 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001874 """,
Georg Brandl08706872006-06-21 17:53:17 +00001875 'netbsd3':
1876 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001877 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001878 test_bsddb
1879 test_bsddb185
1880 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001881 test_ctypes
1882 test_curses
1883 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001884 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001885 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001886 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001887 test_ossaudiodev
1888 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001889 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001890 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001891 test_ttk_guionly
1892 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001893 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001894 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001895}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001896_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001897_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001898_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001899_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001900
Tim Petersb5b7b782001-08-12 01:20:39 +00001901class _ExpectedSkips:
1902 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001903 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001904 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001905
Tim Peters7c7efe92002-08-23 17:55:54 +00001906 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001907 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001908 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001909 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001910
Georg Brandlb2e208f2007-07-12 09:24:04 +00001911 # expected to be skipped on every platform, even Linux
1912 self.expected.add('test_linuxaudiodev')
1913
Tim Peters2a182db2002-10-09 01:07:11 +00001914 if not os.path.supports_unicode_filenames:
1915 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001916
Neal Norwitz55b61d22003-02-28 19:57:03 +00001917 if test_timeout.skip_expected:
1918 self.expected.add('test_timeout')
1919
Martin v. Löwisfba73692004-11-13 11:13:35 +00001920 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001921 self.expected.add('test_imageop')
1922
Ronald Oussoren9545a232010-05-05 19:09:31 +00001923 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001924 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001925 "test_plistlib", "test_scriptpackages",
1926 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001927 for skip in MAC_ONLY:
1928 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001929 elif len(u'\0'.encode('unicode-internal')) == 4:
1930 self.expected.add("test_macostools")
1931
Tim Petersecd79eb2003-01-29 00:35:32 +00001932
1933 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001934 # test_sqlite is only reliable on Windows where the library
1935 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001936 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001937 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001938 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001939 for skip in WIN_ONLY:
1940 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001941
Brett Cannondc48b742007-05-20 07:09:50 +00001942 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001943 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1944 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001945 for skip in IRIX_ONLY:
1946 self.expected.add(skip)
1947
Georg Brandlb2e208f2007-07-12 09:24:04 +00001948 if sys.platform != 'sunos5':
1949 self.expected.add('test_sunaudiodev')
1950 self.expected.add('test_nis')
1951
Steven Bethardd290b042008-03-21 21:01:18 +00001952 if not sys.py3kwarning:
1953 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001954
Tim Peters7c7efe92002-08-23 17:55:54 +00001955 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001956
1957 def isvalid(self):
1958 "Return true iff _ExpectedSkips knows about the current platform."
1959 return self.valid
1960
1961 def getexpected(self):
1962 """Return set of test names we expect to skip on current platform.
1963
1964 self.isvalid() must be true.
1965 """
1966
1967 assert self.isvalid()
1968 return self.expected
1969
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001970def main_in_temp_cwd():
1971 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02001972 global TEMPDIR
1973
Florent Xicluna0932dc52010-03-06 08:07:44 +00001974 # When tests are run from the Python build directory, it is best practice
1975 # to keep the test files in a subfolder. It eases the cleanup of leftover
1976 # files using command "make distclean".
1977 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00001978 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
1979 TEMPDIR = os.path.abspath(TEMPDIR)
1980 if not os.path.exists(TEMPDIR):
1981 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001982
1983 # Define a writable temp dir that will be used as cwd while running
1984 # the tests. The name of the dir includes the pid to allow parallel
1985 # testing (see the -j option).
1986 TESTCWD = 'test_python_{}'.format(os.getpid())
1987
Florent Xicluna12735662010-04-23 18:10:12 +00001988 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001989
1990 # Run the tests in a context manager that temporary changes the CWD to a
1991 # temporary and writable directory. If it's not possible to create or
1992 # change the CWD, the original CWD will be used. The original CWD is
1993 # available from test_support.SAVEDCWD.
1994 with test_support.temp_cwd(TESTCWD, quiet=True):
1995 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001996
1997if __name__ == '__main__':
1998 # findtestdir() gets the dirname out of __file__, so we have to make it
1999 # absolute before changing the working directory.
2000 # For example __file__ may be relative when running trace or profile.
2001 # See issue #9323.
2002 global __file__
2003 __file__ = os.path.abspath(__file__)
2004
2005 # sanity check
2006 assert __file__ == os.path.abspath(sys.argv[0])
2007
2008 main_in_temp_cwd()