blob: fc4681f04112e267678e5cc391212edf6cb952b9 [file] [log] [blame]
Guido van Rossum152494a1996-12-20 03:12:20 +00001#! /usr/bin/env python
2
R. David Murray3bfa8832010-04-26 16:54:57 +00003"""
4Usage:
Guido van Rossum152494a1996-12-20 03:12:20 +00005
R. David Murray3bfa8832010-04-26 16:54:57 +00006python -m test.regrtest [options] [test_name1 [test_name2 ...]]
7python path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
Guido van Rossum152494a1996-12-20 03:12:20 +00008
R. David Murray3bfa8832010-04-26 16:54:57 +00009
10If no arguments or options are provided, finds all files matching
11the pattern "test_*" in the Lib/test subdirectory and runs
12them in alphabetical order (but see -M and -u, below, for exceptions).
13
14For more rigorous testing, it is useful to use the following
15command line:
16
17python -E -tt -Wd -3 -m test.regrtest [options] [test_name1 ...]
18
19
20Options:
Guido van Rossum152494a1996-12-20 03:12:20 +000021
Georg Brandl83191702009-10-27 20:55:44 +000022-h/--help -- print this text and exit
23
24Verbosity
25
26-v/--verbose -- run tests in verbose mode with output to stdout
27-w/--verbose2 -- re-run failed tests in verbose mode
28-W/--verbose3 -- re-run failed tests in verbose mode immediately
R. David Murray3bfa8832010-04-26 16:54:57 +000029-q/--quiet -- no output unless one or more tests fail
Victor Stinner453a6852017-05-09 17:06:34 +020030-S/--slowest -- print the slowest 10 tests
Antoine Pitrou8c688be2011-01-03 20:49:01 +000031 --header -- print header with interpreter info
Georg Brandl83191702009-10-27 20:55:44 +000032
33Selecting tests
34
Chris Jerdonek3684c792012-12-27 18:14:01 -080035-r/--randomize -- randomize test execution order (see below)
Antoine Pitrou8c688be2011-01-03 20:49:01 +000036 --randseed -- pass a random seed to reproduce a previous random run
Georg Brandl83191702009-10-27 20:55:44 +000037-f/--fromfile -- read names of tests to run from a file (see below)
38-x/--exclude -- arguments are tests to *exclude*
R. David Murray3bfa8832010-04-26 16:54:57 +000039-s/--single -- single step through a set of tests (see below)
Serhiy Storchaka74f0db82017-05-04 00:23:50 +030040-m/--match PAT -- match test cases and methods with glob pattern PAT
Victor Stinner24c2c202017-06-16 17:30:03 +020041--matchfile FILENAME -- filters tests using a text file, one pattern per line
Serhiy Storchaka74f0db82017-05-04 00:23:50 +030042-G/--failfast -- fail as soon as a test fails (only with -v or -W)
Georg Brandl83191702009-10-27 20:55:44 +000043-u/--use RES1,RES2,...
44 -- specify which special resource intensive tests to run
45-M/--memlimit LIMIT
46 -- run very large memory-consuming tests
47
48Special runs
49
50-l/--findleaks -- if GC is available detect tests that leak memory
51-L/--runleaks -- run the leaks(1) command just before exit
52-R/--huntrleaks RUNCOUNTS
53 -- search for reference leaks (needs debug build, v. slow)
54-j/--multiprocess PROCESSES
55 -- run PROCESSES processes at once
R. David Murray3bfa8832010-04-26 16:54:57 +000056-T/--coverage -- turn on code coverage tracing using the trace module
Georg Brandl83191702009-10-27 20:55:44 +000057-D/--coverdir DIRECTORY
58 -- Directory where coverage files are put
59-N/--nocoverdir -- Put coverage files alongside modules
60-t/--threshold THRESHOLD
61 -- call gc.set_threshold(THRESHOLD)
R. David Murray3bfa8832010-04-26 16:54:57 +000062-F/--forever -- run the specified tests in a loop, until an error happens
Brett Cannon95374782015-10-02 16:21:34 -070063-P/--pgo -- enable Profile Guided Optimization training
Victor Stinnerd2aff602017-05-09 13:57:20 +020064--testdir -- execute test files in the specified directory
65 (instead of the Python stdlib test suite)
Victor Stinner453a6852017-05-09 17:06:34 +020066--list-tests -- only write the name of tests that will be run,
67 don't execute them
Victor Stinner24c2c202017-06-16 17:30:03 +020068--list-cases -- only write the name of test cases that will be run,
69 don't execute them
Victor Stinnerfea98bf2017-06-27 16:56:43 +020070--fail-env-changed -- if a test file alters the environment, mark the test
71 as failed
Guido van Rossum152494a1996-12-20 03:12:20 +000072
R. David Murray3bfa8832010-04-26 16:54:57 +000073
74Additional Option Details:
Guido van Rossumf58ed251997-03-07 21:04:33 +000075
Serhiy Storchakac72e66a2015-11-02 15:06:09 +020076-r randomizes test execution order. You can use --randseed=int to provide an
Collin Wintera199f012009-03-29 03:44:19 +000077int seed value for the randomizer; this is useful for reproducing troublesome
78test orders.
79
R. David Murray3bfa8832010-04-26 16:54:57 +000080-s On the first invocation of regrtest using -s, the first test file found
81or the first test file given on the command line is run, and the name of
82the next test is recorded in a file named pynexttest. If run from the
83Python build directory, pynexttest is located in the 'build' subdirectory,
84otherwise it is located in tempfile.gettempdir(). On subsequent runs,
85the test in pynexttest is run, and the next test is written to pynexttest.
86When the last test has been run, pynexttest is deleted. In this way it
87is possible to single step through the test files. This is useful when
88doing memory analysis on the Python interpreter, which process tends to
89consume too many resources to run the full regression test non-stop.
Barry Warsawe11e3de1999-01-28 19:51:51 +000090
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000091-f reads the names of tests from the file given as f's argument, one
92or more test names per line. Whitespace is ignored. Blank lines and
93lines beginning with '#' are ignored. This is especially useful for
94whittling down failures involving interactions among tests.
Tim Petersc5000df2002-06-02 21:42:01 +000095
Skip Montanaro0179a182004-06-06 15:53:18 +000096-L causes the leaks(1) command to be run just before exit if it exists.
97leaks(1) is available on Mac OS X and presumably on some other
98FreeBSD-derived systems.
99
Michael W. Hudson61147f62004-08-03 11:33:28 +0000100-R runs each test several times and examines sys.gettotalrefcount() to
101see if the test appears to be leaking references. The argument should
102be of the form stab:run:fname where 'stab' is the number of times the
103test is run to let gettotalrefcount settle down, 'run' is the number
104of times further it is run and 'fname' is the name of the file the
105reports are written to. These parameters all have defaults (5, 4 and
Florent Xicluna12d750d2010-03-06 14:38:09 +0000106"reflog.txt" respectively), and the minimal invocation is '-R :'.
Michael W. Hudson61147f62004-08-03 11:33:28 +0000107
Thomas Woutersabd08882006-04-26 15:53:30 +0000108-M runs tests that require an exorbitant amount of memory. These tests
109typically try to ascertain containers keep working when containing more than
Armin Rigo97ff0472006-08-09 15:37:26 +00001102 billion objects, which only works on 64-bit systems. There are also some
111tests that try to exhaust the address space of the process, which only makes
112sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
Thomas Woutersabd08882006-04-26 15:53:30 +0000113which is a string in the form of '2.5Gb', determines howmuch memory the
114tests will limit themselves to (but they may go slightly over.) The number
115shouldn't be more memory than the machine has (including swap memory). You
116should also keep in mind that swap memory is generally much, much slower
117than RAM, and setting memlimit to all available RAM or higher will heavily
118tax the machine. On the other hand, it is no use running these tests with a
119limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
120to use more than memlimit memory will be skipped. The big-memory tests
121generally run very, very long.
122
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000123-u is used to specify which special resource intensive tests to run,
124such as those requiring large file support or network connectivity.
125The argument is a comma-separated list of words indicating the
126resources to test. Currently only the following are defined:
Barry Warsaw08fca522001-08-20 22:33:46 +0000127
Fred Drake3a15dac2002-04-11 16:39:16 +0000128 all - Enable all special resources.
129
Guido van Rossum315aa362003-03-11 14:46:48 +0000130 audio - Tests that use the audio device. (There are known
131 cases of broken audio drivers that can crash Python or
132 even the Linux kernel.)
133
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000134 curses - Tests that use curses and will modify the terminal's
135 state and output modes.
Tim Peters1633a2e2001-10-30 05:56:40 +0000136
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000137 largefile - It is okay to run some test that may create huge
138 files. These tests can take a long time and may
139 consume >2GB of disk space temporarily.
Barry Warsaw08fca522001-08-20 22:33:46 +0000140
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000141 network - It is okay to run tests that use external network
142 resource, e.g. testing SSL support for sockets.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +0000143
144 bsddb - It is okay to run the bsddb testsuite, which takes
145 a long time to complete.
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000146
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000147 decimal - Test the decimal module against a large suite that
148 verifies compliance with standards.
149
Antoine Pitroud989f822010-10-14 15:43:25 +0000150 cpu - Used for certain CPU-heavy tests.
Jeremy Hylton4336eda2004-08-07 19:25:33 +0000151
Tim Peterseba28be2005-03-28 01:08:02 +0000152 subprocess Run all tests for the subprocess module.
Peter Astrandf7f1bb72005-03-03 20:47:37 +0000153
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000154 urlfetch - It is okay to download files required on testing.
155
Guilherme Polob1a98de2009-01-28 20:03:26 +0000156 gui - Run tests that require a running GUI.
157
Collin Winterf8089c72009-04-09 16:46:46 +0000158 xpickle - Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
159 test backwards compatibility. These tests take a long time
160 to run.
161
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000162To enable all resources except one, use '-uall,-<resource>'. For
163example, to run all the tests except for the bsddb tests, give the
164option '-uall,-bsddb'.
Victor Stinner24c2c202017-06-16 17:30:03 +0200165
166--matchfile filters tests using a text file, one pattern per line.
167Pattern examples:
168
169- test method: test_stat_attributes
170- test class: FileTests
171- test identifier: test_os.FileTests.test_stat_attributes
Guido van Rossum152494a1996-12-20 03:12:20 +0000172"""
173
Michael Foord91a2c892010-04-08 00:04:24 +0000174import StringIO
Victor Stinner453a6852017-05-09 17:06:34 +0200175import datetime
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000176import getopt
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000177import json
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000178import os
179import random
180import re
Serhiy Storchakabb801312013-02-10 12:01:31 +0200181import shutil
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000182import sys
183import time
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000184import traceback
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000185import warnings
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000186import unittest
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000187import tempfile
Ezio Melottidde5b942010-02-03 05:37:26 +0000188import imp
Florent Xiclunab7c20022010-03-06 09:11:55 +0000189import platform
Florent Xicluna0932dc52010-03-06 08:07:44 +0000190import sysconfig
Guido van Rossumdc15c272002-08-12 21:55:51 +0000191
Guido van Rossum152494a1996-12-20 03:12:20 +0000192
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000193# Some times __path__ and __file__ are not absolute (e.g. while running from
194# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
195# imports might fail. This affects only the modules imported before os.chdir().
196# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
197# they are found in the CWD their __file__ and __path__ will be relative (this
198# happens before the chdir). All the modules imported after the chdir, are
199# not found in the CWD, and since the other paths in sys.path[1:] are absolute
200# (site.py absolutize them), the __file__ and __path__ will be absolute too.
201# Therefore it is necessary to absolutize manually the __file__ and __path__ of
202# the packages to prevent later imports to fail when the CWD is different.
203for module in sys.modules.itervalues():
204 if hasattr(module, '__path__'):
205 module.__path__ = [os.path.abspath(path) for path in module.__path__]
206 if hasattr(module, '__file__'):
207 module.__file__ = os.path.abspath(module.__file__)
208
209
Guido van Rossumbb484652002-12-02 09:56:21 +0000210# MacOSX (a.k.a. Darwin) has a default stack size that is too small
211# for deeply recursive regular expressions. We see this as crashes in
212# the Python test suite when running test_re.py and test_sre.py. The
213# fix is to set the stack limit to 2048.
214# This approach may also be useful for other Unixy platforms that
215# suffer from small default stack limits.
216if sys.platform == 'darwin':
217 try:
218 import resource
219 except ImportError:
220 pass
221 else:
222 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
223 newsoft = min(hard, max(soft, 1024*2048))
224 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
225
Zachary Ware47343722015-07-16 00:24:48 -0500226# Windows, Tkinter, and resetting the environment after each test don't
227# mix well. To alleviate test failures due to Tcl/Tk not being able to
228# find its library, get the necessary environment massage done once early.
229if sys.platform == 'win32':
230 try:
231 import FixTk
232 except Exception:
233 pass
234
Georg Brandl4045e882009-10-29 20:53:00 +0000235# Test result constants.
236PASSED = 1
237FAILED = 0
238ENV_CHANGED = -1
239SKIPPED = -2
240RESOURCE_DENIED = -3
241INTERRUPTED = -4
Victor Stinnerc991eb22017-05-03 17:28:28 +0200242CHILD_ERROR = -5 # error in a child process
Georg Brandl4045e882009-10-29 20:53:00 +0000243
Victor Stinner453a6852017-05-09 17:06:34 +0200244# Minimum duration of a test to display its duration or to mention that
245# the test is running in background
246PROGRESS_MIN_TIME = 30.0 # seconds
247
248# Display the running tests if nothing happened last N seconds
249PROGRESS_UPDATE = 30.0 # seconds
250
Barry Warsaw04f357c2002-07-23 19:04:11 +0000251from test import test_support
Fred Drake3a15dac2002-04-11 16:39:16 +0000252
Benjamin Petersone2886fd2008-07-18 14:26:35 +0000253RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
Antoine Pitroud989f822010-10-14 15:43:25 +0000254 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
Collin Winterf8089c72009-04-09 16:46:46 +0000255 'xpickle')
Fred Drake3a15dac2002-04-11 16:39:16 +0000256
Florent Xicluna12735662010-04-23 18:10:12 +0000257TEMPDIR = os.path.abspath(tempfile.gettempdir())
258
Fred Drake3a15dac2002-04-11 16:39:16 +0000259
Barry Warsaw08fca522001-08-20 22:33:46 +0000260def usage(code, msg=''):
261 print __doc__
262 if msg: print msg
263 sys.exit(code)
264
265
Victor Stinner453a6852017-05-09 17:06:34 +0200266def format_duration(seconds):
267 if seconds < 1.0:
268 return '%.0f ms' % (seconds * 1e3)
269 if seconds < 60.0:
270 return '%.0f sec' % seconds
271
272 minutes, seconds = divmod(seconds, 60.0)
273 return '%.0f min %.0f sec' % (minutes, seconds)
274
275
276_FORMAT_TEST_RESULT = {
277 PASSED: '%s passed',
278 FAILED: '%s failed',
279 ENV_CHANGED: '%s failed (env changed)',
280 SKIPPED: '%s skipped',
281 RESOURCE_DENIED: '%s skipped (resource denied)',
282 INTERRUPTED: '%s interrupted',
283 CHILD_ERROR: '%s crashed',
284}
285
286
287def format_test_result(test_name, result):
288 fmt = _FORMAT_TEST_RESULT.get(result, "%s")
289 return fmt % test_name
290
291
Victor Stinner8767de22017-07-05 10:52:06 +0200292def unload_test_modules(save_modules):
293 # Unload the newly imported modules (best effort finalization)
294 for module in sys.modules.keys():
295 if module not in save_modules and module.startswith("test."):
296 test_support.unload(module)
297
298
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000299def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000300 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000301 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000302 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000303 random_seed=None, use_mp=None, verbose3=False, forever=False,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300304 header=False, pgo=False, failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000305 """Execute a test suite.
306
Thomas Wouters7e474022000-07-16 12:04:32 +0000307 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000308 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000309
310 tests -- a list of strings containing test names (optional)
311 testdir -- the directory in which to look for tests (optional)
312
313 Users other than the Python test suite will certainly want to
314 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000315 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000316
317 If the tests argument is omitted, the tests listed on the
318 command-line will be used. If that's empty, too, then all *.py
319 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000320
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000321 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000322 single, randomize, findleaks, use_resources, trace, coverdir,
323 print_slow, and random_seed) allow programmers calling main()
324 directly to set the values that would normally be set by flags
325 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000326 """
Victor Stinner453a6852017-05-09 17:06:34 +0200327 regrtest_start_time = time.time()
Fred Drake004d5e62000-10-23 17:22:08 +0000328
Tim Peters8dee8092001-09-25 20:05:11 +0000329 test_support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000330 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300331 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:PGm:',
Georg Brandl71a015a2009-10-27 20:52:02 +0000332 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Victor Stinner453a6852017-05-09 17:06:34 +0200333 'exclude', 'single', 'slow', 'slowest', 'randomize', 'fromfile=',
334 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000335 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
336 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300337 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo',
Victor Stinner24c2c202017-06-16 17:30:03 +0200338 'failfast', 'match=', 'testdir=', 'list-tests', 'list-cases',
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200339 'coverage', 'matchfile=', 'fail-env-changed'])
Guido van Rossum152494a1996-12-20 03:12:20 +0000340 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000341 usage(2, msg)
342
343 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000344 if random_seed is None:
345 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000346 if use_resources is None:
347 use_resources = []
Victor Stinnerd2aff602017-05-09 13:57:20 +0200348 slaveargs = None
Victor Stinner453a6852017-05-09 17:06:34 +0200349 list_tests = False
Victor Stinner24c2c202017-06-16 17:30:03 +0200350 list_cases_opt = False
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200351 fail_env_changed = False
Guido van Rossum152494a1996-12-20 03:12:20 +0000352 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000353 if o in ('-h', '--help'):
354 usage(0)
355 elif o in ('-v', '--verbose'):
356 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000357 elif o in ('-w', '--verbose2'):
358 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000359 elif o in ('-W', '--verbose3'):
360 verbose3 = True
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300361 elif o in ('-G', '--failfast'):
362 failfast = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000363 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000364 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000365 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000366 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000367 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000368 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000369 single = True
Victor Stinner453a6852017-05-09 17:06:34 +0200370 elif o in ('-S', '--slow', '--slowest'):
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000371 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000372 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000373 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000374 elif o == '--randseed':
375 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000376 elif o in ('-f', '--fromfile'):
377 fromfile = a
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300378 elif o in ('-m', '--match'):
Victor Stinner24c2c202017-06-16 17:30:03 +0200379 if match_tests is None:
380 match_tests = []
381 match_tests.append(a)
382 elif o == '--matchfile':
383 if match_tests is None:
384 match_tests = []
385 filename = os.path.join(test_support.SAVEDCWD, a)
386 with open(filename) as fp:
387 for line in fp:
388 match_tests.append(line.strip())
Barry Warsaw08fca522001-08-20 22:33:46 +0000389 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000390 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000391 elif o in ('-L', '--runleaks'):
392 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000393 elif o in ('-t', '--threshold'):
394 import gc
395 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000396 elif o in ('-T', '--coverage'):
397 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000398 elif o in ('-D', '--coverdir'):
399 coverdir = os.path.join(os.getcwd(), a)
400 elif o in ('-N', '--nocoverdir'):
401 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000402 elif o in ('-R', '--huntrleaks'):
403 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000404 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000405 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000406 usage(2, '-R takes 2 or 3 colon-separated arguments')
407 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000408 huntrleaks[0] = 5
409 else:
410 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000411 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000412 huntrleaks[1] = 4
413 else:
414 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000415 if len(huntrleaks) == 2 or not huntrleaks[2]:
416 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000417 elif o in ('-M', '--memlimit'):
418 test_support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000419 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000420 u = [x.lower() for x in a.split(',')]
421 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000422 if r == 'all':
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000423 use_resources[:] = RESOURCE_NAMES
424 continue
425 remove = False
426 if r[0] == '-':
427 remove = True
428 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000429 if r not in RESOURCE_NAMES:
430 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000431 if remove:
432 if r in use_resources:
433 use_resources.remove(r)
434 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000435 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000436 elif o in ('-F', '--forever'):
437 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000438 elif o in ('-j', '--multiprocess'):
439 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000440 elif o == '--header':
441 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000442 elif o == '--slaveargs':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200443 slaveargs = a
Brett Cannon95374782015-10-02 16:21:34 -0700444 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700445 pgo = True
Victor Stinner453a6852017-05-09 17:06:34 +0200446 elif o == '--testdir':
Victor Stinnerd2aff602017-05-09 13:57:20 +0200447 testdir = a
Victor Stinner453a6852017-05-09 17:06:34 +0200448 elif o == '--list-tests':
449 list_tests = True
Victor Stinner24c2c202017-06-16 17:30:03 +0200450 elif o == '--list-cases':
451 list_cases_opt = True
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200452 elif o == '--fail-env-changed':
453 fail_env_changed = True
R. David Murrayda826892009-11-15 00:04:32 +0000454 else:
455 print >>sys.stderr, ("No handler for option {}. Please "
456 "report this as a bug at http://bugs.python.org.").format(o)
457 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000458 if single and fromfile:
459 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000460 if use_mp and trace:
461 usage(2, "-T and -j don't go together!")
462 if use_mp and findleaks:
463 usage(2, "-l and -j don't go together!")
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300464 if failfast and not (verbose or verbose3):
465 usage("-G/--failfast needs either -v or -W")
Barry Warsaw08fca522001-08-20 22:33:46 +0000466
Victor Stinnerd2aff602017-05-09 13:57:20 +0200467 if testdir:
468 testdir = os.path.abspath(testdir)
469
470 # Prepend test directory to sys.path, so runtest() will be able
471 # to locate tests
472 sys.path.insert(0, testdir)
473
Victor Stinner30509872017-07-05 09:16:47 +0200474 # Make sure that '' and Lib/test/ are not in sys.path
475 regrtest_dir = os.path.abspath(os.path.dirname(__file__))
476 for path in ('', regrtest_dir):
477 try:
478 sys.path.remove(path)
479 except ValueError:
480 pass
481
Victor Stinnerd2aff602017-05-09 13:57:20 +0200482 if slaveargs is not None:
483 args, kwargs = json.loads(slaveargs)
Victor Stinner8bb08632017-06-16 12:14:09 +0200484 if kwargs['huntrleaks']:
485 warm_caches()
Victor Stinnerd2aff602017-05-09 13:57:20 +0200486 if testdir:
487 kwargs['testdir'] = testdir
488 try:
489 result = runtest(*args, **kwargs)
490 except BaseException, e:
491 result = INTERRUPTED, e.__class__.__name__
492 print # Force a newline (just in case)
493 print json.dumps(result)
494 sys.exit(0)
495
Victor Stinner8bb08632017-06-16 12:14:09 +0200496 if huntrleaks:
497 warm_caches()
498
Guido van Rossum152494a1996-12-20 03:12:20 +0000499 good = []
500 bad = []
501 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000502 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000503 environment_changed = []
Florent Xicluna75c66762010-03-30 16:31:14 +0000504 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000505
Neil Schemenauerd569f232000-09-22 15:29:28 +0000506 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000507 try:
508 import gc
509 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000510 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000511 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000512 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000513 # Uncomment the line below to report garbage that is not
514 # freeable by reference counting alone. By default only
515 # garbage that is not collectable by the GC is reported.
516 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000517 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000518
Barry Warsawe11e3de1999-01-28 19:51:51 +0000519 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000520 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000521 try:
522 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000523 next_test = fp.read().strip()
524 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000525 fp.close()
526 except IOError:
527 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000528
529 if fromfile:
530 tests = []
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000531 fp = open(os.path.join(test_support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000532 for line in fp:
533 guts = line.split() # assuming no test has whitespace in its name
534 if guts and not guts[0].startswith('#'):
535 tests.extend(guts)
536 fp.close()
537
538 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000539 removepy(args)
540 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000541
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000542 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000543 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000544 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000545 for arg in args:
546 if arg in stdtests:
547 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000548 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000549 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000550
R. David Murray98e3df32009-12-16 11:49:46 +0000551 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000552 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000553 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000554 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000555 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000556 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000557 except IndexError:
558 next_single_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200559
560 if list_tests:
561 for name in selected:
562 print(name)
563 sys.exit(0)
564
Victor Stinner24c2c202017-06-16 17:30:03 +0200565 if list_cases_opt:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200566 list_cases(testdir, selected, match_tests)
Victor Stinner24c2c202017-06-16 17:30:03 +0200567 sys.exit(0)
568
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000569 if trace:
570 import trace
Victor Stinnera5bb6242017-05-11 11:30:23 +0200571 tracer = trace.Trace(trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000572
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000573 test_times = []
Barry Warsaw08fca522001-08-20 22:33:46 +0000574 test_support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800575 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000576
577 def accumulate_result(test, result):
578 ok, test_time = result
Victor Stinnerc991eb22017-05-03 17:28:28 +0200579 if ok not in (CHILD_ERROR, INTERRUPTED):
580 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000581 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000582 good.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200583 elif ok in (FAILED, CHILD_ERROR):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000584 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000585 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000586 environment_changed.append(test)
587 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000588 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000589 elif ok == RESOURCE_DENIED:
590 skipped.append(test)
591 resource_denieds.append(test)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200592 elif ok != INTERRUPTED:
593 raise ValueError("invalid test result: %r" % ok)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000594
R. David Murray7f7eea62009-11-14 15:18:22 +0000595 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000596 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000597 while True:
598 for test in tests:
599 yield test
600 if bad:
601 return
Victor Stinnerd7955b82017-07-03 15:07:53 +0200602 if fail_env_changed and environment_changed:
603 return
R. David Murray7f7eea62009-11-14 15:18:22 +0000604 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200605 test_count = ''
606 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000607 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000608 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200609 test_count = '/{}'.format(len(selected))
610 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000611
Victor Stinner453a6852017-05-09 17:06:34 +0200612 def display_progress(test_index, test):
613 # "[ 51/405/1] test_tcl"
614 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
615 line = fmt.format(test_count_width, test_index, test_count,
616 len(bad), test)
617
618 # add the timestamp prefix: "0:01:05 "
619 test_time = time.time() - regrtest_start_time
620 test_time = datetime.timedelta(seconds=int(test_time))
621 line = "%s %s" % (test_time, line)
622
623 print(line)
624 sys.stdout.flush()
625
Victor Stinner1e4fcb32017-07-03 22:18:28 +0200626 # For a partial run, we do not need to clutter the output.
627 if verbose or header or not (quiet or single or tests or args):
628 if not pgo:
629 # Print basic platform information
630 print "==", platform.python_implementation(), \
631 " ".join(sys.version.split())
632 print "== ", platform.platform(aliased=True), \
633 "%s-endian" % sys.byteorder
634 print "== ", os.getcwd()
635 print "Testing with flags:", sys.flags
636
637 if randomize:
638 random.seed(random_seed)
639 print "Using random seed", random_seed
640 random.shuffle(selected)
641
Antoine Pitrou4698d992009-05-31 14:20:14 +0000642 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000643 try:
644 from threading import Thread
645 except ImportError:
646 print "Multiprocess option requires thread support"
647 sys.exit(2)
Victor Stinner453a6852017-05-09 17:06:34 +0200648 from Queue import Queue, Empty
Georg Brandla4f46e12010-02-07 17:03:15 +0000649 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000650 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000651 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000652 def tests_and_args():
653 for test in tests:
654 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000655 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700656 dict(huntrleaks=huntrleaks, use_resources=use_resources,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300657 failfast=failfast,
658 match_tests=match_tests,
Brett Cannoneb2cb972015-10-16 12:30:20 -0700659 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000660 )
661 yield (test, args_tuple)
662 pending = tests_and_args()
Antoine Pitroua226c912010-10-14 11:15:50 +0000663 opt_args = test_support.args_from_interpreter_flags()
664 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700665 # required to spawn a new process with PGO flag on/off
666 if pgo:
667 base_cmd = base_cmd + ['--pgo']
Victor Stinner453a6852017-05-09 17:06:34 +0200668
669 class MultiprocessThread(Thread):
670 current_test = None
671 start_time = None
672
673 def runtest(self):
674 try:
675 test, args_tuple = next(pending)
676 except StopIteration:
677 output.put((None, None, None, None))
678 return True
679
680 # -E is needed by some tests, e.g. test_import
681 args = base_cmd + ['--slaveargs', json.dumps(args_tuple)]
682 if testdir:
683 args.extend(('--testdir', testdir))
684 try:
685 self.start_time = time.time()
686 self.current_test = test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200687 popen = Popen(args,
688 stdout=PIPE, stderr=PIPE,
689 universal_newlines=True,
690 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000691 stdout, stderr = popen.communicate()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200692 retcode = popen.wait()
Victor Stinner453a6852017-05-09 17:06:34 +0200693 finally:
694 self.current_test = None
Victor Stinnerc991eb22017-05-03 17:28:28 +0200695
Victor Stinner453a6852017-05-09 17:06:34 +0200696 # Strip last refcount output line if it exists, since it
697 # comes from the shutdown of the interpreter in the subcommand.
698 stderr = debug_output_pat.sub("", stderr)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200699
Victor Stinner453a6852017-05-09 17:06:34 +0200700 if retcode == 0:
701 stdout, _, result = stdout.strip().rpartition("\n")
702 if not result:
703 output.put((None, None, None, None))
704 return True
Victor Stinnerc991eb22017-05-03 17:28:28 +0200705
Victor Stinner453a6852017-05-09 17:06:34 +0200706 result = json.loads(result)
707 else:
708 result = (CHILD_ERROR, "Exit code %s" % retcode)
Victor Stinner228da422017-05-05 10:28:35 +0200709
Victor Stinner453a6852017-05-09 17:06:34 +0200710 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
711 return False
Victor Stinnerc991eb22017-05-03 17:28:28 +0200712
Victor Stinner453a6852017-05-09 17:06:34 +0200713 def run(self):
714 try:
715 stop = False
716 while not stop:
717 stop = self.runtest()
718 except BaseException:
719 output.put((None, None, None, None))
720 raise
721
722 workers = [MultiprocessThread() for i in range(use_mp)]
723 print("Run tests in parallel using %s child processes"
724 % len(workers))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000725 for worker in workers:
726 worker.start()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200727
Victor Stinner453a6852017-05-09 17:06:34 +0200728 def get_running(workers):
729 running = []
730 for worker in workers:
731 current_test = worker.current_test
732 if not current_test:
733 continue
734 dt = time.time() - worker.start_time
735 if dt >= PROGRESS_MIN_TIME:
736 running.append('%s (%.0f sec)' % (current_test, dt))
737 return running
738
Antoine Pitrou4698d992009-05-31 14:20:14 +0000739 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200740 test_index = 1
Victor Stinner453a6852017-05-09 17:06:34 +0200741 get_timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME)
R. David Murray7f7eea62009-11-14 15:18:22 +0000742 try:
743 while finished < use_mp:
Victor Stinner453a6852017-05-09 17:06:34 +0200744 try:
745 item = output.get(timeout=get_timeout)
746 except Empty:
747 running = get_running(workers)
748 if running and not pgo:
749 print('running: %s' % ', '.join(running))
750 continue
751
752 test, stdout, stderr, result = item
R. David Murray7f7eea62009-11-14 15:18:22 +0000753 if test is None:
754 finished += 1
755 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000756 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200757 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200758 ok, test_time = result
759 text = format_test_result(test, ok)
760 if (ok not in (CHILD_ERROR, INTERRUPTED)
761 and test_time >= PROGRESS_MIN_TIME
762 and not pgo):
763 text += ' (%.0f sec)' % test_time
764 running = get_running(workers)
765 if running and not pgo:
766 text += ' -- running: %s' % ', '.join(running)
767 display_progress(test_index, text)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200768
769 if stdout:
770 print stdout
771 sys.stdout.flush()
772 if stderr and not pgo:
773 print >>sys.stderr, stderr
774 sys.stderr.flush()
775
776 if result[0] == INTERRUPTED:
777 assert result[1] == 'KeyboardInterrupt'
778 raise KeyboardInterrupt # What else?
779
Victor Stinner32b1ff92014-09-05 12:12:11 +0200780 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000781 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000782 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000783 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000784 for worker in workers:
785 worker.join()
786 else:
Victor Stinner453a6852017-05-09 17:06:34 +0200787 print("Run tests sequentially")
788
789 previous_test = None
Brett Cannon65918e02015-10-02 16:22:32 -0700790 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000791 if not quiet:
Victor Stinner453a6852017-05-09 17:06:34 +0200792 text = test
793 if previous_test:
794 text = '%s -- %s' % (text, previous_test)
795 display_progress(test_index, text)
Victor Stinnera5bb6242017-05-11 11:30:23 +0200796
797 def local_runtest():
798 result = runtest(test, verbose, quiet, huntrleaks, None, pgo,
799 failfast=failfast,
800 match_tests=match_tests,
801 testdir=testdir)
802 accumulate_result(test, result)
803 return result
804
805 start_time = time.time()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000806 if trace:
807 # If we're tracing code coverage, then we don't exit with status
808 # if on a false return value from main.
Victor Stinnera5bb6242017-05-11 11:30:23 +0200809 ns = dict(locals())
810 tracer.runctx('result = local_runtest()',
811 globals=globals(), locals=ns)
812 result = ns['result']
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000813 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000814 try:
Victor Stinnera5bb6242017-05-11 11:30:23 +0200815 result = local_runtest()
Georg Brandl4045e882009-10-29 20:53:00 +0000816 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700817 if not pgo:
818 print "Re-running test %r in verbose mode" % test
Victor Stinnerd2aff602017-05-09 13:57:20 +0200819 runtest(test, True, quiet, huntrleaks, None, pgo,
820 testdir=testdir)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000821 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000822 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000823 break
824 except:
825 raise
Victor Stinner453a6852017-05-09 17:06:34 +0200826
Victor Stinnera5bb6242017-05-11 11:30:23 +0200827 test_time = time.time() - start_time
828 previous_test = format_test_result(test, result[0])
829 if test_time >= PROGRESS_MIN_TIME:
830 previous_test = "%s in %s" % (previous_test,
831 format_duration(test_time))
832 elif result[0] == PASSED:
833 # be quiet: say nothing if the test passed shortly
834 previous_test = None
Victor Stinner453a6852017-05-09 17:06:34 +0200835
Antoine Pitrou4698d992009-05-31 14:20:14 +0000836 if findleaks:
837 gc.collect()
838 if gc.garbage:
839 print "Warning: test created", len(gc.garbage),
840 print "uncollectable object(s)."
841 # move the uncollectable objects somewhere so we don't see
842 # them again
843 found_garbage.extend(gc.garbage)
844 del gc.garbage[:]
Victor Stinner8767de22017-07-05 10:52:06 +0200845
846 unload_test_modules(save_modules)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000847
Brett Cannon95374782015-10-02 16:21:34 -0700848 if interrupted and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000849 # print a newline after ^C
850 print
851 print "Test suite interrupted by signal SIGINT."
852 omitted = set(selected) - set(good) - set(bad) - set(skipped)
853 print count(len(omitted), "test"), "omitted:"
854 printlist(omitted)
Brett Cannon95374782015-10-02 16:21:34 -0700855 if good and not quiet and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000856 if not bad and not skipped and not interrupted and len(good) > 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000857 print "All",
858 print count(len(good), "test"), "OK."
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000859 if print_slow:
860 test_times.sort(reverse=True)
861 print "10 slowest tests:"
Victor Stinner453a6852017-05-09 17:06:34 +0200862 for test_time, test in test_times[:10]:
863 print("- %s: %.1fs" % (test, test_time))
Brett Cannon95374782015-10-02 16:21:34 -0700864 if bad and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500865 print count(len(bad), "test"), "failed:"
866 printlist(bad)
Brett Cannon95374782015-10-02 16:21:34 -0700867 if environment_changed and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500868 print "{} altered the execution environment:".format(
869 count(len(environment_changed), "test"))
870 printlist(environment_changed)
Brett Cannon95374782015-10-02 16:21:34 -0700871 if skipped and not quiet and not pgo:
Tim Petersa45da922001-08-12 03:45:50 +0000872 print count(len(skipped), "test"), "skipped:"
873 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000874
Tim Petersb5b7b782001-08-12 01:20:39 +0000875 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000876 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000877 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000878 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000879 if surprise:
880 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000881 "unexpected on", plat + ":"
882 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000883 else:
884 print "Those skips are all expected on", plat + "."
885 else:
886 print "Ask someone to teach regrtest.py about which tests are"
887 print "expected to get skipped on", plat + "."
888
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000889 if verbose2 and bad:
890 print "Re-running failed tests in verbose mode"
Zachary Warea4777f12015-08-04 21:53:21 -0500891 for test in bad[:]:
Tim Peters922dd7d2006-03-10 23:37:10 +0000892 print "Re-running test %r in verbose mode" % test
893 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000894 try:
Neal Norwitz5fe5cf62008-03-18 17:58:02 +0000895 test_support.verbose = True
Victor Stinnerd2aff602017-05-09 13:57:20 +0200896 ok = runtest(test, True, quiet, huntrleaks, None, pgo,
897 testdir=testdir)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000898 except KeyboardInterrupt:
899 # print a newline separate from the ^C
900 print
901 break
Zachary Warea4777f12015-08-04 21:53:21 -0500902 else:
903 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
904 bad.remove(test)
905 else:
906 if bad:
907 print count(len(bad), "test"), "failed again:"
908 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000909
Barry Warsawe11e3de1999-01-28 19:51:51 +0000910 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000911 if next_single_test:
912 with open(filename, 'w') as fp:
913 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000914 else:
915 os.unlink(filename)
916
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000917 if trace:
918 r = tracer.results()
919 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
920
Skip Montanaro0179a182004-06-06 15:53:18 +0000921 if runleaks:
922 os.system("leaks %d" % os.getpid())
923
Victor Stinner453a6852017-05-09 17:06:34 +0200924 print
925 duration = time.time() - regrtest_start_time
926 print("Total duration: %s" % format_duration(duration))
927
928 if bad:
929 result = "FAILURE"
930 elif interrupted:
931 result = "INTERRUPTED"
Victor Stinnerd7955b82017-07-03 15:07:53 +0200932 elif fail_env_changed and environment_changed:
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200933 result = "ENV CHANGED"
Victor Stinner453a6852017-05-09 17:06:34 +0200934 else:
935 result = "SUCCESS"
936 print("Tests result: %s" % result)
937
Victor Stinnerfea98bf2017-06-27 16:56:43 +0200938 if bad:
939 sys.exit(2)
940 if interrupted:
941 sys.exit(130)
942 if fail_env_changed and environment_changed:
943 sys.exit(3)
944 sys.exit(0)
Barry Warsaw08fca522001-08-20 22:33:46 +0000945
Guido van Rossum152494a1996-12-20 03:12:20 +0000946
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000947STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000948 'test_grammar',
949 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +0000950 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000951 'test_builtin',
952 'test_exceptions',
953 'test_types',
Collin Winter55453142007-03-08 19:58:14 +0000954 'test_unittest',
955 'test_doctest',
956 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000957]
Guido van Rossum152494a1996-12-20 03:12:20 +0000958
Florent Xicluna12d750d2010-03-06 14:38:09 +0000959NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +0000960 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000961 'test_future1',
962 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000963}
Guido van Rossum152494a1996-12-20 03:12:20 +0000964
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000965def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000966 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +0000967 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +0000968 names = os.listdir(testdir)
969 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +0000970 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +0000971 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +0000972 modname, ext = os.path.splitext(name)
973 if modname[:5] == "test_" and ext == ".py" and modname not in others:
974 tests.append(modname)
975 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +0000976
Antoine Pitrou4698d992009-05-31 14:20:14 +0000977def runtest(test, verbose, quiet,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300978 huntrleaks=False, use_resources=None, pgo=False,
Victor Stinnerd2aff602017-05-09 13:57:20 +0200979 failfast=False, match_tests=None, testdir=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000980 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +0000981
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000982 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000983 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000984 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000985 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +0000986 huntrleaks -- run multiple times to test for leaks; requires a debug
987 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -0700988 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -0700989 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -0700990
Georg Brandl4045e882009-10-29 20:53:00 +0000991 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +0200992 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +0000993 INTERRUPTED KeyboardInterrupt when run under -j
994 RESOURCE_DENIED test skipped because resource denied
995 SKIPPED test skipped for some other reason
996 ENV_CHANGED test failed because it changed the execution environment
997 FAILED test failed
998 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000999 """
Tim Peters06c5c002006-06-05 00:55:26 +00001000
Antoine Pitrou4698d992009-05-31 14:20:14 +00001001 test_support.verbose = verbose # Tell tests to be moderately quiet
1002 if use_resources is not None:
1003 test_support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +00001004 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +03001005 test_support.match_tests = match_tests
1006 if failfast:
1007 test_support.failfast = True
Victor Stinnerd2aff602017-05-09 13:57:20 +02001008 return runtest_inner(test, verbose, quiet, huntrleaks, pgo, testdir)
Tim Peterse5584862006-06-09 19:24:44 +00001009 finally:
1010 cleanup_test_droppings(test, verbose)
1011
R. David Murray14dcd432009-10-14 13:58:07 +00001012
1013# Unit tests are supposed to leave the execution environment unchanged
1014# once they complete. But sometimes tests have bugs, especially when
1015# tests fail, and the changes to environment go on to mess up other
1016# tests. This can cause issues with buildbot stability, since tests
1017# are run in random order and so problems may appear to come and go.
1018# There are a few things we can save and restore to mitigate this, and
1019# the following context manager handles this task.
1020
1021class saved_test_environment:
1022 """Save bits of the test environment and restore them at block exit.
1023
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001024 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +00001025 #stuff
1026
1027 Unless quiet is True, a warning is printed to stderr if any of
1028 the saved items was changed by the test. The attribute 'changed'
1029 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001030
1031 If verbose is more than 1, the before and after state of changed
1032 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +00001033 """
1034
1035 changed = False
1036
Brett Cannon95374782015-10-02 16:21:34 -07001037 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +00001038 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001039 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +00001040 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -07001041 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +00001042
1043 # To add things to save and restore, add a name XXX to the resources list
1044 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
1045 # return the value to be saved and compared against a second call to the
1046 # get function when test execution completes. restore_XXX should accept
1047 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001048 # and only if a change in the value is detected.
1049 #
1050 # Note: XXX will have any '.' replaced with '_' characters when determining
1051 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +00001052
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001053 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001054 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001055 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +00001056 )
R. David Murray14dcd432009-10-14 13:58:07 +00001057
1058 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001059 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001060 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +00001061 sys.argv = saved_argv[1]
1062 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001063
1064 def get_cwd(self):
1065 return os.getcwd()
1066 def restore_cwd(self, saved_cwd):
1067 os.chdir(saved_cwd)
1068
1069 def get_sys_stdout(self):
1070 return sys.stdout
1071 def restore_sys_stdout(self, saved_stdout):
1072 sys.stdout = saved_stdout
1073
1074 def get_sys_stderr(self):
1075 return sys.stderr
1076 def restore_sys_stderr(self, saved_stderr):
1077 sys.stderr = saved_stderr
1078
1079 def get_sys_stdin(self):
1080 return sys.stdin
1081 def restore_sys_stdin(self, saved_stdin):
1082 sys.stdin = saved_stdin
1083
1084 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001085 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +00001086 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +00001087 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +00001088 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +00001089 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +00001090
1091 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +00001092 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +00001093 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +00001094 sys.path = saved_path[1]
1095 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +00001096
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001097 def get_asyncore_socket_map(self):
1098 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001099 # XXX Making a copy keeps objects alive until __exit__ gets called.
1100 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001101 def restore_asyncore_socket_map(self, saved_map):
1102 asyncore = sys.modules.get('asyncore')
1103 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001104 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +00001105 asyncore.socket_map.update(saved_map)
1106
Vinay Sajipda563bf2012-03-06 20:07:15 +00001107 def get_test_support_TESTFN(self):
1108 if os.path.isfile(test_support.TESTFN):
1109 result = 'f'
1110 elif os.path.isdir(test_support.TESTFN):
1111 result = 'd'
1112 else:
1113 result = None
1114 return result
1115 def restore_test_support_TESTFN(self, saved_value):
1116 if saved_value is None:
1117 if os.path.isfile(test_support.TESTFN):
1118 os.unlink(test_support.TESTFN)
1119 elif os.path.isdir(test_support.TESTFN):
1120 shutil.rmtree(test_support.TESTFN)
1121
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001122 def get_files(self):
1123 return sorted(fn + ('/' if os.path.isdir(fn) else '')
1124 for fn in os.listdir(os.curdir))
1125 def restore_files(self, saved_value):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001126 fn = test_support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001127 if fn not in saved_value and (fn + '/') not in saved_value:
1128 if os.path.isfile(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001129 test_support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001130 elif os.path.isdir(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +02001131 test_support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +03001132
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001133 def resource_info(self):
1134 for name in self.resources:
1135 method_suffix = name.replace('.', '_')
1136 get_name = 'get_' + method_suffix
1137 restore_name = 'restore_' + method_suffix
1138 yield name, getattr(self, get_name), getattr(self, restore_name)
1139
R. David Murray14dcd432009-10-14 13:58:07 +00001140 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001141 self.saved_values = dict((name, get()) for name, get, restore
1142 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +00001143 return self
1144
1145 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001146 saved_values = self.saved_values
1147 del self.saved_values
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001148 for name, get, restore in self.resource_info():
1149 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +00001150 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001151 # Check for changes to the resource's value
1152 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +00001153 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001154 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -07001155 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001156 print >>sys.stderr, (
1157 "Warning -- {} was modified by {}".format(
1158 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +02001159 print >>sys.stderr, (
1160 " Before: {}\n After: {} ".format(
1161 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +00001162 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
1163 # matters at least as much as value. For others (e.g. cwd),
1164 # identity is irrelevant. Should we add a mechanism to check
1165 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +00001166 return False
1167
1168
Victor Stinnerd2aff602017-05-09 13:57:20 +02001169def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None):
Guido van Rossum152494a1996-12-20 03:12:20 +00001170 test_support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +00001171 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001172 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001173 else:
Michael Foord91a2c892010-04-08 00:04:24 +00001174 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +00001175
Antoine Pitrou4698d992009-05-31 14:20:14 +00001176 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +00001177 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +00001178 try:
Tim Peters342ca752001-09-25 19:13:20 +00001179 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +00001180 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001181 if capture_stdout:
1182 sys.stdout = capture_stdout
Victor Stinner24c2c202017-06-16 17:30:03 +02001183 abstest = get_abs_module(testdir, test)
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001184 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -07001185 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +00001186 start_time = time.time()
1187 the_package = __import__(abstest, globals(), locals(), [])
Victor Stinnerd2aff602017-05-09 13:57:20 +02001188 if abstest.startswith('test.'):
1189 the_module = getattr(the_package, test)
1190 else:
1191 the_module = the_package
R. David Murray14dcd432009-10-14 13:58:07 +00001192 # Old tests run to completion simply as a side-effect of
1193 # being imported. For tests based on unittest or doctest,
1194 # explicitly invoke their test_main() function (if it exists).
1195 indirect_test = getattr(the_module, "test_main", None)
1196 if indirect_test is not None:
1197 indirect_test()
1198 if huntrleaks:
1199 refleak = dash_R(the_module, test, indirect_test,
1200 huntrleaks)
1201 test_time = time.time() - start_time
Guido van Rossum41360a41998-03-26 19:42:58 +00001202 finally:
Tim Peters342ca752001-09-25 19:13:20 +00001203 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +00001204 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001205 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +00001206 print test, "skipped --", msg
1207 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001208 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +00001209 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001210 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +00001211 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001212 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001213 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +00001214 except KeyboardInterrupt:
1215 raise
Guido van Rossum152494a1996-12-20 03:12:20 +00001216 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -07001217 if not pgo:
1218 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +00001219 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001220 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001221 except:
Guido van Rossum41360a41998-03-26 19:42:58 +00001222 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -07001223 if not pgo:
1224 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +00001225 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -07001226 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +00001227 traceback.print_exc(file=sys.stderr)
1228 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001229 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001230 else:
Collin Winter0f489742009-05-14 23:26:30 +00001231 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +00001232 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +00001233 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +00001234 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001235 # Except in verbose mode, tests should not print anything
1236 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001237 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001238 output = capture_stdout.getvalue()
1239 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001240 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001241 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001242 print "*" * 70
1243 print output
1244 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001245 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001246 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001247
Tim Peterse5584862006-06-09 19:24:44 +00001248def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001249 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001250 import gc
1251
1252 # First kill any dangling references to open files etc.
1253 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001254
1255 # Try to clean up junk commonly left behind. While tests shouldn't leave
1256 # any files or directories behind, when a test fails that can be tedious
1257 # for it to arrange. The consequences can be especially nasty on Windows,
1258 # since if a test leaves a file open, it cannot be deleted by name (while
1259 # there's nothing we can do about that here either, we can display the
1260 # name of the offending test, which is a real help).
1261 for name in (test_support.TESTFN,
1262 "db_home",
1263 ):
1264 if not os.path.exists(name):
1265 continue
1266
1267 if os.path.isdir(name):
1268 kind, nuker = "directory", shutil.rmtree
1269 elif os.path.isfile(name):
1270 kind, nuker = "file", os.unlink
1271 else:
1272 raise SystemError("os.path says %r exists but is neither "
1273 "directory nor file" % name)
1274
1275 if verbose:
1276 print "%r left behind %s %r" % (testname, kind, name)
1277 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001278 # if we have chmod, fix possible permissions problems
1279 # that might prevent cleanup
1280 if (hasattr(os, 'chmod')):
1281 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001282 nuker(name)
1283 except Exception, msg:
1284 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1285 "removed: %s" % (testname, kind, name, msg))
1286
Tim Peters06c5c002006-06-05 00:55:26 +00001287def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001288 """Run a test multiple times, looking for reference leaks.
1289
1290 Returns:
1291 False if the test didn't leak references; True if we detected refleaks.
1292 """
Tim Peters06c5c002006-06-05 00:55:26 +00001293 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001294 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001295
1296 if not hasattr(sys, 'gettotalrefcount'):
1297 raise Exception("Tracking reference leaks requires a debug build "
1298 "of Python")
1299
1300 # Save current values for dash_R_cleanup() to restore.
1301 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001302 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001303 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001304 try:
1305 import zipimport
1306 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001307 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001308 else:
1309 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001310 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001311 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001312 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1313 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1314 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001315 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001316 for obj in abc.__subclasses__() + [abc]:
1317 abcs[obj] = obj._abc_registry.copy()
1318
Tim Peters06c5c002006-06-05 00:55:26 +00001319 if indirect_test:
1320 def run_the_test():
1321 indirect_test()
1322 else:
1323 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001324 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001325
1326 deltas = []
1327 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001328 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001329 repcount = nwarmup + ntracked
1330 print >> sys.stderr, "beginning", repcount, "repetitions"
1331 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001332 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001333 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001334 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001335 run_the_test()
1336 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001337 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001338 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001339 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001340 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001341 print >> sys.stderr
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001342
1343 # bpo-30776: Try to ignore false positives:
1344 #
1345 # [3, 0, 0]
1346 # [0, 1, 0]
1347 # [8, -8, 1]
1348 #
1349 # Expected leaks:
1350 #
1351 # [5, 5, 6]
1352 # [10, 1, 1]
1353 if all(delta >= 1 for delta in deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001354 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1355 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001356 with open(fname, "a") as refrep:
1357 print >> refrep, msg
1358 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001359 return True
1360 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001361
Benjamin Peterson55035792014-02-16 14:51:17 -05001362def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001363 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001364
Tim Peters06c5c002006-06-05 00:55:26 +00001365 # Restore some original values.
1366 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001367 copy_reg.dispatch_table.clear()
1368 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001369 sys.path_importer_cache.clear()
1370 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001371 try:
1372 import zipimport
1373 except ImportError:
1374 pass # Run unmodified on platforms without zipimport support
1375 else:
1376 zipimport._zip_directory_cache.clear()
1377 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001378
Christian Heimes908caac2008-01-27 23:34:59 +00001379 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001380 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001381
Guido van Rossum64c06e32007-11-22 00:55:51 +00001382 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001383 for abc, registry in abcs.items():
1384 abc._abc_registry = registry.copy()
1385 abc._abc_cache.clear()
1386 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001387
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001388 clear_caches()
1389
1390def clear_caches():
1391 import gc
1392
1393 # Clear the warnings registry, so they can be displayed again
1394 for mod in sys.modules.values():
1395 if hasattr(mod, '__warningregistry__'):
1396 del mod.__warningregistry__
1397
Tim Peters06c5c002006-06-05 00:55:26 +00001398 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001399 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001400 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001401 distutils_dir_util = sys.modules['distutils.dir_util']
1402 except KeyError:
1403 pass
1404 else:
1405 distutils_dir_util._path_created.clear()
1406
1407 re.purge()
1408
1409 try:
1410 _strptime = sys.modules['_strptime']
1411 except KeyError:
1412 pass
1413 else:
1414 _strptime._regex_cache.clear()
1415
1416 try:
1417 urlparse = sys.modules['urlparse']
1418 except KeyError:
1419 pass
1420 else:
1421 urlparse.clear_cache()
1422
1423 try:
1424 urllib = sys.modules['urllib']
1425 except KeyError:
1426 pass
1427 else:
1428 urllib.urlcleanup()
1429
1430 try:
1431 urllib2 = sys.modules['urllib2']
1432 except KeyError:
1433 pass
1434 else:
1435 urllib2.install_opener(None)
1436
1437 try:
1438 dircache = sys.modules['dircache']
1439 except KeyError:
1440 pass
1441 else:
1442 dircache.reset()
1443
1444 try:
1445 linecache = sys.modules['linecache']
1446 except KeyError:
1447 pass
1448 else:
1449 linecache.clearcache()
1450
1451 try:
1452 mimetypes = sys.modules['mimetypes']
1453 except KeyError:
1454 pass
1455 else:
1456 mimetypes._default_mime_types()
1457
1458 try:
1459 filecmp = sys.modules['filecmp']
1460 except KeyError:
1461 pass
1462 else:
1463 filecmp._cache.clear()
1464
1465 try:
1466 struct = sys.modules['struct']
1467 except KeyError:
1468 pass
1469 else:
1470 struct._clearcache()
1471
1472 try:
1473 doctest = sys.modules['doctest']
1474 except KeyError:
1475 pass
1476 else:
1477 doctest.master = None
1478
1479 try:
1480 ctypes = sys.modules['ctypes']
1481 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001482 pass
1483 else:
1484 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001485
1486 # Collect cyclic trash.
1487 gc.collect()
1488
Victor Stinner8bb08632017-06-16 12:14:09 +02001489def warm_caches():
1490 """Create explicitly internal singletons which are created on demand
1491 to prevent false positive when hunting reference leaks."""
1492 # char cache
1493 for i in range(256):
1494 chr(i)
1495 # unicode cache
1496 for i in range(256):
1497 unichr(i)
1498 # int cache
1499 list(range(-5, 257))
1500
Florent Xicluna0932dc52010-03-06 08:07:44 +00001501def findtestdir(path=None):
1502 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001503
Florent Xicluna0932dc52010-03-06 08:07:44 +00001504def removepy(names):
1505 if not names:
1506 return
1507 for idx, name in enumerate(names):
1508 basename, ext = os.path.splitext(name)
1509 if ext == '.py':
1510 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001511
Guido van Rossum152494a1996-12-20 03:12:20 +00001512def count(n, word):
1513 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001514 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001515 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001516 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001517
Victor Stinner24c2c202017-06-16 17:30:03 +02001518def printlist(x, width=70, indent=4, file=None):
Tim Peters7c7efe92002-08-23 17:55:54 +00001519 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001520
1521 Optional arg width (default 70) is the maximum line length.
1522 Optional arg indent (default 4) is the number of blanks with which to
1523 begin each line.
1524 """
1525
Tim Petersba78bc42002-07-04 19:45:06 +00001526 from textwrap import fill
1527 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001528 # Print the sorted list: 'x' may be a '--random' list or a set()
Victor Stinner24c2c202017-06-16 17:30:03 +02001529 print >>file, fill(' '.join(str(elt) for elt in sorted(x)), width,
1530 initial_indent=blanks, subsequent_indent=blanks)
1531
1532def get_abs_module(testdir, test):
1533 if test.startswith('test.') or testdir:
1534 return test
1535 else:
1536 # Always import it from the test package
1537 return 'test.' + test
1538
1539def _list_cases(suite):
1540 for test in suite:
1541 if isinstance(test, unittest.TestSuite):
1542 _list_cases(test)
1543 elif isinstance(test, unittest.TestCase):
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001544 if test_support._match_test(test):
1545 print(test.id())
Victor Stinner24c2c202017-06-16 17:30:03 +02001546
Victor Stinnerfea98bf2017-06-27 16:56:43 +02001547def list_cases(testdir, selected, match_tests):
1548 test_support.verbose = False
1549 test_support.match_tests = match_tests
1550
Victor Stinner8767de22017-07-05 10:52:06 +02001551 save_modules = set(sys.modules)
Victor Stinner24c2c202017-06-16 17:30:03 +02001552 skipped = []
1553 for test in selected:
1554 abstest = get_abs_module(testdir, test)
1555 try:
1556 suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
1557 _list_cases(suite)
1558 except unittest.SkipTest:
1559 skipped.append(test)
1560
Victor Stinner8767de22017-07-05 10:52:06 +02001561 unload_test_modules(save_modules)
1562
Victor Stinner24c2c202017-06-16 17:30:03 +02001563 if skipped:
1564 print >>sys.stderr
1565 print >>sys.stderr, count(len(skipped), "test"), "skipped:"
1566 printlist(skipped, file=sys.stderr)
Tim Petersa45da922001-08-12 03:45:50 +00001567
Tim Petersde14a302002-04-01 05:04:46 +00001568# Map sys.platform to a string containing the basenames of tests
1569# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001570#
1571# Special cases:
1572# test_pep277
1573# The _ExpectedSkips constructor adds this to the set of expected
1574# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001575# test_timeout
1576# Controlled by test_timeout.skip_expected. Requires the network
1577# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001578#
1579# Tests that are expected to be skipped everywhere except on one platform
1580# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001581
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001582_expectations = {
1583 'win32':
1584 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001585 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001586 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001587 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001588 test_commands
1589 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001590 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001591 test_dbm
1592 test_dl
1593 test_fcntl
1594 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001595 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001596 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001597 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001598 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001599 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001600 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001601 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001602 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001603 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001604 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001605 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001606 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001607 test_pty
1608 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001609 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001610 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001611 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001612 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001613 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001614 test_wait3
1615 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001616 """,
1617 'linux2':
1618 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001619 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001620 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001621 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001622 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001623 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001624 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001625 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001626 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001627 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001628 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001629 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001630 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001631 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001632 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001633 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001634 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001635 test_openpty
1636 test_pyexpat
1637 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001638 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001639 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001640 'openunix8':
1641 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001642 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001643 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001644 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001645 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001646 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001647 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001648 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001649 test_openpty
1650 test_pyexpat
1651 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001652 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001653 """,
1654 'sco_sv3':
1655 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001656 test_asynchat
1657 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001658 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001659 test_dl
1660 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001661 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001662 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001663 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001664 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001665 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001666 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001667 test_openpty
1668 test_pyexpat
1669 test_queue
1670 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001671 test_sundry
1672 test_thread
1673 test_threaded_import
1674 test_threadedtempfile
1675 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001676 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001677 'riscos':
1678 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001679 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001680 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001681 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001682 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001683 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001684 test_commands
1685 test_crypt
1686 test_dbm
1687 test_dl
1688 test_fcntl
1689 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001690 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001691 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001692 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001693 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001694 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001695 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001696 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001697 test_openpty
1698 test_poll
1699 test_popen2
1700 test_pty
1701 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001702 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001703 test_sundry
1704 test_thread
1705 test_threaded_import
1706 test_threadedtempfile
1707 test_threading
1708 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001709 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001710 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001711 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001712 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001713 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001714 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001715 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001716 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001717 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001718 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001719 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001720 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001721 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001722 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001723 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001724 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001725 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001726 'sunos5':
1727 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001728 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001729 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001730 test_curses
1731 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001732 test_epoll
1733 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001734 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001735 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001736 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001737 test_zipfile
1738 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001739 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001740 'hp-ux11':
1741 """
Skip Montanarob3230212002-03-15 02:54:03 +00001742 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001743 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001744 test_curses
1745 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001746 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001747 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001748 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001749 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001750 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001751 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001752 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001753 test_openpty
1754 test_pyexpat
1755 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001756 test_zipfile
1757 test_zlib
1758 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001759 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001760 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001761 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001762 test_curses
1763 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001764 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001765 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001766 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001767 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001768 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001769 test_mhlib
1770 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001771 test_poll
1772 test_popen2
1773 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001774 """,
Jason Tishler25115942002-12-05 15:18:15 +00001775 'cygwin':
1776 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001777 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001778 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001779 test_curses
1780 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001781 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001782 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001783 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001784 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001785 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001786 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001787 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001788 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001789 'os2emx':
1790 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001791 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001792 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001793 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001794 test_commands
1795 test_curses
1796 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001797 test_epoll
1798 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001799 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001800 test_mhlib
1801 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001802 test_openpty
1803 test_ossaudiodev
1804 test_pty
1805 test_resource
1806 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001807 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001808 'freebsd4':
1809 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001810 test_bsddb
1811 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001812 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001813 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001814 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001815 test_ossaudiodev
1816 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001817 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001818 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001819 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001820 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001821 test_ttk_guionly
1822 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001823 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001824 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001825 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001826 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001827 'aix5':
1828 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001829 test_bsddb
1830 test_bsddb185
1831 test_bsddb3
1832 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001833 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001834 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001835 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001836 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001837 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001838 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001839 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001840 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001841 test_ttk_guionly
1842 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001843 test_zipimport
1844 test_zlib
1845 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001846 'openbsd3':
1847 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001848 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001849 test_bsddb
1850 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001851 test_ctypes
1852 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001853 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001854 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001855 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001856 test_normalization
1857 test_ossaudiodev
1858 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001859 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001860 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001861 test_ttk_guionly
1862 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001863 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001864 """,
Georg Brandl08706872006-06-21 17:53:17 +00001865 'netbsd3':
1866 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001867 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001868 test_bsddb
1869 test_bsddb185
1870 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001871 test_ctypes
1872 test_curses
1873 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001874 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001875 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001876 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001877 test_ossaudiodev
1878 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001879 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001880 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001881 test_ttk_guionly
1882 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001883 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001884 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001885}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001886_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001887_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001888_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001889_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001890
Tim Petersb5b7b782001-08-12 01:20:39 +00001891class _ExpectedSkips:
1892 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001893 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001894 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001895
Tim Peters7c7efe92002-08-23 17:55:54 +00001896 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001897 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001898 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001899 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001900
Georg Brandlb2e208f2007-07-12 09:24:04 +00001901 # expected to be skipped on every platform, even Linux
1902 self.expected.add('test_linuxaudiodev')
1903
Tim Peters2a182db2002-10-09 01:07:11 +00001904 if not os.path.supports_unicode_filenames:
1905 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001906
Neal Norwitz55b61d22003-02-28 19:57:03 +00001907 if test_timeout.skip_expected:
1908 self.expected.add('test_timeout')
1909
Martin v. Löwisfba73692004-11-13 11:13:35 +00001910 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001911 self.expected.add('test_imageop')
1912
Ronald Oussoren9545a232010-05-05 19:09:31 +00001913 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001914 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001915 "test_plistlib", "test_scriptpackages",
1916 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001917 for skip in MAC_ONLY:
1918 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001919 elif len(u'\0'.encode('unicode-internal')) == 4:
1920 self.expected.add("test_macostools")
1921
Tim Petersecd79eb2003-01-29 00:35:32 +00001922
1923 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001924 # test_sqlite is only reliable on Windows where the library
1925 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001926 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001927 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001928 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001929 for skip in WIN_ONLY:
1930 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001931
Brett Cannondc48b742007-05-20 07:09:50 +00001932 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001933 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1934 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001935 for skip in IRIX_ONLY:
1936 self.expected.add(skip)
1937
Georg Brandlb2e208f2007-07-12 09:24:04 +00001938 if sys.platform != 'sunos5':
1939 self.expected.add('test_sunaudiodev')
1940 self.expected.add('test_nis')
1941
Steven Bethardd290b042008-03-21 21:01:18 +00001942 if not sys.py3kwarning:
1943 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001944
Tim Peters7c7efe92002-08-23 17:55:54 +00001945 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001946
1947 def isvalid(self):
1948 "Return true iff _ExpectedSkips knows about the current platform."
1949 return self.valid
1950
1951 def getexpected(self):
1952 """Return set of test names we expect to skip on current platform.
1953
1954 self.isvalid() must be true.
1955 """
1956
1957 assert self.isvalid()
1958 return self.expected
1959
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001960def main_in_temp_cwd():
1961 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02001962 global TEMPDIR
1963
Florent Xicluna0932dc52010-03-06 08:07:44 +00001964 # When tests are run from the Python build directory, it is best practice
1965 # to keep the test files in a subfolder. It eases the cleanup of leftover
1966 # files using command "make distclean".
1967 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00001968 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
1969 TEMPDIR = os.path.abspath(TEMPDIR)
1970 if not os.path.exists(TEMPDIR):
1971 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001972
1973 # Define a writable temp dir that will be used as cwd while running
1974 # the tests. The name of the dir includes the pid to allow parallel
1975 # testing (see the -j option).
1976 TESTCWD = 'test_python_{}'.format(os.getpid())
1977
Florent Xicluna12735662010-04-23 18:10:12 +00001978 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001979
1980 # Run the tests in a context manager that temporary changes the CWD to a
1981 # temporary and writable directory. If it's not possible to create or
1982 # change the CWD, the original CWD will be used. The original CWD is
1983 # available from test_support.SAVEDCWD.
1984 with test_support.temp_cwd(TESTCWD, quiet=True):
1985 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001986
1987if __name__ == '__main__':
1988 # findtestdir() gets the dirname out of __file__, so we have to make it
1989 # absolute before changing the working directory.
1990 # For example __file__ may be relative when running trace or profile.
1991 # See issue #9323.
1992 global __file__
1993 __file__ = os.path.abspath(__file__)
1994
1995 # sanity check
1996 assert __file__ == os.path.abspath(sys.argv[0])
1997
1998 main_in_temp_cwd()