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