blob: dcfadeaab6446fd3dca4bbe737e6f341af09046b [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 Raise ImportError if the module can't be imported."""
Ezio Melottifec3ad12011-05-14 06:02:25 +030084 # try to import the module and raise an error if it can't be imported
85 if name not in sys.modules:
Ezio Melotti199e0852011-05-09 06:41:55 +030086 __import__(name)
Nick Coghlan47384702009-04-22 16:13:36 +000087 del sys.modules[name]
Ezio Melottifec3ad12011-05-14 06:02:25 +030088 for modname in list(sys.modules):
89 if modname == name or modname.startswith(name + '.'):
90 orig_modules[modname] = sys.modules[modname]
91 del sys.modules[modname]
Nick Coghlan47384702009-04-22 16:13:36 +000092
93def _save_and_block_module(name, orig_modules):
94 """Helper function to save and block a module in sys.modules
95
Ezio Melotti199e0852011-05-09 06:41:55 +030096 Return True if the module was in sys.modules, False otherwise."""
Nick Coghlan47384702009-04-22 16:13:36 +000097 saved = True
98 try:
99 orig_modules[name] = sys.modules[name]
100 except KeyError:
101 saved = False
Alexander Belopolsky0a5d9a22010-07-13 14:55:04 +0000102 sys.modules[name] = None
Nick Coghlan47384702009-04-22 16:13:36 +0000103 return saved
104
105
106def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000107 """Imports and returns a module, deliberately bypassing the sys.modules cache
108 and importing a fresh copy of the module. Once the import is complete,
109 the sys.modules cache is restored to its original state.
110
Nick Coghlan47384702009-04-22 16:13:36 +0000111 Modules named in fresh are also imported anew if needed by the import.
Ezio Melotti199e0852011-05-09 06:41:55 +0300112 If one of these modules can't be imported, None is returned.
Nick Coghlan47384702009-04-22 16:13:36 +0000113
114 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000115 takes place.
116
117 If deprecated is True, any module or package deprecation messages
118 will be suppressed."""
119 # NOTE: test_heapq and test_warnings include extra sanity checks to make
120 # sure that this utility function is working as expected
121 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000122 # Keep track of modules saved for later restoration as well
123 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000124 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000125 names_to_remove = []
126 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000127 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000128 for fresh_name in fresh:
129 _save_and_remove_module(fresh_name, orig_modules)
130 for blocked_name in blocked:
131 if not _save_and_block_module(blocked_name, orig_modules):
132 names_to_remove.append(blocked_name)
133 fresh_module = importlib.import_module(name)
Ezio Melotti199e0852011-05-09 06:41:55 +0300134 except ImportError:
135 fresh_module = None
Nick Coghlanfce769e2009-04-11 14:30:59 +0000136 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000137 for orig_name, module in orig_modules.items():
138 sys.modules[orig_name] = module
139 for name_to_remove in names_to_remove:
140 del sys.modules[name_to_remove]
141 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000142
Benjamin Peterson699adb92008-05-08 22:27:58 +0000143
R. David Murraya21e4ca2009-03-31 23:16:50 +0000144def get_attribute(obj, name):
145 """Get an attribute, raising SkipTest if AttributeError is raised."""
146 try:
147 attribute = getattr(obj, name)
148 except AttributeError:
149 raise unittest.SkipTest("module %s has no attribute %s" % (
150 obj.__name__, name))
151 else:
152 return attribute
153
Barry Warsawc0fb6052001-08-20 22:29:23 +0000154verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000155use_resources = None # Flag set to [] by regrtest.py
156max_memuse = 0 # Disable bigmem tests (they will still be run with
157 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000158real_max_memuse = 0
Guido van Rossum531661c1996-12-20 02:58:22 +0000159
Tim Peters8dee8092001-09-25 20:05:11 +0000160# _original_stdout is meant to hold stdout at the time regrtest began.
161# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
162# The point is to have some flavor of stdout the user can actually see.
163_original_stdout = None
164def record_original_stdout(stdout):
165 global _original_stdout
166 _original_stdout = stdout
167
168def get_original_stdout():
169 return _original_stdout or sys.stdout
170
Guido van Rossum3bead091992-01-27 17:00:37 +0000171def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000172 try:
173 del sys.modules[name]
174 except KeyError:
175 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000176
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000177def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000178 try:
179 os.unlink(filename)
180 except OSError:
181 pass
182
Christian Heimes23daade02008-02-25 12:39:23 +0000183def rmtree(path):
184 try:
185 shutil.rmtree(path)
186 except OSError as e:
187 # Unix returns ENOENT, Windows returns ESRCH.
188 if e.errno not in (errno.ENOENT, errno.ESRCH):
189 raise
190
Guido van Rossum3bead091992-01-27 17:00:37 +0000191def forget(modname):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000192 '''"Forget" a module was ever imported by removing it from sys.modules and
193 deleting any .pyc and .pyo files.'''
Fred Drake004d5e62000-10-23 17:22:08 +0000194 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000195 for dirname in sys.path:
Skip Montanaro7a98be22007-08-16 14:35:24 +0000196 unlink(os.path.join(dirname, modname + '.pyc'))
Brett Cannonf1cfb622003-05-04 21:15:27 +0000197 # Deleting the .pyo file cannot be within the 'try' for the .pyc since
198 # the chance exists that there is no .pyc (and thus the 'try' statement
199 # is exited) but there is a .pyo file.
Skip Montanaro7a98be22007-08-16 14:35:24 +0000200 unlink(os.path.join(dirname, modname + '.pyo'))
Guido van Rossum3bead091992-01-27 17:00:37 +0000201
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000202# On some platforms, should not run gui test even if it is allowed
203# in `use_resources'.
204if sys.platform.startswith('win'):
205 import ctypes
206 import ctypes.wintypes
207 def _is_gui_available():
208 UOI_FLAGS = 1
209 WSF_VISIBLE = 0x0001
210 class USEROBJECTFLAGS(ctypes.Structure):
211 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
212 ("fReserved", ctypes.wintypes.BOOL),
213 ("dwFlags", ctypes.wintypes.DWORD)]
214 dll = ctypes.windll.user32
215 h = dll.GetProcessWindowStation()
216 if not h:
217 raise ctypes.WinError()
218 uof = USEROBJECTFLAGS()
219 needed = ctypes.wintypes.DWORD()
220 res = dll.GetUserObjectInformationW(h,
221 UOI_FLAGS,
222 ctypes.byref(uof),
223 ctypes.sizeof(uof),
224 ctypes.byref(needed))
225 if not res:
226 raise ctypes.WinError()
227 return bool(uof.dwFlags & WSF_VISIBLE)
228else:
229 def _is_gui_available():
230 return True
231
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000232def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000233 """Test whether a resource is enabled. Known resources are set by
234 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000235 return use_resources is not None and resource in use_resources
236
Barry Warsawc0fb6052001-08-20 22:29:23 +0000237def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000238 """Raise ResourceDenied if the specified resource is not available.
239
240 If the caller's module is __main__ then automatically return True. The
241 possibility of False being returned occurs when regrtest.py is executing."""
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000242 if resource == 'gui' and not _is_gui_available():
243 raise unittest.SkipTest("Cannot use the 'gui' resource")
Skip Montanarod839ecd2003-04-24 19:06:57 +0000244 # see if the caller's module is __main__ - if so, treat as if
245 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000246 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000247 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000248 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000249 if msg is None:
250 msg = "Use of the `%s' resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000251 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000252
Christian Heimes5e696852008-04-09 08:37:03 +0000253HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000254
Christian Heimes5e696852008-04-09 08:37:03 +0000255def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
256 """Returns an unused port that should be suitable for binding. This is
257 achieved by creating a temporary socket with the same family and type as
258 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
259 the specified host address (defaults to 0.0.0.0) with the port set to 0,
260 eliciting an unused ephemeral port from the OS. The temporary socket is
261 then closed and deleted, and the ephemeral port is returned.
262
263 Either this method or bind_port() should be used for any tests where a
264 server socket needs to be bound to a particular port for the duration of
265 the test. Which one to use depends on whether the calling code is creating
266 a python socket, or if an unused port needs to be provided in a constructor
267 or passed to an external program (i.e. the -accept argument to openssl's
268 s_server mode). Always prefer bind_port() over find_unused_port() where
269 possible. Hard coded ports should *NEVER* be used. As soon as a server
270 socket is bound to a hard coded port, the ability to run multiple instances
271 of the test simultaneously on the same host is compromised, which makes the
272 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
273 may simply manifest as a failed test, which can be recovered from without
274 intervention in most cases, but on Windows, the entire python process can
275 completely and utterly wedge, requiring someone to log in to the buildbot
276 and manually kill the affected process.
277
278 (This is easy to reproduce on Windows, unfortunately, and can be traced to
279 the SO_REUSEADDR socket option having different semantics on Windows versus
280 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
281 listen and then accept connections on identical host/ports. An EADDRINUSE
282 socket.error will be raised at some point (depending on the platform and
283 the order bind and listen were called on each socket).
284
285 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
286 will ever be raised when attempting to bind two identical host/ports. When
287 accept() is called on each socket, the second caller's process will steal
288 the port from the first caller, leaving them both in an awkwardly wedged
289 state where they'll no longer respond to any signals or graceful kills, and
290 must be forcibly killed via OpenProcess()/TerminateProcess().
291
292 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
293 instead of SO_REUSEADDR, which effectively affords the same semantics as
294 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
295 Source world compared to Windows ones, this is a common mistake. A quick
296 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
297 openssl.exe is called with the 's_server' option, for example. See
298 http://bugs.python.org/issue2550 for more info. The following site also
299 has a very thorough description about the implications of both REUSEADDR
300 and EXCLUSIVEADDRUSE on Windows:
301 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
302
303 XXX: although this approach is a vast improvement on previous attempts to
304 elicit unused ports, it rests heavily on the assumption that the ephemeral
305 port returned to us by the OS won't immediately be dished back out to some
306 other process when we close and delete our temporary socket but before our
307 calling code has a chance to bind the returned port. We can deal with this
308 issue if/when we come across it.
309 """
310
311 tempsock = socket.socket(family, socktype)
312 port = bind_port(tempsock)
313 tempsock.close()
314 del tempsock
315 return port
316
317def bind_port(sock, host=HOST):
318 """Bind the socket to a free port and return the port number. Relies on
319 ephemeral ports in order to ensure we are using an unbound port. This is
320 important as many tests may be running simultaneously, especially in a
321 buildbot environment. This method raises an exception if the sock.family
322 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
323 or SO_REUSEPORT set on it. Tests should *never* set these socket options
324 for TCP/IP sockets. The only case for setting these options is testing
325 multicasting via multiple UDP sockets.
326
327 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
328 on Windows), it will be set on the socket. This will prevent anyone else
329 from bind()'ing to our host/port for the duration of the test.
330 """
331
332 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
333 if hasattr(socket, 'SO_REUSEADDR'):
334 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
335 raise TestFailed("tests should never set the SO_REUSEADDR " \
336 "socket option on TCP/IP sockets!")
337 if hasattr(socket, 'SO_REUSEPORT'):
338 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
339 raise TestFailed("tests should never set the SO_REUSEPORT " \
340 "socket option on TCP/IP sockets!")
341 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
342 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
343
344 sock.bind((host, 0))
345 port = sock.getsockname()[1]
346 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000347
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000348FUZZ = 1e-6
349
350def fcmp(x, y): # fuzzy comparison function
Neal Norwitz79212992006-08-21 16:27:31 +0000351 if isinstance(x, float) or isinstance(y, float):
Fred Drake004d5e62000-10-23 17:22:08 +0000352 try:
Fred Drake004d5e62000-10-23 17:22:08 +0000353 fuzz = (abs(x) + abs(y)) * FUZZ
354 if abs(x-y) <= fuzz:
355 return 0
356 except:
357 pass
Neal Norwitz79212992006-08-21 16:27:31 +0000358 elif type(x) == type(y) and isinstance(x, (tuple, list)):
Fred Drake004d5e62000-10-23 17:22:08 +0000359 for i in range(min(len(x), len(y))):
360 outcome = fcmp(x[i], y[i])
Fred Drake132dce22000-12-12 23:11:42 +0000361 if outcome != 0:
Fred Drake004d5e62000-10-23 17:22:08 +0000362 return outcome
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000363 return (len(x) > len(y)) - (len(x) < len(y))
364 return (x > y) - (x < y)
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000365
Finn Bock57bc5fa2002-11-01 18:02:03 +0000366is_jython = sys.platform.startswith('java')
367
Barry Warsaw559f6682001-03-23 18:04:02 +0000368# Filename used for testing
369if os.name == 'java':
370 # Jython disallows @ in module names
371 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000372else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000373 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000374
375 # Assuming sys.getfilesystemencoding()!=sys.getdefaultencoding()
376 # TESTFN_UNICODE is a filename that can be encoded using the
377 # file system encoding, but *not* with the default (ascii) encoding
378 TESTFN_UNICODE = "@test-\xe0\xf2"
379 TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner0ea31a92010-09-10 12:32:58 +0000380 # TESTFN_UNENCODABLE is a filename that should *not* be
Walter Dörwald9b775532007-06-08 14:30:53 +0000381 # able to be encoded by *either* the default or filesystem encoding.
382 # This test really only makes sense on Windows NT platforms
383 # which have special Unicode support in posixmodule.
384 if (not hasattr(sys, "getwindowsversion") or
385 sys.getwindowsversion()[3] < 2): # 0=win32s or 1=9x/ME
Victor Stinner0ea31a92010-09-10 12:32:58 +0000386 TESTFN_UNENCODABLE = None
Walter Dörwald9b775532007-06-08 14:30:53 +0000387 else:
Victor Stinner0d823ed2010-09-10 12:19:37 +0000388 # Different kinds of characters from various languages to minimize the
389 # probability that the whole name is encodable to MBCS (issue #9819)
390 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Walter Dörwald9b775532007-06-08 14:30:53 +0000391 try:
392 # XXX - Note - should be using TESTFN_ENCODING here - but for
393 # Windows, "mbcs" currently always operates as if in
394 # errors=ignore' mode - hence we get '?' characters rather than
395 # the exception. 'Latin1' operates as we expect - ie, fails.
396 # See [ 850997 ] mbcs encoding ignores errors
Victor Stinner0ea31a92010-09-10 12:32:58 +0000397 TESTFN_UNENCODABLE.encode("Latin1")
Walter Dörwald9b775532007-06-08 14:30:53 +0000398 except UnicodeEncodeError:
399 pass
Martin v. Löwis2411a2d2002-11-09 19:57:26 +0000400 else:
Georg Brandldb028442008-02-05 20:48:58 +0000401 print('WARNING: The filename %r CAN be encoded by the filesystem. '
402 'Unicode filename tests may not be effective'
Victor Stinner0ea31a92010-09-10 12:32:58 +0000403 % TESTFN_UNENCODABLE)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000404
Victor Stinner7f6423a2010-05-14 20:08:55 +0000405if os.path.isdir(TESTFN):
406 # a test failed (eg. test_os) without removing TESTFN directory
407 shutil.rmtree(TESTFN)
408
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000409# Make sure we can write to TESTFN, try in /tmp if we can't
410fp = None
411try:
412 fp = open(TESTFN, 'w+')
413except IOError:
414 TMP_TESTFN = os.path.join('/tmp', TESTFN)
415 try:
416 fp = open(TMP_TESTFN, 'w+')
417 TESTFN = TMP_TESTFN
418 del TMP_TESTFN
419 except IOError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000420 print(('WARNING: tests will fail, unable to write to: %s or %s' %
421 (TESTFN, TMP_TESTFN)))
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000422if fp is not None:
423 fp.close()
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000424 unlink(TESTFN)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000425del fp
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000426
Victor Stinner3f682ad2010-07-13 23:14:46 +0000427def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000428 """Try to find a file on sys.path and the working directory. If it is not
429 found the argument passed to the function is returned (this does not
430 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000431 if os.path.isabs(file):
432 return file
Victor Stinner3f682ad2010-07-13 23:14:46 +0000433 if subdir is not None:
434 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000435 path = sys.path
436 path = [os.path.dirname(here)] + path
437 for dn in path:
438 fn = os.path.join(dn, file)
439 if os.path.exists(fn): return fn
440 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000441
Ezio Melotti2aef4b82010-01-25 12:20:04 +0000442def verify(condition, reason='test failed'):
443 """Verify that condition is true. If not, raise TestFailed.
444
445 The optional argument reason can be given to provide
446 a better error text.
447 """
448
449 if not condition:
450 raise TestFailed(reason)
451
452def vereq(a, b):
453 """Raise TestFailed if a == b is false.
454
455 This is better than verify(a == b) because, in case of failure, the
456 error message incorporates repr(a) and repr(b) so you can see the
457 inputs.
458
459 Note that "not (a == b)" isn't necessarily the same as "a != b"; the
460 former is tested.
461 """
462
463 if not (a == b):
464 raise TestFailed("%r == %r" % (a, b))
465
Tim Peters2f228e72001-05-13 00:19:31 +0000466def sortdict(dict):
467 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000468 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000469 reprpairs = ["%r: %r" % pair for pair in items]
470 withcommas = ", ".join(reprpairs)
471 return "{%s}" % withcommas
472
Benjamin Peterson7522c742009-01-19 21:00:09 +0000473def make_bad_fd():
474 """
475 Create an invalid file descriptor by opening and closing a file and return
476 its fd.
477 """
478 file = open(TESTFN, "wb")
479 try:
480 return file.fileno()
481 finally:
482 file.close()
483 unlink(TESTFN)
484
Thomas Wouters89f507f2006-12-13 04:49:30 +0000485def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000486 testcase.assertRaises(SyntaxError, compile, statement,
487 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000488
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000489def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000490 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000491
Guido van Rossum360e4b82007-05-14 22:51:27 +0000492 requires('urlfetch')
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000493 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000494
495 for path in [os.path.curdir, os.path.pardir]:
496 fn = os.path.join(path, filename)
497 if os.path.exists(fn):
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000498 return open(fn, *args, **kw)
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000499
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000500 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitrouec416612009-11-01 22:28:14 +0000501 f = urllib.request.urlopen(url, timeout=15)
502 try:
503 with open(filename, "wb") as out:
504 s = f.read()
505 while s:
506 out.write(s)
507 s = f.read()
508 finally:
509 f.close()
510 return open(filename, *args, **kw)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000511
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000512class WarningsRecorder(object):
513 """Convenience wrapper for the warnings list returned on
514 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000515 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000516 def __init__(self, warnings_list):
517 self.warnings = warnings_list
518
519 def __getattr__(self, attr):
520 if self.warnings:
521 return getattr(self.warnings[-1], attr)
522 elif attr in warnings.WarningMessage._WARNING_DETAILS:
523 return None
524 raise AttributeError("%r has no attribute %r" % (self, attr))
525
526 def reset(self):
527 del self.warnings[:]
528
529@contextlib.contextmanager
530def check_warnings():
531 with warnings.catch_warnings(record=True) as w:
532 yield WarningsRecorder(w)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000533
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000534
535class CleanImport(object):
536 """Context manager to force import to return a new module reference.
537
538 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000539 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000540
541 Use like this:
542
543 with CleanImport("foo"):
544 __import__("foo") # new reference
545 """
546
547 def __init__(self, *module_names):
548 self.original_modules = sys.modules.copy()
549 for module_name in module_names:
550 if module_name in sys.modules:
551 module = sys.modules[module_name]
552 # It is possible that module_name is just an alias for
553 # another module (e.g. stub for modules renamed in 3.x).
554 # In that case, we also need delete the real module to clear
555 # the import cache.
556 if module.__name__ != module_name:
557 del sys.modules[module.__name__]
558 del sys.modules[module_name]
559
560 def __enter__(self):
561 return self
562
563 def __exit__(self, *ignore_exc):
564 sys.modules.update(self.original_modules)
565
566
Walter Dörwald155374d2009-05-01 19:58:58 +0000567class EnvironmentVarGuard(collections.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000568
569 """Class to help protect the environment variable properly. Can be used as
570 a context manager."""
571
572 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000573 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000574 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000575
Walter Dörwald155374d2009-05-01 19:58:58 +0000576 def __getitem__(self, envvar):
577 return self._environ[envvar]
578
579 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000580 # Remember the initial value on the first access
581 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +0000582 self._changed[envvar] = self._environ.get(envvar)
583 self._environ[envvar] = value
584
585 def __delitem__(self, envvar):
586 # Remember the initial value on the first access
587 if envvar not in self._changed:
588 self._changed[envvar] = self._environ.get(envvar)
589 if envvar in self._environ:
590 del self._environ[envvar]
591
592 def keys(self):
593 return self._environ.keys()
594
595 def __iter__(self):
596 return iter(self._environ)
597
598 def __len__(self):
599 return len(self._environ)
600
601 def set(self, envvar, value):
602 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000603
604 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +0000605 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000606
607 def __enter__(self):
608 return self
609
610 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000611 for (k, v) in self._changed.items():
612 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +0000613 if k in self._environ:
614 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +0000615 else:
Walter Dörwald155374d2009-05-01 19:58:58 +0000616 self._environ[k] = v
617
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000618
Guido van Rossumd8faa362007-04-27 19:54:29 +0000619class TransientResource(object):
620
621 """Raise ResourceDenied if an exception is raised while the context manager
622 is in effect that matches the specified exception and attributes."""
623
624 def __init__(self, exc, **kwargs):
625 self.exc = exc
626 self.attrs = kwargs
627
628 def __enter__(self):
629 return self
630
631 def __exit__(self, type_=None, value=None, traceback=None):
632 """If type_ is a subclass of self.exc and value has attributes matching
633 self.attrs, raise ResourceDenied. Otherwise let the exception
634 propagate (if any)."""
635 if type_ is not None and issubclass(self.exc, type_):
636 for attr, attr_value in self.attrs.items():
637 if not hasattr(value, attr):
638 break
639 if getattr(value, attr) != attr_value:
640 break
641 else:
642 raise ResourceDenied("an optional resource is not available")
643
Raymond Hettinger686057b2009-06-04 00:11:54 +0000644# Context managers that raise ResourceDenied when various issues
645# with the Internet connection manifest themselves as exceptions.
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000646# XXX deprecate these and use transient_internet() instead
Raymond Hettinger686057b2009-06-04 00:11:54 +0000647time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
648socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
649ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000650
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000651
Thomas Woutersed03b412007-08-28 21:37:11 +0000652@contextlib.contextmanager
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000653def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000654 """Return a context manager that raises ResourceDenied when various issues
655 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000656 default_errnos = [
657 ('ECONNREFUSED', 111),
658 ('ECONNRESET', 104),
Antoine Pitrou50778ab2011-01-08 10:31:09 +0000659 ('EHOSTUNREACH', 113),
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000660 ('ENETUNREACH', 101),
661 ('ETIMEDOUT', 110),
662 ]
Antoine Pitroudae0c632010-09-07 21:44:17 +0000663 default_gai_errnos = [
664 ('EAI_NONAME', -2),
665 ('EAI_NODATA', -5),
666 ]
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000667
668 denied = ResourceDenied("Resource '%s' is not available" % resource_name)
669 captured_errnos = errnos
Antoine Pitroudae0c632010-09-07 21:44:17 +0000670 gai_errnos = []
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000671 if not captured_errnos:
672 captured_errnos = [getattr(errno, name, num)
673 for (name, num) in default_errnos]
Antoine Pitroudae0c632010-09-07 21:44:17 +0000674 gai_errnos = [getattr(socket, name, num)
675 for (name, num) in default_gai_errnos]
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000676
677 def filter_error(err):
Antoine Pitroudae0c632010-09-07 21:44:17 +0000678 n = getattr(err, 'errno', None)
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000679 if (isinstance(err, socket.timeout) or
Antoine Pitroudae0c632010-09-07 21:44:17 +0000680 (isinstance(err, socket.gaierror) and n in gai_errnos) or
681 n in captured_errnos):
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000682 if not verbose:
683 sys.stderr.write(denied.args[0] + "\n")
684 raise denied from err
685
686 old_timeout = socket.getdefaulttimeout()
687 try:
688 if timeout is not None:
689 socket.setdefaulttimeout(timeout)
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000690 yield
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000691 except IOError as err:
692 # urllib can wrap original socket errors multiple times (!), we must
693 # unwrap to get at the original error.
694 while True:
695 a = err.args
696 if len(a) >= 1 and isinstance(a[0], IOError):
697 err = a[0]
698 # The error can also be wrapped as args[1]:
699 # except socket.error as msg:
700 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
701 elif len(a) >= 2 and isinstance(a[1], IOError):
702 err = a[1]
703 else:
704 break
705 filter_error(err)
706 raise
707 # XXX should we catch generic exceptions and look for their
708 # __cause__ or __context__?
709 finally:
710 socket.setdefaulttimeout(old_timeout)
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000711
712
713@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000714def captured_output(stream_name):
715 """Run the 'with' statement body using a StringIO object in place of a
716 specific attribute on the sys module.
717 Example use (with 'stream_name=stdout')::
Thomas Woutersed03b412007-08-28 21:37:11 +0000718
719 with captured_stdout() as s:
Neal Norwitz752abd02008-05-13 04:55:24 +0000720 print("hello")
Thomas Woutersed03b412007-08-28 21:37:11 +0000721 assert s.getvalue() == "hello"
722 """
723 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000724 orig_stdout = getattr(sys, stream_name)
725 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000726 try:
727 yield getattr(sys, stream_name)
728 finally:
729 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000730
731def captured_stdout():
732 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +0000733
Benjamin Petersone549ead2009-03-28 21:42:05 +0000734def gc_collect():
735 """Force as many objects as possible to be collected.
736
737 In non-CPython implementations of Python, this is needed because timely
738 deallocation is not guaranteed by the garbage collector. (Even in CPython
739 this can be the case in case of reference cycles.) This means that __del__
740 methods may be called later than expected and weakrefs may remain alive for
741 longer than expected. This function tries its best to force all garbage
742 objects to disappear.
743 """
Benjamin Petersone549ead2009-03-28 21:42:05 +0000744 gc.collect()
745 gc.collect()
746 gc.collect()
747
Thomas Woutersed03b412007-08-28 21:37:11 +0000748
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000749#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +0000750# Decorator for running a function in a different locale, correctly resetting
751# it afterwards.
752
753def run_with_locale(catstr, *locales):
754 def decorator(func):
755 def inner(*args, **kwds):
756 try:
757 import locale
758 category = getattr(locale, catstr)
759 orig_locale = locale.setlocale(category)
760 except AttributeError:
761 # if the test author gives us an invalid category string
762 raise
763 except:
764 # cannot retrieve original locale, so do nothing
765 locale = orig_locale = None
766 else:
767 for loc in locales:
768 try:
769 locale.setlocale(category, loc)
770 break
771 except:
772 pass
773
774 # now run the function, resetting the locale on exceptions
775 try:
776 return func(*args, **kwds)
777 finally:
778 if locale and orig_locale:
779 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +0000780 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +0000781 inner.__doc__ = func.__doc__
782 return inner
783 return decorator
784
785#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +0000786# Big-memory-test support. Separate from 'resources' because memory use
787# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000788
789# Some handy shorthands. Note that these are used for byte-limits as well
790# as size-limits, in the various bigmem tests
791_1M = 1024*1024
792_1G = 1024 * _1M
793_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000794_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +0000795
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000796MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000797
Thomas Wouters477c8d52006-05-27 19:21:47 +0000798def set_memlimit(limit):
799 import re
800 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000801 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000802 sizes = {
803 'k': 1024,
804 'm': _1M,
805 'g': _1G,
806 't': 1024*_1G,
807 }
808 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
809 re.IGNORECASE | re.VERBOSE)
810 if m is None:
811 raise ValueError('Invalid memory limit %r' % (limit,))
812 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000813 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000814 if memlimit > MAX_Py_ssize_t:
815 memlimit = MAX_Py_ssize_t
816 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000817 raise ValueError('Memory limit %r too low to be useful' % (limit,))
818 max_memuse = memlimit
819
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000820def bigmemtest(minsize, memuse):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000821 """Decorator for bigmem tests.
822
823 'minsize' is the minimum useful size for the test (in arbitrary,
824 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000825 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000826
827 The decorator tries to guess a good value for 'size' and passes it to
828 the decorated test function. If minsize * memuse is more than the
829 allowed memory use (as defined by max_memuse), the test is skipped.
830 Otherwise, minsize is adjusted upward to use up to max_memuse.
831 """
832 def decorator(f):
833 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000834 # Retrieve values in case someone decided to adjust them
835 minsize = wrapper.minsize
836 memuse = wrapper.memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000837 if not max_memuse:
838 # If max_memuse is 0 (the default),
839 # we still want to run the tests with size set to a few kb,
840 # to make sure they work. We still want to avoid using
841 # too much memory, though, but we do that noisily.
842 maxsize = 5147
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000843 self.assertFalse(maxsize * memuse > 20 * _1M)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000844 else:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000845 maxsize = int(max_memuse / memuse)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000846 if maxsize < minsize:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000847 raise unittest.SkipTest(
848 "not enough memory: %.1fG minimum needed"
849 % (minsize * memuse / (1024 ** 3)))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000850 return f(self, maxsize)
851 wrapper.minsize = minsize
852 wrapper.memuse = memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000853 return wrapper
854 return decorator
855
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000856def precisionbigmemtest(size, memuse):
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000857 def decorator(f):
858 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000859 size = wrapper.size
860 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000861 if not real_max_memuse:
862 maxsize = 5147
863 else:
864 maxsize = size
865
866 if real_max_memuse and real_max_memuse < maxsize * memuse:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000867 raise unittest.SkipTest(
868 "not enough memory: %.1fG minimum needed"
869 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000870
871 return f(self, maxsize)
872 wrapper.size = size
873 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000874 return wrapper
875 return decorator
876
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000877def bigaddrspacetest(f):
878 """Decorator for tests that fill the address space."""
879 def wrapper(self):
880 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000881 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
882 raise unittest.SkipTest(
883 "not enough memory: try a 32-bit build instead")
884 else:
885 raise unittest.SkipTest(
886 "not enough memory: %.1fG minimum needed"
887 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000888 else:
889 return f(self)
890 return wrapper
891
Thomas Wouters477c8d52006-05-27 19:21:47 +0000892#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +0000893# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000894
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000895class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000896 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000897 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000898 test(result)
899 return result
900
Benjamin Petersone549ead2009-03-28 21:42:05 +0000901def _id(obj):
902 return obj
903
904def requires_resource(resource):
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000905 if resource == 'gui' and not _is_gui_available():
906 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou27314942010-10-14 15:41:23 +0000907 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000908 return _id
909 else:
910 return unittest.skip("resource {0!r} is not enabled".format(resource))
911
912def cpython_only(test):
913 """
914 Decorator for tests only applicable on CPython.
915 """
916 return impl_detail(cpython=True)(test)
917
918def impl_detail(msg=None, **guards):
919 if check_impl_detail(**guards):
920 return _id
921 if msg is None:
922 guardnames, default = _parse_guards(guards)
923 if default:
924 msg = "implementation detail not available on {0}"
925 else:
926 msg = "implementation detail specific to {0}"
927 guardnames = sorted(guardnames.keys())
928 msg = msg.format(' or '.join(guardnames))
929 return unittest.skip(msg)
930
931def _parse_guards(guards):
932 # Returns a tuple ({platform_name: run_me}, default_value)
933 if not guards:
934 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +0000935 is_true = list(guards.values())[0]
936 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +0000937 return (guards, not is_true)
938
939# Use the following check to guard CPython's implementation-specific tests --
940# or to run them only on the implementation(s) guarded by the arguments.
941def check_impl_detail(**guards):
942 """This function returns True or False depending on the host platform.
943 Examples:
944 if check_impl_detail(): # only on CPython (default)
945 if check_impl_detail(jython=True): # only on Jython
946 if check_impl_detail(cpython=False): # everywhere except on CPython
947 """
948 guards, default = _parse_guards(guards)
949 return guards.get(platform.python_implementation().lower(), default)
950
951
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000952
Guido van Rossumd8faa362007-04-27 19:54:29 +0000953def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +0000954 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000955 if verbose:
Fred Drake84a59342001-03-23 04:21:17 +0000956 runner = unittest.TextTestRunner(sys.stdout, verbosity=2)
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000957 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000958 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000959
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000960 result = runner.run(suite)
961 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +0000962 if len(result.errors) == 1 and not result.failures:
963 err = result.errors[0][1]
964 elif len(result.failures) == 1 and not result.errors:
965 err = result.failures[0][1]
966 else:
R. David Murrayb3438b82009-10-28 14:47:15 +0000967 err = "multiple errors occurred"
968 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +0000969 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +0000970
Barry Warsawc10d6902001-09-20 06:30:41 +0000971
Walter Dörwald21d3a322003-05-01 17:45:56 +0000972def run_unittest(*classes):
973 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +0000974 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000975 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000976 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000977 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000978 if cls in sys.modules:
979 suite.addTest(unittest.findTestCases(sys.modules[cls]))
980 else:
981 raise ValueError("str arguments must be keys in sys.modules")
982 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +0000983 suite.addTest(cls)
984 else:
985 suite.addTest(unittest.makeSuite(cls))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000986 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000987
Barry Warsawc10d6902001-09-20 06:30:41 +0000988
Tim Petersa0a62222001-09-09 06:12:01 +0000989#=======================================================================
990# doctest driver.
991
992def run_doctest(module, verbosity=None):
Tim Peters17111f32001-10-03 04:08:26 +0000993 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +0000994
995 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000996 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +0000997 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +0000998 """
999
1000 import doctest
1001
1002 if verbosity is None:
1003 verbosity = verbose
1004 else:
1005 verbosity = None
1006
Tim Peters342ca752001-09-25 19:13:20 +00001007 # Direct doctest output (normally just errors) to real stdout; doctest
1008 # output shouldn't be compared by regrtest.
1009 save_stdout = sys.stdout
Tim Peters8dee8092001-09-25 20:05:11 +00001010 sys.stdout = get_original_stdout()
Tim Peters342ca752001-09-25 19:13:20 +00001011 try:
1012 f, t = doctest.testmod(module, verbose=verbosity)
1013 if f:
1014 raise TestFailed("%d of %d doctests failed" % (f, t))
1015 finally:
1016 sys.stdout = save_stdout
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001017 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001018 print('doctest (%s) ... %d tests with zero failures' %
1019 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001020 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001021
Antoine Pitrouca154092009-11-13 16:31:51 +00001022
1023#=======================================================================
1024# Support for saving and restoring the imported modules.
1025
1026def modules_setup():
1027 return sys.modules.copy(),
1028
1029def modules_cleanup(oldmodules):
1030 # Encoders/decoders are registered permanently within the internal
1031 # codec cache. If we destroy the corresponding modules their
1032 # globals will be set to None which will trip up the cached functions.
1033 encodings = [(k, v) for k, v in sys.modules.items()
1034 if k.startswith('encodings.')]
1035 sys.modules.clear()
1036 sys.modules.update(encodings)
1037 sys.modules.update(oldmodules)
1038
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001039#=======================================================================
1040# Threading support to prevent reporting refleaks when running regrtest.py -R
1041
1042def threading_setup():
1043 import threading
1044 return len(threading._active), len(threading._limbo)
1045
1046def threading_cleanup(num_active, num_limbo):
1047 import threading
1048 import time
1049
1050 _MAX_COUNT = 10
1051 count = 0
1052 while len(threading._active) != num_active and count < _MAX_COUNT:
1053 count += 1
1054 time.sleep(0.1)
1055
1056 count = 0
1057 while len(threading._limbo) != num_limbo and count < _MAX_COUNT:
1058 count += 1
1059 time.sleep(0.1)
1060
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001061def reap_threads(func):
1062 @functools.wraps(func)
1063 def decorator(*args):
1064 key = threading_setup()
1065 try:
1066 return func(*args)
1067 finally:
1068 threading_cleanup(*key)
1069 return decorator
1070
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001071def reap_children():
1072 """Use this function at the end of test_main() whenever sub-processes
1073 are started. This will help ensure that no extra children (zombies)
1074 stick around to hog resources and create problems when looking
1075 for refleaks.
1076 """
1077
1078 # Reap all our dead child processes so we don't leave zombies around.
1079 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001080 if hasattr(os, 'waitpid'):
1081 any_process = -1
1082 while True:
1083 try:
1084 # This will raise an exception on Windows. That's ok.
1085 pid, status = os.waitpid(any_process, os.WNOHANG)
1086 if pid == 0:
1087 break
1088 except:
1089 break
Antoine Pitrouf50a6b62011-01-03 18:36:36 +00001090
1091def strip_python_stderr(stderr):
1092 """Strip the stderr of a Python process from potential debug output
1093 emitted by the interpreter.
1094
1095 This will typically be run on the result of the communicate() method
1096 of a subprocess.Popen object.
1097 """
1098 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
1099 return stderr
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001100
1101def patch(test_instance, object_to_patch, attr_name, new_value):
1102 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1103
1104 Also, add a cleanup procedure to 'test_instance' to restore
1105 'object_to_patch' value for 'attr_name'.
1106 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1107
1108 """
1109 # check that 'attr_name' is a real attribute for 'object_to_patch'
1110 # will raise AttributeError if it does not exist
1111 getattr(object_to_patch, attr_name)
1112
1113 # keep a copy of the old value
1114 attr_is_local = False
1115 try:
1116 old_value = object_to_patch.__dict__[attr_name]
1117 except (AttributeError, KeyError):
1118 old_value = getattr(object_to_patch, attr_name, None)
1119 else:
1120 attr_is_local = True
1121
1122 # restore the value when the test is done
1123 def cleanup():
1124 if attr_is_local:
1125 setattr(object_to_patch, attr_name, old_value)
1126 else:
1127 delattr(object_to_patch, attr_name)
1128
1129 test_instance.addCleanup(cleanup)
1130
1131 # actually override the attribute
1132 setattr(object_to_patch, attr_name, new_value)