blob: d26e10cfc70219e44742ffd2a6c17520bad40446 [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
Brett Cannon9529fbf2013-06-15 17:11:25 -040018import importlib.util
Raymond Hettinger57d1a882011-02-23 00:46:28 +000019import collections.abc
Florent Xiclunab14930c2010-03-13 15:26:44 +000020import re
Brian Curtind40e6f72010-07-08 21:39:08 +000021import subprocess
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
Brett Cannon260fbe82013-07-04 18:16:15 -040032except ImportError:
Victor Stinner45df8202010-04-28 22:31:17 +000033 _thread = None
Antoine Pitrou707f2282011-07-15 22:29:44 +020034 threading = None
35try:
36 import multiprocessing.process
Brett Cannon260fbe82013-07-04 18:16:15 -040037except ImportError:
Antoine Pitrou707f2282011-07-15 22:29:44 +020038 multiprocessing = None
39
Antoine Pitrou75e78b62011-10-04 11:51:23 +020040try:
Ezio Melotticad648c2011-05-19 21:25:10 +030041 import zlib
Brett Cannon260fbe82013-07-04 18:16:15 -040042except ImportError:
Ezio Melotticad648c2011-05-19 21:25:10 +030043 zlib = None
44
Martin v. Löwisf6b16a42012-05-01 07:58:44 +020045try:
Serhiy Storchaka8b562922013-06-17 15:38:50 +030046 import gzip
Brett Cannon260fbe82013-07-04 18:16:15 -040047except ImportError:
Serhiy Storchaka8b562922013-06-17 15:38:50 +030048 gzip = None
49
50try:
Martin v. Löwisf6b16a42012-05-01 07:58:44 +020051 import bz2
Brett Cannon260fbe82013-07-04 18:16:15 -040052except ImportError:
Martin v. Löwisf6b16a42012-05-01 07:58:44 +020053 bz2 = None
54
Martin v. Löwis7fb79fc2012-05-13 10:06:36 +020055try:
56 import lzma
Brett Cannon260fbe82013-07-04 18:16:15 -040057except ImportError:
Martin v. Löwis7fb79fc2012-05-13 10:06:36 +020058 lzma = None
59
Barry Warsaw28a691b2010-04-17 00:19:56 +000060__all__ = [
Hynek Schlawacke02ba102012-05-23 11:22:44 +020061 "Error", "TestFailed", "ResourceDenied", "import_module", "verbose",
62 "use_resources", "max_memuse", "record_original_stdout",
Barry Warsaw28a691b2010-04-17 00:19:56 +000063 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
Charles-François Natali87b3c922011-10-03 19:40:37 +020064 "is_resource_enabled", "requires", "requires_freebsd_version",
Hynek Schlawacke02ba102012-05-23 11:22:44 +020065 "requires_linux_version", "requires_mac_ver", "find_unused_port",
66 "bind_port", "IPV6_ENABLED", "is_jython", "TESTFN", "HOST", "SAVEDCWD",
67 "temp_cwd", "findfile", "create_empty_file", "sortdict",
68 "check_syntax_error", "open_urlresource", "check_warnings", "CleanImport",
69 "EnvironmentVarGuard", "TransientResource", "captured_stdout",
70 "captured_stdin", "captured_stderr", "time_out", "socket_peer_reset",
71 "ioerror_peer_reset", "run_with_locale", 'temp_umask',
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +020072 "transient_internet", "set_memlimit", "bigmemtest", "bigaddrspacetest",
73 "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup",
74 "threading_cleanup", "reap_children", "cpython_only", "check_impl_detail",
75 "get_attribute", "swap_item", "swap_attr", "requires_IEEE_754",
Benjamin Peterson31dc3732011-05-08 15:34:24 -050076 "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
Hynek Schlawacke02ba102012-05-23 11:22:44 +020077 "skip_unless_xattr", "import_fresh_module", "requires_zlib",
78 "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz",
Serhiy Storchaka8b562922013-06-17 15:38:50 +030079 "requires_gzip", "requires_bz2", "requires_lzma", "suppress_crash_popup",
Antoine Pitrou4d7979b2010-09-07 21:22:56 +000080 ]
Florent Xiclunaf089fd62010-03-19 14:25:03 +000081
Fred Drake1790dd42000-07-24 06:55:00 +000082class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000083 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000084
85class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000086 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000087
Benjamin Petersone549ead2009-03-28 21:42:05 +000088class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000089 """Test skipped because it requested a disallowed resource.
90
91 This is raised when a test calls requires() for a resource that
92 has not be enabled. It is used to distinguish between expected
93 and unexpected skips.
94 """
95
Nick Coghlanfce769e2009-04-11 14:30:59 +000096@contextlib.contextmanager
97def _ignore_deprecated_imports(ignore=True):
98 """Context manager to suppress package and module deprecation
99 warnings when importing them.
100
Brett Cannond1877262012-11-17 20:46:26 -0500101 If ignore is False, this context manager has no effect.
102 """
Nick Coghlanfce769e2009-04-11 14:30:59 +0000103 if ignore:
104 with warnings.catch_warnings():
105 warnings.filterwarnings("ignore", ".+ (module|package)",
106 DeprecationWarning)
107 yield
108 else:
109 yield
110
111
Brett Cannond1877262012-11-17 20:46:26 -0500112def import_module(name, deprecated=False, *, required_on=()):
R. David Murraya21e4ca2009-03-31 23:16:50 +0000113 """Import and return the module to be tested, raising SkipTest if
114 it is not available.
115
116 If deprecated is True, any module or package deprecation messages
Brett Cannond1877262012-11-17 20:46:26 -0500117 will be suppressed. If a module is required on a platform but optional for
118 others, set required_on to an iterable of platform prefixes which will be
119 compared against sys.platform.
120 """
Nick Coghlanfce769e2009-04-11 14:30:59 +0000121 with _ignore_deprecated_imports(deprecated):
Benjamin Peterson699adb92008-05-08 22:27:58 +0000122 try:
Nick Coghlanfce769e2009-04-11 14:30:59 +0000123 return importlib.import_module(name)
Brett Cannon260fbe82013-07-04 18:16:15 -0400124 except ImportError as msg:
Brett Cannond1877262012-11-17 20:46:26 -0500125 if sys.platform.startswith(tuple(required_on)):
126 raise
R. David Murraya21e4ca2009-03-31 23:16:50 +0000127 raise unittest.SkipTest(str(msg))
Nick Coghlanfce769e2009-04-11 14:30:59 +0000128
129
Nick Coghlan47384702009-04-22 16:13:36 +0000130def _save_and_remove_module(name, orig_modules):
131 """Helper function to save and remove a module from sys.modules
132
Brett Cannond1877262012-11-17 20:46:26 -0500133 Raise ImportError if the module can't be imported.
134 """
Ezio Melottifec3ad12011-05-14 06:02:25 +0300135 # try to import the module and raise an error if it can't be imported
136 if name not in sys.modules:
Ezio Melotti199e0852011-05-09 06:41:55 +0300137 __import__(name)
Nick Coghlan47384702009-04-22 16:13:36 +0000138 del sys.modules[name]
Ezio Melottifec3ad12011-05-14 06:02:25 +0300139 for modname in list(sys.modules):
140 if modname == name or modname.startswith(name + '.'):
141 orig_modules[modname] = sys.modules[modname]
142 del sys.modules[modname]
Nick Coghlan47384702009-04-22 16:13:36 +0000143
144def _save_and_block_module(name, orig_modules):
145 """Helper function to save and block a module in sys.modules
146
Ezio Melotti199e0852011-05-09 06:41:55 +0300147 Return True if the module was in sys.modules, False otherwise."""
Nick Coghlan47384702009-04-22 16:13:36 +0000148 saved = True
149 try:
150 orig_modules[name] = sys.modules[name]
151 except KeyError:
152 saved = False
Alexander Belopolsky903396e2010-07-13 14:50:16 +0000153 sys.modules[name] = None
Nick Coghlan47384702009-04-22 16:13:36 +0000154 return saved
155
156
Nick Coghlan2496f332011-09-19 20:26:31 +1000157def anticipate_failure(condition):
158 """Decorator to mark a test that is known to be broken in some cases
159
160 Any use of this decorator should have a comment identifying the
161 associated tracker issue.
162 """
163 if condition:
164 return unittest.expectedFailure
165 return lambda f: f
166
167
Nick Coghlan47384702009-04-22 16:13:36 +0000168def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000169 """Imports and returns a module, deliberately bypassing the sys.modules cache
170 and importing a fresh copy of the module. Once the import is complete,
171 the sys.modules cache is restored to its original state.
172
Nick Coghlan47384702009-04-22 16:13:36 +0000173 Modules named in fresh are also imported anew if needed by the import.
Ezio Melotti199e0852011-05-09 06:41:55 +0300174 If one of these modules can't be imported, None is returned.
Nick Coghlan47384702009-04-22 16:13:36 +0000175
176 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000177 takes place.
178
179 If deprecated is True, any module or package deprecation messages
180 will be suppressed."""
Ezio Melotti6b60fb92011-05-14 06:47:51 +0300181 # NOTE: test_heapq, test_json and test_warnings include extra sanity checks
182 # to make sure that this utility function is working as expected
Nick Coghlanfce769e2009-04-11 14:30:59 +0000183 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000184 # Keep track of modules saved for later restoration as well
185 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000186 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000187 names_to_remove = []
188 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000189 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000190 for fresh_name in fresh:
191 _save_and_remove_module(fresh_name, orig_modules)
192 for blocked_name in blocked:
193 if not _save_and_block_module(blocked_name, orig_modules):
194 names_to_remove.append(blocked_name)
195 fresh_module = importlib.import_module(name)
Brett Cannon260fbe82013-07-04 18:16:15 -0400196 except ImportError:
Ezio Melotti199e0852011-05-09 06:41:55 +0300197 fresh_module = None
Nick Coghlanfce769e2009-04-11 14:30:59 +0000198 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000199 for orig_name, module in orig_modules.items():
200 sys.modules[orig_name] = module
201 for name_to_remove in names_to_remove:
202 del sys.modules[name_to_remove]
203 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000204
Benjamin Peterson699adb92008-05-08 22:27:58 +0000205
R. David Murraya21e4ca2009-03-31 23:16:50 +0000206def get_attribute(obj, name):
207 """Get an attribute, raising SkipTest if AttributeError is raised."""
208 try:
209 attribute = getattr(obj, name)
210 except AttributeError:
Éric Araujo4300f692011-10-05 01:50:22 +0200211 raise unittest.SkipTest("object %r has no attribute %r" % (obj, name))
R. David Murraya21e4ca2009-03-31 23:16:50 +0000212 else:
213 return attribute
214
Barry Warsawc0fb6052001-08-20 22:29:23 +0000215verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000216use_resources = None # Flag set to [] by regrtest.py
217max_memuse = 0 # Disable bigmem tests (they will still be run with
218 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000219real_max_memuse = 0
Antoine Pitrou216a3bc2011-07-23 22:33:39 +0200220failfast = False
Antoine Pitroub9c73e82011-07-29 23:53:38 +0200221match_tests = None
Guido van Rossum531661c1996-12-20 02:58:22 +0000222
Tim Peters8dee8092001-09-25 20:05:11 +0000223# _original_stdout is meant to hold stdout at the time regrtest began.
224# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
225# The point is to have some flavor of stdout the user can actually see.
226_original_stdout = None
227def record_original_stdout(stdout):
228 global _original_stdout
229 _original_stdout = stdout
230
231def get_original_stdout():
232 return _original_stdout or sys.stdout
233
Guido van Rossum3bead091992-01-27 17:00:37 +0000234def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000235 try:
236 del sys.modules[name]
237 except KeyError:
238 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000239
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500240if sys.platform.startswith("win"):
241 def _waitfor(func, pathname, waitall=False):
242 # Peform the operation
243 func(pathname)
244 # Now setup the wait loop
245 if waitall:
246 dirname = pathname
247 else:
248 dirname, name = os.path.split(pathname)
249 dirname = dirname or '.'
250 # Check for `pathname` to be removed from the filesystem.
251 # The exponential backoff of the timeout amounts to a total
252 # of ~1 second after which the deletion is probably an error
253 # anyway.
254 # Testing on a i7@4.3GHz shows that usually only 1 iteration is
255 # required when contention occurs.
256 timeout = 0.001
257 while timeout < 1.0:
258 # Note we are only testing for the existance of the file(s) in
259 # the contents of the directory regardless of any security or
260 # access rights. If we have made it this far, we have sufficient
261 # permissions to do that much using Python's equivalent of the
262 # Windows API FindFirstFile.
263 # Other Windows APIs can fail or give incorrect results when
264 # dealing with files that are pending deletion.
265 L = os.listdir(dirname)
266 if not (L if waitall else name in L):
267 return
268 # Increase the timeout and try again
269 time.sleep(timeout)
270 timeout *= 2
271 warnings.warn('tests may fail, delete still pending for ' + pathname,
272 RuntimeWarning, stacklevel=4)
273
274 def _unlink(filename):
275 _waitfor(os.unlink, filename)
276
277 def _rmdir(dirname):
278 _waitfor(os.rmdir, dirname)
279
280 def _rmtree(path):
281 def _rmtree_inner(path):
282 for name in os.listdir(path):
283 fullname = os.path.join(path, name)
284 if os.path.isdir(fullname):
285 _waitfor(_rmtree_inner, fullname, waitall=True)
286 os.rmdir(fullname)
287 else:
288 os.unlink(fullname)
289 _waitfor(_rmtree_inner, path, waitall=True)
290 _waitfor(os.rmdir, path)
291else:
292 _unlink = os.unlink
293 _rmdir = os.rmdir
294 _rmtree = shutil.rmtree
295
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000296def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000297 try:
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500298 _unlink(filename)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100299 except (FileNotFoundError, NotADirectoryError):
300 pass
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000301
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500302def rmdir(dirname):
303 try:
304 _rmdir(dirname)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100305 except FileNotFoundError:
306 pass
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500307
Christian Heimes23daade02008-02-25 12:39:23 +0000308def rmtree(path):
309 try:
Brian Curtin6f5c5cb2012-08-13 17:05:57 -0500310 _rmtree(path)
Giampaolo Rodola'0166a282013-02-12 15:14:17 +0100311 except FileNotFoundError:
312 pass
Christian Heimes23daade02008-02-25 12:39:23 +0000313
Barry Warsaw28a691b2010-04-17 00:19:56 +0000314def make_legacy_pyc(source):
315 """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
316
317 The choice of .pyc or .pyo extension is done based on the __debug__ flag
318 value.
319
320 :param source: The file system path to the source file. The source file
321 does not need to exist, however the PEP 3147 pyc file must exist.
322 :return: The file system path to the legacy pyc file.
323 """
Brett Cannon9529fbf2013-06-15 17:11:25 -0400324 pyc_file = importlib.util.cache_from_source(source)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000325 up_one = os.path.dirname(os.path.abspath(source))
326 legacy_pyc = os.path.join(up_one, source + ('c' if __debug__ else 'o'))
327 os.rename(pyc_file, legacy_pyc)
328 return legacy_pyc
329
Guido van Rossum3bead091992-01-27 17:00:37 +0000330def forget(modname):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000331 """'Forget' a module was ever imported.
332
333 This removes the module from sys.modules and deletes any PEP 3147 or
334 legacy .pyc and .pyo files.
335 """
Fred Drake004d5e62000-10-23 17:22:08 +0000336 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000337 for dirname in sys.path:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000338 source = os.path.join(dirname, modname + '.py')
339 # It doesn't matter if they exist or not, unlink all possible
340 # combinations of PEP 3147 and legacy pyc and pyo files.
341 unlink(source + 'c')
342 unlink(source + 'o')
Brett Cannon9529fbf2013-06-15 17:11:25 -0400343 unlink(importlib.util.cache_from_source(source, debug_override=True))
344 unlink(importlib.util.cache_from_source(source, debug_override=False))
Guido van Rossum3bead091992-01-27 17:00:37 +0000345
Antoine Pitroud20a5f62011-02-26 15:58:05 +0000346# On some platforms, should not run gui test even if it is allowed
347# in `use_resources'.
348if sys.platform.startswith('win'):
349 import ctypes
350 import ctypes.wintypes
351 def _is_gui_available():
352 UOI_FLAGS = 1
353 WSF_VISIBLE = 0x0001
354 class USEROBJECTFLAGS(ctypes.Structure):
355 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
356 ("fReserved", ctypes.wintypes.BOOL),
357 ("dwFlags", ctypes.wintypes.DWORD)]
358 dll = ctypes.windll.user32
359 h = dll.GetProcessWindowStation()
360 if not h:
361 raise ctypes.WinError()
362 uof = USEROBJECTFLAGS()
363 needed = ctypes.wintypes.DWORD()
364 res = dll.GetUserObjectInformationW(h,
365 UOI_FLAGS,
366 ctypes.byref(uof),
367 ctypes.sizeof(uof),
368 ctypes.byref(needed))
369 if not res:
370 raise ctypes.WinError()
371 return bool(uof.dwFlags & WSF_VISIBLE)
372else:
373 def _is_gui_available():
374 return True
375
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000376def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000377 """Test whether a resource is enabled. Known resources are set by
378 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000379 return use_resources is not None and resource in use_resources
380
Barry Warsawc0fb6052001-08-20 22:29:23 +0000381def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000382 """Raise ResourceDenied if the specified resource is not available.
383
384 If the caller's module is __main__ then automatically return True. The
Barry Warsaw28a691b2010-04-17 00:19:56 +0000385 possibility of False being returned occurs when regrtest.py is
386 executing.
387 """
Antoine Pitroud20a5f62011-02-26 15:58:05 +0000388 if resource == 'gui' and not _is_gui_available():
389 raise unittest.SkipTest("Cannot use the 'gui' resource")
Skip Montanarod839ecd2003-04-24 19:06:57 +0000390 # see if the caller's module is __main__ - if so, treat as if
391 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000392 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000393 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000394 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000395 if msg is None:
Éric Araujoaf5bacf2011-07-15 17:50:15 +0200396 msg = "Use of the %r resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000397 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000398
Charles-François Natali87b3c922011-10-03 19:40:37 +0200399def _requires_unix_version(sysname, min_version):
400 """Decorator raising SkipTest if the OS is `sysname` and the version is less
401 than `min_version`.
Charles-François Natali239bb962011-06-03 12:55:15 +0200402
Charles-François Natali87b3c922011-10-03 19:40:37 +0200403 For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if
404 the FreeBSD version is less than 7.2.
Charles-François Natali239bb962011-06-03 12:55:15 +0200405 """
406 def decorator(func):
407 @functools.wraps(func)
408 def wrapper(*args, **kw):
Charles-François Natali87b3c922011-10-03 19:40:37 +0200409 if platform.system() == sysname:
Charles-François Natali239bb962011-06-03 12:55:15 +0200410 version_txt = platform.release().split('-', 1)[0]
411 try:
412 version = tuple(map(int, version_txt.split('.')))
413 except ValueError:
414 pass
415 else:
416 if version < min_version:
417 min_version_txt = '.'.join(map(str, min_version))
418 raise unittest.SkipTest(
Charles-François Natali87b3c922011-10-03 19:40:37 +0200419 "%s version %s or higher required, not %s"
420 % (sysname, min_version_txt, version_txt))
Charles-François Natali239bb962011-06-03 12:55:15 +0200421 return wrapper
422 return decorator
Victor Stinnerfea0f4d2011-05-24 00:24:19 +0200423
Charles-François Natali87b3c922011-10-03 19:40:37 +0200424def requires_freebsd_version(*min_version):
425 """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version is
426 less than `min_version`.
427
428 For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD
429 version is less than 7.2.
430 """
431 return _requires_unix_version('FreeBSD', min_version)
432
433def requires_linux_version(*min_version):
434 """Decorator raising SkipTest if the OS is Linux and the Linux version is
435 less than `min_version`.
436
437 For example, @requires_linux_version(2, 6, 32) raises SkipTest if the Linux
438 version is less than 2.6.32.
439 """
440 return _requires_unix_version('Linux', min_version)
441
Victor Stinnerfce92332011-06-01 12:28:04 +0200442def requires_mac_ver(*min_version):
Victor Stinner88701e22011-06-01 13:13:04 +0200443 """Decorator raising SkipTest if the OS is Mac OS X and the OS X
444 version if less than min_version.
Victor Stinnerfce92332011-06-01 12:28:04 +0200445
Victor Stinner88701e22011-06-01 13:13:04 +0200446 For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
447 is lesser than 10.5.
Victor Stinnerfce92332011-06-01 12:28:04 +0200448 """
Victor Stinner88701e22011-06-01 13:13:04 +0200449 def decorator(func):
450 @functools.wraps(func)
451 def wrapper(*args, **kw):
452 if sys.platform == 'darwin':
453 version_txt = platform.mac_ver()[0]
454 try:
455 version = tuple(map(int, version_txt.split('.')))
456 except ValueError:
457 pass
458 else:
459 if version < min_version:
460 min_version_txt = '.'.join(map(str, min_version))
461 raise unittest.SkipTest(
462 "Mac OS X %s or higher required, not %s"
463 % (min_version_txt, version_txt))
464 return func(*args, **kw)
465 wrapper.min_version = min_version
466 return wrapper
467 return decorator
468
Victor Stinnerfce92332011-06-01 12:28:04 +0200469
Christian Heimes5e696852008-04-09 08:37:03 +0000470HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000471
Christian Heimes5e696852008-04-09 08:37:03 +0000472def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
473 """Returns an unused port that should be suitable for binding. This is
474 achieved by creating a temporary socket with the same family and type as
475 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
476 the specified host address (defaults to 0.0.0.0) with the port set to 0,
477 eliciting an unused ephemeral port from the OS. The temporary socket is
478 then closed and deleted, and the ephemeral port is returned.
479
480 Either this method or bind_port() should be used for any tests where a
481 server socket needs to be bound to a particular port for the duration of
482 the test. Which one to use depends on whether the calling code is creating
483 a python socket, or if an unused port needs to be provided in a constructor
484 or passed to an external program (i.e. the -accept argument to openssl's
485 s_server mode). Always prefer bind_port() over find_unused_port() where
486 possible. Hard coded ports should *NEVER* be used. As soon as a server
487 socket is bound to a hard coded port, the ability to run multiple instances
488 of the test simultaneously on the same host is compromised, which makes the
489 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
490 may simply manifest as a failed test, which can be recovered from without
491 intervention in most cases, but on Windows, the entire python process can
492 completely and utterly wedge, requiring someone to log in to the buildbot
493 and manually kill the affected process.
494
495 (This is easy to reproduce on Windows, unfortunately, and can be traced to
496 the SO_REUSEADDR socket option having different semantics on Windows versus
497 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
498 listen and then accept connections on identical host/ports. An EADDRINUSE
Andrew Svetlov0832af62012-12-18 23:10:48 +0200499 OSError will be raised at some point (depending on the platform and
Christian Heimes5e696852008-04-09 08:37:03 +0000500 the order bind and listen were called on each socket).
501
502 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
503 will ever be raised when attempting to bind two identical host/ports. When
504 accept() is called on each socket, the second caller's process will steal
505 the port from the first caller, leaving them both in an awkwardly wedged
506 state where they'll no longer respond to any signals or graceful kills, and
507 must be forcibly killed via OpenProcess()/TerminateProcess().
508
509 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
510 instead of SO_REUSEADDR, which effectively affords the same semantics as
511 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
512 Source world compared to Windows ones, this is a common mistake. A quick
513 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
514 openssl.exe is called with the 's_server' option, for example. See
515 http://bugs.python.org/issue2550 for more info. The following site also
516 has a very thorough description about the implications of both REUSEADDR
517 and EXCLUSIVEADDRUSE on Windows:
518 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
519
520 XXX: although this approach is a vast improvement on previous attempts to
521 elicit unused ports, it rests heavily on the assumption that the ephemeral
522 port returned to us by the OS won't immediately be dished back out to some
523 other process when we close and delete our temporary socket but before our
524 calling code has a chance to bind the returned port. We can deal with this
525 issue if/when we come across it.
526 """
527
528 tempsock = socket.socket(family, socktype)
529 port = bind_port(tempsock)
530 tempsock.close()
531 del tempsock
532 return port
533
534def bind_port(sock, host=HOST):
535 """Bind the socket to a free port and return the port number. Relies on
536 ephemeral ports in order to ensure we are using an unbound port. This is
537 important as many tests may be running simultaneously, especially in a
538 buildbot environment. This method raises an exception if the sock.family
539 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
540 or SO_REUSEPORT set on it. Tests should *never* set these socket options
541 for TCP/IP sockets. The only case for setting these options is testing
542 multicasting via multiple UDP sockets.
543
544 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
545 on Windows), it will be set on the socket. This will prevent anyone else
546 from bind()'ing to our host/port for the duration of the test.
547 """
548
549 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
550 if hasattr(socket, 'SO_REUSEADDR'):
551 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
552 raise TestFailed("tests should never set the SO_REUSEADDR " \
553 "socket option on TCP/IP sockets!")
554 if hasattr(socket, 'SO_REUSEPORT'):
555 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
556 raise TestFailed("tests should never set the SO_REUSEPORT " \
557 "socket option on TCP/IP sockets!")
558 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
559 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
560
561 sock.bind((host, 0))
562 port = sock.getsockname()[1]
563 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000564
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200565def _is_ipv6_enabled():
566 """Check whether IPv6 is enabled on this host."""
567 if socket.has_ipv6:
Ross Lagerwall121d59f2012-07-07 18:40:32 +0200568 sock = None
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200569 try:
570 sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
571 sock.bind(('::1', 0))
Ross Lagerwall121d59f2012-07-07 18:40:32 +0200572 return True
Andrew Svetlov0832af62012-12-18 23:10:48 +0200573 except OSError:
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200574 pass
Ross Lagerwall121d59f2012-07-07 18:40:32 +0200575 finally:
576 if sock:
577 sock.close()
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200578 return False
579
580IPV6_ENABLED = _is_ipv6_enabled()
581
Charles-François Natali2d517212011-05-29 16:36:44 +0200582
Antoine Pitroue1a16742013-04-24 23:31:38 +0200583# A constant likely larger than the underlying OS pipe buffer size, to
584# make writes blocking.
585# Windows limit seems to be around 512 B, and many Unix kernels have a
586# 64 KiB pipe buffer size or 16 * PAGE_SIZE: take a few megs to be sure.
587# (see issue #17835 for a discussion of this number).
588PIPE_MAX_SIZE = 4 *1024 * 1024 + 1
Charles-François Natali2d517212011-05-29 16:36:44 +0200589
590
Eric Smithf24a0d92010-12-04 13:32:18 +0000591# decorator for skipping tests on non-IEEE 754 platforms
592requires_IEEE_754 = unittest.skipUnless(
593 float.__getformat__("double").startswith("IEEE"),
594 "test requires IEEE 754 doubles")
595
Ezio Melotticad648c2011-05-19 21:25:10 +0300596requires_zlib = unittest.skipUnless(zlib, 'requires zlib')
597
Serhiy Storchaka8b562922013-06-17 15:38:50 +0300598requires_gzip = unittest.skipUnless(gzip, 'requires gzip')
599
Martin v. Löwisf6b16a42012-05-01 07:58:44 +0200600requires_bz2 = unittest.skipUnless(bz2, 'requires bz2')
601
Martin v. Löwis7fb79fc2012-05-13 10:06:36 +0200602requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
603
Finn Bock57bc5fa2002-11-01 18:02:03 +0000604is_jython = sys.platform.startswith('java')
605
Barry Warsaw559f6682001-03-23 18:04:02 +0000606# Filename used for testing
607if os.name == 'java':
608 # Jython disallows @ in module names
609 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000610else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000611 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000612
Antoine Pitrou88909542009-06-29 13:54:42 +0000613# Disambiguate TESTFN for parallel testing, while letting it remain a valid
614# module name.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000615TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
Antoine Pitrou88909542009-06-29 13:54:42 +0000616
Victor Stinner8b219b22012-11-06 23:23:43 +0100617# FS_NONASCII: non-ASCII character encodable by os.fsencode(),
618# or None if there is no such character.
619FS_NONASCII = None
620for character in (
Victor Stinnerab8b6bd2012-11-06 23:43:21 +0100621 # First try printable and common characters to have a readable filename.
622 # For each character, the encoding list are just example of encodings able
623 # to encode the character (the list is not exhaustive).
624
625 # U+00E6 (Latin Small Letter Ae): cp1252, iso-8859-1
Victor Stinner8b219b22012-11-06 23:23:43 +0100626 '\u00E6',
Victor Stinnerab8b6bd2012-11-06 23:43:21 +0100627 # U+0130 (Latin Capital Letter I With Dot Above): cp1254, iso8859_3
628 '\u0130',
629 # U+0141 (Latin Capital Letter L With Stroke): cp1250, cp1257
Victor Stinner8b219b22012-11-06 23:23:43 +0100630 '\u0141',
Victor Stinnerab8b6bd2012-11-06 23:43:21 +0100631 # U+03C6 (Greek Small Letter Phi): cp1253
632 '\u03C6',
633 # U+041A (Cyrillic Capital Letter Ka): cp1251
Victor Stinner8b219b22012-11-06 23:23:43 +0100634 '\u041A',
Victor Stinnerab8b6bd2012-11-06 23:43:21 +0100635 # U+05D0 (Hebrew Letter Alef): Encodable to cp424
Victor Stinner8b219b22012-11-06 23:23:43 +0100636 '\u05D0',
Victor Stinnerab8b6bd2012-11-06 23:43:21 +0100637 # U+060C (Arabic Comma): cp864, cp1006, iso8859_6, mac_arabic
638 '\u060C',
639 # U+062A (Arabic Letter Teh): cp720
640 '\u062A',
641 # U+0E01 (Thai Character Ko Kai): cp874
Victor Stinner8b219b22012-11-06 23:23:43 +0100642 '\u0E01',
Victor Stinnerab8b6bd2012-11-06 23:43:21 +0100643
644 # Then try more "special" characters. "special" because they may be
645 # interpreted or displayed differently depending on the exact locale
646 # encoding and the font.
647
648 # U+00A0 (No-Break Space)
649 '\u00A0',
650 # U+20AC (Euro Sign)
651 '\u20AC',
Victor Stinner8b219b22012-11-06 23:23:43 +0100652):
653 try:
654 os.fsdecode(os.fsencode(character))
655 except UnicodeError:
656 pass
657 else:
658 FS_NONASCII = character
659 break
Michael Foord2d9c2d52010-05-04 22:29:10 +0000660
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000661# TESTFN_UNICODE is a non-ascii filename
662TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
Victor Stinner74a833f2010-08-18 21:06:23 +0000663if sys.platform == 'darwin':
664 # In Mac OS X's VFS API file names are, by definition, canonically
665 # decomposed Unicode, encoded using UTF-8. See QA1173:
666 # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
667 import unicodedata
668 TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
Antoine Pitrou88909542009-06-29 13:54:42 +0000669TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000670
Victor Stinner09c449c2010-08-13 22:23:24 +0000671# TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000672# encoded by the filesystem encoding (in strict mode). It can be None if we
673# cannot generate such filename.
Victor Stinnera0241c82010-08-15 19:28:21 +0000674TESTFN_UNENCODABLE = None
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000675if os.name in ('nt', 'ce'):
Victor Stinnera0241c82010-08-15 19:28:21 +0000676 # skip win32s (0) or Windows 9x/ME (1)
677 if sys.getwindowsversion().platform >= 2:
Victor Stinner8ce7df62010-09-10 11:19:59 +0000678 # Different kinds of characters from various languages to minimize the
679 # probability that the whole name is encodable to MBCS (issue #9819)
680 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000681 try:
Victor Stinner09c449c2010-08-13 22:23:24 +0000682 TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000683 except UnicodeEncodeError:
684 pass
685 else:
686 print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
687 'Unicode filename tests may not be effective'
Victor Stinner09c449c2010-08-13 22:23:24 +0000688 % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
689 TESTFN_UNENCODABLE = None
Victor Stinnera0241c82010-08-15 19:28:21 +0000690# Mac OS X denies unencodable filenames (invalid utf-8)
Victor Stinner03c9e1d2010-08-14 17:35:20 +0000691elif sys.platform != 'darwin':
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000692 try:
693 # ascii and utf-8 cannot encode the byte 0xff
694 b'\xff'.decode(TESTFN_ENCODING)
695 except UnicodeDecodeError:
696 # 0xff will be encoded using the surrogate character u+DCFF
Victor Stinner09c449c2010-08-13 22:23:24 +0000697 TESTFN_UNENCODABLE = TESTFN \
Victor Stinner3d85a6f2010-08-13 13:02:04 +0000698 + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
699 else:
700 # File system encoding (eg. ISO-8859-* encodings) can encode
701 # the byte 0xff. Skip some unicode filename tests.
Victor Stinnera0241c82010-08-15 19:28:21 +0000702 pass
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000703
Victor Stinner292c8352012-10-30 02:17:38 +0100704# TESTFN_UNDECODABLE is a filename (bytes type) that should *not* be able to be
705# decoded from the filesystem encoding (in strict mode). It can be None if we
Victor Stinnerff3d5152012-11-10 12:07:39 +0100706# cannot generate such filename (ex: the latin1 encoding can decode any byte
707# sequence). On UNIX, TESTFN_UNDECODABLE can be decoded by os.fsdecode() thanks
708# to the surrogateescape error handler (PEP 383), but not from the filesystem
709# encoding in strict mode.
Victor Stinner292c8352012-10-30 02:17:38 +0100710TESTFN_UNDECODABLE = None
Victor Stinnerff3d5152012-11-10 12:07:39 +0100711for name in (
712 # b'\xff' is not decodable by os.fsdecode() with code page 932. Windows
713 # accepts it to create a file or a directory, or don't accept to enter to
714 # such directory (when the bytes name is used). So test b'\xe7' first: it is
715 # not decodable from cp932.
716 b'\xe7w\xf0',
717 # undecodable from ASCII, UTF-8
718 b'\xff',
719 # undecodable from iso8859-3, iso8859-6, iso8859-7, cp424, iso8859-8, cp856
720 # and cp857
721 b'\xae\xd5'
722 # undecodable from UTF-8 (UNIX and Mac OS X)
723 b'\xed\xb2\x80', b'\xed\xb4\x80',
Victor Stinnerfe907e12012-12-04 11:55:04 +0100724 # undecodable from shift_jis, cp869, cp874, cp932, cp1250, cp1251, cp1252,
725 # cp1253, cp1254, cp1255, cp1257, cp1258
726 b'\x81\x98',
Victor Stinnerff3d5152012-11-10 12:07:39 +0100727):
Victor Stinner292c8352012-10-30 02:17:38 +0100728 try:
Victor Stinnerff3d5152012-11-10 12:07:39 +0100729 name.decode(TESTFN_ENCODING)
Victor Stinnera0c811e2012-10-31 22:16:38 +0100730 except UnicodeDecodeError:
Victor Stinnerff3d5152012-11-10 12:07:39 +0100731 TESTFN_UNDECODABLE = os.fsencode(TESTFN) + name
Victor Stinner292c8352012-10-30 02:17:38 +0100732 break
733
Victor Stinner8b219b22012-11-06 23:23:43 +0100734if FS_NONASCII:
Victor Stinner90a9d512012-11-06 23:40:22 +0100735 TESTFN_NONASCII = TESTFN + '-' + FS_NONASCII
Victor Stinner8b219b22012-11-06 23:23:43 +0100736else:
737 TESTFN_NONASCII = None
738
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000739# Save the initial cwd
740SAVEDCWD = os.getcwd()
741
742@contextlib.contextmanager
Nick Coghland26c18a2010-08-17 13:06:11 +0000743def temp_cwd(name='tempcwd', quiet=False, path=None):
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000744 """
Nick Coghland26c18a2010-08-17 13:06:11 +0000745 Context manager that temporarily changes the CWD.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000746
Nick Coghland26c18a2010-08-17 13:06:11 +0000747 An existing path may be provided as *path*, in which case this
748 function makes no changes to the file system.
749
750 Otherwise, the new CWD is created in the current directory and it's
751 named *name*. If *quiet* is False (default) and it's not possible to
752 create or change the CWD, an error is raised. If it's True, only a
753 warning is raised and the original CWD is used.
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000754 """
755 saved_dir = os.getcwd()
756 is_temporary = False
Nick Coghland26c18a2010-08-17 13:06:11 +0000757 if path is None:
758 path = name
759 try:
760 os.mkdir(name)
761 is_temporary = True
762 except OSError:
763 if not quiet:
764 raise
765 warnings.warn('tests may fail, unable to create temp CWD ' + name,
766 RuntimeWarning, stacklevel=3)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000767 try:
Nick Coghland26c18a2010-08-17 13:06:11 +0000768 os.chdir(path)
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000769 except OSError:
770 if not quiet:
771 raise
Ezio Melottie418d762012-09-21 16:48:12 +0300772 warnings.warn('tests may fail, unable to change the CWD to ' + path,
Ezio Melotti184bdfb2010-02-18 09:37:05 +0000773 RuntimeWarning, stacklevel=3)
774 try:
775 yield os.getcwd()
776 finally:
777 os.chdir(saved_dir)
778 if is_temporary:
779 rmtree(name)
780
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000781
Eli Bendersky6c519992011-07-23 08:48:53 +0300782if hasattr(os, "umask"):
783 @contextlib.contextmanager
784 def temp_umask(umask):
785 """Context manager that temporarily sets the process umask."""
786 oldmask = os.umask(umask)
787 try:
788 yield
789 finally:
790 os.umask(oldmask)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000791
792
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000793def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000794 """Try to find a file on sys.path and the working directory. If it is not
795 found the argument passed to the function is returned (this does not
796 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000797 if os.path.isabs(file):
798 return file
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000799 if subdir is not None:
800 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000801 path = sys.path
802 path = [os.path.dirname(here)] + path
803 for dn in path:
804 fn = os.path.join(dn, file)
805 if os.path.exists(fn): return fn
806 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000807
Victor Stinnerbf816222011-06-30 23:25:47 +0200808def create_empty_file(filename):
809 """Create an empty file. If the file already exists, truncate it."""
810 fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
811 os.close(fd)
812
Tim Peters2f228e72001-05-13 00:19:31 +0000813def sortdict(dict):
814 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000815 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000816 reprpairs = ["%r: %r" % pair for pair in items]
817 withcommas = ", ".join(reprpairs)
818 return "{%s}" % withcommas
819
Benjamin Peterson7522c742009-01-19 21:00:09 +0000820def make_bad_fd():
821 """
822 Create an invalid file descriptor by opening and closing a file and return
823 its fd.
824 """
825 file = open(TESTFN, "wb")
826 try:
827 return file.fileno()
828 finally:
829 file.close()
830 unlink(TESTFN)
831
Thomas Wouters89f507f2006-12-13 04:49:30 +0000832def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000833 testcase.assertRaises(SyntaxError, compile, statement,
834 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000835
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000836def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000837 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000838
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000839 check = kw.pop('check', None)
840
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000841 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000842
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000843 fn = os.path.join(os.path.dirname(__file__), "data", filename)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000844
845 def check_valid_file(fn):
846 f = open(fn, *args, **kw)
847 if check is None:
848 return f
849 elif check(f):
850 f.seek(0)
851 return f
852 f.close()
853
Alexandre Vassalotti711ed4a2009-07-17 10:42:05 +0000854 if os.path.exists(fn):
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000855 f = check_valid_file(fn)
856 if f is not None:
857 return f
858 unlink(fn)
859
860 # Verify the requirement before downloading the file
861 requires('urlfetch')
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000862
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000863 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitroufd0680b2009-11-01 22:13:48 +0000864 f = urllib.request.urlopen(url, timeout=15)
865 try:
866 with open(fn, "wb") as out:
867 s = f.read()
868 while s:
869 out.write(s)
870 s = f.read()
871 finally:
872 f.close()
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000873
874 f = check_valid_file(fn)
875 if f is not None:
876 return f
Éric Araujoaf5bacf2011-07-15 17:50:15 +0200877 raise TestFailed('invalid resource %r' % fn)
Florent Xiclunaf089fd62010-03-19 14:25:03 +0000878
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000879
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000880class WarningsRecorder(object):
881 """Convenience wrapper for the warnings list returned on
882 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000883 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000884 def __init__(self, warnings_list):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000885 self._warnings = warnings_list
886 self._last = 0
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000887
888 def __getattr__(self, attr):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000889 if len(self._warnings) > self._last:
890 return getattr(self._warnings[-1], attr)
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000891 elif attr in warnings.WarningMessage._WARNING_DETAILS:
892 return None
893 raise AttributeError("%r has no attribute %r" % (self, attr))
894
Florent Xiclunab14930c2010-03-13 15:26:44 +0000895 @property
896 def warnings(self):
897 return self._warnings[self._last:]
898
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000899 def reset(self):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000900 self._last = len(self._warnings)
901
902
903def _filterwarnings(filters, quiet=False):
904 """Catch the warnings, then check if all the expected
905 warnings have been raised and re-raise unexpected warnings.
906 If 'quiet' is True, only re-raise the unexpected warnings.
907 """
908 # Clear the warning registry of the calling module
909 # in order to re-raise the warnings.
910 frame = sys._getframe(2)
911 registry = frame.f_globals.get('__warningregistry__')
912 if registry:
913 registry.clear()
914 with warnings.catch_warnings(record=True) as w:
915 # Set filter "always" to record all warnings. Because
916 # test_warnings swap the module, we need to look up in
917 # the sys.modules dictionary.
918 sys.modules['warnings'].simplefilter("always")
919 yield WarningsRecorder(w)
920 # Filter the recorded warnings
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000921 reraise = list(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000922 missing = []
923 for msg, cat in filters:
924 seen = False
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000925 for w in reraise[:]:
926 warning = w.message
Florent Xiclunab14930c2010-03-13 15:26:44 +0000927 # Filter out the matching messages
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000928 if (re.match(msg, str(warning), re.I) and
929 issubclass(warning.__class__, cat)):
Florent Xiclunab14930c2010-03-13 15:26:44 +0000930 seen = True
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000931 reraise.remove(w)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000932 if not seen and not quiet:
933 # This filter caught nothing
934 missing.append((msg, cat.__name__))
935 if reraise:
Antoine Pitrou31e08a42010-10-29 11:54:03 +0000936 raise AssertionError("unhandled warning %s" % reraise[0])
Florent Xiclunab14930c2010-03-13 15:26:44 +0000937 if missing:
938 raise AssertionError("filter (%r, %s) did not catch any warning" %
939 missing[0])
940
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000941
942@contextlib.contextmanager
Florent Xiclunab14930c2010-03-13 15:26:44 +0000943def check_warnings(*filters, **kwargs):
944 """Context manager to silence warnings.
945
946 Accept 2-tuples as positional arguments:
947 ("message regexp", WarningCategory)
948
949 Optional argument:
950 - if 'quiet' is True, it does not fail if a filter catches nothing
Florent Xicluna53b506be2010-03-18 20:00:57 +0000951 (default True without argument,
952 default False if some filters are defined)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000953
954 Without argument, it defaults to:
Florent Xicluna53b506be2010-03-18 20:00:57 +0000955 check_warnings(("", Warning), quiet=True)
Florent Xiclunab14930c2010-03-13 15:26:44 +0000956 """
Florent Xicluna53b506be2010-03-18 20:00:57 +0000957 quiet = kwargs.get('quiet')
Florent Xiclunab14930c2010-03-13 15:26:44 +0000958 if not filters:
959 filters = (("", Warning),)
Florent Xicluna53b506be2010-03-18 20:00:57 +0000960 # Preserve backward compatibility
961 if quiet is None:
962 quiet = True
963 return _filterwarnings(filters, quiet)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000964
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000965
966class CleanImport(object):
967 """Context manager to force import to return a new module reference.
968
969 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000970 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000971
972 Use like this:
973
974 with CleanImport("foo"):
Brett Cannonddb5e702010-02-03 22:16:11 +0000975 importlib.import_module("foo") # new reference
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000976 """
977
978 def __init__(self, *module_names):
979 self.original_modules = sys.modules.copy()
980 for module_name in module_names:
981 if module_name in sys.modules:
982 module = sys.modules[module_name]
983 # It is possible that module_name is just an alias for
984 # another module (e.g. stub for modules renamed in 3.x).
985 # In that case, we also need delete the real module to clear
986 # the import cache.
987 if module.__name__ != module_name:
988 del sys.modules[module.__name__]
989 del sys.modules[module_name]
990
991 def __enter__(self):
992 return self
993
994 def __exit__(self, *ignore_exc):
995 sys.modules.update(self.original_modules)
996
997
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000998class EnvironmentVarGuard(collections.abc.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000999
1000 """Class to help protect the environment variable properly. Can be used as
1001 a context manager."""
1002
1003 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +00001004 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +00001005 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001006
Walter Dörwald155374d2009-05-01 19:58:58 +00001007 def __getitem__(self, envvar):
1008 return self._environ[envvar]
1009
1010 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +00001011 # Remember the initial value on the first access
1012 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +00001013 self._changed[envvar] = self._environ.get(envvar)
1014 self._environ[envvar] = value
1015
1016 def __delitem__(self, envvar):
1017 # Remember the initial value on the first access
1018 if envvar not in self._changed:
1019 self._changed[envvar] = self._environ.get(envvar)
1020 if envvar in self._environ:
1021 del self._environ[envvar]
1022
1023 def keys(self):
1024 return self._environ.keys()
1025
1026 def __iter__(self):
1027 return iter(self._environ)
1028
1029 def __len__(self):
1030 return len(self._environ)
1031
1032 def set(self, envvar, value):
1033 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001034
1035 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +00001036 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001037
1038 def __enter__(self):
1039 return self
1040
1041 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +00001042 for (k, v) in self._changed.items():
1043 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +00001044 if k in self._environ:
1045 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +00001046 else:
Walter Dörwald155374d2009-05-01 19:58:58 +00001047 self._environ[k] = v
Nick Coghlan6ead5522009-10-18 13:19:33 +00001048 os.environ = self._environ
1049
1050
1051class DirsOnSysPath(object):
1052 """Context manager to temporarily add directories to sys.path.
1053
1054 This makes a copy of sys.path, appends any directories given
1055 as positional arguments, then reverts sys.path to the copied
1056 settings when the context ends.
1057
1058 Note that *all* sys.path modifications in the body of the
1059 context manager, including replacement of the object,
1060 will be reverted at the end of the block.
1061 """
1062
1063 def __init__(self, *paths):
1064 self.original_value = sys.path[:]
1065 self.original_object = sys.path
1066 sys.path.extend(paths)
1067
1068 def __enter__(self):
1069 return self
1070
1071 def __exit__(self, *ignore_exc):
1072 sys.path = self.original_object
1073 sys.path[:] = self.original_value
Walter Dörwald155374d2009-05-01 19:58:58 +00001074
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001075
Guido van Rossumd8faa362007-04-27 19:54:29 +00001076class TransientResource(object):
1077
1078 """Raise ResourceDenied if an exception is raised while the context manager
1079 is in effect that matches the specified exception and attributes."""
1080
1081 def __init__(self, exc, **kwargs):
1082 self.exc = exc
1083 self.attrs = kwargs
1084
1085 def __enter__(self):
1086 return self
1087
1088 def __exit__(self, type_=None, value=None, traceback=None):
1089 """If type_ is a subclass of self.exc and value has attributes matching
1090 self.attrs, raise ResourceDenied. Otherwise let the exception
1091 propagate (if any)."""
1092 if type_ is not None and issubclass(self.exc, type_):
1093 for attr, attr_value in self.attrs.items():
1094 if not hasattr(value, attr):
1095 break
1096 if getattr(value, attr) != attr_value:
1097 break
1098 else:
1099 raise ResourceDenied("an optional resource is not available")
1100
Raymond Hettinger686057b2009-06-04 00:11:54 +00001101# Context managers that raise ResourceDenied when various issues
1102# with the Internet connection manifest themselves as exceptions.
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001103# XXX deprecate these and use transient_internet() instead
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001104time_out = TransientResource(OSError, errno=errno.ETIMEDOUT)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001105socket_peer_reset = TransientResource(OSError, errno=errno.ECONNRESET)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001106ioerror_peer_reset = TransientResource(OSError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001107
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001108
Thomas Woutersed03b412007-08-28 21:37:11 +00001109@contextlib.contextmanager
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001110def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001111 """Return a context manager that raises ResourceDenied when various issues
1112 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001113 default_errnos = [
1114 ('ECONNREFUSED', 111),
1115 ('ECONNRESET', 104),
Antoine Pitrou5d938cb2011-01-08 10:28:11 +00001116 ('EHOSTUNREACH', 113),
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001117 ('ENETUNREACH', 101),
1118 ('ETIMEDOUT', 110),
1119 ]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001120 default_gai_errnos = [
Antoine Pitrou4875c462011-07-09 02:31:24 +02001121 ('EAI_AGAIN', -3),
Charles-François Natali13859bf2011-12-10 13:16:44 +01001122 ('EAI_FAIL', -4),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001123 ('EAI_NONAME', -2),
1124 ('EAI_NODATA', -5),
Antoine Pitrou390ea0f2011-04-29 00:44:33 +02001125 # Encountered when trying to resolve IPv6-only hostnames
1126 ('WSANO_DATA', 11004),
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001127 ]
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001128
Éric Araujoaf5bacf2011-07-15 17:50:15 +02001129 denied = ResourceDenied("Resource %r is not available" % resource_name)
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001130 captured_errnos = errnos
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001131 gai_errnos = []
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001132 if not captured_errnos:
1133 captured_errnos = [getattr(errno, name, num)
1134 for (name, num) in default_errnos]
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001135 gai_errnos = [getattr(socket, name, num)
1136 for (name, num) in default_gai_errnos]
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001137
1138 def filter_error(err):
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001139 n = getattr(err, 'errno', None)
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001140 if (isinstance(err, socket.timeout) or
Antoine Pitrou2673c5b2010-09-07 21:43:31 +00001141 (isinstance(err, socket.gaierror) and n in gai_errnos) or
1142 n in captured_errnos):
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001143 if not verbose:
1144 sys.stderr.write(denied.args[0] + "\n")
1145 raise denied from err
1146
1147 old_timeout = socket.getdefaulttimeout()
1148 try:
1149 if timeout is not None:
1150 socket.setdefaulttimeout(timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001151 yield
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001152 except OSError as err:
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001153 # urllib can wrap original socket errors multiple times (!), we must
1154 # unwrap to get at the original error.
1155 while True:
1156 a = err.args
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001157 if len(a) >= 1 and isinstance(a[0], OSError):
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001158 err = a[0]
1159 # The error can also be wrapped as args[1]:
1160 # except socket.error as msg:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001161 # raise OSError('socket error', msg).with_traceback(sys.exc_info()[2])
1162 elif len(a) >= 2 and isinstance(a[1], OSError):
Antoine Pitrou8bc09032010-09-07 21:09:09 +00001163 err = a[1]
1164 else:
1165 break
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001166 filter_error(err)
Antoine Pitroua88c83c2010-09-07 20:42:19 +00001167 raise
1168 # XXX should we catch generic exceptions and look for their
1169 # __cause__ or __context__?
1170 finally:
1171 socket.setdefaulttimeout(old_timeout)
Antoine Pitroufec12ff2010-04-21 19:46:23 +00001172
1173
1174@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001175def captured_output(stream_name):
Ezio Melotti07352b02011-05-14 14:51:18 +03001176 """Return a context manager used by captured_stdout/stdin/stderr
Ezio Melottifc778fd2011-05-14 08:22:47 +03001177 that temporarily replaces the sys stream *stream_name* with a StringIO."""
Thomas Woutersed03b412007-08-28 21:37:11 +00001178 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001179 orig_stdout = getattr(sys, stream_name)
1180 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001181 try:
1182 yield getattr(sys, stream_name)
1183 finally:
1184 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001185
1186def captured_stdout():
Ezio Melottifc778fd2011-05-14 08:22:47 +03001187 """Capture the output of sys.stdout:
1188
1189 with captured_stdout() as s:
1190 print("hello")
1191 self.assertEqual(s.getvalue(), "hello")
1192 """
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001193 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +00001194
Nick Coghlan6b22f3f2010-12-12 15:24:21 +00001195def captured_stderr():
1196 return captured_output("stderr")
1197
Nick Coghlan6ead5522009-10-18 13:19:33 +00001198def captured_stdin():
1199 return captured_output("stdin")
1200
Ezio Melotti07352b02011-05-14 14:51:18 +03001201
Benjamin Petersone549ead2009-03-28 21:42:05 +00001202def gc_collect():
1203 """Force as many objects as possible to be collected.
1204
1205 In non-CPython implementations of Python, this is needed because timely
1206 deallocation is not guaranteed by the garbage collector. (Even in CPython
1207 this can be the case in case of reference cycles.) This means that __del__
1208 methods may be called later than expected and weakrefs may remain alive for
1209 longer than expected. This function tries its best to force all garbage
1210 objects to disappear.
1211 """
Benjamin Petersone549ead2009-03-28 21:42:05 +00001212 gc.collect()
Benjamin Petersona6590e82010-04-11 21:22:10 +00001213 if is_jython:
1214 time.sleep(0.1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00001215 gc.collect()
1216 gc.collect()
1217
Benjamin Peterson31f4beb2011-07-14 12:48:01 -05001218@contextlib.contextmanager
1219def disable_gc():
1220 have_gc = gc.isenabled()
1221 gc.disable()
1222 try:
1223 yield
1224 finally:
1225 if have_gc:
1226 gc.enable()
1227
Thomas Woutersed03b412007-08-28 21:37:11 +00001228
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001229def python_is_optimized():
1230 """Find if Python was built with optimizations."""
Antoine Pitrou64474542010-10-31 11:34:47 +00001231 cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001232 final_opt = ""
1233 for opt in cflags.split():
1234 if opt.startswith('-O'):
1235 final_opt = opt
Eli Bendersky6c519992011-07-23 08:48:53 +03001236 return final_opt != '' and final_opt != '-O0'
Benjamin Peterson65c66ab2010-10-29 21:31:35 +00001237
1238
Martin v. Löwis2b168442012-07-29 16:38:45 +02001239_header = 'nP'
1240_align = '0n'
Martin v. Löwis33f79972012-07-29 16:33:05 +02001241if hasattr(sys, "gettotalrefcount"):
1242 _header = '2P' + _header
Martin v. Löwis2b168442012-07-29 16:38:45 +02001243 _align = '0P'
1244_vheader = _header + 'n'
Martin v. Löwis33f79972012-07-29 16:33:05 +02001245
1246def calcobjsize(fmt):
Martin v. Löwis2b168442012-07-29 16:38:45 +02001247 return struct.calcsize(_header + fmt + _align)
Martin v. Löwis33f79972012-07-29 16:33:05 +02001248
1249def calcvobjsize(fmt):
Martin v. Löwis2b168442012-07-29 16:38:45 +02001250 return struct.calcsize(_vheader + fmt + _align)
Martin v. Löwis33f79972012-07-29 16:33:05 +02001251
1252
1253_TPFLAGS_HAVE_GC = 1<<14
1254_TPFLAGS_HEAPTYPE = 1<<9
1255
1256def check_sizeof(test, o, size):
1257 result = sys.getsizeof(o)
1258 # add GC header size
1259 if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\
1260 ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))):
1261 size += _testcapi.SIZEOF_PYGC_HEAD
1262 msg = 'wrong size for %s: got %d, expected %d' \
1263 % (type(o), result, size)
1264 test.assertEqual(result, size, msg)
1265
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001266#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +00001267# Decorator for running a function in a different locale, correctly resetting
1268# it afterwards.
1269
1270def run_with_locale(catstr, *locales):
1271 def decorator(func):
1272 def inner(*args, **kwds):
1273 try:
1274 import locale
1275 category = getattr(locale, catstr)
1276 orig_locale = locale.setlocale(category)
1277 except AttributeError:
1278 # if the test author gives us an invalid category string
1279 raise
1280 except:
1281 # cannot retrieve original locale, so do nothing
1282 locale = orig_locale = None
1283 else:
1284 for loc in locales:
1285 try:
1286 locale.setlocale(category, loc)
1287 break
1288 except:
1289 pass
1290
1291 # now run the function, resetting the locale on exceptions
1292 try:
1293 return func(*args, **kwds)
1294 finally:
1295 if locale and orig_locale:
1296 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +00001297 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +00001298 inner.__doc__ = func.__doc__
1299 return inner
1300 return decorator
1301
1302#=======================================================================
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001303# Decorator for running a function in a specific timezone, correctly
1304# resetting it afterwards.
1305
1306def run_with_tz(tz):
1307 def decorator(func):
1308 def inner(*args, **kwds):
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001309 try:
1310 tzset = time.tzset
1311 except AttributeError:
1312 raise unittest.SkipTest("tzset required")
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001313 if 'TZ' in os.environ:
1314 orig_tz = os.environ['TZ']
1315 else:
1316 orig_tz = None
1317 os.environ['TZ'] = tz
Alexander Belopolskyb8f02b52012-04-29 18:16:46 -04001318 tzset()
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001319
1320 # now run the function, resetting the tz on exceptions
1321 try:
1322 return func(*args, **kwds)
1323 finally:
Benjamin Petersonb29614e2012-10-09 11:16:03 -04001324 if orig_tz is None:
Alexander Belopolsky2420d832012-04-29 15:56:49 -04001325 del os.environ['TZ']
1326 else:
1327 os.environ['TZ'] = orig_tz
1328 time.tzset()
1329
1330 inner.__name__ = func.__name__
1331 inner.__doc__ = func.__doc__
1332 return inner
1333 return decorator
1334
1335#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +00001336# Big-memory-test support. Separate from 'resources' because memory use
1337# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001338
1339# Some handy shorthands. Note that these are used for byte-limits as well
1340# as size-limits, in the various bigmem tests
1341_1M = 1024*1024
1342_1G = 1024 * _1M
1343_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001344_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +00001345
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001346MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001347
Thomas Wouters477c8d52006-05-27 19:21:47 +00001348def set_memlimit(limit):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001349 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001350 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +00001351 sizes = {
1352 'k': 1024,
1353 'm': _1M,
1354 'g': _1G,
1355 't': 1024*_1G,
1356 }
1357 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
1358 re.IGNORECASE | re.VERBOSE)
1359 if m is None:
1360 raise ValueError('Invalid memory limit %r' % (limit,))
1361 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001362 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001363 if memlimit > MAX_Py_ssize_t:
1364 memlimit = MAX_Py_ssize_t
1365 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001366 raise ValueError('Memory limit %r too low to be useful' % (limit,))
1367 max_memuse = memlimit
1368
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001369class _MemoryWatchdog:
1370 """An object which periodically watches the process' memory consumption
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001371 and prints it out.
1372 """
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001373
1374 def __init__(self):
1375 self.procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
1376 self.started = False
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001377
1378 def start(self):
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001379 try:
Charles-François Natali55bce632012-03-24 10:06:23 +01001380 f = open(self.procfile, 'r')
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001381 except OSError as e:
1382 warnings.warn('/proc not available for stats: {}'.format(e),
1383 RuntimeWarning)
1384 sys.stderr.flush()
1385 return
Charles-François Natali55bce632012-03-24 10:06:23 +01001386
1387 watchdog_script = findfile("memory_watchdog.py")
1388 self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script],
1389 stdin=f, stderr=subprocess.DEVNULL)
1390 f.close()
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001391 self.started = True
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001392
1393 def stop(self):
Charles-François Natali55bce632012-03-24 10:06:23 +01001394 if self.started:
1395 self.mem_watchdog.terminate()
1396 self.mem_watchdog.wait()
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001397
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001398
1399def bigmemtest(size, memuse, dry_run=True):
Thomas Wouters477c8d52006-05-27 19:21:47 +00001400 """Decorator for bigmem tests.
1401
1402 'minsize' is the minimum useful size for the test (in arbitrary,
1403 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrouaca5fa72011-01-12 21:19:59 +00001404 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001405
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001406 if 'dry_run' is False, it means the test doesn't support dummy runs
1407 when -M is not specified.
Thomas Wouters518b5ae2011-03-25 11:42:37 +01001408 """
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001409 def decorator(f):
1410 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00001411 size = wrapper.size
1412 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001413 if not real_max_memuse:
1414 maxsize = 5147
1415 else:
1416 maxsize = size
1417
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001418 if ((real_max_memuse or not dry_run)
1419 and real_max_memuse < maxsize * memuse):
1420 raise unittest.SkipTest(
1421 "not enough memory: %.1fG minimum needed"
1422 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001423
Charles-François Natali55bce632012-03-24 10:06:23 +01001424 if real_max_memuse and verbose:
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001425 print()
1426 print(" ... expected peak memory use: {peak:.1f}G"
1427 .format(peak=size * memuse / (1024 ** 3)))
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001428 watchdog = _MemoryWatchdog()
1429 watchdog.start()
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001430 else:
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001431 watchdog = None
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001432
1433 try:
1434 return f(self, maxsize)
1435 finally:
Antoine Pitrou75e78b62011-10-04 11:51:23 +02001436 if watchdog:
1437 watchdog.stop()
Antoine Pitrou94190bb2011-10-04 10:22:36 +02001438
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001439 wrapper.size = size
1440 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001441 return wrapper
1442 return decorator
1443
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001444def bigaddrspacetest(f):
1445 """Decorator for tests that fill the address space."""
1446 def wrapper(self):
1447 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou98c62bd2011-01-12 21:58:39 +00001448 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
Antoine Pitroue0d3f8a2011-01-12 21:50:44 +00001449 raise unittest.SkipTest(
1450 "not enough memory: try a 32-bit build instead")
1451 else:
1452 raise unittest.SkipTest(
1453 "not enough memory: %.1fG minimum needed"
1454 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001455 else:
1456 return f(self)
1457 return wrapper
1458
Thomas Wouters477c8d52006-05-27 19:21:47 +00001459#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +00001460# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001461
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001462class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001463 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001464 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001465 test(result)
1466 return result
1467
Benjamin Petersone549ead2009-03-28 21:42:05 +00001468def _id(obj):
1469 return obj
1470
1471def requires_resource(resource):
Antoine Pitroud20a5f62011-02-26 15:58:05 +00001472 if resource == 'gui' and not _is_gui_available():
1473 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou5bc4fa72010-10-14 15:34:31 +00001474 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +00001475 return _id
1476 else:
1477 return unittest.skip("resource {0!r} is not enabled".format(resource))
1478
1479def cpython_only(test):
1480 """
1481 Decorator for tests only applicable on CPython.
1482 """
1483 return impl_detail(cpython=True)(test)
1484
1485def impl_detail(msg=None, **guards):
1486 if check_impl_detail(**guards):
1487 return _id
1488 if msg is None:
1489 guardnames, default = _parse_guards(guards)
1490 if default:
1491 msg = "implementation detail not available on {0}"
1492 else:
1493 msg = "implementation detail specific to {0}"
1494 guardnames = sorted(guardnames.keys())
1495 msg = msg.format(' or '.join(guardnames))
1496 return unittest.skip(msg)
1497
1498def _parse_guards(guards):
1499 # Returns a tuple ({platform_name: run_me}, default_value)
1500 if not guards:
1501 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +00001502 is_true = list(guards.values())[0]
1503 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001504 return (guards, not is_true)
1505
1506# Use the following check to guard CPython's implementation-specific tests --
1507# or to run them only on the implementation(s) guarded by the arguments.
1508def check_impl_detail(**guards):
1509 """This function returns True or False depending on the host platform.
1510 Examples:
1511 if check_impl_detail(): # only on CPython (default)
1512 if check_impl_detail(jython=True): # only on Jython
1513 if check_impl_detail(cpython=False): # everywhere except on CPython
1514 """
1515 guards, default = _parse_guards(guards)
1516 return guards.get(platform.python_implementation().lower(), default)
1517
1518
Brett Cannon31f59292011-02-21 19:29:56 +00001519def no_tracing(func):
1520 """Decorator to temporarily turn off tracing for the duration of a test."""
1521 if not hasattr(sys, 'gettrace'):
1522 return func
1523 else:
1524 @functools.wraps(func)
1525 def wrapper(*args, **kwargs):
1526 original_trace = sys.gettrace()
1527 try:
1528 sys.settrace(None)
1529 return func(*args, **kwargs)
1530 finally:
1531 sys.settrace(original_trace)
1532 return wrapper
1533
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001534
Brett Cannon7a540732011-02-22 03:04:06 +00001535def refcount_test(test):
1536 """Decorator for tests which involve reference counting.
1537
1538 To start, the decorator does not run the test if is not run by CPython.
1539 After that, any trace function is unset during the test to prevent
1540 unexpected refcounts caused by the trace function.
1541
1542 """
1543 return no_tracing(cpython_only(test))
1544
1545
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001546def _filter_suite(suite, pred):
1547 """Recursively filter test cases in a suite based on a predicate."""
1548 newtests = []
1549 for test in suite._tests:
1550 if isinstance(test, unittest.TestSuite):
1551 _filter_suite(test, pred)
1552 newtests.append(test)
1553 else:
1554 if pred(test):
1555 newtests.append(test)
1556 suite._tests = newtests
1557
Guido van Rossumd8faa362007-04-27 19:54:29 +00001558def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +00001559 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001560 if verbose:
Antoine Pitrou216a3bc2011-07-23 22:33:39 +02001561 runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
1562 failfast=failfast)
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001563 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001564 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +00001565
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001566 result = runner.run(suite)
1567 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +00001568 if len(result.errors) == 1 and not result.failures:
1569 err = result.errors[0][1]
1570 elif len(result.failures) == 1 and not result.errors:
1571 err = result.failures[0][1]
1572 else:
R. David Murray723357e2009-10-19 18:06:17 +00001573 err = "multiple errors occurred"
1574 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +00001575 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +00001576
Barry Warsawc10d6902001-09-20 06:30:41 +00001577
Walter Dörwald21d3a322003-05-01 17:45:56 +00001578def run_unittest(*classes):
1579 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00001580 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001581 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001582 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001583 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001584 if cls in sys.modules:
1585 suite.addTest(unittest.findTestCases(sys.modules[cls]))
1586 else:
1587 raise ValueError("str arguments must be keys in sys.modules")
1588 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +00001589 suite.addTest(cls)
1590 else:
1591 suite.addTest(unittest.makeSuite(cls))
Antoine Pitroub9c73e82011-07-29 23:53:38 +02001592 def case_pred(test):
1593 if match_tests is None:
1594 return True
1595 for name in test.id().split("."):
1596 if fnmatch.fnmatchcase(name, match_tests):
1597 return True
1598 return False
1599 _filter_suite(suite, case_pred)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001600 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +00001601
Serhiy Storchaka9d0add02013-01-27 19:47:45 +02001602#=======================================================================
1603# Check for the presence of docstrings.
1604
1605HAVE_DOCSTRINGS = (check_impl_detail(cpython=False) or
1606 sys.platform == 'win32' or
1607 sysconfig.get_config_var('WITH_DOC_STRINGS'))
1608
1609requires_docstrings = unittest.skipUnless(HAVE_DOCSTRINGS,
1610 "test requires docstrings")
1611
Barry Warsawc10d6902001-09-20 06:30:41 +00001612
Tim Petersa0a62222001-09-09 06:12:01 +00001613#=======================================================================
1614# doctest driver.
1615
Stefan Krah1919b7e2012-03-21 18:25:23 +01001616def run_doctest(module, verbosity=None, optionflags=0):
Tim Peters17111f32001-10-03 04:08:26 +00001617 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +00001618
1619 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001620 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +00001621 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +00001622 """
1623
1624 import doctest
1625
1626 if verbosity is None:
1627 verbosity = verbose
1628 else:
1629 verbosity = None
1630
Stefan Krah1919b7e2012-03-21 18:25:23 +01001631 f, t = doctest.testmod(module, verbose=verbosity, optionflags=optionflags)
Victor Stinnerbddc4d42011-06-29 15:52:46 +02001632 if f:
1633 raise TestFailed("%d of %d doctests failed" % (f, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001634 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001635 print('doctest (%s) ... %d tests with zero failures' %
1636 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001637 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001638
Antoine Pitrou060cee22009-11-13 16:29:04 +00001639
1640#=======================================================================
1641# Support for saving and restoring the imported modules.
1642
1643def modules_setup():
1644 return sys.modules.copy(),
1645
1646def modules_cleanup(oldmodules):
1647 # Encoders/decoders are registered permanently within the internal
1648 # codec cache. If we destroy the corresponding modules their
1649 # globals will be set to None which will trip up the cached functions.
1650 encodings = [(k, v) for k, v in sys.modules.items()
1651 if k.startswith('encodings.')]
1652 sys.modules.clear()
1653 sys.modules.update(encodings)
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001654 # XXX: This kind of problem can affect more than just encodings. In particular
Eric Smitha3e8f3d2011-01-11 10:24:34 +00001655 # extension modules (such as _ssl) don't cope with reloading properly.
Nick Coghlan90be5fb2011-01-11 10:05:20 +00001656 # Really, test modules should be cleaning out the test specific modules they
1657 # know they added (ala test_runpy) rather than relying on this function (as
1658 # test_importhooks and test_pkg do currently).
1659 # Implicitly imported *real* modules should be left alone (see issue 10556).
Antoine Pitrou060cee22009-11-13 16:29:04 +00001660 sys.modules.update(oldmodules)
1661
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001662#=======================================================================
1663# Threading support to prevent reporting refleaks when running regrtest.py -R
1664
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001665# NOTE: we use thread._count() rather than threading.enumerate() (or the
1666# moral equivalent thereof) because a threading.Thread object is still alive
1667# until its __bootstrap() method has returned, even after it has been
1668# unregistered from the threading module.
1669# thread._count(), on the other hand, only gets decremented *after* the
1670# __bootstrap() method has returned, which gives us reliable reference counts
1671# at the end of a test run.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001672
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001673def threading_setup():
Victor Stinner45df8202010-04-28 22:31:17 +00001674 if _thread:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001675 return _thread._count(), threading._dangling.copy()
Victor Stinner45df8202010-04-28 22:31:17 +00001676 else:
Antoine Pitrou707f2282011-07-15 22:29:44 +02001677 return 1, ()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001678
Antoine Pitrou707f2282011-07-15 22:29:44 +02001679def threading_cleanup(*original_values):
Victor Stinner45df8202010-04-28 22:31:17 +00001680 if not _thread:
1681 return
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001682 _MAX_COUNT = 10
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001683 for count in range(_MAX_COUNT):
Antoine Pitrou707f2282011-07-15 22:29:44 +02001684 values = _thread._count(), threading._dangling
1685 if values == original_values:
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001686 break
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001687 time.sleep(0.1)
Antoine Pitrou707f2282011-07-15 22:29:44 +02001688 gc_collect()
Antoine Pitrou65c9c642009-10-30 17:25:12 +00001689 # XXX print a warning in case of failure?
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001690
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001691def reap_threads(func):
Victor Stinner45df8202010-04-28 22:31:17 +00001692 """Use this function when threads are being used. This will
1693 ensure that the threads are cleaned up even when the test fails.
1694 If threading is unavailable this function does nothing.
1695 """
1696 if not _thread:
1697 return func
1698
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001699 @functools.wraps(func)
1700 def decorator(*args):
1701 key = threading_setup()
1702 try:
1703 return func(*args)
1704 finally:
1705 threading_cleanup(*key)
1706 return decorator
1707
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001708def reap_children():
1709 """Use this function at the end of test_main() whenever sub-processes
1710 are started. This will help ensure that no extra children (zombies)
1711 stick around to hog resources and create problems when looking
1712 for refleaks.
1713 """
1714
1715 # Reap all our dead child processes so we don't leave zombies around.
1716 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001717 if hasattr(os, 'waitpid'):
1718 any_process = -1
1719 while True:
1720 try:
1721 # This will raise an exception on Windows. That's ok.
1722 pid, status = os.waitpid(any_process, os.WNOHANG)
1723 if pid == 0:
1724 break
1725 except:
1726 break
Collin Winterf2bf2b32010-03-17 00:41:56 +00001727
1728@contextlib.contextmanager
1729def swap_attr(obj, attr, new_val):
1730 """Temporary swap out an attribute with a new object.
1731
1732 Usage:
1733 with swap_attr(obj, "attr", 5):
1734 ...
1735
1736 This will set obj.attr to 5 for the duration of the with: block,
1737 restoring the old value at the end of the block. If `attr` doesn't
1738 exist on `obj`, it will be created and then deleted at the end of the
1739 block.
1740 """
1741 if hasattr(obj, attr):
1742 real_val = getattr(obj, attr)
1743 setattr(obj, attr, new_val)
1744 try:
1745 yield
1746 finally:
1747 setattr(obj, attr, real_val)
1748 else:
1749 setattr(obj, attr, new_val)
1750 try:
1751 yield
1752 finally:
1753 delattr(obj, attr)
1754
1755@contextlib.contextmanager
1756def swap_item(obj, item, new_val):
1757 """Temporary swap out an item with a new object.
1758
1759 Usage:
1760 with swap_item(obj, "item", 5):
1761 ...
1762
1763 This will set obj["item"] to 5 for the duration of the with: block,
1764 restoring the old value at the end of the block. If `item` doesn't
1765 exist on `obj`, it will be created and then deleted at the end of the
1766 block.
1767 """
1768 if item in obj:
1769 real_val = obj[item]
1770 obj[item] = new_val
1771 try:
1772 yield
1773 finally:
1774 obj[item] = real_val
1775 else:
1776 obj[item] = new_val
1777 try:
1778 yield
1779 finally:
1780 del obj[item]
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001781
1782def strip_python_stderr(stderr):
1783 """Strip the stderr of a Python process from potential debug output
1784 emitted by the interpreter.
1785
1786 This will typically be run on the result of the communicate() method
1787 of a subprocess.Popen object.
1788 """
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001789 stderr = re.sub(br"\[\d+ refs, \d+ blocks\]\r?\n?", b"", stderr).strip()
Antoine Pitrou62f68ed2010-08-04 11:48:56 +00001790 return stderr
Antoine Pitrou1b03f2c2010-10-14 11:12:00 +00001791
1792def args_from_interpreter_flags():
1793 """Return a list of command-line arguments reproducing the current
Brett Cannonb880c152011-03-15 16:03:09 -04001794 settings in sys.flags and sys.warnoptions."""
Antoine Pitrouebdcd852012-05-18 18:33:07 +02001795 return subprocess._args_from_interpreter_flags()
Vinay Sajip129fd042010-12-10 08:19:38 +00001796
1797#============================================================
1798# Support for assertions about logging.
1799#============================================================
1800
1801class TestHandler(logging.handlers.BufferingHandler):
1802 def __init__(self, matcher):
1803 # BufferingHandler takes a "capacity" argument
1804 # so as to know when to flush. As we're overriding
1805 # shouldFlush anyway, we can set a capacity of zero.
1806 # You can call flush() manually to clear out the
1807 # buffer.
1808 logging.handlers.BufferingHandler.__init__(self, 0)
1809 self.matcher = matcher
1810
1811 def shouldFlush(self):
1812 return False
1813
1814 def emit(self, record):
1815 self.format(record)
1816 self.buffer.append(record.__dict__)
1817
1818 def matches(self, **kwargs):
1819 """
1820 Look for a saved dict whose keys/values match the supplied arguments.
1821 """
1822 result = False
1823 for d in self.buffer:
1824 if self.matcher.matches(d, **kwargs):
1825 result = True
1826 break
1827 return result
1828
1829class Matcher(object):
1830
1831 _partial_matches = ('msg', 'message')
1832
1833 def matches(self, d, **kwargs):
1834 """
1835 Try to match a single dict with the supplied arguments.
1836
1837 Keys whose values are strings and which are in self._partial_matches
1838 will be checked for partial (i.e. substring) matches. You can extend
1839 this scheme to (for example) do regular expression matching, etc.
1840 """
1841 result = True
1842 for k in kwargs:
1843 v = kwargs[k]
1844 dv = d.get(k)
1845 if not self.match_value(k, dv, v):
1846 result = False
1847 break
1848 return result
1849
1850 def match_value(self, k, dv, v):
1851 """
1852 Try to match a single stored value (dv) with a supplied value (v).
1853 """
1854 if type(v) != type(dv):
1855 result = False
1856 elif type(dv) is not str or k not in self._partial_matches:
1857 result = (v == dv)
1858 else:
1859 result = dv.find(v) >= 0
1860 return result
Brian Curtin3b4499c2010-12-28 14:31:47 +00001861
1862
1863_can_symlink = None
1864def can_symlink():
1865 global _can_symlink
1866 if _can_symlink is not None:
1867 return _can_symlink
Brett Cannonee877a02011-03-15 17:32:14 -04001868 symlink_path = TESTFN + "can_symlink"
Brian Curtin3b4499c2010-12-28 14:31:47 +00001869 try:
Brett Cannonee877a02011-03-15 17:32:14 -04001870 os.symlink(TESTFN, symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001871 can = True
Brian Curtind25aef52011-06-13 15:16:04 -05001872 except (OSError, NotImplementedError, AttributeError):
Brian Curtin3b4499c2010-12-28 14:31:47 +00001873 can = False
Victor Stinner62ec61f2011-06-07 12:17:15 +02001874 else:
1875 os.remove(symlink_path)
Brian Curtin3b4499c2010-12-28 14:31:47 +00001876 _can_symlink = can
1877 return can
1878
1879def skip_unless_symlink(test):
1880 """Skip decorator for tests that require functional symlink"""
1881 ok = can_symlink()
1882 msg = "Requires functional symlink implementation"
1883 return test if ok else unittest.skip(msg)(test)
Antoine Pitroue8706232011-03-15 21:05:36 +01001884
Antoine Pitrou424246f2012-05-12 19:02:01 +02001885_can_xattr = None
1886def can_xattr():
1887 global _can_xattr
1888 if _can_xattr is not None:
1889 return _can_xattr
1890 if not hasattr(os, "setxattr"):
1891 can = False
1892 else:
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001893 tmp_fp, tmp_name = tempfile.mkstemp()
Antoine Pitrou424246f2012-05-12 19:02:01 +02001894 try:
1895 with open(TESTFN, "wb") as fp:
1896 try:
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001897 # TESTFN & tempfile may use different file systems with
1898 # different capabilities
Larry Hastings9cf065c2012-06-22 16:30:09 -07001899 os.setxattr(tmp_fp, b"user.test", b"")
1900 os.setxattr(fp.fileno(), b"user.test", b"")
Antoine Pitrou424246f2012-05-12 19:02:01 +02001901 # Kernels < 2.6.39 don't respect setxattr flags.
1902 kernel_version = platform.release()
1903 m = re.match("2.6.(\d{1,2})", kernel_version)
1904 can = m is None or int(m.group(1)) >= 39
1905 except OSError:
1906 can = False
1907 finally:
1908 unlink(TESTFN)
Hynek Schlawacke02ba102012-05-23 11:22:44 +02001909 unlink(tmp_name)
Antoine Pitrou424246f2012-05-12 19:02:01 +02001910 _can_xattr = can
1911 return can
1912
1913def skip_unless_xattr(test):
1914 """Skip decorator for tests that require functional extended attributes"""
1915 ok = can_xattr()
1916 msg = "no non-broken extended attribute support"
1917 return test if ok else unittest.skip(msg)(test)
1918
Ezio Melotti25a40452013-03-05 20:26:17 +02001919
1920if sys.platform.startswith('win'):
1921 @contextlib.contextmanager
1922 def suppress_crash_popup():
1923 """Disable Windows Error Reporting dialogs using SetErrorMode."""
1924 # see http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx
Ezio Melottie8463422013-03-07 18:37:13 +02001925 # GetErrorMode is not available on Windows XP and Windows Server 2003,
1926 # but SetErrorMode returns the previous value, so we can use that
Ezio Melotti25a40452013-03-05 20:26:17 +02001927 import ctypes
1928 k32 = ctypes.windll.kernel32
Ezio Melotti25a40452013-03-05 20:26:17 +02001929 SEM_NOGPFAULTERRORBOX = 0x02
Ezio Melottie8463422013-03-07 18:37:13 +02001930 old_error_mode = k32.SetErrorMode(SEM_NOGPFAULTERRORBOX)
Ezio Melotti25a40452013-03-05 20:26:17 +02001931 k32.SetErrorMode(old_error_mode | SEM_NOGPFAULTERRORBOX)
1932 try:
1933 yield
1934 finally:
1935 k32.SetErrorMode(old_error_mode)
1936else:
1937 # this is a no-op for other platforms
1938 @contextlib.contextmanager
1939 def suppress_crash_popup():
1940 yield
1941
1942
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001943def patch(test_instance, object_to_patch, attr_name, new_value):
1944 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1945
1946 Also, add a cleanup procedure to 'test_instance' to restore
1947 'object_to_patch' value for 'attr_name'.
1948 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1949
1950 """
1951 # check that 'attr_name' is a real attribute for 'object_to_patch'
1952 # will raise AttributeError if it does not exist
1953 getattr(object_to_patch, attr_name)
1954
1955 # keep a copy of the old value
1956 attr_is_local = False
1957 try:
1958 old_value = object_to_patch.__dict__[attr_name]
1959 except (AttributeError, KeyError):
1960 old_value = getattr(object_to_patch, attr_name, None)
1961 else:
1962 attr_is_local = True
1963
1964 # restore the value when the test is done
1965 def cleanup():
1966 if attr_is_local:
1967 setattr(object_to_patch, attr_name, old_value)
1968 else:
1969 delattr(object_to_patch, attr_name)
1970
1971 test_instance.addCleanup(cleanup)
1972
1973 # actually override the attribute
1974 setattr(object_to_patch, attr_name, new_value)