blob: 162805d398259e527b8c28a5260b489191ae11ac [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
Antoine Pitroub9c73e82011-07-29 23:53:38 +020024import fnmatch
Vinay Sajip129fd042010-12-10 08:19:38 +000025import logging.handlers
Martin v. Löwis33f79972012-07-29 16:33:05 +020026import struct
27import tempfile
28import _testcapi
Benjamin Peterson65c66ab2010-10-29 21:31:35 +000029
Victor Stinner45df8202010-04-28 22:31:17 +000030try:
Antoine Pitrou707f2282011-07-15 22:29:44 +020031 import _thread, threading
Victor Stinner45df8202010-04-28 22:31:17 +000032except ImportError:
33 _thread = None
Antoine Pitrou707f2282011-07-15 22:29:44 +020034 threading = None
35try:
36 import multiprocessing.process
37except ImportError:
38 multiprocessing = None
39
Fred Drakecd1b1dd2001-03-21 18:26:33 +000040
Barry Warsaw28a691b2010-04-17 00:19:56 +000041__all__ = [
42 "Error", "TestFailed", "ResourceDenied", "import_module",
43 "verbose", "use_resources", "max_memuse", "record_original_stdout",
44 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
Victor Stinner88701e22011-06-01 13:13:04 +020045 "is_resource_enabled", "requires", "requires_mac_ver",
46 "find_unused_port", "bind_port",
Barry Warsaw28a691b2010-04-17 00:19:56 +000047 "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "SAVEDCWD", "temp_cwd",
48 "findfile", "sortdict", "check_syntax_error", "open_urlresource",
49 "check_warnings", "CleanImport", "EnvironmentVarGuard",
50 "TransientResource", "captured_output", "captured_stdout",
Ezio Melotti07352b02011-05-14 14:51:18 +030051 "captured_stdin", "captured_stderr",
Barry Warsaw28a691b2010-04-17 00:19:56 +000052 "time_out", "socket_peer_reset", "ioerror_peer_reset",
Antoine Pitroua88c83c2010-09-07 20:42:19 +000053 "run_with_locale", 'temp_umask', "transient_internet",
Barry Warsaw28a691b2010-04-17 00:19:56 +000054 "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
55 "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
56 "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
Vinay Sajip129fd042010-12-10 08:19:38 +000057 "swap_item", "swap_attr", "requires_IEEE_754",
Benjamin Peterson31dc3732011-05-08 15:34:24 -050058 "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
Alexander Belopolsky2420d832012-04-29 15:56:49 -040059 "import_fresh_module", "failfast", "run_with_tz"
Antoine Pitrou4d7979b2010-09-07 21:22:56 +000060 ]
Florent Xiclunaf089fd62010-03-19 14:25:03 +000061
Fred Drake1790dd42000-07-24 06:55:00 +000062class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000063 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000064
65class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000066 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000067
Benjamin Petersone549ead2009-03-28 21:42:05 +000068class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000069 """Test skipped because it requested a disallowed resource.
70
71 This is raised when a test calls requires() for a resource that
72 has not be enabled. It is used to distinguish between expected
73 and unexpected skips.
74 """
75
Nick Coghlanfce769e2009-04-11 14:30:59 +000076@contextlib.contextmanager
77def _ignore_deprecated_imports(ignore=True):
78 """Context manager to suppress package and module deprecation
79 warnings when importing them.
80
81 If ignore is False, this context manager has no effect."""
82 if ignore:
83 with warnings.catch_warnings():
84 warnings.filterwarnings("ignore", ".+ (module|package)",
85 DeprecationWarning)
86 yield
87 else:
88 yield
89
90
Benjamin Peterson699adb92008-05-08 22:27:58 +000091def import_module(name, deprecated=False):
R. David Murraya21e4ca2009-03-31 23:16:50 +000092 """Import and return the module to be tested, raising SkipTest if
93 it is not available.
94
95 If deprecated is True, any module or package deprecation messages
96 will be suppressed."""
Nick Coghlanfce769e2009-04-11 14:30:59 +000097 with _ignore_deprecated_imports(deprecated):
Benjamin Peterson699adb92008-05-08 22:27:58 +000098 try:
Nick Coghlanfce769e2009-04-11 14:30:59 +000099 return importlib.import_module(name)
R. David Murraya21e4ca2009-03-31 23:16:50 +0000100 except ImportError as msg:
101 raise unittest.SkipTest(str(msg))
Nick Coghlanfce769e2009-04-11 14:30:59 +0000102
103
Nick Coghlan47384702009-04-22 16:13:36 +0000104def _save_and_remove_module(name, orig_modules):
105 """Helper function to save and remove a module from sys.modules
106
Ezio Melotti199e0852011-05-09 06:41:55 +0300107 Raise ImportError if the module can't be imported."""
Ezio Melottifec3ad12011-05-14 06:02:25 +0300108 # try to import the module and raise an error if it can't be imported
109 if name not in sys.modules:
Ezio Melotti199e0852011-05-09 06:41:55 +0300110 __import__(name)
Nick Coghlan47384702009-04-22 16:13:36 +0000111 del sys.modules[name]
Ezio Melottifec3ad12011-05-14 06:02:25 +0300112 for modname in list(sys.modules):
113 if modname == name or modname.startswith(name + '.'):
114 orig_modules[modname] = sys.modules[modname]
115 del sys.modules[modname]
Nick Coghlan47384702009-04-22 16:13:36 +0000116
117def _save_and_block_module(name, orig_modules):
118 """Helper function to save and block a module in sys.modules
119
Ezio Melotti199e0852011-05-09 06:41:55 +0300120 Return True if the module was in sys.modules, False otherwise."""
Nick Coghlan47384702009-04-22 16:13:36 +0000121 saved = True
122 try:
123 orig_modules[name] = sys.modules[name]
124 except KeyError:
125 saved = False
Alexander Belopolsky903396e2010-07-13 14:50:16 +0000126 sys.modules[name] = None
Nick Coghlan47384702009-04-22 16:13:36 +0000127 return saved
128
129
130def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000131 """Imports and returns a module, deliberately bypassing the sys.modules cache
132 and importing a fresh copy of the module. Once the import is complete,
133 the sys.modules cache is restored to its original state.
134
Nick Coghlan47384702009-04-22 16:13:36 +0000135 Modules named in fresh are also imported anew if needed by the import.
Ezio Melotti199e0852011-05-09 06:41:55 +0300136 If one of these modules can't be imported, None is returned.
Nick Coghlan47384702009-04-22 16:13:36 +0000137
138 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000139 takes place.
140
141 If deprecated is True, any module or package deprecation messages
142 will be suppressed."""
Ezio Melotti6b60fb92011-05-14 06:47:51 +0300143 # NOTE: test_heapq, test_json and test_warnings include extra sanity checks
144 # to make sure that this utility function is working as expected
Nick Coghlanfce769e2009-04-11 14:30:59 +0000145 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000146 # Keep track of modules saved for later restoration as well
147 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000148 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000149 names_to_remove = []
150 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000151 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000152 for fresh_name in fresh:
153 _save_and_remove_module(fresh_name, orig_modules)
154 for blocked_name in blocked:
155 if not _save_and_block_module(blocked_name, orig_modules):
156 names_to_remove.append(blocked_name)
157 fresh_module = importlib.import_module(name)
Ezio Melotti199e0852011-05-09 06:41:55 +0300158 except ImportError:
159 fresh_module = None
Nick Coghlanfce769e2009-04-11 14:30:59 +0000160 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000161 for orig_name, module in orig_modules.items():
162 sys.modules[orig_name] = module
163 for name_to_remove in names_to_remove:
164 del sys.modules[name_to_remove]
165 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000166
Benjamin Peterson699adb92008-05-08 22:27:58 +0000167
R. David Murraya21e4ca2009-03-31 23:16:50 +0000168def get_attribute(obj, name):
169 """Get an attribute, raising SkipTest if AttributeError is raised."""
170 try:
171 attribute = getattr(obj, name)
172 except AttributeError:
173 raise unittest.SkipTest("module %s has no attribute %s" % (
174 obj.__name__, name))
175 else:
176 return attribute
177
Barry Warsawc0fb6052001-08-20 22:29:23 +0000178verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000179use_resources = None # Flag set to [] by regrtest.py
180max_memuse = 0 # Disable bigmem tests (they will still be run with
181 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000182real_max_memuse = 0
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200183failfast = False
Antoine Pitroub9c73e82011-07-29 23:53:38 +0200184match_tests = None
Guido van Rossum531661c1996-12-20 02:58:22 +0000185
Tim Peters8dee8092001-09-25 20:05:11 +0000186# _original_stdout is meant to hold stdout at the time regrtest began.
187# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
188# The point is to have some flavor of stdout the user can actually see.
189_original_stdout = None
190def record_original_stdout(stdout):
191 global _original_stdout
192 _original_stdout = stdout
193
194def get_original_stdout():
195 return _original_stdout or sys.stdout
196
Guido van Rossum3bead091992-01-27 17:00:37 +0000197def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000198 try:
199 del sys.modules[name]
200 except KeyError:
201 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000202
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000203def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000204 try:
205 os.unlink(filename)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000206 except OSError as error:
207 # The filename need not exist.
Michael Foord2d9c2d52010-05-04 22:29:10 +0000208 if error.errno not in (errno.ENOENT, errno.ENOTDIR):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000209 raise
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000210
Christian Heimes23daade02008-02-25 12:39:23 +0000211def rmtree(path):
212 try:
213 shutil.rmtree(path)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000214 except OSError as error:
Christian Heimes23daade02008-02-25 12:39:23 +0000215 # Unix returns ENOENT, Windows returns ESRCH.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000216 if error.errno not in (errno.ENOENT, errno.ESRCH):
Christian Heimes23daade02008-02-25 12:39:23 +0000217 raise
218
Barry Warsaw28a691b2010-04-17 00:19:56 +0000219def make_legacy_pyc(source):
220 """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
221
222 The choice of .pyc or .pyo extension is done based on the __debug__ flag
223 value.
224
225 :param source: The file system path to the source file. The source file
226 does not need to exist, however the PEP 3147 pyc file must exist.
227 :return: The file system path to the legacy pyc file.
228 """
229 pyc_file = imp.cache_from_source(source)
230 up_one = os.path.dirname(os.path.abspath(source))
231 legacy_pyc = os.path.join(up_one, source + ('c' if __debug__ else 'o'))
232 os.rename(pyc_file, legacy_pyc)
233 return legacy_pyc
234
Guido van Rossum3bead091992-01-27 17:00:37 +0000235def forget(modname):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000236 """'Forget' a module was ever imported.
237
238 This removes the module from sys.modules and deletes any PEP 3147 or
239 legacy .pyc and .pyo files.
240 """
Fred Drake004d5e62000-10-23 17:22:08 +0000241 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000242 for dirname in sys.path:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000243 source = os.path.join(dirname, modname + '.py')
244 # It doesn't matter if they exist or not, unlink all possible
245 # combinations of PEP 3147 and legacy pyc and pyo files.
246 unlink(source + 'c')
247 unlink(source + 'o')
248 unlink(imp.cache_from_source(source, debug_override=True))
249 unlink(imp.cache_from_source(source, debug_override=False))
Guido van Rossum3bead091992-01-27 17:00:37 +0000250
Antoine Pitrou4914f9e2011-02-26 16:49:08 +0000251# On some platforms, should not run gui test even if it is allowed
252# in `use_resources'.
253if sys.platform.startswith('win'):
254 import ctypes
255 import ctypes.wintypes
256 def _is_gui_available():
257 UOI_FLAGS = 1
258 WSF_VISIBLE = 0x0001
259 class USEROBJECTFLAGS(ctypes.Structure):
260 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
261 ("fReserved", ctypes.wintypes.BOOL),
262 ("dwFlags", ctypes.wintypes.DWORD)]
263 dll = ctypes.windll.user32
264 h = dll.GetProcessWindowStation()
265 if not h:
266 raise ctypes.WinError()
267 uof = USEROBJECTFLAGS()
268 needed = ctypes.wintypes.DWORD()
269 res = dll.GetUserObjectInformationW(h,
270 UOI_FLAGS,
271 ctypes.byref(uof),
272 ctypes.sizeof(uof),
273 ctypes.byref(needed))
274 if not res:
275 raise ctypes.WinError()
276 return bool(uof.dwFlags & WSF_VISIBLE)
277else:
278 def _is_gui_available():
279 return True
280
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000281def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000282 """Test whether a resource is enabled. Known resources are set by
283 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000284 return use_resources is not None and resource in use_resources
285
Barry Warsawc0fb6052001-08-20 22:29:23 +0000286def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000287 """Raise ResourceDenied if the specified resource is not available.
288
289 If the caller's module is __main__ then automatically return True. The
Barry Warsaw28a691b2010-04-17 00:19:56 +0000290 possibility of False being returned occurs when regrtest.py is
291 executing.
292 """
Antoine Pitrou4914f9e2011-02-26 16:49:08 +0000293 if resource == 'gui' and not _is_gui_available():
294 raise unittest.SkipTest("Cannot use the 'gui' resource")
Skip Montanarod839ecd2003-04-24 19:06:57 +0000295 # see if the caller's module is __main__ - if so, treat as if
296 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000297 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000298 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000299 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000300 if msg is None:
301 msg = "Use of the `%s' resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000302 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000303
Victor Stinner88701e22011-06-01 13:13:04 +0200304def requires_mac_ver(*min_version):
305 """Decorator raising SkipTest if the OS is Mac OS X and the OS X
306 version if less than min_version.
307
308 For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
309 is lesser than 10.5.
310 """
311 def decorator(func):
312 @functools.wraps(func)
313 def wrapper(*args, **kw):
314 if sys.platform == 'darwin':
315 version_txt = platform.mac_ver()[0]
316 try:
317 version = tuple(map(int, version_txt.split('.')))
318 except ValueError:
319 pass
320 else:
321 if version < min_version:
322 min_version_txt = '.'.join(map(str, min_version))
323 raise unittest.SkipTest(
324 "Mac OS X %s or higher required, not %s"
325 % (min_version_txt, version_txt))
326 return func(*args, **kw)
327 wrapper.min_version = min_version
328 return wrapper
329 return decorator
330
Christian Heimes5e696852008-04-09 08:37:03 +0000331HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000332
Christian Heimes5e696852008-04-09 08:37:03 +0000333def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
334 """Returns an unused port that should be suitable for binding. This is
335 achieved by creating a temporary socket with the same family and type as
336 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
337 the specified host address (defaults to 0.0.0.0) with the port set to 0,
338 eliciting an unused ephemeral port from the OS. The temporary socket is
339 then closed and deleted, and the ephemeral port is returned.
340
341 Either this method or bind_port() should be used for any tests where a
342 server socket needs to be bound to a particular port for the duration of
343 the test. Which one to use depends on whether the calling code is creating
344 a python socket, or if an unused port needs to be provided in a constructor
345 or passed to an external program (i.e. the -accept argument to openssl's
346 s_server mode). Always prefer bind_port() over find_unused_port() where
347 possible. Hard coded ports should *NEVER* be used. As soon as a server
348 socket is bound to a hard coded port, the ability to run multiple instances
349 of the test simultaneously on the same host is compromised, which makes the
350 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
351 may simply manifest as a failed test, which can be recovered from without
352 intervention in most cases, but on Windows, the entire python process can
353 completely and utterly wedge, requiring someone to log in to the buildbot
354 and manually kill the affected process.
355
356 (This is easy to reproduce on Windows, unfortunately, and can be traced to
357 the SO_REUSEADDR socket option having different semantics on Windows versus
358 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
359 listen and then accept connections on identical host/ports. An EADDRINUSE
360 socket.error will be raised at some point (depending on the platform and
361 the order bind and listen were called on each socket).
362
363 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
364 will ever be raised when attempting to bind two identical host/ports. When
365 accept() is called on each socket, the second caller's process will steal
366 the port from the first caller, leaving them both in an awkwardly wedged
367 state where they'll no longer respond to any signals or graceful kills, and
368 must be forcibly killed via OpenProcess()/TerminateProcess().
369
370 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
371 instead of SO_REUSEADDR, which effectively affords the same semantics as
372 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
373 Source world compared to Windows ones, this is a common mistake. A quick
374 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
375 openssl.exe is called with the 's_server' option, for example. See
376 http://bugs.python.org/issue2550 for more info. The following site also
377 has a very thorough description about the implications of both REUSEADDR
378 and EXCLUSIVEADDRUSE on Windows:
379 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
380
381 XXX: although this approach is a vast improvement on previous attempts to
382 elicit unused ports, it rests heavily on the assumption that the ephemeral
383 port returned to us by the OS won't immediately be dished back out to some
384 other process when we close and delete our temporary socket but before our
385 calling code has a chance to bind the returned port. We can deal with this
386 issue if/when we come across it.
387 """
388
389 tempsock = socket.socket(family, socktype)
390 port = bind_port(tempsock)
391 tempsock.close()
392 del tempsock
393 return port
394
395def bind_port(sock, host=HOST):
396 """Bind the socket to a free port and return the port number. Relies on
397 ephemeral ports in order to ensure we are using an unbound port. This is
398 important as many tests may be running simultaneously, especially in a
399 buildbot environment. This method raises an exception if the sock.family
400 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
401 or SO_REUSEPORT set on it. Tests should *never* set these socket options
402 for TCP/IP sockets. The only case for setting these options is testing
403 multicasting via multiple UDP sockets.
404
405 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
406 on Windows), it will be set on the socket. This will prevent anyone else
407 from bind()'ing to our host/port for the duration of the test.
408 """
409
410 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
411 if hasattr(socket, 'SO_REUSEADDR'):
412 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
413 raise TestFailed("tests should never set the SO_REUSEADDR " \
414 "socket option on TCP/IP sockets!")
415 if hasattr(socket, 'SO_REUSEPORT'):
416 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
417 raise TestFailed("tests should never set the SO_REUSEPORT " \
418 "socket option on TCP/IP sockets!")
419 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
420 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
421
422 sock.bind((host, 0))
423 port = sock.getsockname()[1]
424 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000426FUZZ = 1e-6
427
428def fcmp(x, y): # fuzzy comparison function
Neal Norwitz79212992006-08-21 16:27:31 +0000429 if isinstance(x, float) or isinstance(y, float):
Fred Drake004d5e62000-10-23 17:22:08 +0000430 try:
Fred Drake004d5e62000-10-23 17:22:08 +0000431 fuzz = (abs(x) + abs(y)) * FUZZ
432 if abs(x-y) <= fuzz:
433 return 0
434 except:
435 pass
Neal Norwitz79212992006-08-21 16:27:31 +0000436 elif type(x) == type(y) and isinstance(x, (tuple, list)):
Fred Drake004d5e62000-10-23 17:22:08 +0000437 for i in range(min(len(x), len(y))):
438 outcome = fcmp(x[i], y[i])
Fred Drake132dce22000-12-12 23:11:42 +0000439 if outcome != 0:
Fred Drake004d5e62000-10-23 17:22:08 +0000440 return outcome
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000441 return (len(x) > len(y)) - (len(x) < len(y))
442 return (x > y) - (x < y)
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000443
Eric Smithf24a0d92010-12-04 13:32:18 +0000444# decorator for skipping tests on non-IEEE 754 platforms
445requires_IEEE_754 = unittest.skipUnless(
446 float.__getformat__("double").startswith("IEEE"),
447 "test requires IEEE 754 doubles")
448
Finn Bock57bc5fa2002-11-01 18:02:03 +0000449is_jython = sys.platform.startswith('java')
450
Barry Warsaw559f6682001-03-23 18:04:02 +0000451# Filename used for testing
452if os.name == 'java':
453 # Jython disallows @ in module names
454 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000455else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000456 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000457
Antoine Pitrou88909542009-06-29 13:54:42 +0000458# Disambiguate TESTFN for parallel testing, while letting it remain a valid
459# module name.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000460TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
Antoine Pitrou88909542009-06-29 13:54:42 +0000461
Michael Foord2d9c2d52010-05-04 22:29:10 +0000462
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000463# TESTFN_UNICODE is a non-ascii filename
464TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
Victor Stinner74a833f2010-08-18 21:06:23 +0000465if sys.platform == 'darwin':
466 # In Mac OS X's VFS API file names are, by definition, canonically
467 # decomposed Unicode, encoded using UTF-8. See QA1173:
468 # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
469 import unicodedata
470 TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
Antoine Pitrou88909542009-06-29 13:54:42 +0000471TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000472
Victor Stinner09c449c2010-08-13 22:23:24 +0000473# TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000474# encoded by the filesystem encoding (in strict mode). It can be None if we
475# cannot generate such filename.
Victor Stinnera0241c82010-08-15 19:28:21 +0000476TESTFN_UNENCODABLE = None
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000477if os.name in ('nt', 'ce'):
Victor Stinnera0241c82010-08-15 19:28:21 +0000478 # skip win32s (0) or Windows 9x/ME (1)
479 if sys.getwindowsversion().platform >= 2:
Victor Stinner8ce7df62010-09-10 11:19:59 +0000480 # Different kinds of characters from various languages to minimize the
481 # probability that the whole name is encodable to MBCS (issue #9819)
482 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000483 try:
Victor Stinner09c449c2010-08-13 22:23:24 +0000484 TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000485 except UnicodeEncodeError:
486 pass
487 else:
488 print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
489 'Unicode filename tests may not be effective'
Victor Stinner09c449c2010-08-13 22:23:24 +0000490 % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
491 TESTFN_UNENCODABLE = None
Victor Stinnera0241c82010-08-15 19:28:21 +0000492# Mac OS X denies unencodable filenames (invalid utf-8)
Victor Stinner03c9e1d2010-08-14 17:35:20 +0000493elif sys.platform != 'darwin':
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000494 try:
495 # ascii and utf-8 cannot encode the byte 0xff
496 b'\xff'.decode(TESTFN_ENCODING)
497 except UnicodeDecodeError:
498 # 0xff will be encoded using the surrogate character u+DCFF
Victor Stinner09c449c2010-08-13 22:23:24 +0000499 TESTFN_UNENCODABLE = TESTFN \
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000500 + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
501 else:
502 # File system encoding (eg. ISO-8859-* encodings) can encode
503 # the byte 0xff. Skip some unicode filename tests.
Victor Stinnera0241c82010-08-15 19:28:21 +0000504 pass
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000505
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000506# Save the initial cwd
507SAVEDCWD = os.getcwd()
508
509@contextlib.contextmanager
Nick Coghland26c18a2010-08-17 13:06:11 +0000510def temp_cwd(name='tempcwd', quiet=False, path=None):
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000511 """
Nick Coghland26c18a2010-08-17 13:06:11 +0000512 Context manager that temporarily changes the CWD.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000513
Nick Coghland26c18a2010-08-17 13:06:11 +0000514 An existing path may be provided as *path*, in which case this
515 function makes no changes to the file system.
516
517 Otherwise, the new CWD is created in the current directory and it's
518 named *name*. If *quiet* is False (default) and it's not possible to
519 create or change the CWD, an error is raised. If it's True, only a
520 warning is raised and the original CWD is used.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000521 """
522 saved_dir = os.getcwd()
523 is_temporary = False
Nick Coghland26c18a2010-08-17 13:06:11 +0000524 if path is None:
525 path = name
526 try:
527 os.mkdir(name)
528 is_temporary = True
529 except OSError:
530 if not quiet:
531 raise
532 warnings.warn('tests may fail, unable to create temp CWD ' + name,
533 RuntimeWarning, stacklevel=3)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000534 try:
Nick Coghland26c18a2010-08-17 13:06:11 +0000535 os.chdir(path)
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000536 except OSError:
537 if not quiet:
538 raise
539 warnings.warn('tests may fail, unable to change the CWD to ' + name,
540 RuntimeWarning, stacklevel=3)
541 try:
542 yield os.getcwd()
543 finally:
544 os.chdir(saved_dir)
545 if is_temporary:
546 rmtree(name)
547
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000548
Barry Warsaw28a691b2010-04-17 00:19:56 +0000549@contextlib.contextmanager
550def temp_umask(umask):
551 """Context manager that temporarily sets the process umask."""
552 oldmask = os.umask(umask)
553 try:
554 yield
555 finally:
556 os.umask(oldmask)
557
558
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000559def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000560 """Try to find a file on sys.path and the working directory. If it is not
561 found the argument passed to the function is returned (this does not
562 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000563 if os.path.isabs(file):
564 return file
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000565 if subdir is not None:
566 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000567 path = sys.path
568 path = [os.path.dirname(here)] + path
569 for dn in path:
570 fn = os.path.join(dn, file)
571 if os.path.exists(fn): return fn
572 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000573
Tim Peters2f228e72001-05-13 00:19:31 +0000574def sortdict(dict):
575 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000576 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000577 reprpairs = ["%r: %r" % pair for pair in items]
578 withcommas = ", ".join(reprpairs)
579 return "{%s}" % withcommas
580
Benjamin Peterson7522c742009-01-19 21:00:09 +0000581def make_bad_fd():
582 """
583 Create an invalid file descriptor by opening and closing a file and return
584 its fd.
585 """
586 file = open(TESTFN, "wb")
587 try:
588 return file.fileno()
589 finally:
590 file.close()
591 unlink(TESTFN)
592
Thomas Wouters89f507f2006-12-13 04:49:30 +0000593def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000594 testcase.assertRaises(SyntaxError, compile, statement,
595 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000596
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000597def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000598 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000599
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000600 check = kw.pop('check', None)
601
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000602 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000603
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000604 fn = os.path.join(os.path.dirname(__file__), "data", filename)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000605
606 def check_valid_file(fn):
607 f = open(fn, *args, **kw)
608 if check is None:
609 return f
610 elif check(f):
611 f.seek(0)
612 return f
613 f.close()
614
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000615 if os.path.exists(fn):
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000616 f = check_valid_file(fn)
617 if f is not None:
618 return f
619 unlink(fn)
620
621 # Verify the requirement before downloading the file
622 requires('urlfetch')
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000623
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000624 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitroufd0680b2009-11-01 22:13:48 +0000625 f = urllib.request.urlopen(url, timeout=15)
626 try:
627 with open(fn, "wb") as out:
628 s = f.read()
629 while s:
630 out.write(s)
631 s = f.read()
632 finally:
633 f.close()
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000634
635 f = check_valid_file(fn)
636 if f is not None:
637 return f
638 raise TestFailed('invalid resource "%s"' % fn)
639
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000640
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000641class WarningsRecorder(object):
642 """Convenience wrapper for the warnings list returned on
643 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000644 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000645 def __init__(self, warnings_list):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000646 self._warnings = warnings_list
647 self._last = 0
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000648
649 def __getattr__(self, attr):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000650 if len(self._warnings) > self._last:
651 return getattr(self._warnings[-1], attr)
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000652 elif attr in warnings.WarningMessage._WARNING_DETAILS:
653 return None
654 raise AttributeError("%r has no attribute %r" % (self, attr))
655
Florent Xiclunab14930c2010-03-13 15:26:44 +0000656 @property
657 def warnings(self):
658 return self._warnings[self._last:]
659
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000660 def reset(self):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000661 self._last = len(self._warnings)
662
663
664def _filterwarnings(filters, quiet=False):
665 """Catch the warnings, then check if all the expected
666 warnings have been raised and re-raise unexpected warnings.
667 If 'quiet' is True, only re-raise the unexpected warnings.
668 """
669 # Clear the warning registry of the calling module
670 # in order to re-raise the warnings.
671 frame = sys._getframe(2)
672 registry = frame.f_globals.get('__warningregistry__')
673 if registry:
674 registry.clear()
675 with warnings.catch_warnings(record=True) as w:
676 # Set filter "always" to record all warnings. Because
677 # test_warnings swap the module, we need to look up in
678 # the sys.modules dictionary.
679 sys.modules['warnings'].simplefilter("always")
680 yield WarningsRecorder(w)
681 # Filter the recorded warnings
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000682 reraise = list(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000683 missing = []
684 for msg, cat in filters:
685 seen = False
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000686 for w in reraise[:]:
687 warning = w.message
Florent Xiclunab14930c2010-03-13 15:26:44 +0000688 # Filter out the matching messages
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000689 if (re.match(msg, str(warning), re.I) and
690 issubclass(warning.__class__, cat)):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000691 seen = True
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000692 reraise.remove(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000693 if not seen and not quiet:
694 # This filter caught nothing
695 missing.append((msg, cat.__name__))
696 if reraise:
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000697 raise AssertionError("unhandled warning %s" % reraise[0])
Florent Xiclunab14930c2010-03-13 15:26:44 +0000698 if missing:
699 raise AssertionError("filter (%r, %s) did not catch any warning" %
700 missing[0])
701
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000702
703@contextlib.contextmanager
Florent Xiclunab14930c2010-03-13 15:26:44 +0000704def check_warnings(*filters, **kwargs):
705 """Context manager to silence warnings.
706
707 Accept 2-tuples as positional arguments:
708 ("message regexp", WarningCategory)
709
710 Optional argument:
711 - if 'quiet' is True, it does not fail if a filter catches nothing
Florent Xicluna53b506be2010-03-18 20:00:57 +0000712 (default True without argument,
713 default False if some filters are defined)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000714
715 Without argument, it defaults to:
Florent Xicluna53b506be2010-03-18 20:00:57 +0000716 check_warnings(("", Warning), quiet=True)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000717 """
Florent Xicluna53b506be2010-03-18 20:00:57 +0000718 quiet = kwargs.get('quiet')
Florent Xiclunab14930c2010-03-13 15:26:44 +0000719 if not filters:
720 filters = (("", Warning),)
Florent Xicluna53b506be2010-03-18 20:00:57 +0000721 # Preserve backward compatibility
722 if quiet is None:
723 quiet = True
724 return _filterwarnings(filters, quiet)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000725
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000726
727class CleanImport(object):
728 """Context manager to force import to return a new module reference.
729
730 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000731 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000732
733 Use like this:
734
735 with CleanImport("foo"):
Brett Cannonddb5e702010-02-03 22:16:11 +0000736 importlib.import_module("foo") # new reference
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000737 """
738
739 def __init__(self, *module_names):
740 self.original_modules = sys.modules.copy()
741 for module_name in module_names:
742 if module_name in sys.modules:
743 module = sys.modules[module_name]
744 # It is possible that module_name is just an alias for
745 # another module (e.g. stub for modules renamed in 3.x).
746 # In that case, we also need delete the real module to clear
747 # the import cache.
748 if module.__name__ != module_name:
749 del sys.modules[module.__name__]
750 del sys.modules[module_name]
751
752 def __enter__(self):
753 return self
754
755 def __exit__(self, *ignore_exc):
756 sys.modules.update(self.original_modules)
757
758
Walter Dörwald155374d2009-05-01 19:58:58 +0000759class EnvironmentVarGuard(collections.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000760
761 """Class to help protect the environment variable properly. Can be used as
762 a context manager."""
763
764 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000765 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000766 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000767
Walter Dörwald155374d2009-05-01 19:58:58 +0000768 def __getitem__(self, envvar):
769 return self._environ[envvar]
770
771 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000772 # Remember the initial value on the first access
773 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +0000774 self._changed[envvar] = self._environ.get(envvar)
775 self._environ[envvar] = value
776
777 def __delitem__(self, envvar):
778 # Remember the initial value on the first access
779 if envvar not in self._changed:
780 self._changed[envvar] = self._environ.get(envvar)
781 if envvar in self._environ:
782 del self._environ[envvar]
783
784 def keys(self):
785 return self._environ.keys()
786
787 def __iter__(self):
788 return iter(self._environ)
789
790 def __len__(self):
791 return len(self._environ)
792
793 def set(self, envvar, value):
794 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000795
796 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +0000797 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000798
799 def __enter__(self):
800 return self
801
802 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000803 for (k, v) in self._changed.items():
804 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +0000805 if k in self._environ:
806 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +0000807 else:
Walter Dörwald155374d2009-05-01 19:58:58 +0000808 self._environ[k] = v
Nick Coghlan6ead5522009-10-18 13:19:33 +0000809 os.environ = self._environ
810
811
812class DirsOnSysPath(object):
813 """Context manager to temporarily add directories to sys.path.
814
815 This makes a copy of sys.path, appends any directories given
816 as positional arguments, then reverts sys.path to the copied
817 settings when the context ends.
818
819 Note that *all* sys.path modifications in the body of the
820 context manager, including replacement of the object,
821 will be reverted at the end of the block.
822 """
823
824 def __init__(self, *paths):
825 self.original_value = sys.path[:]
826 self.original_object = sys.path
827 sys.path.extend(paths)
828
829 def __enter__(self):
830 return self
831
832 def __exit__(self, *ignore_exc):
833 sys.path = self.original_object
834 sys.path[:] = self.original_value
Walter Dörwald155374d2009-05-01 19:58:58 +0000835
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000836
Guido van Rossumd8faa362007-04-27 19:54:29 +0000837class TransientResource(object):
838
839 """Raise ResourceDenied if an exception is raised while the context manager
840 is in effect that matches the specified exception and attributes."""
841
842 def __init__(self, exc, **kwargs):
843 self.exc = exc
844 self.attrs = kwargs
845
846 def __enter__(self):
847 return self
848
849 def __exit__(self, type_=None, value=None, traceback=None):
850 """If type_ is a subclass of self.exc and value has attributes matching
851 self.attrs, raise ResourceDenied. Otherwise let the exception
852 propagate (if any)."""
853 if type_ is not None and issubclass(self.exc, type_):
854 for attr, attr_value in self.attrs.items():
855 if not hasattr(value, attr):
856 break
857 if getattr(value, attr) != attr_value:
858 break
859 else:
860 raise ResourceDenied("an optional resource is not available")
861
Raymond Hettinger686057b2009-06-04 00:11:54 +0000862# Context managers that raise ResourceDenied when various issues
863# with the Internet connection manifest themselves as exceptions.
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000864# XXX deprecate these and use transient_internet() instead
Raymond Hettinger686057b2009-06-04 00:11:54 +0000865time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
866socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
867ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000868
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000869
Thomas Woutersed03b412007-08-28 21:37:11 +0000870@contextlib.contextmanager
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000871def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitroufec12ff2010-04-21 19:46:23 +0000872 """Return a context manager that raises ResourceDenied when various issues
873 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000874 default_errnos = [
875 ('ECONNREFUSED', 111),
876 ('ECONNRESET', 104),
Antoine Pitrou5d938cb2011-01-08 10:28:11 +0000877 ('EHOSTUNREACH', 113),
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000878 ('ENETUNREACH', 101),
879 ('ETIMEDOUT', 110),
880 ]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000881 default_gai_errnos = [
Antoine Pitrou4875c462011-07-09 02:31:24 +0200882 ('EAI_AGAIN', -3),
Charles-François Natali13859bf2011-12-10 13:16:44 +0100883 ('EAI_FAIL', -4),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000884 ('EAI_NONAME', -2),
885 ('EAI_NODATA', -5),
Antoine Pitrou390ea0f2011-04-29 00:44:33 +0200886 # Encountered when trying to resolve IPv6-only hostnames
887 ('WSANO_DATA', 11004),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000888 ]
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000889
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000890 denied = ResourceDenied("Resource '%s' is not available" % resource_name)
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000891 captured_errnos = errnos
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000892 gai_errnos = []
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000893 if not captured_errnos:
894 captured_errnos = [getattr(errno, name, num)
895 for (name, num) in default_errnos]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000896 gai_errnos = [getattr(socket, name, num)
897 for (name, num) in default_gai_errnos]
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000898
899 def filter_error(err):
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000900 n = getattr(err, 'errno', None)
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000901 if (isinstance(err, socket.timeout) or
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000902 (isinstance(err, socket.gaierror) and n in gai_errnos) or
903 n in captured_errnos):
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000904 if not verbose:
905 sys.stderr.write(denied.args[0] + "\n")
906 raise denied from err
907
908 old_timeout = socket.getdefaulttimeout()
909 try:
910 if timeout is not None:
911 socket.setdefaulttimeout(timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +0000912 yield
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000913 except IOError as err:
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000914 # urllib can wrap original socket errors multiple times (!), we must
915 # unwrap to get at the original error.
916 while True:
917 a = err.args
918 if len(a) >= 1 and isinstance(a[0], IOError):
919 err = a[0]
920 # The error can also be wrapped as args[1]:
921 # except socket.error as msg:
922 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
923 elif len(a) >= 2 and isinstance(a[1], IOError):
924 err = a[1]
925 else:
926 break
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000927 filter_error(err)
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000928 raise
929 # XXX should we catch generic exceptions and look for their
930 # __cause__ or __context__?
931 finally:
932 socket.setdefaulttimeout(old_timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +0000933
934
935@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000936def captured_output(stream_name):
Ezio Melotti07352b02011-05-14 14:51:18 +0300937 """Return a context manager used by captured_stdout/stdin/stderr
Ezio Melottifc778fd2011-05-14 08:22:47 +0300938 that temporarily replaces the sys stream *stream_name* with a StringIO."""
Thomas Woutersed03b412007-08-28 21:37:11 +0000939 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000940 orig_stdout = getattr(sys, stream_name)
941 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000942 try:
943 yield getattr(sys, stream_name)
944 finally:
945 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000946
947def captured_stdout():
Ezio Melottifc778fd2011-05-14 08:22:47 +0300948 """Capture the output of sys.stdout:
949
950 with captured_stdout() as s:
951 print("hello")
952 self.assertEqual(s.getvalue(), "hello")
953 """
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000954 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +0000955
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000956def captured_stderr():
957 return captured_output("stderr")
958
Nick Coghlan6ead5522009-10-18 13:19:33 +0000959def captured_stdin():
960 return captured_output("stdin")
961
Ezio Melotti07352b02011-05-14 14:51:18 +0300962
Benjamin Petersone549ead2009-03-28 21:42:05 +0000963def gc_collect():
964 """Force as many objects as possible to be collected.
965
966 In non-CPython implementations of Python, this is needed because timely
967 deallocation is not guaranteed by the garbage collector. (Even in CPython
968 this can be the case in case of reference cycles.) This means that __del__
969 methods may be called later than expected and weakrefs may remain alive for
970 longer than expected. This function tries its best to force all garbage
971 objects to disappear.
972 """
Benjamin Petersone549ead2009-03-28 21:42:05 +0000973 gc.collect()
Benjamin Petersona6590e82010-04-11 21:22:10 +0000974 if is_jython:
975 time.sleep(0.1)
Benjamin Petersone549ead2009-03-28 21:42:05 +0000976 gc.collect()
977 gc.collect()
978
Thomas Woutersed03b412007-08-28 21:37:11 +0000979
Benjamin Peterson65c66ab2010-10-29 21:31:35 +0000980def python_is_optimized():
981 """Find if Python was built with optimizations."""
Antoine Pitrou64474542010-10-31 11:34:47 +0000982 cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
Benjamin Peterson65c66ab2010-10-29 21:31:35 +0000983 final_opt = ""
984 for opt in cflags.split():
985 if opt.startswith('-O'):
986 final_opt = opt
987 return final_opt and final_opt != '-O0'
988
989
Martin v. Löwis33f79972012-07-29 16:33:05 +0200990_header = '2P'
991if hasattr(sys, "gettotalrefcount"):
992 _header = '2P' + _header
993_vheader = _header + 'P'
994
995def calcobjsize(fmt):
996 return struct.calcsize(_header + fmt + '0P')
997
998def calcvobjsize(fmt):
999 return struct.calcsize(_vheader + fmt + '0P')
1000
1001
1002_TPFLAGS_HAVE_GC = 1<<14
1003_TPFLAGS_HEAPTYPE = 1<<9
1004
1005def check_sizeof(test, o, size):
1006 result = sys.getsizeof(o)
1007 # add GC header size
1008 if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\
1009 ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))):
1010 size += _testcapi.SIZEOF_PYGC_HEAD
1011 msg = 'wrong size for %s: got %d, expected %d' \
1012 % (type(o), result, size)
1013 test.assertEqual(result, size, msg)
1014
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001015#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +00001016# Decorator for running a function in a different locale, correctly resetting
1017# it afterwards.
1018
1019def run_with_locale(catstr, *locales):
1020 def decorator(func):
1021 def inner(*args, **kwds):
1022 try:
1023 import locale
1024 category = getattr(locale, catstr)
1025 orig_locale = locale.setlocale(category)
1026 except AttributeError:
1027 # if the test author gives us an invalid category string
1028 raise
1029 except:
1030 # cannot retrieve original locale, so do nothing
1031 locale = orig_locale = None
1032 else:
1033 for loc in locales:
1034 try:
1035 locale.setlocale(category, loc)
1036 break
1037 except:
1038 pass
1039
1040 # now run the function, resetting the locale on exceptions
1041 try:
1042 return func(*args, **kwds)
1043 finally:
1044 if locale and orig_locale:
1045 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +00001046 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +00001047 inner.__doc__ = func.__doc__
1048 return inner
1049 return decorator
1050
1051#=======================================================================
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001052# Decorator for running a function in a specific timezone, correctly
1053# resetting it afterwards.
1054
1055def run_with_tz(tz):
1056 def decorator(func):
1057 def inner(*args, **kwds):
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001058 try:
1059 tzset = time.tzset
1060 except AttributeError:
1061 raise unittest.SkipTest("tzset required")
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001062 if 'TZ' in os.environ:
1063 orig_tz = os.environ['TZ']
1064 else:
1065 orig_tz = None
1066 os.environ['TZ'] = tz
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001067 tzset()
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001068
1069 # now run the function, resetting the tz on exceptions
1070 try:
1071 return func(*args, **kwds)
1072 finally:
1073 if orig_tz == None:
1074 del os.environ['TZ']
1075 else:
1076 os.environ['TZ'] = orig_tz
1077 time.tzset()
1078
1079 inner.__name__ = func.__name__
1080 inner.__doc__ = func.__doc__
1081 return inner
1082 return decorator
1083
1084#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +00001085# Big-memory-test support. Separate from 'resources' because memory use
1086# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001087
1088# Some handy shorthands. Note that these are used for byte-limits as well
1089# as size-limits, in the various bigmem tests
1090_1M = 1024*1024
1091_1G = 1024 * _1M
1092_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001093_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +00001094
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001095MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001096
Thomas Wouters477c8d52006-05-27 19:21:47 +00001097def set_memlimit(limit):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001098 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001099 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +00001100 sizes = {
1101 'k': 1024,
1102 'm': _1M,
1103 'g': _1G,
1104 't': 1024*_1G,
1105 }
1106 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
1107 re.IGNORECASE | re.VERBOSE)
1108 if m is None:
1109 raise ValueError('Invalid memory limit %r' % (limit,))
1110 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001111 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001112 if memlimit > MAX_Py_ssize_t:
1113 memlimit = MAX_Py_ssize_t
1114 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001115 raise ValueError('Memory limit %r too low to be useful' % (limit,))
1116 max_memuse = memlimit
1117
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001118def _memory_watchdog(start_evt, finish_evt, period=10.0):
1119 """A function which periodically watches the process' memory consumption
1120 and prints it out.
1121 """
1122 # XXX: because of the GIL, and because the very long operations tested
1123 # in most bigmem tests are uninterruptible, the loop below gets woken up
1124 # much less often than expected.
1125 # The polling code should be rewritten in raw C, without holding the GIL,
1126 # and push results onto an anonymous pipe.
1127 try:
1128 page_size = os.sysconf('SC_PAGESIZE')
1129 except (ValueError, AttributeError):
1130 try:
1131 page_size = os.sysconf('SC_PAGE_SIZE')
1132 except (ValueError, AttributeError):
1133 page_size = 4096
1134 procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
1135 try:
1136 f = open(procfile, 'rb')
1137 except IOError as e:
1138 warnings.warn('/proc not available for stats: {}'.format(e),
1139 RuntimeWarning)
1140 sys.stderr.flush()
1141 return
1142 with f:
1143 start_evt.set()
1144 old_data = -1
1145 while not finish_evt.wait(period):
1146 f.seek(0)
1147 statm = f.read().decode('ascii')
1148 data = int(statm.split()[5])
1149 if data != old_data:
1150 old_data = data
1151 print(" ... process data size: {data:.1f}G"
1152 .format(data=data * page_size / (1024 ** 3)))
1153
1154def bigmemtest(size, memuse, dry_run=True):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001155 """Decorator for bigmem tests.
1156
1157 'minsize' is the minimum useful size for the test (in arbitrary,
1158 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001159 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001160
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001161 if 'dry_run' is False, it means the test doesn't support dummy runs
1162 when -M is not specified.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001163 """
1164 def decorator(f):
1165 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00001166 size = wrapper.size
1167 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001168 if not real_max_memuse:
1169 maxsize = 5147
1170 else:
1171 maxsize = size
1172
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001173 if ((real_max_memuse or not dry_run)
1174 and real_max_memuse < maxsize * memuse):
1175 raise unittest.SkipTest(
1176 "not enough memory: %.1fG minimum needed"
1177 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001178
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001179 if real_max_memuse and verbose and threading:
1180 print()
1181 print(" ... expected peak memory use: {peak:.1f}G"
1182 .format(peak=size * memuse / (1024 ** 3)))
1183 sys.stdout.flush()
1184 start_evt = threading.Event()
1185 finish_evt = threading.Event()
1186 t = threading.Thread(target=_memory_watchdog,
1187 args=(start_evt, finish_evt, 0.5))
1188 t.daemon = True
1189 t.start()
1190 start_evt.set()
1191 else:
1192 t = None
1193
1194 try:
1195 return f(self, maxsize)
1196 finally:
1197 if t:
1198 finish_evt.set()
1199 t.join()
1200
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001201 wrapper.size = size
1202 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001203 return wrapper
1204 return decorator
1205
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001206def bigaddrspacetest(f):
1207 """Decorator for tests that fill the address space."""
1208 def wrapper(self):
1209 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou98c62bd2011-01-12 21:58:39 +00001210 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
Antoine Pitroue0d3f8a2011-01-12 21:50:44 +00001211 raise unittest.SkipTest(
1212 "not enough memory: try a 32-bit build instead")
1213 else:
1214 raise unittest.SkipTest(
1215 "not enough memory: %.1fG minimum needed"
1216 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001217 else:
1218 return f(self)
1219 return wrapper
1220
Thomas Wouters477c8d52006-05-27 19:21:47 +00001221#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +00001222# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001223
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001224class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001225 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001226 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001227 test(result)
1228 return result
1229
Benjamin Petersone549ead2009-03-28 21:42:05 +00001230def _id(obj):
1231 return obj
1232
1233def requires_resource(resource):
Antoine Pitrou4914f9e2011-02-26 16:49:08 +00001234 if resource == 'gui' and not _is_gui_available():
1235 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou5bc4fa72010-10-14 15:34:31 +00001236 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +00001237 return _id
1238 else:
1239 return unittest.skip("resource {0!r} is not enabled".format(resource))
1240
1241def cpython_only(test):
1242 """
1243 Decorator for tests only applicable on CPython.
1244 """
1245 return impl_detail(cpython=True)(test)
1246
1247def impl_detail(msg=None, **guards):
1248 if check_impl_detail(**guards):
1249 return _id
1250 if msg is None:
1251 guardnames, default = _parse_guards(guards)
1252 if default:
1253 msg = "implementation detail not available on {0}"
1254 else:
1255 msg = "implementation detail specific to {0}"
1256 guardnames = sorted(guardnames.keys())
1257 msg = msg.format(' or '.join(guardnames))
1258 return unittest.skip(msg)
1259
1260def _parse_guards(guards):
1261 # Returns a tuple ({platform_name: run_me}, default_value)
1262 if not guards:
1263 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +00001264 is_true = list(guards.values())[0]
1265 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001266 return (guards, not is_true)
1267
1268# Use the following check to guard CPython's implementation-specific tests --
1269# or to run them only on the implementation(s) guarded by the arguments.
1270def check_impl_detail(**guards):
1271 """This function returns True or False depending on the host platform.
1272 Examples:
1273 if check_impl_detail(): # only on CPython (default)
1274 if check_impl_detail(jython=True): # only on Jython
1275 if check_impl_detail(cpython=False): # everywhere except on CPython
1276 """
1277 guards, default = _parse_guards(guards)
1278 return guards.get(platform.python_implementation().lower(), default)
1279
1280
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001281def _filter_suite(suite, pred):
1282 """Recursively filter test cases in a suite based on a predicate."""
1283 newtests = []
1284 for test in suite._tests:
1285 if isinstance(test, unittest.TestSuite):
1286 _filter_suite(test, pred)
1287 newtests.append(test)
1288 else:
1289 if pred(test):
1290 newtests.append(test)
1291 suite._tests = newtests
1292
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001293
Guido van Rossumd8faa362007-04-27 19:54:29 +00001294def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +00001295 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001296 if verbose:
Antoine Pitrou216a3bc2011-07-23 22:33:39 +02001297 runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
1298 failfast=failfast)
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001299 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001300 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001301
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001302 result = runner.run(suite)
1303 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +00001304 if len(result.errors) == 1 and not result.failures:
1305 err = result.errors[0][1]
1306 elif len(result.failures) == 1 and not result.errors:
1307 err = result.failures[0][1]
1308 else:
R. David Murray723357e2009-10-19 18:06:17 +00001309 err = "multiple errors occurred"
1310 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +00001311 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +00001312
Barry Warsawc10d6902001-09-20 06:30:41 +00001313
Walter Dörwald21d3a322003-05-01 17:45:56 +00001314def run_unittest(*classes):
1315 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00001316 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001317 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001318 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001319 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001320 if cls in sys.modules:
1321 suite.addTest(unittest.findTestCases(sys.modules[cls]))
1322 else:
1323 raise ValueError("str arguments must be keys in sys.modules")
1324 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +00001325 suite.addTest(cls)
1326 else:
1327 suite.addTest(unittest.makeSuite(cls))
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001328 def case_pred(test):
1329 if match_tests is None:
1330 return True
1331 for name in test.id().split("."):
1332 if fnmatch.fnmatchcase(name, match_tests):
1333 return True
1334 return False
1335 _filter_suite(suite, case_pred)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001336 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001337
Barry Warsawc10d6902001-09-20 06:30:41 +00001338
Tim Petersa0a62222001-09-09 06:12:01 +00001339#=======================================================================
1340# doctest driver.
1341
1342def run_doctest(module, verbosity=None):
Tim Peters17111f32001-10-03 04:08:26 +00001343 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +00001344
1345 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001346 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +00001347 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +00001348 """
1349
1350 import doctest
1351
1352 if verbosity is None:
1353 verbosity = verbose
1354 else:
1355 verbosity = None
1356
Victor Stinnerbddc4d42011-06-29 15:52:46 +02001357 f, t = doctest.testmod(module, verbose=verbosity)
1358 if f:
1359 raise TestFailed("%d of %d doctests failed" % (f, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001360 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001361 print('doctest (%s) ... %d tests with zero failures' %
1362 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001363 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001364
Antoine Pitrou060cee22009-11-13 16:29:04 +00001365
1366#=======================================================================
1367# Support for saving and restoring the imported modules.
1368
1369def modules_setup():
1370 return sys.modules.copy(),
1371
1372def modules_cleanup(oldmodules):
1373 # Encoders/decoders are registered permanently within the internal
1374 # codec cache. If we destroy the corresponding modules their
1375 # globals will be set to None which will trip up the cached functions.
1376 encodings = [(k, v) for k, v in sys.modules.items()
1377 if k.startswith('encodings.')]
1378 sys.modules.clear()
1379 sys.modules.update(encodings)
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001380 # XXX: This kind of problem can affect more than just encodings. In particular
Eric Smitha3e8f3d2011-01-11 10:24:34 +00001381 # extension modules (such as _ssl) don't cope with reloading properly.
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001382 # Really, test modules should be cleaning out the test specific modules they
1383 # know they added (ala test_runpy) rather than relying on this function (as
1384 # test_importhooks and test_pkg do currently).
1385 # Implicitly imported *real* modules should be left alone (see issue 10556).
Antoine Pitrou060cee22009-11-13 16:29:04 +00001386 sys.modules.update(oldmodules)
1387
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001388#=======================================================================
1389# Threading support to prevent reporting refleaks when running regrtest.py -R
1390
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001391# NOTE: we use thread._count() rather than threading.enumerate() (or the
1392# moral equivalent thereof) because a threading.Thread object is still alive
1393# until its __bootstrap() method has returned, even after it has been
1394# unregistered from the threading module.
1395# thread._count(), on the other hand, only gets decremented *after* the
1396# __bootstrap() method has returned, which gives us reliable reference counts
1397# at the end of a test run.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001398
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001399def threading_setup():
Victor Stinner45df8202010-04-28 22:31:17 +00001400 if _thread:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001401 return _thread._count(), threading._dangling.copy()
Victor Stinner45df8202010-04-28 22:31:17 +00001402 else:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001403 return 1, ()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001404
Antoine Pitrou707f2282011-07-15 22:29:44 +02001405def threading_cleanup(*original_values):
Victor Stinner45df8202010-04-28 22:31:17 +00001406 if not _thread:
1407 return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001408 _MAX_COUNT = 10
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001409 for count in range(_MAX_COUNT):
Antoine Pitrou707f2282011-07-15 22:29:44 +02001410 values = _thread._count(), threading._dangling
1411 if values == original_values:
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001412 break
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001413 time.sleep(0.1)
Antoine Pitrou707f2282011-07-15 22:29:44 +02001414 gc_collect()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001415 # XXX print a warning in case of failure?
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001416
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001417def reap_threads(func):
Victor Stinner45df8202010-04-28 22:31:17 +00001418 """Use this function when threads are being used. This will
1419 ensure that the threads are cleaned up even when the test fails.
1420 If threading is unavailable this function does nothing.
1421 """
1422 if not _thread:
1423 return func
1424
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001425 @functools.wraps(func)
1426 def decorator(*args):
1427 key = threading_setup()
1428 try:
1429 return func(*args)
1430 finally:
1431 threading_cleanup(*key)
1432 return decorator
1433
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001434def reap_children():
1435 """Use this function at the end of test_main() whenever sub-processes
1436 are started. This will help ensure that no extra children (zombies)
1437 stick around to hog resources and create problems when looking
1438 for refleaks.
1439 """
1440
1441 # Reap all our dead child processes so we don't leave zombies around.
1442 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001443 if hasattr(os, 'waitpid'):
1444 any_process = -1
1445 while True:
1446 try:
1447 # This will raise an exception on Windows. That's ok.
1448 pid, status = os.waitpid(any_process, os.WNOHANG)
1449 if pid == 0:
1450 break
1451 except:
1452 break
Collin Winterf2bf2b32010-03-17 00:41:56 +00001453
1454@contextlib.contextmanager
1455def swap_attr(obj, attr, new_val):
1456 """Temporary swap out an attribute with a new object.
1457
1458 Usage:
1459 with swap_attr(obj, "attr", 5):
1460 ...
1461
1462 This will set obj.attr to 5 for the duration of the with: block,
1463 restoring the old value at the end of the block. If `attr` doesn't
1464 exist on `obj`, it will be created and then deleted at the end of the
1465 block.
1466 """
1467 if hasattr(obj, attr):
1468 real_val = getattr(obj, attr)
1469 setattr(obj, attr, new_val)
1470 try:
1471 yield
1472 finally:
1473 setattr(obj, attr, real_val)
1474 else:
1475 setattr(obj, attr, new_val)
1476 try:
1477 yield
1478 finally:
1479 delattr(obj, attr)
1480
1481@contextlib.contextmanager
1482def swap_item(obj, item, new_val):
1483 """Temporary swap out an item with a new object.
1484
1485 Usage:
1486 with swap_item(obj, "item", 5):
1487 ...
1488
1489 This will set obj["item"] to 5 for the duration of the with: block,
1490 restoring the old value at the end of the block. If `item` doesn't
1491 exist on `obj`, it will be created and then deleted at the end of the
1492 block.
1493 """
1494 if item in obj:
1495 real_val = obj[item]
1496 obj[item] = new_val
1497 try:
1498 yield
1499 finally:
1500 obj[item] = real_val
1501 else:
1502 obj[item] = new_val
1503 try:
1504 yield
1505 finally:
1506 del obj[item]
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001507
1508def strip_python_stderr(stderr):
1509 """Strip the stderr of a Python process from potential debug output
1510 emitted by the interpreter.
1511
1512 This will typically be run on the result of the communicate() method
1513 of a subprocess.Popen object.
1514 """
1515 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
1516 return stderr
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +00001517
1518def args_from_interpreter_flags():
1519 """Return a list of command-line arguments reproducing the current
1520 settings in sys.flags."""
1521 flag_opt_map = {
1522 'bytes_warning': 'b',
1523 'dont_write_bytecode': 'B',
Antoine Pitroue9f637b2012-02-20 23:49:07 +01001524 'hash_randomization': 'R',
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +00001525 'ignore_environment': 'E',
1526 'no_user_site': 's',
1527 'no_site': 'S',
1528 'optimize': 'O',
1529 'verbose': 'v',
1530 }
1531 args = []
1532 for flag, opt in flag_opt_map.items():
1533 v = getattr(sys.flags, flag)
1534 if v > 0:
1535 args.append('-' + opt * v)
1536 return args
Vinay Sajip129fd042010-12-10 08:19:38 +00001537
1538#============================================================
1539# Support for assertions about logging.
1540#============================================================
1541
1542class TestHandler(logging.handlers.BufferingHandler):
1543 def __init__(self, matcher):
1544 # BufferingHandler takes a "capacity" argument
1545 # so as to know when to flush. As we're overriding
1546 # shouldFlush anyway, we can set a capacity of zero.
1547 # You can call flush() manually to clear out the
1548 # buffer.
1549 logging.handlers.BufferingHandler.__init__(self, 0)
1550 self.matcher = matcher
1551
1552 def shouldFlush(self):
1553 return False
1554
1555 def emit(self, record):
1556 self.format(record)
1557 self.buffer.append(record.__dict__)
1558
1559 def matches(self, **kwargs):
1560 """
1561 Look for a saved dict whose keys/values match the supplied arguments.
1562 """
1563 result = False
1564 for d in self.buffer:
1565 if self.matcher.matches(d, **kwargs):
1566 result = True
1567 break
1568 return result
1569
1570class Matcher(object):
1571
1572 _partial_matches = ('msg', 'message')
1573
1574 def matches(self, d, **kwargs):
1575 """
1576 Try to match a single dict with the supplied arguments.
1577
1578 Keys whose values are strings and which are in self._partial_matches
1579 will be checked for partial (i.e. substring) matches. You can extend
1580 this scheme to (for example) do regular expression matching, etc.
1581 """
1582 result = True
1583 for k in kwargs:
1584 v = kwargs[k]
1585 dv = d.get(k)
1586 if not self.match_value(k, dv, v):
1587 result = False
1588 break
1589 return result
1590
1591 def match_value(self, k, dv, v):
1592 """
1593 Try to match a single stored value (dv) with a supplied value (v).
1594 """
1595 if type(v) != type(dv):
1596 result = False
1597 elif type(dv) is not str or k not in self._partial_matches:
1598 result = (v == dv)
1599 else:
1600 result = dv.find(v) >= 0
1601 return result
Brian Curtin3b4499c2010-12-28 14:31:47 +00001602
1603
1604_can_symlink = None
1605def can_symlink():
1606 global _can_symlink
1607 if _can_symlink is not None:
1608 return _can_symlink
Victor Stinner62ec61f2011-06-07 12:17:15 +02001609 symlink_path = TESTFN + "can_symlink"
Brian Curtin3b4499c2010-12-28 14:31:47 +00001610 try:
Victor Stinner62ec61f2011-06-07 12:17:15 +02001611 os.symlink(TESTFN, symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001612 can = True
Brian Curtind25aef52011-06-13 15:16:04 -05001613 except (OSError, NotImplementedError, AttributeError):
Brian Curtin3b4499c2010-12-28 14:31:47 +00001614 can = False
Victor Stinner62ec61f2011-06-07 12:17:15 +02001615 else:
1616 os.remove(symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001617 _can_symlink = can
1618 return can
1619
1620def skip_unless_symlink(test):
1621 """Skip decorator for tests that require functional symlink"""
1622 ok = can_symlink()
1623 msg = "Requires functional symlink implementation"
1624 return test if ok else unittest.skip(msg)(test)
Antoine Pitroue8706232011-03-15 21:05:36 +01001625
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001626def patch(test_instance, object_to_patch, attr_name, new_value):
1627 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1628
1629 Also, add a cleanup procedure to 'test_instance' to restore
1630 'object_to_patch' value for 'attr_name'.
1631 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1632
1633 """
1634 # check that 'attr_name' is a real attribute for 'object_to_patch'
1635 # will raise AttributeError if it does not exist
1636 getattr(object_to_patch, attr_name)
1637
1638 # keep a copy of the old value
1639 attr_is_local = False
1640 try:
1641 old_value = object_to_patch.__dict__[attr_name]
1642 except (AttributeError, KeyError):
1643 old_value = getattr(object_to_patch, attr_name, None)
1644 else:
1645 attr_is_local = True
1646
1647 # restore the value when the test is done
1648 def cleanup():
1649 if attr_is_local:
1650 setattr(object_to_patch, attr_name, old_value)
1651 else:
1652 delattr(object_to_patch, attr_name)
1653
1654 test_instance.addCleanup(cleanup)
1655
1656 # actually override the attribute
1657 setattr(object_to_patch, attr_name, new_value)