blob: bef7161e9a1a229c5d272c88bfa45a9f0b0e6624 [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 Heimes23daade2008-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",
35 ]
Benjamin Peterson744c2cd2008-05-26 16:26:37 +000036
Fred Drake1790dd42000-07-24 06:55:00 +000037class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000038 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000039
40class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000041 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000042
Benjamin Petersone549ead2009-03-28 21:42:05 +000043class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000044 """Test skipped because it requested a disallowed resource.
45
46 This is raised when a test calls requires() for a resource that
47 has not be enabled. It is used to distinguish between expected
48 and unexpected skips.
49 """
50
Nick Coghlanfce769e2009-04-11 14:30:59 +000051@contextlib.contextmanager
52def _ignore_deprecated_imports(ignore=True):
53 """Context manager to suppress package and module deprecation
54 warnings when importing them.
55
56 If ignore is False, this context manager has no effect."""
57 if ignore:
58 with warnings.catch_warnings():
59 warnings.filterwarnings("ignore", ".+ (module|package)",
60 DeprecationWarning)
61 yield
62 else:
63 yield
64
65
Benjamin Peterson699adb92008-05-08 22:27:58 +000066def import_module(name, deprecated=False):
R. David Murraya21e4ca2009-03-31 23:16:50 +000067 """Import and return the module to be tested, raising SkipTest if
68 it is not available.
69
70 If deprecated is True, any module or package deprecation messages
71 will be suppressed."""
Nick Coghlanfce769e2009-04-11 14:30:59 +000072 with _ignore_deprecated_imports(deprecated):
Benjamin Peterson699adb92008-05-08 22:27:58 +000073 try:
Nick Coghlanfce769e2009-04-11 14:30:59 +000074 return importlib.import_module(name)
R. David Murraya21e4ca2009-03-31 23:16:50 +000075 except ImportError as msg:
76 raise unittest.SkipTest(str(msg))
Nick Coghlanfce769e2009-04-11 14:30:59 +000077
78
Nick Coghlan47384702009-04-22 16:13:36 +000079def _save_and_remove_module(name, orig_modules):
80 """Helper function to save and remove a module from sys.modules
81
82 Return value is True if the module was in sys.modules and
83 False otherwise."""
84 saved = True
85 try:
86 orig_modules[name] = sys.modules[name]
87 except KeyError:
88 saved = False
89 else:
90 del sys.modules[name]
91 return saved
92
93
94def _save_and_block_module(name, orig_modules):
95 """Helper function to save and block a module in sys.modules
96
97 Return value is True if the module was in sys.modules and
98 False otherwise."""
99 saved = True
100 try:
101 orig_modules[name] = sys.modules[name]
102 except KeyError:
103 saved = False
Alexander Belopolsky0a5d9a22010-07-13 14:55:04 +0000104 sys.modules[name] = None
Nick Coghlan47384702009-04-22 16:13:36 +0000105 return saved
106
107
108def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
Nick Coghlanfce769e2009-04-11 14:30:59 +0000109 """Imports and returns a module, deliberately bypassing the sys.modules cache
110 and importing a fresh copy of the module. Once the import is complete,
111 the sys.modules cache is restored to its original state.
112
Nick Coghlan47384702009-04-22 16:13:36 +0000113 Modules named in fresh are also imported anew if needed by the import.
114
115 Importing of modules named in blocked is prevented while the fresh import
Nick Coghlanfce769e2009-04-11 14:30:59 +0000116 takes place.
117
118 If deprecated is True, any module or package deprecation messages
119 will be suppressed."""
120 # NOTE: test_heapq and test_warnings include extra sanity checks to make
121 # sure that this utility function is working as expected
122 with _ignore_deprecated_imports(deprecated):
Nick Coghlan47384702009-04-22 16:13:36 +0000123 # Keep track of modules saved for later restoration as well
124 # as those which just need a blocking entry removed
Nick Coghlanfce769e2009-04-11 14:30:59 +0000125 orig_modules = {}
Nick Coghlan47384702009-04-22 16:13:36 +0000126 names_to_remove = []
127 _save_and_remove_module(name, orig_modules)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000128 try:
Nick Coghlan47384702009-04-22 16:13:36 +0000129 for fresh_name in fresh:
130 _save_and_remove_module(fresh_name, orig_modules)
131 for blocked_name in blocked:
132 if not _save_and_block_module(blocked_name, orig_modules):
133 names_to_remove.append(blocked_name)
134 fresh_module = importlib.import_module(name)
Nick Coghlanfce769e2009-04-11 14:30:59 +0000135 finally:
Nick Coghlan47384702009-04-22 16:13:36 +0000136 for orig_name, module in orig_modules.items():
137 sys.modules[orig_name] = module
138 for name_to_remove in names_to_remove:
139 del sys.modules[name_to_remove]
140 return fresh_module
Nick Coghlanfce769e2009-04-11 14:30:59 +0000141
Benjamin Peterson699adb92008-05-08 22:27:58 +0000142
R. David Murraya21e4ca2009-03-31 23:16:50 +0000143def get_attribute(obj, name):
144 """Get an attribute, raising SkipTest if AttributeError is raised."""
145 try:
146 attribute = getattr(obj, name)
147 except AttributeError:
148 raise unittest.SkipTest("module %s has no attribute %s" % (
149 obj.__name__, name))
150 else:
151 return attribute
152
Barry Warsawc0fb6052001-08-20 22:29:23 +0000153verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +0000154use_resources = None # Flag set to [] by regrtest.py
155max_memuse = 0 # Disable bigmem tests (they will still be run with
156 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000157real_max_memuse = 0
Guido van Rossum531661c1996-12-20 02:58:22 +0000158
Tim Peters8dee8092001-09-25 20:05:11 +0000159# _original_stdout is meant to hold stdout at the time regrtest began.
160# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
161# The point is to have some flavor of stdout the user can actually see.
162_original_stdout = None
163def record_original_stdout(stdout):
164 global _original_stdout
165 _original_stdout = stdout
166
167def get_original_stdout():
168 return _original_stdout or sys.stdout
169
Guido van Rossum3bead091992-01-27 17:00:37 +0000170def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +0000171 try:
172 del sys.modules[name]
173 except KeyError:
174 pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000175
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000176def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000177 try:
178 os.unlink(filename)
179 except OSError:
180 pass
181
Christian Heimes23daade2008-02-25 12:39:23 +0000182def rmtree(path):
183 try:
184 shutil.rmtree(path)
185 except OSError as e:
186 # Unix returns ENOENT, Windows returns ESRCH.
187 if e.errno not in (errno.ENOENT, errno.ESRCH):
188 raise
189
Guido van Rossum3bead091992-01-27 17:00:37 +0000190def forget(modname):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000191 '''"Forget" a module was ever imported by removing it from sys.modules and
192 deleting any .pyc and .pyo files.'''
Fred Drake004d5e62000-10-23 17:22:08 +0000193 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +0000194 for dirname in sys.path:
Skip Montanaro7a98be22007-08-16 14:35:24 +0000195 unlink(os.path.join(dirname, modname + '.pyc'))
Brett Cannonf1cfb622003-05-04 21:15:27 +0000196 # Deleting the .pyo file cannot be within the 'try' for the .pyc since
197 # the chance exists that there is no .pyc (and thus the 'try' statement
198 # is exited) but there is a .pyo file.
Skip Montanaro7a98be22007-08-16 14:35:24 +0000199 unlink(os.path.join(dirname, modname + '.pyo'))
Guido van Rossum3bead091992-01-27 17:00:37 +0000200
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000201# On some platforms, should not run gui test even if it is allowed
202# in `use_resources'.
203if sys.platform.startswith('win'):
204 import ctypes
205 import ctypes.wintypes
206 def _is_gui_available():
207 UOI_FLAGS = 1
208 WSF_VISIBLE = 0x0001
209 class USEROBJECTFLAGS(ctypes.Structure):
210 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
211 ("fReserved", ctypes.wintypes.BOOL),
212 ("dwFlags", ctypes.wintypes.DWORD)]
213 dll = ctypes.windll.user32
214 h = dll.GetProcessWindowStation()
215 if not h:
216 raise ctypes.WinError()
217 uof = USEROBJECTFLAGS()
218 needed = ctypes.wintypes.DWORD()
219 res = dll.GetUserObjectInformationW(h,
220 UOI_FLAGS,
221 ctypes.byref(uof),
222 ctypes.sizeof(uof),
223 ctypes.byref(needed))
224 if not res:
225 raise ctypes.WinError()
226 return bool(uof.dwFlags & WSF_VISIBLE)
227else:
228 def _is_gui_available():
229 return True
230
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000231def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000232 """Test whether a resource is enabled. Known resources are set by
233 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000234 return use_resources is not None and resource in use_resources
235
Barry Warsawc0fb6052001-08-20 22:29:23 +0000236def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000237 """Raise ResourceDenied if the specified resource is not available.
238
239 If the caller's module is __main__ then automatically return True. The
240 possibility of False being returned occurs when regrtest.py is executing."""
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000241 if resource == 'gui' and not _is_gui_available():
242 raise unittest.SkipTest("Cannot use the 'gui' resource")
Skip Montanarod839ecd2003-04-24 19:06:57 +0000243 # see if the caller's module is __main__ - if so, treat as if
244 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000245 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000246 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000247 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000248 if msg is None:
249 msg = "Use of the `%s' resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000250 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000251
Christian Heimes5e696852008-04-09 08:37:03 +0000252HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253
Christian Heimes5e696852008-04-09 08:37:03 +0000254def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
255 """Returns an unused port that should be suitable for binding. This is
256 achieved by creating a temporary socket with the same family and type as
257 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
258 the specified host address (defaults to 0.0.0.0) with the port set to 0,
259 eliciting an unused ephemeral port from the OS. The temporary socket is
260 then closed and deleted, and the ephemeral port is returned.
261
262 Either this method or bind_port() should be used for any tests where a
263 server socket needs to be bound to a particular port for the duration of
264 the test. Which one to use depends on whether the calling code is creating
265 a python socket, or if an unused port needs to be provided in a constructor
266 or passed to an external program (i.e. the -accept argument to openssl's
267 s_server mode). Always prefer bind_port() over find_unused_port() where
268 possible. Hard coded ports should *NEVER* be used. As soon as a server
269 socket is bound to a hard coded port, the ability to run multiple instances
270 of the test simultaneously on the same host is compromised, which makes the
271 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
272 may simply manifest as a failed test, which can be recovered from without
273 intervention in most cases, but on Windows, the entire python process can
274 completely and utterly wedge, requiring someone to log in to the buildbot
275 and manually kill the affected process.
276
277 (This is easy to reproduce on Windows, unfortunately, and can be traced to
278 the SO_REUSEADDR socket option having different semantics on Windows versus
279 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
280 listen and then accept connections on identical host/ports. An EADDRINUSE
281 socket.error will be raised at some point (depending on the platform and
282 the order bind and listen were called on each socket).
283
284 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
285 will ever be raised when attempting to bind two identical host/ports. When
286 accept() is called on each socket, the second caller's process will steal
287 the port from the first caller, leaving them both in an awkwardly wedged
288 state where they'll no longer respond to any signals or graceful kills, and
289 must be forcibly killed via OpenProcess()/TerminateProcess().
290
291 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
292 instead of SO_REUSEADDR, which effectively affords the same semantics as
293 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
294 Source world compared to Windows ones, this is a common mistake. A quick
295 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
296 openssl.exe is called with the 's_server' option, for example. See
297 http://bugs.python.org/issue2550 for more info. The following site also
298 has a very thorough description about the implications of both REUSEADDR
299 and EXCLUSIVEADDRUSE on Windows:
300 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
301
302 XXX: although this approach is a vast improvement on previous attempts to
303 elicit unused ports, it rests heavily on the assumption that the ephemeral
304 port returned to us by the OS won't immediately be dished back out to some
305 other process when we close and delete our temporary socket but before our
306 calling code has a chance to bind the returned port. We can deal with this
307 issue if/when we come across it.
308 """
309
310 tempsock = socket.socket(family, socktype)
311 port = bind_port(tempsock)
312 tempsock.close()
313 del tempsock
314 return port
315
316def bind_port(sock, host=HOST):
317 """Bind the socket to a free port and return the port number. Relies on
318 ephemeral ports in order to ensure we are using an unbound port. This is
319 important as many tests may be running simultaneously, especially in a
320 buildbot environment. This method raises an exception if the sock.family
321 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
322 or SO_REUSEPORT set on it. Tests should *never* set these socket options
323 for TCP/IP sockets. The only case for setting these options is testing
324 multicasting via multiple UDP sockets.
325
326 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
327 on Windows), it will be set on the socket. This will prevent anyone else
328 from bind()'ing to our host/port for the duration of the test.
329 """
330
331 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
332 if hasattr(socket, 'SO_REUSEADDR'):
333 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
334 raise TestFailed("tests should never set the SO_REUSEADDR " \
335 "socket option on TCP/IP sockets!")
336 if hasattr(socket, 'SO_REUSEPORT'):
337 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
338 raise TestFailed("tests should never set the SO_REUSEPORT " \
339 "socket option on TCP/IP sockets!")
340 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
341 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
342
343 sock.bind((host, 0))
344 port = sock.getsockname()[1]
345 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000346
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000347FUZZ = 1e-6
348
349def fcmp(x, y): # fuzzy comparison function
Neal Norwitz79212992006-08-21 16:27:31 +0000350 if isinstance(x, float) or isinstance(y, float):
Fred Drake004d5e62000-10-23 17:22:08 +0000351 try:
Fred Drake004d5e62000-10-23 17:22:08 +0000352 fuzz = (abs(x) + abs(y)) * FUZZ
353 if abs(x-y) <= fuzz:
354 return 0
355 except:
356 pass
Neal Norwitz79212992006-08-21 16:27:31 +0000357 elif type(x) == type(y) and isinstance(x, (tuple, list)):
Fred Drake004d5e62000-10-23 17:22:08 +0000358 for i in range(min(len(x), len(y))):
359 outcome = fcmp(x[i], y[i])
Fred Drake132dce22000-12-12 23:11:42 +0000360 if outcome != 0:
Fred Drake004d5e62000-10-23 17:22:08 +0000361 return outcome
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000362 return (len(x) > len(y)) - (len(x) < len(y))
363 return (x > y) - (x < y)
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000364
Finn Bock57bc5fa2002-11-01 18:02:03 +0000365is_jython = sys.platform.startswith('java')
366
Barry Warsaw559f6682001-03-23 18:04:02 +0000367# Filename used for testing
368if os.name == 'java':
369 # Jython disallows @ in module names
370 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000371else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000372 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000373
374 # Assuming sys.getfilesystemencoding()!=sys.getdefaultencoding()
375 # TESTFN_UNICODE is a filename that can be encoded using the
376 # file system encoding, but *not* with the default (ascii) encoding
377 TESTFN_UNICODE = "@test-\xe0\xf2"
378 TESTFN_ENCODING = sys.getfilesystemencoding()
Victor Stinner0ea31a92010-09-10 12:32:58 +0000379 # TESTFN_UNENCODABLE is a filename that should *not* be
Walter Dörwald9b775532007-06-08 14:30:53 +0000380 # able to be encoded by *either* the default or filesystem encoding.
381 # This test really only makes sense on Windows NT platforms
382 # which have special Unicode support in posixmodule.
383 if (not hasattr(sys, "getwindowsversion") or
384 sys.getwindowsversion()[3] < 2): # 0=win32s or 1=9x/ME
Victor Stinner0ea31a92010-09-10 12:32:58 +0000385 TESTFN_UNENCODABLE = None
Walter Dörwald9b775532007-06-08 14:30:53 +0000386 else:
Victor Stinner0d823ed2010-09-10 12:19:37 +0000387 # Different kinds of characters from various languages to minimize the
388 # probability that the whole name is encodable to MBCS (issue #9819)
389 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
Walter Dörwald9b775532007-06-08 14:30:53 +0000390 try:
391 # XXX - Note - should be using TESTFN_ENCODING here - but for
392 # Windows, "mbcs" currently always operates as if in
393 # errors=ignore' mode - hence we get '?' characters rather than
394 # the exception. 'Latin1' operates as we expect - ie, fails.
395 # See [ 850997 ] mbcs encoding ignores errors
Victor Stinner0ea31a92010-09-10 12:32:58 +0000396 TESTFN_UNENCODABLE.encode("Latin1")
Walter Dörwald9b775532007-06-08 14:30:53 +0000397 except UnicodeEncodeError:
398 pass
Martin v. Löwis2411a2d2002-11-09 19:57:26 +0000399 else:
Georg Brandldb028442008-02-05 20:48:58 +0000400 print('WARNING: The filename %r CAN be encoded by the filesystem. '
401 'Unicode filename tests may not be effective'
Victor Stinner0ea31a92010-09-10 12:32:58 +0000402 % TESTFN_UNENCODABLE)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000403
Victor Stinner7f6423a2010-05-14 20:08:55 +0000404if os.path.isdir(TESTFN):
405 # a test failed (eg. test_os) without removing TESTFN directory
406 shutil.rmtree(TESTFN)
407
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000408# Make sure we can write to TESTFN, try in /tmp if we can't
409fp = None
410try:
411 fp = open(TESTFN, 'w+')
412except IOError:
413 TMP_TESTFN = os.path.join('/tmp', TESTFN)
414 try:
415 fp = open(TMP_TESTFN, 'w+')
416 TESTFN = TMP_TESTFN
417 del TMP_TESTFN
418 except IOError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000419 print(('WARNING: tests will fail, unable to write to: %s or %s' %
420 (TESTFN, TMP_TESTFN)))
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000421if fp is not None:
422 fp.close()
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000423 unlink(TESTFN)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000424del fp
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000425
Victor Stinner3f682ad2010-07-13 23:14:46 +0000426def findfile(file, here=__file__, subdir=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000427 """Try to find a file on sys.path and the working directory. If it is not
428 found the argument passed to the function is returned (this does not
429 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000430 if os.path.isabs(file):
431 return file
Victor Stinner3f682ad2010-07-13 23:14:46 +0000432 if subdir is not None:
433 file = os.path.join(subdir, file)
Fred Drake004d5e62000-10-23 17:22:08 +0000434 path = sys.path
435 path = [os.path.dirname(here)] + path
436 for dn in path:
437 fn = os.path.join(dn, file)
438 if os.path.exists(fn): return fn
439 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000440
Ezio Melotti2aef4b82010-01-25 12:20:04 +0000441def verify(condition, reason='test failed'):
442 """Verify that condition is true. If not, raise TestFailed.
443
444 The optional argument reason can be given to provide
445 a better error text.
446 """
447
448 if not condition:
449 raise TestFailed(reason)
450
451def vereq(a, b):
452 """Raise TestFailed if a == b is false.
453
454 This is better than verify(a == b) because, in case of failure, the
455 error message incorporates repr(a) and repr(b) so you can see the
456 inputs.
457
458 Note that "not (a == b)" isn't necessarily the same as "a != b"; the
459 former is tested.
460 """
461
462 if not (a == b):
463 raise TestFailed("%r == %r" % (a, b))
464
Tim Peters2f228e72001-05-13 00:19:31 +0000465def sortdict(dict):
466 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000467 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000468 reprpairs = ["%r: %r" % pair for pair in items]
469 withcommas = ", ".join(reprpairs)
470 return "{%s}" % withcommas
471
Benjamin Peterson7522c742009-01-19 21:00:09 +0000472def make_bad_fd():
473 """
474 Create an invalid file descriptor by opening and closing a file and return
475 its fd.
476 """
477 file = open(TESTFN, "wb")
478 try:
479 return file.fileno()
480 finally:
481 file.close()
482 unlink(TESTFN)
483
Thomas Wouters89f507f2006-12-13 04:49:30 +0000484def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000485 testcase.assertRaises(SyntaxError, compile, statement,
486 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000487
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000488def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000489 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000490
Guido van Rossum360e4b82007-05-14 22:51:27 +0000491 requires('urlfetch')
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000492 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000493
494 for path in [os.path.curdir, os.path.pardir]:
495 fn = os.path.join(path, filename)
496 if os.path.exists(fn):
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000497 return open(fn, *args, **kw)
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000498
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000499 print('\tfetching %s ...' % url, file=get_original_stdout())
Antoine Pitrouec416612009-11-01 22:28:14 +0000500 f = urllib.request.urlopen(url, timeout=15)
501 try:
502 with open(filename, "wb") as out:
503 s = f.read()
504 while s:
505 out.write(s)
506 s = f.read()
507 finally:
508 f.close()
509 return open(filename, *args, **kw)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000510
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000511class WarningsRecorder(object):
512 """Convenience wrapper for the warnings list returned on
513 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000514 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000515 def __init__(self, warnings_list):
516 self.warnings = warnings_list
517
518 def __getattr__(self, attr):
519 if self.warnings:
520 return getattr(self.warnings[-1], attr)
521 elif attr in warnings.WarningMessage._WARNING_DETAILS:
522 return None
523 raise AttributeError("%r has no attribute %r" % (self, attr))
524
525 def reset(self):
526 del self.warnings[:]
527
528@contextlib.contextmanager
529def check_warnings():
530 with warnings.catch_warnings(record=True) as w:
531 yield WarningsRecorder(w)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000532
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000533
534class CleanImport(object):
535 """Context manager to force import to return a new module reference.
536
537 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000538 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000539
540 Use like this:
541
542 with CleanImport("foo"):
543 __import__("foo") # new reference
544 """
545
546 def __init__(self, *module_names):
547 self.original_modules = sys.modules.copy()
548 for module_name in module_names:
549 if module_name in sys.modules:
550 module = sys.modules[module_name]
551 # It is possible that module_name is just an alias for
552 # another module (e.g. stub for modules renamed in 3.x).
553 # In that case, we also need delete the real module to clear
554 # the import cache.
555 if module.__name__ != module_name:
556 del sys.modules[module.__name__]
557 del sys.modules[module_name]
558
559 def __enter__(self):
560 return self
561
562 def __exit__(self, *ignore_exc):
563 sys.modules.update(self.original_modules)
564
565
Walter Dörwald155374d2009-05-01 19:58:58 +0000566class EnvironmentVarGuard(collections.MutableMapping):
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000567
568 """Class to help protect the environment variable properly. Can be used as
569 a context manager."""
570
571 def __init__(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000572 self._environ = os.environ
Walter Dörwald4ba80132009-04-25 12:48:43 +0000573 self._changed = {}
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000574
Walter Dörwald155374d2009-05-01 19:58:58 +0000575 def __getitem__(self, envvar):
576 return self._environ[envvar]
577
578 def __setitem__(self, envvar, value):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000579 # Remember the initial value on the first access
580 if envvar not in self._changed:
Walter Dörwald155374d2009-05-01 19:58:58 +0000581 self._changed[envvar] = self._environ.get(envvar)
582 self._environ[envvar] = value
583
584 def __delitem__(self, envvar):
585 # Remember the initial value on the first access
586 if envvar not in self._changed:
587 self._changed[envvar] = self._environ.get(envvar)
588 if envvar in self._environ:
589 del self._environ[envvar]
590
591 def keys(self):
592 return self._environ.keys()
593
594 def __iter__(self):
595 return iter(self._environ)
596
597 def __len__(self):
598 return len(self._environ)
599
600 def set(self, envvar, value):
601 self[envvar] = value
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000602
603 def unset(self, envvar):
Walter Dörwald155374d2009-05-01 19:58:58 +0000604 del self[envvar]
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000605
606 def __enter__(self):
607 return self
608
609 def __exit__(self, *ignore_exc):
Walter Dörwald4ba80132009-04-25 12:48:43 +0000610 for (k, v) in self._changed.items():
611 if v is None:
Walter Dörwald155374d2009-05-01 19:58:58 +0000612 if k in self._environ:
613 del self._environ[k]
Walter Dörwald4ba80132009-04-25 12:48:43 +0000614 else:
Walter Dörwald155374d2009-05-01 19:58:58 +0000615 self._environ[k] = v
616
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000617
Guido van Rossumd8faa362007-04-27 19:54:29 +0000618class TransientResource(object):
619
620 """Raise ResourceDenied if an exception is raised while the context manager
621 is in effect that matches the specified exception and attributes."""
622
623 def __init__(self, exc, **kwargs):
624 self.exc = exc
625 self.attrs = kwargs
626
627 def __enter__(self):
628 return self
629
630 def __exit__(self, type_=None, value=None, traceback=None):
631 """If type_ is a subclass of self.exc and value has attributes matching
632 self.attrs, raise ResourceDenied. Otherwise let the exception
633 propagate (if any)."""
634 if type_ is not None and issubclass(self.exc, type_):
635 for attr, attr_value in self.attrs.items():
636 if not hasattr(value, attr):
637 break
638 if getattr(value, attr) != attr_value:
639 break
640 else:
641 raise ResourceDenied("an optional resource is not available")
642
Raymond Hettinger686057b2009-06-04 00:11:54 +0000643# Context managers that raise ResourceDenied when various issues
644# with the Internet connection manifest themselves as exceptions.
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000645# XXX deprecate these and use transient_internet() instead
Raymond Hettinger686057b2009-06-04 00:11:54 +0000646time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
647socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
648ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000649
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000650
Thomas Woutersed03b412007-08-28 21:37:11 +0000651@contextlib.contextmanager
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000652def transient_internet(resource_name, *, timeout=30.0, errnos=()):
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000653 """Return a context manager that raises ResourceDenied when various issues
654 with the Internet connection manifest themselves as exceptions."""
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000655 default_errnos = [
656 ('ECONNREFUSED', 111),
657 ('ECONNRESET', 104),
Antoine Pitrou50778ab2011-01-08 10:31:09 +0000658 ('EHOSTUNREACH', 113),
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000659 ('ENETUNREACH', 101),
660 ('ETIMEDOUT', 110),
661 ]
Antoine Pitroudae0c632010-09-07 21:44:17 +0000662 default_gai_errnos = [
663 ('EAI_NONAME', -2),
664 ('EAI_NODATA', -5),
665 ]
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000666
667 denied = ResourceDenied("Resource '%s' is not available" % resource_name)
668 captured_errnos = errnos
Antoine Pitroudae0c632010-09-07 21:44:17 +0000669 gai_errnos = []
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000670 if not captured_errnos:
671 captured_errnos = [getattr(errno, name, num)
672 for (name, num) in default_errnos]
Antoine Pitroudae0c632010-09-07 21:44:17 +0000673 gai_errnos = [getattr(socket, name, num)
674 for (name, num) in default_gai_errnos]
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000675
676 def filter_error(err):
Antoine Pitroudae0c632010-09-07 21:44:17 +0000677 n = getattr(err, 'errno', None)
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000678 if (isinstance(err, socket.timeout) or
Antoine Pitroudae0c632010-09-07 21:44:17 +0000679 (isinstance(err, socket.gaierror) and n in gai_errnos) or
680 n in captured_errnos):
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000681 if not verbose:
682 sys.stderr.write(denied.args[0] + "\n")
683 raise denied from err
684
685 old_timeout = socket.getdefaulttimeout()
686 try:
687 if timeout is not None:
688 socket.setdefaulttimeout(timeout)
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000689 yield
Antoine Pitrou4d7979b2010-09-07 21:22:56 +0000690 except IOError as err:
691 # urllib can wrap original socket errors multiple times (!), we must
692 # unwrap to get at the original error.
693 while True:
694 a = err.args
695 if len(a) >= 1 and isinstance(a[0], IOError):
696 err = a[0]
697 # The error can also be wrapped as args[1]:
698 # except socket.error as msg:
699 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
700 elif len(a) >= 2 and isinstance(a[1], IOError):
701 err = a[1]
702 else:
703 break
704 filter_error(err)
705 raise
706 # XXX should we catch generic exceptions and look for their
707 # __cause__ or __context__?
708 finally:
709 socket.setdefaulttimeout(old_timeout)
Antoine Pitrouda6902c2010-04-21 19:52:52 +0000710
711
712@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000713def captured_output(stream_name):
714 """Run the 'with' statement body using a StringIO object in place of a
715 specific attribute on the sys module.
716 Example use (with 'stream_name=stdout')::
Thomas Woutersed03b412007-08-28 21:37:11 +0000717
718 with captured_stdout() as s:
Neal Norwitz752abd02008-05-13 04:55:24 +0000719 print("hello")
Thomas Woutersed03b412007-08-28 21:37:11 +0000720 assert s.getvalue() == "hello"
721 """
722 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000723 orig_stdout = getattr(sys, stream_name)
724 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000725 try:
726 yield getattr(sys, stream_name)
727 finally:
728 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000729
730def captured_stdout():
731 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +0000732
Benjamin Petersone549ead2009-03-28 21:42:05 +0000733def gc_collect():
734 """Force as many objects as possible to be collected.
735
736 In non-CPython implementations of Python, this is needed because timely
737 deallocation is not guaranteed by the garbage collector. (Even in CPython
738 this can be the case in case of reference cycles.) This means that __del__
739 methods may be called later than expected and weakrefs may remain alive for
740 longer than expected. This function tries its best to force all garbage
741 objects to disappear.
742 """
Benjamin Petersone549ead2009-03-28 21:42:05 +0000743 gc.collect()
744 gc.collect()
745 gc.collect()
746
Thomas Woutersed03b412007-08-28 21:37:11 +0000747
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000748#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +0000749# Decorator for running a function in a different locale, correctly resetting
750# it afterwards.
751
752def run_with_locale(catstr, *locales):
753 def decorator(func):
754 def inner(*args, **kwds):
755 try:
756 import locale
757 category = getattr(locale, catstr)
758 orig_locale = locale.setlocale(category)
759 except AttributeError:
760 # if the test author gives us an invalid category string
761 raise
762 except:
763 # cannot retrieve original locale, so do nothing
764 locale = orig_locale = None
765 else:
766 for loc in locales:
767 try:
768 locale.setlocale(category, loc)
769 break
770 except:
771 pass
772
773 # now run the function, resetting the locale on exceptions
774 try:
775 return func(*args, **kwds)
776 finally:
777 if locale and orig_locale:
778 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +0000779 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +0000780 inner.__doc__ = func.__doc__
781 return inner
782 return decorator
783
784#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +0000785# Big-memory-test support. Separate from 'resources' because memory use
786# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000787
788# Some handy shorthands. Note that these are used for byte-limits as well
789# as size-limits, in the various bigmem tests
790_1M = 1024*1024
791_1G = 1024 * _1M
792_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000793_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +0000794
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000795MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000796
Thomas Wouters477c8d52006-05-27 19:21:47 +0000797def set_memlimit(limit):
798 import re
799 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000800 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000801 sizes = {
802 'k': 1024,
803 'm': _1M,
804 'g': _1G,
805 't': 1024*_1G,
806 }
807 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
808 re.IGNORECASE | re.VERBOSE)
809 if m is None:
810 raise ValueError('Invalid memory limit %r' % (limit,))
811 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000812 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000813 if memlimit > MAX_Py_ssize_t:
814 memlimit = MAX_Py_ssize_t
815 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000816 raise ValueError('Memory limit %r too low to be useful' % (limit,))
817 max_memuse = memlimit
818
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000819def bigmemtest(minsize, memuse):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000820 """Decorator for bigmem tests.
821
822 'minsize' is the minimum useful size for the test (in arbitrary,
823 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000824 the test, or a good estimate of it.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000825
826 The decorator tries to guess a good value for 'size' and passes it to
827 the decorated test function. If minsize * memuse is more than the
828 allowed memory use (as defined by max_memuse), the test is skipped.
829 Otherwise, minsize is adjusted upward to use up to max_memuse.
830 """
831 def decorator(f):
832 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000833 # Retrieve values in case someone decided to adjust them
834 minsize = wrapper.minsize
835 memuse = wrapper.memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000836 if not max_memuse:
837 # If max_memuse is 0 (the default),
838 # we still want to run the tests with size set to a few kb,
839 # to make sure they work. We still want to avoid using
840 # too much memory, though, but we do that noisily.
841 maxsize = 5147
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000842 self.assertFalse(maxsize * memuse > 20 * _1M)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000843 else:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000844 maxsize = int(max_memuse / memuse)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000845 if maxsize < minsize:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000846 raise unittest.SkipTest(
847 "not enough memory: %.1fG minimum needed"
848 % (minsize * memuse / (1024 ** 3)))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000849 return f(self, maxsize)
850 wrapper.minsize = minsize
851 wrapper.memuse = memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000852 return wrapper
853 return decorator
854
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000855def precisionbigmemtest(size, memuse):
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000856 def decorator(f):
857 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000858 size = wrapper.size
859 memuse = wrapper.memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000860 if not real_max_memuse:
861 maxsize = 5147
862 else:
863 maxsize = size
864
865 if real_max_memuse and real_max_memuse < maxsize * memuse:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000866 raise unittest.SkipTest(
867 "not enough memory: %.1fG minimum needed"
868 % (size * memuse / (1024 ** 3)))
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000869
870 return f(self, maxsize)
871 wrapper.size = size
872 wrapper.memuse = memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000873 return wrapper
874 return decorator
875
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000876def bigaddrspacetest(f):
877 """Decorator for tests that fill the address space."""
878 def wrapper(self):
879 if max_memuse < MAX_Py_ssize_t:
Antoine Pitrou78ae1fb2011-01-14 20:19:57 +0000880 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
881 raise unittest.SkipTest(
882 "not enough memory: try a 32-bit build instead")
883 else:
884 raise unittest.SkipTest(
885 "not enough memory: %.1fG minimum needed"
886 % (MAX_Py_ssize_t / (1024 ** 3)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000887 else:
888 return f(self)
889 return wrapper
890
Thomas Wouters477c8d52006-05-27 19:21:47 +0000891#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +0000892# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000893
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000894class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000895 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000896 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000897 test(result)
898 return result
899
Benjamin Petersone549ead2009-03-28 21:42:05 +0000900def _id(obj):
901 return obj
902
903def requires_resource(resource):
Antoine Pitrou9e719b62011-02-28 23:48:16 +0000904 if resource == 'gui' and not _is_gui_available():
905 return unittest.skip("resource 'gui' is not available")
Antoine Pitrou27314942010-10-14 15:41:23 +0000906 if is_resource_enabled(resource):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000907 return _id
908 else:
909 return unittest.skip("resource {0!r} is not enabled".format(resource))
910
911def cpython_only(test):
912 """
913 Decorator for tests only applicable on CPython.
914 """
915 return impl_detail(cpython=True)(test)
916
917def impl_detail(msg=None, **guards):
918 if check_impl_detail(**guards):
919 return _id
920 if msg is None:
921 guardnames, default = _parse_guards(guards)
922 if default:
923 msg = "implementation detail not available on {0}"
924 else:
925 msg = "implementation detail specific to {0}"
926 guardnames = sorted(guardnames.keys())
927 msg = msg.format(' or '.join(guardnames))
928 return unittest.skip(msg)
929
930def _parse_guards(guards):
931 # Returns a tuple ({platform_name: run_me}, default_value)
932 if not guards:
933 return ({'cpython': True}, False)
Eric Smith886b40a2009-04-26 21:26:45 +0000934 is_true = list(guards.values())[0]
935 assert list(guards.values()) == [is_true] * len(guards) # all True or all False
Benjamin Petersone549ead2009-03-28 21:42:05 +0000936 return (guards, not is_true)
937
938# Use the following check to guard CPython's implementation-specific tests --
939# or to run them only on the implementation(s) guarded by the arguments.
940def check_impl_detail(**guards):
941 """This function returns True or False depending on the host platform.
942 Examples:
943 if check_impl_detail(): # only on CPython (default)
944 if check_impl_detail(jython=True): # only on Jython
945 if check_impl_detail(cpython=False): # everywhere except on CPython
946 """
947 guards, default = _parse_guards(guards)
948 return guards.get(platform.python_implementation().lower(), default)
949
950
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000951
Guido van Rossumd8faa362007-04-27 19:54:29 +0000952def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +0000953 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000954 if verbose:
Fred Drake84a59342001-03-23 04:21:17 +0000955 runner = unittest.TextTestRunner(sys.stdout, verbosity=2)
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000956 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000957 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000958
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000959 result = runner.run(suite)
960 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +0000961 if len(result.errors) == 1 and not result.failures:
962 err = result.errors[0][1]
963 elif len(result.failures) == 1 and not result.errors:
964 err = result.failures[0][1]
965 else:
R. David Murrayb3438b82009-10-28 14:47:15 +0000966 err = "multiple errors occurred"
967 if not verbose: err += "; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +0000968 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +0000969
Barry Warsawc10d6902001-09-20 06:30:41 +0000970
Walter Dörwald21d3a322003-05-01 17:45:56 +0000971def run_unittest(*classes):
972 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +0000973 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000974 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000975 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000976 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000977 if cls in sys.modules:
978 suite.addTest(unittest.findTestCases(sys.modules[cls]))
979 else:
980 raise ValueError("str arguments must be keys in sys.modules")
981 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +0000982 suite.addTest(cls)
983 else:
984 suite.addTest(unittest.makeSuite(cls))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000985 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000986
Barry Warsawc10d6902001-09-20 06:30:41 +0000987
Tim Petersa0a62222001-09-09 06:12:01 +0000988#=======================================================================
989# doctest driver.
990
991def run_doctest(module, verbosity=None):
Tim Peters17111f32001-10-03 04:08:26 +0000992 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +0000993
994 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000995 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +0000996 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +0000997 """
998
999 import doctest
1000
1001 if verbosity is None:
1002 verbosity = verbose
1003 else:
1004 verbosity = None
1005
Tim Peters342ca752001-09-25 19:13:20 +00001006 # Direct doctest output (normally just errors) to real stdout; doctest
1007 # output shouldn't be compared by regrtest.
1008 save_stdout = sys.stdout
Tim Peters8dee8092001-09-25 20:05:11 +00001009 sys.stdout = get_original_stdout()
Tim Peters342ca752001-09-25 19:13:20 +00001010 try:
1011 f, t = doctest.testmod(module, verbose=verbosity)
1012 if f:
1013 raise TestFailed("%d of %d doctests failed" % (f, t))
1014 finally:
1015 sys.stdout = save_stdout
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001016 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +00001017 print('doctest (%s) ... %d tests with zero failures' %
1018 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +00001019 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001020
Antoine Pitrouca154092009-11-13 16:31:51 +00001021
1022#=======================================================================
1023# Support for saving and restoring the imported modules.
1024
1025def modules_setup():
1026 return sys.modules.copy(),
1027
1028def modules_cleanup(oldmodules):
1029 # Encoders/decoders are registered permanently within the internal
1030 # codec cache. If we destroy the corresponding modules their
1031 # globals will be set to None which will trip up the cached functions.
1032 encodings = [(k, v) for k, v in sys.modules.items()
1033 if k.startswith('encodings.')]
1034 sys.modules.clear()
1035 sys.modules.update(encodings)
1036 sys.modules.update(oldmodules)
1037
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001038#=======================================================================
1039# Threading support to prevent reporting refleaks when running regrtest.py -R
1040
1041def threading_setup():
1042 import threading
1043 return len(threading._active), len(threading._limbo)
1044
1045def threading_cleanup(num_active, num_limbo):
1046 import threading
1047 import time
1048
1049 _MAX_COUNT = 10
1050 count = 0
1051 while len(threading._active) != num_active and count < _MAX_COUNT:
1052 count += 1
1053 time.sleep(0.1)
1054
1055 count = 0
1056 while len(threading._limbo) != num_limbo and count < _MAX_COUNT:
1057 count += 1
1058 time.sleep(0.1)
1059
Benjamin Petersonfa0d7032009-06-01 22:42:33 +00001060def reap_threads(func):
1061 @functools.wraps(func)
1062 def decorator(*args):
1063 key = threading_setup()
1064 try:
1065 return func(*args)
1066 finally:
1067 threading_cleanup(*key)
1068 return decorator
1069
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001070def reap_children():
1071 """Use this function at the end of test_main() whenever sub-processes
1072 are started. This will help ensure that no extra children (zombies)
1073 stick around to hog resources and create problems when looking
1074 for refleaks.
1075 """
1076
1077 # Reap all our dead child processes so we don't leave zombies around.
1078 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001079 if hasattr(os, 'waitpid'):
1080 any_process = -1
1081 while True:
1082 try:
1083 # This will raise an exception on Windows. That's ok.
1084 pid, status = os.waitpid(any_process, os.WNOHANG)
1085 if pid == 0:
1086 break
1087 except:
1088 break
Antoine Pitrouf50a6b62011-01-03 18:36:36 +00001089
1090def strip_python_stderr(stderr):
1091 """Strip the stderr of a Python process from potential debug output
1092 emitted by the interpreter.
1093
1094 This will typically be run on the result of the communicate() method
1095 of a subprocess.Popen object.
1096 """
1097 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
1098 return stderr
Antoine Pitrou2c50a092011-03-15 21:02:59 +01001099
1100def patch(test_instance, object_to_patch, attr_name, new_value):
1101 """Override 'object_to_patch'.'attr_name' with 'new_value'.
1102
1103 Also, add a cleanup procedure to 'test_instance' to restore
1104 'object_to_patch' value for 'attr_name'.
1105 The 'attr_name' should be a valid attribute for 'object_to_patch'.
1106
1107 """
1108 # check that 'attr_name' is a real attribute for 'object_to_patch'
1109 # will raise AttributeError if it does not exist
1110 getattr(object_to_patch, attr_name)
1111
1112 # keep a copy of the old value
1113 attr_is_local = False
1114 try:
1115 old_value = object_to_patch.__dict__[attr_name]
1116 except (AttributeError, KeyError):
1117 old_value = getattr(object_to_patch, attr_name, None)
1118 else:
1119 attr_is_local = True
1120
1121 # restore the value when the test is done
1122 def cleanup():
1123 if attr_is_local:
1124 setattr(object_to_patch, attr_name, old_value)
1125 else:
1126 delattr(object_to_patch, attr_name)
1127
1128 test_instance.addCleanup(cleanup)
1129
1130 # actually override the attribute
1131 setattr(object_to_patch, attr_name, new_value)