blob: 413d7f906490749bbaf149619d40dad0db822956 [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
Georg Brandl83191702009-10-27 20:55:44 +000030-S/--slow -- 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
41-G/--failfast -- fail as soon as a test fails (only with -v or -W)
Georg Brandl83191702009-10-27 20:55:44 +000042-u/--use RES1,RES2,...
43 -- specify which special resource intensive tests to run
44-M/--memlimit LIMIT
45 -- run very large memory-consuming tests
46
47Special runs
48
49-l/--findleaks -- if GC is available detect tests that leak memory
50-L/--runleaks -- run the leaks(1) command just before exit
51-R/--huntrleaks RUNCOUNTS
52 -- search for reference leaks (needs debug build, v. slow)
53-j/--multiprocess PROCESSES
54 -- run PROCESSES processes at once
R. David Murray3bfa8832010-04-26 16:54:57 +000055-T/--coverage -- turn on code coverage tracing using the trace module
Georg Brandl83191702009-10-27 20:55:44 +000056-D/--coverdir DIRECTORY
57 -- Directory where coverage files are put
58-N/--nocoverdir -- Put coverage files alongside modules
59-t/--threshold THRESHOLD
60 -- call gc.set_threshold(THRESHOLD)
R. David Murray3bfa8832010-04-26 16:54:57 +000061-F/--forever -- run the specified tests in a loop, until an error happens
Brett Cannon95374782015-10-02 16:21:34 -070062-P/--pgo -- enable Profile Guided Optimization training
Guido van Rossum152494a1996-12-20 03:12:20 +000063
R. David Murray3bfa8832010-04-26 16:54:57 +000064
65Additional Option Details:
Guido van Rossumf58ed251997-03-07 21:04:33 +000066
Serhiy Storchakac72e66a2015-11-02 15:06:09 +020067-r randomizes test execution order. You can use --randseed=int to provide an
Collin Wintera199f012009-03-29 03:44:19 +000068int seed value for the randomizer; this is useful for reproducing troublesome
69test orders.
70
R. David Murray3bfa8832010-04-26 16:54:57 +000071-s On the first invocation of regrtest using -s, the first test file found
72or the first test file given on the command line is run, and the name of
73the next test is recorded in a file named pynexttest. If run from the
74Python build directory, pynexttest is located in the 'build' subdirectory,
75otherwise it is located in tempfile.gettempdir(). On subsequent runs,
76the test in pynexttest is run, and the next test is written to pynexttest.
77When the last test has been run, pynexttest is deleted. In this way it
78is possible to single step through the test files. This is useful when
79doing memory analysis on the Python interpreter, which process tends to
80consume too many resources to run the full regression test non-stop.
Barry Warsawe11e3de1999-01-28 19:51:51 +000081
Guido van Rossum9e9d4f82002-06-07 15:17:03 +000082-f reads the names of tests from the file given as f's argument, one
83or more test names per line. Whitespace is ignored. Blank lines and
84lines beginning with '#' are ignored. This is especially useful for
85whittling down failures involving interactions among tests.
Tim Petersc5000df2002-06-02 21:42:01 +000086
Skip Montanaro0179a182004-06-06 15:53:18 +000087-L causes the leaks(1) command to be run just before exit if it exists.
88leaks(1) is available on Mac OS X and presumably on some other
89FreeBSD-derived systems.
90
Michael W. Hudson61147f62004-08-03 11:33:28 +000091-R runs each test several times and examines sys.gettotalrefcount() to
92see if the test appears to be leaking references. The argument should
93be of the form stab:run:fname where 'stab' is the number of times the
94test is run to let gettotalrefcount settle down, 'run' is the number
95of times further it is run and 'fname' is the name of the file the
96reports are written to. These parameters all have defaults (5, 4 and
Florent Xicluna12d750d2010-03-06 14:38:09 +000097"reflog.txt" respectively), and the minimal invocation is '-R :'.
Michael W. Hudson61147f62004-08-03 11:33:28 +000098
Thomas Woutersabd08882006-04-26 15:53:30 +000099-M runs tests that require an exorbitant amount of memory. These tests
100typically try to ascertain containers keep working when containing more than
Armin Rigo97ff0472006-08-09 15:37:26 +00001012 billion objects, which only works on 64-bit systems. There are also some
102tests that try to exhaust the address space of the process, which only makes
103sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
Thomas Woutersabd08882006-04-26 15:53:30 +0000104which is a string in the form of '2.5Gb', determines howmuch memory the
105tests will limit themselves to (but they may go slightly over.) The number
106shouldn't be more memory than the machine has (including swap memory). You
107should also keep in mind that swap memory is generally much, much slower
108than RAM, and setting memlimit to all available RAM or higher will heavily
109tax the machine. On the other hand, it is no use running these tests with a
110limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
111to use more than memlimit memory will be skipped. The big-memory tests
112generally run very, very long.
113
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000114-u is used to specify which special resource intensive tests to run,
115such as those requiring large file support or network connectivity.
116The argument is a comma-separated list of words indicating the
117resources to test. Currently only the following are defined:
Barry Warsaw08fca522001-08-20 22:33:46 +0000118
Fred Drake3a15dac2002-04-11 16:39:16 +0000119 all - Enable all special resources.
120
Guido van Rossum315aa362003-03-11 14:46:48 +0000121 audio - Tests that use the audio device. (There are known
122 cases of broken audio drivers that can crash Python or
123 even the Linux kernel.)
124
Andrew M. Kuchling2158df02001-10-22 15:26:09 +0000125 curses - Tests that use curses and will modify the terminal's
126 state and output modes.
Tim Peters1633a2e2001-10-30 05:56:40 +0000127
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000128 largefile - It is okay to run some test that may create huge
129 files. These tests can take a long time and may
130 consume >2GB of disk space temporarily.
Barry Warsaw08fca522001-08-20 22:33:46 +0000131
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000132 network - It is okay to run tests that use external network
133 resource, e.g. testing SSL support for sockets.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +0000134
135 bsddb - It is okay to run the bsddb testsuite, which takes
136 a long time to complete.
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000137
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000138 decimal - Test the decimal module against a large suite that
139 verifies compliance with standards.
140
Antoine Pitroud989f822010-10-14 15:43:25 +0000141 cpu - Used for certain CPU-heavy tests.
Jeremy Hylton4336eda2004-08-07 19:25:33 +0000142
Tim Peterseba28be2005-03-28 01:08:02 +0000143 subprocess Run all tests for the subprocess module.
Peter Astrandf7f1bb72005-03-03 20:47:37 +0000144
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000145 urlfetch - It is okay to download files required on testing.
146
Guilherme Polob1a98de2009-01-28 20:03:26 +0000147 gui - Run tests that require a running GUI.
148
Collin Winterf8089c72009-04-09 16:46:46 +0000149 xpickle - Test pickle and cPickle against Python 2.4, 2.5 and 2.6 to
150 test backwards compatibility. These tests take a long time
151 to run.
152
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000153To enable all resources except one, use '-uall,-<resource>'. For
154example, to run all the tests except for the bsddb tests, give the
155option '-uall,-bsddb'.
Guido van Rossum152494a1996-12-20 03:12:20 +0000156"""
157
Michael Foord91a2c892010-04-08 00:04:24 +0000158import StringIO
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000159import getopt
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000160import json
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000161import os
162import random
163import re
Serhiy Storchakabb801312013-02-10 12:01:31 +0200164import shutil
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000165import sys
166import time
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000167import traceback
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000168import warnings
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000169import unittest
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000170import tempfile
Ezio Melottidde5b942010-02-03 05:37:26 +0000171import imp
Florent Xiclunab7c20022010-03-06 09:11:55 +0000172import platform
Florent Xicluna0932dc52010-03-06 08:07:44 +0000173import sysconfig
Guido van Rossumdc15c272002-08-12 21:55:51 +0000174
Guido van Rossum152494a1996-12-20 03:12:20 +0000175
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000176# Some times __path__ and __file__ are not absolute (e.g. while running from
177# Lib/) and, if we change the CWD to run the tests in a temporary dir, some
178# imports might fail. This affects only the modules imported before os.chdir().
179# These modules are searched first in sys.path[0] (so '' -- the CWD) and if
180# they are found in the CWD their __file__ and __path__ will be relative (this
181# happens before the chdir). All the modules imported after the chdir, are
182# not found in the CWD, and since the other paths in sys.path[1:] are absolute
183# (site.py absolutize them), the __file__ and __path__ will be absolute too.
184# Therefore it is necessary to absolutize manually the __file__ and __path__ of
185# the packages to prevent later imports to fail when the CWD is different.
186for module in sys.modules.itervalues():
187 if hasattr(module, '__path__'):
188 module.__path__ = [os.path.abspath(path) for path in module.__path__]
189 if hasattr(module, '__file__'):
190 module.__file__ = os.path.abspath(module.__file__)
191
192
Guido van Rossumbb484652002-12-02 09:56:21 +0000193# MacOSX (a.k.a. Darwin) has a default stack size that is too small
194# for deeply recursive regular expressions. We see this as crashes in
195# the Python test suite when running test_re.py and test_sre.py. The
196# fix is to set the stack limit to 2048.
197# This approach may also be useful for other Unixy platforms that
198# suffer from small default stack limits.
199if sys.platform == 'darwin':
200 try:
201 import resource
202 except ImportError:
203 pass
204 else:
205 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
206 newsoft = min(hard, max(soft, 1024*2048))
207 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
208
Zachary Ware47343722015-07-16 00:24:48 -0500209# Windows, Tkinter, and resetting the environment after each test don't
210# mix well. To alleviate test failures due to Tcl/Tk not being able to
211# find its library, get the necessary environment massage done once early.
212if sys.platform == 'win32':
213 try:
214 import FixTk
215 except Exception:
216 pass
217
Georg Brandl4045e882009-10-29 20:53:00 +0000218# Test result constants.
219PASSED = 1
220FAILED = 0
221ENV_CHANGED = -1
222SKIPPED = -2
223RESOURCE_DENIED = -3
224INTERRUPTED = -4
Victor Stinnerc991eb22017-05-03 17:28:28 +0200225CHILD_ERROR = -5 # error in a child process
Georg Brandl4045e882009-10-29 20:53:00 +0000226
Barry Warsaw04f357c2002-07-23 19:04:11 +0000227from test import test_support
Fred Drake3a15dac2002-04-11 16:39:16 +0000228
Benjamin Petersone2886fd2008-07-18 14:26:35 +0000229RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb',
Antoine Pitroud989f822010-10-14 15:43:25 +0000230 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui',
Collin Winterf8089c72009-04-09 16:46:46 +0000231 'xpickle')
Fred Drake3a15dac2002-04-11 16:39:16 +0000232
Florent Xicluna12735662010-04-23 18:10:12 +0000233TEMPDIR = os.path.abspath(tempfile.gettempdir())
234
Fred Drake3a15dac2002-04-11 16:39:16 +0000235
Barry Warsaw08fca522001-08-20 22:33:46 +0000236def usage(code, msg=''):
237 print __doc__
238 if msg: print msg
239 sys.exit(code)
240
241
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000242def main(tests=None, testdir=None, verbose=0, quiet=False,
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000243 exclude=False, single=False, randomize=False, fromfile=None,
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000244 findleaks=False, use_resources=None, trace=False, coverdir='coverage',
Collin Wintera199f012009-03-29 03:44:19 +0000245 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000246 random_seed=None, use_mp=None, verbose3=False, forever=False,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300247 header=False, pgo=False, failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000248 """Execute a test suite.
249
Thomas Wouters7e474022000-07-16 12:04:32 +0000250 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +0000251 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000252
253 tests -- a list of strings containing test names (optional)
254 testdir -- the directory in which to look for tests (optional)
255
256 Users other than the Python test suite will certainly want to
257 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +0000258 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000259
260 If the tests argument is omitted, the tests listed on the
261 command-line will be used. If that's empty, too, then all *.py
262 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +0000263
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000264 The other default arguments (verbose, quiet, exclude,
Florent Xicluna12d750d2010-03-06 14:38:09 +0000265 single, randomize, findleaks, use_resources, trace, coverdir,
266 print_slow, and random_seed) allow programmers calling main()
267 directly to set the values that would normally be set by flags
268 on the command line.
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000269 """
Fred Drake004d5e62000-10-23 17:22:08 +0000270
Tim Peters8dee8092001-09-25 20:05:11 +0000271 test_support.record_original_stdout(sys.stdout)
Guido van Rossum152494a1996-12-20 03:12:20 +0000272 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300273 opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:j:PGm:',
Georg Brandl71a015a2009-10-27 20:52:02 +0000274 ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
Chris Jerdonek3684c792012-12-27 18:14:01 -0800275 'exclude', 'single', 'slow', 'randomize', 'fromfile=', 'findleaks',
Georg Brandl71a015a2009-10-27 20:52:02 +0000276 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
277 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300278 'multiprocess=', 'slaveargs=', 'forever', 'header', 'pgo',
279 'failfast', 'match='])
Guido van Rossum152494a1996-12-20 03:12:20 +0000280 except getopt.error, msg:
Barry Warsaw08fca522001-08-20 22:33:46 +0000281 usage(2, msg)
282
283 # Defaults
Collin Wintera199f012009-03-29 03:44:19 +0000284 if random_seed is None:
285 random_seed = random.randrange(10000000)
Barry Warsaw08fca522001-08-20 22:33:46 +0000286 if use_resources is None:
287 use_resources = []
Guido van Rossum152494a1996-12-20 03:12:20 +0000288 for o, a in opts:
Barry Warsaw08fca522001-08-20 22:33:46 +0000289 if o in ('-h', '--help'):
290 usage(0)
291 elif o in ('-v', '--verbose'):
292 verbose += 1
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000293 elif o in ('-w', '--verbose2'):
294 verbose2 = True
Georg Brandl71a015a2009-10-27 20:52:02 +0000295 elif o in ('-W', '--verbose3'):
296 verbose3 = True
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300297 elif o in ('-G', '--failfast'):
298 failfast = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000299 elif o in ('-q', '--quiet'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000300 quiet = True;
Barry Warsaw08fca522001-08-20 22:33:46 +0000301 verbose = 0
Barry Warsaw08fca522001-08-20 22:33:46 +0000302 elif o in ('-x', '--exclude'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000303 exclude = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000304 elif o in ('-s', '--single'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000305 single = True
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000306 elif o in ('-S', '--slow'):
307 print_slow = True
Barry Warsaw08fca522001-08-20 22:33:46 +0000308 elif o in ('-r', '--randomize'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000309 randomize = True
Collin Wintera199f012009-03-29 03:44:19 +0000310 elif o == '--randseed':
311 random_seed = int(a)
Tim Petersc5000df2002-06-02 21:42:01 +0000312 elif o in ('-f', '--fromfile'):
313 fromfile = a
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300314 elif o in ('-m', '--match'):
315 match_tests = a
Barry Warsaw08fca522001-08-20 22:33:46 +0000316 elif o in ('-l', '--findleaks'):
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000317 findleaks = True
Skip Montanaro0179a182004-06-06 15:53:18 +0000318 elif o in ('-L', '--runleaks'):
319 runleaks = True
Guido van Rossum9e9d4f82002-06-07 15:17:03 +0000320 elif o in ('-t', '--threshold'):
321 import gc
322 gc.set_threshold(int(a))
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000323 elif o in ('-T', '--coverage'):
324 trace = True
Walter Dörwaldaee4da62004-11-12 18:51:27 +0000325 elif o in ('-D', '--coverdir'):
326 coverdir = os.path.join(os.getcwd(), a)
327 elif o in ('-N', '--nocoverdir'):
328 coverdir = None
Michael W. Hudson61147f62004-08-03 11:33:28 +0000329 elif o in ('-R', '--huntrleaks'):
330 huntrleaks = a.split(':')
Florent Xicluna12d750d2010-03-06 14:38:09 +0000331 if len(huntrleaks) not in (2, 3):
Michael W. Hudson61147f62004-08-03 11:33:28 +0000332 print a, huntrleaks
Florent Xicluna12d750d2010-03-06 14:38:09 +0000333 usage(2, '-R takes 2 or 3 colon-separated arguments')
334 if not huntrleaks[0]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000335 huntrleaks[0] = 5
336 else:
337 huntrleaks[0] = int(huntrleaks[0])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000338 if not huntrleaks[1]:
Michael W. Hudson61147f62004-08-03 11:33:28 +0000339 huntrleaks[1] = 4
340 else:
341 huntrleaks[1] = int(huntrleaks[1])
Florent Xicluna12d750d2010-03-06 14:38:09 +0000342 if len(huntrleaks) == 2 or not huntrleaks[2]:
343 huntrleaks[2:] = ["reflog.txt"]
Thomas Woutersabd08882006-04-26 15:53:30 +0000344 elif o in ('-M', '--memlimit'):
345 test_support.set_memlimit(a)
Barry Warsaw08fca522001-08-20 22:33:46 +0000346 elif o in ('-u', '--use'):
Guido van Rossumfe3f6962001-09-06 16:09:41 +0000347 u = [x.lower() for x in a.split(',')]
348 for r in u:
Fred Drake3a15dac2002-04-11 16:39:16 +0000349 if r == 'all':
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000350 use_resources[:] = RESOURCE_NAMES
351 continue
352 remove = False
353 if r[0] == '-':
354 remove = True
355 r = r[1:]
Fred Drake3a15dac2002-04-11 16:39:16 +0000356 if r not in RESOURCE_NAMES:
357 usage(1, 'Invalid -u/--use option: ' + a)
Fred Drake4dd0f7e2002-11-26 21:44:56 +0000358 if remove:
359 if r in use_resources:
360 use_resources.remove(r)
361 elif r not in use_resources:
Andrew MacIntyree41abab2002-04-30 12:11:04 +0000362 use_resources.append(r)
R. David Murray7f7eea62009-11-14 15:18:22 +0000363 elif o in ('-F', '--forever'):
364 forever = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000365 elif o in ('-j', '--multiprocess'):
366 use_mp = int(a)
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000367 elif o == '--header':
368 header = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000369 elif o == '--slaveargs':
370 args, kwargs = json.loads(a)
371 try:
372 result = runtest(*args, **kwargs)
373 except BaseException, e:
Georg Brandl4045e882009-10-29 20:53:00 +0000374 result = INTERRUPTED, e.__class__.__name__
Antoine Pitrou4698d992009-05-31 14:20:14 +0000375 print # Force a newline (just in case)
376 print json.dumps(result)
377 sys.exit(0)
Brett Cannon95374782015-10-02 16:21:34 -0700378 elif o in ('-P', '--pgo'):
Brett Cannon65918e02015-10-02 16:22:32 -0700379 pgo = True
R. David Murrayda826892009-11-15 00:04:32 +0000380 else:
381 print >>sys.stderr, ("No handler for option {}. Please "
382 "report this as a bug at http://bugs.python.org.").format(o)
383 sys.exit(1)
Tim Petersc5000df2002-06-02 21:42:01 +0000384 if single and fromfile:
385 usage(2, "-s and -f don't go together!")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000386 if use_mp and trace:
387 usage(2, "-T and -j don't go together!")
388 if use_mp and findleaks:
389 usage(2, "-l and -j don't go together!")
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300390 if failfast and not (verbose or verbose3):
391 usage("-G/--failfast needs either -v or -W")
Barry Warsaw08fca522001-08-20 22:33:46 +0000392
Guido van Rossum152494a1996-12-20 03:12:20 +0000393 good = []
394 bad = []
395 skipped = []
Fred Drake9a0db072003-02-03 15:19:30 +0000396 resource_denieds = []
R. David Murray14dcd432009-10-14 13:58:07 +0000397 environment_changed = []
Florent Xicluna75c66762010-03-30 16:31:14 +0000398 interrupted = False
Barry Warsawe11e3de1999-01-28 19:51:51 +0000399
Neil Schemenauerd569f232000-09-22 15:29:28 +0000400 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +0000401 try:
402 import gc
403 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000404 print 'No GC available, disabling findleaks.'
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000405 findleaks = False
Barry Warsawa873b032000-08-03 15:50:37 +0000406 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000407 # Uncomment the line below to report garbage that is not
408 # freeable by reference counting alone. By default only
409 # garbage that is not collectable by the GC is reported.
410 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000411 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000412
Barry Warsawe11e3de1999-01-28 19:51:51 +0000413 if single:
Florent Xicluna12735662010-04-23 18:10:12 +0000414 filename = os.path.join(TEMPDIR, 'pynexttest')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000415 try:
416 fp = open(filename, 'r')
R. David Murray7f7eea62009-11-14 15:18:22 +0000417 next_test = fp.read().strip()
418 tests = [next_test]
Barry Warsawe11e3de1999-01-28 19:51:51 +0000419 fp.close()
420 except IOError:
421 pass
Tim Petersc5000df2002-06-02 21:42:01 +0000422
423 if fromfile:
424 tests = []
Ezio Melotti8f6a2872010-02-10 21:40:33 +0000425 fp = open(os.path.join(test_support.SAVEDCWD, fromfile))
Tim Petersc5000df2002-06-02 21:42:01 +0000426 for line in fp:
427 guts = line.split() # assuming no test has whitespace in its name
428 if guts and not guts[0].startswith('#'):
429 tests.extend(guts)
430 fp.close()
431
432 # Strip .py extensions.
Florent Xicluna0932dc52010-03-06 08:07:44 +0000433 removepy(args)
434 removepy(tests)
Tim Petersc5000df2002-06-02 21:42:01 +0000435
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000436 stdtests = STDTESTS[:]
Florent Xicluna12d750d2010-03-06 14:38:09 +0000437 nottests = NOTTESTS.copy()
Guido van Rossum152494a1996-12-20 03:12:20 +0000438 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000439 for arg in args:
440 if arg in stdtests:
441 stdtests.remove(arg)
Florent Xicluna12d750d2010-03-06 14:38:09 +0000442 nottests.add(arg)
Guido van Rossum41360a41998-03-26 19:42:58 +0000443 args = []
Florent Xicluna58526412010-03-06 17:24:36 +0000444
445 # For a partial run, we do not need to clutter the output.
Antoine Pitrou8c688be2011-01-03 20:49:01 +0000446 if verbose or header or not (quiet or single or tests or args):
Brett Cannon95374782015-10-02 16:21:34 -0700447 if not pgo:
448 # Print basic platform information
449 print "==", platform.python_implementation(), \
450 " ".join(sys.version.split())
451 print "== ", platform.platform(aliased=True), \
452 "%s-endian" % sys.byteorder
453 print "== ", os.getcwd()
454 print "Testing with flags:", sys.flags
Florent Xicluna58526412010-03-06 17:24:36 +0000455
R. David Murray98e3df32009-12-16 11:49:46 +0000456 alltests = findtests(testdir, stdtests, nottests)
Florent Xicluna75c66762010-03-30 16:31:14 +0000457 selected = tests or args or alltests
Barry Warsawe11e3de1999-01-28 19:51:51 +0000458 if single:
Florent Xicluna75c66762010-03-30 16:31:14 +0000459 selected = selected[:1]
R. David Murray98e3df32009-12-16 11:49:46 +0000460 try:
Florent Xicluna75c66762010-03-30 16:31:14 +0000461 next_single_test = alltests[alltests.index(selected[0])+1]
R. David Murray98e3df32009-12-16 11:49:46 +0000462 except IndexError:
463 next_single_test = None
Skip Montanaroab1c7912000-06-30 16:39:27 +0000464 if randomize:
Collin Wintera199f012009-03-29 03:44:19 +0000465 random.seed(random_seed)
466 print "Using random seed", random_seed
Florent Xicluna75c66762010-03-30 16:31:14 +0000467 random.shuffle(selected)
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000468 if trace:
469 import trace
470 tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
471 trace=False, count=True)
R. David Murray7f7eea62009-11-14 15:18:22 +0000472
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000473 test_times = []
Barry Warsaw08fca522001-08-20 22:33:46 +0000474 test_support.use_resources = use_resources
Benjamin Peterson3c459de2015-12-05 20:52:43 -0800475 save_modules = set(sys.modules)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000476
477 def accumulate_result(test, result):
478 ok, test_time = result
Victor Stinnerc991eb22017-05-03 17:28:28 +0200479 if ok not in (CHILD_ERROR, INTERRUPTED):
480 test_times.append((test_time, test))
Georg Brandl4045e882009-10-29 20:53:00 +0000481 if ok == PASSED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000482 good.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000483 elif ok == FAILED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000484 bad.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000485 elif ok == ENV_CHANGED:
Georg Brandl4045e882009-10-29 20:53:00 +0000486 environment_changed.append(test)
487 elif ok == SKIPPED:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000488 skipped.append(test)
Georg Brandl4045e882009-10-29 20:53:00 +0000489 elif ok == RESOURCE_DENIED:
490 skipped.append(test)
491 resource_denieds.append(test)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200492 else:
493 # CHILD_ERROR
494 bad.append(test)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000495
R. David Murray7f7eea62009-11-14 15:18:22 +0000496 if forever:
Florent Xicluna75c66762010-03-30 16:31:14 +0000497 def test_forever(tests=list(selected)):
R. David Murray7f7eea62009-11-14 15:18:22 +0000498 while True:
499 for test in tests:
500 yield test
501 if bad:
502 return
503 tests = test_forever()
Victor Stinner32b1ff92014-09-05 12:12:11 +0200504 test_count = ''
505 test_count_width = 3
R. David Murray7f7eea62009-11-14 15:18:22 +0000506 else:
Florent Xicluna75c66762010-03-30 16:31:14 +0000507 tests = iter(selected)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200508 test_count = '/{}'.format(len(selected))
509 test_count_width = len(test_count) - 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000510
Antoine Pitrou4698d992009-05-31 14:20:14 +0000511 if use_mp:
Victor Stinner1b4a69d2010-04-27 21:47:01 +0000512 try:
513 from threading import Thread
514 except ImportError:
515 print "Multiprocess option requires thread support"
516 sys.exit(2)
Georg Brandla4f46e12010-02-07 17:03:15 +0000517 from Queue import Queue
518 from subprocess import Popen, PIPE
Antoine Pitrou4698d992009-05-31 14:20:14 +0000519 debug_output_pat = re.compile(r"\[\d+ refs\]$")
Antoine Pitrou4698d992009-05-31 14:20:14 +0000520 output = Queue()
R. David Murray7f7eea62009-11-14 15:18:22 +0000521 def tests_and_args():
522 for test in tests:
523 args_tuple = (
R. David Murray561b96f2011-02-11 17:25:54 +0000524 (test, verbose, quiet),
Brett Cannoneb2cb972015-10-16 12:30:20 -0700525 dict(huntrleaks=huntrleaks, use_resources=use_resources,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300526 failfast=failfast,
527 match_tests=match_tests,
Brett Cannoneb2cb972015-10-16 12:30:20 -0700528 pgo=pgo)
R. David Murray7f7eea62009-11-14 15:18:22 +0000529 )
530 yield (test, args_tuple)
531 pending = tests_and_args()
Antoine Pitroua226c912010-10-14 11:15:50 +0000532 opt_args = test_support.args_from_interpreter_flags()
533 base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
Brett Cannon95374782015-10-02 16:21:34 -0700534 # required to spawn a new process with PGO flag on/off
535 if pgo:
536 base_cmd = base_cmd + ['--pgo']
Antoine Pitrou4698d992009-05-31 14:20:14 +0000537 def work():
538 # A worker thread.
Neal Norwitz14ca3272006-02-28 18:05:43 +0000539 try:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000540 while True:
541 try:
R. David Murray7f7eea62009-11-14 15:18:22 +0000542 test, args_tuple = next(pending)
543 except StopIteration:
R. David Murray282396f2009-10-18 21:12:37 +0000544 output.put((None, None, None, None))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000545 return
Antoine Pitrou79c3bd82009-06-29 14:14:56 +0000546 # -E is needed by some tests, e.g. test_import
Antoine Pitroua226c912010-10-14 11:15:50 +0000547 popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
R. David Murray282396f2009-10-18 21:12:37 +0000548 stdout=PIPE, stderr=PIPE,
Antoine Pitrou0dd8e1d2010-08-18 20:45:10 +0000549 universal_newlines=True,
550 close_fds=(os.name != 'nt'))
R. David Murray282396f2009-10-18 21:12:37 +0000551 stdout, stderr = popen.communicate()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200552 retcode = popen.wait()
553
R. David Murray282396f2009-10-18 21:12:37 +0000554 # Strip last refcount output line if it exists, since it
555 # comes from the shutdown of the interpreter in the subcommand.
556 stderr = debug_output_pat.sub("", stderr)
Victor Stinnerc991eb22017-05-03 17:28:28 +0200557
558 if retcode != 0:
559 result = (CHILD_ERROR, "Exit code %s" % retcode)
560 output.put((test, stdout.rstrip(), stderr.rstrip(),
561 result))
562
R. David Murray282396f2009-10-18 21:12:37 +0000563 stdout, _, result = stdout.strip().rpartition("\n")
R. David Murray7f7eea62009-11-14 15:18:22 +0000564 if not result:
565 output.put((None, None, None, None))
566 return
Antoine Pitrou4698d992009-05-31 14:20:14 +0000567 result = json.loads(result)
R. David Murray282396f2009-10-18 21:12:37 +0000568 output.put((test, stdout.rstrip(), stderr.rstrip(), result))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000569 except BaseException:
R. David Murray282396f2009-10-18 21:12:37 +0000570 output.put((None, None, None, None))
Neal Norwitz14ca3272006-02-28 18:05:43 +0000571 raise
Victor Stinnerc991eb22017-05-03 17:28:28 +0200572
Antoine Pitrou4698d992009-05-31 14:20:14 +0000573 workers = [Thread(target=work) for i in range(use_mp)]
574 for worker in workers:
575 worker.start()
Victor Stinnerc991eb22017-05-03 17:28:28 +0200576
Antoine Pitrou4698d992009-05-31 14:20:14 +0000577 finished = 0
Victor Stinner32b1ff92014-09-05 12:12:11 +0200578 test_index = 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000579 try:
580 while finished < use_mp:
581 test, stdout, stderr, result = output.get()
582 if test is None:
583 finished += 1
584 continue
R. David Murray7f7eea62009-11-14 15:18:22 +0000585 accumulate_result(test, result)
Victor Stinner32b1ff92014-09-05 12:12:11 +0200586 if not quiet:
587 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
588 print(fmt.format(
589 test_count_width, test_index, test_count,
590 len(bad), test))
Victor Stinnerc991eb22017-05-03 17:28:28 +0200591
592 if stdout:
593 print stdout
594 sys.stdout.flush()
595 if stderr and not pgo:
596 print >>sys.stderr, stderr
597 sys.stderr.flush()
598
599 if result[0] == INTERRUPTED:
600 assert result[1] == 'KeyboardInterrupt'
601 raise KeyboardInterrupt # What else?
602
Victor Stinner32b1ff92014-09-05 12:12:11 +0200603 test_index += 1
R. David Murray7f7eea62009-11-14 15:18:22 +0000604 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000605 interrupted = True
R. David Murray7f7eea62009-11-14 15:18:22 +0000606 pending.close()
Antoine Pitrou4698d992009-05-31 14:20:14 +0000607 for worker in workers:
608 worker.join()
609 else:
Brett Cannon65918e02015-10-02 16:22:32 -0700610 for test_index, test in enumerate(tests, 1):
Antoine Pitrou4698d992009-05-31 14:20:14 +0000611 if not quiet:
Victor Stinner32b1ff92014-09-05 12:12:11 +0200612 fmt = "[{1:{0}}{2}/{3}] {4}" if bad else "[{1:{0}}{2}] {4}"
613 print(fmt.format(
614 test_count_width, test_index, test_count, len(bad), test))
Antoine Pitrou4698d992009-05-31 14:20:14 +0000615 sys.stdout.flush()
616 if trace:
617 # If we're tracing code coverage, then we don't exit with status
618 # if on a false return value from main.
R. David Murray561b96f2011-02-11 17:25:54 +0000619 tracer.runctx('runtest(test, verbose, quiet)',
Antoine Pitrou4698d992009-05-31 14:20:14 +0000620 globals=globals(), locals=vars())
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000621 else:
Antoine Pitrou4698d992009-05-31 14:20:14 +0000622 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300623 result = runtest(test, verbose, quiet, huntrleaks, None, pgo,
624 failfast=failfast,
625 match_tests=match_tests)
Georg Brandl4045e882009-10-29 20:53:00 +0000626 accumulate_result(test, result)
627 if verbose3 and result[0] == FAILED:
Brett Cannon95374782015-10-02 16:21:34 -0700628 if not pgo:
629 print "Re-running test %r in verbose mode" % test
630 runtest(test, True, quiet, huntrleaks, None, pgo)
Antoine Pitrou4698d992009-05-31 14:20:14 +0000631 except KeyboardInterrupt:
Florent Xicluna75c66762010-03-30 16:31:14 +0000632 interrupted = True
Antoine Pitrou4698d992009-05-31 14:20:14 +0000633 break
634 except:
635 raise
636 if findleaks:
637 gc.collect()
638 if gc.garbage:
639 print "Warning: test created", len(gc.garbage),
640 print "uncollectable object(s)."
641 # move the uncollectable objects somewhere so we don't see
642 # them again
643 found_garbage.extend(gc.garbage)
644 del gc.garbage[:]
645 # Unload the newly imported modules (best effort finalization)
646 for module in sys.modules.keys():
647 if module not in save_modules and module.startswith("test."):
648 test_support.unload(module)
Jeremy Hylton7a1ea0e2001-10-17 13:45:28 +0000649
Brett Cannon95374782015-10-02 16:21:34 -0700650 if interrupted and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000651 # print a newline after ^C
652 print
653 print "Test suite interrupted by signal SIGINT."
654 omitted = set(selected) - set(good) - set(bad) - set(skipped)
655 print count(len(omitted), "test"), "omitted:"
656 printlist(omitted)
Brett Cannon95374782015-10-02 16:21:34 -0700657 if good and not quiet and not pgo:
Florent Xicluna75c66762010-03-30 16:31:14 +0000658 if not bad and not skipped and not interrupted and len(good) > 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000659 print "All",
660 print count(len(good), "test"), "OK."
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000661 if print_slow:
662 test_times.sort(reverse=True)
663 print "10 slowest tests:"
664 for time, test in test_times[:10]:
665 print "%s: %.1fs" % (test, time)
Brett Cannon95374782015-10-02 16:21:34 -0700666 if bad and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500667 print count(len(bad), "test"), "failed:"
668 printlist(bad)
Brett Cannon95374782015-10-02 16:21:34 -0700669 if environment_changed and not pgo:
Zachary Warece698f32015-08-08 22:01:20 -0500670 print "{} altered the execution environment:".format(
671 count(len(environment_changed), "test"))
672 printlist(environment_changed)
Brett Cannon95374782015-10-02 16:21:34 -0700673 if skipped and not quiet and not pgo:
Tim Petersa45da922001-08-12 03:45:50 +0000674 print count(len(skipped), "test"), "skipped:"
675 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000676
Tim Petersb5b7b782001-08-12 01:20:39 +0000677 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000678 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000679 if e.isvalid():
Raymond Hettingera690a992003-11-16 16:17:49 +0000680 surprise = set(skipped) - e.getexpected() - set(resource_denieds)
Tim Petersb5b7b782001-08-12 01:20:39 +0000681 if surprise:
682 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000683 "unexpected on", plat + ":"
684 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000685 else:
686 print "Those skips are all expected on", plat + "."
687 else:
688 print "Ask someone to teach regrtest.py about which tests are"
689 print "expected to get skipped on", plat + "."
690
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000691 if verbose2 and bad:
692 print "Re-running failed tests in verbose mode"
Zachary Warea4777f12015-08-04 21:53:21 -0500693 for test in bad[:]:
Tim Peters922dd7d2006-03-10 23:37:10 +0000694 print "Re-running test %r in verbose mode" % test
695 sys.stdout.flush()
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000696 try:
Neal Norwitz5fe5cf62008-03-18 17:58:02 +0000697 test_support.verbose = True
Brett Cannon95374782015-10-02 16:21:34 -0700698 ok = runtest(test, True, quiet, huntrleaks, None, pgo)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000699 except KeyboardInterrupt:
700 # print a newline separate from the ^C
701 print
702 break
Zachary Warea4777f12015-08-04 21:53:21 -0500703 else:
704 if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
705 bad.remove(test)
706 else:
707 if bad:
708 print count(len(bad), "test"), "failed again:"
709 printlist(bad)
Martin v. Löwis04824ce2006-03-10 21:26:16 +0000710
Barry Warsawe11e3de1999-01-28 19:51:51 +0000711 if single:
R. David Murray98e3df32009-12-16 11:49:46 +0000712 if next_single_test:
713 with open(filename, 'w') as fp:
714 fp.write(next_single_test + '\n')
Barry Warsawe11e3de1999-01-28 19:51:51 +0000715 else:
716 os.unlink(filename)
717
Barry Warsaw3b6d0252004-02-07 22:43:03 +0000718 if trace:
719 r = tracer.results()
720 r.write_results(show_missing=True, summary=True, coverdir=coverdir)
721
Skip Montanaro0179a182004-06-06 15:53:18 +0000722 if runleaks:
723 os.system("leaks %d" % os.getpid())
724
Florent Xicluna75c66762010-03-30 16:31:14 +0000725 sys.exit(len(bad) > 0 or interrupted)
Barry Warsaw08fca522001-08-20 22:33:46 +0000726
Guido van Rossum152494a1996-12-20 03:12:20 +0000727
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000728STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000729 'test_grammar',
730 'test_opcodes',
Collin Winterf567ca32007-03-12 15:57:19 +0000731 'test_dict',
Guido van Rossum152494a1996-12-20 03:12:20 +0000732 'test_builtin',
733 'test_exceptions',
734 'test_types',
Collin Winter55453142007-03-08 19:58:14 +0000735 'test_unittest',
736 'test_doctest',
737 'test_doctest2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000738]
Guido van Rossum152494a1996-12-20 03:12:20 +0000739
Florent Xicluna12d750d2010-03-06 14:38:09 +0000740NOTTESTS = {
Guido van Rossum152494a1996-12-20 03:12:20 +0000741 'test_support',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000742 'test_future1',
743 'test_future2',
Florent Xicluna12d750d2010-03-06 14:38:09 +0000744}
Guido van Rossum152494a1996-12-20 03:12:20 +0000745
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000746def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000747 """Return a list of all applicable test modules."""
Florent Xicluna0932dc52010-03-06 08:07:44 +0000748 testdir = findtestdir(testdir)
Guido van Rossum152494a1996-12-20 03:12:20 +0000749 names = os.listdir(testdir)
750 tests = []
Florent Xicluna12d750d2010-03-06 14:38:09 +0000751 others = set(stdtests) | nottests
Guido van Rossum152494a1996-12-20 03:12:20 +0000752 for name in names:
Florent Xicluna0932dc52010-03-06 08:07:44 +0000753 modname, ext = os.path.splitext(name)
754 if modname[:5] == "test_" and ext == ".py" and modname not in others:
755 tests.append(modname)
756 return stdtests + sorted(tests)
Guido van Rossum152494a1996-12-20 03:12:20 +0000757
Antoine Pitrou4698d992009-05-31 14:20:14 +0000758def runtest(test, verbose, quiet,
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300759 huntrleaks=False, use_resources=None, pgo=False,
760 failfast=False, match_tests=None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000761 """Run a single test.
Tim Peterse5584862006-06-09 19:24:44 +0000762
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000763 test -- the name of the test
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000764 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000765 quiet -- if true, don't print 'skipped' messages (probably redundant)
Jeffrey Yasskin36dbcb92008-03-18 05:45:40 +0000766 test_times -- a list of (time, test_name) pairs
Tim Peterse5584862006-06-09 19:24:44 +0000767 huntrleaks -- run multiple times to test for leaks; requires a debug
768 build; a triple corresponding to -R's three arguments
Brett Cannon65918e02015-10-02 16:22:32 -0700769 pgo -- if true, do not print unnecessary info when running the test
Brett Cannon95374782015-10-02 16:21:34 -0700770 for Profile Guided Optimization build
Brett Cannon65918e02015-10-02 16:22:32 -0700771
Georg Brandl4045e882009-10-29 20:53:00 +0000772 Returns one of the test result constants:
Victor Stinnerc991eb22017-05-03 17:28:28 +0200773 CHILD_ERROR Child process crashed
Georg Brandl4045e882009-10-29 20:53:00 +0000774 INTERRUPTED KeyboardInterrupt when run under -j
775 RESOURCE_DENIED test skipped because resource denied
776 SKIPPED test skipped for some other reason
777 ENV_CHANGED test failed because it changed the execution environment
778 FAILED test failed
779 PASSED test passed
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000780 """
Tim Peters06c5c002006-06-05 00:55:26 +0000781
Antoine Pitrou4698d992009-05-31 14:20:14 +0000782 test_support.verbose = verbose # Tell tests to be moderately quiet
783 if use_resources is not None:
784 test_support.use_resources = use_resources
Tim Peterse5584862006-06-09 19:24:44 +0000785 try:
Serhiy Storchaka74f0db82017-05-04 00:23:50 +0300786 test_support.match_tests = match_tests
787 if failfast:
788 test_support.failfast = True
Brett Cannon95374782015-10-02 16:21:34 -0700789 return runtest_inner(test, verbose, quiet, huntrleaks, pgo)
Tim Peterse5584862006-06-09 19:24:44 +0000790 finally:
791 cleanup_test_droppings(test, verbose)
792
R. David Murray14dcd432009-10-14 13:58:07 +0000793
794# Unit tests are supposed to leave the execution environment unchanged
795# once they complete. But sometimes tests have bugs, especially when
796# tests fail, and the changes to environment go on to mess up other
797# tests. This can cause issues with buildbot stability, since tests
798# are run in random order and so problems may appear to come and go.
799# There are a few things we can save and restore to mitigate this, and
800# the following context manager handles this task.
801
802class saved_test_environment:
803 """Save bits of the test environment and restore them at block exit.
804
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000805 with saved_test_environment(testname, verbose, quiet):
R. David Murray14dcd432009-10-14 13:58:07 +0000806 #stuff
807
808 Unless quiet is True, a warning is printed to stderr if any of
809 the saved items was changed by the test. The attribute 'changed'
810 is initially False, but is set to True if a change is detected.
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000811
812 If verbose is more than 1, the before and after state of changed
813 items is also printed.
R. David Murray14dcd432009-10-14 13:58:07 +0000814 """
815
816 changed = False
817
Brett Cannon95374782015-10-02 16:21:34 -0700818 def __init__(self, testname, verbose=0, quiet=False, pgo=False):
R. David Murray14dcd432009-10-14 13:58:07 +0000819 self.testname = testname
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000820 self.verbose = verbose
R. David Murray14dcd432009-10-14 13:58:07 +0000821 self.quiet = quiet
Brett Cannon95374782015-10-02 16:21:34 -0700822 self.pgo = pgo
R. David Murray14dcd432009-10-14 13:58:07 +0000823
824 # To add things to save and restore, add a name XXX to the resources list
825 # and add corresponding get_XXX/restore_XXX functions. get_XXX should
826 # return the value to be saved and compared against a second call to the
827 # get function when test execution completes. restore_XXX should accept
828 # the saved value and restore the resource using it. It will be called if
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000829 # and only if a change in the value is detected.
830 #
831 # Note: XXX will have any '.' replaced with '_' characters when determining
832 # the corresponding method names.
R. David Murray14dcd432009-10-14 13:58:07 +0000833
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000834 resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
Vinay Sajipda563bf2012-03-06 20:07:15 +0000835 'os.environ', 'sys.path', 'asyncore.socket_map',
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300836 'files',
Vinay Sajipda563bf2012-03-06 20:07:15 +0000837 )
R. David Murray14dcd432009-10-14 13:58:07 +0000838
839 def get_sys_argv(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000840 return id(sys.argv), sys.argv, sys.argv[:]
R. David Murray14dcd432009-10-14 13:58:07 +0000841 def restore_sys_argv(self, saved_argv):
Nick Coghlan8157e192009-10-17 15:48:16 +0000842 sys.argv = saved_argv[1]
843 sys.argv[:] = saved_argv[2]
R. David Murray14dcd432009-10-14 13:58:07 +0000844
845 def get_cwd(self):
846 return os.getcwd()
847 def restore_cwd(self, saved_cwd):
848 os.chdir(saved_cwd)
849
850 def get_sys_stdout(self):
851 return sys.stdout
852 def restore_sys_stdout(self, saved_stdout):
853 sys.stdout = saved_stdout
854
855 def get_sys_stderr(self):
856 return sys.stderr
857 def restore_sys_stderr(self, saved_stderr):
858 sys.stderr = saved_stderr
859
860 def get_sys_stdin(self):
861 return sys.stdin
862 def restore_sys_stdin(self, saved_stdin):
863 sys.stdin = saved_stdin
864
865 def get_os_environ(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000866 return id(os.environ), os.environ, dict(os.environ)
R. David Murray14dcd432009-10-14 13:58:07 +0000867 def restore_os_environ(self, saved_environ):
Nick Coghlan8157e192009-10-17 15:48:16 +0000868 os.environ = saved_environ[1]
R. David Murray14dcd432009-10-14 13:58:07 +0000869 os.environ.clear()
Nick Coghlan8157e192009-10-17 15:48:16 +0000870 os.environ.update(saved_environ[2])
R. David Murray14dcd432009-10-14 13:58:07 +0000871
872 def get_sys_path(self):
Nick Coghlan8157e192009-10-17 15:48:16 +0000873 return id(sys.path), sys.path, sys.path[:]
R. David Murray14dcd432009-10-14 13:58:07 +0000874 def restore_sys_path(self, saved_path):
Nick Coghlan8157e192009-10-17 15:48:16 +0000875 sys.path = saved_path[1]
876 sys.path[:] = saved_path[2]
R. David Murray14dcd432009-10-14 13:58:07 +0000877
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000878 def get_asyncore_socket_map(self):
879 asyncore = sys.modules.get('asyncore')
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000880 # XXX Making a copy keeps objects alive until __exit__ gets called.
881 return asyncore and asyncore.socket_map.copy() or {}
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000882 def restore_asyncore_socket_map(self, saved_map):
883 asyncore = sys.modules.get('asyncore')
884 if asyncore is not None:
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000885 asyncore.close_all(ignore_all=True)
Antoine Pitrou1e8a7542010-08-16 00:32:47 +0000886 asyncore.socket_map.update(saved_map)
887
Vinay Sajipda563bf2012-03-06 20:07:15 +0000888 def get_test_support_TESTFN(self):
889 if os.path.isfile(test_support.TESTFN):
890 result = 'f'
891 elif os.path.isdir(test_support.TESTFN):
892 result = 'd'
893 else:
894 result = None
895 return result
896 def restore_test_support_TESTFN(self, saved_value):
897 if saved_value is None:
898 if os.path.isfile(test_support.TESTFN):
899 os.unlink(test_support.TESTFN)
900 elif os.path.isdir(test_support.TESTFN):
901 shutil.rmtree(test_support.TESTFN)
902
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300903 def get_files(self):
904 return sorted(fn + ('/' if os.path.isdir(fn) else '')
905 for fn in os.listdir(os.curdir))
906 def restore_files(self, saved_value):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200907 fn = test_support.TESTFN
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300908 if fn not in saved_value and (fn + '/') not in saved_value:
909 if os.path.isfile(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200910 test_support.unlink(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300911 elif os.path.isdir(fn):
Victor Stinnerac0d1892015-03-30 01:07:29 +0200912 test_support.rmtree(fn)
Serhiy Storchakac0a2f2b2015-03-30 01:27:44 +0300913
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000914 def resource_info(self):
915 for name in self.resources:
916 method_suffix = name.replace('.', '_')
917 get_name = 'get_' + method_suffix
918 restore_name = 'restore_' + method_suffix
919 yield name, getattr(self, get_name), getattr(self, restore_name)
920
R. David Murray14dcd432009-10-14 13:58:07 +0000921 def __enter__(self):
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000922 self.saved_values = dict((name, get()) for name, get, restore
923 in self.resource_info())
R. David Murray14dcd432009-10-14 13:58:07 +0000924 return self
925
926 def __exit__(self, exc_type, exc_val, exc_tb):
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000927 saved_values = self.saved_values
928 del self.saved_values
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000929 for name, get, restore in self.resource_info():
930 current = get()
Antoine Pitroua71bfc42010-10-31 13:17:46 +0000931 original = saved_values.pop(name)
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000932 # Check for changes to the resource's value
933 if current != original:
R. David Murray14dcd432009-10-14 13:58:07 +0000934 self.changed = True
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000935 restore(original)
Brett Cannon95374782015-10-02 16:21:34 -0700936 if not self.quiet and not self.pgo:
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000937 print >>sys.stderr, (
938 "Warning -- {} was modified by {}".format(
939 name, self.testname))
Victor Stinner0d493792017-05-03 03:47:44 +0200940 print >>sys.stderr, (
941 " Before: {}\n After: {} ".format(
942 original, current))
Nick Coghlan2ee358e2009-10-17 07:30:40 +0000943 # XXX (ncoghlan): for most resources (e.g. sys.path) identity
944 # matters at least as much as value. For others (e.g. cwd),
945 # identity is irrelevant. Should we add a mechanism to check
946 # for substitution in the cases where it matters?
R. David Murray14dcd432009-10-14 13:58:07 +0000947 return False
948
949
Brett Cannon95374782015-10-02 16:21:34 -0700950def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False):
Guido van Rossum152494a1996-12-20 03:12:20 +0000951 test_support.unload(test)
Tim Peters9390cc12001-09-28 20:14:46 +0000952 if verbose:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000953 capture_stdout = None
Guido van Rossum0fcca4e2001-09-21 20:31:52 +0000954 else:
Michael Foord91a2c892010-04-08 00:04:24 +0000955 capture_stdout = StringIO.StringIO()
Tim Peters06c5c002006-06-05 00:55:26 +0000956
Antoine Pitrou4698d992009-05-31 14:20:14 +0000957 test_time = 0.0
Collin Winter0f489742009-05-14 23:26:30 +0000958 refleak = False # True if the test leaked references.
Guido van Rossum152494a1996-12-20 03:12:20 +0000959 try:
Tim Peters342ca752001-09-25 19:13:20 +0000960 save_stdout = sys.stdout
Guido van Rossum41360a41998-03-26 19:42:58 +0000961 try:
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +0000962 if capture_stdout:
963 sys.stdout = capture_stdout
Barry Warsaw408b6d32002-07-30 23:27:12 +0000964 if test.startswith('test.'):
965 abstest = test
966 else:
967 # Always import it from the test package
968 abstest = 'test.' + test
Serhiy Storchakaac33bd72016-11-11 11:42:25 +0200969 clear_caches()
Brett Cannon95374782015-10-02 16:21:34 -0700970 with saved_test_environment(test, verbose, quiet, pgo) as environment:
R. David Murray14dcd432009-10-14 13:58:07 +0000971 start_time = time.time()
972 the_package = __import__(abstest, globals(), locals(), [])
973 the_module = getattr(the_package, test)
974 # Old tests run to completion simply as a side-effect of
975 # being imported. For tests based on unittest or doctest,
976 # explicitly invoke their test_main() function (if it exists).
977 indirect_test = getattr(the_module, "test_main", None)
978 if indirect_test is not None:
979 indirect_test()
980 if huntrleaks:
981 refleak = dash_R(the_module, test, indirect_test,
982 huntrleaks)
983 test_time = time.time() - start_time
Guido van Rossum41360a41998-03-26 19:42:58 +0000984 finally:
Tim Peters342ca752001-09-25 19:13:20 +0000985 sys.stdout = save_stdout
Fred Drake9a0db072003-02-03 15:19:30 +0000986 except test_support.ResourceDenied, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700987 if not quiet and not pgo:
Fred Drake9a0db072003-02-03 15:19:30 +0000988 print test, "skipped --", msg
989 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000990 return RESOURCE_DENIED, test_time
R. David Murray612f1d52009-03-31 19:49:15 +0000991 except unittest.SkipTest, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700992 if not quiet and not pgo:
Fred Drakede4742b2002-10-17 20:36:08 +0000993 print test, "skipped --", msg
Guido van Rossum3cda93e2002-09-13 21:28:03 +0000994 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +0000995 return SKIPPED, test_time
Fred Drakefe5c22a2000-08-18 16:04:05 +0000996 except KeyboardInterrupt:
997 raise
Guido van Rossum152494a1996-12-20 03:12:20 +0000998 except test_support.TestFailed, msg:
Brett Cannon95374782015-10-02 16:21:34 -0700999 if not pgo:
1000 print >>sys.stderr, "test", test, "failed --", msg
R. David Murray0960bc52010-12-04 17:24:46 +00001001 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001002 return FAILED, test_time
Guido van Rossum9e48b271997-07-16 01:56:13 +00001003 except:
Guido van Rossum41360a41998-03-26 19:42:58 +00001004 type, value = sys.exc_info()[:2]
Brett Cannon95374782015-10-02 16:21:34 -07001005 if not pgo:
1006 print >>sys.stderr, "test", test, "crashed --", str(type) + ":", value
R. David Murray0960bc52010-12-04 17:24:46 +00001007 sys.stderr.flush()
Brett Cannon95374782015-10-02 16:21:34 -07001008 if verbose and not pgo:
R. David Murray0960bc52010-12-04 17:24:46 +00001009 traceback.print_exc(file=sys.stderr)
1010 sys.stderr.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001011 return FAILED, test_time
Guido van Rossum152494a1996-12-20 03:12:20 +00001012 else:
Collin Winter0f489742009-05-14 23:26:30 +00001013 if refleak:
Georg Brandl4045e882009-10-29 20:53:00 +00001014 return FAILED, test_time
R. David Murray14dcd432009-10-14 13:58:07 +00001015 if environment.changed:
Georg Brandl93c21712009-10-29 21:44:56 +00001016 return ENV_CHANGED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001017 # Except in verbose mode, tests should not print anything
1018 if verbose or huntrleaks:
Georg Brandl4045e882009-10-29 20:53:00 +00001019 return PASSED, test_time
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001020 output = capture_stdout.getvalue()
1021 if not output:
Georg Brandl4045e882009-10-29 20:53:00 +00001022 return PASSED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001023 print "test", test, "produced unexpected output:"
Amaury Forgeot d'Arcea13dc62008-03-29 13:14:52 +00001024 print "*" * 70
1025 print output
1026 print "*" * 70
Guido van Rossum3cda93e2002-09-13 21:28:03 +00001027 sys.stdout.flush()
Georg Brandl4045e882009-10-29 20:53:00 +00001028 return FAILED, test_time
Guido van Rossum0fcca4e2001-09-21 20:31:52 +00001029
Tim Peterse5584862006-06-09 19:24:44 +00001030def cleanup_test_droppings(testname, verbose):
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001031 import stat
Antoine Pitrou0d759572010-10-31 13:15:24 +00001032 import gc
1033
1034 # First kill any dangling references to open files etc.
1035 gc.collect()
Tim Peterse5584862006-06-09 19:24:44 +00001036
1037 # Try to clean up junk commonly left behind. While tests shouldn't leave
1038 # any files or directories behind, when a test fails that can be tedious
1039 # for it to arrange. The consequences can be especially nasty on Windows,
1040 # since if a test leaves a file open, it cannot be deleted by name (while
1041 # there's nothing we can do about that here either, we can display the
1042 # name of the offending test, which is a real help).
1043 for name in (test_support.TESTFN,
1044 "db_home",
1045 ):
1046 if not os.path.exists(name):
1047 continue
1048
1049 if os.path.isdir(name):
1050 kind, nuker = "directory", shutil.rmtree
1051 elif os.path.isfile(name):
1052 kind, nuker = "file", os.unlink
1053 else:
1054 raise SystemError("os.path says %r exists but is neither "
1055 "directory nor file" % name)
1056
1057 if verbose:
1058 print "%r left behind %s %r" % (testname, kind, name)
1059 try:
Benjamin Petersona9b4d472009-04-29 22:44:15 +00001060 # if we have chmod, fix possible permissions problems
1061 # that might prevent cleanup
1062 if (hasattr(os, 'chmod')):
1063 os.chmod(name, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
Tim Peterse5584862006-06-09 19:24:44 +00001064 nuker(name)
1065 except Exception, msg:
1066 print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
1067 "removed: %s" % (testname, kind, name, msg))
1068
Tim Peters06c5c002006-06-05 00:55:26 +00001069def dash_R(the_module, test, indirect_test, huntrleaks):
Collin Winter0f489742009-05-14 23:26:30 +00001070 """Run a test multiple times, looking for reference leaks.
1071
1072 Returns:
1073 False if the test didn't leak references; True if we detected refleaks.
1074 """
Tim Peters06c5c002006-06-05 00:55:26 +00001075 # This code is hackish and inelegant, but it seems to do the job.
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001076 import copy_reg, _abcoll, _pyio
Tim Peters06c5c002006-06-05 00:55:26 +00001077
1078 if not hasattr(sys, 'gettotalrefcount'):
1079 raise Exception("Tracking reference leaks requires a debug build "
1080 "of Python")
1081
1082 # Save current values for dash_R_cleanup() to restore.
1083 fs = warnings.filters[:]
Georg Brandldffbf5f2008-05-20 07:49:57 +00001084 ps = copy_reg.dispatch_table.copy()
Tim Peters06c5c002006-06-05 00:55:26 +00001085 pic = sys.path_importer_cache.copy()
Nick Coghlan4976e322009-11-16 03:55:51 +00001086 try:
1087 import zipimport
1088 except ImportError:
Benjamin Peterson55035792014-02-16 14:51:17 -05001089 zdc = None # Run unmodified on platforms without zipimport support
Nick Coghlan4976e322009-11-16 03:55:51 +00001090 else:
1091 zdc = zipimport._zip_directory_cache.copy()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001092 abcs = {}
Amaury Forgeot d'Arce55df1f2009-07-28 20:47:55 +00001093 modules = _abcoll, _pyio
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001094 for abc in [getattr(mod, a) for mod in modules for a in mod.__all__]:
1095 # XXX isinstance(abc, ABCMeta) leads to infinite recursion
1096 if not hasattr(abc, '_abc_registry'):
Christian Heimes6b29dd02007-11-30 22:36:10 +00001097 continue
Guido van Rossum64c06e32007-11-22 00:55:51 +00001098 for obj in abc.__subclasses__() + [abc]:
1099 abcs[obj] = obj._abc_registry.copy()
1100
Tim Peters06c5c002006-06-05 00:55:26 +00001101 if indirect_test:
1102 def run_the_test():
1103 indirect_test()
1104 else:
1105 def run_the_test():
Ezio Melottidde5b942010-02-03 05:37:26 +00001106 imp.reload(the_module)
Tim Peters06c5c002006-06-05 00:55:26 +00001107
1108 deltas = []
1109 nwarmup, ntracked, fname = huntrleaks
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001110 fname = os.path.join(test_support.SAVEDCWD, fname)
Tim Peters06c5c002006-06-05 00:55:26 +00001111 repcount = nwarmup + ntracked
1112 print >> sys.stderr, "beginning", repcount, "repetitions"
1113 print >> sys.stderr, ("1234567890"*(repcount//10 + 1))[:repcount]
Benjamin Peterson55035792014-02-16 14:51:17 -05001114 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Tim Peters06c5c002006-06-05 00:55:26 +00001115 for i in range(repcount):
Collin Winterac1d9312010-03-17 02:02:30 +00001116 rc_before = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001117 run_the_test()
1118 sys.stderr.write('.')
Benjamin Peterson55035792014-02-16 14:51:17 -05001119 dash_R_cleanup(fs, ps, pic, zdc, abcs)
Collin Winterac1d9312010-03-17 02:02:30 +00001120 rc_after = sys.gettotalrefcount()
Tim Peters06c5c002006-06-05 00:55:26 +00001121 if i >= nwarmup:
Collin Winterac1d9312010-03-17 02:02:30 +00001122 deltas.append(rc_after - rc_before)
Tim Peters06c5c002006-06-05 00:55:26 +00001123 print >> sys.stderr
1124 if any(deltas):
Neal Norwitzd9841032007-05-11 05:55:15 +00001125 msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
1126 print >> sys.stderr, msg
Antoine Pitrou4698d992009-05-31 14:20:14 +00001127 with open(fname, "a") as refrep:
1128 print >> refrep, msg
1129 refrep.flush()
Collin Winter0f489742009-05-14 23:26:30 +00001130 return True
1131 return False
Tim Peters06c5c002006-06-05 00:55:26 +00001132
Benjamin Peterson55035792014-02-16 14:51:17 -05001133def dash_R_cleanup(fs, ps, pic, zdc, abcs):
Georg Brandldffbf5f2008-05-20 07:49:57 +00001134 import gc, copy_reg
Amaury Forgeot d'Arc607bff12008-04-18 23:31:33 +00001135
Tim Peters06c5c002006-06-05 00:55:26 +00001136 # Restore some original values.
1137 warnings.filters[:] = fs
Georg Brandldffbf5f2008-05-20 07:49:57 +00001138 copy_reg.dispatch_table.clear()
1139 copy_reg.dispatch_table.update(ps)
Tim Peters06c5c002006-06-05 00:55:26 +00001140 sys.path_importer_cache.clear()
1141 sys.path_importer_cache.update(pic)
Nick Coghlan4976e322009-11-16 03:55:51 +00001142 try:
1143 import zipimport
1144 except ImportError:
1145 pass # Run unmodified on platforms without zipimport support
1146 else:
1147 zipimport._zip_directory_cache.clear()
1148 zipimport._zip_directory_cache.update(zdc)
Tim Peters06c5c002006-06-05 00:55:26 +00001149
Christian Heimes908caac2008-01-27 23:34:59 +00001150 # clear type cache
Christian Heimes422051a2008-02-04 18:00:12 +00001151 sys._clear_type_cache()
Christian Heimes908caac2008-01-27 23:34:59 +00001152
Guido van Rossum64c06e32007-11-22 00:55:51 +00001153 # Clear ABC registries, restoring previously saved ABC registries.
Amaury Forgeot d'Arc4d0c1172008-04-02 00:25:14 +00001154 for abc, registry in abcs.items():
1155 abc._abc_registry = registry.copy()
1156 abc._abc_cache.clear()
1157 abc._abc_negative_cache.clear()
Guido van Rossum64c06e32007-11-22 00:55:51 +00001158
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001159 clear_caches()
1160
1161def clear_caches():
1162 import gc
1163
1164 # Clear the warnings registry, so they can be displayed again
1165 for mod in sys.modules.values():
1166 if hasattr(mod, '__warningregistry__'):
1167 del mod.__warningregistry__
1168
Tim Peters06c5c002006-06-05 00:55:26 +00001169 # Clear assorted module caches.
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001170 # Don't worry about resetting the cache if the module is not loaded
Meador Inge0e303172011-11-25 22:25:06 -06001171 try:
Serhiy Storchakaac33bd72016-11-11 11:42:25 +02001172 distutils_dir_util = sys.modules['distutils.dir_util']
1173 except KeyError:
1174 pass
1175 else:
1176 distutils_dir_util._path_created.clear()
1177
1178 re.purge()
1179
1180 try:
1181 _strptime = sys.modules['_strptime']
1182 except KeyError:
1183 pass
1184 else:
1185 _strptime._regex_cache.clear()
1186
1187 try:
1188 urlparse = sys.modules['urlparse']
1189 except KeyError:
1190 pass
1191 else:
1192 urlparse.clear_cache()
1193
1194 try:
1195 urllib = sys.modules['urllib']
1196 except KeyError:
1197 pass
1198 else:
1199 urllib.urlcleanup()
1200
1201 try:
1202 urllib2 = sys.modules['urllib2']
1203 except KeyError:
1204 pass
1205 else:
1206 urllib2.install_opener(None)
1207
1208 try:
1209 dircache = sys.modules['dircache']
1210 except KeyError:
1211 pass
1212 else:
1213 dircache.reset()
1214
1215 try:
1216 linecache = sys.modules['linecache']
1217 except KeyError:
1218 pass
1219 else:
1220 linecache.clearcache()
1221
1222 try:
1223 mimetypes = sys.modules['mimetypes']
1224 except KeyError:
1225 pass
1226 else:
1227 mimetypes._default_mime_types()
1228
1229 try:
1230 filecmp = sys.modules['filecmp']
1231 except KeyError:
1232 pass
1233 else:
1234 filecmp._cache.clear()
1235
1236 try:
1237 struct = sys.modules['struct']
1238 except KeyError:
1239 pass
1240 else:
1241 struct._clearcache()
1242
1243 try:
1244 doctest = sys.modules['doctest']
1245 except KeyError:
1246 pass
1247 else:
1248 doctest.master = None
1249
1250 try:
1251 ctypes = sys.modules['ctypes']
1252 except KeyError:
Meador Inge0e303172011-11-25 22:25:06 -06001253 pass
1254 else:
1255 ctypes._reset_cache()
Tim Peters06c5c002006-06-05 00:55:26 +00001256
1257 # Collect cyclic trash.
1258 gc.collect()
1259
Florent Xicluna0932dc52010-03-06 08:07:44 +00001260def findtestdir(path=None):
1261 return path or os.path.dirname(__file__) or os.curdir
Guido van Rossum152494a1996-12-20 03:12:20 +00001262
Florent Xicluna0932dc52010-03-06 08:07:44 +00001263def removepy(names):
1264 if not names:
1265 return
1266 for idx, name in enumerate(names):
1267 basename, ext = os.path.splitext(name)
1268 if ext == '.py':
1269 names[idx] = basename
Tim Petersc5000df2002-06-02 21:42:01 +00001270
Guido van Rossum152494a1996-12-20 03:12:20 +00001271def count(n, word):
1272 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +00001273 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001274 else:
Guido van Rossum41360a41998-03-26 19:42:58 +00001275 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +00001276
Tim Petersa45da922001-08-12 03:45:50 +00001277def printlist(x, width=70, indent=4):
Tim Peters7c7efe92002-08-23 17:55:54 +00001278 """Print the elements of iterable x to stdout.
Tim Petersa45da922001-08-12 03:45:50 +00001279
1280 Optional arg width (default 70) is the maximum line length.
1281 Optional arg indent (default 4) is the number of blanks with which to
1282 begin each line.
1283 """
1284
Tim Petersba78bc42002-07-04 19:45:06 +00001285 from textwrap import fill
1286 blanks = ' ' * indent
Florent Xicluna355adc52010-03-26 19:32:44 +00001287 # Print the sorted list: 'x' may be a '--random' list or a set()
1288 print fill(' '.join(str(elt) for elt in sorted(x)), width,
Tim Petersba78bc42002-07-04 19:45:06 +00001289 initial_indent=blanks, subsequent_indent=blanks)
Tim Petersa45da922001-08-12 03:45:50 +00001290
Tim Petersde14a302002-04-01 05:04:46 +00001291# Map sys.platform to a string containing the basenames of tests
1292# expected to be skipped on that platform.
Tim Peters2a182db2002-10-09 01:07:11 +00001293#
1294# Special cases:
1295# test_pep277
1296# The _ExpectedSkips constructor adds this to the set of expected
1297# skips if not os.path.supports_unicode_filenames.
Neal Norwitz55b61d22003-02-28 19:57:03 +00001298# test_timeout
1299# Controlled by test_timeout.skip_expected. Requires the network
1300# resource and a socket module.
Georg Brandlb2e208f2007-07-12 09:24:04 +00001301#
1302# Tests that are expected to be skipped everywhere except on one platform
1303# are also handled separately.
Tim Petersde14a302002-04-01 05:04:46 +00001304
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001305_expectations = {
1306 'win32':
1307 """
Tim Petersc7c516a2003-09-20 22:06:13 +00001308 test__locale
Skip Montanaro823ba282003-05-06 20:36:24 +00001309 test_bsddb185
Tim Peters78e35f92002-11-22 20:00:34 +00001310 test_bsddb3
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001311 test_commands
1312 test_crypt
Tim Petersd7030572001-10-22 22:06:08 +00001313 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001314 test_dbm
1315 test_dl
1316 test_fcntl
1317 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001318 test_epoll
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001319 test_gdbm
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001320 test_grp
Tim Petersfd8e6e52003-03-04 00:26:38 +00001321 test_ioctl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001322 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001323 test_kqueue
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001324 test_mhlib
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001325 test_openpty
Tim Petersefc4b122002-12-10 18:47:56 +00001326 test_ossaudiodev
Georg Brandl27d9ee32007-08-30 10:38:56 +00001327 test_pipes
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001328 test_poll
Tim Peters003eb302003-02-17 21:48:48 +00001329 test_posix
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001330 test_pty
1331 test_pwd
Tim Peters1e33ffa2002-04-23 23:09:02 +00001332 test_resource
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001333 test_signal
Serhiy Storchaka7ece1502015-01-31 10:20:31 +02001334 test_spwd
Tim Peterscea2cc42004-08-04 02:32:03 +00001335 test_threadsignals
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001336 test_timing
Tim Petersb84de022006-03-22 02:58:17 +00001337 test_wait3
1338 test_wait4
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001339 """,
1340 'linux2':
1341 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001342 test_bsddb185
Guido van Rossumf66dacd2001-10-23 15:10:55 +00001343 test_curses
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001344 test_dl
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001345 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001346 test_kqueue
Guido van Rossum4507ec72003-02-14 19:29:22 +00001347 test_ossaudiodev
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001348 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001349 'unixware7':
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001350 """
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001351 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001352 test_bsddb185
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001353 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001354 test_epoll
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001355 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001356 test_kqueue
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001357 test_minidom
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001358 test_openpty
1359 test_pyexpat
1360 test_sax
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001361 test_sundry
Martin v. Löwis0ace3262001-09-05 14:38:48 +00001362 """,
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001363 'openunix8':
1364 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001365 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001366 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001367 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001368 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001369 test_largefile
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001370 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001371 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001372 test_openpty
1373 test_pyexpat
1374 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001375 test_sundry
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001376 """,
1377 'sco_sv3':
1378 """
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001379 test_asynchat
1380 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001381 test_bsddb185
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001382 test_dl
1383 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001384 test_epoll
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001385 test_gettext
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001386 test_largefile
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001387 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001388 test_kqueue
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001389 test_minidom
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001390 test_openpty
1391 test_pyexpat
1392 test_queue
1393 test_sax
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001394 test_sundry
1395 test_thread
1396 test_threaded_import
1397 test_threadedtempfile
1398 test_threading
Martin v. Löwis21ee4092002-09-30 16:19:48 +00001399 """,
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001400 'riscos':
1401 """
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001402 test_asynchat
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001403 test_atexit
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001404 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001405 test_bsddb185
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001406 test_bsddb3
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001407 test_commands
1408 test_crypt
1409 test_dbm
1410 test_dl
1411 test_fcntl
1412 test_fork1
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001413 test_epoll
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001414 test_gdbm
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001415 test_grp
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001416 test_largefile
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001417 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001418 test_kqueue
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001419 test_mmap
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001420 test_openpty
1421 test_poll
1422 test_popen2
1423 test_pty
1424 test_pwd
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001425 test_strop
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001426 test_sundry
1427 test_thread
1428 test_threaded_import
1429 test_threadedtempfile
1430 test_threading
1431 test_timing
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001432 """,
Jack Jansen8a97f4a2001-12-05 23:27:32 +00001433 'darwin':
Jack Jansen398c2362001-12-02 21:41:36 +00001434 """
Brett Cannon2bfb94c2003-10-13 04:27:47 +00001435 test__locale
Jack Jansenacda3392002-12-30 23:03:13 +00001436 test_bsddb
Guido van Rossum9d427002002-12-03 10:24:56 +00001437 test_bsddb3
Jack Jansen398c2362001-12-02 21:41:36 +00001438 test_curses
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001439 test_epoll
Skip Montanaro29cdfe62010-10-25 01:35:23 +00001440 test_gdb
Jack Jansen398c2362001-12-02 21:41:36 +00001441 test_gdbm
Jack Jansen398c2362001-12-02 21:41:36 +00001442 test_largefile
Jack Jansenacda3392002-12-30 23:03:13 +00001443 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001444 test_kqueue
Jack Jansen398c2362001-12-02 21:41:36 +00001445 test_minidom
Jack Jansenacda3392002-12-30 23:03:13 +00001446 test_ossaudiodev
Jack Jansen398c2362001-12-02 21:41:36 +00001447 test_poll
Jack Jansen398c2362001-12-02 21:41:36 +00001448 """,
Guido van Rossum11c3f092002-07-17 15:08:24 +00001449 'sunos5':
1450 """
Guido van Rossum11c3f092002-07-17 15:08:24 +00001451 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001452 test_bsddb185
Guido van Rossum11c3f092002-07-17 15:08:24 +00001453 test_curses
1454 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001455 test_epoll
1456 test_kqueue
Guido van Rossum11c3f092002-07-17 15:08:24 +00001457 test_gdbm
Guido van Rossum11c3f092002-07-17 15:08:24 +00001458 test_gzip
Guido van Rossum11c3f092002-07-17 15:08:24 +00001459 test_openpty
Guido van Rossum11c3f092002-07-17 15:08:24 +00001460 test_zipfile
1461 test_zlib
Jeremy Hyltoned375e12002-07-17 15:56:55 +00001462 """,
Skip Montanarob3230212002-03-15 02:54:03 +00001463 'hp-ux11':
1464 """
Skip Montanarob3230212002-03-15 02:54:03 +00001465 test_bsddb
Skip Montanaro823ba282003-05-06 20:36:24 +00001466 test_bsddb185
Skip Montanarob3230212002-03-15 02:54:03 +00001467 test_curses
1468 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001469 test_epoll
Skip Montanarob3230212002-03-15 02:54:03 +00001470 test_gdbm
Skip Montanarob3230212002-03-15 02:54:03 +00001471 test_gzip
Skip Montanarob3230212002-03-15 02:54:03 +00001472 test_largefile
Skip Montanarob3230212002-03-15 02:54:03 +00001473 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001474 test_kqueue
Skip Montanarob3230212002-03-15 02:54:03 +00001475 test_minidom
Skip Montanarob3230212002-03-15 02:54:03 +00001476 test_openpty
1477 test_pyexpat
1478 test_sax
Skip Montanarob3230212002-03-15 02:54:03 +00001479 test_zipfile
1480 test_zlib
1481 """,
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001482 'atheos':
Tim Petersc411dba2002-07-16 21:35:23 +00001483 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001484 test_bsddb185
Tim Petersc411dba2002-07-16 21:35:23 +00001485 test_curses
1486 test_dl
Tim Petersc411dba2002-07-16 21:35:23 +00001487 test_gdbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001488 test_epoll
Tim Petersc411dba2002-07-16 21:35:23 +00001489 test_largefile
Tim Petersc411dba2002-07-16 21:35:23 +00001490 test_locale
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001491 test_kqueue
Tim Petersc411dba2002-07-16 21:35:23 +00001492 test_mhlib
1493 test_mmap
Tim Petersc411dba2002-07-16 21:35:23 +00001494 test_poll
1495 test_popen2
1496 test_resource
Tim Petersc411dba2002-07-16 21:35:23 +00001497 """,
Jason Tishler25115942002-12-05 15:18:15 +00001498 'cygwin':
1499 """
Skip Montanaro823ba282003-05-06 20:36:24 +00001500 test_bsddb185
Tim Petersb0f89e02002-12-05 17:20:25 +00001501 test_bsddb3
Jason Tishler25115942002-12-05 15:18:15 +00001502 test_curses
1503 test_dbm
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001504 test_epoll
Jason Tishlerc23f39c2003-07-22 18:35:58 +00001505 test_ioctl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001506 test_kqueue
Jason Tishler25115942002-12-05 15:18:15 +00001507 test_largefile
Jason Tishler25115942002-12-05 15:18:15 +00001508 test_locale
Jason Tishler5c4ded22003-02-05 16:46:01 +00001509 test_ossaudiodev
Jason Tishler25115942002-12-05 15:18:15 +00001510 test_socketserver
Jason Tishler25115942002-12-05 15:18:15 +00001511 """,
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001512 'os2emx':
1513 """
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001514 test_audioop
Skip Montanaro823ba282003-05-06 20:36:24 +00001515 test_bsddb185
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001516 test_bsddb3
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001517 test_commands
1518 test_curses
1519 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001520 test_epoll
1521 test_kqueue
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001522 test_largefile
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001523 test_mhlib
1524 test_mmap
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001525 test_openpty
1526 test_ossaudiodev
1527 test_pty
1528 test_resource
1529 test_signal
Andrew MacIntyrefd07e7d2002-12-31 11:26:50 +00001530 """,
Guido van Rossum944a6c32003-11-20 22:11:29 +00001531 'freebsd4':
1532 """
Guido van Rossum944a6c32003-11-20 22:11:29 +00001533 test_bsddb
1534 test_bsddb3
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001535 test_epoll
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001536 test_gdbm
Guido van Rossum944a6c32003-11-20 22:11:29 +00001537 test_locale
Guido van Rossum944a6c32003-11-20 22:11:29 +00001538 test_ossaudiodev
1539 test_pep277
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001540 test_pty
Guido van Rossum944a6c32003-11-20 22:11:29 +00001541 test_socketserver
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001542 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001543 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001544 test_ttk_guionly
1545 test_ttk_textonly
Guido van Rossum944a6c32003-11-20 22:11:29 +00001546 test_timeout
Guido van Rossum944a6c32003-11-20 22:11:29 +00001547 test_urllibnet
Jesse Noller37040cd2008-09-30 00:15:45 +00001548 test_multiprocessing
Martin v. Löwis56f88112003-06-07 20:01:37 +00001549 """,
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001550 'aix5':
1551 """
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001552 test_bsddb
1553 test_bsddb185
1554 test_bsddb3
1555 test_bz2
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001556 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001557 test_epoll
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001558 test_gdbm
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001559 test_gzip
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001560 test_kqueue
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001561 test_ossaudiodev
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001562 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001563 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001564 test_ttk_guionly
1565 test_ttk_textonly
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001566 test_zipimport
1567 test_zlib
1568 """,
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001569 'openbsd3':
1570 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001571 test_ascii_formatd
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001572 test_bsddb
1573 test_bsddb3
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001574 test_ctypes
1575 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001576 test_epoll
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001577 test_gdbm
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001578 test_locale
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001579 test_normalization
1580 test_ossaudiodev
1581 test_pep277
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001582 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001583 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001584 test_ttk_guionly
1585 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001586 test_multiprocessing
Martin v. Löwis6da56f92006-03-26 10:02:34 +00001587 """,
Georg Brandl08706872006-06-21 17:53:17 +00001588 'netbsd3':
1589 """
Florent Xicluna27e02402010-03-24 17:32:58 +00001590 test_ascii_formatd
Georg Brandl08706872006-06-21 17:53:17 +00001591 test_bsddb
1592 test_bsddb185
1593 test_bsddb3
Georg Brandl08706872006-06-21 17:53:17 +00001594 test_ctypes
1595 test_curses
1596 test_dl
Christian Heimes0e9ab5f2008-03-21 23:49:44 +00001597 test_epoll
Georg Brandl08706872006-06-21 17:53:17 +00001598 test_gdbm
Georg Brandl08706872006-06-21 17:53:17 +00001599 test_locale
Georg Brandl08706872006-06-21 17:53:17 +00001600 test_ossaudiodev
1601 test_pep277
Georg Brandl08706872006-06-21 17:53:17 +00001602 test_tcl
Guilherme Polobbb7efd2009-02-09 19:21:21 +00001603 test_tk
Guilherme Polo7a77ee82009-01-28 19:28:04 +00001604 test_ttk_guionly
1605 test_ttk_textonly
Jesse Noller37040cd2008-09-30 00:15:45 +00001606 test_multiprocessing
Georg Brandl08706872006-06-21 17:53:17 +00001607 """,
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001608}
Martin v. Löwis32d0c1b2004-07-26 12:09:13 +00001609_expectations['freebsd5'] = _expectations['freebsd4']
Hye-Shik Changf64700a2004-08-18 15:13:41 +00001610_expectations['freebsd6'] = _expectations['freebsd4']
Hye-Shik Chang4e422812005-07-17 02:36:59 +00001611_expectations['freebsd7'] = _expectations['freebsd4']
Hye-Shik Changea684742007-10-28 12:38:09 +00001612_expectations['freebsd8'] = _expectations['freebsd4']
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001613
Tim Petersb5b7b782001-08-12 01:20:39 +00001614class _ExpectedSkips:
1615 def __init__(self):
Tim Peters2a182db2002-10-09 01:07:11 +00001616 import os.path
Neal Norwitz55b61d22003-02-28 19:57:03 +00001617 from test import test_timeout
Tim Peters1b445d32002-11-24 18:53:11 +00001618
Tim Peters7c7efe92002-08-23 17:55:54 +00001619 self.valid = False
Tim Petersde14a302002-04-01 05:04:46 +00001620 if sys.platform in _expectations:
Guido van Rossumf73e30c2001-08-12 02:22:19 +00001621 s = _expectations[sys.platform]
Raymond Hettingera690a992003-11-16 16:17:49 +00001622 self.expected = set(s.split())
Tim Peters1b445d32002-11-24 18:53:11 +00001623
Georg Brandlb2e208f2007-07-12 09:24:04 +00001624 # expected to be skipped on every platform, even Linux
1625 self.expected.add('test_linuxaudiodev')
1626
Tim Peters2a182db2002-10-09 01:07:11 +00001627 if not os.path.supports_unicode_filenames:
1628 self.expected.add('test_pep277')
Tim Peters1b445d32002-11-24 18:53:11 +00001629
Neal Norwitz55b61d22003-02-28 19:57:03 +00001630 if test_timeout.skip_expected:
1631 self.expected.add('test_timeout')
1632
Martin v. Löwisfba73692004-11-13 11:13:35 +00001633 if sys.maxint == 9223372036854775807L:
Martin v. Löwisfba73692004-11-13 11:13:35 +00001634 self.expected.add('test_imageop')
1635
Ronald Oussoren9545a232010-05-05 19:09:31 +00001636 if sys.platform != "darwin":
Amaury Forgeot d'Arc8f40f062008-06-19 19:57:39 +00001637 MAC_ONLY = ["test_macos", "test_macostools", "test_aepack",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001638 "test_plistlib", "test_scriptpackages",
1639 "test_applesingle"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001640 for skip in MAC_ONLY:
1641 self.expected.add(skip)
Benjamin Peterson6f5a2b52008-06-19 21:39:06 +00001642 elif len(u'\0'.encode('unicode-internal')) == 4:
1643 self.expected.add("test_macostools")
1644
Tim Petersecd79eb2003-01-29 00:35:32 +00001645
1646 if sys.platform != "win32":
Georg Brandlb2e208f2007-07-12 09:24:04 +00001647 # test_sqlite is only reliable on Windows where the library
1648 # is distributed with Python
Neal Norwitz7035c982003-03-29 22:01:17 +00001649 WIN_ONLY = ["test_unicode_file", "test_winreg",
Georg Brandlb2e208f2007-07-12 09:24:04 +00001650 "test_winsound", "test_startfile",
Ross Lagerwallfe2f1ad2011-04-09 20:39:50 +02001651 "test_sqlite", "test_msilib"]
Neal Norwitz7035c982003-03-29 22:01:17 +00001652 for skip in WIN_ONLY:
1653 self.expected.add(skip)
Tim Petersf2715e02003-02-19 02:35:07 +00001654
Brett Cannondc48b742007-05-20 07:09:50 +00001655 if sys.platform != 'irix':
Georg Brandlb2e208f2007-07-12 09:24:04 +00001656 IRIX_ONLY = ["test_imageop", "test_al", "test_cd", "test_cl",
1657 "test_gl", "test_imgfile"]
Brett Cannondc48b742007-05-20 07:09:50 +00001658 for skip in IRIX_ONLY:
1659 self.expected.add(skip)
1660
Georg Brandlb2e208f2007-07-12 09:24:04 +00001661 if sys.platform != 'sunos5':
1662 self.expected.add('test_sunaudiodev')
1663 self.expected.add('test_nis')
1664
Steven Bethardd290b042008-03-21 21:01:18 +00001665 if not sys.py3kwarning:
1666 self.expected.add('test_py3kwarn')
Steven Betharde8e22cf2008-03-18 21:30:13 +00001667
Tim Peters7c7efe92002-08-23 17:55:54 +00001668 self.valid = True
Tim Petersb5b7b782001-08-12 01:20:39 +00001669
1670 def isvalid(self):
1671 "Return true iff _ExpectedSkips knows about the current platform."
1672 return self.valid
1673
1674 def getexpected(self):
1675 """Return set of test names we expect to skip on current platform.
1676
1677 self.isvalid() must be true.
1678 """
1679
1680 assert self.isvalid()
1681 return self.expected
1682
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001683def main_in_temp_cwd():
1684 """Run main() in a temporary working directory."""
Victor Stinner8105dd72017-05-02 23:43:25 +02001685 global TEMPDIR
1686
Florent Xicluna0932dc52010-03-06 08:07:44 +00001687 # When tests are run from the Python build directory, it is best practice
1688 # to keep the test files in a subfolder. It eases the cleanup of leftover
1689 # files using command "make distclean".
1690 if sysconfig.is_python_build():
Florent Xicluna12735662010-04-23 18:10:12 +00001691 TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
1692 TEMPDIR = os.path.abspath(TEMPDIR)
1693 if not os.path.exists(TEMPDIR):
1694 os.mkdir(TEMPDIR)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001695
1696 # Define a writable temp dir that will be used as cwd while running
1697 # the tests. The name of the dir includes the pid to allow parallel
1698 # testing (see the -j option).
1699 TESTCWD = 'test_python_{}'.format(os.getpid())
1700
Florent Xicluna12735662010-04-23 18:10:12 +00001701 TESTCWD = os.path.join(TEMPDIR, TESTCWD)
Ezio Melotti8f6a2872010-02-10 21:40:33 +00001702
1703 # Run the tests in a context manager that temporary changes the CWD to a
1704 # temporary and writable directory. If it's not possible to create or
1705 # change the CWD, the original CWD will be used. The original CWD is
1706 # available from test_support.SAVEDCWD.
1707 with test_support.temp_cwd(TESTCWD, quiet=True):
1708 main()
Serhiy Storchaka43566ae2017-05-02 18:26:25 +03001709
1710if __name__ == '__main__':
1711 # findtestdir() gets the dirname out of __file__, so we have to make it
1712 # absolute before changing the working directory.
1713 # For example __file__ may be relative when running trace or profile.
1714 # See issue #9323.
1715 global __file__
1716 __file__ = os.path.abspath(__file__)
1717
1718 # sanity check
1719 assert __file__ == os.path.abspath(sys.argv[0])
1720
1721 main_in_temp_cwd()