blob: ec768ff9c8a2fcf40e3b35f5337eacc2236fc20c [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossum152494a1996-12-20 03:12:20 +00002
R. David Murray0ba81e02010-04-26 17:02:32 +00003"""
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -08004Script to run Python regression tests.
Guido van Rossum152494a1996-12-20 03:12:20 +00005
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -08006Run this script with -h or --help for documentation.
7"""
8
9USAGE = """\
Georg Brandlbe41a482011-01-05 21:47:47 +000010python -m test [options] [test_name1 [test_name2 ...]]
R. David Murray0ba81e02010-04-26 17:02:32 +000011python path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -080012"""
Guido van Rossum152494a1996-12-20 03:12:20 +000013
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -080014DESCRIPTION = """\
15Run Python regression tests.
R. David Murray0ba81e02010-04-26 17:02:32 +000016
17If no arguments or options are provided, finds all files matching
18the pattern "test_*" in the Lib/test subdirectory and runs
19them in alphabetical order (but see -M and -u, below, for exceptions).
20
21For more rigorous testing, it is useful to use the following
22command line:
23
Georg Brandlbe41a482011-01-05 21:47:47 +000024python -E -Wd -m test [options] [test_name1 ...]
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -080025"""
R. David Murray0ba81e02010-04-26 17:02:32 +000026
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -080027EPILOG = """\
28Additional option details:
Guido van Rossumf58ed251997-03-07 21:04:33 +000029
Collin Winterfd12f492009-03-29 04:05:05 +000030-r randomizes test execution order. You can use --randseed=int to provide a
31int seed value for the randomizer; this is useful for reproducing troublesome
32test orders.
33
R. David Murray0ba81e02010-04-26 17:02:32 +000034-s On the first invocation of regrtest using -s, the first test file found
35or the first test file given on the command line is run, and the name of
36the next test is recorded in a file named pynexttest. If run from the
37Python build directory, pynexttest is located in the 'build' subdirectory,
38otherwise it is located in tempfile.gettempdir(). On subsequent runs,
39the test in pynexttest is run, and the next test is written to pynexttest.
40When the last test has been run, pynexttest is deleted. In this way it
41is possible to single step through the test files. This is useful when
42doing memory analysis on the Python interpreter, which process tends to
43consume too many resources to run the full regression test non-stop.
Barry Warsawe11e3de1999-01-28 19:51:51 +000044
Neal Norwitz94fa2ee2008-03-31 02:55:15 +000045-S is used to continue running tests after an aborted run. It will
46maintain the order a standard run (ie, this assumes -r is not used).
47This is useful after the tests have prematurely stopped for some external
48reason and you want to start running from where you left off rather
49than starting from the beginning.
50
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000051-f reads the names of tests from the file given as f's argument, one
52or more test names per line. Whitespace is ignored. Blank lines and
53lines beginning with '#' are ignored. This is especially useful for
54whittling down failures involving interactions among tests.
Tim Petersc5000df2002-06-02 21:42:01 +000055
Skip Montanaro0179a182004-06-06 15:53:18 +000056-L causes the leaks(1) command to be run just before exit if it exists.
57leaks(1) is available on Mac OS X and presumably on some other
58FreeBSD-derived systems.
59
Michael W. Hudson61147f62004-08-03 11:33:28 +000060-R runs each test several times and examines sys.gettotalrefcount() to
61see if the test appears to be leaking references. The argument should
62be of the form stab:run:fname where 'stab' is the number of times the
63test is run to let gettotalrefcount settle down, 'run' is the number
64of times further it is run and 'fname' is the name of the file the
65reports are written to. These parameters all have defaults (5, 4 and
Neal Norwitz94fa2ee2008-03-31 02:55:15 +000066"reflog.txt" respectively), and the minimal invocation is '-R :'.
Michael W. Hudson61147f62004-08-03 11:33:28 +000067
Thomas Wouters477c8d52006-05-27 19:21:47 +000068-M runs tests that require an exorbitant amount of memory. These tests
69typically try to ascertain containers keep working when containing more than
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000702 billion objects, which only works on 64-bit systems. There are also some
71tests that try to exhaust the address space of the process, which only makes
72sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
Thomas Wouters477c8d52006-05-27 19:21:47 +000073which is a string in the form of '2.5Gb', determines howmuch memory the
74tests will limit themselves to (but they may go slightly over.) The number
75shouldn't be more memory than the machine has (including swap memory). You
76should also keep in mind that swap memory is generally much, much slower
77than RAM, and setting memlimit to all available RAM or higher will heavily
78tax the machine. On the other hand, it is no use running these tests with a
79limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
80to use more than memlimit memory will be skipped. The big-memory tests
81generally run very, very long.
82
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000083-u is used to specify which special resource intensive tests to run,
84such as those requiring large file support or network connectivity.
85The argument is a comma-separated list of words indicating the
86resources to test. Currently only the following are defined:
Barry Warsaw08fca522001-08-20 22:33:46 +000087
Fred Drake3a15dac2002-04-11 16:39:16 +000088 all - Enable all special resources.
89
Nadeem Vawda3c01d162011-08-01 23:48:26 +020090 none - Disable all special resources (this is the default).
91
Guido van Rossum315aa362003-03-11 14:46:48 +000092 audio - Tests that use the audio device. (There are known
93 cases of broken audio drivers that can crash Python or
94 even the Linux kernel.)
95
Andrew M. Kuchling2158df02001-10-22 15:26:09 +000096 curses - Tests that use curses and will modify the terminal's
97 state and output modes.
Tim Peters1633a2e2001-10-30 05:56:40 +000098
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000099 largefile - It is okay to run some test that may create huge
100 files. These tests can take a long time and may
101 consume >2GB of disk space temporarily.
Barry Warsaw08fca522001-08-20 22:33:46 +0000102
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000103 network - It is okay to run tests that use external network
104 resource, e.g. testing SSL support for sockets.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +0000105
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000106 decimal - Test the decimal module against a large suite that
107 verifies compliance with standards.
108
Antoine Pitrou5bc4fa72010-10-14 15:34:31 +0000109 cpu - Used for certain CPU-heavy tests.
Jeremy Hylton4336eda2004-08-07 19:25:33 +0000110
Tim Peterseba28be2005-03-28 01:08:02 +0000111 subprocess Run all tests for the subprocess module.
Peter Astrandf7f1bb72005-03-03 20:47:37 +0000112
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000113 urlfetch - It is okay to download files required on testing.
114
Guilherme Polo9de29af2009-01-28 20:40:48 +0000115 gui - Run tests that require a running GUI.
116
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000117To enable all resources except one, use '-uall,-<resource>'. For
Georg Brandl1158a332009-06-04 09:30:30 +0000118example, to run all the tests except for the gui tests, give the
119option '-uall,-gui'.
Guido van Rossum152494a1996-12-20 03:12:20 +0000120"""
121
Nick Coghlanbe7e49f2012-07-20 23:40:09 +1000122# We import importlib *ASAP* in order to test #15386
123import importlib
124
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -0800125import argparse
Brett Cannon45071902010-06-14 22:22:54 +0000126import builtins
Victor Stinner024e37a2011-03-31 01:31:06 +0200127import faulthandler
Victor Stinner8313d6a2011-06-29 15:22:26 +0200128import io
Antoine Pitrou88909542009-06-29 13:54:42 +0000129import json
Victor Stinner8313d6a2011-06-29 15:22:26 +0200130import logging
Christian Heimesb186d002008-03-18 15:15:01 +0000131import os
Victor Stinner8313d6a2011-06-29 15:22:26 +0200132import platform
Skip Montanaroab1c7912000-06-30 16:39:27 +0000133import random
Thomas Wouters9ada3d62006-04-21 09:47:09 +0000134import re
Éric Araujoff913062011-11-29 16:45:07 +0100135import shutil
Victor Stinnercb41cda2011-07-13 23:47:21 +0200136import signal
Christian Heimesb186d002008-03-18 15:15:01 +0000137import sys
Florent Xiclunada7bfd52010-03-06 11:43:55 +0000138import sysconfig
Victor Stinner8313d6a2011-06-29 15:22:26 +0200139import tempfile
140import time
141import traceback
142import unittest
143import warnings
144from inspect import isabstract
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000145
Antoine Pitrouc081c0c2011-07-15 22:12:24 +0200146try:
147 import threading
148except ImportError:
149 threading = None
150try:
151 import multiprocessing.process
152except ImportError:
153 multiprocessing = None
154
Florent Xicluna64fb18e2010-03-06 14:43:34 +0000155
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000156# Some times __path__ and __file__ are not absolute (e.g. while running from
157# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
158# imports might fail. This affects only the modules imported before os.chdir().
159# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
160# they are found in the CWD their __file__ and __path__ will be relative (this
161# happens before the chdir). All the modules imported after the chdir, are
162# not found in the CWD, and since the other paths in sys.path[1:] are absolute
163# (site.py absolutize them), the __file__ and __path__ will be absolute too.
164# Therefore it is necessary to absolutize manually the __file__ and __path__ of
165# the packages to prevent later imports to fail when the CWD is different.
166for module in sys.modules.values():
167 if hasattr(module, '__path__'):
168 module.__path__ = [os.path.abspath(path) for path in module.__path__]
169 if hasattr(module, '__file__'):
170 module.__file__ = os.path.abspath(module.__file__)
171
Guido van Rossumdc15c272002-08-12 21:55:51 +0000172
Guido van Rossumbb484652002-12-02 09:56:21 +0000173# MacOSX (a.k.a. Darwin) has a default stack size that is too small
174# for deeply recursive regular expressions. We see this as crashes in
175# the Python test suite when running test_re.py and test_sre.py. The
176# fix is to set the stack limit to 2048.
177# This approach may also be useful for other Unixy platforms that
178# suffer from small default stack limits.
179if sys.platform == 'darwin':
180 try:
181 import resource
182 except ImportError:
183 pass
184 else:
185 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
186 newsoft = min(hard, max(soft, 1024*2048))
187 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
188
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000189# Test result constants.
190PASSED = 1
191FAILED = 0
192ENV_CHANGED = -1
193SKIPPED = -2
194RESOURCE_DENIED = -3
195INTERRUPTED = -4
Victor Stinner4b739882011-03-31 18:02:36 +0200196CHILD_ERROR = -5 # error in a child process
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000197
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000198from test import support
Fred Drake3a15dac2002-04-11 16:39:16 +0000199
Georg Brandl1158a332009-06-04 09:30:30 +0000200RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network',
Antoine Pitrou5bc4fa72010-10-14 15:34:31 +0000201 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui')
Fred Drake3a15dac2002-04-11 16:39:16 +0000202
Florent Xiclunaec882212010-08-09 16:56:43 +0000203TEMPDIR = os.path.abspath(tempfile.gettempdir())
Fred Drake3a15dac2002-04-11 16:39:16 +0000204
Chris Jerdonek15738422013-01-07 17:07:32 -0800205class _ArgParser(argparse.ArgumentParser):
206
207 def error(self, message):
208 super().error(message + "\nPass -h or --help for complete help.")
209
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -0800210def _create_parser():
211 # Set prog to prevent the uninformative "__main__.py" from displaying in
212 # error messages when using "python -m test ...".
Chris Jerdonek15738422013-01-07 17:07:32 -0800213 parser = _ArgParser(prog='regrtest.py',
214 usage=USAGE,
215 description=DESCRIPTION,
216 epilog=EPILOG,
217 add_help=False,
218 formatter_class=argparse.RawDescriptionHelpFormatter)
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -0800219
220 # Arguments with this clause added to its help are described further in
221 # the epilog's "Additional option details" section.
222 more_details = ' See the section at bottom for more details.'
223
224 group = parser.add_argument_group('General options')
225 # We add help explicitly to control what argument group it renders under.
226 group.add_argument('-h', '--help', action='help',
227 help='show this help message and exit')
228 group.add_argument('--timeout', metavar='TIMEOUT',
229 help='dump the traceback and exit if a test takes '
230 'more than TIMEOUT seconds; disabled if TIMEOUT '
231 'is negative or equals to zero')
232 group.add_argument('--wait', action='store_true', help='wait for user '
233 'input, e.g., allow a debugger to be attached')
234 group.add_argument('--slaveargs', metavar='ARGS')
235 group.add_argument('-S', '--start', metavar='START', help='the name of '
236 'the test at which to start.' + more_details)
237
238 group = parser.add_argument_group('Verbosity')
239 group.add_argument('-v', '--verbose', action='store_true',
240 help='run tests in verbose mode with output to stdout')
241 group.add_argument('-w', '--verbose2', action='store_true',
242 help='re-run failed tests in verbose mode')
243 group.add_argument('-W', '--verbose3', action='store_true',
244 help='display test output on failure')
245 group.add_argument('-d', '--debug', action='store_true',
246 help='print traceback for failed tests')
247 group.add_argument('-q', '--quiet', action='store_true',
248 help='no output unless one or more tests fail')
249 group.add_argument('-o', '--slow', action='store_true',
250 help='print the slowest 10 tests')
251 group.add_argument('--header', action='store_true',
252 help='print header with interpreter info')
253
254 group = parser.add_argument_group('Selecting tests')
255 group.add_argument('-r', '--randomize', action='store_true',
256 help='randomize test execution order.' + more_details)
257 group.add_argument('--randseed', metavar='SEED', help='pass a random seed '
258 'to reproduce a previous random run')
259 group.add_argument('-f', '--fromfile', metavar='FILE', help='read names '
260 'of tests to run from a file.' + more_details)
261 group.add_argument('-x', '--exclude', action='store_true',
262 help='arguments are tests to *exclude*')
263 group.add_argument('-s', '--single', action='store_true', help='single '
264 'step through a set of tests.' + more_details)
265 group.add_argument('-m', '--match', metavar='PAT', help='match test cases '
266 'and methods with glob pattern PAT')
267 group.add_argument('-G', '--failfast', action='store_true', help='fail as '
268 'soon as a test fails (only with -v or -W)')
269 group.add_argument('-u', '--use', metavar='RES1,RES2,...', help='specify '
270 'which special resource intensive tests to run.' +
271 more_details)
272 group.add_argument('-M', '--memlimit', metavar='LIMIT', help='run very '
273 'large memory-consuming tests.' + more_details)
274 group.add_argument('--testdir', metavar='DIR',
275 help='execute test files in the specified directory '
276 '(instead of the Python stdlib test suite)')
277
278 group = parser.add_argument_group('Special runs')
279 group.add_argument('-l', '--findleaks', action='store_true', help='if GC '
280 'is available detect tests that leak memory')
281 group.add_argument('-L', '--runleaks', action='store_true',
282 help='run the leaks(1) command just before exit.' +
283 more_details)
284 group.add_argument('-R', '--huntrleaks', metavar='RUNCOUNTS',
285 help='search for reference leaks (needs debug build, '
286 'very slow).' + more_details)
287 group.add_argument('-j', '--multiprocess', metavar='PROCESSES',
288 help='run PROCESSES processes at once')
289 group.add_argument('-T', '--coverage', action='store_true', help='turn on '
290 'code coverage tracing using the trace module')
291 group.add_argument('-D', '--coverdir', metavar='DIR',
292 help='directory where coverage files are put')
293 group.add_argument('-N', '--nocoverdir', action='store_true',
294 help='put coverage files alongside modules')
295 group.add_argument('-t', '--threshold', metavar='THRESHOLD',
296 help='call gc.set_threshold(THRESHOLD)')
297 group.add_argument('-n', '--nowindows', action='store_true',
298 help='suppress error message boxes on Windows')
299 group.add_argument('-F', '--forever', action='store_true',
300 help='run the specified tests in a loop, until an '
301 'error happens')
302
303 parser.add_argument('args', nargs=argparse.REMAINDER,
304 help=argparse.SUPPRESS)
305
306 return parser
307
Chris Jerdonek15738422013-01-07 17:07:32 -0800308# TODO: remove this function as described in issue #16799, for example.
309# We use this function since regrtest.main() was originally written to use
310# getopt for parsing.
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -0800311def _convert_namespace_to_getopt(ns):
Chris Jerdonek15738422013-01-07 17:07:32 -0800312 """Convert an argparse.Namespace object to a getopt-style opts list.
313
314 The return value of this function mimics the first element of
315 getopt.getopt()'s (opts, args) return value. In addition, the (option,
316 value) pairs in the opts list are sorted by option and use the long
317 option string. The args part of (opts, args) can be mimicked by the
318 args attribute of the Namespace object we are using in regrtest.
319 """
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -0800320 opts = []
321 args_dict = vars(ns)
322 for key in sorted(args_dict.keys()):
323 if key == 'args':
324 continue
325 val = args_dict[key]
326 # Don't continue if val equals '' because this means an option
327 # accepting a value was provided the empty string. Such values should
328 # show up in the returned opts list.
329 if val is None or val is False:
330 continue
331 if val is True:
332 # Then an option with action store_true was passed. getopt
333 # includes these with value '' in the opts list.
334 val = ''
335 opts.append(('--' + key, val))
Chris Jerdonek15738422013-01-07 17:07:32 -0800336 return opts
Barry Warsaw08fca522001-08-20 22:33:46 +0000337
338
Antoine Pitrou88909542009-06-29 13:54:42 +0000339def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000340 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000341 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Winterfd12f492009-03-29 04:05:05 +0000342 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou3c4402f2011-01-03 20:38:52 +0000343 random_seed=None, use_mp=None, verbose3=False, forever=False,
Antoine Pitroub9c73e82011-07-29 23:53:38 +0200344 header=False, failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000345 """Execute a test suite.
346
Thomas Wouters7e474022000-07-16 12:04:32 +0000347 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000348 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000349
350 tests -- a list of strings containing test names (optional)
351 testdir -- the directory in which to look for tests (optional)
352
353 Users other than the Python test suite will certainly want to
354 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000355 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000356
357 If the tests argument is omitted, the tests listed on the
358 command-line will be used. If that's empty, too, then all *.py
359 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000360
Antoine Pitrou88909542009-06-29 13:54:42 +0000361 The other default arguments (verbose, quiet, exclude,
Collin Winterfd12f492009-03-29 04:05:05 +0000362 single, randomize, findleaks, use_resources, trace, coverdir,
363 print_slow, and random_seed) allow programmers calling main()
364 directly to set the values that would normally be set by flags
365 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000366 """
Victor Stinner3c18f252011-05-22 15:27:14 +0200367
Victor Stinnercb41cda2011-07-13 23:47:21 +0200368 # Display the Python traceback on fatal errors (e.g. segfault)
Victor Stinner3c18f252011-05-22 15:27:14 +0200369 faulthandler.enable(all_threads=True)
370
Victor Stinnercb41cda2011-07-13 23:47:21 +0200371 # Display the Python traceback on SIGALRM or SIGUSR1 signal
372 signals = []
373 if hasattr(signal, 'SIGALRM'):
374 signals.append(signal.SIGALRM)
375 if hasattr(signal, 'SIGUSR1'):
376 signals.append(signal.SIGUSR1)
377 for signum in signals:
378 faulthandler.register(signum, chain=True)
379
Victor Stinner1802d3f2010-05-19 17:11:19 +0000380 replace_stdout()
381
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000382 support.record_original_stdout(sys.stdout)
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -0800383
Chris Jerdonek15738422013-01-07 17:07:32 -0800384 parser = _create_parser()
385 ns = parser.parse_args()
386 opts = _convert_namespace_to_getopt(ns)
387 args = ns.args
388 usage = parser.error
Barry Warsaw08fca522001-08-20 22:33:46 +0000389
390 # Defaults
Collin Winterfd12f492009-03-29 04:05:05 +0000391 if random_seed is None:
392 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000393 if use_resources is None:
394 use_resources = []
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000395 debug = False
396 start = None
Victor Stinner30196882011-06-03 12:53:26 +0200397 timeout = None
Guido van Rossum152494a1996-12-20 03:12:20 +0000398 for o, a in opts:
Chris Jerdonekd6c18dc2012-12-27 18:53:12 -0800399 if o in ('-v', '--verbose'):
Barry Warsaw08fca522001-08-20 22:33:46 +0000400 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000401 elif o in ('-w', '--verbose2'):
402 verbose2 = True
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000403 elif o in ('-d', '--debug'):
404 debug = True
Georg Brandl96f78972009-10-27 21:02:11 +0000405 elif o in ('-W', '--verbose3'):
406 verbose3 = True
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200407 elif o in ('-G', '--failfast'):
408 failfast = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000409 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000410 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000411 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000412 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000413 exclude = True
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000414 elif o in ('-S', '--start'):
415 start = a
Barry Warsaw08fca522001-08-20 22:33:46 +0000416 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000417 single = True
Senthil Kumaranbcfe56d2012-01-14 18:26:27 +0800418 elif o in ('-o', '--slow'):
Christian Heimesb186d002008-03-18 15:15:01 +0000419 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000420 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000421 randomize = True
Collin Winterfd12f492009-03-29 04:05:05 +0000422 elif o == '--randseed':
423 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000424 elif o in ('-f', '--fromfile'):
425 fromfile = a
Antoine Pitroub9c73e82011-07-29 23:53:38 +0200426 elif o in ('-m', '--match'):
427 match_tests = a
Barry Warsaw08fca522001-08-20 22:33:46 +0000428 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000429 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000430 elif o in ('-L', '--runleaks'):
431 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000432 elif o in ('-t', '--threshold'):
433 import gc
434 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000435 elif o in ('-T', '--coverage'):
436 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000437 elif o in ('-D', '--coverdir'):
R David Murray03504fc2011-03-24 14:35:30 -0400438 # CWD is replaced with a temporary dir before calling main(), so we
439 # need join it with the saved CWD so it goes where the user expects.
440 coverdir = os.path.join(support.SAVEDCWD, a)
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000441 elif o in ('-N', '--nocoverdir'):
442 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000443 elif o in ('-R', '--huntrleaks'):
444 huntrleaks = a.split(':')
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000445 if len(huntrleaks) not in (2, 3):
446 print(a, huntrleaks)
447 usage('-R takes 2 or 3 colon-separated arguments')
448 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000449 huntrleaks[0] = 5
450 else:
451 huntrleaks[0] = int(huntrleaks[0])
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000452 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000453 huntrleaks[1] = 4
454 else:
455 huntrleaks[1] = int(huntrleaks[1])
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000456 if len(huntrleaks) == 2 or not huntrleaks[2]:
457 huntrleaks[2:] = ["reflog.txt"]
Stefan Krah5c3ddc82012-08-17 23:09:48 +0200458 # Avoid false positives due to various caches
459 # filling slowly with random data:
460 warm_caches()
Thomas Wouters477c8d52006-05-27 19:21:47 +0000461 elif o in ('-M', '--memlimit'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000462 support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000463 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000464 u = [x.lower() for x in a.split(',')]
465 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000466 if r == 'all':
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000467 use_resources[:] = RESOURCE_NAMES
468 continue
Nadeem Vawda3c01d162011-08-01 23:48:26 +0200469 if r == 'none':
470 del use_resources[:]
471 continue
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000472 remove = False
473 if r[0] == '-':
474 remove = True
475 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000476 if r not in RESOURCE_NAMES:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000477 usage('Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000478 if remove:
479 if r in use_resources:
480 use_resources.remove(r)
481 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000482 use_resources.append(r)
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000483 elif o in ('-n', '--nowindows'):
484 import msvcrt
485 msvcrt.SetErrorMode(msvcrt.SEM_FAILCRITICALERRORS|
486 msvcrt.SEM_NOALIGNMENTFAULTEXCEPT|
487 msvcrt.SEM_NOGPFAULTERRORBOX|
488 msvcrt.SEM_NOOPENFILEERRORBOX)
489 try:
490 msvcrt.CrtSetReportMode
491 except AttributeError:
492 # release build
493 pass
494 else:
495 for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]:
496 msvcrt.CrtSetReportMode(m, msvcrt.CRTDBG_MODE_FILE)
497 msvcrt.CrtSetReportFile(m, msvcrt.CRTDBG_FILE_STDERR)
R. David Murray7dc72cc2009-11-14 16:13:02 +0000498 elif o in ('-F', '--forever'):
499 forever = True
Antoine Pitrou88909542009-06-29 13:54:42 +0000500 elif o in ('-j', '--multiprocess'):
501 use_mp = int(a)
Antoine Pitrou6ab79d92011-03-23 20:17:45 +0100502 if use_mp <= 0:
503 try:
504 import multiprocessing
505 # Use all cores + extras for tests that like to sleep
506 use_mp = 2 + multiprocessing.cpu_count()
507 except (ImportError, NotImplementedError):
508 use_mp = 3
Nadeem Vawda3c01d162011-08-01 23:48:26 +0200509 if use_mp == 1:
510 use_mp = None
Antoine Pitrou3c4402f2011-01-03 20:38:52 +0000511 elif o == '--header':
512 header = True
Antoine Pitrou88909542009-06-29 13:54:42 +0000513 elif o == '--slaveargs':
514 args, kwargs = json.loads(a)
515 try:
516 result = runtest(*args, **kwargs)
Victor Stinner29650112012-08-08 22:37:26 +0200517 except KeyboardInterrupt:
518 result = INTERRUPTED, ''
Antoine Pitrou88909542009-06-29 13:54:42 +0000519 except BaseException as e:
Victor Stinner29650112012-08-08 22:37:26 +0200520 traceback.print_exc()
521 result = CHILD_ERROR, str(e)
Antoine Pitrou88909542009-06-29 13:54:42 +0000522 sys.stdout.flush()
523 print() # Force a newline (just in case)
524 print(json.dumps(result))
525 sys.exit(0)
R David Murrayb588f8d2011-03-24 14:42:58 -0400526 elif o == '--testdir':
527 # CWD is replaced with a temporary dir before calling main(), so we
528 # join it with the saved CWD so it ends up where the user expects.
529 testdir = os.path.join(support.SAVEDCWD, a)
Victor Stinner0cc8d592011-03-31 18:10:13 +0200530 elif o == '--timeout':
Victor Stinner88345682011-06-06 12:14:23 +0200531 if hasattr(faulthandler, 'dump_tracebacks_later'):
532 timeout = float(a)
533 if timeout <= 0:
534 timeout = None
535 else:
536 print("Warning: The timeout option requires "
537 "faulthandler.dump_tracebacks_later")
Victor Stinner9e586c22011-06-06 12:04:36 +0200538 timeout = None
Brian Curtinf6643452011-04-28 17:45:17 -0500539 elif o == '--wait':
540 input("Press any key to continue...")
R. David Murray35768ad2009-11-15 00:23:21 +0000541 else:
542 print(("No handler for option {}. Please report this as a bug "
Georg Brandldee7b852010-08-02 18:59:52 +0000543 "at http://bugs.python.org.").format(o), file=sys.stderr)
R. David Murray35768ad2009-11-15 00:23:21 +0000544 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000545 if single and fromfile:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000546 usage("-s and -f don't go together!")
Antoine Pitrou88909542009-06-29 13:54:42 +0000547 if use_mp and trace:
Florent Xicluna64fb18e2010-03-06 14:43:34 +0000548 usage("-T and -j don't go together!")
Antoine Pitrou88909542009-06-29 13:54:42 +0000549 if use_mp and findleaks:
Florent Xicluna64fb18e2010-03-06 14:43:34 +0000550 usage("-l and -j don't go together!")
Nadeem Vawdac1fba3e2011-08-27 15:22:05 +0200551 if use_mp and support.max_memuse:
552 usage("-M and -j don't go together!")
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200553 if failfast and not (verbose or verbose3):
554 usage("-G/--failfast needs either -v or -W")
Barry Warsaw08fca522001-08-20 22:33:46 +0000555
Guido van Rossum152494a1996-12-20 03:12:20 +0000556 good = []
557 bad = []
558 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000559 resource_denieds = []
Nick Coghlan6ead5522009-10-18 13:19:33 +0000560 environment_changed = []
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000561 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000562
Neil Schemenauerd569f232000-09-22 15:29:28 +0000563 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000564 try:
565 import gc
566 except ImportError:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000567 print('No GC available, disabling findleaks.')
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000568 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000569 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000570 # Uncomment the line below to report garbage that is not
571 # freeable by reference counting alone. By default only
572 # garbage that is not collectable by the GC is reported.
573 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000574 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000575
Barry Warsawe11e3de1999-01-28 19:51:51 +0000576 if single:
Florent Xiclunaec882212010-08-09 16:56:43 +0000577 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000578 try:
579 fp = open(filename, 'r')
R. David Murray7dc72cc2009-11-14 16:13:02 +0000580 next_test = fp.read().strip()
581 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000582 fp.close()
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200583 except OSError:
Barry Warsawe11e3de1999-01-28 19:51:51 +0000584 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000585
586 if fromfile:
587 tests = []
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000588 fp = open(os.path.join(support.SAVEDCWD, fromfile))
Antoine Pitroud95c7b52010-11-07 20:50:51 +0000589 count_pat = re.compile(r'\[\s*\d+/\s*\d+\]')
Tim Petersc5000df2002-06-02 21:42:01 +0000590 for line in fp:
Antoine Pitroud95c7b52010-11-07 20:50:51 +0000591 line = count_pat.sub('', line)
Tim Petersc5000df2002-06-02 21:42:01 +0000592 guts = line.split() # assuming no test has whitespace in its name
593 if guts and not guts[0].startswith('#'):
594 tests.extend(guts)
595 fp.close()
596
597 # Strip .py extensions.
Florent Xiclunada7bfd52010-03-06 11:43:55 +0000598 removepy(args)
599 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000600
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000601 stdtests = STDTESTS[:]
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000602 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000603 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000604 for arg in args:
605 if arg in stdtests:
606 stdtests.remove(arg)
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000607 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000608 args = []
Florent Xicluna0e62a142010-03-06 17:34:48 +0000609
610 # For a partial run, we do not need to clutter the output.
Antoine Pitrou3c4402f2011-01-03 20:38:52 +0000611 if verbose or header or not (quiet or single or tests or args):
Florent Xicluna0e62a142010-03-06 17:34:48 +0000612 # Print basic platform information
613 print("==", platform.python_implementation(), *sys.version.split())
Florent Xiclunaec882212010-08-09 16:56:43 +0000614 print("== ", platform.platform(aliased=True),
615 "%s-endian" % sys.byteorder)
Florent Xicluna0e62a142010-03-06 17:34:48 +0000616 print("== ", os.getcwd())
Antoine Pitrou3c4402f2011-01-03 20:38:52 +0000617 print("Testing with flags:", sys.flags)
Florent Xicluna0e62a142010-03-06 17:34:48 +0000618
R David Murrayb588f8d2011-03-24 14:42:58 -0400619 # if testdir is set, then we are not running the python tests suite, so
620 # don't add default tests to be executed or skipped (pass empty values)
621 if testdir:
622 alltests = findtests(testdir, list(), set())
623 else:
624 alltests = findtests(testdir, stdtests, nottests)
625
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000626 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000627 if single:
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000628 selected = selected[:1]
R. David Murrayef1992b2009-12-16 15:19:27 +0000629 try:
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000630 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murrayef1992b2009-12-16 15:19:27 +0000631 except IndexError:
632 next_single_test = None
R David Murrayc3bf78a2012-10-27 17:07:05 -0400633 # Remove all the selected tests that precede start if it's set.
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000634 if start:
635 try:
R David Murrayc3bf78a2012-10-27 17:07:05 -0400636 del selected[:selected.index(start)]
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000637 except ValueError:
638 print("Couldn't find starting test (%s), using all tests" % start)
Skip Montanaroab1c7912000-06-30 16:39:27 +0000639 if randomize:
Collin Winterfd12f492009-03-29 04:05:05 +0000640 random.seed(random_seed)
641 print("Using random seed", random_seed)
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000642 random.shuffle(selected)
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000643 if trace:
Georg Brandl33c28812009-04-01 23:07:29 +0000644 import trace, tempfile
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100645 tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,
Georg Brandl33c28812009-04-01 23:07:29 +0000646 tempfile.gettempdir()],
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000647 trace=False, count=True)
R. David Murray7dc72cc2009-11-14 16:13:02 +0000648
Christian Heimesb186d002008-03-18 15:15:01 +0000649 test_times = []
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000650 support.verbose = verbose # Tell tests to be moderately quiet
651 support.use_resources = use_resources
Guido van Rossum5796d262000-04-21 21:35:06 +0000652 save_modules = sys.modules.keys()
Antoine Pitrou88909542009-06-29 13:54:42 +0000653
654 def accumulate_result(test, result):
655 ok, test_time = result
656 test_times.append((test_time, test))
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000657 if ok == PASSED:
Antoine Pitrou88909542009-06-29 13:54:42 +0000658 good.append(test)
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000659 elif ok == FAILED:
Antoine Pitrou88909542009-06-29 13:54:42 +0000660 bad.append(test)
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000661 elif ok == ENV_CHANGED:
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000662 environment_changed.append(test)
663 elif ok == SKIPPED:
Antoine Pitrou88909542009-06-29 13:54:42 +0000664 skipped.append(test)
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000665 elif ok == RESOURCE_DENIED:
666 skipped.append(test)
667 resource_denieds.append(test)
Antoine Pitrou88909542009-06-29 13:54:42 +0000668
R. David Murray7dc72cc2009-11-14 16:13:02 +0000669 if forever:
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000670 def test_forever(tests=list(selected)):
R. David Murray7dc72cc2009-11-14 16:13:02 +0000671 while True:
672 for test in tests:
673 yield test
674 if bad:
675 return
676 tests = test_forever()
Georg Brandle8e02e32010-08-03 07:56:50 +0000677 test_count = ''
678 test_count_width = 3
R. David Murray7dc72cc2009-11-14 16:13:02 +0000679 else:
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000680 tests = iter(selected)
Georg Brandle8e02e32010-08-03 07:56:50 +0000681 test_count = '/{}'.format(len(selected))
682 test_count_width = len(test_count) - 1
R. David Murray7dc72cc2009-11-14 16:13:02 +0000683
Antoine Pitrou88909542009-06-29 13:54:42 +0000684 if use_mp:
Victor Stinner45df8202010-04-28 22:31:17 +0000685 try:
686 from threading import Thread
687 except ImportError:
688 print("Multiprocess option requires thread support")
689 sys.exit(2)
Georg Brandl1b37e872010-03-14 10:45:50 +0000690 from queue import Queue
691 from subprocess import Popen, PIPE
Antoine Pitrouf9d0b122012-12-09 14:28:26 +0100692 debug_output_pat = re.compile(r"\[\d+ refs, \d+ blocks\]$")
Antoine Pitrou88909542009-06-29 13:54:42 +0000693 output = Queue()
Antoine Pitrou09f2e6f2012-07-26 00:45:19 +0200694 pending = MultiprocessTests(tests)
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +0000695 opt_args = support.args_from_interpreter_flags()
696 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Antoine Pitrou88909542009-06-29 13:54:42 +0000697 def work():
698 # A worker thread.
Neal Norwitz14ca3272006-02-28 18:05:43 +0000699 try:
Antoine Pitrou88909542009-06-29 13:54:42 +0000700 while True:
701 try:
Antoine Pitrou09f2e6f2012-07-26 00:45:19 +0200702 test = next(pending)
R. David Murray7dc72cc2009-11-14 16:13:02 +0000703 except StopIteration:
R. David Murray27144602009-10-19 15:26:16 +0000704 output.put((None, None, None, None))
Antoine Pitrou88909542009-06-29 13:54:42 +0000705 return
Antoine Pitrou09f2e6f2012-07-26 00:45:19 +0200706 args_tuple = (
707 (test, verbose, quiet),
708 dict(huntrleaks=huntrleaks, use_resources=use_resources,
709 debug=debug, output_on_failure=verbose3,
Antoine Pitrou0b9e7b92012-07-26 00:47:15 +0200710 timeout=timeout, failfast=failfast,
711 match_tests=match_tests)
Antoine Pitrou09f2e6f2012-07-26 00:45:19 +0200712 )
Antoine Pitrou88909542009-06-29 13:54:42 +0000713 # -E is needed by some tests, e.g. test_import
Antoine Pitrou282083d2012-07-11 19:19:14 +0200714 # Running the child from the same working directory ensures
715 # that TEMPDIR for the child is the same when
716 # sysconfig.is_python_build() is true. See issue 15300.
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +0000717 popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
R. David Murray27144602009-10-19 15:26:16 +0000718 stdout=PIPE, stderr=PIPE,
Antoine Pitrou36e778e2010-08-18 20:44:14 +0000719 universal_newlines=True,
Antoine Pitrou282083d2012-07-11 19:19:14 +0200720 close_fds=(os.name != 'nt'),
721 cwd=support.SAVEDCWD)
R. David Murray27144602009-10-19 15:26:16 +0000722 stdout, stderr = popen.communicate()
Victor Stinner4b739882011-03-31 18:02:36 +0200723 retcode = popen.wait()
R. David Murray27144602009-10-19 15:26:16 +0000724 # Strip last refcount output line if it exists, since it
725 # comes from the shutdown of the interpreter in the subcommand.
726 stderr = debug_output_pat.sub("", stderr)
727 stdout, _, result = stdout.strip().rpartition("\n")
Victor Stinner4b739882011-03-31 18:02:36 +0200728 if retcode != 0:
729 result = (CHILD_ERROR, "Exit code %s" % retcode)
730 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
731 return
R. David Murray7dc72cc2009-11-14 16:13:02 +0000732 if not result:
733 output.put((None, None, None, None))
734 return
Antoine Pitrou88909542009-06-29 13:54:42 +0000735 result = json.loads(result)
R. David Murray27144602009-10-19 15:26:16 +0000736 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
Antoine Pitrou88909542009-06-29 13:54:42 +0000737 except BaseException:
R. David Murray27144602009-10-19 15:26:16 +0000738 output.put((None, None, None, None))
Neal Norwitz14ca3272006-02-28 18:05:43 +0000739 raise
Antoine Pitrou88909542009-06-29 13:54:42 +0000740 workers = [Thread(target=work) for i in range(use_mp)]
741 for worker in workers:
742 worker.start()
743 finished = 0
Georg Brandldee7b852010-08-02 18:59:52 +0000744 test_index = 1
R. David Murray7dc72cc2009-11-14 16:13:02 +0000745 try:
746 while finished < use_mp:
747 test, stdout, stderr, result = output.get()
748 if test is None:
749 finished += 1
750 continue
Victor Stinnera2a895c2011-05-23 23:14:05 +0200751 accumulate_result(test, result)
Georg Brandldee7b852010-08-02 18:59:52 +0000752 if not quiet:
Ezio Melotti84f75c62011-05-24 01:00:10 +0300753 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
754 print(fmt.format(
Victor Stinnera2a895c2011-05-23 23:14:05 +0200755 test_count_width, test_index, test_count,
756 len(bad), test))
R. David Murray7dc72cc2009-11-14 16:13:02 +0000757 if stdout:
758 print(stdout)
759 if stderr:
760 print(stderr, file=sys.stderr)
Antoine Pitrou82372582012-06-27 17:41:07 +0200761 sys.stdout.flush()
762 sys.stderr.flush()
R. David Murray7dc72cc2009-11-14 16:13:02 +0000763 if result[0] == INTERRUPTED:
Victor Stinner29650112012-08-08 22:37:26 +0200764 raise KeyboardInterrupt
Victor Stinner4b739882011-03-31 18:02:36 +0200765 if result[0] == CHILD_ERROR:
Victor Stinner571e8fd2011-05-01 22:57:43 +0200766 raise Exception("Child error on {}: {}".format(test, result[1]))
Georg Brandldee7b852010-08-02 18:59:52 +0000767 test_index += 1
R. David Murray7dc72cc2009-11-14 16:13:02 +0000768 except KeyboardInterrupt:
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000769 interrupted = True
Antoine Pitrou09f2e6f2012-07-26 00:45:19 +0200770 pending.interrupted = True
Antoine Pitrou88909542009-06-29 13:54:42 +0000771 for worker in workers:
772 worker.join()
773 else:
Georg Brandldee7b852010-08-02 18:59:52 +0000774 for test_index, test in enumerate(tests, 1):
Antoine Pitrou88909542009-06-29 13:54:42 +0000775 if not quiet:
Ezio Melotti84f75c62011-05-24 01:00:10 +0300776 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
777 print(fmt.format(
Victor Stinnera2a895c2011-05-23 23:14:05 +0200778 test_count_width, test_index, test_count, len(bad), test))
Antoine Pitrou88909542009-06-29 13:54:42 +0000779 sys.stdout.flush()
780 if trace:
781 # If we're tracing code coverage, then we don't exit with status
782 # if on a false return value from main.
Victor Stinner0cc8d592011-03-31 18:10:13 +0200783 tracer.runctx('runtest(test, verbose, quiet, timeout=timeout)',
Antoine Pitrou88909542009-06-29 13:54:42 +0000784 globals=globals(), locals=vars())
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000785 else:
Antoine Pitrou88909542009-06-29 13:54:42 +0000786 try:
Antoine Pitrou293954d2011-03-23 23:01:49 +0100787 result = runtest(test, verbose, quiet, huntrleaks, debug,
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200788 output_on_failure=verbose3,
Antoine Pitrouf83e4ac2011-07-29 23:57:10 +0200789 timeout=timeout, failfast=failfast,
790 match_tests=match_tests)
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000791 accumulate_result(test, result)
Antoine Pitrou88909542009-06-29 13:54:42 +0000792 except KeyboardInterrupt:
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000793 interrupted = True
Antoine Pitrou88909542009-06-29 13:54:42 +0000794 break
795 except:
796 raise
797 if findleaks:
798 gc.collect()
799 if gc.garbage:
800 print("Warning: test created", len(gc.garbage), end=' ')
801 print("uncollectable object(s).")
802 # move the uncollectable objects somewhere so we don't see
803 # them again
804 found_garbage.extend(gc.garbage)
805 del gc.garbage[:]
806 # Unload the newly imported modules (best effort finalization)
807 for module in sys.modules.keys():
808 if module not in save_modules and module.startswith("test."):
809 support.unload(module)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000810
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000811 if interrupted:
812 # print a newline after ^C
813 print()
814 print("Test suite interrupted by signal SIGINT.")
815 omitted = set(selected) - set(good) - set(bad) - set(skipped)
816 print(count(len(omitted), "test"), "omitted:")
817 printlist(omitted)
Guido van Rossum152494a1996-12-20 03:12:20 +0000818 if good and not quiet:
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000819 if not bad and not skipped and not interrupted and len(good) > 1:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000820 print("All", end=' ')
821 print(count(len(good), "test"), "OK.")
Christian Heimesb186d002008-03-18 15:15:01 +0000822 if print_slow:
823 test_times.sort(reverse=True)
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000824 print("10 slowest tests:")
Christian Heimesb186d002008-03-18 15:15:01 +0000825 for time, test in test_times[:10]:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000826 print("%s: %.1fs" % (test, time))
Guido van Rossum152494a1996-12-20 03:12:20 +0000827 if bad:
Nick Coghlan6ead5522009-10-18 13:19:33 +0000828 bad = sorted(set(bad) - set(environment_changed))
829 if bad:
830 print(count(len(bad), "test"), "failed:")
831 printlist(bad)
Vinay Sajipf9596182012-03-02 01:01:13 +0000832 if environment_changed:
833 print("{} altered the execution environment:".format(
834 count(len(environment_changed), "test")))
835 printlist(environment_changed)
Guido van Rossum152494a1996-12-20 03:12:20 +0000836 if skipped and not quiet:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000837 print(count(len(skipped), "test"), "skipped:")
Tim Petersa45da922001-08-12 03:45:50 +0000838 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000839
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000840 if verbose2 and bad:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000841 print("Re-running failed tests in verbose mode")
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000842 for test in bad:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000843 print("Re-running test %r in verbose mode" % test)
Tim Peters922dd7d2006-03-10 23:37:10 +0000844 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000845 try:
Antoine Pitrou88909542009-06-29 13:54:42 +0000846 verbose = True
Victor Stinner0cc8d592011-03-31 18:10:13 +0200847 ok = runtest(test, True, quiet, huntrleaks, debug, timeout=timeout)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000848 except KeyboardInterrupt:
849 # print a newline separate from the ^C
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000850 print()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000851 break
852 except:
853 raise
854
Barry Warsawe11e3de1999-01-28 19:51:51 +0000855 if single:
R. David Murrayef1992b2009-12-16 15:19:27 +0000856 if next_single_test:
857 with open(filename, 'w') as fp:
858 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000859 else:
860 os.unlink(filename)
861
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000862 if trace:
863 r = tracer.results()
864 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
865
Skip Montanaro0179a182004-06-06 15:53:18 +0000866 if runleaks:
867 os.system("leaks %d" % os.getpid())
868
Florent Xiclunad6995eb2010-03-30 19:43:09 +0000869 sys.exit(len(bad) > 0 or interrupted)
Barry Warsaw08fca522001-08-20 22:33:46 +0000870
Guido van Rossum152494a1996-12-20 03:12:20 +0000871
R David Murrayb588f8d2011-03-24 14:42:58 -0400872# small set of tests to determine if we have a basically functioning interpreter
873# (i.e. if any of these fail, then anything else is likely to follow)
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000874STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000875 'test_grammar',
876 'test_opcodes',
Guido van Rossumd8faa362007-04-27 19:54:29 +0000877 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000878 'test_builtin',
879 'test_exceptions',
880 'test_types',
Collin Winter7afaa882007-03-08 19:54:43 +0000881 'test_unittest',
882 'test_doctest',
883 'test_doctest2',
Eli Benderskyd18a0472011-07-27 20:21:45 +0300884 'test_support'
Neal Norwitz94fa2ee2008-03-31 02:55:15 +0000885]
Guido van Rossum152494a1996-12-20 03:12:20 +0000886
R David Murrayb588f8d2011-03-24 14:42:58 -0400887# set of tests that we don't want to be executed when using regrtest
R David Murray57648302011-03-24 14:57:05 -0400888NOTTESTS = set()
Guido van Rossum152494a1996-12-20 03:12:20 +0000889
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000890def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000891 """Return a list of all applicable test modules."""
Florent Xiclunada7bfd52010-03-06 11:43:55 +0000892 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +0000893 names = os.listdir(testdir)
894 tests = []
Florent Xiclunada7bfd52010-03-06 11:43:55 +0000895 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +0000896 for name in names:
R David Murray661720e2011-03-21 15:14:34 -0400897 mod, ext = os.path.splitext(name)
898 if mod[:5] == "test_" and ext in (".py", "") and mod not in others:
899 tests.append(mod)
Florent Xiclunada7bfd52010-03-06 11:43:55 +0000900 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +0000901
Antoine Pitrou09f2e6f2012-07-26 00:45:19 +0200902# We do not use a generator so multiple threads can call next().
903class MultiprocessTests(object):
904
905 """A thread-safe iterator over tests for multiprocess mode."""
906
907 def __init__(self, tests):
908 self.interrupted = False
909 self.lock = threading.Lock()
910 self.tests = tests
911
912 def __iter__(self):
913 return self
914
915 def __next__(self):
916 with self.lock:
917 if self.interrupted:
918 raise StopIteration('tests interrupted')
919 return next(self.tests)
920
Victor Stinnerf58087b2010-05-02 17:24:51 +0000921def replace_stdout():
922 """Set stdout encoder error handler to backslashreplace (as stderr error
923 handler) to avoid UnicodeEncodeError when printing a traceback"""
Victor Stinner4b2b43d2011-01-05 03:54:26 +0000924 import atexit
925
Victor Stinnerf58087b2010-05-02 17:24:51 +0000926 stdout = sys.stdout
927 sys.stdout = open(stdout.fileno(), 'w',
928 encoding=stdout.encoding,
Victor Stinner4b2b43d2011-01-05 03:54:26 +0000929 errors="backslashreplace",
Victor Stinnerbe621032011-05-25 02:01:55 +0200930 closefd=False,
931 newline='\n')
Victor Stinner4b2b43d2011-01-05 03:54:26 +0000932
933 def restore_stdout():
934 sys.stdout.close()
935 sys.stdout = stdout
936 atexit.register(restore_stdout)
Victor Stinnerf58087b2010-05-02 17:24:51 +0000937
Antoine Pitrou88909542009-06-29 13:54:42 +0000938def runtest(test, verbose, quiet,
Antoine Pitrou293954d2011-03-23 23:01:49 +0100939 huntrleaks=False, debug=False, use_resources=None,
Antoine Pitrouf83e4ac2011-07-29 23:57:10 +0200940 output_on_failure=False, failfast=False, match_tests=None,
941 timeout=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000942 """Run a single test.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000943
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000944 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000945 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000946 quiet -- if true, don't print 'skipped' messages (probably redundant)
Christian Heimesb186d002008-03-18 15:15:01 +0000947 test_times -- a list of (time, test_name) pairs
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000948 huntrleaks -- run multiple times to test for leaks; requires a debug
949 build; a triple corresponding to -R's three arguments
Victor Stinner8313d6a2011-06-29 15:22:26 +0200950 output_on_failure -- if true, display test output on failure
Victor Stinner0cc8d592011-03-31 18:10:13 +0200951 timeout -- dump the traceback and exit if a test takes more than
952 timeout seconds
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000953
954 Returns one of the test result constants:
955 INTERRUPTED KeyboardInterrupt when run under -j
956 RESOURCE_DENIED test skipped because resource denied
957 SKIPPED test skipped for some other reason
958 ENV_CHANGED test failed because it changed the execution environment
959 FAILED test failed
960 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000961 """
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000962
Antoine Pitrou88909542009-06-29 13:54:42 +0000963 if use_resources is not None:
964 support.use_resources = use_resources
Victor Stinner30196882011-06-03 12:53:26 +0200965 use_timeout = (timeout is not None)
Victor Stinner7d648a02011-03-31 18:27:50 +0200966 if use_timeout:
Victor Stinner0cc8d592011-03-31 18:10:13 +0200967 faulthandler.dump_tracebacks_later(timeout, exit=True)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000968 try:
Antoine Pitroub9c73e82011-07-29 23:53:38 +0200969 support.match_tests = match_tests
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200970 if failfast:
971 support.failfast = True
Victor Stinner8313d6a2011-06-29 15:22:26 +0200972 if output_on_failure:
Victor Stinnerea95de72011-06-29 15:34:48 +0200973 support.verbose = True
974
975 # Reuse the same instance to all calls to runtest(). Some
976 # tests keep a reference to sys.stdout or sys.stderr
977 # (eg. test_argparse).
Victor Stinner8313d6a2011-06-29 15:22:26 +0200978 if runtest.stringio is None:
Victor Stinnerfcc2a212011-06-29 20:01:29 +0200979 stream = io.StringIO()
980 runtest.stringio = stream
981 else:
982 stream = runtest.stringio
983 stream.seek(0)
984 stream.truncate()
Victor Stinner8313d6a2011-06-29 15:22:26 +0200985
986 orig_stdout = sys.stdout
Victor Stinnera7c33e52011-06-29 13:00:54 +0200987 orig_stderr = sys.stderr
Victor Stinner8313d6a2011-06-29 15:22:26 +0200988 try:
Victor Stinnerea95de72011-06-29 15:34:48 +0200989 sys.stdout = stream
990 sys.stderr = stream
Victor Stinner8313d6a2011-06-29 15:22:26 +0200991 result = runtest_inner(test, verbose, quiet, huntrleaks,
992 debug, display_failure=False)
993 if result[0] == FAILED:
Victor Stinnerea95de72011-06-29 15:34:48 +0200994 output = stream.getvalue()
Victor Stinner8313d6a2011-06-29 15:22:26 +0200995 orig_stderr.write(output)
996 orig_stderr.flush()
997 finally:
998 sys.stdout = orig_stdout
999 sys.stderr = orig_stderr
Victor Stinnera7c33e52011-06-29 13:00:54 +02001000 else:
Victor Stinnerea95de72011-06-29 15:34:48 +02001001 support.verbose = verbose # Tell tests to be moderately quiet
Victor Stinnera7c33e52011-06-29 13:00:54 +02001002 result = runtest_inner(test, verbose, quiet, huntrleaks, debug,
1003 display_failure=not verbose)
Antoine Pitrou293954d2011-03-23 23:01:49 +01001004 return result
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001005 finally:
Victor Stinner7d648a02011-03-31 18:27:50 +02001006 if use_timeout:
Victor Stinner0cc8d592011-03-31 18:10:13 +02001007 faulthandler.cancel_dump_tracebacks_later()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001008 cleanup_test_droppings(test, verbose)
Victor Stinner8313d6a2011-06-29 15:22:26 +02001009runtest.stringio = None
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001010
Nick Coghlan6ead5522009-10-18 13:19:33 +00001011# Unit tests are supposed to leave the execution environment unchanged
1012# once they complete. But sometimes tests have bugs, especially when
1013# tests fail, and the changes to environment go on to mess up other
1014# tests. This can cause issues with buildbot stability, since tests
1015# are run in random order and so problems may appear to come and go.
1016# There are a few things we can save and restore to mitigate this, and
1017# the following context manager handles this task.
1018
1019class saved_test_environment:
1020 """Save bits of the test environment and restore them at block exit.
1021
1022 with saved_test_environment(testname, verbose, quiet):
1023 #stuff
1024
1025 Unless quiet is True, a warning is printed to stderr if any of
1026 the saved items was changed by the test. The attribute 'changed'
1027 is initially False, but is set to True if a change is detected.
1028
1029 If verbose is more than 1, the before and after state of changed
1030 items is also printed.
1031 """
1032
1033 changed = False
1034
1035 def __init__(self, testname, verbose=0, quiet=False):
1036 self.testname = testname
1037 self.verbose = verbose
1038 self.quiet = quiet
1039
1040 # To add things to save and restore, add a name XXX to the resources list
1041 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
1042 # return the value to be saved and compared against a second call to the
1043 # get function when test execution completes. restore_XXX should accept
1044 # the saved value and restore the resource using it. It will be called if
1045 # and only if a change in the value is detected.
1046 #
1047 # Note: XXX will have any '.' replaced with '_' characters when determining
1048 # the corresponding method names.
1049
1050 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Brett Cannon29c0e4f2010-03-20 22:22:57 +00001051 'os.environ', 'sys.path', 'sys.path_hooks', '__import__',
Nick Coghlan7bd5dbe2010-12-05 07:17:25 +00001052 'warnings.filters', 'asyncore.socket_map',
Ezio Melotti45763d02011-03-20 15:34:28 +02001053 'logging._handlers', 'logging._handlerList', 'sys.gettrace',
Antoine Pitrouc081c0c2011-07-15 22:12:24 +02001054 'sys.warnoptions', 'threading._dangling',
Éric Araujo28df8de2011-09-19 05:10:45 +02001055 'multiprocessing.process._dangling',
Éric Araujoec177c12012-06-24 03:27:43 -04001056 'sysconfig._CONFIG_VARS', 'sysconfig._INSTALL_SCHEMES',
Vinay Sajipf9596182012-03-02 01:01:13 +00001057 'support.TESTFN',
Éric Araujo28df8de2011-09-19 05:10:45 +02001058 )
Nick Coghlan6ead5522009-10-18 13:19:33 +00001059
1060 def get_sys_argv(self):
1061 return id(sys.argv), sys.argv, sys.argv[:]
1062 def restore_sys_argv(self, saved_argv):
1063 sys.argv = saved_argv[1]
1064 sys.argv[:] = saved_argv[2]
1065
1066 def get_cwd(self):
1067 return os.getcwd()
1068 def restore_cwd(self, saved_cwd):
1069 os.chdir(saved_cwd)
1070
1071 def get_sys_stdout(self):
1072 return sys.stdout
1073 def restore_sys_stdout(self, saved_stdout):
1074 sys.stdout = saved_stdout
1075
1076 def get_sys_stderr(self):
1077 return sys.stderr
1078 def restore_sys_stderr(self, saved_stderr):
1079 sys.stderr = saved_stderr
1080
1081 def get_sys_stdin(self):
1082 return sys.stdin
1083 def restore_sys_stdin(self, saved_stdin):
1084 sys.stdin = saved_stdin
1085
1086 def get_os_environ(self):
1087 return id(os.environ), os.environ, dict(os.environ)
1088 def restore_os_environ(self, saved_environ):
1089 os.environ = saved_environ[1]
1090 os.environ.clear()
1091 os.environ.update(saved_environ[2])
1092
1093 def get_sys_path(self):
1094 return id(sys.path), sys.path, sys.path[:]
1095 def restore_sys_path(self, saved_path):
1096 sys.path = saved_path[1]
1097 sys.path[:] = saved_path[2]
1098
Brett Cannon055470a2010-02-19 15:57:10 +00001099 def get_sys_path_hooks(self):
1100 return id(sys.path_hooks), sys.path_hooks, sys.path_hooks[:]
1101 def restore_sys_path_hooks(self, saved_hooks):
1102 sys.path_hooks = saved_hooks[1]
1103 sys.path_hooks[:] = saved_hooks[2]
1104
Brett Cannon31f59292011-02-21 19:29:56 +00001105 def get_sys_gettrace(self):
1106 return sys.gettrace()
1107 def restore_sys_gettrace(self, trace_fxn):
1108 sys.settrace(trace_fxn)
1109
Brett Cannon055470a2010-02-19 15:57:10 +00001110 def get___import__(self):
Brett Cannon45071902010-06-14 22:22:54 +00001111 return builtins.__import__
Brett Cannon055470a2010-02-19 15:57:10 +00001112 def restore___import__(self, import_):
Brett Cannon45071902010-06-14 22:22:54 +00001113 builtins.__import__ = import_
Brett Cannon055470a2010-02-19 15:57:10 +00001114
Brett Cannon29c0e4f2010-03-20 22:22:57 +00001115 def get_warnings_filters(self):
1116 return id(warnings.filters), warnings.filters, warnings.filters[:]
1117 def restore_warnings_filters(self, saved_filters):
1118 warnings.filters = saved_filters[1]
1119 warnings.filters[:] = saved_filters[2]
1120
Antoine Pitroub14ac8c2010-08-16 00:28:05 +00001121 def get_asyncore_socket_map(self):
1122 asyncore = sys.modules.get('asyncore')
Antoine Pitrouaa879652010-10-29 11:54:38 +00001123 # XXX Making a copy keeps objects alive until __exit__ gets called.
1124 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitroub14ac8c2010-08-16 00:28:05 +00001125 def restore_asyncore_socket_map(self, saved_map):
1126 asyncore = sys.modules.get('asyncore')
1127 if asyncore is not None:
Antoine Pitrouaa879652010-10-29 11:54:38 +00001128 asyncore.close_all(ignore_all=True)
Antoine Pitroub14ac8c2010-08-16 00:28:05 +00001129 asyncore.socket_map.update(saved_map)
1130
Éric Araujoff913062011-11-29 16:45:07 +01001131 def get_shutil_archive_formats(self):
1132 # we could call get_archives_formats() but that only returns the
1133 # registry keys; we want to check the values too (the functions that
1134 # are registered)
1135 return shutil._ARCHIVE_FORMATS, shutil._ARCHIVE_FORMATS.copy()
1136 def restore_shutil_archive_formats(self, saved):
1137 shutil._ARCHIVE_FORMATS = saved[0]
1138 shutil._ARCHIVE_FORMATS.clear()
1139 shutil._ARCHIVE_FORMATS.update(saved[1])
1140
1141 def get_shutil_unpack_formats(self):
1142 return shutil._UNPACK_FORMATS, shutil._UNPACK_FORMATS.copy()
1143 def restore_shutil_unpack_formats(self, saved):
1144 shutil._UNPACK_FORMATS = saved[0]
1145 shutil._UNPACK_FORMATS.clear()
1146 shutil._UNPACK_FORMATS.update(saved[1])
1147
Nick Coghlan7d819752010-12-05 06:45:03 +00001148 def get_logging__handlers(self):
1149 # _handlers is a WeakValueDictionary
Nick Coghlan7bd5dbe2010-12-05 07:17:25 +00001150 return id(logging._handlers), logging._handlers, logging._handlers.copy()
Nick Coghlan7d819752010-12-05 06:45:03 +00001151 def restore_logging__handlers(self, saved_handlers):
1152 # Can't easily revert the logging state
1153 pass
1154
Nick Coghlan7bd5dbe2010-12-05 07:17:25 +00001155 def get_logging__handlerList(self):
1156 # _handlerList is a list of weakrefs to handlers
1157 return id(logging._handlerList), logging._handlerList, logging._handlerList[:]
1158 def restore_logging__handlerList(self, saved_handlerList):
1159 # Can't easily revert the logging state
1160 pass
1161
Ezio Melotti0123e052011-03-20 15:09:26 +02001162 def get_sys_warnoptions(self):
1163 return id(sys.warnoptions), sys.warnoptions, sys.warnoptions[:]
1164 def restore_sys_warnoptions(self, saved_options):
1165 sys.warnoptions = saved_options[1]
1166 sys.warnoptions[:] = saved_options[2]
1167
Antoine Pitrouc081c0c2011-07-15 22:12:24 +02001168 # Controlling dangling references to Thread objects can make it easier
1169 # to track reference leaks.
1170 def get_threading__dangling(self):
1171 if not threading:
1172 return None
1173 # This copies the weakrefs without making any strong reference
1174 return threading._dangling.copy()
1175 def restore_threading__dangling(self, saved):
1176 if not threading:
1177 return
1178 threading._dangling.clear()
1179 threading._dangling.update(saved)
1180
1181 # Same for Process objects
1182 def get_multiprocessing_process__dangling(self):
1183 if not multiprocessing:
1184 return None
1185 # This copies the weakrefs without making any strong reference
1186 return multiprocessing.process._dangling.copy()
1187 def restore_multiprocessing_process__dangling(self, saved):
1188 if not multiprocessing:
1189 return
1190 multiprocessing.process._dangling.clear()
1191 multiprocessing.process._dangling.update(saved)
1192
Éric Araujo28df8de2011-09-19 05:10:45 +02001193 def get_sysconfig__CONFIG_VARS(self):
1194 # make sure the dict is initialized
1195 sysconfig.get_config_var('prefix')
1196 return (id(sysconfig._CONFIG_VARS), sysconfig._CONFIG_VARS,
1197 dict(sysconfig._CONFIG_VARS))
1198 def restore_sysconfig__CONFIG_VARS(self, saved):
1199 sysconfig._CONFIG_VARS = saved[1]
1200 sysconfig._CONFIG_VARS.clear()
1201 sysconfig._CONFIG_VARS.update(saved[2])
1202
Éric Araujoec177c12012-06-24 03:27:43 -04001203 def get_sysconfig__INSTALL_SCHEMES(self):
1204 return (id(sysconfig._INSTALL_SCHEMES), sysconfig._INSTALL_SCHEMES,
1205 sysconfig._INSTALL_SCHEMES.copy())
1206 def restore_sysconfig__INSTALL_SCHEMES(self, saved):
1207 sysconfig._INSTALL_SCHEMES = saved[1]
1208 sysconfig._INSTALL_SCHEMES.clear()
1209 sysconfig._INSTALL_SCHEMES.update(saved[2])
Éric Araujo28df8de2011-09-19 05:10:45 +02001210
Vinay Sajipf9596182012-03-02 01:01:13 +00001211 def get_support_TESTFN(self):
1212 if os.path.isfile(support.TESTFN):
1213 result = 'f'
1214 elif os.path.isdir(support.TESTFN):
1215 result = 'd'
1216 else:
1217 result = None
1218 return result
1219 def restore_support_TESTFN(self, saved_value):
1220 if saved_value is None:
1221 if os.path.isfile(support.TESTFN):
1222 os.unlink(support.TESTFN)
1223 elif os.path.isdir(support.TESTFN):
1224 shutil.rmtree(support.TESTFN)
Éric Araujo28df8de2011-09-19 05:10:45 +02001225
Nick Coghlan6ead5522009-10-18 13:19:33 +00001226 def resource_info(self):
1227 for name in self.resources:
1228 method_suffix = name.replace('.', '_')
1229 get_name = 'get_' + method_suffix
1230 restore_name = 'restore_' + method_suffix
1231 yield name, getattr(self, get_name), getattr(self, restore_name)
1232
1233 def __enter__(self):
1234 self.saved_values = dict((name, get()) for name, get, restore
1235 in self.resource_info())
1236 return self
1237
1238 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitrouaa879652010-10-29 11:54:38 +00001239 saved_values = self.saved_values
1240 del self.saved_values
Nick Coghlan6ead5522009-10-18 13:19:33 +00001241 for name, get, restore in self.resource_info():
1242 current = get()
Antoine Pitrouaa879652010-10-29 11:54:38 +00001243 original = saved_values.pop(name)
Nick Coghlan6ead5522009-10-18 13:19:33 +00001244 # Check for changes to the resource's value
1245 if current != original:
1246 self.changed = True
1247 restore(original)
1248 if not self.quiet:
1249 print("Warning -- {} was modified by {}".format(
1250 name, self.testname),
1251 file=sys.stderr)
1252 if self.verbose > 1:
1253 print(" Before: {}\n After: {} ".format(
1254 original, current),
1255 file=sys.stderr)
1256 return False
1257
1258
Victor Stinnera7c33e52011-06-29 13:00:54 +02001259def runtest_inner(test, verbose, quiet,
1260 huntrleaks=False, debug=False, display_failure=True):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001261 support.unload(test)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001262
Antoine Pitrou88909542009-06-29 13:54:42 +00001263 test_time = 0.0
Collin Wintera5503d52009-05-15 01:20:21 +00001264 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +00001265 try:
R. David Murray0bc11ae2009-10-18 22:18:17 +00001266 if test.startswith('test.'):
1267 abstest = test
1268 else:
1269 # Always import it from the test package
1270 abstest = 'test.' + test
1271 with saved_test_environment(test, verbose, quiet) as environment:
1272 start_time = time.time()
Brett Cannon613cf252012-11-14 13:42:51 -05001273 the_module = importlib.import_module(abstest)
R David Murray78fc25c2012-04-09 08:55:42 -04001274 # If the test has a test_main, that will run the appropriate
1275 # tests. If not, use normal unittest test loading.
1276 test_runner = getattr(the_module, "test_main", None)
1277 if test_runner is None:
1278 tests = unittest.TestLoader().loadTestsFromModule(the_module)
1279 test_runner = lambda: support.run_unittest(tests)
1280 test_runner()
R. David Murray0bc11ae2009-10-18 22:18:17 +00001281 if huntrleaks:
R David Murray78fc25c2012-04-09 08:55:42 -04001282 refleak = dash_R(the_module, test, test_runner,
R. David Murray0bc11ae2009-10-18 22:18:17 +00001283 huntrleaks)
1284 test_time = time.time() - start_time
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001285 except support.ResourceDenied as msg:
Fred Drake9a0db072003-02-03 15:19:30 +00001286 if not quiet:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001287 print(test, "skipped --", msg)
Fred Drake9a0db072003-02-03 15:19:30 +00001288 sys.stdout.flush()
Benjamin Petersona0dfa822009-11-13 02:25:08 +00001289 return RESOURCE_DENIED, test_time
R. David Murraya21e4ca2009-03-31 23:16:50 +00001290 except unittest.SkipTest as msg:
Trent Mickf29f47b2000-08-11 19:02:59 +00001291 if not quiet:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001292 print(test, "skipped --", msg)
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001293 sys.stdout.flush()
Benjamin Petersona0dfa822009-11-13 02:25:08 +00001294 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +00001295 except KeyboardInterrupt:
1296 raise
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001297 except support.TestFailed as msg:
Victor Stinnera7c33e52011-06-29 13:00:54 +02001298 if display_failure:
1299 print("test", test, "failed --", msg, file=sys.stderr)
1300 else:
1301 print("test", test, "failed", file=sys.stderr)
R. David Murray11cabcf2010-09-29 01:08:05 +00001302 sys.stderr.flush()
Benjamin Petersona0dfa822009-11-13 02:25:08 +00001303 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001304 except:
Antoine Pitrou779a5b02011-03-21 19:55:16 +01001305 msg = traceback.format_exc()
1306 print("test", test, "crashed --", msg, file=sys.stderr)
R. David Murray11cabcf2010-09-29 01:08:05 +00001307 sys.stderr.flush()
Benjamin Petersona0dfa822009-11-13 02:25:08 +00001308 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001309 else:
Collin Wintera5503d52009-05-15 01:20:21 +00001310 if refleak:
Benjamin Petersona0dfa822009-11-13 02:25:08 +00001311 return FAILED, test_time
Nick Coghlan6ead5522009-10-18 13:19:33 +00001312 if environment.changed:
Benjamin Petersona0dfa822009-11-13 02:25:08 +00001313 return ENV_CHANGED, test_time
1314 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001315
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001316def cleanup_test_droppings(testname, verbose):
1317 import shutil
Benjamin Peterson25c95f12009-05-08 20:42:26 +00001318 import stat
Antoine Pitrouc14efc42010-10-29 19:34:45 +00001319 import gc
1320
1321 # First kill any dangling references to open files etc.
1322 # This can also issue some ResourceWarnings which would otherwise get
Antoine Pitrou2b40efd2010-10-29 19:36:37 +00001323 # triggered during the following test run, and possibly produce failures.
Antoine Pitrouc14efc42010-10-29 19:34:45 +00001324 gc.collect()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001325
1326 # Try to clean up junk commonly left behind. While tests shouldn't leave
1327 # any files or directories behind, when a test fails that can be tedious
1328 # for it to arrange. The consequences can be especially nasty on Windows,
1329 # since if a test leaves a file open, it cannot be deleted by name (while
1330 # there's nothing we can do about that here either, we can display the
1331 # name of the offending test, which is a real help).
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001332 for name in (support.TESTFN,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001333 "db_home",
1334 ):
1335 if not os.path.exists(name):
1336 continue
1337
1338 if os.path.isdir(name):
1339 kind, nuker = "directory", shutil.rmtree
1340 elif os.path.isfile(name):
1341 kind, nuker = "file", os.unlink
1342 else:
1343 raise SystemError("os.path says %r exists but is neither "
1344 "directory nor file" % name)
1345
1346 if verbose:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001347 print("%r left behind %s %r" % (testname, kind, name))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001348 try:
Benjamin Peterson25c95f12009-05-08 20:42:26 +00001349 # if we have chmod, fix possible permissions problems
1350 # that might prevent cleanup
1351 if (hasattr(os, 'chmod')):
1352 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001353 nuker(name)
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001354 except Exception as msg:
1355 print(("%r left behind %s %r and it couldn't be "
1356 "removed: %s" % (testname, kind, name, msg)), file=sys.stderr)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001357
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001358def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Wintera5503d52009-05-15 01:20:21 +00001359 """Run a test multiple times, looking for reference leaks.
1360
1361 Returns:
1362 False if the test didn't leak references; True if we detected refleaks.
1363 """
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001364 # This code is hackish and inelegant, but it seems to do the job.
Raymond Hettinger158c9c22011-02-22 00:41:50 +00001365 import copyreg
1366 import collections.abc
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001367
1368 if not hasattr(sys, 'gettotalrefcount'):
1369 raise Exception("Tracking reference leaks requires a debug build "
1370 "of Python")
1371
1372 # Save current values for dash_R_cleanup() to restore.
1373 fs = warnings.filters[:]
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00001374 ps = copyreg.dispatch_table.copy()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001375 pic = sys.path_importer_cache.copy()
Nick Coghlan260bd3e2009-11-16 06:49:25 +00001376 try:
1377 import zipimport
1378 except ImportError:
1379 zdc = None # Run unmodified on platforms without zipimport support
1380 else:
1381 zdc = zipimport._zip_directory_cache.copy()
Christian Heimes93852662007-12-01 12:22:32 +00001382 abcs = {}
Raymond Hettinger158c9c22011-02-22 00:41:50 +00001383 for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]:
Christian Heimesbe5b30b2008-03-03 19:18:51 +00001384 if not isabstract(abc):
Christian Heimes93852662007-12-01 12:22:32 +00001385 continue
1386 for obj in abc.__subclasses__() + [abc]:
1387 abcs[obj] = obj._abc_registry.copy()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001388
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001389 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti184bdfb2010-02-18 09:37:05 +00001390 fname = os.path.join(support.SAVEDCWD, fname)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001391 repcount = nwarmup + ntracked
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001392 rc_deltas = [0] * repcount
1393 alloc_deltas = [0] * repcount
1394
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001395 print("beginning", repcount, "repetitions", file=sys.stderr)
1396 print(("1234567890"*(repcount//10 + 1))[:repcount], file=sys.stderr)
Antoine Pitrou88909542009-06-29 13:54:42 +00001397 sys.stderr.flush()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001398 for i in range(repcount):
R David Murray14d080e2013-01-12 11:34:38 -05001399 indirect_test()
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001400 alloc_after, rc_after = dash_R_cleanup(fs, ps, pic, zdc, abcs)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001401 sys.stderr.write('.')
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001402 sys.stderr.flush()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001403 if i >= nwarmup:
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001404 rc_deltas[i] = rc_after - rc_before
1405 alloc_deltas[i] = alloc_after - alloc_before
1406 alloc_before, rc_before = alloc_after, rc_after
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001407 print(file=sys.stderr)
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001408 # These checkers return False on success, True on failure
1409 def check_rc_deltas(deltas):
1410 return any(deltas)
1411 def check_alloc_deltas(deltas):
1412 # At least 1/3rd of 0s
1413 if 3 * deltas.count(0) < len(deltas):
1414 return True
1415 # Nothing else than 1s, 0s and -1s
1416 if not set(deltas) <= {1,0,-1}:
1417 return True
1418 return False
1419 failed = False
1420 for deltas, item_name, checker in [
1421 (rc_deltas, 'references', check_rc_deltas),
1422 (alloc_deltas, 'memory blocks', check_alloc_deltas)]:
1423 if checker(deltas):
1424 msg = '%s leaked %s %s, sum=%s' % (
1425 test, deltas[nwarmup:], item_name, sum(deltas))
1426 print(msg, file=sys.stderr)
1427 sys.stderr.flush()
1428 with open(fname, "a") as refrep:
1429 print(msg, file=refrep)
1430 refrep.flush()
1431 failed = True
1432 return failed
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001433
Nick Coghlan260bd3e2009-11-16 06:49:25 +00001434def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00001435 import gc, copyreg
Brett Cannonf4fd9932008-05-10 21:11:46 +00001436 import _strptime, linecache
Jeremy Hylton1afc1692008-06-18 20:49:58 +00001437 import urllib.parse, urllib.request, mimetypes, doctest
Raymond Hettinger158c9c22011-02-22 00:41:50 +00001438 import struct, filecmp, collections.abc
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001439 from distutils.dir_util import _path_created
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001440 from weakref import WeakSet
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001441
Christian Heimesdae2a892008-04-19 00:55:37 +00001442 # Clear the warnings registry, so they can be displayed again
1443 for mod in sys.modules.values():
1444 if hasattr(mod, '__warningregistry__'):
1445 del mod.__warningregistry__
1446
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001447 # Restore some original values.
1448 warnings.filters[:] = fs
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00001449 copyreg.dispatch_table.clear()
1450 copyreg.dispatch_table.update(ps)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001451 sys.path_importer_cache.clear()
1452 sys.path_importer_cache.update(pic)
Nick Coghlan260bd3e2009-11-16 06:49:25 +00001453 try:
1454 import zipimport
1455 except ImportError:
1456 pass # Run unmodified on platforms without zipimport support
1457 else:
1458 zipimport._zip_directory_cache.clear()
1459 zipimport._zip_directory_cache.update(zdc)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001460
Christian Heimes26855632008-01-27 23:50:43 +00001461 # clear type cache
Christian Heimes15ebc882008-02-04 18:48:49 +00001462 sys._clear_type_cache()
Christian Heimes26855632008-01-27 23:50:43 +00001463
Guido van Rossum3de862d2007-08-18 00:10:33 +00001464 # Clear ABC registries, restoring previously saved ABC registries.
Raymond Hettinger158c9c22011-02-22 00:41:50 +00001465 for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]:
Christian Heimesbe5b30b2008-03-03 19:18:51 +00001466 if not isabstract(abc):
Christian Heimes941973a2007-11-30 21:53:03 +00001467 continue
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001468 for obj in abc.__subclasses__() + [abc]:
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001469 obj._abc_registry = abcs.get(obj, WeakSet()).copy()
Guido van Rossumc1e315d2007-08-20 19:29:24 +00001470 obj._abc_cache.clear()
1471 obj._abc_negative_cache.clear()
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001472
Antoine Pitrou046467c2009-10-30 18:30:35 +00001473 # Flush standard output, so that buffered data is sent to the OS and
1474 # associated Python objects are reclaimed.
1475 for stream in (sys.stdout, sys.stderr, sys.__stdout__, sys.__stderr__):
1476 if stream is not None:
1477 stream.flush()
1478
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001479 # Clear assorted module caches.
1480 _path_created.clear()
1481 re.purge()
1482 _strptime._regex_cache.clear()
Jeremy Hylton1afc1692008-06-18 20:49:58 +00001483 urllib.parse.clear_cache()
1484 urllib.request.urlcleanup()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001485 linecache.clearcache()
1486 mimetypes._default_mime_types()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001487 filecmp._cache.clear()
Christian Heimesa34706f2008-01-04 03:06:10 +00001488 struct._clearcache()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001489 doctest.master = None
Meador Inge11e38132011-11-25 22:33:32 -06001490 try:
1491 import ctypes
1492 except ImportError:
1493 # Don't worry about resetting the cache if ctypes is not supported
1494 pass
1495 else:
1496 ctypes._reset_cache()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001497
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001498 # Collect cyclic trash and read memory statistics immediately after.
1499 func1 = sys.getallocatedblocks
1500 func2 = sys.gettotalrefcount
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001501 gc.collect()
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001502 return func1(), func2()
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001503
Stefan Krah5c3ddc82012-08-17 23:09:48 +02001504def warm_caches():
1505 # char cache
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001506 s = bytes(range(256))
1507 for i in range(256):
1508 s[i:i+1]
Stefan Krah5c3ddc82012-08-17 23:09:48 +02001509 # unicode cache
1510 x = [chr(i) for i in range(256)]
1511 # int cache
1512 x = list(range(-5, 257))
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001513
Florent Xiclunada7bfd52010-03-06 11:43:55 +00001514def findtestdir(path=None):
1515 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001516
Florent Xiclunada7bfd52010-03-06 11:43:55 +00001517def removepy(names):
1518 if not names:
1519 return
1520 for idx, name in enumerate(names):
1521 basename, ext = os.path.splitext(name)
1522 if ext == '.py':
1523 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001524
Guido van Rossum152494a1996-12-20 03:12:20 +00001525def count(n, word):
1526 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001527 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001528 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001529 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001530
Tim Petersa45da922001-08-12 03:45:50 +00001531def printlist(x, width=70, indent=4):
Tim Peters7c7efe92002-08-23 17:55:54 +00001532 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001533
1534 Optional arg width (default 70) is the maximum line length.
1535 Optional arg indent (default 4) is the number of blanks with which to
1536 begin each line.
1537 """
1538
Tim Petersba78bc42002-07-04 19:45:06 +00001539 from textwrap import fill
1540 blanks = ' ' * indent
Florent Xiclunafd1b0932010-03-28 00:25:02 +00001541 # Print the sorted list: 'x' may be a '--random' list or a set()
1542 print(fill(' '.join(str(elt) for elt in sorted(x)), width,
Neal Norwitz94fa2ee2008-03-31 02:55:15 +00001543 initial_indent=blanks, subsequent_indent=blanks))
Tim Petersa45da922001-08-12 03:45:50 +00001544
Tim Petersb5b7b782001-08-12 01:20:39 +00001545
Michael Foord3ab34cc2010-12-03 12:27:40 +00001546def _make_temp_dir_for_build(TEMPDIR):
1547 # When tests are run from the Python build directory, it is best practice
1548 # to keep the test files in a subfolder. It eases the cleanup of leftover
1549 # files using command "make distclean".
1550 if sysconfig.is_python_build():
1551 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
1552 TEMPDIR = os.path.abspath(TEMPDIR)
Antoine Pitrouee429342011-04-16 18:53:59 +02001553 try:
Michael Foord3ab34cc2010-12-03 12:27:40 +00001554 os.mkdir(TEMPDIR)
Florent Xicluna68f71a32011-10-28 16:06:23 +02001555 except FileExistsError:
1556 pass
Michael Foord3ab34cc2010-12-03 12:27:40 +00001557
1558 # Define a writable temp dir that will be used as cwd while running
1559 # the tests. The name of the dir includes the pid to allow parallel
1560 # testing (see the -j option).
1561 TESTCWD = 'test_python_{}'.format(os.getpid())
1562
1563 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
1564 return TEMPDIR, TESTCWD
Nick Coghlan4c4c0f22010-12-03 07:44:33 +00001565
Guido van Rossum152494a1996-12-20 03:12:20 +00001566if __name__ == '__main__':
Nick Coghlan4c4c0f22010-12-03 07:44:33 +00001567 # Remove regrtest.py's own directory from the module search path. Despite
1568 # the elimination of implicit relative imports, this is still needed to
1569 # ensure that submodules of the test package do not inappropriately appear
1570 # as top-level modules even when people (or buildbots!) invoke regrtest.py
1571 # directly instead of using the -m switch
1572 mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
1573 i = len(sys.path)
1574 while i >= 0:
1575 i -= 1
1576 if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
1577 del sys.path[i]
1578
Florent Xiclunadc69e722010-09-13 16:35:02 +00001579 # findtestdir() gets the dirname out of __file__, so we have to make it
1580 # absolute before changing the working directory.
1581 # For example __file__ may be relative when running trace or profile.
1582 # See issue #9323.
1583 __file__ = os.path.abspath(__file__)
1584
1585 # sanity check
Florent Xiclunada7bfd52010-03-06 11:43:55 +00001586 assert __file__ == os.path.abspath(sys.argv[0])
Ezio Melotti184bdfb2010-02-18 09:37:05 +00001587
Michael Foord3ab34cc2010-12-03 12:27:40 +00001588 TEMPDIR, TESTCWD = _make_temp_dir_for_build(TEMPDIR)
Ezio Melotti184bdfb2010-02-18 09:37:05 +00001589
1590 # Run the tests in a context manager that temporary changes the CWD to a
1591 # temporary and writable directory. If it's not possible to create or
1592 # change the CWD, the original CWD will be used. The original CWD is
1593 # available from support.SAVEDCWD.
1594 with support.temp_cwd(TESTCWD, quiet=True):
1595 main()