blob: f2c3434c078739f00f3beec335738b800838f136 [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
576# A constant likely larger than the underlying OS pipe buffer size.
Gregory P. Smith91110f52013-03-19 23:25:16 -0700577# Windows limit seems to be around 512B, and many Unix kernels have a 64K pipe
578# buffer size or 16*PAGE_SIZE: take a few megs to be sure. This
579PIPE_MAX_SIZE = 3 * 1000 * 1000
Charles-François Natali2d517212011-05-29 16:36:44 +0200580
581
Eric Smithf24a0d92010-12-04 13:32:18 +0000582# decorator for skipping tests on non-IEEE 754 platforms
583requires_IEEE_754 = unittest.skipUnless(
584 float.__getformat__("double").startswith("IEEE"),
585 "test requires IEEE 754 doubles")
586
Ezio Melotticad648c2011-05-19 21:25:10 +0300587requires_zlib = unittest.skipUnless(zlib, 'requires zlib')
588
Martin v. Löwisf6b16a42012-05-01 07:58:44 +0200589requires_bz2 = unittest.skipUnless(bz2, 'requires bz2')
590
Martin v. Löwis7fb79fc2012-05-13 10:06:36 +0200591requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
592
Finn Bock57bc5fa2002-11-01 18:02:03 +0000593is_jython = sys.platform.startswith('java')
594
Barry Warsaw559f6682001-03-23 18:04:02 +0000595# Filename used for testing
596if os.name == 'java':
597 # Jython disallows @ in module names
598 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000599else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000600 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000601
Antoine Pitrou88909542009-06-29 13:54:42 +0000602# Disambiguate TESTFN for parallel testing, while letting it remain a valid
603# module name.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000604TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
Antoine Pitrou88909542009-06-29 13:54:42 +0000605
Victor Stinnere667e982012-11-12 01:23:15 +0100606# FS_NONASCII: non-ASCII character encodable by os.fsencode(),
607# or None if there is no such character.
608FS_NONASCII = None
609for character in (
610 # First try printable and common characters to have a readable filename.
611 # For each character, the encoding list are just example of encodings able
612 # to encode the character (the list is not exhaustive).
613
614 # U+00E6 (Latin Small Letter Ae): cp1252, iso-8859-1
615 '\u00E6',
616 # U+0130 (Latin Capital Letter I With Dot Above): cp1254, iso8859_3
617 '\u0130',
618 # U+0141 (Latin Capital Letter L With Stroke): cp1250, cp1257
619 '\u0141',
620 # U+03C6 (Greek Small Letter Phi): cp1253
621 '\u03C6',
622 # U+041A (Cyrillic Capital Letter Ka): cp1251
623 '\u041A',
624 # U+05D0 (Hebrew Letter Alef): Encodable to cp424
625 '\u05D0',
626 # U+060C (Arabic Comma): cp864, cp1006, iso8859_6, mac_arabic
627 '\u060C',
628 # U+062A (Arabic Letter Teh): cp720
629 '\u062A',
630 # U+0E01 (Thai Character Ko Kai): cp874
631 '\u0E01',
632
633 # Then try more "special" characters. "special" because they may be
634 # interpreted or displayed differently depending on the exact locale
635 # encoding and the font.
636
637 # U+00A0 (No-Break Space)
638 '\u00A0',
639 # U+20AC (Euro Sign)
640 '\u20AC',
641):
642 try:
643 os.fsdecode(os.fsencode(character))
644 except UnicodeError:
645 pass
646 else:
647 FS_NONASCII = character
648 break
Michael Foord2d9c2d52010-05-04 22:29:10 +0000649
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000650# TESTFN_UNICODE is a non-ascii filename
651TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
Victor Stinner74a833f2010-08-18 21:06:23 +0000652if sys.platform == 'darwin':
653 # In Mac OS X's VFS API file names are, by definition, canonically
654 # decomposed Unicode, encoded using UTF-8. See QA1173:
655 # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
656 import unicodedata
657 TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
Antoine Pitrou88909542009-06-29 13:54:42 +0000658TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000659
Victor Stinner09c449c2010-08-13 22:23:24 +0000660# TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000661# encoded by the filesystem encoding (in strict mode). It can be None if we
662# cannot generate such filename.
Victor Stinnera0241c82010-08-15 19:28:21 +0000663TESTFN_UNENCODABLE = None
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000664if os.name in ('nt', 'ce'):
Victor Stinnera0241c82010-08-15 19:28:21 +0000665 # skip win32s (0) or Windows 9x/ME (1)
666 if sys.getwindowsversion().platform >= 2:
Victor Stinner8ce7df62010-09-10 11:19:59 +0000667 # Different kinds of characters from various languages to minimize the
668 # probability that the whole name is encodable to MBCS (issue #9819)
669 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000670 try:
Victor Stinner09c449c2010-08-13 22:23:24 +0000671 TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000672 except UnicodeEncodeError:
673 pass
674 else:
675 print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
676 'Unicode filename tests may not be effective'
Victor Stinner09c449c2010-08-13 22:23:24 +0000677 % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
678 TESTFN_UNENCODABLE = None
Victor Stinnera0241c82010-08-15 19:28:21 +0000679# Mac OS X denies unencodable filenames (invalid utf-8)
Victor Stinner03c9e1d2010-08-14 17:35:20 +0000680elif sys.platform != 'darwin':
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000681 try:
682 # ascii and utf-8 cannot encode the byte 0xff
683 b'\xff'.decode(TESTFN_ENCODING)
684 except UnicodeDecodeError:
685 # 0xff will be encoded using the surrogate character u+DCFF
Victor Stinner09c449c2010-08-13 22:23:24 +0000686 TESTFN_UNENCODABLE = TESTFN \
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000687 + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
688 else:
689 # File system encoding (eg. ISO-8859-* encodings) can encode
690 # the byte 0xff. Skip some unicode filename tests.
Victor Stinnera0241c82010-08-15 19:28:21 +0000691 pass
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000692
Victor Stinnere667e982012-11-12 01:23:15 +0100693# TESTFN_UNDECODABLE is a filename (bytes type) that should *not* be able to be
694# decoded from the filesystem encoding (in strict mode). It can be None if we
695# cannot generate such filename (ex: the latin1 encoding can decode any byte
696# sequence). On UNIX, TESTFN_UNDECODABLE can be decoded by os.fsdecode() thanks
697# to the surrogateescape error handler (PEP 383), but not from the filesystem
698# encoding in strict mode.
699TESTFN_UNDECODABLE = None
700for name in (
701 # b'\xff' is not decodable by os.fsdecode() with code page 932. Windows
702 # accepts it to create a file or a directory, or don't accept to enter to
703 # such directory (when the bytes name is used). So test b'\xe7' first: it is
704 # not decodable from cp932.
705 b'\xe7w\xf0',
706 # undecodable from ASCII, UTF-8
707 b'\xff',
708 # undecodable from iso8859-3, iso8859-6, iso8859-7, cp424, iso8859-8, cp856
709 # and cp857
710 b'\xae\xd5'
711 # undecodable from UTF-8 (UNIX and Mac OS X)
712 b'\xed\xb2\x80', b'\xed\xb4\x80',
Victor Stinner0af71aa2013-01-03 01:50:30 +0100713 # undecodable from shift_jis, cp869, cp874, cp932, cp1250, cp1251, cp1252,
714 # cp1253, cp1254, cp1255, cp1257, cp1258
715 b'\x81\x98',
Victor Stinnere667e982012-11-12 01:23:15 +0100716):
717 try:
718 name.decode(TESTFN_ENCODING)
719 except UnicodeDecodeError:
720 TESTFN_UNDECODABLE = os.fsencode(TESTFN) + name
721 break
722
723if FS_NONASCII:
724 TESTFN_NONASCII = TESTFN + '-' + FS_NONASCII
725else:
726 TESTFN_NONASCII = None
727
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000728# Save the initial cwd
729SAVEDCWD = os.getcwd()
730
731@contextlib.contextmanager
Nick Coghland26c18a2010-08-17 13:06:11 +0000732def temp_cwd(name='tempcwd', quiet=False, path=None):
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000733 """
Nick Coghland26c18a2010-08-17 13:06:11 +0000734 Context manager that temporarily changes the CWD.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000735
Nick Coghland26c18a2010-08-17 13:06:11 +0000736 An existing path may be provided as *path*, in which case this
737 function makes no changes to the file system.
738
739 Otherwise, the new CWD is created in the current directory and it's
740 named *name*. If *quiet* is False (default) and it's not possible to
741 create or change the CWD, an error is raised. If it's True, only a
742 warning is raised and the original CWD is used.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000743 """
744 saved_dir = os.getcwd()
745 is_temporary = False
Nick Coghland26c18a2010-08-17 13:06:11 +0000746 if path is None:
747 path = name
748 try:
749 os.mkdir(name)
750 is_temporary = True
751 except OSError:
752 if not quiet:
753 raise
754 warnings.warn('tests may fail, unable to create temp CWD ' + name,
755 RuntimeWarning, stacklevel=3)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000756 try:
Nick Coghland26c18a2010-08-17 13:06:11 +0000757 os.chdir(path)
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000758 except OSError:
759 if not quiet:
760 raise
Ezio Melottie418d762012-09-21 16:48:12 +0300761 warnings.warn('tests may fail, unable to change the CWD to ' + path,
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000762 RuntimeWarning, stacklevel=3)
763 try:
764 yield os.getcwd()
765 finally:
766 os.chdir(saved_dir)
767 if is_temporary:
768 rmtree(name)
769
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000770
Eli Bendersky6c519992011-07-23 08:48:53 +0300771if hasattr(os, "umask"):
772 @contextlib.contextmanager
773 def temp_umask(umask):
774 """Context manager that temporarily sets the process umask."""
775 oldmask = os.umask(umask)
776 try:
777 yield
778 finally:
779 os.umask(oldmask)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000780
781
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000782def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000783 """Try to find a file on sys.path and the working directory. If it is not
784 found the argument passed to the function is returned (this does not
785 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000786 if os.path.isabs(file):
787 return file
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000788 if subdir is not None:
789 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000790 path = sys.path
791 path = [os.path.dirname(here)] + path
792 for dn in path:
793 fn = os.path.join(dn, file)
794 if os.path.exists(fn): return fn
795 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000796
Victor Stinnerbf816222011-06-30 23:25:47 +0200797def create_empty_file(filename):
798 """Create an empty file. If the file already exists, truncate it."""
799 fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
800 os.close(fd)
801
Tim Peters2f228e72001-05-13 00:19:31 +0000802def sortdict(dict):
803 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000804 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000805 reprpairs = ["%r: %r" % pair for pair in items]
806 withcommas = ", ".join(reprpairs)
807 return "{%s}" % withcommas
808
Benjamin Peterson7522c742009-01-19 21:00:09 +0000809def make_bad_fd():
810 """
811 Create an invalid file descriptor by opening and closing a file and return
812 its fd.
813 """
814 file = open(TESTFN, "wb")
815 try:
816 return file.fileno()
817 finally:
818 file.close()
819 unlink(TESTFN)
820
Thomas Wouters89f507f2006-12-13 04:49:30 +0000821def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000822 testcase.assertRaises(SyntaxError, compile, statement,
823 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000824
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000825def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000826 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000827
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000828 check = kw.pop('check', None)
829
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000830 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000831
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000832 fn = os.path.join(os.path.dirname(__file__), "data", filename)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000833
834 def check_valid_file(fn):
835 f = open(fn, *args, **kw)
836 if check is None:
837 return f
838 elif check(f):
839 f.seek(0)
840 return f
841 f.close()
842
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000843 if os.path.exists(fn):
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000844 f = check_valid_file(fn)
845 if f is not None:
846 return f
847 unlink(fn)
848
849 # Verify the requirement before downloading the file
850 requires('urlfetch')
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000851
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000852 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitroufd0680b2009-11-01 22:13:48 +0000853 f = urllib.request.urlopen(url, timeout=15)
854 try:
855 with open(fn, "wb") as out:
856 s = f.read()
857 while s:
858 out.write(s)
859 s = f.read()
860 finally:
861 f.close()
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000862
863 f = check_valid_file(fn)
864 if f is not None:
865 return f
Éric Araujoaf5bacf2011-07-15 17:50:15 +0200866 raise TestFailed('invalid resource %r' % fn)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000867
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000868
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000869class WarningsRecorder(object):
870 """Convenience wrapper for the warnings list returned on
871 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000872 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000873 def __init__(self, warnings_list):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000874 self._warnings = warnings_list
875 self._last = 0
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000876
877 def __getattr__(self, attr):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000878 if len(self._warnings) > self._last:
879 return getattr(self._warnings[-1], attr)
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000880 elif attr in warnings.WarningMessage._WARNING_DETAILS:
881 return None
882 raise AttributeError("%r has no attribute %r" % (self, attr))
883
Florent Xiclunab14930c2010-03-13 15:26:44 +0000884 @property
885 def warnings(self):
886 return self._warnings[self._last:]
887
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000888 def reset(self):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000889 self._last = len(self._warnings)
890
891
892def _filterwarnings(filters, quiet=False):
893 """Catch the warnings, then check if all the expected
894 warnings have been raised and re-raise unexpected warnings.
895 If 'quiet' is True, only re-raise the unexpected warnings.
896 """
897 # Clear the warning registry of the calling module
898 # in order to re-raise the warnings.
899 frame = sys._getframe(2)
900 registry = frame.f_globals.get('__warningregistry__')
901 if registry:
902 registry.clear()
903 with warnings.catch_warnings(record=True) as w:
904 # Set filter "always" to record all warnings. Because
905 # test_warnings swap the module, we need to look up in
906 # the sys.modules dictionary.
907 sys.modules['warnings'].simplefilter("always")
908 yield WarningsRecorder(w)
909 # Filter the recorded warnings
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000910 reraise = list(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000911 missing = []
912 for msg, cat in filters:
913 seen = False
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000914 for w in reraise[:]:
915 warning = w.message
Florent Xiclunab14930c2010-03-13 15:26:44 +0000916 # Filter out the matching messages
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000917 if (re.match(msg, str(warning), re.I) and
918 issubclass(warning.__class__, cat)):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000919 seen = True
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000920 reraise.remove(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000921 if not seen and not quiet:
922 # This filter caught nothing
923 missing.append((msg, cat.__name__))
924 if reraise:
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000925 raise AssertionError("unhandled warning %s" % reraise[0])
Florent Xiclunab14930c2010-03-13 15:26:44 +0000926 if missing:
927 raise AssertionError("filter (%r, %s) did not catch any warning" %
928 missing[0])
929
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000930
931@contextlib.contextmanager
Florent Xiclunab14930c2010-03-13 15:26:44 +0000932def check_warnings(*filters, **kwargs):
933 """Context manager to silence warnings.
934
935 Accept 2-tuples as positional arguments:
936 ("message regexp", WarningCategory)
937
938 Optional argument:
939 - if 'quiet' is True, it does not fail if a filter catches nothing
Florent Xicluna53b506be2010-03-18 20:00:57 +0000940 (default True without argument,
941 default False if some filters are defined)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000942
943 Without argument, it defaults to:
Florent Xicluna53b506be2010-03-18 20:00:57 +0000944 check_warnings(("", Warning), quiet=True)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000945 """
Florent Xicluna53b506be2010-03-18 20:00:57 +0000946 quiet = kwargs.get('quiet')
Florent Xiclunab14930c2010-03-13 15:26:44 +0000947 if not filters:
948 filters = (("", Warning),)
Florent Xicluna53b506be2010-03-18 20:00:57 +0000949 # Preserve backward compatibility
950 if quiet is None:
951 quiet = True
952 return _filterwarnings(filters, quiet)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000953
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000954
955class CleanImport(object):
956 """Context manager to force import to return a new module reference.
957
958 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000959 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000960
961 Use like this:
962
963 with CleanImport("foo"):
Brett Cannonddb5e702010-02-03 22:16:11 +0000964 importlib.import_module("foo") # new reference
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000965 """
966
967 def __init__(self, *module_names):
968 self.original_modules = sys.modules.copy()
969 for module_name in module_names:
970 if module_name in sys.modules:
971 module = sys.modules[module_name]
972 # It is possible that module_name is just an alias for
973 # another module (e.g. stub for modules renamed in 3.x).
974 # In that case, we also need delete the real module to clear
975 # the import cache.
976 if module.__name__ != module_name:
977 del sys.modules[module.__name__]
978 del sys.modules[module_name]
979
980 def __enter__(self):
981 return self
982
983 def __exit__(self, *ignore_exc):
984 sys.modules.update(self.original_modules)
985
986
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000987class EnvironmentVarGuard(collections.abc.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000988
989 """Class to help protect the environment variable properly. Can be used as
990 a context manager."""
991
992 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000993 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000994 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000995
Walter Dörwald155374d2009-05-01 19:58:58 +0000996 def __getitem__(self, envvar):
997 return self._environ[envvar]
998
999 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +00001000 # Remember the initial value on the first access
1001 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +00001002 self._changed[envvar] = self._environ.get(envvar)
1003 self._environ[envvar] = value
1004
1005 def __delitem__(self, envvar):
1006 # Remember the initial value on the first access
1007 if envvar not in self._changed:
1008 self._changed[envvar] = self._environ.get(envvar)
1009 if envvar in self._environ:
1010 del self._environ[envvar]
1011
1012 def keys(self):
1013 return self._environ.keys()
1014
1015 def __iter__(self):
1016 return iter(self._environ)
1017
1018 def __len__(self):
1019 return len(self._environ)
1020
1021 def set(self, envvar, value):
1022 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001023
1024 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +00001025 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001026
1027 def __enter__(self):
1028 return self
1029
1030 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +00001031 for (k, v) in self._changed.items():
1032 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +00001033 if k in self._environ:
1034 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +00001035 else:
Walter Dörwald155374d2009-05-01 19:58:58 +00001036 self._environ[k] = v
Nick Coghlan6ead5522009-10-18 13:19:33 +00001037 os.environ = self._environ
1038
1039
1040class DirsOnSysPath(object):
1041 """Context manager to temporarily add directories to sys.path.
1042
1043 This makes a copy of sys.path, appends any directories given
1044 as positional arguments, then reverts sys.path to the copied
1045 settings when the context ends.
1046
1047 Note that *all* sys.path modifications in the body of the
1048 context manager, including replacement of the object,
1049 will be reverted at the end of the block.
1050 """
1051
1052 def __init__(self, *paths):
1053 self.original_value = sys.path[:]
1054 self.original_object = sys.path
1055 sys.path.extend(paths)
1056
1057 def __enter__(self):
1058 return self
1059
1060 def __exit__(self, *ignore_exc):
1061 sys.path = self.original_object
1062 sys.path[:] = self.original_value
Walter Dörwald155374d2009-05-01 19:58:58 +00001063
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001064
Guido van Rossumd8faa362007-04-27 19:54:29 +00001065class TransientResource(object):
1066
1067 """Raise ResourceDenied if an exception is raised while the context manager
1068 is in effect that matches the specified exception and attributes."""
1069
1070 def __init__(self, exc, **kwargs):
1071 self.exc = exc
1072 self.attrs = kwargs
1073
1074 def __enter__(self):
1075 return self
1076
1077 def __exit__(self, type_=None, value=None, traceback=None):
1078 """If type_ is a subclass of self.exc and value has attributes matching
1079 self.attrs, raise ResourceDenied. Otherwise let the exception
1080 propagate (if any)."""
1081 if type_ is not None and issubclass(self.exc, type_):
1082 for attr, attr_value in self.attrs.items():
1083 if not hasattr(value, attr):
1084 break
1085 if getattr(value, attr) != attr_value:
1086 break
1087 else:
1088 raise ResourceDenied("an optional resource is not available")
1089
Raymond Hettinger686057b2009-06-04 00:11:54 +00001090# Context managers that raise ResourceDenied when various issues
1091# with the Internet connection manifest themselves as exceptions.
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001092# XXX deprecate these and use transient_internet() instead
Raymond Hettinger686057b2009-06-04 00:11:54 +00001093time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
1094socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
1095ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001096
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001097
Thomas Woutersed03b412007-08-28 21:37:11 +00001098@contextlib.contextmanager
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001099def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001100 """Return a context manager that raises ResourceDenied when various issues
1101 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001102 default_errnos = [
1103 ('ECONNREFUSED', 111),
1104 ('ECONNRESET', 104),
Antoine Pitrou5d938cb2011-01-08 10:28:11 +00001105 ('EHOSTUNREACH', 113),
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001106 ('ENETUNREACH', 101),
1107 ('ETIMEDOUT', 110),
1108 ]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001109 default_gai_errnos = [
Antoine Pitrou4875c462011-07-09 02:31:24 +02001110 ('EAI_AGAIN', -3),
Charles-François Natali13859bf2011-12-10 13:16:44 +01001111 ('EAI_FAIL', -4),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001112 ('EAI_NONAME', -2),
1113 ('EAI_NODATA', -5),
Antoine Pitrou390ea0f2011-04-29 00:44:33 +02001114 # Encountered when trying to resolve IPv6-only hostnames
1115 ('WSANO_DATA', 11004),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001116 ]
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001117
Éric Araujoaf5bacf2011-07-15 17:50:15 +02001118 denied = ResourceDenied("Resource %r is not available" % resource_name)
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001119 captured_errnos = errnos
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001120 gai_errnos = []
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001121 if not captured_errnos:
1122 captured_errnos = [getattr(errno, name, num)
1123 for (name, num) in default_errnos]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001124 gai_errnos = [getattr(socket, name, num)
1125 for (name, num) in default_gai_errnos]
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001126
1127 def filter_error(err):
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001128 n = getattr(err, 'errno', None)
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001129 if (isinstance(err, socket.timeout) or
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001130 (isinstance(err, socket.gaierror) and n in gai_errnos) or
1131 n in captured_errnos):
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001132 if not verbose:
1133 sys.stderr.write(denied.args[0] + "\n")
1134 raise denied from err
1135
1136 old_timeout = socket.getdefaulttimeout()
1137 try:
1138 if timeout is not None:
1139 socket.setdefaulttimeout(timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001140 yield
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001141 except IOError as err:
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001142 # urllib can wrap original socket errors multiple times (!), we must
1143 # unwrap to get at the original error.
1144 while True:
1145 a = err.args
1146 if len(a) >= 1 and isinstance(a[0], IOError):
1147 err = a[0]
1148 # The error can also be wrapped as args[1]:
1149 # except socket.error as msg:
1150 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
1151 elif len(a) >= 2 and isinstance(a[1], IOError):
1152 err = a[1]
1153 else:
1154 break
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001155 filter_error(err)
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001156 raise
1157 # XXX should we catch generic exceptions and look for their
1158 # __cause__ or __context__?
1159 finally:
1160 socket.setdefaulttimeout(old_timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001161
1162
1163@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001164def captured_output(stream_name):
Ezio Melotti07352b02011-05-14 14:51:18 +03001165 """Return a context manager used by captured_stdout/stdin/stderr
Ezio Melottifc778fd2011-05-14 08:22:47 +03001166 that temporarily replaces the sys stream *stream_name* with a StringIO."""
Thomas Woutersed03b412007-08-28 21:37:11 +00001167 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001168 orig_stdout = getattr(sys, stream_name)
1169 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001170 try:
1171 yield getattr(sys, stream_name)
1172 finally:
1173 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001174
1175def captured_stdout():
Ezio Melottifc778fd2011-05-14 08:22:47 +03001176 """Capture the output of sys.stdout:
1177
1178 with captured_stdout() as s:
1179 print("hello")
1180 self.assertEqual(s.getvalue(), "hello")
1181 """
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001182 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +00001183
Nick Coghlan6b22f3f2010-12-12 15:24:21 +00001184def captured_stderr():
1185 return captured_output("stderr")
1186
Nick Coghlan6ead5522009-10-18 13:19:33 +00001187def captured_stdin():
1188 return captured_output("stdin")
1189
Ezio Melotti07352b02011-05-14 14:51:18 +03001190
Benjamin Petersone549ead2009-03-28 21:42:05 +00001191def gc_collect():
1192 """Force as many objects as possible to be collected.
1193
1194 In non-CPython implementations of Python, this is needed because timely
1195 deallocation is not guaranteed by the garbage collector. (Even in CPython
1196 this can be the case in case of reference cycles.) This means that __del__
1197 methods may be called later than expected and weakrefs may remain alive for
1198 longer than expected. This function tries its best to force all garbage
1199 objects to disappear.
1200 """
Benjamin Petersone549ead2009-03-28 21:42:05 +00001201 gc.collect()
Benjamin Petersona6590e82010-04-11 21:22:10 +00001202 if is_jython:
1203 time.sleep(0.1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00001204 gc.collect()
1205 gc.collect()
1206
Benjamin Peterson31f4beb2011-07-14 12:48:01 -05001207@contextlib.contextmanager
1208def disable_gc():
1209 have_gc = gc.isenabled()
1210 gc.disable()
1211 try:
1212 yield
1213 finally:
1214 if have_gc:
1215 gc.enable()
1216
Thomas Woutersed03b412007-08-28 21:37:11 +00001217
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001218def python_is_optimized():
1219 """Find if Python was built with optimizations."""
Antoine Pitrou64474542010-10-31 11:34:47 +00001220 cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001221 final_opt = ""
1222 for opt in cflags.split():
1223 if opt.startswith('-O'):
1224 final_opt = opt
Eli Bendersky6c519992011-07-23 08:48:53 +03001225 return final_opt != '' and final_opt != '-O0'
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001226
1227
Martin v. Löwis2b168442012-07-29 16:38:45 +02001228_header = 'nP'
1229_align = '0n'
Martin v. Löwis33f79972012-07-29 16:33:05 +02001230if hasattr(sys, "gettotalrefcount"):
1231 _header = '2P' + _header
Martin v. Löwis2b168442012-07-29 16:38:45 +02001232 _align = '0P'
1233_vheader = _header + 'n'
Martin v. Löwis33f79972012-07-29 16:33:05 +02001234
1235def calcobjsize(fmt):
Martin v. Löwis2b168442012-07-29 16:38:45 +02001236 return struct.calcsize(_header + fmt + _align)
Martin v. Löwis33f79972012-07-29 16:33:05 +02001237
1238def calcvobjsize(fmt):
Martin v. Löwis2b168442012-07-29 16:38:45 +02001239 return struct.calcsize(_vheader + fmt + _align)
Martin v. Löwis33f79972012-07-29 16:33:05 +02001240
1241
1242_TPFLAGS_HAVE_GC = 1<<14
1243_TPFLAGS_HEAPTYPE = 1<<9
1244
1245def check_sizeof(test, o, size):
1246 result = sys.getsizeof(o)
1247 # add GC header size
1248 if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\
1249 ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))):
1250 size += _testcapi.SIZEOF_PYGC_HEAD
1251 msg = 'wrong size for %s: got %d, expected %d' \
1252 % (type(o), result, size)
1253 test.assertEqual(result, size, msg)
1254
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001255#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +00001256# Decorator for running a function in a different locale, correctly resetting
1257# it afterwards.
1258
1259def run_with_locale(catstr, *locales):
1260 def decorator(func):
1261 def inner(*args, **kwds):
1262 try:
1263 import locale
1264 category = getattr(locale, catstr)
1265 orig_locale = locale.setlocale(category)
1266 except AttributeError:
1267 # if the test author gives us an invalid category string
1268 raise
1269 except:
1270 # cannot retrieve original locale, so do nothing
1271 locale = orig_locale = None
1272 else:
1273 for loc in locales:
1274 try:
1275 locale.setlocale(category, loc)
1276 break
1277 except:
1278 pass
1279
1280 # now run the function, resetting the locale on exceptions
1281 try:
1282 return func(*args, **kwds)
1283 finally:
1284 if locale and orig_locale:
1285 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +00001286 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +00001287 inner.__doc__ = func.__doc__
1288 return inner
1289 return decorator
1290
1291#=======================================================================
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001292# Decorator for running a function in a specific timezone, correctly
1293# resetting it afterwards.
1294
1295def run_with_tz(tz):
1296 def decorator(func):
1297 def inner(*args, **kwds):
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001298 try:
1299 tzset = time.tzset
1300 except AttributeError:
1301 raise unittest.SkipTest("tzset required")
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001302 if 'TZ' in os.environ:
1303 orig_tz = os.environ['TZ']
1304 else:
1305 orig_tz = None
1306 os.environ['TZ'] = tz
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001307 tzset()
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001308
1309 # now run the function, resetting the tz on exceptions
1310 try:
1311 return func(*args, **kwds)
1312 finally:
Benjamin Petersonb29614e2012-10-09 11:16:03 -04001313 if orig_tz is None:
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001314 del os.environ['TZ']
1315 else:
1316 os.environ['TZ'] = orig_tz
1317 time.tzset()
1318
1319 inner.__name__ = func.__name__
1320 inner.__doc__ = func.__doc__
1321 return inner
1322 return decorator
1323
1324#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +00001325# Big-memory-test support. Separate from 'resources' because memory use
1326# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001327
1328# Some handy shorthands. Note that these are used for byte-limits as well
1329# as size-limits, in the various bigmem tests
1330_1M = 1024*1024
1331_1G = 1024 * _1M
1332_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001333_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +00001334
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001335MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001336
Thomas Wouters477c8d52006-05-27 19:21:47 +00001337def set_memlimit(limit):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001338 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001339 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +00001340 sizes = {
1341 'k': 1024,
1342 'm': _1M,
1343 'g': _1G,
1344 't': 1024*_1G,
1345 }
1346 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
1347 re.IGNORECASE | re.VERBOSE)
1348 if m is None:
1349 raise ValueError('Invalid memory limit %r' % (limit,))
1350 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001351 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001352 if memlimit > MAX_Py_ssize_t:
1353 memlimit = MAX_Py_ssize_t
1354 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001355 raise ValueError('Memory limit %r too low to be useful' % (limit,))
1356 max_memuse = memlimit
1357
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001358class _MemoryWatchdog:
1359 """An object which periodically watches the process' memory consumption
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001360 and prints it out.
1361 """
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001362
1363 def __init__(self):
1364 self.procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
1365 self.started = False
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001366
1367 def start(self):
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001368 try:
Charles-François Natali55bce632012-03-24 10:06:23 +01001369 f = open(self.procfile, 'r')
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001370 except OSError as e:
1371 warnings.warn('/proc not available for stats: {}'.format(e),
1372 RuntimeWarning)
1373 sys.stderr.flush()
1374 return
Charles-François Natali55bce632012-03-24 10:06:23 +01001375
1376 watchdog_script = findfile("memory_watchdog.py")
1377 self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script],
1378 stdin=f, stderr=subprocess.DEVNULL)
1379 f.close()
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001380 self.started = True
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001381
1382 def stop(self):
Charles-François Natali55bce632012-03-24 10:06:23 +01001383 if self.started:
1384 self.mem_watchdog.terminate()
1385 self.mem_watchdog.wait()
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001386
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001387
1388def bigmemtest(size, memuse, dry_run=True):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001389 """Decorator for bigmem tests.
1390
1391 'minsize' is the minimum useful size for the test (in arbitrary,
1392 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001393 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001394
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001395 if 'dry_run' is False, it means the test doesn't support dummy runs
1396 when -M is not specified.
Thomas Wouters518b5ae2011-03-25 11:42:37 +01001397 """
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001398 def decorator(f):
1399 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00001400 size = wrapper.size
1401 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001402 if not real_max_memuse:
1403 maxsize = 5147
1404 else:
1405 maxsize = size
1406
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001407 if ((real_max_memuse or not dry_run)
1408 and real_max_memuse < maxsize * memuse):
1409 raise unittest.SkipTest(
1410 "not enough memory: %.1fG minimum needed"
1411 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001412
Charles-François Natali55bce632012-03-24 10:06:23 +01001413 if real_max_memuse and verbose:
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001414 print()
1415 print(" ... expected peak memory use: {peak:.1f}G"
1416 .format(peak=size * memuse / (1024 ** 3)))
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001417 watchdog = _MemoryWatchdog()
1418 watchdog.start()
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001419 else:
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001420 watchdog = None
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001421
1422 try:
1423 return f(self, maxsize)
1424 finally:
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001425 if watchdog:
1426 watchdog.stop()
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001427
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001428 wrapper.size = size
1429 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001430 return wrapper
1431 return decorator
1432
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001433def bigaddrspacetest(f):
1434 """Decorator for tests that fill the address space."""
1435 def wrapper(self):
1436 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou98c62bd2011-01-12 21:58:39 +00001437 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
Antoine Pitroue0d3f8a2011-01-12 21:50:44 +00001438 raise unittest.SkipTest(
1439 "not enough memory: try a 32-bit build instead")
1440 else:
1441 raise unittest.SkipTest(
1442 "not enough memory: %.1fG minimum needed"
1443 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001444 else:
1445 return f(self)
1446 return wrapper
1447
Thomas Wouters477c8d52006-05-27 19:21:47 +00001448#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +00001449# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001450
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001451class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001452 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001453 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001454 test(result)
1455 return result
1456
Benjamin Petersone549ead2009-03-28 21:42:05 +00001457def _id(obj):
1458 return obj
1459
1460def requires_resource(resource):
Antoine Pitroud20a5f62011-02-26 15:58:05 +00001461 if resource == 'gui' and not _is_gui_available():
1462 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou5bc4fa72010-10-14 15:34:31 +00001463 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +00001464 return _id
1465 else:
1466 return unittest.skip("resource {0!r} is not enabled".format(resource))
1467
1468def cpython_only(test):
1469 """
1470 Decorator for tests only applicable on CPython.
1471 """
1472 return impl_detail(cpython=True)(test)
1473
1474def impl_detail(msg=None, **guards):
1475 if check_impl_detail(**guards):
1476 return _id
1477 if msg is None:
1478 guardnames, default = _parse_guards(guards)
1479 if default:
1480 msg = "implementation detail not available on {0}"
1481 else:
1482 msg = "implementation detail specific to {0}"
1483 guardnames = sorted(guardnames.keys())
1484 msg = msg.format(' or '.join(guardnames))
1485 return unittest.skip(msg)
1486
1487def _parse_guards(guards):
1488 # Returns a tuple ({platform_name: run_me}, default_value)
1489 if not guards:
1490 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +00001491 is_true = list(guards.values())[0]
1492 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001493 return (guards, not is_true)
1494
1495# Use the following check to guard CPython's implementation-specific tests --
1496# or to run them only on the implementation(s) guarded by the arguments.
1497def check_impl_detail(**guards):
1498 """This function returns True or False depending on the host platform.
1499 Examples:
1500 if check_impl_detail(): # only on CPython (default)
1501 if check_impl_detail(jython=True): # only on Jython
1502 if check_impl_detail(cpython=False): # everywhere except on CPython
1503 """
1504 guards, default = _parse_guards(guards)
1505 return guards.get(platform.python_implementation().lower(), default)
1506
1507
Brett Cannon31f59292011-02-21 19:29:56 +00001508def no_tracing(func):
1509 """Decorator to temporarily turn off tracing for the duration of a test."""
1510 if not hasattr(sys, 'gettrace'):
1511 return func
1512 else:
1513 @functools.wraps(func)
1514 def wrapper(*args, **kwargs):
1515 original_trace = sys.gettrace()
1516 try:
1517 sys.settrace(None)
1518 return func(*args, **kwargs)
1519 finally:
1520 sys.settrace(original_trace)
1521 return wrapper
1522
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001523
Brett Cannon7a540732011-02-22 03:04:06 +00001524def refcount_test(test):
1525 """Decorator for tests which involve reference counting.
1526
1527 To start, the decorator does not run the test if is not run by CPython.
1528 After that, any trace function is unset during the test to prevent
1529 unexpected refcounts caused by the trace function.
1530
1531 """
1532 return no_tracing(cpython_only(test))
1533
1534
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001535def _filter_suite(suite, pred):
1536 """Recursively filter test cases in a suite based on a predicate."""
1537 newtests = []
1538 for test in suite._tests:
1539 if isinstance(test, unittest.TestSuite):
1540 _filter_suite(test, pred)
1541 newtests.append(test)
1542 else:
1543 if pred(test):
1544 newtests.append(test)
1545 suite._tests = newtests
1546
Guido van Rossumd8faa362007-04-27 19:54:29 +00001547def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +00001548 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001549 if verbose:
Antoine Pitrou216a3bc2011-07-23 22:33:39 +02001550 runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
1551 failfast=failfast)
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001552 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001553 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001554
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001555 result = runner.run(suite)
1556 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +00001557 if len(result.errors) == 1 and not result.failures:
1558 err = result.errors[0][1]
1559 elif len(result.failures) == 1 and not result.errors:
1560 err = result.failures[0][1]
1561 else:
R. David Murray723357e2009-10-19 18:06:17 +00001562 err = "multiple errors occurred"
1563 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +00001564 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +00001565
Barry Warsawc10d6902001-09-20 06:30:41 +00001566
Walter Dörwald21d3a322003-05-01 17:45:56 +00001567def run_unittest(*classes):
1568 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00001569 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001570 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001571 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001572 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001573 if cls in sys.modules:
1574 suite.addTest(unittest.findTestCases(sys.modules[cls]))
1575 else:
1576 raise ValueError("str arguments must be keys in sys.modules")
1577 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +00001578 suite.addTest(cls)
1579 else:
1580 suite.addTest(unittest.makeSuite(cls))
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001581 def case_pred(test):
1582 if match_tests is None:
1583 return True
1584 for name in test.id().split("."):
1585 if fnmatch.fnmatchcase(name, match_tests):
1586 return True
1587 return False
1588 _filter_suite(suite, case_pred)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001589 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001590
Serhiy Storchaka9d0add02013-01-27 19:47:45 +02001591#=======================================================================
1592# Check for the presence of docstrings.
1593
1594HAVE_DOCSTRINGS = (check_impl_detail(cpython=False) or
1595 sys.platform == 'win32' or
1596 sysconfig.get_config_var('WITH_DOC_STRINGS'))
1597
1598requires_docstrings = unittest.skipUnless(HAVE_DOCSTRINGS,
1599 "test requires docstrings")
1600
Barry Warsawc10d6902001-09-20 06:30:41 +00001601
Tim Petersa0a62222001-09-09 06:12:01 +00001602#=======================================================================
1603# doctest driver.
1604
Stefan Krah1919b7e2012-03-21 18:25:23 +01001605def run_doctest(module, verbosity=None, optionflags=0):
Tim Peters17111f32001-10-03 04:08:26 +00001606 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +00001607
1608 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001609 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +00001610 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +00001611 """
1612
1613 import doctest
1614
1615 if verbosity is None:
1616 verbosity = verbose
1617 else:
1618 verbosity = None
1619
Stefan Krah1919b7e2012-03-21 18:25:23 +01001620 f, t = doctest.testmod(module, verbose=verbosity, optionflags=optionflags)
Victor Stinnerbddc4d42011-06-29 15:52:46 +02001621 if f:
1622 raise TestFailed("%d of %d doctests failed" % (f, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001623 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001624 print('doctest (%s) ... %d tests with zero failures' %
1625 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001626 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001627
Antoine Pitrou060cee22009-11-13 16:29:04 +00001628
1629#=======================================================================
1630# Support for saving and restoring the imported modules.
1631
1632def modules_setup():
1633 return sys.modules.copy(),
1634
1635def modules_cleanup(oldmodules):
1636 # Encoders/decoders are registered permanently within the internal
1637 # codec cache. If we destroy the corresponding modules their
1638 # globals will be set to None which will trip up the cached functions.
1639 encodings = [(k, v) for k, v in sys.modules.items()
1640 if k.startswith('encodings.')]
1641 sys.modules.clear()
1642 sys.modules.update(encodings)
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001643 # XXX: This kind of problem can affect more than just encodings. In particular
Eric Smitha3e8f3d2011-01-11 10:24:34 +00001644 # extension modules (such as _ssl) don't cope with reloading properly.
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001645 # Really, test modules should be cleaning out the test specific modules they
1646 # know they added (ala test_runpy) rather than relying on this function (as
1647 # test_importhooks and test_pkg do currently).
1648 # Implicitly imported *real* modules should be left alone (see issue 10556).
Antoine Pitrou060cee22009-11-13 16:29:04 +00001649 sys.modules.update(oldmodules)
1650
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001651#=======================================================================
1652# Threading support to prevent reporting refleaks when running regrtest.py -R
1653
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001654# NOTE: we use thread._count() rather than threading.enumerate() (or the
1655# moral equivalent thereof) because a threading.Thread object is still alive
1656# until its __bootstrap() method has returned, even after it has been
1657# unregistered from the threading module.
1658# thread._count(), on the other hand, only gets decremented *after* the
1659# __bootstrap() method has returned, which gives us reliable reference counts
1660# at the end of a test run.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001661
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001662def threading_setup():
Victor Stinner45df8202010-04-28 22:31:17 +00001663 if _thread:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001664 return _thread._count(), threading._dangling.copy()
Victor Stinner45df8202010-04-28 22:31:17 +00001665 else:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001666 return 1, ()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001667
Antoine Pitrou707f2282011-07-15 22:29:44 +02001668def threading_cleanup(*original_values):
Victor Stinner45df8202010-04-28 22:31:17 +00001669 if not _thread:
1670 return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001671 _MAX_COUNT = 10
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001672 for count in range(_MAX_COUNT):
Antoine Pitrou707f2282011-07-15 22:29:44 +02001673 values = _thread._count(), threading._dangling
1674 if values == original_values:
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001675 break
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001676 time.sleep(0.1)
Antoine Pitrou707f2282011-07-15 22:29:44 +02001677 gc_collect()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001678 # XXX print a warning in case of failure?
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001679
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001680def reap_threads(func):
Victor Stinner45df8202010-04-28 22:31:17 +00001681 """Use this function when threads are being used. This will
1682 ensure that the threads are cleaned up even when the test fails.
1683 If threading is unavailable this function does nothing.
1684 """
1685 if not _thread:
1686 return func
1687
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001688 @functools.wraps(func)
1689 def decorator(*args):
1690 key = threading_setup()
1691 try:
1692 return func(*args)
1693 finally:
1694 threading_cleanup(*key)
1695 return decorator
1696
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001697def reap_children():
1698 """Use this function at the end of test_main() whenever sub-processes
1699 are started. This will help ensure that no extra children (zombies)
1700 stick around to hog resources and create problems when looking
1701 for refleaks.
1702 """
1703
1704 # Reap all our dead child processes so we don't leave zombies around.
1705 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001706 if hasattr(os, 'waitpid'):
1707 any_process = -1
1708 while True:
1709 try:
1710 # This will raise an exception on Windows. That's ok.
1711 pid, status = os.waitpid(any_process, os.WNOHANG)
1712 if pid == 0:
1713 break
1714 except:
1715 break
Collin Winterf2bf2b32010-03-17 00:41:56 +00001716
1717@contextlib.contextmanager
1718def swap_attr(obj, attr, new_val):
1719 """Temporary swap out an attribute with a new object.
1720
1721 Usage:
1722 with swap_attr(obj, "attr", 5):
1723 ...
1724
1725 This will set obj.attr to 5 for the duration of the with: block,
1726 restoring the old value at the end of the block. If `attr` doesn't
1727 exist on `obj`, it will be created and then deleted at the end of the
1728 block.
1729 """
1730 if hasattr(obj, attr):
1731 real_val = getattr(obj, attr)
1732 setattr(obj, attr, new_val)
1733 try:
1734 yield
1735 finally:
1736 setattr(obj, attr, real_val)
1737 else:
1738 setattr(obj, attr, new_val)
1739 try:
1740 yield
1741 finally:
1742 delattr(obj, attr)
1743
1744@contextlib.contextmanager
1745def swap_item(obj, item, new_val):
1746 """Temporary swap out an item with a new object.
1747
1748 Usage:
1749 with swap_item(obj, "item", 5):
1750 ...
1751
1752 This will set obj["item"] to 5 for the duration of the with: block,
1753 restoring the old value at the end of the block. If `item` doesn't
1754 exist on `obj`, it will be created and then deleted at the end of the
1755 block.
1756 """
1757 if item in obj:
1758 real_val = obj[item]
1759 obj[item] = new_val
1760 try:
1761 yield
1762 finally:
1763 obj[item] = real_val
1764 else:
1765 obj[item] = new_val
1766 try:
1767 yield
1768 finally:
1769 del obj[item]
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001770
1771def strip_python_stderr(stderr):
1772 """Strip the stderr of a Python process from potential debug output
1773 emitted by the interpreter.
1774
1775 This will typically be run on the result of the communicate() method
1776 of a subprocess.Popen object.
1777 """
Richard Oudkerk73d9a292012-06-14 15:30:10 +01001778 stderr = re.sub(br"\[\d+ refs\]\r?\n?", b"", stderr).strip()
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001779 return stderr
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +00001780
1781def args_from_interpreter_flags():
1782 """Return a list of command-line arguments reproducing the current
Brett Cannonb880c152011-03-15 16:03:09 -04001783 settings in sys.flags and sys.warnoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +02001784 return subprocess._args_from_interpreter_flags()
Vinay Sajip129fd042010-12-10 08:19:38 +00001785
1786#============================================================
1787# Support for assertions about logging.
1788#============================================================
1789
1790class TestHandler(logging.handlers.BufferingHandler):
1791 def __init__(self, matcher):
1792 # BufferingHandler takes a "capacity" argument
1793 # so as to know when to flush. As we're overriding
1794 # shouldFlush anyway, we can set a capacity of zero.
1795 # You can call flush() manually to clear out the
1796 # buffer.
1797 logging.handlers.BufferingHandler.__init__(self, 0)
1798 self.matcher = matcher
1799
1800 def shouldFlush(self):
1801 return False
1802
1803 def emit(self, record):
1804 self.format(record)
1805 self.buffer.append(record.__dict__)
1806
1807 def matches(self, **kwargs):
1808 """
1809 Look for a saved dict whose keys/values match the supplied arguments.
1810 """
1811 result = False
1812 for d in self.buffer:
1813 if self.matcher.matches(d, **kwargs):
1814 result = True
1815 break
1816 return result
1817
1818class Matcher(object):
1819
1820 _partial_matches = ('msg', 'message')
1821
1822 def matches(self, d, **kwargs):
1823 """
1824 Try to match a single dict with the supplied arguments.
1825
1826 Keys whose values are strings and which are in self._partial_matches
1827 will be checked for partial (i.e. substring) matches. You can extend
1828 this scheme to (for example) do regular expression matching, etc.
1829 """
1830 result = True
1831 for k in kwargs:
1832 v = kwargs[k]
1833 dv = d.get(k)
1834 if not self.match_value(k, dv, v):
1835 result = False
1836 break
1837 return result
1838
1839 def match_value(self, k, dv, v):
1840 """
1841 Try to match a single stored value (dv) with a supplied value (v).
1842 """
1843 if type(v) != type(dv):
1844 result = False
1845 elif type(dv) is not str or k not in self._partial_matches:
1846 result = (v == dv)
1847 else:
1848 result = dv.find(v) >= 0
1849 return result
Brian Curtin3b4499c2010-12-28 14:31:47 +00001850
1851
1852_can_symlink = None
1853def can_symlink():
1854 global _can_symlink
1855 if _can_symlink is not None:
1856 return _can_symlink
Brett Cannonee877a02011-03-15 17:32:14 -04001857 symlink_path = TESTFN + "can_symlink"
Brian Curtin3b4499c2010-12-28 14:31:47 +00001858 try:
Brett Cannonee877a02011-03-15 17:32:14 -04001859 os.symlink(TESTFN, symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001860 can = True
Brian Curtind25aef52011-06-13 15:16:04 -05001861 except (OSError, NotImplementedError, AttributeError):
Brian Curtin3b4499c2010-12-28 14:31:47 +00001862 can = False
Victor Stinner62ec61f2011-06-07 12:17:15 +02001863 else:
1864 os.remove(symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001865 _can_symlink = can
1866 return can
1867
1868def skip_unless_symlink(test):
1869 """Skip decorator for tests that require functional symlink"""
1870 ok = can_symlink()
1871 msg = "Requires functional symlink implementation"
1872 return test if ok else unittest.skip(msg)(test)
Antoine Pitroue8706232011-03-15 21:05:36 +01001873
Antoine Pitrou424246f2012-05-12 19:02:01 +02001874_can_xattr = None
1875def can_xattr():
1876 global _can_xattr
1877 if _can_xattr is not None:
1878 return _can_xattr
1879 if not hasattr(os, "setxattr"):
1880 can = False
1881 else:
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001882 tmp_fp, tmp_name = tempfile.mkstemp()
Antoine Pitrou424246f2012-05-12 19:02:01 +02001883 try:
1884 with open(TESTFN, "wb") as fp:
1885 try:
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001886 # TESTFN & tempfile may use different file systems with
1887 # different capabilities
Larry Hastings9cf065c2012-06-22 16:30:09 -07001888 os.setxattr(tmp_fp, b"user.test", b"")
1889 os.setxattr(fp.fileno(), b"user.test", b"")
Antoine Pitrou424246f2012-05-12 19:02:01 +02001890 # Kernels < 2.6.39 don't respect setxattr flags.
1891 kernel_version = platform.release()
1892 m = re.match("2.6.(\d{1,2})", kernel_version)
1893 can = m is None or int(m.group(1)) >= 39
1894 except OSError:
1895 can = False
1896 finally:
1897 unlink(TESTFN)
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001898 unlink(tmp_name)
Antoine Pitrou424246f2012-05-12 19:02:01 +02001899 _can_xattr = can
1900 return can
1901
1902def skip_unless_xattr(test):
1903 """Skip decorator for tests that require functional extended attributes"""
1904 ok = can_xattr()
1905 msg = "no non-broken extended attribute support"
1906 return test if ok else unittest.skip(msg)(test)
1907
Ezio Melotti25a40452013-03-05 20:26:17 +02001908
1909if sys.platform.startswith('win'):
1910 @contextlib.contextmanager
1911 def suppress_crash_popup():
1912 """Disable Windows Error Reporting dialogs using SetErrorMode."""
1913 # see http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx
Ezio Melottie8463422013-03-07 18:37:13 +02001914 # GetErrorMode is not available on Windows XP and Windows Server 2003,
1915 # but SetErrorMode returns the previous value, so we can use that
Ezio Melotti25a40452013-03-05 20:26:17 +02001916 import ctypes
1917 k32 = ctypes.windll.kernel32
Ezio Melotti25a40452013-03-05 20:26:17 +02001918 SEM_NOGPFAULTERRORBOX = 0x02
Ezio Melottie8463422013-03-07 18:37:13 +02001919 old_error_mode = k32.SetErrorMode(SEM_NOGPFAULTERRORBOX)
Ezio Melotti25a40452013-03-05 20:26:17 +02001920 k32.SetErrorMode(old_error_mode | SEM_NOGPFAULTERRORBOX)
1921 try:
1922 yield
1923 finally:
1924 k32.SetErrorMode(old_error_mode)
1925else:
1926 # this is a no-op for other platforms
1927 @contextlib.contextmanager
1928 def suppress_crash_popup():
1929 yield
1930
1931
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001932def patch(test_instance, object_to_patch, attr_name, new_value):
1933 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1934
1935 Also, add a cleanup procedure to 'test_instance' to restore
1936 'object_to_patch' value for 'attr_name'.
1937 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1938
1939 """
1940 # check that 'attr_name' is a real attribute for 'object_to_patch'
1941 # will raise AttributeError if it does not exist
1942 getattr(object_to_patch, attr_name)
1943
1944 # keep a copy of the old value
1945 attr_is_local = False
1946 try:
1947 old_value = object_to_patch.__dict__[attr_name]
1948 except (AttributeError, KeyError):
1949 old_value = getattr(object_to_patch, attr_name, None)
1950 else:
1951 attr_is_local = True
1952
1953 # restore the value when the test is done
1954 def cleanup():
1955 if attr_is_local:
1956 setattr(object_to_patch, attr_name, old_value)
1957 else:
1958 delattr(object_to_patch, attr_name)
1959
1960 test_instance.addCleanup(cleanup)
1961
1962 # actually override the attribute
1963 setattr(object_to_patch, attr_name, new_value)