blob: 09846a85a2019e3dbb2fde51f2e0a1513c30724a [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
Brian Curtind40e6f72010-07-08 21:39:08 +000020import subprocess
Barry Warsaw28a691b2010-04-17 00:19:56 +000021import imp
Benjamin Petersona6590e82010-04-11 21:22:10 +000022import time
Benjamin Peterson65c66ab2010-10-29 21:31:35 +000023import sysconfig
Vinay Sajip129fd042010-12-10 08:19:38 +000024import logging.handlers
Benjamin Peterson65c66ab2010-10-29 21:31:35 +000025
Victor Stinner45df8202010-04-28 22:31:17 +000026try:
Antoine Pitrou707f2282011-07-15 22:29:44 +020027 import _thread, threading
Victor Stinner45df8202010-04-28 22:31:17 +000028except ImportError:
29 _thread = None
Antoine Pitrou707f2282011-07-15 22:29:44 +020030 threading = None
31try:
32 import multiprocessing.process
33except ImportError:
34 multiprocessing = None
35
Fred Drakecd1b1dd2001-03-21 18:26:33 +000036
Barry Warsaw28a691b2010-04-17 00:19:56 +000037__all__ = [
38 "Error", "TestFailed", "ResourceDenied", "import_module",
39 "verbose", "use_resources", "max_memuse", "record_original_stdout",
40 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
Victor Stinner88701e22011-06-01 13:13:04 +020041 "is_resource_enabled", "requires", "requires_mac_ver",
42 "find_unused_port", "bind_port",
Barry Warsaw28a691b2010-04-17 00:19:56 +000043 "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "SAVEDCWD", "temp_cwd",
44 "findfile", "sortdict", "check_syntax_error", "open_urlresource",
45 "check_warnings", "CleanImport", "EnvironmentVarGuard",
46 "TransientResource", "captured_output", "captured_stdout",
Ezio Melotti07352b02011-05-14 14:51:18 +030047 "captured_stdin", "captured_stderr",
Barry Warsaw28a691b2010-04-17 00:19:56 +000048 "time_out", "socket_peer_reset", "ioerror_peer_reset",
Antoine Pitroua88c83c2010-09-07 20:42:19 +000049 "run_with_locale", 'temp_umask', "transient_internet",
Barry Warsaw28a691b2010-04-17 00:19:56 +000050 "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
51 "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
52 "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
Vinay Sajip129fd042010-12-10 08:19:38 +000053 "swap_item", "swap_attr", "requires_IEEE_754",
Benjamin Peterson31dc3732011-05-08 15:34:24 -050054 "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
Antoine Pitrou216a3bc2011-07-23 22:33:39 +020055 "import_fresh_module", "failfast",
Antoine Pitrou4d7979b2010-09-07 21:22:56 +000056 ]
Florent Xiclunaf089fd62010-03-19 14:25:03 +000057
Fred Drake1790dd42000-07-24 06:55:00 +000058class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000059 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000060
61class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000062 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000063
Benjamin Petersone549ead2009-03-28 21:42:05 +000064class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000065 """Test skipped because it requested a disallowed resource.
66
67 This is raised when a test calls requires() for a resource that
68 has not be enabled. It is used to distinguish between expected
69 and unexpected skips.
70 """
71
Nick Coghlanfce769e2009-04-11 14:30:59 +000072@contextlib.contextmanager
73def _ignore_deprecated_imports(ignore=True):
74 """Context manager to suppress package and module deprecation
75 warnings when importing them.
76
77 If ignore is False, this context manager has no effect."""
78 if ignore:
79 with warnings.catch_warnings():
80 warnings.filterwarnings("ignore", ".+ (module|package)",
81 DeprecationWarning)
82 yield
83 else:
84 yield
85
86
Benjamin Peterson699adb92008-05-08 22:27:58 +000087def import_module(name, deprecated=False):
R. David Murraya21e4ca2009-03-31 23:16:50 +000088 """Import and return the module to be tested, raising SkipTest if
89 it is not available.
90
91 If deprecated is True, any module or package deprecation messages
92 will be suppressed."""
Nick Coghlanfce769e2009-04-11 14:30:59 +000093 with _ignore_deprecated_imports(deprecated):
Benjamin Peterson699adb92008-05-08 22:27:58 +000094 try:
Nick Coghlanfce769e2009-04-11 14:30:59 +000095 return importlib.import_module(name)
R. David Murraya21e4ca2009-03-31 23:16:50 +000096 except ImportError as msg:
97 raise unittest.SkipTest(str(msg))
Nick Coghlanfce769e2009-04-11 14:30:59 +000098
99
Nick Coghlan47384702009-04-22 16:13:36 +0000100def _save_and_remove_module(name, orig_modules):
101 """Helper function to save and remove a module from sys.modules
102
Ezio Melotti199e0852011-05-09 06:41:55 +0300103 Raise ImportError if the module can't be imported."""
Ezio Melottifec3ad12011-05-14 06:02:25 +0300104 # try to import the module and raise an error if it can't be imported
105 if name not in sys.modules:
Ezio Melotti199e0852011-05-09 06:41:55 +0300106 __import__(name)
Nick Coghlan47384702009-04-22 16:13:36 +0000107 del sys.modules[name]
Ezio Melottifec3ad12011-05-14 06:02:25 +0300108 for modname in list(sys.modules):
109 if modname == name or modname.startswith(name + '.'):
110 orig_modules[modname] = sys.modules[modname]
111 del sys.modules[modname]
Nick Coghlan47384702009-04-22 16:13:36 +0000112
113def _save_and_block_module(name, orig_modules):
114 """Helper function to save and block a module in sys.modules
115
Ezio Melotti199e0852011-05-09 06:41:55 +0300116 Return True if the module was in sys.modules, False otherwise."""
Nick Coghlan47384702009-04-22 16:13:36 +0000117 saved = True
118 try:
119 orig_modules[name] = sys.modules[name]
120 except KeyError:
121 saved = False
Alexander Belopolsky903396e2010-07-13 14:50:16 +0000122 sys.modules[name] = None
Nick Coghlan47384702009-04-22 16:13:36 +0000123 return saved
124
125
126def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000127 """Imports and returns a module, deliberately bypassing the sys.modules cache
128 and importing a fresh copy of the module. Once the import is complete,
129 the sys.modules cache is restored to its original state.
130
Nick Coghlan47384702009-04-22 16:13:36 +0000131 Modules named in fresh are also imported anew if needed by the import.
Ezio Melotti199e0852011-05-09 06:41:55 +0300132 If one of these modules can't be imported, None is returned.
Nick Coghlan47384702009-04-22 16:13:36 +0000133
134 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000135 takes place.
136
137 If deprecated is True, any module or package deprecation messages
138 will be suppressed."""
Ezio Melotti6b60fb92011-05-14 06:47:51 +0300139 # NOTE: test_heapq, test_json and test_warnings include extra sanity checks
140 # to make sure that this utility function is working as expected
Nick Coghlanfce769e2009-04-11 14:30:59 +0000141 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000142 # Keep track of modules saved for later restoration as well
143 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000144 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000145 names_to_remove = []
146 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000147 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000148 for fresh_name in fresh:
149 _save_and_remove_module(fresh_name, orig_modules)
150 for blocked_name in blocked:
151 if not _save_and_block_module(blocked_name, orig_modules):
152 names_to_remove.append(blocked_name)
153 fresh_module = importlib.import_module(name)
Ezio Melotti199e0852011-05-09 06:41:55 +0300154 except ImportError:
155 fresh_module = None
Nick Coghlanfce769e2009-04-11 14:30:59 +0000156 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000157 for orig_name, module in orig_modules.items():
158 sys.modules[orig_name] = module
159 for name_to_remove in names_to_remove:
160 del sys.modules[name_to_remove]
161 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000162
Benjamin Peterson699adb92008-05-08 22:27:58 +0000163
R. David Murraya21e4ca2009-03-31 23:16:50 +0000164def get_attribute(obj, name):
165 """Get an attribute, raising SkipTest if AttributeError is raised."""
166 try:
167 attribute = getattr(obj, name)
168 except AttributeError:
169 raise unittest.SkipTest("module %s has no attribute %s" % (
170 obj.__name__, name))
171 else:
172 return attribute
173
Barry Warsawc0fb6052001-08-20 22:29:23 +0000174verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000175use_resources = None # Flag set to [] by regrtest.py
176max_memuse = 0 # Disable bigmem tests (they will still be run with
177 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000178real_max_memuse = 0
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200179failfast = False
Guido van Rossum531661c1996-12-20 02:58:22 +0000180
Tim Peters8dee8092001-09-25 20:05:11 +0000181# _original_stdout is meant to hold stdout at the time regrtest began.
182# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
183# The point is to have some flavor of stdout the user can actually see.
184_original_stdout = None
185def record_original_stdout(stdout):
186 global _original_stdout
187 _original_stdout = stdout
188
189def get_original_stdout():
190 return _original_stdout or sys.stdout
191
Guido van Rossum3bead091992-01-27 17:00:37 +0000192def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000193 try:
194 del sys.modules[name]
195 except KeyError:
196 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000197
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000198def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000199 try:
200 os.unlink(filename)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000201 except OSError as error:
202 # The filename need not exist.
Michael Foord2d9c2d52010-05-04 22:29:10 +0000203 if error.errno not in (errno.ENOENT, errno.ENOTDIR):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000204 raise
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000205
Christian Heimes23daade02008-02-25 12:39:23 +0000206def rmtree(path):
207 try:
208 shutil.rmtree(path)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000209 except OSError as error:
Christian Heimes23daade02008-02-25 12:39:23 +0000210 # Unix returns ENOENT, Windows returns ESRCH.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000211 if error.errno not in (errno.ENOENT, errno.ESRCH):
Christian Heimes23daade02008-02-25 12:39:23 +0000212 raise
213
Barry Warsaw28a691b2010-04-17 00:19:56 +0000214def make_legacy_pyc(source):
215 """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
216
217 The choice of .pyc or .pyo extension is done based on the __debug__ flag
218 value.
219
220 :param source: The file system path to the source file. The source file
221 does not need to exist, however the PEP 3147 pyc file must exist.
222 :return: The file system path to the legacy pyc file.
223 """
224 pyc_file = imp.cache_from_source(source)
225 up_one = os.path.dirname(os.path.abspath(source))
226 legacy_pyc = os.path.join(up_one, source + ('c' if __debug__ else 'o'))
227 os.rename(pyc_file, legacy_pyc)
228 return legacy_pyc
229
Guido van Rossum3bead091992-01-27 17:00:37 +0000230def forget(modname):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000231 """'Forget' a module was ever imported.
232
233 This removes the module from sys.modules and deletes any PEP 3147 or
234 legacy .pyc and .pyo files.
235 """
Fred Drake004d5e62000-10-23 17:22:08 +0000236 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000237 for dirname in sys.path:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000238 source = os.path.join(dirname, modname + '.py')
239 # It doesn't matter if they exist or not, unlink all possible
240 # combinations of PEP 3147 and legacy pyc and pyo files.
241 unlink(source + 'c')
242 unlink(source + 'o')
243 unlink(imp.cache_from_source(source, debug_override=True))
244 unlink(imp.cache_from_source(source, debug_override=False))
Guido van Rossum3bead091992-01-27 17:00:37 +0000245
Antoine Pitrou4914f9e2011-02-26 16:49:08 +0000246# On some platforms, should not run gui test even if it is allowed
247# in `use_resources'.
248if sys.platform.startswith('win'):
249 import ctypes
250 import ctypes.wintypes
251 def _is_gui_available():
252 UOI_FLAGS = 1
253 WSF_VISIBLE = 0x0001
254 class USEROBJECTFLAGS(ctypes.Structure):
255 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
256 ("fReserved", ctypes.wintypes.BOOL),
257 ("dwFlags", ctypes.wintypes.DWORD)]
258 dll = ctypes.windll.user32
259 h = dll.GetProcessWindowStation()
260 if not h:
261 raise ctypes.WinError()
262 uof = USEROBJECTFLAGS()
263 needed = ctypes.wintypes.DWORD()
264 res = dll.GetUserObjectInformationW(h,
265 UOI_FLAGS,
266 ctypes.byref(uof),
267 ctypes.sizeof(uof),
268 ctypes.byref(needed))
269 if not res:
270 raise ctypes.WinError()
271 return bool(uof.dwFlags & WSF_VISIBLE)
272else:
273 def _is_gui_available():
274 return True
275
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000276def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000277 """Test whether a resource is enabled. Known resources are set by
278 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000279 return use_resources is not None and resource in use_resources
280
Barry Warsawc0fb6052001-08-20 22:29:23 +0000281def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000282 """Raise ResourceDenied if the specified resource is not available.
283
284 If the caller's module is __main__ then automatically return True. The
Barry Warsaw28a691b2010-04-17 00:19:56 +0000285 possibility of False being returned occurs when regrtest.py is
286 executing.
287 """
Antoine Pitrou4914f9e2011-02-26 16:49:08 +0000288 if resource == 'gui' and not _is_gui_available():
289 raise unittest.SkipTest("Cannot use the 'gui' resource")
Skip Montanarod839ecd2003-04-24 19:06:57 +0000290 # see if the caller's module is __main__ - if so, treat as if
291 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000292 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000293 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000294 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000295 if msg is None:
296 msg = "Use of the `%s' resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000297 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000298
Victor Stinner88701e22011-06-01 13:13:04 +0200299def requires_mac_ver(*min_version):
300 """Decorator raising SkipTest if the OS is Mac OS X and the OS X
301 version if less than min_version.
302
303 For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
304 is lesser than 10.5.
305 """
306 def decorator(func):
307 @functools.wraps(func)
308 def wrapper(*args, **kw):
309 if sys.platform == 'darwin':
310 version_txt = platform.mac_ver()[0]
311 try:
312 version = tuple(map(int, version_txt.split('.')))
313 except ValueError:
314 pass
315 else:
316 if version < min_version:
317 min_version_txt = '.'.join(map(str, min_version))
318 raise unittest.SkipTest(
319 "Mac OS X %s or higher required, not %s"
320 % (min_version_txt, version_txt))
321 return func(*args, **kw)
322 wrapper.min_version = min_version
323 return wrapper
324 return decorator
325
Christian Heimes5e696852008-04-09 08:37:03 +0000326HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000327
Christian Heimes5e696852008-04-09 08:37:03 +0000328def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
329 """Returns an unused port that should be suitable for binding. This is
330 achieved by creating a temporary socket with the same family and type as
331 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
332 the specified host address (defaults to 0.0.0.0) with the port set to 0,
333 eliciting an unused ephemeral port from the OS. The temporary socket is
334 then closed and deleted, and the ephemeral port is returned.
335
336 Either this method or bind_port() should be used for any tests where a
337 server socket needs to be bound to a particular port for the duration of
338 the test. Which one to use depends on whether the calling code is creating
339 a python socket, or if an unused port needs to be provided in a constructor
340 or passed to an external program (i.e. the -accept argument to openssl's
341 s_server mode). Always prefer bind_port() over find_unused_port() where
342 possible. Hard coded ports should *NEVER* be used. As soon as a server
343 socket is bound to a hard coded port, the ability to run multiple instances
344 of the test simultaneously on the same host is compromised, which makes the
345 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
346 may simply manifest as a failed test, which can be recovered from without
347 intervention in most cases, but on Windows, the entire python process can
348 completely and utterly wedge, requiring someone to log in to the buildbot
349 and manually kill the affected process.
350
351 (This is easy to reproduce on Windows, unfortunately, and can be traced to
352 the SO_REUSEADDR socket option having different semantics on Windows versus
353 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
354 listen and then accept connections on identical host/ports. An EADDRINUSE
355 socket.error will be raised at some point (depending on the platform and
356 the order bind and listen were called on each socket).
357
358 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
359 will ever be raised when attempting to bind two identical host/ports. When
360 accept() is called on each socket, the second caller's process will steal
361 the port from the first caller, leaving them both in an awkwardly wedged
362 state where they'll no longer respond to any signals or graceful kills, and
363 must be forcibly killed via OpenProcess()/TerminateProcess().
364
365 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
366 instead of SO_REUSEADDR, which effectively affords the same semantics as
367 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
368 Source world compared to Windows ones, this is a common mistake. A quick
369 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
370 openssl.exe is called with the 's_server' option, for example. See
371 http://bugs.python.org/issue2550 for more info. The following site also
372 has a very thorough description about the implications of both REUSEADDR
373 and EXCLUSIVEADDRUSE on Windows:
374 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
375
376 XXX: although this approach is a vast improvement on previous attempts to
377 elicit unused ports, it rests heavily on the assumption that the ephemeral
378 port returned to us by the OS won't immediately be dished back out to some
379 other process when we close and delete our temporary socket but before our
380 calling code has a chance to bind the returned port. We can deal with this
381 issue if/when we come across it.
382 """
383
384 tempsock = socket.socket(family, socktype)
385 port = bind_port(tempsock)
386 tempsock.close()
387 del tempsock
388 return port
389
390def bind_port(sock, host=HOST):
391 """Bind the socket to a free port and return the port number. Relies on
392 ephemeral ports in order to ensure we are using an unbound port. This is
393 important as many tests may be running simultaneously, especially in a
394 buildbot environment. This method raises an exception if the sock.family
395 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
396 or SO_REUSEPORT set on it. Tests should *never* set these socket options
397 for TCP/IP sockets. The only case for setting these options is testing
398 multicasting via multiple UDP sockets.
399
400 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
401 on Windows), it will be set on the socket. This will prevent anyone else
402 from bind()'ing to our host/port for the duration of the test.
403 """
404
405 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
406 if hasattr(socket, 'SO_REUSEADDR'):
407 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
408 raise TestFailed("tests should never set the SO_REUSEADDR " \
409 "socket option on TCP/IP sockets!")
410 if hasattr(socket, 'SO_REUSEPORT'):
411 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
412 raise TestFailed("tests should never set the SO_REUSEPORT " \
413 "socket option on TCP/IP sockets!")
414 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
415 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
416
417 sock.bind((host, 0))
418 port = sock.getsockname()[1]
419 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000420
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000421FUZZ = 1e-6
422
423def fcmp(x, y): # fuzzy comparison function
Neal Norwitz79212992006-08-21 16:27:31 +0000424 if isinstance(x, float) or isinstance(y, float):
Fred Drake004d5e62000-10-23 17:22:08 +0000425 try:
Fred Drake004d5e62000-10-23 17:22:08 +0000426 fuzz = (abs(x) + abs(y)) * FUZZ
427 if abs(x-y) <= fuzz:
428 return 0
429 except:
430 pass
Neal Norwitz79212992006-08-21 16:27:31 +0000431 elif type(x) == type(y) and isinstance(x, (tuple, list)):
Fred Drake004d5e62000-10-23 17:22:08 +0000432 for i in range(min(len(x), len(y))):
433 outcome = fcmp(x[i], y[i])
Fred Drake132dce22000-12-12 23:11:42 +0000434 if outcome != 0:
Fred Drake004d5e62000-10-23 17:22:08 +0000435 return outcome
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000436 return (len(x) > len(y)) - (len(x) < len(y))
437 return (x > y) - (x < y)
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000438
Eric Smithf24a0d92010-12-04 13:32:18 +0000439# decorator for skipping tests on non-IEEE 754 platforms
440requires_IEEE_754 = unittest.skipUnless(
441 float.__getformat__("double").startswith("IEEE"),
442 "test requires IEEE 754 doubles")
443
Finn Bock57bc5fa2002-11-01 18:02:03 +0000444is_jython = sys.platform.startswith('java')
445
Barry Warsaw559f6682001-03-23 18:04:02 +0000446# Filename used for testing
447if os.name == 'java':
448 # Jython disallows @ in module names
449 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000450else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000451 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000452
Antoine Pitrou88909542009-06-29 13:54:42 +0000453# Disambiguate TESTFN for parallel testing, while letting it remain a valid
454# module name.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000455TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
Antoine Pitrou88909542009-06-29 13:54:42 +0000456
Michael Foord2d9c2d52010-05-04 22:29:10 +0000457
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000458# TESTFN_UNICODE is a non-ascii filename
459TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
Victor Stinner74a833f2010-08-18 21:06:23 +0000460if sys.platform == 'darwin':
461 # In Mac OS X's VFS API file names are, by definition, canonically
462 # decomposed Unicode, encoded using UTF-8. See QA1173:
463 # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
464 import unicodedata
465 TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
Antoine Pitrou88909542009-06-29 13:54:42 +0000466TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000467
Victor Stinner09c449c2010-08-13 22:23:24 +0000468# TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000469# encoded by the filesystem encoding (in strict mode). It can be None if we
470# cannot generate such filename.
Victor Stinnera0241c82010-08-15 19:28:21 +0000471TESTFN_UNENCODABLE = None
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000472if os.name in ('nt', 'ce'):
Victor Stinnera0241c82010-08-15 19:28:21 +0000473 # skip win32s (0) or Windows 9x/ME (1)
474 if sys.getwindowsversion().platform >= 2:
Victor Stinner8ce7df62010-09-10 11:19:59 +0000475 # Different kinds of characters from various languages to minimize the
476 # probability that the whole name is encodable to MBCS (issue #9819)
477 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000478 try:
Victor Stinner09c449c2010-08-13 22:23:24 +0000479 TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000480 except UnicodeEncodeError:
481 pass
482 else:
483 print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
484 'Unicode filename tests may not be effective'
Victor Stinner09c449c2010-08-13 22:23:24 +0000485 % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
486 TESTFN_UNENCODABLE = None
Victor Stinnera0241c82010-08-15 19:28:21 +0000487# Mac OS X denies unencodable filenames (invalid utf-8)
Victor Stinner03c9e1d2010-08-14 17:35:20 +0000488elif sys.platform != 'darwin':
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000489 try:
490 # ascii and utf-8 cannot encode the byte 0xff
491 b'\xff'.decode(TESTFN_ENCODING)
492 except UnicodeDecodeError:
493 # 0xff will be encoded using the surrogate character u+DCFF
Victor Stinner09c449c2010-08-13 22:23:24 +0000494 TESTFN_UNENCODABLE = TESTFN \
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000495 + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
496 else:
497 # File system encoding (eg. ISO-8859-* encodings) can encode
498 # the byte 0xff. Skip some unicode filename tests.
Victor Stinnera0241c82010-08-15 19:28:21 +0000499 pass
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000500
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000501# Save the initial cwd
502SAVEDCWD = os.getcwd()
503
504@contextlib.contextmanager
Nick Coghland26c18a2010-08-17 13:06:11 +0000505def temp_cwd(name='tempcwd', quiet=False, path=None):
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000506 """
Nick Coghland26c18a2010-08-17 13:06:11 +0000507 Context manager that temporarily changes the CWD.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000508
Nick Coghland26c18a2010-08-17 13:06:11 +0000509 An existing path may be provided as *path*, in which case this
510 function makes no changes to the file system.
511
512 Otherwise, the new CWD is created in the current directory and it's
513 named *name*. If *quiet* is False (default) and it's not possible to
514 create or change the CWD, an error is raised. If it's True, only a
515 warning is raised and the original CWD is used.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000516 """
517 saved_dir = os.getcwd()
518 is_temporary = False
Nick Coghland26c18a2010-08-17 13:06:11 +0000519 if path is None:
520 path = name
521 try:
522 os.mkdir(name)
523 is_temporary = True
524 except OSError:
525 if not quiet:
526 raise
527 warnings.warn('tests may fail, unable to create temp CWD ' + name,
528 RuntimeWarning, stacklevel=3)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000529 try:
Nick Coghland26c18a2010-08-17 13:06:11 +0000530 os.chdir(path)
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000531 except OSError:
532 if not quiet:
533 raise
534 warnings.warn('tests may fail, unable to change the CWD to ' + name,
535 RuntimeWarning, stacklevel=3)
536 try:
537 yield os.getcwd()
538 finally:
539 os.chdir(saved_dir)
540 if is_temporary:
541 rmtree(name)
542
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000543
Barry Warsaw28a691b2010-04-17 00:19:56 +0000544@contextlib.contextmanager
545def temp_umask(umask):
546 """Context manager that temporarily sets the process umask."""
547 oldmask = os.umask(umask)
548 try:
549 yield
550 finally:
551 os.umask(oldmask)
552
553
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000554def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000555 """Try to find a file on sys.path and the working directory. If it is not
556 found the argument passed to the function is returned (this does not
557 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000558 if os.path.isabs(file):
559 return file
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000560 if subdir is not None:
561 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000562 path = sys.path
563 path = [os.path.dirname(here)] + path
564 for dn in path:
565 fn = os.path.join(dn, file)
566 if os.path.exists(fn): return fn
567 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000568
Tim Peters2f228e72001-05-13 00:19:31 +0000569def sortdict(dict):
570 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000571 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000572 reprpairs = ["%r: %r" % pair for pair in items]
573 withcommas = ", ".join(reprpairs)
574 return "{%s}" % withcommas
575
Benjamin Peterson7522c742009-01-19 21:00:09 +0000576def make_bad_fd():
577 """
578 Create an invalid file descriptor by opening and closing a file and return
579 its fd.
580 """
581 file = open(TESTFN, "wb")
582 try:
583 return file.fileno()
584 finally:
585 file.close()
586 unlink(TESTFN)
587
Thomas Wouters89f507f2006-12-13 04:49:30 +0000588def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000589 testcase.assertRaises(SyntaxError, compile, statement,
590 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000591
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000592def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000593 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000594
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000595 check = kw.pop('check', None)
596
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000597 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000598
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000599 fn = os.path.join(os.path.dirname(__file__), "data", filename)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000600
601 def check_valid_file(fn):
602 f = open(fn, *args, **kw)
603 if check is None:
604 return f
605 elif check(f):
606 f.seek(0)
607 return f
608 f.close()
609
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000610 if os.path.exists(fn):
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000611 f = check_valid_file(fn)
612 if f is not None:
613 return f
614 unlink(fn)
615
616 # Verify the requirement before downloading the file
617 requires('urlfetch')
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000618
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000619 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitroufd0680b2009-11-01 22:13:48 +0000620 f = urllib.request.urlopen(url, timeout=15)
621 try:
622 with open(fn, "wb") as out:
623 s = f.read()
624 while s:
625 out.write(s)
626 s = f.read()
627 finally:
628 f.close()
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000629
630 f = check_valid_file(fn)
631 if f is not None:
632 return f
633 raise TestFailed('invalid resource "%s"' % fn)
634
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000635
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000636class WarningsRecorder(object):
637 """Convenience wrapper for the warnings list returned on
638 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000639 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000640 def __init__(self, warnings_list):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000641 self._warnings = warnings_list
642 self._last = 0
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000643
644 def __getattr__(self, attr):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000645 if len(self._warnings) > self._last:
646 return getattr(self._warnings[-1], attr)
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000647 elif attr in warnings.WarningMessage._WARNING_DETAILS:
648 return None
649 raise AttributeError("%r has no attribute %r" % (self, attr))
650
Florent Xiclunab14930c2010-03-13 15:26:44 +0000651 @property
652 def warnings(self):
653 return self._warnings[self._last:]
654
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000655 def reset(self):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000656 self._last = len(self._warnings)
657
658
659def _filterwarnings(filters, quiet=False):
660 """Catch the warnings, then check if all the expected
661 warnings have been raised and re-raise unexpected warnings.
662 If 'quiet' is True, only re-raise the unexpected warnings.
663 """
664 # Clear the warning registry of the calling module
665 # in order to re-raise the warnings.
666 frame = sys._getframe(2)
667 registry = frame.f_globals.get('__warningregistry__')
668 if registry:
669 registry.clear()
670 with warnings.catch_warnings(record=True) as w:
671 # Set filter "always" to record all warnings. Because
672 # test_warnings swap the module, we need to look up in
673 # the sys.modules dictionary.
674 sys.modules['warnings'].simplefilter("always")
675 yield WarningsRecorder(w)
676 # Filter the recorded warnings
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000677 reraise = list(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000678 missing = []
679 for msg, cat in filters:
680 seen = False
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000681 for w in reraise[:]:
682 warning = w.message
Florent Xiclunab14930c2010-03-13 15:26:44 +0000683 # Filter out the matching messages
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000684 if (re.match(msg, str(warning), re.I) and
685 issubclass(warning.__class__, cat)):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000686 seen = True
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000687 reraise.remove(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000688 if not seen and not quiet:
689 # This filter caught nothing
690 missing.append((msg, cat.__name__))
691 if reraise:
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000692 raise AssertionError("unhandled warning %s" % reraise[0])
Florent Xiclunab14930c2010-03-13 15:26:44 +0000693 if missing:
694 raise AssertionError("filter (%r, %s) did not catch any warning" %
695 missing[0])
696
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000697
698@contextlib.contextmanager
Florent Xiclunab14930c2010-03-13 15:26:44 +0000699def check_warnings(*filters, **kwargs):
700 """Context manager to silence warnings.
701
702 Accept 2-tuples as positional arguments:
703 ("message regexp", WarningCategory)
704
705 Optional argument:
706 - if 'quiet' is True, it does not fail if a filter catches nothing
Florent Xicluna53b506be2010-03-18 20:00:57 +0000707 (default True without argument,
708 default False if some filters are defined)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000709
710 Without argument, it defaults to:
Florent Xicluna53b506be2010-03-18 20:00:57 +0000711 check_warnings(("", Warning), quiet=True)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000712 """
Florent Xicluna53b506be2010-03-18 20:00:57 +0000713 quiet = kwargs.get('quiet')
Florent Xiclunab14930c2010-03-13 15:26:44 +0000714 if not filters:
715 filters = (("", Warning),)
Florent Xicluna53b506be2010-03-18 20:00:57 +0000716 # Preserve backward compatibility
717 if quiet is None:
718 quiet = True
719 return _filterwarnings(filters, quiet)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000720
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000721
722class CleanImport(object):
723 """Context manager to force import to return a new module reference.
724
725 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000726 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000727
728 Use like this:
729
730 with CleanImport("foo"):
Brett Cannonddb5e702010-02-03 22:16:11 +0000731 importlib.import_module("foo") # new reference
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000732 """
733
734 def __init__(self, *module_names):
735 self.original_modules = sys.modules.copy()
736 for module_name in module_names:
737 if module_name in sys.modules:
738 module = sys.modules[module_name]
739 # It is possible that module_name is just an alias for
740 # another module (e.g. stub for modules renamed in 3.x).
741 # In that case, we also need delete the real module to clear
742 # the import cache.
743 if module.__name__ != module_name:
744 del sys.modules[module.__name__]
745 del sys.modules[module_name]
746
747 def __enter__(self):
748 return self
749
750 def __exit__(self, *ignore_exc):
751 sys.modules.update(self.original_modules)
752
753
Walter Dörwald155374d2009-05-01 19:58:58 +0000754class EnvironmentVarGuard(collections.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000755
756 """Class to help protect the environment variable properly. Can be used as
757 a context manager."""
758
759 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000760 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000761 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000762
Walter Dörwald155374d2009-05-01 19:58:58 +0000763 def __getitem__(self, envvar):
764 return self._environ[envvar]
765
766 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000767 # Remember the initial value on the first access
768 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +0000769 self._changed[envvar] = self._environ.get(envvar)
770 self._environ[envvar] = value
771
772 def __delitem__(self, envvar):
773 # Remember the initial value on the first access
774 if envvar not in self._changed:
775 self._changed[envvar] = self._environ.get(envvar)
776 if envvar in self._environ:
777 del self._environ[envvar]
778
779 def keys(self):
780 return self._environ.keys()
781
782 def __iter__(self):
783 return iter(self._environ)
784
785 def __len__(self):
786 return len(self._environ)
787
788 def set(self, envvar, value):
789 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000790
791 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +0000792 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000793
794 def __enter__(self):
795 return self
796
797 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000798 for (k, v) in self._changed.items():
799 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +0000800 if k in self._environ:
801 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +0000802 else:
Walter Dörwald155374d2009-05-01 19:58:58 +0000803 self._environ[k] = v
Nick Coghlan6ead5522009-10-18 13:19:33 +0000804 os.environ = self._environ
805
806
807class DirsOnSysPath(object):
808 """Context manager to temporarily add directories to sys.path.
809
810 This makes a copy of sys.path, appends any directories given
811 as positional arguments, then reverts sys.path to the copied
812 settings when the context ends.
813
814 Note that *all* sys.path modifications in the body of the
815 context manager, including replacement of the object,
816 will be reverted at the end of the block.
817 """
818
819 def __init__(self, *paths):
820 self.original_value = sys.path[:]
821 self.original_object = sys.path
822 sys.path.extend(paths)
823
824 def __enter__(self):
825 return self
826
827 def __exit__(self, *ignore_exc):
828 sys.path = self.original_object
829 sys.path[:] = self.original_value
Walter Dörwald155374d2009-05-01 19:58:58 +0000830
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000831
Guido van Rossumd8faa362007-04-27 19:54:29 +0000832class TransientResource(object):
833
834 """Raise ResourceDenied if an exception is raised while the context manager
835 is in effect that matches the specified exception and attributes."""
836
837 def __init__(self, exc, **kwargs):
838 self.exc = exc
839 self.attrs = kwargs
840
841 def __enter__(self):
842 return self
843
844 def __exit__(self, type_=None, value=None, traceback=None):
845 """If type_ is a subclass of self.exc and value has attributes matching
846 self.attrs, raise ResourceDenied. Otherwise let the exception
847 propagate (if any)."""
848 if type_ is not None and issubclass(self.exc, type_):
849 for attr, attr_value in self.attrs.items():
850 if not hasattr(value, attr):
851 break
852 if getattr(value, attr) != attr_value:
853 break
854 else:
855 raise ResourceDenied("an optional resource is not available")
856
Raymond Hettinger686057b2009-06-04 00:11:54 +0000857# Context managers that raise ResourceDenied when various issues
858# with the Internet connection manifest themselves as exceptions.
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000859# XXX deprecate these and use transient_internet() instead
Raymond Hettinger686057b2009-06-04 00:11:54 +0000860time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
861socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
862ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000863
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000864
Thomas Woutersed03b412007-08-28 21:37:11 +0000865@contextlib.contextmanager
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000866def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitroufec12ff2010-04-21 19:46:23 +0000867 """Return a context manager that raises ResourceDenied when various issues
868 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000869 default_errnos = [
870 ('ECONNREFUSED', 111),
871 ('ECONNRESET', 104),
Antoine Pitrou5d938cb2011-01-08 10:28:11 +0000872 ('EHOSTUNREACH', 113),
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000873 ('ENETUNREACH', 101),
874 ('ETIMEDOUT', 110),
875 ]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000876 default_gai_errnos = [
Antoine Pitrou4875c462011-07-09 02:31:24 +0200877 ('EAI_AGAIN', -3),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000878 ('EAI_NONAME', -2),
879 ('EAI_NODATA', -5),
Antoine Pitrou390ea0f2011-04-29 00:44:33 +0200880 # Encountered when trying to resolve IPv6-only hostnames
881 ('WSANO_DATA', 11004),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000882 ]
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000883
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000884 denied = ResourceDenied("Resource '%s' is not available" % resource_name)
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000885 captured_errnos = errnos
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000886 gai_errnos = []
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000887 if not captured_errnos:
888 captured_errnos = [getattr(errno, name, num)
889 for (name, num) in default_errnos]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000890 gai_errnos = [getattr(socket, name, num)
891 for (name, num) in default_gai_errnos]
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000892
893 def filter_error(err):
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000894 n = getattr(err, 'errno', None)
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000895 if (isinstance(err, socket.timeout) or
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000896 (isinstance(err, socket.gaierror) and n in gai_errnos) or
897 n in captured_errnos):
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000898 if not verbose:
899 sys.stderr.write(denied.args[0] + "\n")
900 raise denied from err
901
902 old_timeout = socket.getdefaulttimeout()
903 try:
904 if timeout is not None:
905 socket.setdefaulttimeout(timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +0000906 yield
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000907 except IOError as err:
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000908 # urllib can wrap original socket errors multiple times (!), we must
909 # unwrap to get at the original error.
910 while True:
911 a = err.args
912 if len(a) >= 1 and isinstance(a[0], IOError):
913 err = a[0]
914 # The error can also be wrapped as args[1]:
915 # except socket.error as msg:
916 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
917 elif len(a) >= 2 and isinstance(a[1], IOError):
918 err = a[1]
919 else:
920 break
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000921 filter_error(err)
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000922 raise
923 # XXX should we catch generic exceptions and look for their
924 # __cause__ or __context__?
925 finally:
926 socket.setdefaulttimeout(old_timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +0000927
928
929@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000930def captured_output(stream_name):
Ezio Melotti07352b02011-05-14 14:51:18 +0300931 """Return a context manager used by captured_stdout/stdin/stderr
Ezio Melottifc778fd2011-05-14 08:22:47 +0300932 that temporarily replaces the sys stream *stream_name* with a StringIO."""
Thomas Woutersed03b412007-08-28 21:37:11 +0000933 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000934 orig_stdout = getattr(sys, stream_name)
935 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000936 try:
937 yield getattr(sys, stream_name)
938 finally:
939 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000940
941def captured_stdout():
Ezio Melottifc778fd2011-05-14 08:22:47 +0300942 """Capture the output of sys.stdout:
943
944 with captured_stdout() as s:
945 print("hello")
946 self.assertEqual(s.getvalue(), "hello")
947 """
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000948 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +0000949
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000950def captured_stderr():
951 return captured_output("stderr")
952
Nick Coghlan6ead5522009-10-18 13:19:33 +0000953def captured_stdin():
954 return captured_output("stdin")
955
Ezio Melotti07352b02011-05-14 14:51:18 +0300956
Benjamin Petersone549ead2009-03-28 21:42:05 +0000957def gc_collect():
958 """Force as many objects as possible to be collected.
959
960 In non-CPython implementations of Python, this is needed because timely
961 deallocation is not guaranteed by the garbage collector. (Even in CPython
962 this can be the case in case of reference cycles.) This means that __del__
963 methods may be called later than expected and weakrefs may remain alive for
964 longer than expected. This function tries its best to force all garbage
965 objects to disappear.
966 """
Benjamin Petersone549ead2009-03-28 21:42:05 +0000967 gc.collect()
Benjamin Petersona6590e82010-04-11 21:22:10 +0000968 if is_jython:
969 time.sleep(0.1)
Benjamin Petersone549ead2009-03-28 21:42:05 +0000970 gc.collect()
971 gc.collect()
972
Thomas Woutersed03b412007-08-28 21:37:11 +0000973
Benjamin Peterson65c66ab2010-10-29 21:31:35 +0000974def python_is_optimized():
975 """Find if Python was built with optimizations."""
Antoine Pitrou64474542010-10-31 11:34:47 +0000976 cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
Benjamin Peterson65c66ab2010-10-29 21:31:35 +0000977 final_opt = ""
978 for opt in cflags.split():
979 if opt.startswith('-O'):
980 final_opt = opt
981 return final_opt and final_opt != '-O0'
982
983
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000984#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +0000985# Decorator for running a function in a different locale, correctly resetting
986# it afterwards.
987
988def run_with_locale(catstr, *locales):
989 def decorator(func):
990 def inner(*args, **kwds):
991 try:
992 import locale
993 category = getattr(locale, catstr)
994 orig_locale = locale.setlocale(category)
995 except AttributeError:
996 # if the test author gives us an invalid category string
997 raise
998 except:
999 # cannot retrieve original locale, so do nothing
1000 locale = orig_locale = None
1001 else:
1002 for loc in locales:
1003 try:
1004 locale.setlocale(category, loc)
1005 break
1006 except:
1007 pass
1008
1009 # now run the function, resetting the locale on exceptions
1010 try:
1011 return func(*args, **kwds)
1012 finally:
1013 if locale and orig_locale:
1014 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +00001015 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +00001016 inner.__doc__ = func.__doc__
1017 return inner
1018 return decorator
1019
1020#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +00001021# Big-memory-test support. Separate from 'resources' because memory use
1022# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001023
1024# Some handy shorthands. Note that these are used for byte-limits as well
1025# as size-limits, in the various bigmem tests
1026_1M = 1024*1024
1027_1G = 1024 * _1M
1028_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001029_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +00001030
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001031MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001032
Thomas Wouters477c8d52006-05-27 19:21:47 +00001033def set_memlimit(limit):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001034 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001035 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +00001036 sizes = {
1037 'k': 1024,
1038 'm': _1M,
1039 'g': _1G,
1040 't': 1024*_1G,
1041 }
1042 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
1043 re.IGNORECASE | re.VERBOSE)
1044 if m is None:
1045 raise ValueError('Invalid memory limit %r' % (limit,))
1046 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001047 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001048 if memlimit > MAX_Py_ssize_t:
1049 memlimit = MAX_Py_ssize_t
1050 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051 raise ValueError('Memory limit %r too low to be useful' % (limit,))
1052 max_memuse = memlimit
1053
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001054def bigmemtest(minsize, memuse):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 """Decorator for bigmem tests.
1056
1057 'minsize' is the minimum useful size for the test (in arbitrary,
1058 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001059 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001060
1061 The decorator tries to guess a good value for 'size' and passes it to
1062 the decorated test function. If minsize * memuse is more than the
1063 allowed memory use (as defined by max_memuse), the test is skipped.
1064 Otherwise, minsize is adjusted upward to use up to max_memuse.
1065 """
1066 def decorator(f):
1067 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00001068 # Retrieve values in case someone decided to adjust them
1069 minsize = wrapper.minsize
1070 memuse = wrapper.memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +00001071 if not max_memuse:
1072 # If max_memuse is 0 (the default),
1073 # we still want to run the tests with size set to a few kb,
1074 # to make sure they work. We still want to avoid using
1075 # too much memory, though, but we do that noisily.
1076 maxsize = 5147
Antoine Pitrou9dd11712011-01-12 21:40:20 +00001077 self.assertFalse(maxsize * memuse > 20 * _1M)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001078 else:
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001079 maxsize = int(max_memuse / memuse)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001080 if maxsize < minsize:
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001081 raise unittest.SkipTest(
1082 "not enough memory: %.1fG minimum needed"
1083 % (minsize * memuse / (1024 ** 3)))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001084 return f(self, maxsize)
1085 wrapper.minsize = minsize
1086 wrapper.memuse = memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +00001087 return wrapper
1088 return decorator
1089
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001090def precisionbigmemtest(size, memuse):
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001091 def decorator(f):
1092 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00001093 size = wrapper.size
1094 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001095 if not real_max_memuse:
1096 maxsize = 5147
1097 else:
1098 maxsize = size
1099
1100 if real_max_memuse and real_max_memuse < maxsize * memuse:
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001101 raise unittest.SkipTest(
1102 "not enough memory: %.1fG minimum needed"
1103 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001104
1105 return f(self, maxsize)
1106 wrapper.size = size
1107 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001108 return wrapper
1109 return decorator
1110
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001111def bigaddrspacetest(f):
1112 """Decorator for tests that fill the address space."""
1113 def wrapper(self):
1114 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou98c62bd2011-01-12 21:58:39 +00001115 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
Antoine Pitroue0d3f8a2011-01-12 21:50:44 +00001116 raise unittest.SkipTest(
1117 "not enough memory: try a 32-bit build instead")
1118 else:
1119 raise unittest.SkipTest(
1120 "not enough memory: %.1fG minimum needed"
1121 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001122 else:
1123 return f(self)
1124 return wrapper
1125
Thomas Wouters477c8d52006-05-27 19:21:47 +00001126#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +00001127# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001128
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001129class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001130 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001131 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001132 test(result)
1133 return result
1134
Benjamin Petersone549ead2009-03-28 21:42:05 +00001135def _id(obj):
1136 return obj
1137
1138def requires_resource(resource):
Antoine Pitrou4914f9e2011-02-26 16:49:08 +00001139 if resource == 'gui' and not _is_gui_available():
1140 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou5bc4fa72010-10-14 15:34:31 +00001141 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +00001142 return _id
1143 else:
1144 return unittest.skip("resource {0!r} is not enabled".format(resource))
1145
1146def cpython_only(test):
1147 """
1148 Decorator for tests only applicable on CPython.
1149 """
1150 return impl_detail(cpython=True)(test)
1151
1152def impl_detail(msg=None, **guards):
1153 if check_impl_detail(**guards):
1154 return _id
1155 if msg is None:
1156 guardnames, default = _parse_guards(guards)
1157 if default:
1158 msg = "implementation detail not available on {0}"
1159 else:
1160 msg = "implementation detail specific to {0}"
1161 guardnames = sorted(guardnames.keys())
1162 msg = msg.format(' or '.join(guardnames))
1163 return unittest.skip(msg)
1164
1165def _parse_guards(guards):
1166 # Returns a tuple ({platform_name: run_me}, default_value)
1167 if not guards:
1168 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +00001169 is_true = list(guards.values())[0]
1170 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001171 return (guards, not is_true)
1172
1173# Use the following check to guard CPython's implementation-specific tests --
1174# or to run them only on the implementation(s) guarded by the arguments.
1175def check_impl_detail(**guards):
1176 """This function returns True or False depending on the host platform.
1177 Examples:
1178 if check_impl_detail(): # only on CPython (default)
1179 if check_impl_detail(jython=True): # only on Jython
1180 if check_impl_detail(cpython=False): # everywhere except on CPython
1181 """
1182 guards, default = _parse_guards(guards)
1183 return guards.get(platform.python_implementation().lower(), default)
1184
1185
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001186
Guido van Rossumd8faa362007-04-27 19:54:29 +00001187def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +00001188 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001189 if verbose:
Antoine Pitrou216a3bc2011-07-23 22:33:39 +02001190 runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
1191 failfast=failfast)
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001192 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001193 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001194
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001195 result = runner.run(suite)
1196 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +00001197 if len(result.errors) == 1 and not result.failures:
1198 err = result.errors[0][1]
1199 elif len(result.failures) == 1 and not result.errors:
1200 err = result.failures[0][1]
1201 else:
R. David Murray723357e2009-10-19 18:06:17 +00001202 err = "multiple errors occurred"
1203 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +00001204 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +00001205
Barry Warsawc10d6902001-09-20 06:30:41 +00001206
Walter Dörwald21d3a322003-05-01 17:45:56 +00001207def run_unittest(*classes):
1208 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00001209 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001210 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001211 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001212 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001213 if cls in sys.modules:
1214 suite.addTest(unittest.findTestCases(sys.modules[cls]))
1215 else:
1216 raise ValueError("str arguments must be keys in sys.modules")
1217 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +00001218 suite.addTest(cls)
1219 else:
1220 suite.addTest(unittest.makeSuite(cls))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001221 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001222
Barry Warsawc10d6902001-09-20 06:30:41 +00001223
Tim Petersa0a62222001-09-09 06:12:01 +00001224#=======================================================================
1225# doctest driver.
1226
1227def run_doctest(module, verbosity=None):
Tim Peters17111f32001-10-03 04:08:26 +00001228 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +00001229
1230 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001231 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +00001232 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +00001233 """
1234
1235 import doctest
1236
1237 if verbosity is None:
1238 verbosity = verbose
1239 else:
1240 verbosity = None
1241
Victor Stinnerbddc4d42011-06-29 15:52:46 +02001242 f, t = doctest.testmod(module, verbose=verbosity)
1243 if f:
1244 raise TestFailed("%d of %d doctests failed" % (f, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001245 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001246 print('doctest (%s) ... %d tests with zero failures' %
1247 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001248 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001249
Antoine Pitrou060cee22009-11-13 16:29:04 +00001250
1251#=======================================================================
1252# Support for saving and restoring the imported modules.
1253
1254def modules_setup():
1255 return sys.modules.copy(),
1256
1257def modules_cleanup(oldmodules):
1258 # Encoders/decoders are registered permanently within the internal
1259 # codec cache. If we destroy the corresponding modules their
1260 # globals will be set to None which will trip up the cached functions.
1261 encodings = [(k, v) for k, v in sys.modules.items()
1262 if k.startswith('encodings.')]
1263 sys.modules.clear()
1264 sys.modules.update(encodings)
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001265 # XXX: This kind of problem can affect more than just encodings. In particular
Eric Smitha3e8f3d2011-01-11 10:24:34 +00001266 # extension modules (such as _ssl) don't cope with reloading properly.
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001267 # Really, test modules should be cleaning out the test specific modules they
1268 # know they added (ala test_runpy) rather than relying on this function (as
1269 # test_importhooks and test_pkg do currently).
1270 # Implicitly imported *real* modules should be left alone (see issue 10556).
Antoine Pitrou060cee22009-11-13 16:29:04 +00001271 sys.modules.update(oldmodules)
1272
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001273#=======================================================================
1274# Threading support to prevent reporting refleaks when running regrtest.py -R
1275
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001276# NOTE: we use thread._count() rather than threading.enumerate() (or the
1277# moral equivalent thereof) because a threading.Thread object is still alive
1278# until its __bootstrap() method has returned, even after it has been
1279# unregistered from the threading module.
1280# thread._count(), on the other hand, only gets decremented *after* the
1281# __bootstrap() method has returned, which gives us reliable reference counts
1282# at the end of a test run.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001283
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001284def threading_setup():
Victor Stinner45df8202010-04-28 22:31:17 +00001285 if _thread:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001286 return _thread._count(), threading._dangling.copy()
Victor Stinner45df8202010-04-28 22:31:17 +00001287 else:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001288 return 1, ()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001289
Antoine Pitrou707f2282011-07-15 22:29:44 +02001290def threading_cleanup(*original_values):
Victor Stinner45df8202010-04-28 22:31:17 +00001291 if not _thread:
1292 return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001293 _MAX_COUNT = 10
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001294 for count in range(_MAX_COUNT):
Antoine Pitrou707f2282011-07-15 22:29:44 +02001295 values = _thread._count(), threading._dangling
1296 if values == original_values:
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001297 break
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001298 time.sleep(0.1)
Antoine Pitrou707f2282011-07-15 22:29:44 +02001299 gc_collect()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001300 # XXX print a warning in case of failure?
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001301
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001302def reap_threads(func):
Victor Stinner45df8202010-04-28 22:31:17 +00001303 """Use this function when threads are being used. This will
1304 ensure that the threads are cleaned up even when the test fails.
1305 If threading is unavailable this function does nothing.
1306 """
1307 if not _thread:
1308 return func
1309
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001310 @functools.wraps(func)
1311 def decorator(*args):
1312 key = threading_setup()
1313 try:
1314 return func(*args)
1315 finally:
1316 threading_cleanup(*key)
1317 return decorator
1318
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001319def reap_children():
1320 """Use this function at the end of test_main() whenever sub-processes
1321 are started. This will help ensure that no extra children (zombies)
1322 stick around to hog resources and create problems when looking
1323 for refleaks.
1324 """
1325
1326 # Reap all our dead child processes so we don't leave zombies around.
1327 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001328 if hasattr(os, 'waitpid'):
1329 any_process = -1
1330 while True:
1331 try:
1332 # This will raise an exception on Windows. That's ok.
1333 pid, status = os.waitpid(any_process, os.WNOHANG)
1334 if pid == 0:
1335 break
1336 except:
1337 break
Collin Winterf2bf2b32010-03-17 00:41:56 +00001338
1339@contextlib.contextmanager
1340def swap_attr(obj, attr, new_val):
1341 """Temporary swap out an attribute with a new object.
1342
1343 Usage:
1344 with swap_attr(obj, "attr", 5):
1345 ...
1346
1347 This will set obj.attr to 5 for the duration of the with: block,
1348 restoring the old value at the end of the block. If `attr` doesn't
1349 exist on `obj`, it will be created and then deleted at the end of the
1350 block.
1351 """
1352 if hasattr(obj, attr):
1353 real_val = getattr(obj, attr)
1354 setattr(obj, attr, new_val)
1355 try:
1356 yield
1357 finally:
1358 setattr(obj, attr, real_val)
1359 else:
1360 setattr(obj, attr, new_val)
1361 try:
1362 yield
1363 finally:
1364 delattr(obj, attr)
1365
1366@contextlib.contextmanager
1367def swap_item(obj, item, new_val):
1368 """Temporary swap out an item with a new object.
1369
1370 Usage:
1371 with swap_item(obj, "item", 5):
1372 ...
1373
1374 This will set obj["item"] to 5 for the duration of the with: block,
1375 restoring the old value at the end of the block. If `item` doesn't
1376 exist on `obj`, it will be created and then deleted at the end of the
1377 block.
1378 """
1379 if item in obj:
1380 real_val = obj[item]
1381 obj[item] = new_val
1382 try:
1383 yield
1384 finally:
1385 obj[item] = real_val
1386 else:
1387 obj[item] = new_val
1388 try:
1389 yield
1390 finally:
1391 del obj[item]
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001392
1393def strip_python_stderr(stderr):
1394 """Strip the stderr of a Python process from potential debug output
1395 emitted by the interpreter.
1396
1397 This will typically be run on the result of the communicate() method
1398 of a subprocess.Popen object.
1399 """
1400 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
1401 return stderr
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +00001402
1403def args_from_interpreter_flags():
1404 """Return a list of command-line arguments reproducing the current
1405 settings in sys.flags."""
1406 flag_opt_map = {
1407 'bytes_warning': 'b',
1408 'dont_write_bytecode': 'B',
1409 'ignore_environment': 'E',
1410 'no_user_site': 's',
1411 'no_site': 'S',
1412 'optimize': 'O',
1413 'verbose': 'v',
1414 }
1415 args = []
1416 for flag, opt in flag_opt_map.items():
1417 v = getattr(sys.flags, flag)
1418 if v > 0:
1419 args.append('-' + opt * v)
1420 return args
Vinay Sajip129fd042010-12-10 08:19:38 +00001421
1422#============================================================
1423# Support for assertions about logging.
1424#============================================================
1425
1426class TestHandler(logging.handlers.BufferingHandler):
1427 def __init__(self, matcher):
1428 # BufferingHandler takes a "capacity" argument
1429 # so as to know when to flush. As we're overriding
1430 # shouldFlush anyway, we can set a capacity of zero.
1431 # You can call flush() manually to clear out the
1432 # buffer.
1433 logging.handlers.BufferingHandler.__init__(self, 0)
1434 self.matcher = matcher
1435
1436 def shouldFlush(self):
1437 return False
1438
1439 def emit(self, record):
1440 self.format(record)
1441 self.buffer.append(record.__dict__)
1442
1443 def matches(self, **kwargs):
1444 """
1445 Look for a saved dict whose keys/values match the supplied arguments.
1446 """
1447 result = False
1448 for d in self.buffer:
1449 if self.matcher.matches(d, **kwargs):
1450 result = True
1451 break
1452 return result
1453
1454class Matcher(object):
1455
1456 _partial_matches = ('msg', 'message')
1457
1458 def matches(self, d, **kwargs):
1459 """
1460 Try to match a single dict with the supplied arguments.
1461
1462 Keys whose values are strings and which are in self._partial_matches
1463 will be checked for partial (i.e. substring) matches. You can extend
1464 this scheme to (for example) do regular expression matching, etc.
1465 """
1466 result = True
1467 for k in kwargs:
1468 v = kwargs[k]
1469 dv = d.get(k)
1470 if not self.match_value(k, dv, v):
1471 result = False
1472 break
1473 return result
1474
1475 def match_value(self, k, dv, v):
1476 """
1477 Try to match a single stored value (dv) with a supplied value (v).
1478 """
1479 if type(v) != type(dv):
1480 result = False
1481 elif type(dv) is not str or k not in self._partial_matches:
1482 result = (v == dv)
1483 else:
1484 result = dv.find(v) >= 0
1485 return result
Brian Curtin3b4499c2010-12-28 14:31:47 +00001486
1487
1488_can_symlink = None
1489def can_symlink():
1490 global _can_symlink
1491 if _can_symlink is not None:
1492 return _can_symlink
Victor Stinner62ec61f2011-06-07 12:17:15 +02001493 symlink_path = TESTFN + "can_symlink"
Brian Curtin3b4499c2010-12-28 14:31:47 +00001494 try:
Victor Stinner62ec61f2011-06-07 12:17:15 +02001495 os.symlink(TESTFN, symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001496 can = True
Brian Curtind25aef52011-06-13 15:16:04 -05001497 except (OSError, NotImplementedError, AttributeError):
Brian Curtin3b4499c2010-12-28 14:31:47 +00001498 can = False
Victor Stinner62ec61f2011-06-07 12:17:15 +02001499 else:
1500 os.remove(symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001501 _can_symlink = can
1502 return can
1503
1504def skip_unless_symlink(test):
1505 """Skip decorator for tests that require functional symlink"""
1506 ok = can_symlink()
1507 msg = "Requires functional symlink implementation"
1508 return test if ok else unittest.skip(msg)(test)
Antoine Pitroue8706232011-03-15 21:05:36 +01001509
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001510def patch(test_instance, object_to_patch, attr_name, new_value):
1511 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1512
1513 Also, add a cleanup procedure to 'test_instance' to restore
1514 'object_to_patch' value for 'attr_name'.
1515 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1516
1517 """
1518 # check that 'attr_name' is a real attribute for 'object_to_patch'
1519 # will raise AttributeError if it does not exist
1520 getattr(object_to_patch, attr_name)
1521
1522 # keep a copy of the old value
1523 attr_is_local = False
1524 try:
1525 old_value = object_to_patch.__dict__[attr_name]
1526 except (AttributeError, KeyError):
1527 old_value = getattr(object_to_patch, attr_name, None)
1528 else:
1529 attr_is_local = True
1530
1531 # restore the value when the test is done
1532 def cleanup():
1533 if attr_is_local:
1534 setattr(object_to_patch, attr_name, old_value)
1535 else:
1536 delattr(object_to_patch, attr_name)
1537
1538 test_instance.addCleanup(cleanup)
1539
1540 # actually override the attribute
1541 setattr(object_to_patch, attr_name, new_value)