blob: b2f0f87e65849993eeca93b4cbf11643daf19ba0 [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
Antoine Pitrouf50a6b62011-01-03 18:36:36 +000013import re
Benjamin Petersone549ead2009-03-28 21:42:05 +000014import platform
Christian Heimes23daade02008-02-25 12:39:23 +000015import shutil
Thomas Wouters902d6eb2007-01-09 23:18:33 +000016import warnings
Guido van Rossumd8faa362007-04-27 19:54:29 +000017import unittest
R. David Murraya21e4ca2009-03-31 23:16:50 +000018import importlib
Walter Dörwald155374d2009-05-01 19:58:58 +000019import collections
Fred Drakecd1b1dd2001-03-21 18:26:33 +000020
Antoine Pitrou4d7979b2010-09-07 21:22:56 +000021__all__ = [
22 "Error", "TestFailed", "ResourceDenied", "import_module",
23 "verbose", "use_resources", "max_memuse", "record_original_stdout",
24 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
25 "is_resource_enabled", "requires", "find_unused_port", "bind_port",
26 "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "findfile", "verify",
27 "vereq", "sortdict", "check_syntax_error", "open_urlresource",
28 "check_warnings", "CleanImport", "EnvironmentVarGuard",
29 "TransientResource", "captured_output", "captured_stdout",
30 "time_out", "socket_peer_reset", "ioerror_peer_reset",
31 "run_with_locale", "transient_internet",
32 "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
33 "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
34 "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
Benjamin Peterson262c5822011-05-08 15:32:46 -050035 "import_fresh_module"
Antoine Pitrou4d7979b2010-09-07 21:22:56 +000036 ]
Benjamin Peterson744c2cd2008-05-26 16:26:37 +000037
Fred Drake1790dd42000-07-24 06:55:00 +000038class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000039 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000040
41class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000042 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000043
Benjamin Petersone549ead2009-03-28 21:42:05 +000044class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000045 """Test skipped because it requested a disallowed resource.
46
47 This is raised when a test calls requires() for a resource that
48 has not be enabled. It is used to distinguish between expected
49 and unexpected skips.
50 """
51
Nick Coghlanfce769e2009-04-11 14:30:59 +000052@contextlib.contextmanager
53def _ignore_deprecated_imports(ignore=True):
54 """Context manager to suppress package and module deprecation
55 warnings when importing them.
56
57 If ignore is False, this context manager has no effect."""
58 if ignore:
59 with warnings.catch_warnings():
60 warnings.filterwarnings("ignore", ".+ (module|package)",
61 DeprecationWarning)
62 yield
63 else:
64 yield
65
66
Benjamin Peterson699adb92008-05-08 22:27:58 +000067def import_module(name, deprecated=False):
R. David Murraya21e4ca2009-03-31 23:16:50 +000068 """Import and return the module to be tested, raising SkipTest if
69 it is not available.
70
71 If deprecated is True, any module or package deprecation messages
72 will be suppressed."""
Nick Coghlanfce769e2009-04-11 14:30:59 +000073 with _ignore_deprecated_imports(deprecated):
Benjamin Peterson699adb92008-05-08 22:27:58 +000074 try:
Nick Coghlanfce769e2009-04-11 14:30:59 +000075 return importlib.import_module(name)
R. David Murraya21e4ca2009-03-31 23:16:50 +000076 except ImportError as msg:
77 raise unittest.SkipTest(str(msg))
Nick Coghlanfce769e2009-04-11 14:30:59 +000078
79
Nick Coghlan47384702009-04-22 16:13:36 +000080def _save_and_remove_module(name, orig_modules):
81 """Helper function to save and remove a module from sys.modules
82
Ezio Melotti199e0852011-05-09 06:41:55 +030083 Return True if the module was in sys.modules, False otherwise.
84 Raise ImportError if the module can't be imported."""
Nick Coghlan47384702009-04-22 16:13:36 +000085 saved = True
86 try:
87 orig_modules[name] = sys.modules[name]
88 except KeyError:
Ezio Melotti199e0852011-05-09 06:41:55 +030089 # try to import the module and raise an error if it can't be imported
90 __import__(name)
Nick Coghlan47384702009-04-22 16:13:36 +000091 saved = False
92 else:
93 del sys.modules[name]
94 return saved
95
96
97def _save_and_block_module(name, orig_modules):
98 """Helper function to save and block a module in sys.modules
99
Ezio Melotti199e0852011-05-09 06:41:55 +0300100 Return True if the module was in sys.modules, False otherwise."""
Nick Coghlan47384702009-04-22 16:13:36 +0000101 saved = True
102 try:
103 orig_modules[name] = sys.modules[name]
104 except KeyError:
105 saved = False
Alexander Belopolsky0a5d9a22010-07-13 14:55:04 +0000106 sys.modules[name] = None
Nick Coghlan47384702009-04-22 16:13:36 +0000107 return saved
108
109
110def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000111 """Imports and returns a module, deliberately bypassing the sys.modules cache
112 and importing a fresh copy of the module. Once the import is complete,
113 the sys.modules cache is restored to its original state.
114
Nick Coghlan47384702009-04-22 16:13:36 +0000115 Modules named in fresh are also imported anew if needed by the import.
Ezio Melotti199e0852011-05-09 06:41:55 +0300116 If one of these modules can't be imported, None is returned.
Nick Coghlan47384702009-04-22 16:13:36 +0000117
118 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000119 takes place.
120
121 If deprecated is True, any module or package deprecation messages
122 will be suppressed."""
123 # NOTE: test_heapq and test_warnings include extra sanity checks to make
124 # sure that this utility function is working as expected
125 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000126 # Keep track of modules saved for later restoration as well
127 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000128 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000129 names_to_remove = []
130 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000131 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000132 for fresh_name in fresh:
133 _save_and_remove_module(fresh_name, orig_modules)
134 for blocked_name in blocked:
135 if not _save_and_block_module(blocked_name, orig_modules):
136 names_to_remove.append(blocked_name)
137 fresh_module = importlib.import_module(name)
Ezio Melotti199e0852011-05-09 06:41:55 +0300138 except ImportError:
139 fresh_module = None
Nick Coghlanfce769e2009-04-11 14:30:59 +0000140 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000141 for orig_name, module in orig_modules.items():
142 sys.modules[orig_name] = module
143 for name_to_remove in names_to_remove:
144 del sys.modules[name_to_remove]
145 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000146
Benjamin Peterson699adb92008-05-08 22:27:58 +0000147
R. David Murraya21e4ca2009-03-31 23:16:50 +0000148def get_attribute(obj, name):
149 """Get an attribute, raising SkipTest if AttributeError is raised."""
150 try:
151 attribute = getattr(obj, name)
152 except AttributeError:
153 raise unittest.SkipTest("module %s has no attribute %s" % (
154 obj.__name__, name))
155 else:
156 return attribute
157
Barry Warsawc0fb6052001-08-20 22:29:23 +0000158verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000159use_resources = None # Flag set to [] by regrtest.py
160max_memuse = 0 # Disable bigmem tests (they will still be run with
161 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000162real_max_memuse = 0
Guido van Rossum531661c1996-12-20 02:58:22 +0000163
Tim Peters8dee8092001-09-25 20:05:11 +0000164# _original_stdout is meant to hold stdout at the time regrtest began.
165# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
166# The point is to have some flavor of stdout the user can actually see.
167_original_stdout = None
168def record_original_stdout(stdout):
169 global _original_stdout
170 _original_stdout = stdout
171
172def get_original_stdout():
173 return _original_stdout or sys.stdout
174
Guido van Rossum3bead091992-01-27 17:00:37 +0000175def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000176 try:
177 del sys.modules[name]
178 except KeyError:
179 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000180
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000181def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000182 try:
183 os.unlink(filename)
184 except OSError:
185 pass
186
Christian Heimes23daade02008-02-25 12:39:23 +0000187def rmtree(path):
188 try:
189 shutil.rmtree(path)
190 except OSError as e:
191 # Unix returns ENOENT, Windows returns ESRCH.
192 if e.errno not in (errno.ENOENT, errno.ESRCH):
193 raise
194
Guido van Rossum3bead091992-01-27 17:00:37 +0000195def forget(modname):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000196 '''"Forget" a module was ever imported by removing it from sys.modules and
197 deleting any .pyc and .pyo files.'''
Fred Drake004d5e62000-10-23 17:22:08 +0000198 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000199 for dirname in sys.path:
Skip Montanaro7a98be22007-08-16 14:35:24 +0000200 unlink(os.path.join(dirname, modname + '.pyc'))
Brett Cannonf1cfb622003-05-04 21:15:27 +0000201 # Deleting the .pyo file cannot be within the 'try' for the .pyc since
202 # the chance exists that there is no .pyc (and thus the 'try' statement
203 # is exited) but there is a .pyo file.
Skip Montanaro7a98be22007-08-16 14:35:24 +0000204 unlink(os.path.join(dirname, modname + '.pyo'))
Guido van Rossum3bead091992-01-27 17:00:37 +0000205
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000206# On some platforms, should not run gui test even if it is allowed
207# in `use_resources'.
208if sys.platform.startswith('win'):
209 import ctypes
210 import ctypes.wintypes
211 def _is_gui_available():
212 UOI_FLAGS = 1
213 WSF_VISIBLE = 0x0001
214 class USEROBJECTFLAGS(ctypes.Structure):
215 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
216 ("fReserved", ctypes.wintypes.BOOL),
217 ("dwFlags", ctypes.wintypes.DWORD)]
218 dll = ctypes.windll.user32
219 h = dll.GetProcessWindowStation()
220 if not h:
221 raise ctypes.WinError()
222 uof = USEROBJECTFLAGS()
223 needed = ctypes.wintypes.DWORD()
224 res = dll.GetUserObjectInformationW(h,
225 UOI_FLAGS,
226 ctypes.byref(uof),
227 ctypes.sizeof(uof),
228 ctypes.byref(needed))
229 if not res:
230 raise ctypes.WinError()
231 return bool(uof.dwFlags & WSF_VISIBLE)
232else:
233 def _is_gui_available():
234 return True
235
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000236def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000237 """Test whether a resource is enabled. Known resources are set by
238 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000239 return use_resources is not None and resource in use_resources
240
Barry Warsawc0fb6052001-08-20 22:29:23 +0000241def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000242 """Raise ResourceDenied if the specified resource is not available.
243
244 If the caller's module is __main__ then automatically return True. The
245 possibility of False being returned occurs when regrtest.py is executing."""
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000246 if resource == 'gui' and not _is_gui_available():
247 raise unittest.SkipTest("Cannot use the 'gui' resource")
Skip Montanarod839ecd2003-04-24 19:06:57 +0000248 # see if the caller's module is __main__ - if so, treat as if
249 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000250 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000251 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000252 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000253 if msg is None:
254 msg = "Use of the `%s' resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000255 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000256
Christian Heimes5e696852008-04-09 08:37:03 +0000257HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000258
Christian Heimes5e696852008-04-09 08:37:03 +0000259def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
260 """Returns an unused port that should be suitable for binding. This is
261 achieved by creating a temporary socket with the same family and type as
262 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
263 the specified host address (defaults to 0.0.0.0) with the port set to 0,
264 eliciting an unused ephemeral port from the OS. The temporary socket is
265 then closed and deleted, and the ephemeral port is returned.
266
267 Either this method or bind_port() should be used for any tests where a
268 server socket needs to be bound to a particular port for the duration of
269 the test. Which one to use depends on whether the calling code is creating
270 a python socket, or if an unused port needs to be provided in a constructor
271 or passed to an external program (i.e. the -accept argument to openssl's
272 s_server mode). Always prefer bind_port() over find_unused_port() where
273 possible. Hard coded ports should *NEVER* be used. As soon as a server
274 socket is bound to a hard coded port, the ability to run multiple instances
275 of the test simultaneously on the same host is compromised, which makes the
276 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
277 may simply manifest as a failed test, which can be recovered from without
278 intervention in most cases, but on Windows, the entire python process can
279 completely and utterly wedge, requiring someone to log in to the buildbot
280 and manually kill the affected process.
281
282 (This is easy to reproduce on Windows, unfortunately, and can be traced to
283 the SO_REUSEADDR socket option having different semantics on Windows versus
284 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
285 listen and then accept connections on identical host/ports. An EADDRINUSE
286 socket.error will be raised at some point (depending on the platform and
287 the order bind and listen were called on each socket).
288
289 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
290 will ever be raised when attempting to bind two identical host/ports. When
291 accept() is called on each socket, the second caller's process will steal
292 the port from the first caller, leaving them both in an awkwardly wedged
293 state where they'll no longer respond to any signals or graceful kills, and
294 must be forcibly killed via OpenProcess()/TerminateProcess().
295
296 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
297 instead of SO_REUSEADDR, which effectively affords the same semantics as
298 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
299 Source world compared to Windows ones, this is a common mistake. A quick
300 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
301 openssl.exe is called with the 's_server' option, for example. See
302 http://bugs.python.org/issue2550 for more info. The following site also
303 has a very thorough description about the implications of both REUSEADDR
304 and EXCLUSIVEADDRUSE on Windows:
305 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
306
307 XXX: although this approach is a vast improvement on previous attempts to
308 elicit unused ports, it rests heavily on the assumption that the ephemeral
309 port returned to us by the OS won't immediately be dished back out to some
310 other process when we close and delete our temporary socket but before our
311 calling code has a chance to bind the returned port. We can deal with this
312 issue if/when we come across it.
313 """
314
315 tempsock = socket.socket(family, socktype)
316 port = bind_port(tempsock)
317 tempsock.close()
318 del tempsock
319 return port
320
321def bind_port(sock, host=HOST):
322 """Bind the socket to a free port and return the port number. Relies on
323 ephemeral ports in order to ensure we are using an unbound port. This is
324 important as many tests may be running simultaneously, especially in a
325 buildbot environment. This method raises an exception if the sock.family
326 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
327 or SO_REUSEPORT set on it. Tests should *never* set these socket options
328 for TCP/IP sockets. The only case for setting these options is testing
329 multicasting via multiple UDP sockets.
330
331 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
332 on Windows), it will be set on the socket. This will prevent anyone else
333 from bind()'ing to our host/port for the duration of the test.
334 """
335
336 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
337 if hasattr(socket, 'SO_REUSEADDR'):
338 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
339 raise TestFailed("tests should never set the SO_REUSEADDR " \
340 "socket option on TCP/IP sockets!")
341 if hasattr(socket, 'SO_REUSEPORT'):
342 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
343 raise TestFailed("tests should never set the SO_REUSEPORT " \
344 "socket option on TCP/IP sockets!")
345 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
346 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
347
348 sock.bind((host, 0))
349 port = sock.getsockname()[1]
350 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000351
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000352FUZZ = 1e-6
353
354def fcmp(x, y): # fuzzy comparison function
Neal Norwitz79212992006-08-21 16:27:31 +0000355 if isinstance(x, float) or isinstance(y, float):
Fred Drake004d5e62000-10-23 17:22:08 +0000356 try:
Fred Drake004d5e62000-10-23 17:22:08 +0000357 fuzz = (abs(x) + abs(y)) * FUZZ
358 if abs(x-y) <= fuzz:
359 return 0
360 except:
361 pass
Neal Norwitz79212992006-08-21 16:27:31 +0000362 elif type(x) == type(y) and isinstance(x, (tuple, list)):
Fred Drake004d5e62000-10-23 17:22:08 +0000363 for i in range(min(len(x), len(y))):
364 outcome = fcmp(x[i], y[i])
Fred Drake132dce22000-12-12 23:11:42 +0000365 if outcome != 0:
Fred Drake004d5e62000-10-23 17:22:08 +0000366 return outcome
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000367 return (len(x) > len(y)) - (len(x) < len(y))
368 return (x > y) - (x < y)
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000369
Finn Bock57bc5fa2002-11-01 18:02:03 +0000370is_jython = sys.platform.startswith('java')
371
Barry Warsaw559f6682001-03-23 18:04:02 +0000372# Filename used for testing
373if os.name == 'java':
374 # Jython disallows @ in module names
375 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000376else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000377 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000378
379 # Assuming sys.getfilesystemencoding()!=sys.getdefaultencoding()
380 # TESTFN_UNICODE is a filename that can be encoded using the
381 # file system encoding, but *not* with the default (ascii) encoding
382 TESTFN_UNICODE = "@test-\xe0\xf2"
383 TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner0ea31a92010-09-10 12:32:58 +0000384 # TESTFN_UNENCODABLE is a filename that should *not* be
Walter Dörwald9b775532007-06-08 14:30:53 +0000385 # able to be encoded by *either* the default or filesystem encoding.
386 # This test really only makes sense on Windows NT platforms
387 # which have special Unicode support in posixmodule.
388 if (not hasattr(sys, "getwindowsversion") or
389 sys.getwindowsversion()[3] < 2): # 0=win32s or 1=9x/ME
Victor Stinner0ea31a92010-09-10 12:32:58 +0000390 TESTFN_UNENCODABLE = None
Walter Dörwald9b775532007-06-08 14:30:53 +0000391 else:
Victor Stinner0d823ed2010-09-10 12:19:37 +0000392 # Different kinds of characters from various languages to minimize the
393 # probability that the whole name is encodable to MBCS (issue #9819)
394 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Walter Dörwald9b775532007-06-08 14:30:53 +0000395 try:
396 # XXX - Note - should be using TESTFN_ENCODING here - but for
397 # Windows, "mbcs" currently always operates as if in
398 # errors=ignore' mode - hence we get '?' characters rather than
399 # the exception. 'Latin1' operates as we expect - ie, fails.
400 # See [ 850997 ] mbcs encoding ignores errors
Victor Stinner0ea31a92010-09-10 12:32:58 +0000401 TESTFN_UNENCODABLE.encode("Latin1")
Walter Dörwald9b775532007-06-08 14:30:53 +0000402 except UnicodeEncodeError:
403 pass
Martin v. Löwis2411a2d2002-11-09 19:57:26 +0000404 else:
Georg Brandldb028442008-02-05 20:48:58 +0000405 print('WARNING: The filename %r CAN be encoded by the filesystem. '
406 'Unicode filename tests may not be effective'
Victor Stinner0ea31a92010-09-10 12:32:58 +0000407 % TESTFN_UNENCODABLE)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000408
Victor Stinner7f6423a2010-05-14 20:08:55 +0000409if os.path.isdir(TESTFN):
410 # a test failed (eg. test_os) without removing TESTFN directory
411 shutil.rmtree(TESTFN)
412
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000413# Make sure we can write to TESTFN, try in /tmp if we can't
414fp = None
415try:
416 fp = open(TESTFN, 'w+')
417except IOError:
418 TMP_TESTFN = os.path.join('/tmp', TESTFN)
419 try:
420 fp = open(TMP_TESTFN, 'w+')
421 TESTFN = TMP_TESTFN
422 del TMP_TESTFN
423 except IOError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000424 print(('WARNING: tests will fail, unable to write to: %s or %s' %
425 (TESTFN, TMP_TESTFN)))
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000426if fp is not None:
427 fp.close()
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000428 unlink(TESTFN)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000429del fp
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000430
Victor Stinner3f682ad2010-07-13 23:14:46 +0000431def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000432 """Try to find a file on sys.path and the working directory. If it is not
433 found the argument passed to the function is returned (this does not
434 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000435 if os.path.isabs(file):
436 return file
Victor Stinner3f682ad2010-07-13 23:14:46 +0000437 if subdir is not None:
438 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000439 path = sys.path
440 path = [os.path.dirname(here)] + path
441 for dn in path:
442 fn = os.path.join(dn, file)
443 if os.path.exists(fn): return fn
444 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000445
Ezio Melotti2aef4b82010-01-25 12:20:04 +0000446def verify(condition, reason='test failed'):
447 """Verify that condition is true. If not, raise TestFailed.
448
449 The optional argument reason can be given to provide
450 a better error text.
451 """
452
453 if not condition:
454 raise TestFailed(reason)
455
456def vereq(a, b):
457 """Raise TestFailed if a == b is false.
458
459 This is better than verify(a == b) because, in case of failure, the
460 error message incorporates repr(a) and repr(b) so you can see the
461 inputs.
462
463 Note that "not (a == b)" isn't necessarily the same as "a != b"; the
464 former is tested.
465 """
466
467 if not (a == b):
468 raise TestFailed("%r == %r" % (a, b))
469
Tim Peters2f228e72001-05-13 00:19:31 +0000470def sortdict(dict):
471 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000472 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000473 reprpairs = ["%r: %r" % pair for pair in items]
474 withcommas = ", ".join(reprpairs)
475 return "{%s}" % withcommas
476
Benjamin Peterson7522c742009-01-19 21:00:09 +0000477def make_bad_fd():
478 """
479 Create an invalid file descriptor by opening and closing a file and return
480 its fd.
481 """
482 file = open(TESTFN, "wb")
483 try:
484 return file.fileno()
485 finally:
486 file.close()
487 unlink(TESTFN)
488
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000490 testcase.assertRaises(SyntaxError, compile, statement,
491 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000492
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000493def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000494 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000495
Guido van Rossum360e4b82007-05-14 22:51:27 +0000496 requires('urlfetch')
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000497 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000498
499 for path in [os.path.curdir, os.path.pardir]:
500 fn = os.path.join(path, filename)
501 if os.path.exists(fn):
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000502 return open(fn, *args, **kw)
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000503
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000504 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitrouec416612009-11-01 22:28:14 +0000505 f = urllib.request.urlopen(url, timeout=15)
506 try:
507 with open(filename, "wb") as out:
508 s = f.read()
509 while s:
510 out.write(s)
511 s = f.read()
512 finally:
513 f.close()
514 return open(filename, *args, **kw)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000515
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000516class WarningsRecorder(object):
517 """Convenience wrapper for the warnings list returned on
518 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000519 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000520 def __init__(self, warnings_list):
521 self.warnings = warnings_list
522
523 def __getattr__(self, attr):
524 if self.warnings:
525 return getattr(self.warnings[-1], attr)
526 elif attr in warnings.WarningMessage._WARNING_DETAILS:
527 return None
528 raise AttributeError("%r has no attribute %r" % (self, attr))
529
530 def reset(self):
531 del self.warnings[:]
532
533@contextlib.contextmanager
534def check_warnings():
535 with warnings.catch_warnings(record=True) as w:
536 yield WarningsRecorder(w)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000537
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000538
539class CleanImport(object):
540 """Context manager to force import to return a new module reference.
541
542 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000543 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000544
545 Use like this:
546
547 with CleanImport("foo"):
548 __import__("foo") # new reference
549 """
550
551 def __init__(self, *module_names):
552 self.original_modules = sys.modules.copy()
553 for module_name in module_names:
554 if module_name in sys.modules:
555 module = sys.modules[module_name]
556 # It is possible that module_name is just an alias for
557 # another module (e.g. stub for modules renamed in 3.x).
558 # In that case, we also need delete the real module to clear
559 # the import cache.
560 if module.__name__ != module_name:
561 del sys.modules[module.__name__]
562 del sys.modules[module_name]
563
564 def __enter__(self):
565 return self
566
567 def __exit__(self, *ignore_exc):
568 sys.modules.update(self.original_modules)
569
570
Walter Dörwald155374d2009-05-01 19:58:58 +0000571class EnvironmentVarGuard(collections.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000572
573 """Class to help protect the environment variable properly. Can be used as
574 a context manager."""
575
576 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000577 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000578 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000579
Walter Dörwald155374d2009-05-01 19:58:58 +0000580 def __getitem__(self, envvar):
581 return self._environ[envvar]
582
583 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000584 # Remember the initial value on the first access
585 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +0000586 self._changed[envvar] = self._environ.get(envvar)
587 self._environ[envvar] = value
588
589 def __delitem__(self, envvar):
590 # Remember the initial value on the first access
591 if envvar not in self._changed:
592 self._changed[envvar] = self._environ.get(envvar)
593 if envvar in self._environ:
594 del self._environ[envvar]
595
596 def keys(self):
597 return self._environ.keys()
598
599 def __iter__(self):
600 return iter(self._environ)
601
602 def __len__(self):
603 return len(self._environ)
604
605 def set(self, envvar, value):
606 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000607
608 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +0000609 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000610
611 def __enter__(self):
612 return self
613
614 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000615 for (k, v) in self._changed.items():
616 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +0000617 if k in self._environ:
618 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +0000619 else:
Walter Dörwald155374d2009-05-01 19:58:58 +0000620 self._environ[k] = v
621
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000622
Guido van Rossumd8faa362007-04-27 19:54:29 +0000623class TransientResource(object):
624
625 """Raise ResourceDenied if an exception is raised while the context manager
626 is in effect that matches the specified exception and attributes."""
627
628 def __init__(self, exc, **kwargs):
629 self.exc = exc
630 self.attrs = kwargs
631
632 def __enter__(self):
633 return self
634
635 def __exit__(self, type_=None, value=None, traceback=None):
636 """If type_ is a subclass of self.exc and value has attributes matching
637 self.attrs, raise ResourceDenied. Otherwise let the exception
638 propagate (if any)."""
639 if type_ is not None and issubclass(self.exc, type_):
640 for attr, attr_value in self.attrs.items():
641 if not hasattr(value, attr):
642 break
643 if getattr(value, attr) != attr_value:
644 break
645 else:
646 raise ResourceDenied("an optional resource is not available")
647
Raymond Hettinger686057b2009-06-04 00:11:54 +0000648# Context managers that raise ResourceDenied when various issues
649# with the Internet connection manifest themselves as exceptions.
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000650# XXX deprecate these and use transient_internet() instead
Raymond Hettinger686057b2009-06-04 00:11:54 +0000651time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
652socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
653ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000654
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000655
Thomas Woutersed03b412007-08-28 21:37:11 +0000656@contextlib.contextmanager
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000657def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000658 """Return a context manager that raises ResourceDenied when various issues
659 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000660 default_errnos = [
661 ('ECONNREFUSED', 111),
662 ('ECONNRESET', 104),
Antoine Pitrou50778ab2011-01-08 10:31:09 +0000663 ('EHOSTUNREACH', 113),
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000664 ('ENETUNREACH', 101),
665 ('ETIMEDOUT', 110),
666 ]
Antoine Pitroudae0c632010-09-07 21:44:17 +0000667 default_gai_errnos = [
668 ('EAI_NONAME', -2),
669 ('EAI_NODATA', -5),
670 ]
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000671
672 denied = ResourceDenied("Resource '%s' is not available" % resource_name)
673 captured_errnos = errnos
Antoine Pitroudae0c632010-09-07 21:44:17 +0000674 gai_errnos = []
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000675 if not captured_errnos:
676 captured_errnos = [getattr(errno, name, num)
677 for (name, num) in default_errnos]
Antoine Pitroudae0c632010-09-07 21:44:17 +0000678 gai_errnos = [getattr(socket, name, num)
679 for (name, num) in default_gai_errnos]
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000680
681 def filter_error(err):
Antoine Pitroudae0c632010-09-07 21:44:17 +0000682 n = getattr(err, 'errno', None)
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000683 if (isinstance(err, socket.timeout) or
Antoine Pitroudae0c632010-09-07 21:44:17 +0000684 (isinstance(err, socket.gaierror) and n in gai_errnos) or
685 n in captured_errnos):
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000686 if not verbose:
687 sys.stderr.write(denied.args[0] + "\n")
688 raise denied from err
689
690 old_timeout = socket.getdefaulttimeout()
691 try:
692 if timeout is not None:
693 socket.setdefaulttimeout(timeout)
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000694 yield
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000695 except IOError as err:
696 # urllib can wrap original socket errors multiple times (!), we must
697 # unwrap to get at the original error.
698 while True:
699 a = err.args
700 if len(a) >= 1 and isinstance(a[0], IOError):
701 err = a[0]
702 # The error can also be wrapped as args[1]:
703 # except socket.error as msg:
704 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
705 elif len(a) >= 2 and isinstance(a[1], IOError):
706 err = a[1]
707 else:
708 break
709 filter_error(err)
710 raise
711 # XXX should we catch generic exceptions and look for their
712 # __cause__ or __context__?
713 finally:
714 socket.setdefaulttimeout(old_timeout)
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000715
716
717@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000718def captured_output(stream_name):
719 """Run the 'with' statement body using a StringIO object in place of a
720 specific attribute on the sys module.
721 Example use (with 'stream_name=stdout')::
Thomas Woutersed03b412007-08-28 21:37:11 +0000722
723 with captured_stdout() as s:
Neal Norwitz752abd02008-05-13 04:55:24 +0000724 print("hello")
Thomas Woutersed03b412007-08-28 21:37:11 +0000725 assert s.getvalue() == "hello"
726 """
727 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000728 orig_stdout = getattr(sys, stream_name)
729 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000730 try:
731 yield getattr(sys, stream_name)
732 finally:
733 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000734
735def captured_stdout():
736 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +0000737
Benjamin Petersone549ead2009-03-28 21:42:05 +0000738def gc_collect():
739 """Force as many objects as possible to be collected.
740
741 In non-CPython implementations of Python, this is needed because timely
742 deallocation is not guaranteed by the garbage collector. (Even in CPython
743 this can be the case in case of reference cycles.) This means that __del__
744 methods may be called later than expected and weakrefs may remain alive for
745 longer than expected. This function tries its best to force all garbage
746 objects to disappear.
747 """
Benjamin Petersone549ead2009-03-28 21:42:05 +0000748 gc.collect()
749 gc.collect()
750 gc.collect()
751
Thomas Woutersed03b412007-08-28 21:37:11 +0000752
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000753#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +0000754# Decorator for running a function in a different locale, correctly resetting
755# it afterwards.
756
757def run_with_locale(catstr, *locales):
758 def decorator(func):
759 def inner(*args, **kwds):
760 try:
761 import locale
762 category = getattr(locale, catstr)
763 orig_locale = locale.setlocale(category)
764 except AttributeError:
765 # if the test author gives us an invalid category string
766 raise
767 except:
768 # cannot retrieve original locale, so do nothing
769 locale = orig_locale = None
770 else:
771 for loc in locales:
772 try:
773 locale.setlocale(category, loc)
774 break
775 except:
776 pass
777
778 # now run the function, resetting the locale on exceptions
779 try:
780 return func(*args, **kwds)
781 finally:
782 if locale and orig_locale:
783 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +0000784 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +0000785 inner.__doc__ = func.__doc__
786 return inner
787 return decorator
788
789#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +0000790# Big-memory-test support. Separate from 'resources' because memory use
791# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000792
793# Some handy shorthands. Note that these are used for byte-limits as well
794# as size-limits, in the various bigmem tests
795_1M = 1024*1024
796_1G = 1024 * _1M
797_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000798_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +0000799
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000800MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000801
Thomas Wouters477c8d52006-05-27 19:21:47 +0000802def set_memlimit(limit):
803 import re
804 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000805 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000806 sizes = {
807 'k': 1024,
808 'm': _1M,
809 'g': _1G,
810 't': 1024*_1G,
811 }
812 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
813 re.IGNORECASE | re.VERBOSE)
814 if m is None:
815 raise ValueError('Invalid memory limit %r' % (limit,))
816 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000817 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000818 if memlimit > MAX_Py_ssize_t:
819 memlimit = MAX_Py_ssize_t
820 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000821 raise ValueError('Memory limit %r too low to be useful' % (limit,))
822 max_memuse = memlimit
823
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000824def bigmemtest(minsize, memuse):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000825 """Decorator for bigmem tests.
826
827 'minsize' is the minimum useful size for the test (in arbitrary,
828 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000829 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000830
831 The decorator tries to guess a good value for 'size' and passes it to
832 the decorated test function. If minsize * memuse is more than the
833 allowed memory use (as defined by max_memuse), the test is skipped.
834 Otherwise, minsize is adjusted upward to use up to max_memuse.
835 """
836 def decorator(f):
837 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000838 # Retrieve values in case someone decided to adjust them
839 minsize = wrapper.minsize
840 memuse = wrapper.memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000841 if not max_memuse:
842 # If max_memuse is 0 (the default),
843 # we still want to run the tests with size set to a few kb,
844 # to make sure they work. We still want to avoid using
845 # too much memory, though, but we do that noisily.
846 maxsize = 5147
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000847 self.assertFalse(maxsize * memuse > 20 * _1M)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000848 else:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000849 maxsize = int(max_memuse / memuse)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000850 if maxsize < minsize:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000851 raise unittest.SkipTest(
852 "not enough memory: %.1fG minimum needed"
853 % (minsize * memuse / (1024 ** 3)))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000854 return f(self, maxsize)
855 wrapper.minsize = minsize
856 wrapper.memuse = memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000857 return wrapper
858 return decorator
859
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000860def precisionbigmemtest(size, memuse):
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000861 def decorator(f):
862 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000863 size = wrapper.size
864 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000865 if not real_max_memuse:
866 maxsize = 5147
867 else:
868 maxsize = size
869
870 if real_max_memuse and real_max_memuse < maxsize * memuse:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000871 raise unittest.SkipTest(
872 "not enough memory: %.1fG minimum needed"
873 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000874
875 return f(self, maxsize)
876 wrapper.size = size
877 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000878 return wrapper
879 return decorator
880
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000881def bigaddrspacetest(f):
882 """Decorator for tests that fill the address space."""
883 def wrapper(self):
884 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000885 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
886 raise unittest.SkipTest(
887 "not enough memory: try a 32-bit build instead")
888 else:
889 raise unittest.SkipTest(
890 "not enough memory: %.1fG minimum needed"
891 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000892 else:
893 return f(self)
894 return wrapper
895
Thomas Wouters477c8d52006-05-27 19:21:47 +0000896#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +0000897# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000898
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000899class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000900 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000901 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000902 test(result)
903 return result
904
Benjamin Petersone549ead2009-03-28 21:42:05 +0000905def _id(obj):
906 return obj
907
908def requires_resource(resource):
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000909 if resource == 'gui' and not _is_gui_available():
910 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou27314942010-10-14 15:41:23 +0000911 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000912 return _id
913 else:
914 return unittest.skip("resource {0!r} is not enabled".format(resource))
915
916def cpython_only(test):
917 """
918 Decorator for tests only applicable on CPython.
919 """
920 return impl_detail(cpython=True)(test)
921
922def impl_detail(msg=None, **guards):
923 if check_impl_detail(**guards):
924 return _id
925 if msg is None:
926 guardnames, default = _parse_guards(guards)
927 if default:
928 msg = "implementation detail not available on {0}"
929 else:
930 msg = "implementation detail specific to {0}"
931 guardnames = sorted(guardnames.keys())
932 msg = msg.format(' or '.join(guardnames))
933 return unittest.skip(msg)
934
935def _parse_guards(guards):
936 # Returns a tuple ({platform_name: run_me}, default_value)
937 if not guards:
938 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +0000939 is_true = list(guards.values())[0]
940 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +0000941 return (guards, not is_true)
942
943# Use the following check to guard CPython's implementation-specific tests --
944# or to run them only on the implementation(s) guarded by the arguments.
945def check_impl_detail(**guards):
946 """This function returns True or False depending on the host platform.
947 Examples:
948 if check_impl_detail(): # only on CPython (default)
949 if check_impl_detail(jython=True): # only on Jython
950 if check_impl_detail(cpython=False): # everywhere except on CPython
951 """
952 guards, default = _parse_guards(guards)
953 return guards.get(platform.python_implementation().lower(), default)
954
955
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000956
Guido van Rossumd8faa362007-04-27 19:54:29 +0000957def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +0000958 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000959 if verbose:
Fred Drake84a59342001-03-23 04:21:17 +0000960 runner = unittest.TextTestRunner(sys.stdout, verbosity=2)
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000961 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000962 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000963
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000964 result = runner.run(suite)
965 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +0000966 if len(result.errors) == 1 and not result.failures:
967 err = result.errors[0][1]
968 elif len(result.failures) == 1 and not result.errors:
969 err = result.failures[0][1]
970 else:
R. David Murrayb3438b82009-10-28 14:47:15 +0000971 err = "multiple errors occurred"
972 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +0000973 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +0000974
Barry Warsawc10d6902001-09-20 06:30:41 +0000975
Walter Dörwald21d3a322003-05-01 17:45:56 +0000976def run_unittest(*classes):
977 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +0000978 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000979 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000980 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000981 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000982 if cls in sys.modules:
983 suite.addTest(unittest.findTestCases(sys.modules[cls]))
984 else:
985 raise ValueError("str arguments must be keys in sys.modules")
986 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +0000987 suite.addTest(cls)
988 else:
989 suite.addTest(unittest.makeSuite(cls))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000990 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000991
Barry Warsawc10d6902001-09-20 06:30:41 +0000992
Tim Petersa0a62222001-09-09 06:12:01 +0000993#=======================================================================
994# doctest driver.
995
996def run_doctest(module, verbosity=None):
Tim Peters17111f32001-10-03 04:08:26 +0000997 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +0000998
999 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001000 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +00001001 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +00001002 """
1003
1004 import doctest
1005
1006 if verbosity is None:
1007 verbosity = verbose
1008 else:
1009 verbosity = None
1010
Tim Peters342ca752001-09-25 19:13:20 +00001011 # Direct doctest output (normally just errors) to real stdout; doctest
1012 # output shouldn't be compared by regrtest.
1013 save_stdout = sys.stdout
Tim Peters8dee8092001-09-25 20:05:11 +00001014 sys.stdout = get_original_stdout()
Tim Peters342ca752001-09-25 19:13:20 +00001015 try:
1016 f, t = doctest.testmod(module, verbose=verbosity)
1017 if f:
1018 raise TestFailed("%d of %d doctests failed" % (f, t))
1019 finally:
1020 sys.stdout = save_stdout
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001021 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001022 print('doctest (%s) ... %d tests with zero failures' %
1023 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001024 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001025
Antoine Pitrouca154092009-11-13 16:31:51 +00001026
1027#=======================================================================
1028# Support for saving and restoring the imported modules.
1029
1030def modules_setup():
1031 return sys.modules.copy(),
1032
1033def modules_cleanup(oldmodules):
1034 # Encoders/decoders are registered permanently within the internal
1035 # codec cache. If we destroy the corresponding modules their
1036 # globals will be set to None which will trip up the cached functions.
1037 encodings = [(k, v) for k, v in sys.modules.items()
1038 if k.startswith('encodings.')]
1039 sys.modules.clear()
1040 sys.modules.update(encodings)
1041 sys.modules.update(oldmodules)
1042
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001043#=======================================================================
1044# Threading support to prevent reporting refleaks when running regrtest.py -R
1045
1046def threading_setup():
1047 import threading
1048 return len(threading._active), len(threading._limbo)
1049
1050def threading_cleanup(num_active, num_limbo):
1051 import threading
1052 import time
1053
1054 _MAX_COUNT = 10
1055 count = 0
1056 while len(threading._active) != num_active and count < _MAX_COUNT:
1057 count += 1
1058 time.sleep(0.1)
1059
1060 count = 0
1061 while len(threading._limbo) != num_limbo and count < _MAX_COUNT:
1062 count += 1
1063 time.sleep(0.1)
1064
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001065def reap_threads(func):
1066 @functools.wraps(func)
1067 def decorator(*args):
1068 key = threading_setup()
1069 try:
1070 return func(*args)
1071 finally:
1072 threading_cleanup(*key)
1073 return decorator
1074
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001075def reap_children():
1076 """Use this function at the end of test_main() whenever sub-processes
1077 are started. This will help ensure that no extra children (zombies)
1078 stick around to hog resources and create problems when looking
1079 for refleaks.
1080 """
1081
1082 # Reap all our dead child processes so we don't leave zombies around.
1083 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001084 if hasattr(os, 'waitpid'):
1085 any_process = -1
1086 while True:
1087 try:
1088 # This will raise an exception on Windows. That's ok.
1089 pid, status = os.waitpid(any_process, os.WNOHANG)
1090 if pid == 0:
1091 break
1092 except:
1093 break
Antoine Pitrouf50a6b62011-01-03 18:36:36 +00001094
1095def strip_python_stderr(stderr):
1096 """Strip the stderr of a Python process from potential debug output
1097 emitted by the interpreter.
1098
1099 This will typically be run on the result of the communicate() method
1100 of a subprocess.Popen object.
1101 """
1102 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
1103 return stderr
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001104
1105def patch(test_instance, object_to_patch, attr_name, new_value):
1106 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1107
1108 Also, add a cleanup procedure to 'test_instance' to restore
1109 'object_to_patch' value for 'attr_name'.
1110 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1111
1112 """
1113 # check that 'attr_name' is a real attribute for 'object_to_patch'
1114 # will raise AttributeError if it does not exist
1115 getattr(object_to_patch, attr_name)
1116
1117 # keep a copy of the old value
1118 attr_is_local = False
1119 try:
1120 old_value = object_to_patch.__dict__[attr_name]
1121 except (AttributeError, KeyError):
1122 old_value = getattr(object_to_patch, attr_name, None)
1123 else:
1124 attr_is_local = True
1125
1126 # restore the value when the test is done
1127 def cleanup():
1128 if attr_is_local:
1129 setattr(object_to_patch, attr_name, old_value)
1130 else:
1131 delattr(object_to_patch, attr_name)
1132
1133 test_instance.addCleanup(cleanup)
1134
1135 # actually override the attribute
1136 setattr(object_to_patch, attr_name, new_value)