blob: d16b32afeea22ef092f99ca4c9be6335eb6ad985 [file] [log] [blame]
Brett Cannonf1cfb622003-05-04 21:15:27 +00001"""Supporting definitions for the Python regression tests."""
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003if __name__ != 'test.support':
4 raise ImportError('support must be imported from the test package')
Barry Warsaw408b6d32002-07-30 23:27:12 +00005
Guido van Rossumd8faa362007-04-27 19:54:29 +00006import contextlib
7import errno
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00008import functools
Benjamin Peterson8cc7d882009-06-01 23:14:51 +00009import gc
Guido van Rossumd8faa362007-04-27 19:54:29 +000010import socket
Fred Drakecd1b1dd2001-03-21 18:26:33 +000011import sys
Guido van Rossumd8faa362007-04-27 19:54:29 +000012import os
Benjamin Petersone549ead2009-03-28 21:42:05 +000013import platform
Christian Heimes23daade02008-02-25 12:39:23 +000014import shutil
Thomas Wouters902d6eb2007-01-09 23:18:33 +000015import warnings
Guido van Rossumd8faa362007-04-27 19:54:29 +000016import unittest
R. David Murraya21e4ca2009-03-31 23:16:50 +000017import importlib
Walter Dörwald155374d2009-05-01 19:58:58 +000018import collections
Florent Xiclunab14930c2010-03-13 15:26:44 +000019import re
Fred Drakecd1b1dd2001-03-21 18:26:33 +000020
Benjamin Petersone549ead2009-03-28 21:42:05 +000021__all__ = ["Error", "TestFailed", "ResourceDenied", "import_module",
Benjamin Peterson744c2cd2008-05-26 16:26:37 +000022 "verbose", "use_resources", "max_memuse", "record_original_stdout",
23 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
24 "is_resource_enabled", "requires", "find_unused_port", "bind_port",
Ezio Melotti184bdfb2010-02-18 09:37:05 +000025 "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "SAVEDCWD", "temp_cwd",
26 "findfile", "sortdict", "check_syntax_error", "open_urlresource",
Benjamin Petersonfcf5d632008-10-16 23:24:44 +000027 "check_warnings", "CleanImport", "EnvironmentVarGuard",
Benjamin Peterson79e48032008-05-26 17:44:33 +000028 "TransientResource", "captured_output", "captured_stdout",
Raymond Hettingerd76b9f12009-06-04 00:35:30 +000029 "time_out", "socket_peer_reset", "ioerror_peer_reset",
30 "run_with_locale",
Benjamin Peterson79e48032008-05-26 17:44:33 +000031 "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
32 "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
Collin Winterf2bf2b32010-03-17 00:41:56 +000033 "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
34 "swap_item", "swap_attr"]
Benjamin Peterson744c2cd2008-05-26 16:26:37 +000035
Florent Xiclunaf089fd62010-03-19 14:25:03 +000036
Fred Drake1790dd42000-07-24 06:55:00 +000037class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000038 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000039
40class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000041 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000042
Benjamin Petersone549ead2009-03-28 21:42:05 +000043class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000044 """Test skipped because it requested a disallowed resource.
45
46 This is raised when a test calls requires() for a resource that
47 has not be enabled. It is used to distinguish between expected
48 and unexpected skips.
49 """
50
Nick Coghlanfce769e2009-04-11 14:30:59 +000051@contextlib.contextmanager
52def _ignore_deprecated_imports(ignore=True):
53 """Context manager to suppress package and module deprecation
54 warnings when importing them.
55
56 If ignore is False, this context manager has no effect."""
57 if ignore:
58 with warnings.catch_warnings():
59 warnings.filterwarnings("ignore", ".+ (module|package)",
60 DeprecationWarning)
61 yield
62 else:
63 yield
64
65
Benjamin Peterson699adb92008-05-08 22:27:58 +000066def import_module(name, deprecated=False):
R. David Murraya21e4ca2009-03-31 23:16:50 +000067 """Import and return the module to be tested, raising SkipTest if
68 it is not available.
69
70 If deprecated is True, any module or package deprecation messages
71 will be suppressed."""
Nick Coghlanfce769e2009-04-11 14:30:59 +000072 with _ignore_deprecated_imports(deprecated):
Benjamin Peterson699adb92008-05-08 22:27:58 +000073 try:
Nick Coghlanfce769e2009-04-11 14:30:59 +000074 return importlib.import_module(name)
R. David Murraya21e4ca2009-03-31 23:16:50 +000075 except ImportError as msg:
76 raise unittest.SkipTest(str(msg))
Nick Coghlanfce769e2009-04-11 14:30:59 +000077
78
Nick Coghlan47384702009-04-22 16:13:36 +000079def _save_and_remove_module(name, orig_modules):
80 """Helper function to save and remove a module from sys.modules
81
82 Return value is True if the module was in sys.modules and
83 False otherwise."""
84 saved = True
85 try:
86 orig_modules[name] = sys.modules[name]
87 except KeyError:
88 saved = False
89 else:
90 del sys.modules[name]
91 return saved
92
93
94def _save_and_block_module(name, orig_modules):
95 """Helper function to save and block a module in sys.modules
96
97 Return value is True if the module was in sys.modules and
98 False otherwise."""
99 saved = True
100 try:
101 orig_modules[name] = sys.modules[name]
102 except KeyError:
103 saved = False
104 sys.modules[name] = 0
105 return saved
106
107
108def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000109 """Imports and returns a module, deliberately bypassing the sys.modules cache
110 and importing a fresh copy of the module. Once the import is complete,
111 the sys.modules cache is restored to its original state.
112
Nick Coghlan47384702009-04-22 16:13:36 +0000113 Modules named in fresh are also imported anew if needed by the import.
114
115 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000116 takes place.
117
118 If deprecated is True, any module or package deprecation messages
119 will be suppressed."""
120 # NOTE: test_heapq and test_warnings include extra sanity checks to make
121 # sure that this utility function is working as expected
122 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000123 # Keep track of modules saved for later restoration as well
124 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000125 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000126 names_to_remove = []
127 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000128 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000129 for fresh_name in fresh:
130 _save_and_remove_module(fresh_name, orig_modules)
131 for blocked_name in blocked:
132 if not _save_and_block_module(blocked_name, orig_modules):
133 names_to_remove.append(blocked_name)
134 fresh_module = importlib.import_module(name)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000135 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000136 for orig_name, module in orig_modules.items():
137 sys.modules[orig_name] = module
138 for name_to_remove in names_to_remove:
139 del sys.modules[name_to_remove]
140 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000141
Benjamin Peterson699adb92008-05-08 22:27:58 +0000142
R. David Murraya21e4ca2009-03-31 23:16:50 +0000143def get_attribute(obj, name):
144 """Get an attribute, raising SkipTest if AttributeError is raised."""
145 try:
146 attribute = getattr(obj, name)
147 except AttributeError:
148 raise unittest.SkipTest("module %s has no attribute %s" % (
149 obj.__name__, name))
150 else:
151 return attribute
152
Barry Warsawc0fb6052001-08-20 22:29:23 +0000153verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000154use_resources = None # Flag set to [] by regrtest.py
155max_memuse = 0 # Disable bigmem tests (they will still be run with
156 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000157real_max_memuse = 0
Guido van Rossum531661c1996-12-20 02:58:22 +0000158
Tim Peters8dee8092001-09-25 20:05:11 +0000159# _original_stdout is meant to hold stdout at the time regrtest began.
160# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
161# The point is to have some flavor of stdout the user can actually see.
162_original_stdout = None
163def record_original_stdout(stdout):
164 global _original_stdout
165 _original_stdout = stdout
166
167def get_original_stdout():
168 return _original_stdout or sys.stdout
169
Guido van Rossum3bead091992-01-27 17:00:37 +0000170def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000171 try:
172 del sys.modules[name]
173 except KeyError:
174 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000175
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000176def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000177 try:
178 os.unlink(filename)
179 except OSError:
180 pass
181
Christian Heimes23daade02008-02-25 12:39:23 +0000182def rmtree(path):
183 try:
184 shutil.rmtree(path)
185 except OSError as e:
186 # Unix returns ENOENT, Windows returns ESRCH.
187 if e.errno not in (errno.ENOENT, errno.ESRCH):
188 raise
189
Guido van Rossum3bead091992-01-27 17:00:37 +0000190def forget(modname):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000191 '''"Forget" a module was ever imported by removing it from sys.modules and
192 deleting any .pyc and .pyo files.'''
Fred Drake004d5e62000-10-23 17:22:08 +0000193 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000194 for dirname in sys.path:
Skip Montanaro7a98be22007-08-16 14:35:24 +0000195 unlink(os.path.join(dirname, modname + '.pyc'))
Brett Cannonf1cfb622003-05-04 21:15:27 +0000196 # Deleting the .pyo file cannot be within the 'try' for the .pyc since
197 # the chance exists that there is no .pyc (and thus the 'try' statement
198 # is exited) but there is a .pyo file.
Skip Montanaro7a98be22007-08-16 14:35:24 +0000199 unlink(os.path.join(dirname, modname + '.pyo'))
Guido van Rossum3bead091992-01-27 17:00:37 +0000200
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000201def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000202 """Test whether a resource is enabled. Known resources are set by
203 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000204 return use_resources is not None and resource in use_resources
205
Barry Warsawc0fb6052001-08-20 22:29:23 +0000206def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000207 """Raise ResourceDenied if the specified resource is not available.
208
209 If the caller's module is __main__ then automatically return True. The
210 possibility of False being returned occurs when regrtest.py is executing."""
Skip Montanarod839ecd2003-04-24 19:06:57 +0000211 # see if the caller's module is __main__ - if so, treat as if
212 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000213 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000214 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000215 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000216 if msg is None:
217 msg = "Use of the `%s' resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000218 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000219
Christian Heimes5e696852008-04-09 08:37:03 +0000220HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000221
Christian Heimes5e696852008-04-09 08:37:03 +0000222def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
223 """Returns an unused port that should be suitable for binding. This is
224 achieved by creating a temporary socket with the same family and type as
225 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
226 the specified host address (defaults to 0.0.0.0) with the port set to 0,
227 eliciting an unused ephemeral port from the OS. The temporary socket is
228 then closed and deleted, and the ephemeral port is returned.
229
230 Either this method or bind_port() should be used for any tests where a
231 server socket needs to be bound to a particular port for the duration of
232 the test. Which one to use depends on whether the calling code is creating
233 a python socket, or if an unused port needs to be provided in a constructor
234 or passed to an external program (i.e. the -accept argument to openssl's
235 s_server mode). Always prefer bind_port() over find_unused_port() where
236 possible. Hard coded ports should *NEVER* be used. As soon as a server
237 socket is bound to a hard coded port, the ability to run multiple instances
238 of the test simultaneously on the same host is compromised, which makes the
239 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
240 may simply manifest as a failed test, which can be recovered from without
241 intervention in most cases, but on Windows, the entire python process can
242 completely and utterly wedge, requiring someone to log in to the buildbot
243 and manually kill the affected process.
244
245 (This is easy to reproduce on Windows, unfortunately, and can be traced to
246 the SO_REUSEADDR socket option having different semantics on Windows versus
247 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
248 listen and then accept connections on identical host/ports. An EADDRINUSE
249 socket.error will be raised at some point (depending on the platform and
250 the order bind and listen were called on each socket).
251
252 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
253 will ever be raised when attempting to bind two identical host/ports. When
254 accept() is called on each socket, the second caller's process will steal
255 the port from the first caller, leaving them both in an awkwardly wedged
256 state where they'll no longer respond to any signals or graceful kills, and
257 must be forcibly killed via OpenProcess()/TerminateProcess().
258
259 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
260 instead of SO_REUSEADDR, which effectively affords the same semantics as
261 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
262 Source world compared to Windows ones, this is a common mistake. A quick
263 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
264 openssl.exe is called with the 's_server' option, for example. See
265 http://bugs.python.org/issue2550 for more info. The following site also
266 has a very thorough description about the implications of both REUSEADDR
267 and EXCLUSIVEADDRUSE on Windows:
268 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
269
270 XXX: although this approach is a vast improvement on previous attempts to
271 elicit unused ports, it rests heavily on the assumption that the ephemeral
272 port returned to us by the OS won't immediately be dished back out to some
273 other process when we close and delete our temporary socket but before our
274 calling code has a chance to bind the returned port. We can deal with this
275 issue if/when we come across it.
276 """
277
278 tempsock = socket.socket(family, socktype)
279 port = bind_port(tempsock)
280 tempsock.close()
281 del tempsock
282 return port
283
284def bind_port(sock, host=HOST):
285 """Bind the socket to a free port and return the port number. Relies on
286 ephemeral ports in order to ensure we are using an unbound port. This is
287 important as many tests may be running simultaneously, especially in a
288 buildbot environment. This method raises an exception if the sock.family
289 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
290 or SO_REUSEPORT set on it. Tests should *never* set these socket options
291 for TCP/IP sockets. The only case for setting these options is testing
292 multicasting via multiple UDP sockets.
293
294 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
295 on Windows), it will be set on the socket. This will prevent anyone else
296 from bind()'ing to our host/port for the duration of the test.
297 """
298
299 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
300 if hasattr(socket, 'SO_REUSEADDR'):
301 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
302 raise TestFailed("tests should never set the SO_REUSEADDR " \
303 "socket option on TCP/IP sockets!")
304 if hasattr(socket, 'SO_REUSEPORT'):
305 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
306 raise TestFailed("tests should never set the SO_REUSEPORT " \
307 "socket option on TCP/IP sockets!")
308 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
309 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
310
311 sock.bind((host, 0))
312 port = sock.getsockname()[1]
313 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000314
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000315FUZZ = 1e-6
316
317def fcmp(x, y): # fuzzy comparison function
Neal Norwitz79212992006-08-21 16:27:31 +0000318 if isinstance(x, float) or isinstance(y, float):
Fred Drake004d5e62000-10-23 17:22:08 +0000319 try:
Fred Drake004d5e62000-10-23 17:22:08 +0000320 fuzz = (abs(x) + abs(y)) * FUZZ
321 if abs(x-y) <= fuzz:
322 return 0
323 except:
324 pass
Neal Norwitz79212992006-08-21 16:27:31 +0000325 elif type(x) == type(y) and isinstance(x, (tuple, list)):
Fred Drake004d5e62000-10-23 17:22:08 +0000326 for i in range(min(len(x), len(y))):
327 outcome = fcmp(x[i], y[i])
Fred Drake132dce22000-12-12 23:11:42 +0000328 if outcome != 0:
Fred Drake004d5e62000-10-23 17:22:08 +0000329 return outcome
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000330 return (len(x) > len(y)) - (len(x) < len(y))
331 return (x > y) - (x < y)
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000332
Finn Bock57bc5fa2002-11-01 18:02:03 +0000333is_jython = sys.platform.startswith('java')
334
Barry Warsaw559f6682001-03-23 18:04:02 +0000335# Filename used for testing
336if os.name == 'java':
337 # Jython disallows @ in module names
338 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000339else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000340 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000341
Antoine Pitrou88909542009-06-29 13:54:42 +0000342# Disambiguate TESTFN for parallel testing, while letting it remain a valid
343# module name.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000344TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
Antoine Pitrou88909542009-06-29 13:54:42 +0000345
346# Assuming sys.getfilesystemencoding()!=sys.getdefaultencoding()
347# TESTFN_UNICODE is a filename that can be encoded using the
348# file system encoding, but *not* with the default (ascii) encoding
349TESTFN_UNICODE = TESTFN + "-\xe0\xf2"
350TESTFN_ENCODING = sys.getfilesystemencoding()
351# TESTFN_UNICODE_UNENCODEABLE is a filename that should *not* be
352# able to be encoded by *either* the default or filesystem encoding.
353# This test really only makes sense on Windows NT platforms
354# which have special Unicode support in posixmodule.
355if (not hasattr(sys, "getwindowsversion") or
356 sys.getwindowsversion()[3] < 2): # 0=win32s or 1=9x/ME
357 TESTFN_UNICODE_UNENCODEABLE = None
358else:
359 # Japanese characters (I think - from bug 846133)
360 TESTFN_UNICODE_UNENCODEABLE = TESTFN + "-\u5171\u6709\u3055\u308c\u308b"
361 try:
362 # XXX - Note - should be using TESTFN_ENCODING here - but for
363 # Windows, "mbcs" currently always operates as if in
364 # errors=ignore' mode - hence we get '?' characters rather than
365 # the exception. 'Latin1' operates as we expect - ie, fails.
366 # See [ 850997 ] mbcs encoding ignores errors
367 TESTFN_UNICODE_UNENCODEABLE.encode("Latin1")
368 except UnicodeEncodeError:
369 pass
Walter Dörwald9b775532007-06-08 14:30:53 +0000370 else:
Antoine Pitrou88909542009-06-29 13:54:42 +0000371 print('WARNING: The filename %r CAN be encoded by the filesystem. '
372 'Unicode filename tests may not be effective'
373 % TESTFN_UNICODE_UNENCODEABLE)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000374
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000375# Save the initial cwd
376SAVEDCWD = os.getcwd()
377
378@contextlib.contextmanager
379def temp_cwd(name='tempcwd', quiet=False):
380 """
381 Context manager that creates a temporary directory and set it as CWD.
382
383 The new CWD is created in the current directory and it's named *name*.
384 If *quiet* is False (default) and it's not possible to create or change
385 the CWD, an error is raised. If it's True, only a warning is raised
386 and the original CWD is used.
387 """
388 saved_dir = os.getcwd()
389 is_temporary = False
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000390 try:
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000391 os.mkdir(name)
392 os.chdir(name)
393 is_temporary = True
394 except OSError:
395 if not quiet:
396 raise
397 warnings.warn('tests may fail, unable to change the CWD to ' + name,
398 RuntimeWarning, stacklevel=3)
399 try:
400 yield os.getcwd()
401 finally:
402 os.chdir(saved_dir)
403 if is_temporary:
404 rmtree(name)
405
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000406
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000407def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000408 """Try to find a file on sys.path and the working directory. If it is not
409 found the argument passed to the function is returned (this does not
410 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000411 if os.path.isabs(file):
412 return file
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000413 if subdir is not None:
414 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000415 path = sys.path
416 path = [os.path.dirname(here)] + path
417 for dn in path:
418 fn = os.path.join(dn, file)
419 if os.path.exists(fn): return fn
420 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000421
Tim Peters2f228e72001-05-13 00:19:31 +0000422def sortdict(dict):
423 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000424 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000425 reprpairs = ["%r: %r" % pair for pair in items]
426 withcommas = ", ".join(reprpairs)
427 return "{%s}" % withcommas
428
Benjamin Peterson7522c742009-01-19 21:00:09 +0000429def make_bad_fd():
430 """
431 Create an invalid file descriptor by opening and closing a file and return
432 its fd.
433 """
434 file = open(TESTFN, "wb")
435 try:
436 return file.fileno()
437 finally:
438 file.close()
439 unlink(TESTFN)
440
Thomas Wouters89f507f2006-12-13 04:49:30 +0000441def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000442 testcase.assertRaises(SyntaxError, compile, statement,
443 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000444
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000445def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000446 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000447
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000448 check = kw.pop('check', None)
449
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000450 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000451
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000452 fn = os.path.join(os.path.dirname(__file__), "data", filename)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000453
454 def check_valid_file(fn):
455 f = open(fn, *args, **kw)
456 if check is None:
457 return f
458 elif check(f):
459 f.seek(0)
460 return f
461 f.close()
462
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000463 if os.path.exists(fn):
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000464 f = check_valid_file(fn)
465 if f is not None:
466 return f
467 unlink(fn)
468
469 # Verify the requirement before downloading the file
470 requires('urlfetch')
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000471
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000472 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitroufd0680b2009-11-01 22:13:48 +0000473 f = urllib.request.urlopen(url, timeout=15)
474 try:
475 with open(fn, "wb") as out:
476 s = f.read()
477 while s:
478 out.write(s)
479 s = f.read()
480 finally:
481 f.close()
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000482
483 f = check_valid_file(fn)
484 if f is not None:
485 return f
486 raise TestFailed('invalid resource "%s"' % fn)
487
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000488
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000489class WarningsRecorder(object):
490 """Convenience wrapper for the warnings list returned on
491 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000492 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000493 def __init__(self, warnings_list):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000494 self._warnings = warnings_list
495 self._last = 0
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000496
497 def __getattr__(self, attr):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000498 if len(self._warnings) > self._last:
499 return getattr(self._warnings[-1], attr)
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000500 elif attr in warnings.WarningMessage._WARNING_DETAILS:
501 return None
502 raise AttributeError("%r has no attribute %r" % (self, attr))
503
Florent Xiclunab14930c2010-03-13 15:26:44 +0000504 @property
505 def warnings(self):
506 return self._warnings[self._last:]
507
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000508 def reset(self):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000509 self._last = len(self._warnings)
510
511
512def _filterwarnings(filters, quiet=False):
513 """Catch the warnings, then check if all the expected
514 warnings have been raised and re-raise unexpected warnings.
515 If 'quiet' is True, only re-raise the unexpected warnings.
516 """
517 # Clear the warning registry of the calling module
518 # in order to re-raise the warnings.
519 frame = sys._getframe(2)
520 registry = frame.f_globals.get('__warningregistry__')
521 if registry:
522 registry.clear()
523 with warnings.catch_warnings(record=True) as w:
524 # Set filter "always" to record all warnings. Because
525 # test_warnings swap the module, we need to look up in
526 # the sys.modules dictionary.
527 sys.modules['warnings'].simplefilter("always")
528 yield WarningsRecorder(w)
529 # Filter the recorded warnings
530 reraise = [warning.message for warning in w]
531 missing = []
532 for msg, cat in filters:
533 seen = False
534 for exc in reraise[:]:
535 message = str(exc)
536 # Filter out the matching messages
537 if (re.match(msg, message, re.I) and
538 issubclass(exc.__class__, cat)):
539 seen = True
540 reraise.remove(exc)
541 if not seen and not quiet:
542 # This filter caught nothing
543 missing.append((msg, cat.__name__))
544 if reraise:
545 raise AssertionError("unhandled warning %r" % reraise[0])
546 if missing:
547 raise AssertionError("filter (%r, %s) did not catch any warning" %
548 missing[0])
549
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000550
551@contextlib.contextmanager
Florent Xiclunab14930c2010-03-13 15:26:44 +0000552def check_warnings(*filters, **kwargs):
553 """Context manager to silence warnings.
554
555 Accept 2-tuples as positional arguments:
556 ("message regexp", WarningCategory)
557
558 Optional argument:
559 - if 'quiet' is True, it does not fail if a filter catches nothing
Florent Xicluna53b506be2010-03-18 20:00:57 +0000560 (default True without argument,
561 default False if some filters are defined)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000562
563 Without argument, it defaults to:
Florent Xicluna53b506be2010-03-18 20:00:57 +0000564 check_warnings(("", Warning), quiet=True)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000565 """
Florent Xicluna53b506be2010-03-18 20:00:57 +0000566 quiet = kwargs.get('quiet')
Florent Xiclunab14930c2010-03-13 15:26:44 +0000567 if not filters:
568 filters = (("", Warning),)
Florent Xicluna53b506be2010-03-18 20:00:57 +0000569 # Preserve backward compatibility
570 if quiet is None:
571 quiet = True
572 return _filterwarnings(filters, quiet)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000573
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000574
575class CleanImport(object):
576 """Context manager to force import to return a new module reference.
577
578 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000579 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000580
581 Use like this:
582
583 with CleanImport("foo"):
Brett Cannonddb5e702010-02-03 22:16:11 +0000584 importlib.import_module("foo") # new reference
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000585 """
586
587 def __init__(self, *module_names):
588 self.original_modules = sys.modules.copy()
589 for module_name in module_names:
590 if module_name in sys.modules:
591 module = sys.modules[module_name]
592 # It is possible that module_name is just an alias for
593 # another module (e.g. stub for modules renamed in 3.x).
594 # In that case, we also need delete the real module to clear
595 # the import cache.
596 if module.__name__ != module_name:
597 del sys.modules[module.__name__]
598 del sys.modules[module_name]
599
600 def __enter__(self):
601 return self
602
603 def __exit__(self, *ignore_exc):
604 sys.modules.update(self.original_modules)
605
606
Walter Dörwald155374d2009-05-01 19:58:58 +0000607class EnvironmentVarGuard(collections.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000608
609 """Class to help protect the environment variable properly. Can be used as
610 a context manager."""
611
612 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000613 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000614 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000615
Walter Dörwald155374d2009-05-01 19:58:58 +0000616 def __getitem__(self, envvar):
617 return self._environ[envvar]
618
619 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000620 # Remember the initial value on the first access
621 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +0000622 self._changed[envvar] = self._environ.get(envvar)
623 self._environ[envvar] = value
624
625 def __delitem__(self, envvar):
626 # Remember the initial value on the first access
627 if envvar not in self._changed:
628 self._changed[envvar] = self._environ.get(envvar)
629 if envvar in self._environ:
630 del self._environ[envvar]
631
632 def keys(self):
633 return self._environ.keys()
634
635 def __iter__(self):
636 return iter(self._environ)
637
638 def __len__(self):
639 return len(self._environ)
640
641 def set(self, envvar, value):
642 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000643
644 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +0000645 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000646
647 def __enter__(self):
648 return self
649
650 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000651 for (k, v) in self._changed.items():
652 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +0000653 if k in self._environ:
654 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +0000655 else:
Walter Dörwald155374d2009-05-01 19:58:58 +0000656 self._environ[k] = v
Nick Coghlan6ead5522009-10-18 13:19:33 +0000657 os.environ = self._environ
658
659
660class DirsOnSysPath(object):
661 """Context manager to temporarily add directories to sys.path.
662
663 This makes a copy of sys.path, appends any directories given
664 as positional arguments, then reverts sys.path to the copied
665 settings when the context ends.
666
667 Note that *all* sys.path modifications in the body of the
668 context manager, including replacement of the object,
669 will be reverted at the end of the block.
670 """
671
672 def __init__(self, *paths):
673 self.original_value = sys.path[:]
674 self.original_object = sys.path
675 sys.path.extend(paths)
676
677 def __enter__(self):
678 return self
679
680 def __exit__(self, *ignore_exc):
681 sys.path = self.original_object
682 sys.path[:] = self.original_value
Walter Dörwald155374d2009-05-01 19:58:58 +0000683
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000684
Guido van Rossumd8faa362007-04-27 19:54:29 +0000685class TransientResource(object):
686
687 """Raise ResourceDenied if an exception is raised while the context manager
688 is in effect that matches the specified exception and attributes."""
689
690 def __init__(self, exc, **kwargs):
691 self.exc = exc
692 self.attrs = kwargs
693
694 def __enter__(self):
695 return self
696
697 def __exit__(self, type_=None, value=None, traceback=None):
698 """If type_ is a subclass of self.exc and value has attributes matching
699 self.attrs, raise ResourceDenied. Otherwise let the exception
700 propagate (if any)."""
701 if type_ is not None and issubclass(self.exc, type_):
702 for attr, attr_value in self.attrs.items():
703 if not hasattr(value, attr):
704 break
705 if getattr(value, attr) != attr_value:
706 break
707 else:
708 raise ResourceDenied("an optional resource is not available")
709
710
Raymond Hettinger686057b2009-06-04 00:11:54 +0000711# Context managers that raise ResourceDenied when various issues
712# with the Internet connection manifest themselves as exceptions.
713time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
714socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
715ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000716
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000717
Thomas Woutersed03b412007-08-28 21:37:11 +0000718@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000719def captured_output(stream_name):
720 """Run the 'with' statement body using a StringIO object in place of a
721 specific attribute on the sys module.
722 Example use (with 'stream_name=stdout')::
Thomas Woutersed03b412007-08-28 21:37:11 +0000723
724 with captured_stdout() as s:
Neal Norwitz752abd02008-05-13 04:55:24 +0000725 print("hello")
Thomas Woutersed03b412007-08-28 21:37:11 +0000726 assert s.getvalue() == "hello"
727 """
728 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000729 orig_stdout = getattr(sys, stream_name)
730 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000731 try:
732 yield getattr(sys, stream_name)
733 finally:
734 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000735
736def captured_stdout():
737 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +0000738
Nick Coghlan6ead5522009-10-18 13:19:33 +0000739def captured_stdin():
740 return captured_output("stdin")
741
Benjamin Petersone549ead2009-03-28 21:42:05 +0000742def gc_collect():
743 """Force as many objects as possible to be collected.
744
745 In non-CPython implementations of Python, this is needed because timely
746 deallocation is not guaranteed by the garbage collector. (Even in CPython
747 this can be the case in case of reference cycles.) This means that __del__
748 methods may be called later than expected and weakrefs may remain alive for
749 longer than expected. This function tries its best to force all garbage
750 objects to disappear.
751 """
Benjamin Petersone549ead2009-03-28 21:42:05 +0000752 gc.collect()
753 gc.collect()
754 gc.collect()
755
Thomas Woutersed03b412007-08-28 21:37:11 +0000756
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000757#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +0000758# Decorator for running a function in a different locale, correctly resetting
759# it afterwards.
760
761def run_with_locale(catstr, *locales):
762 def decorator(func):
763 def inner(*args, **kwds):
764 try:
765 import locale
766 category = getattr(locale, catstr)
767 orig_locale = locale.setlocale(category)
768 except AttributeError:
769 # if the test author gives us an invalid category string
770 raise
771 except:
772 # cannot retrieve original locale, so do nothing
773 locale = orig_locale = None
774 else:
775 for loc in locales:
776 try:
777 locale.setlocale(category, loc)
778 break
779 except:
780 pass
781
782 # now run the function, resetting the locale on exceptions
783 try:
784 return func(*args, **kwds)
785 finally:
786 if locale and orig_locale:
787 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +0000788 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +0000789 inner.__doc__ = func.__doc__
790 return inner
791 return decorator
792
793#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +0000794# Big-memory-test support. Separate from 'resources' because memory use
795# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000796
797# Some handy shorthands. Note that these are used for byte-limits as well
798# as size-limits, in the various bigmem tests
799_1M = 1024*1024
800_1G = 1024 * _1M
801_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000802_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +0000803
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000804MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000805
Thomas Wouters477c8d52006-05-27 19:21:47 +0000806def set_memlimit(limit):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000807 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000808 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000809 sizes = {
810 'k': 1024,
811 'm': _1M,
812 'g': _1G,
813 't': 1024*_1G,
814 }
815 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
816 re.IGNORECASE | re.VERBOSE)
817 if m is None:
818 raise ValueError('Invalid memory limit %r' % (limit,))
819 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000820 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000821 if memlimit > MAX_Py_ssize_t:
822 memlimit = MAX_Py_ssize_t
823 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000824 raise ValueError('Memory limit %r too low to be useful' % (limit,))
825 max_memuse = memlimit
826
827def bigmemtest(minsize, memuse, overhead=5*_1M):
828 """Decorator for bigmem tests.
829
830 'minsize' is the minimum useful size for the test (in arbitrary,
831 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
832 the test, or a good estimate of it. 'overhead' specifies fixed overhead,
Christian Heimes33fe8092008-04-13 13:53:33 +0000833 independent of the testsize, and defaults to 5Mb.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000834
835 The decorator tries to guess a good value for 'size' and passes it to
836 the decorated test function. If minsize * memuse is more than the
837 allowed memory use (as defined by max_memuse), the test is skipped.
838 Otherwise, minsize is adjusted upward to use up to max_memuse.
839 """
840 def decorator(f):
841 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000842 # Retrieve values in case someone decided to adjust them
843 minsize = wrapper.minsize
844 memuse = wrapper.memuse
845 overhead = wrapper.overhead
Thomas Wouters477c8d52006-05-27 19:21:47 +0000846 if not max_memuse:
847 # If max_memuse is 0 (the default),
848 # we still want to run the tests with size set to a few kb,
849 # to make sure they work. We still want to avoid using
850 # too much memory, though, but we do that noisily.
851 maxsize = 5147
Benjamin Peterson46d44402009-07-01 00:45:43 +0000852 self.assertFalse(maxsize * memuse + overhead > 20 * _1M)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000853 else:
854 maxsize = int((max_memuse - overhead) / memuse)
855 if maxsize < minsize:
856 # Really ought to print 'test skipped' or something
857 if verbose:
858 sys.stderr.write("Skipping %s because of memory "
859 "constraint\n" % (f.__name__,))
860 return
861 # Try to keep some breathing room in memory use
862 maxsize = max(maxsize - 50 * _1M, minsize)
863 return f(self, maxsize)
864 wrapper.minsize = minsize
865 wrapper.memuse = memuse
866 wrapper.overhead = overhead
867 return wrapper
868 return decorator
869
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000870def precisionbigmemtest(size, memuse, overhead=5*_1M):
871 def decorator(f):
872 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000873 size = wrapper.size
874 memuse = wrapper.memuse
875 overhead = wrapper.overhead
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000876 if not real_max_memuse:
877 maxsize = 5147
878 else:
879 maxsize = size
880
881 if real_max_memuse and real_max_memuse < maxsize * memuse:
882 if verbose:
883 sys.stderr.write("Skipping %s because of memory "
884 "constraint\n" % (f.__name__,))
885 return
886
887 return f(self, maxsize)
888 wrapper.size = size
889 wrapper.memuse = memuse
890 wrapper.overhead = overhead
891 return wrapper
892 return decorator
893
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000894def bigaddrspacetest(f):
895 """Decorator for tests that fill the address space."""
896 def wrapper(self):
897 if max_memuse < MAX_Py_ssize_t:
898 if verbose:
899 sys.stderr.write("Skipping %s because of memory "
900 "constraint\n" % (f.__name__,))
901 else:
902 return f(self)
903 return wrapper
904
Thomas Wouters477c8d52006-05-27 19:21:47 +0000905#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +0000906# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000907
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000908class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000909 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000910 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000911 test(result)
912 return result
913
Benjamin Petersone549ead2009-03-28 21:42:05 +0000914def _id(obj):
915 return obj
916
917def requires_resource(resource):
918 if resource_is_enabled(resource):
919 return _id
920 else:
921 return unittest.skip("resource {0!r} is not enabled".format(resource))
922
923def cpython_only(test):
924 """
925 Decorator for tests only applicable on CPython.
926 """
927 return impl_detail(cpython=True)(test)
928
929def impl_detail(msg=None, **guards):
930 if check_impl_detail(**guards):
931 return _id
932 if msg is None:
933 guardnames, default = _parse_guards(guards)
934 if default:
935 msg = "implementation detail not available on {0}"
936 else:
937 msg = "implementation detail specific to {0}"
938 guardnames = sorted(guardnames.keys())
939 msg = msg.format(' or '.join(guardnames))
940 return unittest.skip(msg)
941
942def _parse_guards(guards):
943 # Returns a tuple ({platform_name: run_me}, default_value)
944 if not guards:
945 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +0000946 is_true = list(guards.values())[0]
947 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +0000948 return (guards, not is_true)
949
950# Use the following check to guard CPython's implementation-specific tests --
951# or to run them only on the implementation(s) guarded by the arguments.
952def check_impl_detail(**guards):
953 """This function returns True or False depending on the host platform.
954 Examples:
955 if check_impl_detail(): # only on CPython (default)
956 if check_impl_detail(jython=True): # only on Jython
957 if check_impl_detail(cpython=False): # everywhere except on CPython
958 """
959 guards, default = _parse_guards(guards)
960 return guards.get(platform.python_implementation().lower(), default)
961
962
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000963
Guido van Rossumd8faa362007-04-27 19:54:29 +0000964def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +0000965 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000966 if verbose:
Fred Drake84a59342001-03-23 04:21:17 +0000967 runner = unittest.TextTestRunner(sys.stdout, verbosity=2)
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000968 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000969 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000970
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000971 result = runner.run(suite)
972 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +0000973 if len(result.errors) == 1 and not result.failures:
974 err = result.errors[0][1]
975 elif len(result.failures) == 1 and not result.errors:
976 err = result.failures[0][1]
977 else:
R. David Murray723357e2009-10-19 18:06:17 +0000978 err = "multiple errors occurred"
979 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +0000980 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +0000981
Barry Warsawc10d6902001-09-20 06:30:41 +0000982
Walter Dörwald21d3a322003-05-01 17:45:56 +0000983def run_unittest(*classes):
984 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +0000985 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000986 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000987 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000988 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000989 if cls in sys.modules:
990 suite.addTest(unittest.findTestCases(sys.modules[cls]))
991 else:
992 raise ValueError("str arguments must be keys in sys.modules")
993 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +0000994 suite.addTest(cls)
995 else:
996 suite.addTest(unittest.makeSuite(cls))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000997 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000998
Barry Warsawc10d6902001-09-20 06:30:41 +0000999
Tim Petersa0a62222001-09-09 06:12:01 +00001000#=======================================================================
1001# doctest driver.
1002
1003def run_doctest(module, verbosity=None):
Tim Peters17111f32001-10-03 04:08:26 +00001004 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +00001005
1006 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001007 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +00001008 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +00001009 """
1010
1011 import doctest
1012
1013 if verbosity is None:
1014 verbosity = verbose
1015 else:
1016 verbosity = None
1017
Tim Peters342ca752001-09-25 19:13:20 +00001018 # Direct doctest output (normally just errors) to real stdout; doctest
1019 # output shouldn't be compared by regrtest.
1020 save_stdout = sys.stdout
Tim Peters8dee8092001-09-25 20:05:11 +00001021 sys.stdout = get_original_stdout()
Tim Peters342ca752001-09-25 19:13:20 +00001022 try:
1023 f, t = doctest.testmod(module, verbose=verbosity)
1024 if f:
1025 raise TestFailed("%d of %d doctests failed" % (f, t))
1026 finally:
1027 sys.stdout = save_stdout
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001028 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001029 print('doctest (%s) ... %d tests with zero failures' %
1030 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001031 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001032
Antoine Pitrou060cee22009-11-13 16:29:04 +00001033
1034#=======================================================================
1035# Support for saving and restoring the imported modules.
1036
1037def modules_setup():
1038 return sys.modules.copy(),
1039
1040def modules_cleanup(oldmodules):
1041 # Encoders/decoders are registered permanently within the internal
1042 # codec cache. If we destroy the corresponding modules their
1043 # globals will be set to None which will trip up the cached functions.
1044 encodings = [(k, v) for k, v in sys.modules.items()
1045 if k.startswith('encodings.')]
1046 sys.modules.clear()
1047 sys.modules.update(encodings)
1048 sys.modules.update(oldmodules)
1049
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001050#=======================================================================
1051# Threading support to prevent reporting refleaks when running regrtest.py -R
1052
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001053# NOTE: we use thread._count() rather than threading.enumerate() (or the
1054# moral equivalent thereof) because a threading.Thread object is still alive
1055# until its __bootstrap() method has returned, even after it has been
1056# unregistered from the threading module.
1057# thread._count(), on the other hand, only gets decremented *after* the
1058# __bootstrap() method has returned, which gives us reliable reference counts
1059# at the end of a test run.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001060
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001061def threading_setup():
1062 import _thread
1063 return _thread._count(),
1064
1065def threading_cleanup(nb_threads):
1066 import _thread
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001067 import time
1068
1069 _MAX_COUNT = 10
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001070 for count in range(_MAX_COUNT):
1071 n = _thread._count()
1072 if n == nb_threads:
1073 break
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001074 time.sleep(0.1)
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001075 # XXX print a warning in case of failure?
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001076
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001077def reap_threads(func):
1078 @functools.wraps(func)
1079 def decorator(*args):
1080 key = threading_setup()
1081 try:
1082 return func(*args)
1083 finally:
1084 threading_cleanup(*key)
1085 return decorator
1086
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001087def reap_children():
1088 """Use this function at the end of test_main() whenever sub-processes
1089 are started. This will help ensure that no extra children (zombies)
1090 stick around to hog resources and create problems when looking
1091 for refleaks.
1092 """
1093
1094 # Reap all our dead child processes so we don't leave zombies around.
1095 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001096 if hasattr(os, 'waitpid'):
1097 any_process = -1
1098 while True:
1099 try:
1100 # This will raise an exception on Windows. That's ok.
1101 pid, status = os.waitpid(any_process, os.WNOHANG)
1102 if pid == 0:
1103 break
1104 except:
1105 break
Collin Winterf2bf2b32010-03-17 00:41:56 +00001106
1107@contextlib.contextmanager
1108def swap_attr(obj, attr, new_val):
1109 """Temporary swap out an attribute with a new object.
1110
1111 Usage:
1112 with swap_attr(obj, "attr", 5):
1113 ...
1114
1115 This will set obj.attr to 5 for the duration of the with: block,
1116 restoring the old value at the end of the block. If `attr` doesn't
1117 exist on `obj`, it will be created and then deleted at the end of the
1118 block.
1119 """
1120 if hasattr(obj, attr):
1121 real_val = getattr(obj, attr)
1122 setattr(obj, attr, new_val)
1123 try:
1124 yield
1125 finally:
1126 setattr(obj, attr, real_val)
1127 else:
1128 setattr(obj, attr, new_val)
1129 try:
1130 yield
1131 finally:
1132 delattr(obj, attr)
1133
1134@contextlib.contextmanager
1135def swap_item(obj, item, new_val):
1136 """Temporary swap out an item with a new object.
1137
1138 Usage:
1139 with swap_item(obj, "item", 5):
1140 ...
1141
1142 This will set obj["item"] to 5 for the duration of the with: block,
1143 restoring the old value at the end of the block. If `item` doesn't
1144 exist on `obj`, it will be created and then deleted at the end of the
1145 block.
1146 """
1147 if item in obj:
1148 real_val = obj[item]
1149 obj[item] = new_val
1150 try:
1151 yield
1152 finally:
1153 obj[item] = real_val
1154 else:
1155 obj[item] = new_val
1156 try:
1157 yield
1158 finally:
1159 del obj[item]