blob: bc5176acf492071c9d942918627ad951b8af76c4 [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
Raymond Hettinger57d1a882011-02-23 00:46:28 +000018import collections.abc
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
Antoine Pitrou75e78b62011-10-04 11:51:23 +020026import struct
Hynek Schlawacke02ba102012-05-23 11:22:44 +020027import tempfile
Martin v. Löwis33f79972012-07-29 16:33:05 +020028import _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
Antoine Pitrou75e78b62011-10-04 11:51:23 +020040try:
Ezio Melotticad648c2011-05-19 21:25:10 +030041 import zlib
42except ImportError:
43 zlib = None
44
Martin v. Löwisf6b16a42012-05-01 07:58:44 +020045try:
46 import bz2
47except ImportError:
48 bz2 = None
49
Martin v. Löwis7fb79fc2012-05-13 10:06:36 +020050try:
51 import lzma
52except ImportError:
53 lzma = None
54
Barry Warsaw28a691b2010-04-17 00:19:56 +000055__all__ = [
Hynek Schlawacke02ba102012-05-23 11:22:44 +020056 "Error", "TestFailed", "ResourceDenied", "import_module", "verbose",
57 "use_resources", "max_memuse", "record_original_stdout",
Barry Warsaw28a691b2010-04-17 00:19:56 +000058 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
Charles-François Natali87b3c922011-10-03 19:40:37 +020059 "is_resource_enabled", "requires", "requires_freebsd_version",
Hynek Schlawacke02ba102012-05-23 11:22:44 +020060 "requires_linux_version", "requires_mac_ver", "find_unused_port",
61 "bind_port", "IPV6_ENABLED", "is_jython", "TESTFN", "HOST", "SAVEDCWD",
62 "temp_cwd", "findfile", "create_empty_file", "sortdict",
63 "check_syntax_error", "open_urlresource", "check_warnings", "CleanImport",
64 "EnvironmentVarGuard", "TransientResource", "captured_stdout",
65 "captured_stdin", "captured_stderr", "time_out", "socket_peer_reset",
66 "ioerror_peer_reset", "run_with_locale", 'temp_umask',
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +020067 "transient_internet", "set_memlimit", "bigmemtest", "bigaddrspacetest",
68 "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup",
69 "threading_cleanup", "reap_children", "cpython_only", "check_impl_detail",
70 "get_attribute", "swap_item", "swap_attr", "requires_IEEE_754",
Benjamin Peterson31dc3732011-05-08 15:34:24 -050071 "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
Hynek Schlawacke02ba102012-05-23 11:22:44 +020072 "skip_unless_xattr", "import_fresh_module", "requires_zlib",
73 "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz",
Ezio Melotti25a40452013-03-05 20:26:17 +020074 "requires_bz2", "requires_lzma", "suppress_crash_popup",
Antoine Pitrou4d7979b2010-09-07 21:22:56 +000075 ]
Florent Xiclunaf089fd62010-03-19 14:25:03 +000076
Fred Drake1790dd42000-07-24 06:55:00 +000077class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000078 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000079
80class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000081 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000082
Benjamin Petersone549ead2009-03-28 21:42:05 +000083class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000084 """Test skipped because it requested a disallowed resource.
85
86 This is raised when a test calls requires() for a resource that
87 has not be enabled. It is used to distinguish between expected
88 and unexpected skips.
89 """
90
Nick Coghlanfce769e2009-04-11 14:30:59 +000091@contextlib.contextmanager
92def _ignore_deprecated_imports(ignore=True):
93 """Context manager to suppress package and module deprecation
94 warnings when importing them.
95
96 If ignore is False, this context manager has no effect."""
97 if ignore:
98 with warnings.catch_warnings():
99 warnings.filterwarnings("ignore", ".+ (module|package)",
100 DeprecationWarning)
101 yield
102 else:
103 yield
104
105
Benjamin Peterson699adb92008-05-08 22:27:58 +0000106def import_module(name, deprecated=False):
R. David Murraya21e4ca2009-03-31 23:16:50 +0000107 """Import and return the module to be tested, raising SkipTest if
108 it is not available.
109
110 If deprecated is True, any module or package deprecation messages
111 will be suppressed."""
Nick Coghlanfce769e2009-04-11 14:30:59 +0000112 with _ignore_deprecated_imports(deprecated):
Benjamin Peterson699adb92008-05-08 22:27:58 +0000113 try:
Nick Coghlanfce769e2009-04-11 14:30:59 +0000114 return importlib.import_module(name)
R. David Murraya21e4ca2009-03-31 23:16:50 +0000115 except ImportError as msg:
116 raise unittest.SkipTest(str(msg))
Nick Coghlanfce769e2009-04-11 14:30:59 +0000117
118
Nick Coghlan47384702009-04-22 16:13:36 +0000119def _save_and_remove_module(name, orig_modules):
120 """Helper function to save and remove a module from sys.modules
121
Ezio Melotti199e0852011-05-09 06:41:55 +0300122 Raise ImportError if the module can't be imported."""
Ezio Melottifec3ad12011-05-14 06:02:25 +0300123 # try to import the module and raise an error if it can't be imported
124 if name not in sys.modules:
Ezio Melotti199e0852011-05-09 06:41:55 +0300125 __import__(name)
Nick Coghlan47384702009-04-22 16:13:36 +0000126 del sys.modules[name]
Ezio Melottifec3ad12011-05-14 06:02:25 +0300127 for modname in list(sys.modules):
128 if modname == name or modname.startswith(name + '.'):
129 orig_modules[modname] = sys.modules[modname]
130 del sys.modules[modname]
Nick Coghlan47384702009-04-22 16:13:36 +0000131
132def _save_and_block_module(name, orig_modules):
133 """Helper function to save and block a module in sys.modules
134
Ezio Melotti199e0852011-05-09 06:41:55 +0300135 Return True if the module was in sys.modules, False otherwise."""
Nick Coghlan47384702009-04-22 16:13:36 +0000136 saved = True
137 try:
138 orig_modules[name] = sys.modules[name]
139 except KeyError:
140 saved = False
Alexander Belopolsky903396e2010-07-13 14:50:16 +0000141 sys.modules[name] = None
Nick Coghlan47384702009-04-22 16:13:36 +0000142 return saved
143
144
Nick Coghlan2496f332011-09-19 20:26:31 +1000145def anticipate_failure(condition):
146 """Decorator to mark a test that is known to be broken in some cases
147
148 Any use of this decorator should have a comment identifying the
149 associated tracker issue.
150 """
151 if condition:
152 return unittest.expectedFailure
153 return lambda f: f
154
155
Nick Coghlan47384702009-04-22 16:13:36 +0000156def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000157 """Imports and returns a module, deliberately bypassing the sys.modules cache
158 and importing a fresh copy of the module. Once the import is complete,
159 the sys.modules cache is restored to its original state.
160
Nick Coghlan47384702009-04-22 16:13:36 +0000161 Modules named in fresh are also imported anew if needed by the import.
Ezio Melotti199e0852011-05-09 06:41:55 +0300162 If one of these modules can't be imported, None is returned.
Nick Coghlan47384702009-04-22 16:13:36 +0000163
164 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000165 takes place.
166
167 If deprecated is True, any module or package deprecation messages
168 will be suppressed."""
Ezio Melotti6b60fb92011-05-14 06:47:51 +0300169 # NOTE: test_heapq, test_json and test_warnings include extra sanity checks
170 # to make sure that this utility function is working as expected
Nick Coghlanfce769e2009-04-11 14:30:59 +0000171 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000172 # Keep track of modules saved for later restoration as well
173 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000174 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000175 names_to_remove = []
176 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000177 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000178 for fresh_name in fresh:
179 _save_and_remove_module(fresh_name, orig_modules)
180 for blocked_name in blocked:
181 if not _save_and_block_module(blocked_name, orig_modules):
182 names_to_remove.append(blocked_name)
183 fresh_module = importlib.import_module(name)
Ezio Melotti199e0852011-05-09 06:41:55 +0300184 except ImportError:
185 fresh_module = None
Nick Coghlanfce769e2009-04-11 14:30:59 +0000186 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000187 for orig_name, module in orig_modules.items():
188 sys.modules[orig_name] = module
189 for name_to_remove in names_to_remove:
190 del sys.modules[name_to_remove]
191 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000192
Benjamin Peterson699adb92008-05-08 22:27:58 +0000193
R. David Murraya21e4ca2009-03-31 23:16:50 +0000194def get_attribute(obj, name):
195 """Get an attribute, raising SkipTest if AttributeError is raised."""
196 try:
197 attribute = getattr(obj, name)
198 except AttributeError:
Éric Araujo4300f692011-10-05 01:50:22 +0200199 raise unittest.SkipTest("object %r has no attribute %r" % (obj, name))
R. David Murraya21e4ca2009-03-31 23:16:50 +0000200 else:
201 return attribute
202
Barry Warsawc0fb6052001-08-20 22:29:23 +0000203verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000204use_resources = None # Flag set to [] by regrtest.py
205max_memuse = 0 # Disable bigmem tests (they will still be run with
206 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000207real_max_memuse = 0
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200208failfast = False
Antoine Pitroub9c73e82011-07-29 23:53:38 +0200209match_tests = None
Guido van Rossum531661c1996-12-20 02:58:22 +0000210
Tim Peters8dee8092001-09-25 20:05:11 +0000211# _original_stdout is meant to hold stdout at the time regrtest began.
212# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
213# The point is to have some flavor of stdout the user can actually see.
214_original_stdout = None
215def record_original_stdout(stdout):
216 global _original_stdout
217 _original_stdout = stdout
218
219def get_original_stdout():
220 return _original_stdout or sys.stdout
221
Guido van Rossum3bead091992-01-27 17:00:37 +0000222def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000223 try:
224 del sys.modules[name]
225 except KeyError:
226 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000227
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500228if sys.platform.startswith("win"):
229 def _waitfor(func, pathname, waitall=False):
230 # Peform the operation
231 func(pathname)
232 # Now setup the wait loop
233 if waitall:
234 dirname = pathname
235 else:
236 dirname, name = os.path.split(pathname)
237 dirname = dirname or '.'
238 # Check for `pathname` to be removed from the filesystem.
239 # The exponential backoff of the timeout amounts to a total
240 # of ~1 second after which the deletion is probably an error
241 # anyway.
242 # Testing on a i7@4.3GHz shows that usually only 1 iteration is
243 # required when contention occurs.
244 timeout = 0.001
245 while timeout < 1.0:
246 # Note we are only testing for the existance of the file(s) in
247 # the contents of the directory regardless of any security or
248 # access rights. If we have made it this far, we have sufficient
249 # permissions to do that much using Python's equivalent of the
250 # Windows API FindFirstFile.
251 # Other Windows APIs can fail or give incorrect results when
252 # dealing with files that are pending deletion.
253 L = os.listdir(dirname)
254 if not (L if waitall else name in L):
255 return
256 # Increase the timeout and try again
257 time.sleep(timeout)
258 timeout *= 2
259 warnings.warn('tests may fail, delete still pending for ' + pathname,
260 RuntimeWarning, stacklevel=4)
261
262 def _unlink(filename):
263 _waitfor(os.unlink, filename)
264
265 def _rmdir(dirname):
266 _waitfor(os.rmdir, dirname)
267
268 def _rmtree(path):
269 def _rmtree_inner(path):
270 for name in os.listdir(path):
271 fullname = os.path.join(path, name)
272 if os.path.isdir(fullname):
273 _waitfor(_rmtree_inner, fullname, waitall=True)
274 os.rmdir(fullname)
275 else:
276 os.unlink(fullname)
277 _waitfor(_rmtree_inner, path, waitall=True)
278 _waitfor(os.rmdir, path)
279else:
280 _unlink = os.unlink
281 _rmdir = os.rmdir
282 _rmtree = shutil.rmtree
283
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000284def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000285 try:
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500286 _unlink(filename)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000287 except OSError as error:
288 # The filename need not exist.
Michael Foord2d9c2d52010-05-04 22:29:10 +0000289 if error.errno not in (errno.ENOENT, errno.ENOTDIR):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000290 raise
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000291
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500292def rmdir(dirname):
293 try:
294 _rmdir(dirname)
295 except OSError as error:
296 # The directory need not exist.
297 if error.errno != errno.ENOENT:
298 raise
299
Christian Heimes23daade02008-02-25 12:39:23 +0000300def rmtree(path):
301 try:
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500302 _rmtree(path)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000303 except OSError as error:
Antoine Pitrou7a18d212011-08-30 18:34:47 +0200304 if error.errno != errno.ENOENT:
Christian Heimes23daade02008-02-25 12:39:23 +0000305 raise
306
Barry Warsaw28a691b2010-04-17 00:19:56 +0000307def make_legacy_pyc(source):
308 """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
309
310 The choice of .pyc or .pyo extension is done based on the __debug__ flag
311 value.
312
313 :param source: The file system path to the source file. The source file
314 does not need to exist, however the PEP 3147 pyc file must exist.
315 :return: The file system path to the legacy pyc file.
316 """
317 pyc_file = imp.cache_from_source(source)
318 up_one = os.path.dirname(os.path.abspath(source))
319 legacy_pyc = os.path.join(up_one, source + ('c' if __debug__ else 'o'))
320 os.rename(pyc_file, legacy_pyc)
321 return legacy_pyc
322
Guido van Rossum3bead091992-01-27 17:00:37 +0000323def forget(modname):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000324 """'Forget' a module was ever imported.
325
326 This removes the module from sys.modules and deletes any PEP 3147 or
327 legacy .pyc and .pyo files.
328 """
Fred Drake004d5e62000-10-23 17:22:08 +0000329 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000330 for dirname in sys.path:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000331 source = os.path.join(dirname, modname + '.py')
332 # It doesn't matter if they exist or not, unlink all possible
333 # combinations of PEP 3147 and legacy pyc and pyo files.
334 unlink(source + 'c')
335 unlink(source + 'o')
336 unlink(imp.cache_from_source(source, debug_override=True))
337 unlink(imp.cache_from_source(source, debug_override=False))
Guido van Rossum3bead091992-01-27 17:00:37 +0000338
Antoine Pitroud20a5f62011-02-26 15:58:05 +0000339# On some platforms, should not run gui test even if it is allowed
340# in `use_resources'.
341if sys.platform.startswith('win'):
342 import ctypes
343 import ctypes.wintypes
344 def _is_gui_available():
345 UOI_FLAGS = 1
346 WSF_VISIBLE = 0x0001
347 class USEROBJECTFLAGS(ctypes.Structure):
348 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
349 ("fReserved", ctypes.wintypes.BOOL),
350 ("dwFlags", ctypes.wintypes.DWORD)]
351 dll = ctypes.windll.user32
352 h = dll.GetProcessWindowStation()
353 if not h:
354 raise ctypes.WinError()
355 uof = USEROBJECTFLAGS()
356 needed = ctypes.wintypes.DWORD()
357 res = dll.GetUserObjectInformationW(h,
358 UOI_FLAGS,
359 ctypes.byref(uof),
360 ctypes.sizeof(uof),
361 ctypes.byref(needed))
362 if not res:
363 raise ctypes.WinError()
364 return bool(uof.dwFlags & WSF_VISIBLE)
365else:
366 def _is_gui_available():
367 return True
368
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000369def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000370 """Test whether a resource is enabled. Known resources are set by
371 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000372 return use_resources is not None and resource in use_resources
373
Barry Warsawc0fb6052001-08-20 22:29:23 +0000374def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000375 """Raise ResourceDenied if the specified resource is not available.
376
377 If the caller's module is __main__ then automatically return True. The
Barry Warsaw28a691b2010-04-17 00:19:56 +0000378 possibility of False being returned occurs when regrtest.py is
379 executing.
380 """
Antoine Pitroud20a5f62011-02-26 15:58:05 +0000381 if resource == 'gui' and not _is_gui_available():
382 raise unittest.SkipTest("Cannot use the 'gui' resource")
Skip Montanarod839ecd2003-04-24 19:06:57 +0000383 # see if the caller's module is __main__ - if so, treat as if
384 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000385 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000386 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000387 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000388 if msg is None:
Éric Araujoaf5bacf2011-07-15 17:50:15 +0200389 msg = "Use of the %r resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000390 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000391
Charles-François Natali87b3c922011-10-03 19:40:37 +0200392def _requires_unix_version(sysname, min_version):
393 """Decorator raising SkipTest if the OS is `sysname` and the version is less
394 than `min_version`.
Charles-François Natali239bb962011-06-03 12:55:15 +0200395
Charles-François Natali87b3c922011-10-03 19:40:37 +0200396 For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if
397 the FreeBSD version is less than 7.2.
Charles-François Natali239bb962011-06-03 12:55:15 +0200398 """
399 def decorator(func):
400 @functools.wraps(func)
401 def wrapper(*args, **kw):
Charles-François Natali87b3c922011-10-03 19:40:37 +0200402 if platform.system() == sysname:
Charles-François Natali239bb962011-06-03 12:55:15 +0200403 version_txt = platform.release().split('-', 1)[0]
404 try:
405 version = tuple(map(int, version_txt.split('.')))
406 except ValueError:
407 pass
408 else:
409 if version < min_version:
410 min_version_txt = '.'.join(map(str, min_version))
411 raise unittest.SkipTest(
Charles-François Natali87b3c922011-10-03 19:40:37 +0200412 "%s version %s or higher required, not %s"
413 % (sysname, min_version_txt, version_txt))
Charles-François Natali239bb962011-06-03 12:55:15 +0200414 return wrapper
415 return decorator
Victor Stinnerfea0f4d2011-05-24 00:24:19 +0200416
Charles-François Natali87b3c922011-10-03 19:40:37 +0200417def requires_freebsd_version(*min_version):
418 """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version is
419 less than `min_version`.
420
421 For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD
422 version is less than 7.2.
423 """
424 return _requires_unix_version('FreeBSD', min_version)
425
426def requires_linux_version(*min_version):
427 """Decorator raising SkipTest if the OS is Linux and the Linux version is
428 less than `min_version`.
429
430 For example, @requires_linux_version(2, 6, 32) raises SkipTest if the Linux
431 version is less than 2.6.32.
432 """
433 return _requires_unix_version('Linux', min_version)
434
Victor Stinnerfce92332011-06-01 12:28:04 +0200435def requires_mac_ver(*min_version):
Victor Stinner88701e22011-06-01 13:13:04 +0200436 """Decorator raising SkipTest if the OS is Mac OS X and the OS X
437 version if less than min_version.
Victor Stinnerfce92332011-06-01 12:28:04 +0200438
Victor Stinner88701e22011-06-01 13:13:04 +0200439 For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
440 is lesser than 10.5.
Victor Stinnerfce92332011-06-01 12:28:04 +0200441 """
Victor Stinner88701e22011-06-01 13:13:04 +0200442 def decorator(func):
443 @functools.wraps(func)
444 def wrapper(*args, **kw):
445 if sys.platform == 'darwin':
446 version_txt = platform.mac_ver()[0]
447 try:
448 version = tuple(map(int, version_txt.split('.')))
449 except ValueError:
450 pass
451 else:
452 if version < min_version:
453 min_version_txt = '.'.join(map(str, min_version))
454 raise unittest.SkipTest(
455 "Mac OS X %s or higher required, not %s"
456 % (min_version_txt, version_txt))
457 return func(*args, **kw)
458 wrapper.min_version = min_version
459 return wrapper
460 return decorator
461
Victor Stinnerfce92332011-06-01 12:28:04 +0200462
Christian Heimes5e696852008-04-09 08:37:03 +0000463HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000464
Christian Heimes5e696852008-04-09 08:37:03 +0000465def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
466 """Returns an unused port that should be suitable for binding. This is
467 achieved by creating a temporary socket with the same family and type as
468 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
469 the specified host address (defaults to 0.0.0.0) with the port set to 0,
470 eliciting an unused ephemeral port from the OS. The temporary socket is
471 then closed and deleted, and the ephemeral port is returned.
472
473 Either this method or bind_port() should be used for any tests where a
474 server socket needs to be bound to a particular port for the duration of
475 the test. Which one to use depends on whether the calling code is creating
476 a python socket, or if an unused port needs to be provided in a constructor
477 or passed to an external program (i.e. the -accept argument to openssl's
478 s_server mode). Always prefer bind_port() over find_unused_port() where
479 possible. Hard coded ports should *NEVER* be used. As soon as a server
480 socket is bound to a hard coded port, the ability to run multiple instances
481 of the test simultaneously on the same host is compromised, which makes the
482 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
483 may simply manifest as a failed test, which can be recovered from without
484 intervention in most cases, but on Windows, the entire python process can
485 completely and utterly wedge, requiring someone to log in to the buildbot
486 and manually kill the affected process.
487
488 (This is easy to reproduce on Windows, unfortunately, and can be traced to
489 the SO_REUSEADDR socket option having different semantics on Windows versus
490 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
491 listen and then accept connections on identical host/ports. An EADDRINUSE
492 socket.error will be raised at some point (depending on the platform and
493 the order bind and listen were called on each socket).
494
495 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
496 will ever be raised when attempting to bind two identical host/ports. When
497 accept() is called on each socket, the second caller's process will steal
498 the port from the first caller, leaving them both in an awkwardly wedged
499 state where they'll no longer respond to any signals or graceful kills, and
500 must be forcibly killed via OpenProcess()/TerminateProcess().
501
502 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
503 instead of SO_REUSEADDR, which effectively affords the same semantics as
504 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
505 Source world compared to Windows ones, this is a common mistake. A quick
506 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
507 openssl.exe is called with the 's_server' option, for example. See
508 http://bugs.python.org/issue2550 for more info. The following site also
509 has a very thorough description about the implications of both REUSEADDR
510 and EXCLUSIVEADDRUSE on Windows:
511 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
512
513 XXX: although this approach is a vast improvement on previous attempts to
514 elicit unused ports, it rests heavily on the assumption that the ephemeral
515 port returned to us by the OS won't immediately be dished back out to some
516 other process when we close and delete our temporary socket but before our
517 calling code has a chance to bind the returned port. We can deal with this
518 issue if/when we come across it.
519 """
520
521 tempsock = socket.socket(family, socktype)
522 port = bind_port(tempsock)
523 tempsock.close()
524 del tempsock
525 return port
526
527def bind_port(sock, host=HOST):
528 """Bind the socket to a free port and return the port number. Relies on
529 ephemeral ports in order to ensure we are using an unbound port. This is
530 important as many tests may be running simultaneously, especially in a
531 buildbot environment. This method raises an exception if the sock.family
532 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
533 or SO_REUSEPORT set on it. Tests should *never* set these socket options
534 for TCP/IP sockets. The only case for setting these options is testing
535 multicasting via multiple UDP sockets.
536
537 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
538 on Windows), it will be set on the socket. This will prevent anyone else
539 from bind()'ing to our host/port for the duration of the test.
540 """
541
542 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
543 if hasattr(socket, 'SO_REUSEADDR'):
544 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
545 raise TestFailed("tests should never set the SO_REUSEADDR " \
546 "socket option on TCP/IP sockets!")
547 if hasattr(socket, 'SO_REUSEPORT'):
548 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
549 raise TestFailed("tests should never set the SO_REUSEPORT " \
550 "socket option on TCP/IP sockets!")
551 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
552 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
553
554 sock.bind((host, 0))
555 port = sock.getsockname()[1]
556 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000557
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200558def _is_ipv6_enabled():
559 """Check whether IPv6 is enabled on this host."""
560 if socket.has_ipv6:
Ross Lagerwall121d59f2012-07-07 18:40:32 +0200561 sock = None
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200562 try:
563 sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
564 sock.bind(('::1', 0))
Ross Lagerwall121d59f2012-07-07 18:40:32 +0200565 return True
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200566 except (socket.error, socket.gaierror):
567 pass
Ross Lagerwall121d59f2012-07-07 18:40:32 +0200568 finally:
569 if sock:
570 sock.close()
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200571 return False
572
573IPV6_ENABLED = _is_ipv6_enabled()
574
Charles-François Natali2d517212011-05-29 16:36:44 +0200575
Antoine Pitroue1a16742013-04-24 23:31:38 +0200576# A constant likely larger than the underlying OS pipe buffer size, to
577# make writes blocking.
578# Windows limit seems to be around 512 B, and many Unix kernels have a
579# 64 KiB pipe buffer size or 16 * PAGE_SIZE: take a few megs to be sure.
580# (see issue #17835 for a discussion of this number).
581PIPE_MAX_SIZE = 4 *1024 * 1024 + 1
Charles-François Natali2d517212011-05-29 16:36:44 +0200582
583
Eric Smithf24a0d92010-12-04 13:32:18 +0000584# decorator for skipping tests on non-IEEE 754 platforms
585requires_IEEE_754 = unittest.skipUnless(
586 float.__getformat__("double").startswith("IEEE"),
587 "test requires IEEE 754 doubles")
588
Ezio Melotticad648c2011-05-19 21:25:10 +0300589requires_zlib = unittest.skipUnless(zlib, 'requires zlib')
590
Martin v. Löwisf6b16a42012-05-01 07:58:44 +0200591requires_bz2 = unittest.skipUnless(bz2, 'requires bz2')
592
Martin v. Löwis7fb79fc2012-05-13 10:06:36 +0200593requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
594
Finn Bock57bc5fa2002-11-01 18:02:03 +0000595is_jython = sys.platform.startswith('java')
596
Barry Warsaw559f6682001-03-23 18:04:02 +0000597# Filename used for testing
598if os.name == 'java':
599 # Jython disallows @ in module names
600 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000601else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000602 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000603
Antoine Pitrou88909542009-06-29 13:54:42 +0000604# Disambiguate TESTFN for parallel testing, while letting it remain a valid
605# module name.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000606TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
Antoine Pitrou88909542009-06-29 13:54:42 +0000607
Victor Stinnere667e982012-11-12 01:23:15 +0100608# FS_NONASCII: non-ASCII character encodable by os.fsencode(),
609# or None if there is no such character.
610FS_NONASCII = None
611for character in (
612 # First try printable and common characters to have a readable filename.
613 # For each character, the encoding list are just example of encodings able
614 # to encode the character (the list is not exhaustive).
615
616 # U+00E6 (Latin Small Letter Ae): cp1252, iso-8859-1
617 '\u00E6',
618 # U+0130 (Latin Capital Letter I With Dot Above): cp1254, iso8859_3
619 '\u0130',
620 # U+0141 (Latin Capital Letter L With Stroke): cp1250, cp1257
621 '\u0141',
622 # U+03C6 (Greek Small Letter Phi): cp1253
623 '\u03C6',
624 # U+041A (Cyrillic Capital Letter Ka): cp1251
625 '\u041A',
626 # U+05D0 (Hebrew Letter Alef): Encodable to cp424
627 '\u05D0',
628 # U+060C (Arabic Comma): cp864, cp1006, iso8859_6, mac_arabic
629 '\u060C',
630 # U+062A (Arabic Letter Teh): cp720
631 '\u062A',
632 # U+0E01 (Thai Character Ko Kai): cp874
633 '\u0E01',
634
635 # Then try more "special" characters. "special" because they may be
636 # interpreted or displayed differently depending on the exact locale
637 # encoding and the font.
638
639 # U+00A0 (No-Break Space)
640 '\u00A0',
641 # U+20AC (Euro Sign)
642 '\u20AC',
643):
644 try:
645 os.fsdecode(os.fsencode(character))
646 except UnicodeError:
647 pass
648 else:
649 FS_NONASCII = character
650 break
Michael Foord2d9c2d52010-05-04 22:29:10 +0000651
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000652# TESTFN_UNICODE is a non-ascii filename
653TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
Victor Stinner74a833f2010-08-18 21:06:23 +0000654if sys.platform == 'darwin':
655 # In Mac OS X's VFS API file names are, by definition, canonically
656 # decomposed Unicode, encoded using UTF-8. See QA1173:
657 # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
658 import unicodedata
659 TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
Antoine Pitrou88909542009-06-29 13:54:42 +0000660TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000661
Victor Stinner09c449c2010-08-13 22:23:24 +0000662# TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000663# encoded by the filesystem encoding (in strict mode). It can be None if we
664# cannot generate such filename.
Victor Stinnera0241c82010-08-15 19:28:21 +0000665TESTFN_UNENCODABLE = None
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000666if os.name in ('nt', 'ce'):
Victor Stinnera0241c82010-08-15 19:28:21 +0000667 # skip win32s (0) or Windows 9x/ME (1)
668 if sys.getwindowsversion().platform >= 2:
Victor Stinner8ce7df62010-09-10 11:19:59 +0000669 # Different kinds of characters from various languages to minimize the
670 # probability that the whole name is encodable to MBCS (issue #9819)
671 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000672 try:
Victor Stinner09c449c2010-08-13 22:23:24 +0000673 TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000674 except UnicodeEncodeError:
675 pass
676 else:
677 print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
678 'Unicode filename tests may not be effective'
Victor Stinner09c449c2010-08-13 22:23:24 +0000679 % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
680 TESTFN_UNENCODABLE = None
Victor Stinnera0241c82010-08-15 19:28:21 +0000681# Mac OS X denies unencodable filenames (invalid utf-8)
Victor Stinner03c9e1d2010-08-14 17:35:20 +0000682elif sys.platform != 'darwin':
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000683 try:
684 # ascii and utf-8 cannot encode the byte 0xff
685 b'\xff'.decode(TESTFN_ENCODING)
686 except UnicodeDecodeError:
687 # 0xff will be encoded using the surrogate character u+DCFF
Victor Stinner09c449c2010-08-13 22:23:24 +0000688 TESTFN_UNENCODABLE = TESTFN \
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000689 + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
690 else:
691 # File system encoding (eg. ISO-8859-* encodings) can encode
692 # the byte 0xff. Skip some unicode filename tests.
Victor Stinnera0241c82010-08-15 19:28:21 +0000693 pass
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000694
Victor Stinnere667e982012-11-12 01:23:15 +0100695# TESTFN_UNDECODABLE is a filename (bytes type) that should *not* be able to be
696# decoded from the filesystem encoding (in strict mode). It can be None if we
697# cannot generate such filename (ex: the latin1 encoding can decode any byte
698# sequence). On UNIX, TESTFN_UNDECODABLE can be decoded by os.fsdecode() thanks
699# to the surrogateescape error handler (PEP 383), but not from the filesystem
700# encoding in strict mode.
701TESTFN_UNDECODABLE = None
702for name in (
703 # b'\xff' is not decodable by os.fsdecode() with code page 932. Windows
704 # accepts it to create a file or a directory, or don't accept to enter to
705 # such directory (when the bytes name is used). So test b'\xe7' first: it is
706 # not decodable from cp932.
707 b'\xe7w\xf0',
708 # undecodable from ASCII, UTF-8
709 b'\xff',
710 # undecodable from iso8859-3, iso8859-6, iso8859-7, cp424, iso8859-8, cp856
711 # and cp857
712 b'\xae\xd5'
713 # undecodable from UTF-8 (UNIX and Mac OS X)
714 b'\xed\xb2\x80', b'\xed\xb4\x80',
Victor Stinner0af71aa2013-01-03 01:50:30 +0100715 # undecodable from shift_jis, cp869, cp874, cp932, cp1250, cp1251, cp1252,
716 # cp1253, cp1254, cp1255, cp1257, cp1258
717 b'\x81\x98',
Victor Stinnere667e982012-11-12 01:23:15 +0100718):
719 try:
720 name.decode(TESTFN_ENCODING)
721 except UnicodeDecodeError:
722 TESTFN_UNDECODABLE = os.fsencode(TESTFN) + name
723 break
724
725if FS_NONASCII:
726 TESTFN_NONASCII = TESTFN + '-' + FS_NONASCII
727else:
728 TESTFN_NONASCII = None
729
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000730# Save the initial cwd
731SAVEDCWD = os.getcwd()
732
733@contextlib.contextmanager
Nick Coghland26c18a2010-08-17 13:06:11 +0000734def temp_cwd(name='tempcwd', quiet=False, path=None):
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000735 """
Nick Coghland26c18a2010-08-17 13:06:11 +0000736 Context manager that temporarily changes the CWD.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000737
Nick Coghland26c18a2010-08-17 13:06:11 +0000738 An existing path may be provided as *path*, in which case this
739 function makes no changes to the file system.
740
741 Otherwise, the new CWD is created in the current directory and it's
742 named *name*. If *quiet* is False (default) and it's not possible to
743 create or change the CWD, an error is raised. If it's True, only a
744 warning is raised and the original CWD is used.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000745 """
746 saved_dir = os.getcwd()
747 is_temporary = False
Nick Coghland26c18a2010-08-17 13:06:11 +0000748 if path is None:
749 path = name
750 try:
751 os.mkdir(name)
752 is_temporary = True
753 except OSError:
754 if not quiet:
755 raise
756 warnings.warn('tests may fail, unable to create temp CWD ' + name,
757 RuntimeWarning, stacklevel=3)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000758 try:
Nick Coghland26c18a2010-08-17 13:06:11 +0000759 os.chdir(path)
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000760 except OSError:
761 if not quiet:
762 raise
Ezio Melottie418d762012-09-21 16:48:12 +0300763 warnings.warn('tests may fail, unable to change the CWD to ' + path,
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000764 RuntimeWarning, stacklevel=3)
765 try:
766 yield os.getcwd()
767 finally:
768 os.chdir(saved_dir)
769 if is_temporary:
770 rmtree(name)
771
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000772
Eli Bendersky6c519992011-07-23 08:48:53 +0300773if hasattr(os, "umask"):
774 @contextlib.contextmanager
775 def temp_umask(umask):
776 """Context manager that temporarily sets the process umask."""
777 oldmask = os.umask(umask)
778 try:
779 yield
780 finally:
781 os.umask(oldmask)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000782
783
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000784def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000785 """Try to find a file on sys.path and the working directory. If it is not
786 found the argument passed to the function is returned (this does not
787 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000788 if os.path.isabs(file):
789 return file
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000790 if subdir is not None:
791 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000792 path = sys.path
793 path = [os.path.dirname(here)] + path
794 for dn in path:
795 fn = os.path.join(dn, file)
796 if os.path.exists(fn): return fn
797 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000798
Victor Stinnerbf816222011-06-30 23:25:47 +0200799def create_empty_file(filename):
800 """Create an empty file. If the file already exists, truncate it."""
801 fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
802 os.close(fd)
803
Tim Peters2f228e72001-05-13 00:19:31 +0000804def sortdict(dict):
805 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000806 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000807 reprpairs = ["%r: %r" % pair for pair in items]
808 withcommas = ", ".join(reprpairs)
809 return "{%s}" % withcommas
810
Benjamin Peterson7522c742009-01-19 21:00:09 +0000811def make_bad_fd():
812 """
813 Create an invalid file descriptor by opening and closing a file and return
814 its fd.
815 """
816 file = open(TESTFN, "wb")
817 try:
818 return file.fileno()
819 finally:
820 file.close()
821 unlink(TESTFN)
822
Thomas Wouters89f507f2006-12-13 04:49:30 +0000823def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000824 testcase.assertRaises(SyntaxError, compile, statement,
825 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000826
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000827def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000828 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000829
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000830 check = kw.pop('check', None)
831
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000832 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000833
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000834 fn = os.path.join(os.path.dirname(__file__), "data", filename)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000835
836 def check_valid_file(fn):
837 f = open(fn, *args, **kw)
838 if check is None:
839 return f
840 elif check(f):
841 f.seek(0)
842 return f
843 f.close()
844
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000845 if os.path.exists(fn):
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000846 f = check_valid_file(fn)
847 if f is not None:
848 return f
849 unlink(fn)
850
851 # Verify the requirement before downloading the file
852 requires('urlfetch')
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000853
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000854 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitroufd0680b2009-11-01 22:13:48 +0000855 f = urllib.request.urlopen(url, timeout=15)
856 try:
857 with open(fn, "wb") as out:
858 s = f.read()
859 while s:
860 out.write(s)
861 s = f.read()
862 finally:
863 f.close()
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000864
865 f = check_valid_file(fn)
866 if f is not None:
867 return f
Éric Araujoaf5bacf2011-07-15 17:50:15 +0200868 raise TestFailed('invalid resource %r' % fn)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000869
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000870
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000871class WarningsRecorder(object):
872 """Convenience wrapper for the warnings list returned on
873 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000874 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000875 def __init__(self, warnings_list):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000876 self._warnings = warnings_list
877 self._last = 0
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000878
879 def __getattr__(self, attr):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000880 if len(self._warnings) > self._last:
881 return getattr(self._warnings[-1], attr)
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000882 elif attr in warnings.WarningMessage._WARNING_DETAILS:
883 return None
884 raise AttributeError("%r has no attribute %r" % (self, attr))
885
Florent Xiclunab14930c2010-03-13 15:26:44 +0000886 @property
887 def warnings(self):
888 return self._warnings[self._last:]
889
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000890 def reset(self):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000891 self._last = len(self._warnings)
892
893
894def _filterwarnings(filters, quiet=False):
895 """Catch the warnings, then check if all the expected
896 warnings have been raised and re-raise unexpected warnings.
897 If 'quiet' is True, only re-raise the unexpected warnings.
898 """
899 # Clear the warning registry of the calling module
900 # in order to re-raise the warnings.
901 frame = sys._getframe(2)
902 registry = frame.f_globals.get('__warningregistry__')
903 if registry:
904 registry.clear()
905 with warnings.catch_warnings(record=True) as w:
906 # Set filter "always" to record all warnings. Because
907 # test_warnings swap the module, we need to look up in
908 # the sys.modules dictionary.
909 sys.modules['warnings'].simplefilter("always")
910 yield WarningsRecorder(w)
911 # Filter the recorded warnings
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000912 reraise = list(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000913 missing = []
914 for msg, cat in filters:
915 seen = False
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000916 for w in reraise[:]:
917 warning = w.message
Florent Xiclunab14930c2010-03-13 15:26:44 +0000918 # Filter out the matching messages
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000919 if (re.match(msg, str(warning), re.I) and
920 issubclass(warning.__class__, cat)):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000921 seen = True
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000922 reraise.remove(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000923 if not seen and not quiet:
924 # This filter caught nothing
925 missing.append((msg, cat.__name__))
926 if reraise:
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000927 raise AssertionError("unhandled warning %s" % reraise[0])
Florent Xiclunab14930c2010-03-13 15:26:44 +0000928 if missing:
929 raise AssertionError("filter (%r, %s) did not catch any warning" %
930 missing[0])
931
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000932
933@contextlib.contextmanager
Florent Xiclunab14930c2010-03-13 15:26:44 +0000934def check_warnings(*filters, **kwargs):
935 """Context manager to silence warnings.
936
937 Accept 2-tuples as positional arguments:
938 ("message regexp", WarningCategory)
939
940 Optional argument:
941 - if 'quiet' is True, it does not fail if a filter catches nothing
Florent Xicluna53b506be2010-03-18 20:00:57 +0000942 (default True without argument,
943 default False if some filters are defined)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000944
945 Without argument, it defaults to:
Florent Xicluna53b506be2010-03-18 20:00:57 +0000946 check_warnings(("", Warning), quiet=True)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000947 """
Florent Xicluna53b506be2010-03-18 20:00:57 +0000948 quiet = kwargs.get('quiet')
Florent Xiclunab14930c2010-03-13 15:26:44 +0000949 if not filters:
950 filters = (("", Warning),)
Florent Xicluna53b506be2010-03-18 20:00:57 +0000951 # Preserve backward compatibility
952 if quiet is None:
953 quiet = True
954 return _filterwarnings(filters, quiet)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000955
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000956
957class CleanImport(object):
958 """Context manager to force import to return a new module reference.
959
960 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000961 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000962
963 Use like this:
964
965 with CleanImport("foo"):
Brett Cannonddb5e702010-02-03 22:16:11 +0000966 importlib.import_module("foo") # new reference
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000967 """
968
969 def __init__(self, *module_names):
970 self.original_modules = sys.modules.copy()
971 for module_name in module_names:
972 if module_name in sys.modules:
973 module = sys.modules[module_name]
974 # It is possible that module_name is just an alias for
975 # another module (e.g. stub for modules renamed in 3.x).
976 # In that case, we also need delete the real module to clear
977 # the import cache.
978 if module.__name__ != module_name:
979 del sys.modules[module.__name__]
980 del sys.modules[module_name]
981
982 def __enter__(self):
983 return self
984
985 def __exit__(self, *ignore_exc):
986 sys.modules.update(self.original_modules)
987
988
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000989class EnvironmentVarGuard(collections.abc.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000990
991 """Class to help protect the environment variable properly. Can be used as
992 a context manager."""
993
994 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000995 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000996 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000997
Walter Dörwald155374d2009-05-01 19:58:58 +0000998 def __getitem__(self, envvar):
999 return self._environ[envvar]
1000
1001 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +00001002 # Remember the initial value on the first access
1003 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +00001004 self._changed[envvar] = self._environ.get(envvar)
1005 self._environ[envvar] = value
1006
1007 def __delitem__(self, envvar):
1008 # Remember the initial value on the first access
1009 if envvar not in self._changed:
1010 self._changed[envvar] = self._environ.get(envvar)
1011 if envvar in self._environ:
1012 del self._environ[envvar]
1013
1014 def keys(self):
1015 return self._environ.keys()
1016
1017 def __iter__(self):
1018 return iter(self._environ)
1019
1020 def __len__(self):
1021 return len(self._environ)
1022
1023 def set(self, envvar, value):
1024 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001025
1026 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +00001027 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001028
1029 def __enter__(self):
1030 return self
1031
1032 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +00001033 for (k, v) in self._changed.items():
1034 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +00001035 if k in self._environ:
1036 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +00001037 else:
Walter Dörwald155374d2009-05-01 19:58:58 +00001038 self._environ[k] = v
Nick Coghlan6ead5522009-10-18 13:19:33 +00001039 os.environ = self._environ
1040
1041
1042class DirsOnSysPath(object):
1043 """Context manager to temporarily add directories to sys.path.
1044
1045 This makes a copy of sys.path, appends any directories given
1046 as positional arguments, then reverts sys.path to the copied
1047 settings when the context ends.
1048
1049 Note that *all* sys.path modifications in the body of the
1050 context manager, including replacement of the object,
1051 will be reverted at the end of the block.
1052 """
1053
1054 def __init__(self, *paths):
1055 self.original_value = sys.path[:]
1056 self.original_object = sys.path
1057 sys.path.extend(paths)
1058
1059 def __enter__(self):
1060 return self
1061
1062 def __exit__(self, *ignore_exc):
1063 sys.path = self.original_object
1064 sys.path[:] = self.original_value
Walter Dörwald155374d2009-05-01 19:58:58 +00001065
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001066
Guido van Rossumd8faa362007-04-27 19:54:29 +00001067class TransientResource(object):
1068
1069 """Raise ResourceDenied if an exception is raised while the context manager
1070 is in effect that matches the specified exception and attributes."""
1071
1072 def __init__(self, exc, **kwargs):
1073 self.exc = exc
1074 self.attrs = kwargs
1075
1076 def __enter__(self):
1077 return self
1078
1079 def __exit__(self, type_=None, value=None, traceback=None):
1080 """If type_ is a subclass of self.exc and value has attributes matching
1081 self.attrs, raise ResourceDenied. Otherwise let the exception
1082 propagate (if any)."""
1083 if type_ is not None and issubclass(self.exc, type_):
1084 for attr, attr_value in self.attrs.items():
1085 if not hasattr(value, attr):
1086 break
1087 if getattr(value, attr) != attr_value:
1088 break
1089 else:
1090 raise ResourceDenied("an optional resource is not available")
1091
Raymond Hettinger686057b2009-06-04 00:11:54 +00001092# Context managers that raise ResourceDenied when various issues
1093# with the Internet connection manifest themselves as exceptions.
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001094# XXX deprecate these and use transient_internet() instead
Raymond Hettinger686057b2009-06-04 00:11:54 +00001095time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
1096socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
1097ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001098
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001099
Thomas Woutersed03b412007-08-28 21:37:11 +00001100@contextlib.contextmanager
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001101def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001102 """Return a context manager that raises ResourceDenied when various issues
1103 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001104 default_errnos = [
1105 ('ECONNREFUSED', 111),
1106 ('ECONNRESET', 104),
Antoine Pitrou5d938cb2011-01-08 10:28:11 +00001107 ('EHOSTUNREACH', 113),
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001108 ('ENETUNREACH', 101),
1109 ('ETIMEDOUT', 110),
1110 ]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001111 default_gai_errnos = [
Antoine Pitrou4875c462011-07-09 02:31:24 +02001112 ('EAI_AGAIN', -3),
Charles-François Natali13859bf2011-12-10 13:16:44 +01001113 ('EAI_FAIL', -4),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001114 ('EAI_NONAME', -2),
1115 ('EAI_NODATA', -5),
Antoine Pitrou390ea0f2011-04-29 00:44:33 +02001116 # Encountered when trying to resolve IPv6-only hostnames
1117 ('WSANO_DATA', 11004),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001118 ]
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001119
Éric Araujoaf5bacf2011-07-15 17:50:15 +02001120 denied = ResourceDenied("Resource %r is not available" % resource_name)
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001121 captured_errnos = errnos
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001122 gai_errnos = []
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001123 if not captured_errnos:
1124 captured_errnos = [getattr(errno, name, num)
1125 for (name, num) in default_errnos]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001126 gai_errnos = [getattr(socket, name, num)
1127 for (name, num) in default_gai_errnos]
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001128
1129 def filter_error(err):
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001130 n = getattr(err, 'errno', None)
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001131 if (isinstance(err, socket.timeout) or
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001132 (isinstance(err, socket.gaierror) and n in gai_errnos) or
1133 n in captured_errnos):
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001134 if not verbose:
1135 sys.stderr.write(denied.args[0] + "\n")
1136 raise denied from err
1137
1138 old_timeout = socket.getdefaulttimeout()
1139 try:
1140 if timeout is not None:
1141 socket.setdefaulttimeout(timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001142 yield
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001143 except IOError as err:
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001144 # urllib can wrap original socket errors multiple times (!), we must
1145 # unwrap to get at the original error.
1146 while True:
1147 a = err.args
1148 if len(a) >= 1 and isinstance(a[0], IOError):
1149 err = a[0]
1150 # The error can also be wrapped as args[1]:
1151 # except socket.error as msg:
1152 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
1153 elif len(a) >= 2 and isinstance(a[1], IOError):
1154 err = a[1]
1155 else:
1156 break
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001157 filter_error(err)
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001158 raise
1159 # XXX should we catch generic exceptions and look for their
1160 # __cause__ or __context__?
1161 finally:
1162 socket.setdefaulttimeout(old_timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001163
1164
1165@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001166def captured_output(stream_name):
Ezio Melotti07352b02011-05-14 14:51:18 +03001167 """Return a context manager used by captured_stdout/stdin/stderr
Ezio Melottifc778fd2011-05-14 08:22:47 +03001168 that temporarily replaces the sys stream *stream_name* with a StringIO."""
Thomas Woutersed03b412007-08-28 21:37:11 +00001169 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001170 orig_stdout = getattr(sys, stream_name)
1171 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001172 try:
1173 yield getattr(sys, stream_name)
1174 finally:
1175 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001176
1177def captured_stdout():
Ezio Melottifc778fd2011-05-14 08:22:47 +03001178 """Capture the output of sys.stdout:
1179
1180 with captured_stdout() as s:
1181 print("hello")
1182 self.assertEqual(s.getvalue(), "hello")
1183 """
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001184 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +00001185
Nick Coghlan6b22f3f2010-12-12 15:24:21 +00001186def captured_stderr():
1187 return captured_output("stderr")
1188
Nick Coghlan6ead5522009-10-18 13:19:33 +00001189def captured_stdin():
1190 return captured_output("stdin")
1191
Ezio Melotti07352b02011-05-14 14:51:18 +03001192
Benjamin Petersone549ead2009-03-28 21:42:05 +00001193def gc_collect():
1194 """Force as many objects as possible to be collected.
1195
1196 In non-CPython implementations of Python, this is needed because timely
1197 deallocation is not guaranteed by the garbage collector. (Even in CPython
1198 this can be the case in case of reference cycles.) This means that __del__
1199 methods may be called later than expected and weakrefs may remain alive for
1200 longer than expected. This function tries its best to force all garbage
1201 objects to disappear.
1202 """
Benjamin Petersone549ead2009-03-28 21:42:05 +00001203 gc.collect()
Benjamin Petersona6590e82010-04-11 21:22:10 +00001204 if is_jython:
1205 time.sleep(0.1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00001206 gc.collect()
1207 gc.collect()
1208
Benjamin Peterson31f4beb2011-07-14 12:48:01 -05001209@contextlib.contextmanager
1210def disable_gc():
1211 have_gc = gc.isenabled()
1212 gc.disable()
1213 try:
1214 yield
1215 finally:
1216 if have_gc:
1217 gc.enable()
1218
Thomas Woutersed03b412007-08-28 21:37:11 +00001219
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001220def python_is_optimized():
1221 """Find if Python was built with optimizations."""
Antoine Pitrou64474542010-10-31 11:34:47 +00001222 cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001223 final_opt = ""
1224 for opt in cflags.split():
1225 if opt.startswith('-O'):
1226 final_opt = opt
Eli Bendersky6c519992011-07-23 08:48:53 +03001227 return final_opt != '' and final_opt != '-O0'
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001228
1229
Martin v. Löwis2b168442012-07-29 16:38:45 +02001230_header = 'nP'
1231_align = '0n'
Martin v. Löwis33f79972012-07-29 16:33:05 +02001232if hasattr(sys, "gettotalrefcount"):
1233 _header = '2P' + _header
Martin v. Löwis2b168442012-07-29 16:38:45 +02001234 _align = '0P'
1235_vheader = _header + 'n'
Martin v. Löwis33f79972012-07-29 16:33:05 +02001236
1237def calcobjsize(fmt):
Martin v. Löwis2b168442012-07-29 16:38:45 +02001238 return struct.calcsize(_header + fmt + _align)
Martin v. Löwis33f79972012-07-29 16:33:05 +02001239
1240def calcvobjsize(fmt):
Martin v. Löwis2b168442012-07-29 16:38:45 +02001241 return struct.calcsize(_vheader + fmt + _align)
Martin v. Löwis33f79972012-07-29 16:33:05 +02001242
1243
1244_TPFLAGS_HAVE_GC = 1<<14
1245_TPFLAGS_HEAPTYPE = 1<<9
1246
1247def check_sizeof(test, o, size):
1248 result = sys.getsizeof(o)
1249 # add GC header size
1250 if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\
1251 ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))):
1252 size += _testcapi.SIZEOF_PYGC_HEAD
1253 msg = 'wrong size for %s: got %d, expected %d' \
1254 % (type(o), result, size)
1255 test.assertEqual(result, size, msg)
1256
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001257#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +00001258# Decorator for running a function in a different locale, correctly resetting
1259# it afterwards.
1260
1261def run_with_locale(catstr, *locales):
1262 def decorator(func):
1263 def inner(*args, **kwds):
1264 try:
1265 import locale
1266 category = getattr(locale, catstr)
1267 orig_locale = locale.setlocale(category)
1268 except AttributeError:
1269 # if the test author gives us an invalid category string
1270 raise
1271 except:
1272 # cannot retrieve original locale, so do nothing
1273 locale = orig_locale = None
1274 else:
1275 for loc in locales:
1276 try:
1277 locale.setlocale(category, loc)
1278 break
1279 except:
1280 pass
1281
1282 # now run the function, resetting the locale on exceptions
1283 try:
1284 return func(*args, **kwds)
1285 finally:
1286 if locale and orig_locale:
1287 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +00001288 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +00001289 inner.__doc__ = func.__doc__
1290 return inner
1291 return decorator
1292
1293#=======================================================================
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001294# Decorator for running a function in a specific timezone, correctly
1295# resetting it afterwards.
1296
1297def run_with_tz(tz):
1298 def decorator(func):
1299 def inner(*args, **kwds):
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001300 try:
1301 tzset = time.tzset
1302 except AttributeError:
1303 raise unittest.SkipTest("tzset required")
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001304 if 'TZ' in os.environ:
1305 orig_tz = os.environ['TZ']
1306 else:
1307 orig_tz = None
1308 os.environ['TZ'] = tz
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001309 tzset()
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001310
1311 # now run the function, resetting the tz on exceptions
1312 try:
1313 return func(*args, **kwds)
1314 finally:
Benjamin Petersonb29614e2012-10-09 11:16:03 -04001315 if orig_tz is None:
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001316 del os.environ['TZ']
1317 else:
1318 os.environ['TZ'] = orig_tz
1319 time.tzset()
1320
1321 inner.__name__ = func.__name__
1322 inner.__doc__ = func.__doc__
1323 return inner
1324 return decorator
1325
1326#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +00001327# Big-memory-test support. Separate from 'resources' because memory use
1328# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001329
1330# Some handy shorthands. Note that these are used for byte-limits as well
1331# as size-limits, in the various bigmem tests
1332_1M = 1024*1024
1333_1G = 1024 * _1M
1334_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001335_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +00001336
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001337MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001338
Thomas Wouters477c8d52006-05-27 19:21:47 +00001339def set_memlimit(limit):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001340 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001341 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +00001342 sizes = {
1343 'k': 1024,
1344 'm': _1M,
1345 'g': _1G,
1346 't': 1024*_1G,
1347 }
1348 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
1349 re.IGNORECASE | re.VERBOSE)
1350 if m is None:
1351 raise ValueError('Invalid memory limit %r' % (limit,))
1352 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001353 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001354 if memlimit > MAX_Py_ssize_t:
1355 memlimit = MAX_Py_ssize_t
1356 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001357 raise ValueError('Memory limit %r too low to be useful' % (limit,))
1358 max_memuse = memlimit
1359
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001360class _MemoryWatchdog:
1361 """An object which periodically watches the process' memory consumption
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001362 and prints it out.
1363 """
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001364
1365 def __init__(self):
1366 self.procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
1367 self.started = False
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001368
1369 def start(self):
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001370 try:
Charles-François Natali55bce632012-03-24 10:06:23 +01001371 f = open(self.procfile, 'r')
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001372 except OSError as e:
1373 warnings.warn('/proc not available for stats: {}'.format(e),
1374 RuntimeWarning)
1375 sys.stderr.flush()
1376 return
Charles-François Natali55bce632012-03-24 10:06:23 +01001377
1378 watchdog_script = findfile("memory_watchdog.py")
1379 self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script],
1380 stdin=f, stderr=subprocess.DEVNULL)
1381 f.close()
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001382 self.started = True
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001383
1384 def stop(self):
Charles-François Natali55bce632012-03-24 10:06:23 +01001385 if self.started:
1386 self.mem_watchdog.terminate()
1387 self.mem_watchdog.wait()
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001388
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001389
1390def bigmemtest(size, memuse, dry_run=True):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001391 """Decorator for bigmem tests.
1392
1393 'minsize' is the minimum useful size for the test (in arbitrary,
1394 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001395 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001396
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001397 if 'dry_run' is False, it means the test doesn't support dummy runs
1398 when -M is not specified.
Thomas Wouters518b5ae2011-03-25 11:42:37 +01001399 """
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001400 def decorator(f):
1401 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00001402 size = wrapper.size
1403 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001404 if not real_max_memuse:
1405 maxsize = 5147
1406 else:
1407 maxsize = size
1408
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001409 if ((real_max_memuse or not dry_run)
1410 and real_max_memuse < maxsize * memuse):
1411 raise unittest.SkipTest(
1412 "not enough memory: %.1fG minimum needed"
1413 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001414
Charles-François Natali55bce632012-03-24 10:06:23 +01001415 if real_max_memuse and verbose:
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001416 print()
1417 print(" ... expected peak memory use: {peak:.1f}G"
1418 .format(peak=size * memuse / (1024 ** 3)))
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001419 watchdog = _MemoryWatchdog()
1420 watchdog.start()
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001421 else:
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001422 watchdog = None
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001423
1424 try:
1425 return f(self, maxsize)
1426 finally:
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001427 if watchdog:
1428 watchdog.stop()
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001429
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001430 wrapper.size = size
1431 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001432 return wrapper
1433 return decorator
1434
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001435def bigaddrspacetest(f):
1436 """Decorator for tests that fill the address space."""
1437 def wrapper(self):
1438 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou98c62bd2011-01-12 21:58:39 +00001439 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
Antoine Pitroue0d3f8a2011-01-12 21:50:44 +00001440 raise unittest.SkipTest(
1441 "not enough memory: try a 32-bit build instead")
1442 else:
1443 raise unittest.SkipTest(
1444 "not enough memory: %.1fG minimum needed"
1445 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001446 else:
1447 return f(self)
1448 return wrapper
1449
Thomas Wouters477c8d52006-05-27 19:21:47 +00001450#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +00001451# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001452
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001453class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001454 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001455 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001456 test(result)
1457 return result
1458
Benjamin Petersone549ead2009-03-28 21:42:05 +00001459def _id(obj):
1460 return obj
1461
1462def requires_resource(resource):
Antoine Pitroud20a5f62011-02-26 15:58:05 +00001463 if resource == 'gui' and not _is_gui_available():
1464 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou5bc4fa72010-10-14 15:34:31 +00001465 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +00001466 return _id
1467 else:
1468 return unittest.skip("resource {0!r} is not enabled".format(resource))
1469
1470def cpython_only(test):
1471 """
1472 Decorator for tests only applicable on CPython.
1473 """
1474 return impl_detail(cpython=True)(test)
1475
1476def impl_detail(msg=None, **guards):
1477 if check_impl_detail(**guards):
1478 return _id
1479 if msg is None:
1480 guardnames, default = _parse_guards(guards)
1481 if default:
1482 msg = "implementation detail not available on {0}"
1483 else:
1484 msg = "implementation detail specific to {0}"
1485 guardnames = sorted(guardnames.keys())
1486 msg = msg.format(' or '.join(guardnames))
1487 return unittest.skip(msg)
1488
1489def _parse_guards(guards):
1490 # Returns a tuple ({platform_name: run_me}, default_value)
1491 if not guards:
1492 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +00001493 is_true = list(guards.values())[0]
1494 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001495 return (guards, not is_true)
1496
1497# Use the following check to guard CPython's implementation-specific tests --
1498# or to run them only on the implementation(s) guarded by the arguments.
1499def check_impl_detail(**guards):
1500 """This function returns True or False depending on the host platform.
1501 Examples:
1502 if check_impl_detail(): # only on CPython (default)
1503 if check_impl_detail(jython=True): # only on Jython
1504 if check_impl_detail(cpython=False): # everywhere except on CPython
1505 """
1506 guards, default = _parse_guards(guards)
1507 return guards.get(platform.python_implementation().lower(), default)
1508
1509
Brett Cannon31f59292011-02-21 19:29:56 +00001510def no_tracing(func):
1511 """Decorator to temporarily turn off tracing for the duration of a test."""
1512 if not hasattr(sys, 'gettrace'):
1513 return func
1514 else:
1515 @functools.wraps(func)
1516 def wrapper(*args, **kwargs):
1517 original_trace = sys.gettrace()
1518 try:
1519 sys.settrace(None)
1520 return func(*args, **kwargs)
1521 finally:
1522 sys.settrace(original_trace)
1523 return wrapper
1524
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001525
Brett Cannon7a540732011-02-22 03:04:06 +00001526def refcount_test(test):
1527 """Decorator for tests which involve reference counting.
1528
1529 To start, the decorator does not run the test if is not run by CPython.
1530 After that, any trace function is unset during the test to prevent
1531 unexpected refcounts caused by the trace function.
1532
1533 """
1534 return no_tracing(cpython_only(test))
1535
1536
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001537def _filter_suite(suite, pred):
1538 """Recursively filter test cases in a suite based on a predicate."""
1539 newtests = []
1540 for test in suite._tests:
1541 if isinstance(test, unittest.TestSuite):
1542 _filter_suite(test, pred)
1543 newtests.append(test)
1544 else:
1545 if pred(test):
1546 newtests.append(test)
1547 suite._tests = newtests
1548
Guido van Rossumd8faa362007-04-27 19:54:29 +00001549def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +00001550 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001551 if verbose:
Antoine Pitrou216a3bc2011-07-23 22:33:39 +02001552 runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
1553 failfast=failfast)
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001554 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001555 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001556
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001557 result = runner.run(suite)
1558 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +00001559 if len(result.errors) == 1 and not result.failures:
1560 err = result.errors[0][1]
1561 elif len(result.failures) == 1 and not result.errors:
1562 err = result.failures[0][1]
1563 else:
R. David Murray723357e2009-10-19 18:06:17 +00001564 err = "multiple errors occurred"
1565 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +00001566 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +00001567
Barry Warsawc10d6902001-09-20 06:30:41 +00001568
Walter Dörwald21d3a322003-05-01 17:45:56 +00001569def run_unittest(*classes):
1570 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00001571 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001572 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001573 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001574 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575 if cls in sys.modules:
1576 suite.addTest(unittest.findTestCases(sys.modules[cls]))
1577 else:
1578 raise ValueError("str arguments must be keys in sys.modules")
1579 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +00001580 suite.addTest(cls)
1581 else:
1582 suite.addTest(unittest.makeSuite(cls))
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001583 def case_pred(test):
1584 if match_tests is None:
1585 return True
1586 for name in test.id().split("."):
1587 if fnmatch.fnmatchcase(name, match_tests):
1588 return True
1589 return False
1590 _filter_suite(suite, case_pred)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001591 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001592
Serhiy Storchaka9d0add02013-01-27 19:47:45 +02001593#=======================================================================
1594# Check for the presence of docstrings.
1595
1596HAVE_DOCSTRINGS = (check_impl_detail(cpython=False) or
1597 sys.platform == 'win32' or
1598 sysconfig.get_config_var('WITH_DOC_STRINGS'))
1599
1600requires_docstrings = unittest.skipUnless(HAVE_DOCSTRINGS,
1601 "test requires docstrings")
1602
Barry Warsawc10d6902001-09-20 06:30:41 +00001603
Tim Petersa0a62222001-09-09 06:12:01 +00001604#=======================================================================
1605# doctest driver.
1606
Stefan Krah1919b7e2012-03-21 18:25:23 +01001607def run_doctest(module, verbosity=None, optionflags=0):
Tim Peters17111f32001-10-03 04:08:26 +00001608 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +00001609
1610 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001611 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +00001612 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +00001613 """
1614
1615 import doctest
1616
1617 if verbosity is None:
1618 verbosity = verbose
1619 else:
1620 verbosity = None
1621
Stefan Krah1919b7e2012-03-21 18:25:23 +01001622 f, t = doctest.testmod(module, verbose=verbosity, optionflags=optionflags)
Victor Stinnerbddc4d42011-06-29 15:52:46 +02001623 if f:
1624 raise TestFailed("%d of %d doctests failed" % (f, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001625 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001626 print('doctest (%s) ... %d tests with zero failures' %
1627 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001628 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001629
Antoine Pitrou060cee22009-11-13 16:29:04 +00001630
1631#=======================================================================
1632# Support for saving and restoring the imported modules.
1633
1634def modules_setup():
1635 return sys.modules.copy(),
1636
1637def modules_cleanup(oldmodules):
1638 # Encoders/decoders are registered permanently within the internal
1639 # codec cache. If we destroy the corresponding modules their
1640 # globals will be set to None which will trip up the cached functions.
1641 encodings = [(k, v) for k, v in sys.modules.items()
1642 if k.startswith('encodings.')]
1643 sys.modules.clear()
1644 sys.modules.update(encodings)
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001645 # XXX: This kind of problem can affect more than just encodings. In particular
Eric Smitha3e8f3d2011-01-11 10:24:34 +00001646 # extension modules (such as _ssl) don't cope with reloading properly.
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001647 # Really, test modules should be cleaning out the test specific modules they
1648 # know they added (ala test_runpy) rather than relying on this function (as
1649 # test_importhooks and test_pkg do currently).
1650 # Implicitly imported *real* modules should be left alone (see issue 10556).
Antoine Pitrou060cee22009-11-13 16:29:04 +00001651 sys.modules.update(oldmodules)
1652
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001653#=======================================================================
1654# Threading support to prevent reporting refleaks when running regrtest.py -R
1655
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001656# NOTE: we use thread._count() rather than threading.enumerate() (or the
1657# moral equivalent thereof) because a threading.Thread object is still alive
1658# until its __bootstrap() method has returned, even after it has been
1659# unregistered from the threading module.
1660# thread._count(), on the other hand, only gets decremented *after* the
1661# __bootstrap() method has returned, which gives us reliable reference counts
1662# at the end of a test run.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001663
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001664def threading_setup():
Victor Stinner45df8202010-04-28 22:31:17 +00001665 if _thread:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001666 return _thread._count(), threading._dangling.copy()
Victor Stinner45df8202010-04-28 22:31:17 +00001667 else:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001668 return 1, ()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001669
Antoine Pitrou707f2282011-07-15 22:29:44 +02001670def threading_cleanup(*original_values):
Victor Stinner45df8202010-04-28 22:31:17 +00001671 if not _thread:
1672 return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001673 _MAX_COUNT = 10
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001674 for count in range(_MAX_COUNT):
Antoine Pitrou707f2282011-07-15 22:29:44 +02001675 values = _thread._count(), threading._dangling
1676 if values == original_values:
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001677 break
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001678 time.sleep(0.1)
Antoine Pitrou707f2282011-07-15 22:29:44 +02001679 gc_collect()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001680 # XXX print a warning in case of failure?
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001681
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001682def reap_threads(func):
Victor Stinner45df8202010-04-28 22:31:17 +00001683 """Use this function when threads are being used. This will
1684 ensure that the threads are cleaned up even when the test fails.
1685 If threading is unavailable this function does nothing.
1686 """
1687 if not _thread:
1688 return func
1689
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001690 @functools.wraps(func)
1691 def decorator(*args):
1692 key = threading_setup()
1693 try:
1694 return func(*args)
1695 finally:
1696 threading_cleanup(*key)
1697 return decorator
1698
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001699def reap_children():
1700 """Use this function at the end of test_main() whenever sub-processes
1701 are started. This will help ensure that no extra children (zombies)
1702 stick around to hog resources and create problems when looking
1703 for refleaks.
1704 """
1705
1706 # Reap all our dead child processes so we don't leave zombies around.
1707 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001708 if hasattr(os, 'waitpid'):
1709 any_process = -1
1710 while True:
1711 try:
1712 # This will raise an exception on Windows. That's ok.
1713 pid, status = os.waitpid(any_process, os.WNOHANG)
1714 if pid == 0:
1715 break
1716 except:
1717 break
Collin Winterf2bf2b32010-03-17 00:41:56 +00001718
1719@contextlib.contextmanager
1720def swap_attr(obj, attr, new_val):
1721 """Temporary swap out an attribute with a new object.
1722
1723 Usage:
1724 with swap_attr(obj, "attr", 5):
1725 ...
1726
1727 This will set obj.attr to 5 for the duration of the with: block,
1728 restoring the old value at the end of the block. If `attr` doesn't
1729 exist on `obj`, it will be created and then deleted at the end of the
1730 block.
1731 """
1732 if hasattr(obj, attr):
1733 real_val = getattr(obj, attr)
1734 setattr(obj, attr, new_val)
1735 try:
1736 yield
1737 finally:
1738 setattr(obj, attr, real_val)
1739 else:
1740 setattr(obj, attr, new_val)
1741 try:
1742 yield
1743 finally:
1744 delattr(obj, attr)
1745
1746@contextlib.contextmanager
1747def swap_item(obj, item, new_val):
1748 """Temporary swap out an item with a new object.
1749
1750 Usage:
1751 with swap_item(obj, "item", 5):
1752 ...
1753
1754 This will set obj["item"] to 5 for the duration of the with: block,
1755 restoring the old value at the end of the block. If `item` doesn't
1756 exist on `obj`, it will be created and then deleted at the end of the
1757 block.
1758 """
1759 if item in obj:
1760 real_val = obj[item]
1761 obj[item] = new_val
1762 try:
1763 yield
1764 finally:
1765 obj[item] = real_val
1766 else:
1767 obj[item] = new_val
1768 try:
1769 yield
1770 finally:
1771 del obj[item]
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001772
1773def strip_python_stderr(stderr):
1774 """Strip the stderr of a Python process from potential debug output
1775 emitted by the interpreter.
1776
1777 This will typically be run on the result of the communicate() method
1778 of a subprocess.Popen object.
1779 """
Richard Oudkerk73d9a292012-06-14 15:30:10 +01001780 stderr = re.sub(br"\[\d+ refs\]\r?\n?", b"", stderr).strip()
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001781 return stderr
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +00001782
1783def args_from_interpreter_flags():
1784 """Return a list of command-line arguments reproducing the current
Brett Cannonb880c152011-03-15 16:03:09 -04001785 settings in sys.flags and sys.warnoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +02001786 return subprocess._args_from_interpreter_flags()
Vinay Sajip129fd042010-12-10 08:19:38 +00001787
1788#============================================================
1789# Support for assertions about logging.
1790#============================================================
1791
1792class TestHandler(logging.handlers.BufferingHandler):
1793 def __init__(self, matcher):
1794 # BufferingHandler takes a "capacity" argument
1795 # so as to know when to flush. As we're overriding
1796 # shouldFlush anyway, we can set a capacity of zero.
1797 # You can call flush() manually to clear out the
1798 # buffer.
1799 logging.handlers.BufferingHandler.__init__(self, 0)
1800 self.matcher = matcher
1801
1802 def shouldFlush(self):
1803 return False
1804
1805 def emit(self, record):
1806 self.format(record)
1807 self.buffer.append(record.__dict__)
1808
1809 def matches(self, **kwargs):
1810 """
1811 Look for a saved dict whose keys/values match the supplied arguments.
1812 """
1813 result = False
1814 for d in self.buffer:
1815 if self.matcher.matches(d, **kwargs):
1816 result = True
1817 break
1818 return result
1819
1820class Matcher(object):
1821
1822 _partial_matches = ('msg', 'message')
1823
1824 def matches(self, d, **kwargs):
1825 """
1826 Try to match a single dict with the supplied arguments.
1827
1828 Keys whose values are strings and which are in self._partial_matches
1829 will be checked for partial (i.e. substring) matches. You can extend
1830 this scheme to (for example) do regular expression matching, etc.
1831 """
1832 result = True
1833 for k in kwargs:
1834 v = kwargs[k]
1835 dv = d.get(k)
1836 if not self.match_value(k, dv, v):
1837 result = False
1838 break
1839 return result
1840
1841 def match_value(self, k, dv, v):
1842 """
1843 Try to match a single stored value (dv) with a supplied value (v).
1844 """
1845 if type(v) != type(dv):
1846 result = False
1847 elif type(dv) is not str or k not in self._partial_matches:
1848 result = (v == dv)
1849 else:
1850 result = dv.find(v) >= 0
1851 return result
Brian Curtin3b4499c2010-12-28 14:31:47 +00001852
1853
1854_can_symlink = None
1855def can_symlink():
1856 global _can_symlink
1857 if _can_symlink is not None:
1858 return _can_symlink
Brett Cannonee877a02011-03-15 17:32:14 -04001859 symlink_path = TESTFN + "can_symlink"
Brian Curtin3b4499c2010-12-28 14:31:47 +00001860 try:
Brett Cannonee877a02011-03-15 17:32:14 -04001861 os.symlink(TESTFN, symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001862 can = True
Brian Curtind25aef52011-06-13 15:16:04 -05001863 except (OSError, NotImplementedError, AttributeError):
Brian Curtin3b4499c2010-12-28 14:31:47 +00001864 can = False
Victor Stinner62ec61f2011-06-07 12:17:15 +02001865 else:
1866 os.remove(symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001867 _can_symlink = can
1868 return can
1869
1870def skip_unless_symlink(test):
1871 """Skip decorator for tests that require functional symlink"""
1872 ok = can_symlink()
1873 msg = "Requires functional symlink implementation"
1874 return test if ok else unittest.skip(msg)(test)
Antoine Pitroue8706232011-03-15 21:05:36 +01001875
Antoine Pitrou424246f2012-05-12 19:02:01 +02001876_can_xattr = None
1877def can_xattr():
1878 global _can_xattr
1879 if _can_xattr is not None:
1880 return _can_xattr
1881 if not hasattr(os, "setxattr"):
1882 can = False
1883 else:
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001884 tmp_fp, tmp_name = tempfile.mkstemp()
Antoine Pitrou424246f2012-05-12 19:02:01 +02001885 try:
1886 with open(TESTFN, "wb") as fp:
1887 try:
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001888 # TESTFN & tempfile may use different file systems with
1889 # different capabilities
Larry Hastings9cf065c2012-06-22 16:30:09 -07001890 os.setxattr(tmp_fp, b"user.test", b"")
1891 os.setxattr(fp.fileno(), b"user.test", b"")
Antoine Pitrou424246f2012-05-12 19:02:01 +02001892 # Kernels < 2.6.39 don't respect setxattr flags.
1893 kernel_version = platform.release()
1894 m = re.match("2.6.(\d{1,2})", kernel_version)
1895 can = m is None or int(m.group(1)) >= 39
1896 except OSError:
1897 can = False
1898 finally:
1899 unlink(TESTFN)
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001900 unlink(tmp_name)
Antoine Pitrou424246f2012-05-12 19:02:01 +02001901 _can_xattr = can
1902 return can
1903
1904def skip_unless_xattr(test):
1905 """Skip decorator for tests that require functional extended attributes"""
1906 ok = can_xattr()
1907 msg = "no non-broken extended attribute support"
1908 return test if ok else unittest.skip(msg)(test)
1909
Ezio Melotti25a40452013-03-05 20:26:17 +02001910
1911if sys.platform.startswith('win'):
1912 @contextlib.contextmanager
1913 def suppress_crash_popup():
1914 """Disable Windows Error Reporting dialogs using SetErrorMode."""
1915 # see http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx
Ezio Melottie8463422013-03-07 18:37:13 +02001916 # GetErrorMode is not available on Windows XP and Windows Server 2003,
1917 # but SetErrorMode returns the previous value, so we can use that
Ezio Melotti25a40452013-03-05 20:26:17 +02001918 import ctypes
1919 k32 = ctypes.windll.kernel32
Ezio Melotti25a40452013-03-05 20:26:17 +02001920 SEM_NOGPFAULTERRORBOX = 0x02
Ezio Melottie8463422013-03-07 18:37:13 +02001921 old_error_mode = k32.SetErrorMode(SEM_NOGPFAULTERRORBOX)
Ezio Melotti25a40452013-03-05 20:26:17 +02001922 k32.SetErrorMode(old_error_mode | SEM_NOGPFAULTERRORBOX)
1923 try:
1924 yield
1925 finally:
1926 k32.SetErrorMode(old_error_mode)
1927else:
1928 # this is a no-op for other platforms
1929 @contextlib.contextmanager
1930 def suppress_crash_popup():
1931 yield
1932
1933
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001934def patch(test_instance, object_to_patch, attr_name, new_value):
1935 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1936
1937 Also, add a cleanup procedure to 'test_instance' to restore
1938 'object_to_patch' value for 'attr_name'.
1939 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1940
1941 """
1942 # check that 'attr_name' is a real attribute for 'object_to_patch'
1943 # will raise AttributeError if it does not exist
1944 getattr(object_to_patch, attr_name)
1945
1946 # keep a copy of the old value
1947 attr_is_local = False
1948 try:
1949 old_value = object_to_patch.__dict__[attr_name]
1950 except (AttributeError, KeyError):
1951 old_value = getattr(object_to_patch, attr_name, None)
1952 else:
1953 attr_is_local = True
1954
1955 # restore the value when the test is done
1956 def cleanup():
1957 if attr_is_local:
1958 setattr(object_to_patch, attr_name, old_value)
1959 else:
1960 delattr(object_to_patch, attr_name)
1961
1962 test_instance.addCleanup(cleanup)
1963
1964 # actually override the attribute
1965 setattr(object_to_patch, attr_name, new_value)