blob: 6749a5115e09fbd916c989483f86578329230d41 [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
Benjamin Peterson65c66ab2010-10-29 21:31:35 +000028
Victor Stinner45df8202010-04-28 22:31:17 +000029try:
Antoine Pitrou707f2282011-07-15 22:29:44 +020030 import _thread, threading
Victor Stinner45df8202010-04-28 22:31:17 +000031except ImportError:
32 _thread = None
Antoine Pitrou707f2282011-07-15 22:29:44 +020033 threading = None
34try:
35 import multiprocessing.process
36except ImportError:
37 multiprocessing = None
38
Antoine Pitrou75e78b62011-10-04 11:51:23 +020039try:
Ezio Melotticad648c2011-05-19 21:25:10 +030040 import zlib
41except ImportError:
42 zlib = None
43
Martin v. Löwisf6b16a42012-05-01 07:58:44 +020044try:
45 import bz2
46except ImportError:
47 bz2 = None
48
Martin v. Löwis7fb79fc2012-05-13 10:06:36 +020049try:
50 import lzma
51except ImportError:
52 lzma = None
53
Barry Warsaw28a691b2010-04-17 00:19:56 +000054__all__ = [
Hynek Schlawacke02ba102012-05-23 11:22:44 +020055 "Error", "TestFailed", "ResourceDenied", "import_module", "verbose",
56 "use_resources", "max_memuse", "record_original_stdout",
Barry Warsaw28a691b2010-04-17 00:19:56 +000057 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
Charles-François Natali87b3c922011-10-03 19:40:37 +020058 "is_resource_enabled", "requires", "requires_freebsd_version",
Hynek Schlawacke02ba102012-05-23 11:22:44 +020059 "requires_linux_version", "requires_mac_ver", "find_unused_port",
60 "bind_port", "IPV6_ENABLED", "is_jython", "TESTFN", "HOST", "SAVEDCWD",
61 "temp_cwd", "findfile", "create_empty_file", "sortdict",
62 "check_syntax_error", "open_urlresource", "check_warnings", "CleanImport",
63 "EnvironmentVarGuard", "TransientResource", "captured_stdout",
64 "captured_stdin", "captured_stderr", "time_out", "socket_peer_reset",
65 "ioerror_peer_reset", "run_with_locale", 'temp_umask',
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +020066 "transient_internet", "set_memlimit", "bigmemtest", "bigaddrspacetest",
67 "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup",
68 "threading_cleanup", "reap_children", "cpython_only", "check_impl_detail",
69 "get_attribute", "swap_item", "swap_attr", "requires_IEEE_754",
Benjamin Peterson31dc3732011-05-08 15:34:24 -050070 "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
Hynek Schlawacke02ba102012-05-23 11:22:44 +020071 "skip_unless_xattr", "import_fresh_module", "requires_zlib",
72 "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz",
73 "requires_bz2", "requires_lzma"
Antoine Pitrou4d7979b2010-09-07 21:22:56 +000074 ]
Florent Xiclunaf089fd62010-03-19 14:25:03 +000075
Fred Drake1790dd42000-07-24 06:55:00 +000076class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000077 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000078
79class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000080 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000081
Benjamin Petersone549ead2009-03-28 21:42:05 +000082class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000083 """Test skipped because it requested a disallowed resource.
84
85 This is raised when a test calls requires() for a resource that
86 has not be enabled. It is used to distinguish between expected
87 and unexpected skips.
88 """
89
Nick Coghlanfce769e2009-04-11 14:30:59 +000090@contextlib.contextmanager
91def _ignore_deprecated_imports(ignore=True):
92 """Context manager to suppress package and module deprecation
93 warnings when importing them.
94
95 If ignore is False, this context manager has no effect."""
96 if ignore:
97 with warnings.catch_warnings():
98 warnings.filterwarnings("ignore", ".+ (module|package)",
99 DeprecationWarning)
100 yield
101 else:
102 yield
103
104
Benjamin Peterson699adb92008-05-08 22:27:58 +0000105def import_module(name, deprecated=False):
R. David Murraya21e4ca2009-03-31 23:16:50 +0000106 """Import and return the module to be tested, raising SkipTest if
107 it is not available.
108
109 If deprecated is True, any module or package deprecation messages
110 will be suppressed."""
Nick Coghlanfce769e2009-04-11 14:30:59 +0000111 with _ignore_deprecated_imports(deprecated):
Benjamin Peterson699adb92008-05-08 22:27:58 +0000112 try:
Nick Coghlanfce769e2009-04-11 14:30:59 +0000113 return importlib.import_module(name)
R. David Murraya21e4ca2009-03-31 23:16:50 +0000114 except ImportError as msg:
115 raise unittest.SkipTest(str(msg))
Nick Coghlanfce769e2009-04-11 14:30:59 +0000116
117
Nick Coghlan47384702009-04-22 16:13:36 +0000118def _save_and_remove_module(name, orig_modules):
119 """Helper function to save and remove a module from sys.modules
120
Ezio Melotti199e0852011-05-09 06:41:55 +0300121 Raise ImportError if the module can't be imported."""
Ezio Melottifec3ad12011-05-14 06:02:25 +0300122 # try to import the module and raise an error if it can't be imported
123 if name not in sys.modules:
Ezio Melotti199e0852011-05-09 06:41:55 +0300124 __import__(name)
Nick Coghlan47384702009-04-22 16:13:36 +0000125 del sys.modules[name]
Ezio Melottifec3ad12011-05-14 06:02:25 +0300126 for modname in list(sys.modules):
127 if modname == name or modname.startswith(name + '.'):
128 orig_modules[modname] = sys.modules[modname]
129 del sys.modules[modname]
Nick Coghlan47384702009-04-22 16:13:36 +0000130
131def _save_and_block_module(name, orig_modules):
132 """Helper function to save and block a module in sys.modules
133
Ezio Melotti199e0852011-05-09 06:41:55 +0300134 Return True if the module was in sys.modules, False otherwise."""
Nick Coghlan47384702009-04-22 16:13:36 +0000135 saved = True
136 try:
137 orig_modules[name] = sys.modules[name]
138 except KeyError:
139 saved = False
Alexander Belopolsky903396e2010-07-13 14:50:16 +0000140 sys.modules[name] = None
Nick Coghlan47384702009-04-22 16:13:36 +0000141 return saved
142
143
Nick Coghlan2496f332011-09-19 20:26:31 +1000144def anticipate_failure(condition):
145 """Decorator to mark a test that is known to be broken in some cases
146
147 Any use of this decorator should have a comment identifying the
148 associated tracker issue.
149 """
150 if condition:
151 return unittest.expectedFailure
152 return lambda f: f
153
154
Nick Coghlan47384702009-04-22 16:13:36 +0000155def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000156 """Imports and returns a module, deliberately bypassing the sys.modules cache
157 and importing a fresh copy of the module. Once the import is complete,
158 the sys.modules cache is restored to its original state.
159
Nick Coghlan47384702009-04-22 16:13:36 +0000160 Modules named in fresh are also imported anew if needed by the import.
Ezio Melotti199e0852011-05-09 06:41:55 +0300161 If one of these modules can't be imported, None is returned.
Nick Coghlan47384702009-04-22 16:13:36 +0000162
163 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000164 takes place.
165
166 If deprecated is True, any module or package deprecation messages
167 will be suppressed."""
Ezio Melotti6b60fb92011-05-14 06:47:51 +0300168 # NOTE: test_heapq, test_json and test_warnings include extra sanity checks
169 # to make sure that this utility function is working as expected
Nick Coghlanfce769e2009-04-11 14:30:59 +0000170 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000171 # Keep track of modules saved for later restoration as well
172 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000173 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000174 names_to_remove = []
175 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000176 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000177 for fresh_name in fresh:
178 _save_and_remove_module(fresh_name, orig_modules)
179 for blocked_name in blocked:
180 if not _save_and_block_module(blocked_name, orig_modules):
181 names_to_remove.append(blocked_name)
182 fresh_module = importlib.import_module(name)
Ezio Melotti199e0852011-05-09 06:41:55 +0300183 except ImportError:
184 fresh_module = None
Nick Coghlanfce769e2009-04-11 14:30:59 +0000185 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000186 for orig_name, module in orig_modules.items():
187 sys.modules[orig_name] = module
188 for name_to_remove in names_to_remove:
189 del sys.modules[name_to_remove]
190 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000191
Benjamin Peterson699adb92008-05-08 22:27:58 +0000192
R. David Murraya21e4ca2009-03-31 23:16:50 +0000193def get_attribute(obj, name):
194 """Get an attribute, raising SkipTest if AttributeError is raised."""
195 try:
196 attribute = getattr(obj, name)
197 except AttributeError:
Éric Araujo4300f692011-10-05 01:50:22 +0200198 raise unittest.SkipTest("object %r has no attribute %r" % (obj, name))
R. David Murraya21e4ca2009-03-31 23:16:50 +0000199 else:
200 return attribute
201
Barry Warsawc0fb6052001-08-20 22:29:23 +0000202verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000203use_resources = None # Flag set to [] by regrtest.py
204max_memuse = 0 # Disable bigmem tests (they will still be run with
205 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000206real_max_memuse = 0
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200207failfast = False
Antoine Pitroub9c73e82011-07-29 23:53:38 +0200208match_tests = None
Guido van Rossum531661c1996-12-20 02:58:22 +0000209
Tim Peters8dee8092001-09-25 20:05:11 +0000210# _original_stdout is meant to hold stdout at the time regrtest began.
211# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
212# The point is to have some flavor of stdout the user can actually see.
213_original_stdout = None
214def record_original_stdout(stdout):
215 global _original_stdout
216 _original_stdout = stdout
217
218def get_original_stdout():
219 return _original_stdout or sys.stdout
220
Guido van Rossum3bead091992-01-27 17:00:37 +0000221def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000222 try:
223 del sys.modules[name]
224 except KeyError:
225 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000226
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000227def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000228 try:
229 os.unlink(filename)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000230 except OSError as error:
231 # The filename need not exist.
Michael Foord2d9c2d52010-05-04 22:29:10 +0000232 if error.errno not in (errno.ENOENT, errno.ENOTDIR):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000233 raise
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000234
Christian Heimes23daade02008-02-25 12:39:23 +0000235def rmtree(path):
236 try:
237 shutil.rmtree(path)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000238 except OSError as error:
Antoine Pitrou7a18d212011-08-30 18:34:47 +0200239 if error.errno != errno.ENOENT:
Christian Heimes23daade02008-02-25 12:39:23 +0000240 raise
241
Barry Warsaw28a691b2010-04-17 00:19:56 +0000242def make_legacy_pyc(source):
243 """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
244
245 The choice of .pyc or .pyo extension is done based on the __debug__ flag
246 value.
247
248 :param source: The file system path to the source file. The source file
249 does not need to exist, however the PEP 3147 pyc file must exist.
250 :return: The file system path to the legacy pyc file.
251 """
252 pyc_file = imp.cache_from_source(source)
253 up_one = os.path.dirname(os.path.abspath(source))
254 legacy_pyc = os.path.join(up_one, source + ('c' if __debug__ else 'o'))
255 os.rename(pyc_file, legacy_pyc)
256 return legacy_pyc
257
Guido van Rossum3bead091992-01-27 17:00:37 +0000258def forget(modname):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000259 """'Forget' a module was ever imported.
260
261 This removes the module from sys.modules and deletes any PEP 3147 or
262 legacy .pyc and .pyo files.
263 """
Fred Drake004d5e62000-10-23 17:22:08 +0000264 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000265 for dirname in sys.path:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000266 source = os.path.join(dirname, modname + '.py')
267 # It doesn't matter if they exist or not, unlink all possible
268 # combinations of PEP 3147 and legacy pyc and pyo files.
269 unlink(source + 'c')
270 unlink(source + 'o')
271 unlink(imp.cache_from_source(source, debug_override=True))
272 unlink(imp.cache_from_source(source, debug_override=False))
Guido van Rossum3bead091992-01-27 17:00:37 +0000273
Antoine Pitroud20a5f62011-02-26 15:58:05 +0000274# On some platforms, should not run gui test even if it is allowed
275# in `use_resources'.
276if sys.platform.startswith('win'):
277 import ctypes
278 import ctypes.wintypes
279 def _is_gui_available():
280 UOI_FLAGS = 1
281 WSF_VISIBLE = 0x0001
282 class USEROBJECTFLAGS(ctypes.Structure):
283 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
284 ("fReserved", ctypes.wintypes.BOOL),
285 ("dwFlags", ctypes.wintypes.DWORD)]
286 dll = ctypes.windll.user32
287 h = dll.GetProcessWindowStation()
288 if not h:
289 raise ctypes.WinError()
290 uof = USEROBJECTFLAGS()
291 needed = ctypes.wintypes.DWORD()
292 res = dll.GetUserObjectInformationW(h,
293 UOI_FLAGS,
294 ctypes.byref(uof),
295 ctypes.sizeof(uof),
296 ctypes.byref(needed))
297 if not res:
298 raise ctypes.WinError()
299 return bool(uof.dwFlags & WSF_VISIBLE)
300else:
301 def _is_gui_available():
302 return True
303
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000304def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000305 """Test whether a resource is enabled. Known resources are set by
306 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000307 return use_resources is not None and resource in use_resources
308
Barry Warsawc0fb6052001-08-20 22:29:23 +0000309def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000310 """Raise ResourceDenied if the specified resource is not available.
311
312 If the caller's module is __main__ then automatically return True. The
Barry Warsaw28a691b2010-04-17 00:19:56 +0000313 possibility of False being returned occurs when regrtest.py is
314 executing.
315 """
Antoine Pitroud20a5f62011-02-26 15:58:05 +0000316 if resource == 'gui' and not _is_gui_available():
317 raise unittest.SkipTest("Cannot use the 'gui' resource")
Skip Montanarod839ecd2003-04-24 19:06:57 +0000318 # see if the caller's module is __main__ - if so, treat as if
319 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000320 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000321 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000322 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000323 if msg is None:
Éric Araujoaf5bacf2011-07-15 17:50:15 +0200324 msg = "Use of the %r resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000325 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000326
Charles-François Natali87b3c922011-10-03 19:40:37 +0200327def _requires_unix_version(sysname, min_version):
328 """Decorator raising SkipTest if the OS is `sysname` and the version is less
329 than `min_version`.
Charles-François Natali239bb962011-06-03 12:55:15 +0200330
Charles-François Natali87b3c922011-10-03 19:40:37 +0200331 For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if
332 the FreeBSD version is less than 7.2.
Charles-François Natali239bb962011-06-03 12:55:15 +0200333 """
334 def decorator(func):
335 @functools.wraps(func)
336 def wrapper(*args, **kw):
Charles-François Natali87b3c922011-10-03 19:40:37 +0200337 if platform.system() == sysname:
Charles-François Natali239bb962011-06-03 12:55:15 +0200338 version_txt = platform.release().split('-', 1)[0]
339 try:
340 version = tuple(map(int, version_txt.split('.')))
341 except ValueError:
342 pass
343 else:
344 if version < min_version:
345 min_version_txt = '.'.join(map(str, min_version))
346 raise unittest.SkipTest(
Charles-François Natali87b3c922011-10-03 19:40:37 +0200347 "%s version %s or higher required, not %s"
348 % (sysname, min_version_txt, version_txt))
Charles-François Natali239bb962011-06-03 12:55:15 +0200349 return wrapper
350 return decorator
Victor Stinnerfea0f4d2011-05-24 00:24:19 +0200351
Charles-François Natali87b3c922011-10-03 19:40:37 +0200352def requires_freebsd_version(*min_version):
353 """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version is
354 less than `min_version`.
355
356 For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD
357 version is less than 7.2.
358 """
359 return _requires_unix_version('FreeBSD', min_version)
360
361def requires_linux_version(*min_version):
362 """Decorator raising SkipTest if the OS is Linux and the Linux version is
363 less than `min_version`.
364
365 For example, @requires_linux_version(2, 6, 32) raises SkipTest if the Linux
366 version is less than 2.6.32.
367 """
368 return _requires_unix_version('Linux', min_version)
369
Victor Stinnerfce92332011-06-01 12:28:04 +0200370def requires_mac_ver(*min_version):
Victor Stinner88701e22011-06-01 13:13:04 +0200371 """Decorator raising SkipTest if the OS is Mac OS X and the OS X
372 version if less than min_version.
Victor Stinnerfce92332011-06-01 12:28:04 +0200373
Victor Stinner88701e22011-06-01 13:13:04 +0200374 For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
375 is lesser than 10.5.
Victor Stinnerfce92332011-06-01 12:28:04 +0200376 """
Victor Stinner88701e22011-06-01 13:13:04 +0200377 def decorator(func):
378 @functools.wraps(func)
379 def wrapper(*args, **kw):
380 if sys.platform == 'darwin':
381 version_txt = platform.mac_ver()[0]
382 try:
383 version = tuple(map(int, version_txt.split('.')))
384 except ValueError:
385 pass
386 else:
387 if version < min_version:
388 min_version_txt = '.'.join(map(str, min_version))
389 raise unittest.SkipTest(
390 "Mac OS X %s or higher required, not %s"
391 % (min_version_txt, version_txt))
392 return func(*args, **kw)
393 wrapper.min_version = min_version
394 return wrapper
395 return decorator
396
Victor Stinnerfce92332011-06-01 12:28:04 +0200397
Christian Heimes5e696852008-04-09 08:37:03 +0000398HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000399
Christian Heimes5e696852008-04-09 08:37:03 +0000400def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
401 """Returns an unused port that should be suitable for binding. This is
402 achieved by creating a temporary socket with the same family and type as
403 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
404 the specified host address (defaults to 0.0.0.0) with the port set to 0,
405 eliciting an unused ephemeral port from the OS. The temporary socket is
406 then closed and deleted, and the ephemeral port is returned.
407
408 Either this method or bind_port() should be used for any tests where a
409 server socket needs to be bound to a particular port for the duration of
410 the test. Which one to use depends on whether the calling code is creating
411 a python socket, or if an unused port needs to be provided in a constructor
412 or passed to an external program (i.e. the -accept argument to openssl's
413 s_server mode). Always prefer bind_port() over find_unused_port() where
414 possible. Hard coded ports should *NEVER* be used. As soon as a server
415 socket is bound to a hard coded port, the ability to run multiple instances
416 of the test simultaneously on the same host is compromised, which makes the
417 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
418 may simply manifest as a failed test, which can be recovered from without
419 intervention in most cases, but on Windows, the entire python process can
420 completely and utterly wedge, requiring someone to log in to the buildbot
421 and manually kill the affected process.
422
423 (This is easy to reproduce on Windows, unfortunately, and can be traced to
424 the SO_REUSEADDR socket option having different semantics on Windows versus
425 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
426 listen and then accept connections on identical host/ports. An EADDRINUSE
427 socket.error will be raised at some point (depending on the platform and
428 the order bind and listen were called on each socket).
429
430 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
431 will ever be raised when attempting to bind two identical host/ports. When
432 accept() is called on each socket, the second caller's process will steal
433 the port from the first caller, leaving them both in an awkwardly wedged
434 state where they'll no longer respond to any signals or graceful kills, and
435 must be forcibly killed via OpenProcess()/TerminateProcess().
436
437 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
438 instead of SO_REUSEADDR, which effectively affords the same semantics as
439 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
440 Source world compared to Windows ones, this is a common mistake. A quick
441 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
442 openssl.exe is called with the 's_server' option, for example. See
443 http://bugs.python.org/issue2550 for more info. The following site also
444 has a very thorough description about the implications of both REUSEADDR
445 and EXCLUSIVEADDRUSE on Windows:
446 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
447
448 XXX: although this approach is a vast improvement on previous attempts to
449 elicit unused ports, it rests heavily on the assumption that the ephemeral
450 port returned to us by the OS won't immediately be dished back out to some
451 other process when we close and delete our temporary socket but before our
452 calling code has a chance to bind the returned port. We can deal with this
453 issue if/when we come across it.
454 """
455
456 tempsock = socket.socket(family, socktype)
457 port = bind_port(tempsock)
458 tempsock.close()
459 del tempsock
460 return port
461
462def bind_port(sock, host=HOST):
463 """Bind the socket to a free port and return the port number. Relies on
464 ephemeral ports in order to ensure we are using an unbound port. This is
465 important as many tests may be running simultaneously, especially in a
466 buildbot environment. This method raises an exception if the sock.family
467 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
468 or SO_REUSEPORT set on it. Tests should *never* set these socket options
469 for TCP/IP sockets. The only case for setting these options is testing
470 multicasting via multiple UDP sockets.
471
472 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
473 on Windows), it will be set on the socket. This will prevent anyone else
474 from bind()'ing to our host/port for the duration of the test.
475 """
476
477 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
478 if hasattr(socket, 'SO_REUSEADDR'):
479 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
480 raise TestFailed("tests should never set the SO_REUSEADDR " \
481 "socket option on TCP/IP sockets!")
482 if hasattr(socket, 'SO_REUSEPORT'):
483 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
484 raise TestFailed("tests should never set the SO_REUSEPORT " \
485 "socket option on TCP/IP sockets!")
486 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
487 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
488
489 sock.bind((host, 0))
490 port = sock.getsockname()[1]
491 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000492
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200493def _is_ipv6_enabled():
494 """Check whether IPv6 is enabled on this host."""
495 if socket.has_ipv6:
496 try:
497 sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
498 sock.bind(('::1', 0))
499 except (socket.error, socket.gaierror):
500 pass
501 else:
502 sock.close()
503 return True
504 return False
505
506IPV6_ENABLED = _is_ipv6_enabled()
507
Charles-François Natali2d517212011-05-29 16:36:44 +0200508
509# A constant likely larger than the underlying OS pipe buffer size.
510# Windows limit seems to be around 512B, and most Unix kernels have a 64K pipe
511# buffer size: take 1M to be sure.
512PIPE_MAX_SIZE = 1024 * 1024
513
514
Eric Smithf24a0d92010-12-04 13:32:18 +0000515# decorator for skipping tests on non-IEEE 754 platforms
516requires_IEEE_754 = unittest.skipUnless(
517 float.__getformat__("double").startswith("IEEE"),
518 "test requires IEEE 754 doubles")
519
Ezio Melotticad648c2011-05-19 21:25:10 +0300520requires_zlib = unittest.skipUnless(zlib, 'requires zlib')
521
Martin v. Löwisf6b16a42012-05-01 07:58:44 +0200522requires_bz2 = unittest.skipUnless(bz2, 'requires bz2')
523
Martin v. Löwis7fb79fc2012-05-13 10:06:36 +0200524requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
525
Finn Bock57bc5fa2002-11-01 18:02:03 +0000526is_jython = sys.platform.startswith('java')
527
Barry Warsaw559f6682001-03-23 18:04:02 +0000528# Filename used for testing
529if os.name == 'java':
530 # Jython disallows @ in module names
531 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000532else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000533 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000534
Antoine Pitrou88909542009-06-29 13:54:42 +0000535# Disambiguate TESTFN for parallel testing, while letting it remain a valid
536# module name.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000537TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
Antoine Pitrou88909542009-06-29 13:54:42 +0000538
Michael Foord2d9c2d52010-05-04 22:29:10 +0000539
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000540# TESTFN_UNICODE is a non-ascii filename
541TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
Victor Stinner74a833f2010-08-18 21:06:23 +0000542if sys.platform == 'darwin':
543 # In Mac OS X's VFS API file names are, by definition, canonically
544 # decomposed Unicode, encoded using UTF-8. See QA1173:
545 # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
546 import unicodedata
547 TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
Antoine Pitrou88909542009-06-29 13:54:42 +0000548TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000549
Victor Stinner09c449c2010-08-13 22:23:24 +0000550# TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000551# encoded by the filesystem encoding (in strict mode). It can be None if we
552# cannot generate such filename.
Victor Stinnera0241c82010-08-15 19:28:21 +0000553TESTFN_UNENCODABLE = None
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000554if os.name in ('nt', 'ce'):
Victor Stinnera0241c82010-08-15 19:28:21 +0000555 # skip win32s (0) or Windows 9x/ME (1)
556 if sys.getwindowsversion().platform >= 2:
Victor Stinner8ce7df62010-09-10 11:19:59 +0000557 # Different kinds of characters from various languages to minimize the
558 # probability that the whole name is encodable to MBCS (issue #9819)
559 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000560 try:
Victor Stinner09c449c2010-08-13 22:23:24 +0000561 TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000562 except UnicodeEncodeError:
563 pass
564 else:
565 print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
566 'Unicode filename tests may not be effective'
Victor Stinner09c449c2010-08-13 22:23:24 +0000567 % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
568 TESTFN_UNENCODABLE = None
Victor Stinnera0241c82010-08-15 19:28:21 +0000569# Mac OS X denies unencodable filenames (invalid utf-8)
Victor Stinner03c9e1d2010-08-14 17:35:20 +0000570elif sys.platform != 'darwin':
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000571 try:
572 # ascii and utf-8 cannot encode the byte 0xff
573 b'\xff'.decode(TESTFN_ENCODING)
574 except UnicodeDecodeError:
575 # 0xff will be encoded using the surrogate character u+DCFF
Victor Stinner09c449c2010-08-13 22:23:24 +0000576 TESTFN_UNENCODABLE = TESTFN \
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000577 + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
578 else:
579 # File system encoding (eg. ISO-8859-* encodings) can encode
580 # the byte 0xff. Skip some unicode filename tests.
Victor Stinnera0241c82010-08-15 19:28:21 +0000581 pass
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000582
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000583# Save the initial cwd
584SAVEDCWD = os.getcwd()
585
586@contextlib.contextmanager
Nick Coghland26c18a2010-08-17 13:06:11 +0000587def temp_cwd(name='tempcwd', quiet=False, path=None):
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000588 """
Nick Coghland26c18a2010-08-17 13:06:11 +0000589 Context manager that temporarily changes the CWD.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000590
Nick Coghland26c18a2010-08-17 13:06:11 +0000591 An existing path may be provided as *path*, in which case this
592 function makes no changes to the file system.
593
594 Otherwise, the new CWD is created in the current directory and it's
595 named *name*. If *quiet* is False (default) and it's not possible to
596 create or change the CWD, an error is raised. If it's True, only a
597 warning is raised and the original CWD is used.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000598 """
599 saved_dir = os.getcwd()
600 is_temporary = False
Nick Coghland26c18a2010-08-17 13:06:11 +0000601 if path is None:
602 path = name
603 try:
604 os.mkdir(name)
605 is_temporary = True
606 except OSError:
607 if not quiet:
608 raise
609 warnings.warn('tests may fail, unable to create temp CWD ' + name,
610 RuntimeWarning, stacklevel=3)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000611 try:
Nick Coghland26c18a2010-08-17 13:06:11 +0000612 os.chdir(path)
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000613 except OSError:
614 if not quiet:
615 raise
616 warnings.warn('tests may fail, unable to change the CWD to ' + name,
617 RuntimeWarning, stacklevel=3)
618 try:
619 yield os.getcwd()
620 finally:
621 os.chdir(saved_dir)
622 if is_temporary:
623 rmtree(name)
624
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000625
Eli Bendersky6c519992011-07-23 08:48:53 +0300626if hasattr(os, "umask"):
627 @contextlib.contextmanager
628 def temp_umask(umask):
629 """Context manager that temporarily sets the process umask."""
630 oldmask = os.umask(umask)
631 try:
632 yield
633 finally:
634 os.umask(oldmask)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000635
636
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000637def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000638 """Try to find a file on sys.path and the working directory. If it is not
639 found the argument passed to the function is returned (this does not
640 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000641 if os.path.isabs(file):
642 return file
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000643 if subdir is not None:
644 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000645 path = sys.path
646 path = [os.path.dirname(here)] + path
647 for dn in path:
648 fn = os.path.join(dn, file)
649 if os.path.exists(fn): return fn
650 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000651
Victor Stinnerbf816222011-06-30 23:25:47 +0200652def create_empty_file(filename):
653 """Create an empty file. If the file already exists, truncate it."""
654 fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
655 os.close(fd)
656
Tim Peters2f228e72001-05-13 00:19:31 +0000657def sortdict(dict):
658 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000659 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000660 reprpairs = ["%r: %r" % pair for pair in items]
661 withcommas = ", ".join(reprpairs)
662 return "{%s}" % withcommas
663
Benjamin Peterson7522c742009-01-19 21:00:09 +0000664def make_bad_fd():
665 """
666 Create an invalid file descriptor by opening and closing a file and return
667 its fd.
668 """
669 file = open(TESTFN, "wb")
670 try:
671 return file.fileno()
672 finally:
673 file.close()
674 unlink(TESTFN)
675
Thomas Wouters89f507f2006-12-13 04:49:30 +0000676def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000677 testcase.assertRaises(SyntaxError, compile, statement,
678 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000679
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000680def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000681 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000682
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000683 check = kw.pop('check', None)
684
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000685 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000686
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000687 fn = os.path.join(os.path.dirname(__file__), "data", filename)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000688
689 def check_valid_file(fn):
690 f = open(fn, *args, **kw)
691 if check is None:
692 return f
693 elif check(f):
694 f.seek(0)
695 return f
696 f.close()
697
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000698 if os.path.exists(fn):
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000699 f = check_valid_file(fn)
700 if f is not None:
701 return f
702 unlink(fn)
703
704 # Verify the requirement before downloading the file
705 requires('urlfetch')
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000706
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000707 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitroufd0680b2009-11-01 22:13:48 +0000708 f = urllib.request.urlopen(url, timeout=15)
709 try:
710 with open(fn, "wb") as out:
711 s = f.read()
712 while s:
713 out.write(s)
714 s = f.read()
715 finally:
716 f.close()
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000717
718 f = check_valid_file(fn)
719 if f is not None:
720 return f
Éric Araujoaf5bacf2011-07-15 17:50:15 +0200721 raise TestFailed('invalid resource %r' % fn)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000722
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000723
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000724class WarningsRecorder(object):
725 """Convenience wrapper for the warnings list returned on
726 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000727 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000728 def __init__(self, warnings_list):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000729 self._warnings = warnings_list
730 self._last = 0
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000731
732 def __getattr__(self, attr):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000733 if len(self._warnings) > self._last:
734 return getattr(self._warnings[-1], attr)
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000735 elif attr in warnings.WarningMessage._WARNING_DETAILS:
736 return None
737 raise AttributeError("%r has no attribute %r" % (self, attr))
738
Florent Xiclunab14930c2010-03-13 15:26:44 +0000739 @property
740 def warnings(self):
741 return self._warnings[self._last:]
742
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000743 def reset(self):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000744 self._last = len(self._warnings)
745
746
747def _filterwarnings(filters, quiet=False):
748 """Catch the warnings, then check if all the expected
749 warnings have been raised and re-raise unexpected warnings.
750 If 'quiet' is True, only re-raise the unexpected warnings.
751 """
752 # Clear the warning registry of the calling module
753 # in order to re-raise the warnings.
754 frame = sys._getframe(2)
755 registry = frame.f_globals.get('__warningregistry__')
756 if registry:
757 registry.clear()
758 with warnings.catch_warnings(record=True) as w:
759 # Set filter "always" to record all warnings. Because
760 # test_warnings swap the module, we need to look up in
761 # the sys.modules dictionary.
762 sys.modules['warnings'].simplefilter("always")
763 yield WarningsRecorder(w)
764 # Filter the recorded warnings
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000765 reraise = list(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000766 missing = []
767 for msg, cat in filters:
768 seen = False
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000769 for w in reraise[:]:
770 warning = w.message
Florent Xiclunab14930c2010-03-13 15:26:44 +0000771 # Filter out the matching messages
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000772 if (re.match(msg, str(warning), re.I) and
773 issubclass(warning.__class__, cat)):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000774 seen = True
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000775 reraise.remove(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000776 if not seen and not quiet:
777 # This filter caught nothing
778 missing.append((msg, cat.__name__))
779 if reraise:
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000780 raise AssertionError("unhandled warning %s" % reraise[0])
Florent Xiclunab14930c2010-03-13 15:26:44 +0000781 if missing:
782 raise AssertionError("filter (%r, %s) did not catch any warning" %
783 missing[0])
784
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000785
786@contextlib.contextmanager
Florent Xiclunab14930c2010-03-13 15:26:44 +0000787def check_warnings(*filters, **kwargs):
788 """Context manager to silence warnings.
789
790 Accept 2-tuples as positional arguments:
791 ("message regexp", WarningCategory)
792
793 Optional argument:
794 - if 'quiet' is True, it does not fail if a filter catches nothing
Florent Xicluna53b506be2010-03-18 20:00:57 +0000795 (default True without argument,
796 default False if some filters are defined)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000797
798 Without argument, it defaults to:
Florent Xicluna53b506be2010-03-18 20:00:57 +0000799 check_warnings(("", Warning), quiet=True)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000800 """
Florent Xicluna53b506be2010-03-18 20:00:57 +0000801 quiet = kwargs.get('quiet')
Florent Xiclunab14930c2010-03-13 15:26:44 +0000802 if not filters:
803 filters = (("", Warning),)
Florent Xicluna53b506be2010-03-18 20:00:57 +0000804 # Preserve backward compatibility
805 if quiet is None:
806 quiet = True
807 return _filterwarnings(filters, quiet)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000808
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000809
810class CleanImport(object):
811 """Context manager to force import to return a new module reference.
812
813 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000814 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000815
816 Use like this:
817
818 with CleanImport("foo"):
Brett Cannonddb5e702010-02-03 22:16:11 +0000819 importlib.import_module("foo") # new reference
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000820 """
821
822 def __init__(self, *module_names):
823 self.original_modules = sys.modules.copy()
824 for module_name in module_names:
825 if module_name in sys.modules:
826 module = sys.modules[module_name]
827 # It is possible that module_name is just an alias for
828 # another module (e.g. stub for modules renamed in 3.x).
829 # In that case, we also need delete the real module to clear
830 # the import cache.
831 if module.__name__ != module_name:
832 del sys.modules[module.__name__]
833 del sys.modules[module_name]
834
835 def __enter__(self):
836 return self
837
838 def __exit__(self, *ignore_exc):
839 sys.modules.update(self.original_modules)
840
841
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000842class EnvironmentVarGuard(collections.abc.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000843
844 """Class to help protect the environment variable properly. Can be used as
845 a context manager."""
846
847 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000848 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000849 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000850
Walter Dörwald155374d2009-05-01 19:58:58 +0000851 def __getitem__(self, envvar):
852 return self._environ[envvar]
853
854 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000855 # Remember the initial value on the first access
856 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +0000857 self._changed[envvar] = self._environ.get(envvar)
858 self._environ[envvar] = value
859
860 def __delitem__(self, envvar):
861 # Remember the initial value on the first access
862 if envvar not in self._changed:
863 self._changed[envvar] = self._environ.get(envvar)
864 if envvar in self._environ:
865 del self._environ[envvar]
866
867 def keys(self):
868 return self._environ.keys()
869
870 def __iter__(self):
871 return iter(self._environ)
872
873 def __len__(self):
874 return len(self._environ)
875
876 def set(self, envvar, value):
877 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000878
879 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +0000880 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000881
882 def __enter__(self):
883 return self
884
885 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000886 for (k, v) in self._changed.items():
887 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +0000888 if k in self._environ:
889 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +0000890 else:
Walter Dörwald155374d2009-05-01 19:58:58 +0000891 self._environ[k] = v
Nick Coghlan6ead5522009-10-18 13:19:33 +0000892 os.environ = self._environ
893
894
895class DirsOnSysPath(object):
896 """Context manager to temporarily add directories to sys.path.
897
898 This makes a copy of sys.path, appends any directories given
899 as positional arguments, then reverts sys.path to the copied
900 settings when the context ends.
901
902 Note that *all* sys.path modifications in the body of the
903 context manager, including replacement of the object,
904 will be reverted at the end of the block.
905 """
906
907 def __init__(self, *paths):
908 self.original_value = sys.path[:]
909 self.original_object = sys.path
910 sys.path.extend(paths)
911
912 def __enter__(self):
913 return self
914
915 def __exit__(self, *ignore_exc):
916 sys.path = self.original_object
917 sys.path[:] = self.original_value
Walter Dörwald155374d2009-05-01 19:58:58 +0000918
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000919
Guido van Rossumd8faa362007-04-27 19:54:29 +0000920class TransientResource(object):
921
922 """Raise ResourceDenied if an exception is raised while the context manager
923 is in effect that matches the specified exception and attributes."""
924
925 def __init__(self, exc, **kwargs):
926 self.exc = exc
927 self.attrs = kwargs
928
929 def __enter__(self):
930 return self
931
932 def __exit__(self, type_=None, value=None, traceback=None):
933 """If type_ is a subclass of self.exc and value has attributes matching
934 self.attrs, raise ResourceDenied. Otherwise let the exception
935 propagate (if any)."""
936 if type_ is not None and issubclass(self.exc, type_):
937 for attr, attr_value in self.attrs.items():
938 if not hasattr(value, attr):
939 break
940 if getattr(value, attr) != attr_value:
941 break
942 else:
943 raise ResourceDenied("an optional resource is not available")
944
Raymond Hettinger686057b2009-06-04 00:11:54 +0000945# Context managers that raise ResourceDenied when various issues
946# with the Internet connection manifest themselves as exceptions.
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000947# XXX deprecate these and use transient_internet() instead
Raymond Hettinger686057b2009-06-04 00:11:54 +0000948time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
949socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
950ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000951
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000952
Thomas Woutersed03b412007-08-28 21:37:11 +0000953@contextlib.contextmanager
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000954def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitroufec12ff2010-04-21 19:46:23 +0000955 """Return a context manager that raises ResourceDenied when various issues
956 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000957 default_errnos = [
958 ('ECONNREFUSED', 111),
959 ('ECONNRESET', 104),
Antoine Pitrou5d938cb2011-01-08 10:28:11 +0000960 ('EHOSTUNREACH', 113),
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000961 ('ENETUNREACH', 101),
962 ('ETIMEDOUT', 110),
963 ]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000964 default_gai_errnos = [
Antoine Pitrou4875c462011-07-09 02:31:24 +0200965 ('EAI_AGAIN', -3),
Charles-François Natali13859bf2011-12-10 13:16:44 +0100966 ('EAI_FAIL', -4),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000967 ('EAI_NONAME', -2),
968 ('EAI_NODATA', -5),
Antoine Pitrou390ea0f2011-04-29 00:44:33 +0200969 # Encountered when trying to resolve IPv6-only hostnames
970 ('WSANO_DATA', 11004),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000971 ]
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000972
Éric Araujoaf5bacf2011-07-15 17:50:15 +0200973 denied = ResourceDenied("Resource %r is not available" % resource_name)
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000974 captured_errnos = errnos
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000975 gai_errnos = []
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000976 if not captured_errnos:
977 captured_errnos = [getattr(errno, name, num)
978 for (name, num) in default_errnos]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000979 gai_errnos = [getattr(socket, name, num)
980 for (name, num) in default_gai_errnos]
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000981
982 def filter_error(err):
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000983 n = getattr(err, 'errno', None)
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000984 if (isinstance(err, socket.timeout) or
Antoine Pitrou2673c5b2010-09-07 21:43:31 +0000985 (isinstance(err, socket.gaierror) and n in gai_errnos) or
986 n in captured_errnos):
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000987 if not verbose:
988 sys.stderr.write(denied.args[0] + "\n")
989 raise denied from err
990
991 old_timeout = socket.getdefaulttimeout()
992 try:
993 if timeout is not None:
994 socket.setdefaulttimeout(timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +0000995 yield
Antoine Pitroua88c83c2010-09-07 20:42:19 +0000996 except IOError as err:
Antoine Pitrou8bc09032010-09-07 21:09:09 +0000997 # urllib can wrap original socket errors multiple times (!), we must
998 # unwrap to get at the original error.
999 while True:
1000 a = err.args
1001 if len(a) >= 1 and isinstance(a[0], IOError):
1002 err = a[0]
1003 # The error can also be wrapped as args[1]:
1004 # except socket.error as msg:
1005 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
1006 elif len(a) >= 2 and isinstance(a[1], IOError):
1007 err = a[1]
1008 else:
1009 break
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001010 filter_error(err)
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001011 raise
1012 # XXX should we catch generic exceptions and look for their
1013 # __cause__ or __context__?
1014 finally:
1015 socket.setdefaulttimeout(old_timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001016
1017
1018@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001019def captured_output(stream_name):
Ezio Melotti07352b02011-05-14 14:51:18 +03001020 """Return a context manager used by captured_stdout/stdin/stderr
Ezio Melottifc778fd2011-05-14 08:22:47 +03001021 that temporarily replaces the sys stream *stream_name* with a StringIO."""
Thomas Woutersed03b412007-08-28 21:37:11 +00001022 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001023 orig_stdout = getattr(sys, stream_name)
1024 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001025 try:
1026 yield getattr(sys, stream_name)
1027 finally:
1028 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001029
1030def captured_stdout():
Ezio Melottifc778fd2011-05-14 08:22:47 +03001031 """Capture the output of sys.stdout:
1032
1033 with captured_stdout() as s:
1034 print("hello")
1035 self.assertEqual(s.getvalue(), "hello")
1036 """
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001037 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +00001038
Nick Coghlan6b22f3f2010-12-12 15:24:21 +00001039def captured_stderr():
1040 return captured_output("stderr")
1041
Nick Coghlan6ead5522009-10-18 13:19:33 +00001042def captured_stdin():
1043 return captured_output("stdin")
1044
Ezio Melotti07352b02011-05-14 14:51:18 +03001045
Benjamin Petersone549ead2009-03-28 21:42:05 +00001046def gc_collect():
1047 """Force as many objects as possible to be collected.
1048
1049 In non-CPython implementations of Python, this is needed because timely
1050 deallocation is not guaranteed by the garbage collector. (Even in CPython
1051 this can be the case in case of reference cycles.) This means that __del__
1052 methods may be called later than expected and weakrefs may remain alive for
1053 longer than expected. This function tries its best to force all garbage
1054 objects to disappear.
1055 """
Benjamin Petersone549ead2009-03-28 21:42:05 +00001056 gc.collect()
Benjamin Petersona6590e82010-04-11 21:22:10 +00001057 if is_jython:
1058 time.sleep(0.1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00001059 gc.collect()
1060 gc.collect()
1061
Benjamin Peterson31f4beb2011-07-14 12:48:01 -05001062@contextlib.contextmanager
1063def disable_gc():
1064 have_gc = gc.isenabled()
1065 gc.disable()
1066 try:
1067 yield
1068 finally:
1069 if have_gc:
1070 gc.enable()
1071
Thomas Woutersed03b412007-08-28 21:37:11 +00001072
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001073def python_is_optimized():
1074 """Find if Python was built with optimizations."""
Antoine Pitrou64474542010-10-31 11:34:47 +00001075 cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001076 final_opt = ""
1077 for opt in cflags.split():
1078 if opt.startswith('-O'):
1079 final_opt = opt
Eli Bendersky6c519992011-07-23 08:48:53 +03001080 return final_opt != '' and final_opt != '-O0'
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001081
1082
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001083#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +00001084# Decorator for running a function in a different locale, correctly resetting
1085# it afterwards.
1086
1087def run_with_locale(catstr, *locales):
1088 def decorator(func):
1089 def inner(*args, **kwds):
1090 try:
1091 import locale
1092 category = getattr(locale, catstr)
1093 orig_locale = locale.setlocale(category)
1094 except AttributeError:
1095 # if the test author gives us an invalid category string
1096 raise
1097 except:
1098 # cannot retrieve original locale, so do nothing
1099 locale = orig_locale = None
1100 else:
1101 for loc in locales:
1102 try:
1103 locale.setlocale(category, loc)
1104 break
1105 except:
1106 pass
1107
1108 # now run the function, resetting the locale on exceptions
1109 try:
1110 return func(*args, **kwds)
1111 finally:
1112 if locale and orig_locale:
1113 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +00001114 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +00001115 inner.__doc__ = func.__doc__
1116 return inner
1117 return decorator
1118
1119#=======================================================================
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001120# Decorator for running a function in a specific timezone, correctly
1121# resetting it afterwards.
1122
1123def run_with_tz(tz):
1124 def decorator(func):
1125 def inner(*args, **kwds):
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001126 try:
1127 tzset = time.tzset
1128 except AttributeError:
1129 raise unittest.SkipTest("tzset required")
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001130 if 'TZ' in os.environ:
1131 orig_tz = os.environ['TZ']
1132 else:
1133 orig_tz = None
1134 os.environ['TZ'] = tz
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001135 tzset()
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001136
1137 # now run the function, resetting the tz on exceptions
1138 try:
1139 return func(*args, **kwds)
1140 finally:
1141 if orig_tz == None:
1142 del os.environ['TZ']
1143 else:
1144 os.environ['TZ'] = orig_tz
1145 time.tzset()
1146
1147 inner.__name__ = func.__name__
1148 inner.__doc__ = func.__doc__
1149 return inner
1150 return decorator
1151
1152#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +00001153# Big-memory-test support. Separate from 'resources' because memory use
1154# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001155
1156# Some handy shorthands. Note that these are used for byte-limits as well
1157# as size-limits, in the various bigmem tests
1158_1M = 1024*1024
1159_1G = 1024 * _1M
1160_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001161_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +00001162
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001163MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001164
Thomas Wouters477c8d52006-05-27 19:21:47 +00001165def set_memlimit(limit):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001167 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +00001168 sizes = {
1169 'k': 1024,
1170 'm': _1M,
1171 'g': _1G,
1172 't': 1024*_1G,
1173 }
1174 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
1175 re.IGNORECASE | re.VERBOSE)
1176 if m is None:
1177 raise ValueError('Invalid memory limit %r' % (limit,))
1178 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001179 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001180 if memlimit > MAX_Py_ssize_t:
1181 memlimit = MAX_Py_ssize_t
1182 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001183 raise ValueError('Memory limit %r too low to be useful' % (limit,))
1184 max_memuse = memlimit
1185
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001186class _MemoryWatchdog:
1187 """An object which periodically watches the process' memory consumption
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001188 and prints it out.
1189 """
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001190
1191 def __init__(self):
1192 self.procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
1193 self.started = False
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001194
1195 def start(self):
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001196 try:
Charles-François Natali55bce632012-03-24 10:06:23 +01001197 f = open(self.procfile, 'r')
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001198 except OSError as e:
1199 warnings.warn('/proc not available for stats: {}'.format(e),
1200 RuntimeWarning)
1201 sys.stderr.flush()
1202 return
Charles-François Natali55bce632012-03-24 10:06:23 +01001203
1204 watchdog_script = findfile("memory_watchdog.py")
1205 self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script],
1206 stdin=f, stderr=subprocess.DEVNULL)
1207 f.close()
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001208 self.started = True
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001209
1210 def stop(self):
Charles-François Natali55bce632012-03-24 10:06:23 +01001211 if self.started:
1212 self.mem_watchdog.terminate()
1213 self.mem_watchdog.wait()
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001214
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001215
1216def bigmemtest(size, memuse, dry_run=True):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001217 """Decorator for bigmem tests.
1218
1219 'minsize' is the minimum useful size for the test (in arbitrary,
1220 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001221 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001222
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001223 if 'dry_run' is False, it means the test doesn't support dummy runs
1224 when -M is not specified.
Thomas Wouters518b5ae2011-03-25 11:42:37 +01001225 """
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001226 def decorator(f):
1227 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00001228 size = wrapper.size
1229 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001230 if not real_max_memuse:
1231 maxsize = 5147
1232 else:
1233 maxsize = size
1234
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001235 if ((real_max_memuse or not dry_run)
1236 and real_max_memuse < maxsize * memuse):
1237 raise unittest.SkipTest(
1238 "not enough memory: %.1fG minimum needed"
1239 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001240
Charles-François Natali55bce632012-03-24 10:06:23 +01001241 if real_max_memuse and verbose:
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001242 print()
1243 print(" ... expected peak memory use: {peak:.1f}G"
1244 .format(peak=size * memuse / (1024 ** 3)))
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001245 watchdog = _MemoryWatchdog()
1246 watchdog.start()
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001247 else:
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001248 watchdog = None
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001249
1250 try:
1251 return f(self, maxsize)
1252 finally:
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001253 if watchdog:
1254 watchdog.stop()
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001255
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001256 wrapper.size = size
1257 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001258 return wrapper
1259 return decorator
1260
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001261def bigaddrspacetest(f):
1262 """Decorator for tests that fill the address space."""
1263 def wrapper(self):
1264 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou98c62bd2011-01-12 21:58:39 +00001265 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
Antoine Pitroue0d3f8a2011-01-12 21:50:44 +00001266 raise unittest.SkipTest(
1267 "not enough memory: try a 32-bit build instead")
1268 else:
1269 raise unittest.SkipTest(
1270 "not enough memory: %.1fG minimum needed"
1271 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001272 else:
1273 return f(self)
1274 return wrapper
1275
Thomas Wouters477c8d52006-05-27 19:21:47 +00001276#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +00001277# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001278
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001279class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001280 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001281 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001282 test(result)
1283 return result
1284
Benjamin Petersone549ead2009-03-28 21:42:05 +00001285def _id(obj):
1286 return obj
1287
1288def requires_resource(resource):
Antoine Pitroud20a5f62011-02-26 15:58:05 +00001289 if resource == 'gui' and not _is_gui_available():
1290 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou5bc4fa72010-10-14 15:34:31 +00001291 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +00001292 return _id
1293 else:
1294 return unittest.skip("resource {0!r} is not enabled".format(resource))
1295
1296def cpython_only(test):
1297 """
1298 Decorator for tests only applicable on CPython.
1299 """
1300 return impl_detail(cpython=True)(test)
1301
1302def impl_detail(msg=None, **guards):
1303 if check_impl_detail(**guards):
1304 return _id
1305 if msg is None:
1306 guardnames, default = _parse_guards(guards)
1307 if default:
1308 msg = "implementation detail not available on {0}"
1309 else:
1310 msg = "implementation detail specific to {0}"
1311 guardnames = sorted(guardnames.keys())
1312 msg = msg.format(' or '.join(guardnames))
1313 return unittest.skip(msg)
1314
1315def _parse_guards(guards):
1316 # Returns a tuple ({platform_name: run_me}, default_value)
1317 if not guards:
1318 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +00001319 is_true = list(guards.values())[0]
1320 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001321 return (guards, not is_true)
1322
1323# Use the following check to guard CPython's implementation-specific tests --
1324# or to run them only on the implementation(s) guarded by the arguments.
1325def check_impl_detail(**guards):
1326 """This function returns True or False depending on the host platform.
1327 Examples:
1328 if check_impl_detail(): # only on CPython (default)
1329 if check_impl_detail(jython=True): # only on Jython
1330 if check_impl_detail(cpython=False): # everywhere except on CPython
1331 """
1332 guards, default = _parse_guards(guards)
1333 return guards.get(platform.python_implementation().lower(), default)
1334
1335
Brett Cannon31f59292011-02-21 19:29:56 +00001336def no_tracing(func):
1337 """Decorator to temporarily turn off tracing for the duration of a test."""
1338 if not hasattr(sys, 'gettrace'):
1339 return func
1340 else:
1341 @functools.wraps(func)
1342 def wrapper(*args, **kwargs):
1343 original_trace = sys.gettrace()
1344 try:
1345 sys.settrace(None)
1346 return func(*args, **kwargs)
1347 finally:
1348 sys.settrace(original_trace)
1349 return wrapper
1350
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001351
Brett Cannon7a540732011-02-22 03:04:06 +00001352def refcount_test(test):
1353 """Decorator for tests which involve reference counting.
1354
1355 To start, the decorator does not run the test if is not run by CPython.
1356 After that, any trace function is unset during the test to prevent
1357 unexpected refcounts caused by the trace function.
1358
1359 """
1360 return no_tracing(cpython_only(test))
1361
1362
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001363def _filter_suite(suite, pred):
1364 """Recursively filter test cases in a suite based on a predicate."""
1365 newtests = []
1366 for test in suite._tests:
1367 if isinstance(test, unittest.TestSuite):
1368 _filter_suite(test, pred)
1369 newtests.append(test)
1370 else:
1371 if pred(test):
1372 newtests.append(test)
1373 suite._tests = newtests
1374
Guido van Rossumd8faa362007-04-27 19:54:29 +00001375def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +00001376 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001377 if verbose:
Antoine Pitrou216a3bc2011-07-23 22:33:39 +02001378 runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
1379 failfast=failfast)
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001380 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001381 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001382
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001383 result = runner.run(suite)
1384 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +00001385 if len(result.errors) == 1 and not result.failures:
1386 err = result.errors[0][1]
1387 elif len(result.failures) == 1 and not result.errors:
1388 err = result.failures[0][1]
1389 else:
R. David Murray723357e2009-10-19 18:06:17 +00001390 err = "multiple errors occurred"
1391 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +00001392 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +00001393
Barry Warsawc10d6902001-09-20 06:30:41 +00001394
Walter Dörwald21d3a322003-05-01 17:45:56 +00001395def run_unittest(*classes):
1396 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00001397 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001398 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001399 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001400 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001401 if cls in sys.modules:
1402 suite.addTest(unittest.findTestCases(sys.modules[cls]))
1403 else:
1404 raise ValueError("str arguments must be keys in sys.modules")
1405 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +00001406 suite.addTest(cls)
1407 else:
1408 suite.addTest(unittest.makeSuite(cls))
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001409 def case_pred(test):
1410 if match_tests is None:
1411 return True
1412 for name in test.id().split("."):
1413 if fnmatch.fnmatchcase(name, match_tests):
1414 return True
1415 return False
1416 _filter_suite(suite, case_pred)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001417 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001418
Barry Warsawc10d6902001-09-20 06:30:41 +00001419
Tim Petersa0a62222001-09-09 06:12:01 +00001420#=======================================================================
1421# doctest driver.
1422
Stefan Krah1919b7e2012-03-21 18:25:23 +01001423def run_doctest(module, verbosity=None, optionflags=0):
Tim Peters17111f32001-10-03 04:08:26 +00001424 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +00001425
1426 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001427 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +00001428 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +00001429 """
1430
1431 import doctest
1432
1433 if verbosity is None:
1434 verbosity = verbose
1435 else:
1436 verbosity = None
1437
Stefan Krah1919b7e2012-03-21 18:25:23 +01001438 f, t = doctest.testmod(module, verbose=verbosity, optionflags=optionflags)
Victor Stinnerbddc4d42011-06-29 15:52:46 +02001439 if f:
1440 raise TestFailed("%d of %d doctests failed" % (f, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001441 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001442 print('doctest (%s) ... %d tests with zero failures' %
1443 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001444 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001445
Antoine Pitrou060cee22009-11-13 16:29:04 +00001446
1447#=======================================================================
1448# Support for saving and restoring the imported modules.
1449
1450def modules_setup():
1451 return sys.modules.copy(),
1452
1453def modules_cleanup(oldmodules):
1454 # Encoders/decoders are registered permanently within the internal
1455 # codec cache. If we destroy the corresponding modules their
1456 # globals will be set to None which will trip up the cached functions.
1457 encodings = [(k, v) for k, v in sys.modules.items()
1458 if k.startswith('encodings.')]
1459 sys.modules.clear()
1460 sys.modules.update(encodings)
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001461 # XXX: This kind of problem can affect more than just encodings. In particular
Eric Smitha3e8f3d2011-01-11 10:24:34 +00001462 # extension modules (such as _ssl) don't cope with reloading properly.
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001463 # Really, test modules should be cleaning out the test specific modules they
1464 # know they added (ala test_runpy) rather than relying on this function (as
1465 # test_importhooks and test_pkg do currently).
1466 # Implicitly imported *real* modules should be left alone (see issue 10556).
Antoine Pitrou060cee22009-11-13 16:29:04 +00001467 sys.modules.update(oldmodules)
1468
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001469#=======================================================================
1470# Threading support to prevent reporting refleaks when running regrtest.py -R
1471
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001472# NOTE: we use thread._count() rather than threading.enumerate() (or the
1473# moral equivalent thereof) because a threading.Thread object is still alive
1474# until its __bootstrap() method has returned, even after it has been
1475# unregistered from the threading module.
1476# thread._count(), on the other hand, only gets decremented *after* the
1477# __bootstrap() method has returned, which gives us reliable reference counts
1478# at the end of a test run.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001479
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001480def threading_setup():
Victor Stinner45df8202010-04-28 22:31:17 +00001481 if _thread:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001482 return _thread._count(), threading._dangling.copy()
Victor Stinner45df8202010-04-28 22:31:17 +00001483 else:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001484 return 1, ()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001485
Antoine Pitrou707f2282011-07-15 22:29:44 +02001486def threading_cleanup(*original_values):
Victor Stinner45df8202010-04-28 22:31:17 +00001487 if not _thread:
1488 return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001489 _MAX_COUNT = 10
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001490 for count in range(_MAX_COUNT):
Antoine Pitrou707f2282011-07-15 22:29:44 +02001491 values = _thread._count(), threading._dangling
1492 if values == original_values:
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001493 break
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001494 time.sleep(0.1)
Antoine Pitrou707f2282011-07-15 22:29:44 +02001495 gc_collect()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001496 # XXX print a warning in case of failure?
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001497
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001498def reap_threads(func):
Victor Stinner45df8202010-04-28 22:31:17 +00001499 """Use this function when threads are being used. This will
1500 ensure that the threads are cleaned up even when the test fails.
1501 If threading is unavailable this function does nothing.
1502 """
1503 if not _thread:
1504 return func
1505
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001506 @functools.wraps(func)
1507 def decorator(*args):
1508 key = threading_setup()
1509 try:
1510 return func(*args)
1511 finally:
1512 threading_cleanup(*key)
1513 return decorator
1514
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001515def reap_children():
1516 """Use this function at the end of test_main() whenever sub-processes
1517 are started. This will help ensure that no extra children (zombies)
1518 stick around to hog resources and create problems when looking
1519 for refleaks.
1520 """
1521
1522 # Reap all our dead child processes so we don't leave zombies around.
1523 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001524 if hasattr(os, 'waitpid'):
1525 any_process = -1
1526 while True:
1527 try:
1528 # This will raise an exception on Windows. That's ok.
1529 pid, status = os.waitpid(any_process, os.WNOHANG)
1530 if pid == 0:
1531 break
1532 except:
1533 break
Collin Winterf2bf2b32010-03-17 00:41:56 +00001534
1535@contextlib.contextmanager
1536def swap_attr(obj, attr, new_val):
1537 """Temporary swap out an attribute with a new object.
1538
1539 Usage:
1540 with swap_attr(obj, "attr", 5):
1541 ...
1542
1543 This will set obj.attr to 5 for the duration of the with: block,
1544 restoring the old value at the end of the block. If `attr` doesn't
1545 exist on `obj`, it will be created and then deleted at the end of the
1546 block.
1547 """
1548 if hasattr(obj, attr):
1549 real_val = getattr(obj, attr)
1550 setattr(obj, attr, new_val)
1551 try:
1552 yield
1553 finally:
1554 setattr(obj, attr, real_val)
1555 else:
1556 setattr(obj, attr, new_val)
1557 try:
1558 yield
1559 finally:
1560 delattr(obj, attr)
1561
1562@contextlib.contextmanager
1563def swap_item(obj, item, new_val):
1564 """Temporary swap out an item with a new object.
1565
1566 Usage:
1567 with swap_item(obj, "item", 5):
1568 ...
1569
1570 This will set obj["item"] to 5 for the duration of the with: block,
1571 restoring the old value at the end of the block. If `item` doesn't
1572 exist on `obj`, it will be created and then deleted at the end of the
1573 block.
1574 """
1575 if item in obj:
1576 real_val = obj[item]
1577 obj[item] = new_val
1578 try:
1579 yield
1580 finally:
1581 obj[item] = real_val
1582 else:
1583 obj[item] = new_val
1584 try:
1585 yield
1586 finally:
1587 del obj[item]
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001588
1589def strip_python_stderr(stderr):
1590 """Strip the stderr of a Python process from potential debug output
1591 emitted by the interpreter.
1592
1593 This will typically be run on the result of the communicate() method
1594 of a subprocess.Popen object.
1595 """
1596 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
1597 return stderr
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +00001598
1599def args_from_interpreter_flags():
1600 """Return a list of command-line arguments reproducing the current
Brett Cannonb880c152011-03-15 16:03:09 -04001601 settings in sys.flags and sys.warnoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +02001602 return subprocess._args_from_interpreter_flags()
Vinay Sajip129fd042010-12-10 08:19:38 +00001603
1604#============================================================
1605# Support for assertions about logging.
1606#============================================================
1607
1608class TestHandler(logging.handlers.BufferingHandler):
1609 def __init__(self, matcher):
1610 # BufferingHandler takes a "capacity" argument
1611 # so as to know when to flush. As we're overriding
1612 # shouldFlush anyway, we can set a capacity of zero.
1613 # You can call flush() manually to clear out the
1614 # buffer.
1615 logging.handlers.BufferingHandler.__init__(self, 0)
1616 self.matcher = matcher
1617
1618 def shouldFlush(self):
1619 return False
1620
1621 def emit(self, record):
1622 self.format(record)
1623 self.buffer.append(record.__dict__)
1624
1625 def matches(self, **kwargs):
1626 """
1627 Look for a saved dict whose keys/values match the supplied arguments.
1628 """
1629 result = False
1630 for d in self.buffer:
1631 if self.matcher.matches(d, **kwargs):
1632 result = True
1633 break
1634 return result
1635
1636class Matcher(object):
1637
1638 _partial_matches = ('msg', 'message')
1639
1640 def matches(self, d, **kwargs):
1641 """
1642 Try to match a single dict with the supplied arguments.
1643
1644 Keys whose values are strings and which are in self._partial_matches
1645 will be checked for partial (i.e. substring) matches. You can extend
1646 this scheme to (for example) do regular expression matching, etc.
1647 """
1648 result = True
1649 for k in kwargs:
1650 v = kwargs[k]
1651 dv = d.get(k)
1652 if not self.match_value(k, dv, v):
1653 result = False
1654 break
1655 return result
1656
1657 def match_value(self, k, dv, v):
1658 """
1659 Try to match a single stored value (dv) with a supplied value (v).
1660 """
1661 if type(v) != type(dv):
1662 result = False
1663 elif type(dv) is not str or k not in self._partial_matches:
1664 result = (v == dv)
1665 else:
1666 result = dv.find(v) >= 0
1667 return result
Brian Curtin3b4499c2010-12-28 14:31:47 +00001668
1669
1670_can_symlink = None
1671def can_symlink():
1672 global _can_symlink
1673 if _can_symlink is not None:
1674 return _can_symlink
Brett Cannonee877a02011-03-15 17:32:14 -04001675 symlink_path = TESTFN + "can_symlink"
Brian Curtin3b4499c2010-12-28 14:31:47 +00001676 try:
Brett Cannonee877a02011-03-15 17:32:14 -04001677 os.symlink(TESTFN, symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001678 can = True
Brian Curtind25aef52011-06-13 15:16:04 -05001679 except (OSError, NotImplementedError, AttributeError):
Brian Curtin3b4499c2010-12-28 14:31:47 +00001680 can = False
Victor Stinner62ec61f2011-06-07 12:17:15 +02001681 else:
1682 os.remove(symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001683 _can_symlink = can
1684 return can
1685
1686def skip_unless_symlink(test):
1687 """Skip decorator for tests that require functional symlink"""
1688 ok = can_symlink()
1689 msg = "Requires functional symlink implementation"
1690 return test if ok else unittest.skip(msg)(test)
Antoine Pitroue8706232011-03-15 21:05:36 +01001691
Antoine Pitrou424246f2012-05-12 19:02:01 +02001692_can_xattr = None
1693def can_xattr():
1694 global _can_xattr
1695 if _can_xattr is not None:
1696 return _can_xattr
1697 if not hasattr(os, "setxattr"):
1698 can = False
1699 else:
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001700 tmp_fp, tmp_name = tempfile.mkstemp()
Antoine Pitrou424246f2012-05-12 19:02:01 +02001701 try:
1702 with open(TESTFN, "wb") as fp:
1703 try:
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001704 # TESTFN & tempfile may use different file systems with
1705 # different capabilities
1706 os.fsetxattr(tmp_fp, b"user.test", b"")
Antoine Pitrou424246f2012-05-12 19:02:01 +02001707 os.fsetxattr(fp.fileno(), b"user.test", b"")
1708 # Kernels < 2.6.39 don't respect setxattr flags.
1709 kernel_version = platform.release()
1710 m = re.match("2.6.(\d{1,2})", kernel_version)
1711 can = m is None or int(m.group(1)) >= 39
1712 except OSError:
1713 can = False
1714 finally:
1715 unlink(TESTFN)
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001716 unlink(tmp_name)
Antoine Pitrou424246f2012-05-12 19:02:01 +02001717 _can_xattr = can
1718 return can
1719
1720def skip_unless_xattr(test):
1721 """Skip decorator for tests that require functional extended attributes"""
1722 ok = can_xattr()
1723 msg = "no non-broken extended attribute support"
1724 return test if ok else unittest.skip(msg)(test)
1725
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001726def patch(test_instance, object_to_patch, attr_name, new_value):
1727 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1728
1729 Also, add a cleanup procedure to 'test_instance' to restore
1730 'object_to_patch' value for 'attr_name'.
1731 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1732
1733 """
1734 # check that 'attr_name' is a real attribute for 'object_to_patch'
1735 # will raise AttributeError if it does not exist
1736 getattr(object_to_patch, attr_name)
1737
1738 # keep a copy of the old value
1739 attr_is_local = False
1740 try:
1741 old_value = object_to_patch.__dict__[attr_name]
1742 except (AttributeError, KeyError):
1743 old_value = getattr(object_to_patch, attr_name, None)
1744 else:
1745 attr_is_local = True
1746
1747 # restore the value when the test is done
1748 def cleanup():
1749 if attr_is_local:
1750 setattr(object_to_patch, attr_name, old_value)
1751 else:
1752 delattr(object_to_patch, attr_name)
1753
1754 test_instance.addCleanup(cleanup)
1755
1756 # actually override the attribute
1757 setattr(object_to_patch, attr_name, new_value)