blob: e20917007d6022b25ce87e2483d89896bf109580 [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
8import socket
Fred Drakecd1b1dd2001-03-21 18:26:33 +00009import sys
Guido van Rossumd8faa362007-04-27 19:54:29 +000010import os
Benjamin Petersone549ead2009-03-28 21:42:05 +000011import platform
Christian Heimes23daade02008-02-25 12:39:23 +000012import shutil
Thomas Wouters902d6eb2007-01-09 23:18:33 +000013import warnings
Guido van Rossumd8faa362007-04-27 19:54:29 +000014import unittest
Fred Drakecd1b1dd2001-03-21 18:26:33 +000015
Benjamin Petersone549ead2009-03-28 21:42:05 +000016__all__ = ["Error", "TestFailed", "ResourceDenied", "import_module",
Benjamin Peterson744c2cd2008-05-26 16:26:37 +000017 "verbose", "use_resources", "max_memuse", "record_original_stdout",
18 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
19 "is_resource_enabled", "requires", "find_unused_port", "bind_port",
Benjamin Peterson79e48032008-05-26 17:44:33 +000020 "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "findfile", "verify",
21 "vereq", "sortdict", "check_syntax_error", "open_urlresource",
Benjamin Petersonfcf5d632008-10-16 23:24:44 +000022 "check_warnings", "CleanImport", "EnvironmentVarGuard",
Benjamin Peterson79e48032008-05-26 17:44:33 +000023 "TransientResource", "captured_output", "captured_stdout",
24 "TransientResource", "transient_internet", "run_with_locale",
25 "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
26 "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
Benjamin Petersone549ead2009-03-28 21:42:05 +000027 "reap_children", "cpython_only", "check_impl_detail"]
Benjamin Peterson744c2cd2008-05-26 16:26:37 +000028
Fred Drake1790dd42000-07-24 06:55:00 +000029class Error(Exception):
Fred Drake004d5e62000-10-23 17:22:08 +000030 """Base class for regression test exceptions."""
Fred Drake1790dd42000-07-24 06:55:00 +000031
32class TestFailed(Error):
Fred Drake004d5e62000-10-23 17:22:08 +000033 """Test failed."""
Fred Drake1790dd42000-07-24 06:55:00 +000034
Benjamin Petersone549ead2009-03-28 21:42:05 +000035class ResourceDenied(unittest.SkipTest):
Fred Drake9a0db072003-02-03 15:19:30 +000036 """Test skipped because it requested a disallowed resource.
37
38 This is raised when a test calls requires() for a resource that
39 has not be enabled. It is used to distinguish between expected
40 and unexpected skips.
41 """
42
Benjamin Peterson699adb92008-05-08 22:27:58 +000043def import_module(name, deprecated=False):
Benjamin Petersone549ead2009-03-28 21:42:05 +000044 """Import the module to be tested, raising SkipTest if it is not
Benjamin Peterson699adb92008-05-08 22:27:58 +000045 available."""
Benjamin Petersonfcf5d632008-10-16 23:24:44 +000046 with warnings.catch_warnings():
Benjamin Peterson699adb92008-05-08 22:27:58 +000047 if deprecated:
Alexandre Vassalottia79e33e2008-05-15 22:51:26 +000048 warnings.filterwarnings("ignore", ".+ (module|package)",
49 DeprecationWarning)
Benjamin Peterson699adb92008-05-08 22:27:58 +000050 try:
51 module = __import__(name, level=0)
52 except ImportError:
Benjamin Petersone549ead2009-03-28 21:42:05 +000053 raise unittest.SkipTest("No module named " + name)
Benjamin Peterson699adb92008-05-08 22:27:58 +000054 else:
55 return module
56
Barry Warsawc0fb6052001-08-20 22:29:23 +000057verbose = 1 # Flag set to 0 by regrtest.py
Thomas Wouters477c8d52006-05-27 19:21:47 +000058use_resources = None # Flag set to [] by regrtest.py
59max_memuse = 0 # Disable bigmem tests (they will still be run with
60 # small sizes, to make sure they work.)
Neal Norwitz3ce5d922008-08-24 07:08:55 +000061real_max_memuse = 0
Guido van Rossum531661c1996-12-20 02:58:22 +000062
Tim Peters8dee8092001-09-25 20:05:11 +000063# _original_stdout is meant to hold stdout at the time regrtest began.
64# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever.
65# The point is to have some flavor of stdout the user can actually see.
66_original_stdout = None
67def record_original_stdout(stdout):
68 global _original_stdout
69 _original_stdout = stdout
70
71def get_original_stdout():
72 return _original_stdout or sys.stdout
73
Guido van Rossum3bead091992-01-27 17:00:37 +000074def unload(name):
Fred Drake004d5e62000-10-23 17:22:08 +000075 try:
76 del sys.modules[name]
77 except KeyError:
78 pass
Guido van Rossum3bead091992-01-27 17:00:37 +000079
Neal Norwitz0e17f8c2006-01-23 07:51:27 +000080def unlink(filename):
Neal Norwitz0e17f8c2006-01-23 07:51:27 +000081 try:
82 os.unlink(filename)
83 except OSError:
84 pass
85
Christian Heimes23daade02008-02-25 12:39:23 +000086def rmtree(path):
87 try:
88 shutil.rmtree(path)
89 except OSError as e:
90 # Unix returns ENOENT, Windows returns ESRCH.
91 if e.errno not in (errno.ENOENT, errno.ESRCH):
92 raise
93
Guido van Rossum3bead091992-01-27 17:00:37 +000094def forget(modname):
Brett Cannonf1cfb622003-05-04 21:15:27 +000095 '''"Forget" a module was ever imported by removing it from sys.modules and
96 deleting any .pyc and .pyo files.'''
Fred Drake004d5e62000-10-23 17:22:08 +000097 unload(modname)
Fred Drake004d5e62000-10-23 17:22:08 +000098 for dirname in sys.path:
Skip Montanaro7a98be22007-08-16 14:35:24 +000099 unlink(os.path.join(dirname, modname + '.pyc'))
Brett Cannonf1cfb622003-05-04 21:15:27 +0000100 # Deleting the .pyo file cannot be within the 'try' for the .pyc since
101 # the chance exists that there is no .pyc (and thus the 'try' statement
102 # is exited) but there is a .pyo file.
Skip Montanaro7a98be22007-08-16 14:35:24 +0000103 unlink(os.path.join(dirname, modname + '.pyo'))
Guido van Rossum3bead091992-01-27 17:00:37 +0000104
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000105def is_resource_enabled(resource):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000106 """Test whether a resource is enabled. Known resources are set by
107 regrtest.py."""
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000108 return use_resources is not None and resource in use_resources
109
Barry Warsawc0fb6052001-08-20 22:29:23 +0000110def requires(resource, msg=None):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000111 """Raise ResourceDenied if the specified resource is not available.
112
113 If the caller's module is __main__ then automatically return True. The
114 possibility of False being returned occurs when regrtest.py is executing."""
Skip Montanarod839ecd2003-04-24 19:06:57 +0000115 # see if the caller's module is __main__ - if so, treat as if
116 # the resource was set
Benjamin Petersone549ead2009-03-28 21:42:05 +0000117 if sys._getframe(1).f_globals.get("__name__") == "__main__":
Skip Montanarod839ecd2003-04-24 19:06:57 +0000118 return
Tim Petersb4ee4eb2002-12-04 03:26:57 +0000119 if not is_resource_enabled(resource):
Barry Warsawc0fb6052001-08-20 22:29:23 +0000120 if msg is None:
121 msg = "Use of the `%s' resource not enabled" % resource
Fred Drake9a0db072003-02-03 15:19:30 +0000122 raise ResourceDenied(msg)
Barry Warsawc0fb6052001-08-20 22:29:23 +0000123
Christian Heimes5e696852008-04-09 08:37:03 +0000124HOST = 'localhost'
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000125
Christian Heimes5e696852008-04-09 08:37:03 +0000126def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
127 """Returns an unused port that should be suitable for binding. This is
128 achieved by creating a temporary socket with the same family and type as
129 the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to
130 the specified host address (defaults to 0.0.0.0) with the port set to 0,
131 eliciting an unused ephemeral port from the OS. The temporary socket is
132 then closed and deleted, and the ephemeral port is returned.
133
134 Either this method or bind_port() should be used for any tests where a
135 server socket needs to be bound to a particular port for the duration of
136 the test. Which one to use depends on whether the calling code is creating
137 a python socket, or if an unused port needs to be provided in a constructor
138 or passed to an external program (i.e. the -accept argument to openssl's
139 s_server mode). Always prefer bind_port() over find_unused_port() where
140 possible. Hard coded ports should *NEVER* be used. As soon as a server
141 socket is bound to a hard coded port, the ability to run multiple instances
142 of the test simultaneously on the same host is compromised, which makes the
143 test a ticking time bomb in a buildbot environment. On Unix buildbots, this
144 may simply manifest as a failed test, which can be recovered from without
145 intervention in most cases, but on Windows, the entire python process can
146 completely and utterly wedge, requiring someone to log in to the buildbot
147 and manually kill the affected process.
148
149 (This is easy to reproduce on Windows, unfortunately, and can be traced to
150 the SO_REUSEADDR socket option having different semantics on Windows versus
151 Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
152 listen and then accept connections on identical host/ports. An EADDRINUSE
153 socket.error will be raised at some point (depending on the platform and
154 the order bind and listen were called on each socket).
155
156 However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
157 will ever be raised when attempting to bind two identical host/ports. When
158 accept() is called on each socket, the second caller's process will steal
159 the port from the first caller, leaving them both in an awkwardly wedged
160 state where they'll no longer respond to any signals or graceful kills, and
161 must be forcibly killed via OpenProcess()/TerminateProcess().
162
163 The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option
164 instead of SO_REUSEADDR, which effectively affords the same semantics as
165 SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open
166 Source world compared to Windows ones, this is a common mistake. A quick
167 look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when
168 openssl.exe is called with the 's_server' option, for example. See
169 http://bugs.python.org/issue2550 for more info. The following site also
170 has a very thorough description about the implications of both REUSEADDR
171 and EXCLUSIVEADDRUSE on Windows:
172 http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx)
173
174 XXX: although this approach is a vast improvement on previous attempts to
175 elicit unused ports, it rests heavily on the assumption that the ephemeral
176 port returned to us by the OS won't immediately be dished back out to some
177 other process when we close and delete our temporary socket but before our
178 calling code has a chance to bind the returned port. We can deal with this
179 issue if/when we come across it.
180 """
181
182 tempsock = socket.socket(family, socktype)
183 port = bind_port(tempsock)
184 tempsock.close()
185 del tempsock
186 return port
187
188def bind_port(sock, host=HOST):
189 """Bind the socket to a free port and return the port number. Relies on
190 ephemeral ports in order to ensure we are using an unbound port. This is
191 important as many tests may be running simultaneously, especially in a
192 buildbot environment. This method raises an exception if the sock.family
193 is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR
194 or SO_REUSEPORT set on it. Tests should *never* set these socket options
195 for TCP/IP sockets. The only case for setting these options is testing
196 multicasting via multiple UDP sockets.
197
198 Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e.
199 on Windows), it will be set on the socket. This will prevent anyone else
200 from bind()'ing to our host/port for the duration of the test.
201 """
202
203 if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM:
204 if hasattr(socket, 'SO_REUSEADDR'):
205 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
206 raise TestFailed("tests should never set the SO_REUSEADDR " \
207 "socket option on TCP/IP sockets!")
208 if hasattr(socket, 'SO_REUSEPORT'):
209 if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
210 raise TestFailed("tests should never set the SO_REUSEPORT " \
211 "socket option on TCP/IP sockets!")
212 if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'):
213 sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1)
214
215 sock.bind((host, 0))
216 port = sock.getsockname()[1]
217 return port
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000218
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000219FUZZ = 1e-6
220
221def fcmp(x, y): # fuzzy comparison function
Neal Norwitz79212992006-08-21 16:27:31 +0000222 if isinstance(x, float) or isinstance(y, float):
Fred Drake004d5e62000-10-23 17:22:08 +0000223 try:
Fred Drake004d5e62000-10-23 17:22:08 +0000224 fuzz = (abs(x) + abs(y)) * FUZZ
225 if abs(x-y) <= fuzz:
226 return 0
227 except:
228 pass
Neal Norwitz79212992006-08-21 16:27:31 +0000229 elif type(x) == type(y) and isinstance(x, (tuple, list)):
Fred Drake004d5e62000-10-23 17:22:08 +0000230 for i in range(min(len(x), len(y))):
231 outcome = fcmp(x[i], y[i])
Fred Drake132dce22000-12-12 23:11:42 +0000232 if outcome != 0:
Fred Drake004d5e62000-10-23 17:22:08 +0000233 return outcome
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000234 return (len(x) > len(y)) - (len(x) < len(y))
235 return (x > y) - (x < y)
Guido van Rossum35fb82a1993-01-26 13:04:43 +0000236
Finn Bock57bc5fa2002-11-01 18:02:03 +0000237is_jython = sys.platform.startswith('java')
238
Barry Warsaw559f6682001-03-23 18:04:02 +0000239# Filename used for testing
240if os.name == 'java':
241 # Jython disallows @ in module names
242 TESTFN = '$test'
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000243else:
Barry Warsaw559f6682001-03-23 18:04:02 +0000244 TESTFN = '@test'
Walter Dörwald9b775532007-06-08 14:30:53 +0000245
246 # Assuming sys.getfilesystemencoding()!=sys.getdefaultencoding()
247 # TESTFN_UNICODE is a filename that can be encoded using the
248 # file system encoding, but *not* with the default (ascii) encoding
249 TESTFN_UNICODE = "@test-\xe0\xf2"
250 TESTFN_ENCODING = sys.getfilesystemencoding()
251 # TESTFN_UNICODE_UNENCODEABLE is a filename that should *not* be
252 # able to be encoded by *either* the default or filesystem encoding.
253 # This test really only makes sense on Windows NT platforms
254 # which have special Unicode support in posixmodule.
255 if (not hasattr(sys, "getwindowsversion") or
256 sys.getwindowsversion()[3] < 2): # 0=win32s or 1=9x/ME
257 TESTFN_UNICODE_UNENCODEABLE = None
258 else:
259 # Japanese characters (I think - from bug 846133)
260 TESTFN_UNICODE_UNENCODEABLE = "@test-\u5171\u6709\u3055\u308c\u308b"
261 try:
262 # XXX - Note - should be using TESTFN_ENCODING here - but for
263 # Windows, "mbcs" currently always operates as if in
264 # errors=ignore' mode - hence we get '?' characters rather than
265 # the exception. 'Latin1' operates as we expect - ie, fails.
266 # See [ 850997 ] mbcs encoding ignores errors
267 TESTFN_UNICODE_UNENCODEABLE.encode("Latin1")
268 except UnicodeEncodeError:
269 pass
Martin v. Löwis2411a2d2002-11-09 19:57:26 +0000270 else:
Georg Brandldb028442008-02-05 20:48:58 +0000271 print('WARNING: The filename %r CAN be encoded by the filesystem. '
272 'Unicode filename tests may not be effective'
273 % TESTFN_UNICODE_UNENCODEABLE)
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000274
275# Make sure we can write to TESTFN, try in /tmp if we can't
276fp = None
277try:
278 fp = open(TESTFN, 'w+')
279except IOError:
280 TMP_TESTFN = os.path.join('/tmp', TESTFN)
281 try:
282 fp = open(TMP_TESTFN, 'w+')
283 TESTFN = TMP_TESTFN
284 del TMP_TESTFN
285 except IOError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000286 print(('WARNING: tests will fail, unable to write to: %s or %s' %
287 (TESTFN, TMP_TESTFN)))
Neal Norwitz26a1eef2002-11-03 00:35:53 +0000288if fp is not None:
289 fp.close()
Neal Norwitz0e17f8c2006-01-23 07:51:27 +0000290 unlink(TESTFN)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000291del fp
Guido van Rossuma8f7e592001-03-13 09:31:07 +0000292
Guido van Rossume26132c1998-04-23 20:13:30 +0000293def findfile(file, here=__file__):
Brett Cannonf1cfb622003-05-04 21:15:27 +0000294 """Try to find a file on sys.path and the working directory. If it is not
295 found the argument passed to the function is returned (this does not
296 necessarily signal failure; could still be the legitimate path)."""
Fred Drake004d5e62000-10-23 17:22:08 +0000297 if os.path.isabs(file):
298 return file
Fred Drake004d5e62000-10-23 17:22:08 +0000299 path = sys.path
300 path = [os.path.dirname(here)] + path
301 for dn in path:
302 fn = os.path.join(dn, file)
303 if os.path.exists(fn): return fn
304 return file
Marc-André Lemburg36619082001-01-17 19:11:13 +0000305
306def verify(condition, reason='test failed'):
Guido van Rossuma1374e42001-01-19 19:01:56 +0000307 """Verify that condition is true. If not, raise TestFailed.
Marc-André Lemburg36619082001-01-17 19:11:13 +0000308
Skip Montanaroc955f892001-01-20 19:12:54 +0000309 The optional argument reason can be given to provide
Tim Peters983874d2001-01-19 05:59:21 +0000310 a better error text.
Tim Petersd2bf3b72001-01-18 02:22:22 +0000311 """
Tim Peters983874d2001-01-19 05:59:21 +0000312
Tim Petersd2bf3b72001-01-18 02:22:22 +0000313 if not condition:
Guido van Rossuma1374e42001-01-19 19:01:56 +0000314 raise TestFailed(reason)
Jeremy Hylton47793992001-02-19 15:35:26 +0000315
Tim Petersc2fe6182001-10-30 23:20:46 +0000316def vereq(a, b):
Tim Peters77902972001-12-29 17:34:57 +0000317 """Raise TestFailed if a == b is false.
318
319 This is better than verify(a == b) because, in case of failure, the
320 error message incorporates repr(a) and repr(b) so you can see the
321 inputs.
322
323 Note that "not (a == b)" isn't necessarily the same as "a != b"; the
324 former is tested.
325 """
326
Tim Petersc2fe6182001-10-30 23:20:46 +0000327 if not (a == b):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000328 raise TestFailed("%r == %r" % (a, b))
Tim Petersc2fe6182001-10-30 23:20:46 +0000329
Tim Peters2f228e72001-05-13 00:19:31 +0000330def sortdict(dict):
331 "Like repr(dict), but in sorted order."
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000332 items = sorted(dict.items())
Tim Peters2f228e72001-05-13 00:19:31 +0000333 reprpairs = ["%r: %r" % pair for pair in items]
334 withcommas = ", ".join(reprpairs)
335 return "{%s}" % withcommas
336
Benjamin Peterson7522c742009-01-19 21:00:09 +0000337def make_bad_fd():
338 """
339 Create an invalid file descriptor by opening and closing a file and return
340 its fd.
341 """
342 file = open(TESTFN, "wb")
343 try:
344 return file.fileno()
345 finally:
346 file.close()
347 unlink(TESTFN)
348
Thomas Wouters89f507f2006-12-13 04:49:30 +0000349def check_syntax_error(testcase, statement):
Benjamin Petersone549ead2009-03-28 21:42:05 +0000350 testcase.assertRaises(SyntaxError, compile, statement,
351 '<test string>', 'exec')
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000352
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000353def open_urlresource(url, *args, **kw):
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000354 import urllib.request, urllib.parse
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000355
Guido van Rossum360e4b82007-05-14 22:51:27 +0000356 requires('urlfetch')
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000357 filename = urllib.parse.urlparse(url)[2].split('/')[-1] # '/': it's URL!
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000358
359 for path in [os.path.curdir, os.path.pardir]:
360 fn = os.path.join(path, filename)
361 if os.path.exists(fn):
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000362 return open(fn, *args, **kw)
Hye-Shik Changaaa2f1d2005-12-10 17:44:27 +0000363
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000364 print('\tfetching %s ...' % url, file=get_original_stdout())
Jeremy Hylton1afc1692008-06-18 20:49:58 +0000365 fn, _ = urllib.request.urlretrieve(url, filename)
Martin v. Löwis234a34a2007-08-30 20:58:02 +0000366 return open(fn, *args, **kw)
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000367
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000368
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000369class WarningsRecorder(object):
370 """Convenience wrapper for the warnings list returned on
371 entry to the warnings.catch_warnings() context manager.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000372 """
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000373 def __init__(self, warnings_list):
374 self.warnings = warnings_list
375
376 def __getattr__(self, attr):
377 if self.warnings:
378 return getattr(self.warnings[-1], attr)
379 elif attr in warnings.WarningMessage._WARNING_DETAILS:
380 return None
381 raise AttributeError("%r has no attribute %r" % (self, attr))
382
383 def reset(self):
384 del self.warnings[:]
385
386@contextlib.contextmanager
387def check_warnings():
388 with warnings.catch_warnings(record=True) as w:
389 yield WarningsRecorder(w)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000390
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000391
392class CleanImport(object):
393 """Context manager to force import to return a new module reference.
394
395 This is useful for testing module-level behaviours, such as
Nick Coghlanb1304932008-07-13 12:25:08 +0000396 the emission of a DeprecationWarning on import.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000397
398 Use like this:
399
400 with CleanImport("foo"):
401 __import__("foo") # new reference
402 """
403
404 def __init__(self, *module_names):
405 self.original_modules = sys.modules.copy()
406 for module_name in module_names:
407 if module_name in sys.modules:
408 module = sys.modules[module_name]
409 # It is possible that module_name is just an alias for
410 # another module (e.g. stub for modules renamed in 3.x).
411 # In that case, we also need delete the real module to clear
412 # the import cache.
413 if module.__name__ != module_name:
414 del sys.modules[module.__name__]
415 del sys.modules[module_name]
416
417 def __enter__(self):
418 return self
419
420 def __exit__(self, *ignore_exc):
421 sys.modules.update(self.original_modules)
422
423
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000424class EnvironmentVarGuard(object):
425
426 """Class to help protect the environment variable properly. Can be used as
427 a context manager."""
428
429 def __init__(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000430 self._environ = os.environ
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000431 self._unset = set()
432 self._reset = dict()
433
434 def set(self, envvar, value):
435 if envvar not in self._environ:
436 self._unset.add(envvar)
437 else:
438 self._reset[envvar] = self._environ[envvar]
439 self._environ[envvar] = value
440
441 def unset(self, envvar):
442 if envvar in self._environ:
443 self._reset[envvar] = self._environ[envvar]
444 del self._environ[envvar]
445
446 def __enter__(self):
447 return self
448
449 def __exit__(self, *ignore_exc):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000450 for envvar, value in self._reset.items():
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000451 self._environ[envvar] = value
452 for unset in self._unset:
453 del self._environ[unset]
454
Guido van Rossumd8faa362007-04-27 19:54:29 +0000455class TransientResource(object):
456
457 """Raise ResourceDenied if an exception is raised while the context manager
458 is in effect that matches the specified exception and attributes."""
459
460 def __init__(self, exc, **kwargs):
461 self.exc = exc
462 self.attrs = kwargs
463
464 def __enter__(self):
465 return self
466
467 def __exit__(self, type_=None, value=None, traceback=None):
468 """If type_ is a subclass of self.exc and value has attributes matching
469 self.attrs, raise ResourceDenied. Otherwise let the exception
470 propagate (if any)."""
471 if type_ is not None and issubclass(self.exc, type_):
472 for attr, attr_value in self.attrs.items():
473 if not hasattr(value, attr):
474 break
475 if getattr(value, attr) != attr_value:
476 break
477 else:
478 raise ResourceDenied("an optional resource is not available")
479
480
481def transient_internet():
482 """Return a context manager that raises ResourceDenied when various issues
483 with the Internet connection manifest themselves as exceptions."""
484 time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
485 socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
486 ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
487 return contextlib.nested(time_out, socket_peer_reset, ioerror_peer_reset)
488
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000489
Thomas Woutersed03b412007-08-28 21:37:11 +0000490@contextlib.contextmanager
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000491def captured_output(stream_name):
492 """Run the 'with' statement body using a StringIO object in place of a
493 specific attribute on the sys module.
494 Example use (with 'stream_name=stdout')::
Thomas Woutersed03b412007-08-28 21:37:11 +0000495
496 with captured_stdout() as s:
Neal Norwitz752abd02008-05-13 04:55:24 +0000497 print("hello")
Thomas Woutersed03b412007-08-28 21:37:11 +0000498 assert s.getvalue() == "hello"
499 """
500 import io
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000501 orig_stdout = getattr(sys, stream_name)
502 setattr(sys, stream_name, io.StringIO())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000503 try:
504 yield getattr(sys, stream_name)
505 finally:
506 setattr(sys, stream_name, orig_stdout)
Benjamin Petersonad9d48d2008-04-02 21:49:44 +0000507
508def captured_stdout():
509 return captured_output("stdout")
Thomas Woutersed03b412007-08-28 21:37:11 +0000510
Benjamin Petersone549ead2009-03-28 21:42:05 +0000511def gc_collect():
512 """Force as many objects as possible to be collected.
513
514 In non-CPython implementations of Python, this is needed because timely
515 deallocation is not guaranteed by the garbage collector. (Even in CPython
516 this can be the case in case of reference cycles.) This means that __del__
517 methods may be called later than expected and weakrefs may remain alive for
518 longer than expected. This function tries its best to force all garbage
519 objects to disappear.
520 """
521 import gc
522 gc.collect()
523 gc.collect()
524 gc.collect()
525
Thomas Woutersed03b412007-08-28 21:37:11 +0000526
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000527#=======================================================================
Thomas Wouters477c8d52006-05-27 19:21:47 +0000528# Decorator for running a function in a different locale, correctly resetting
529# it afterwards.
530
531def run_with_locale(catstr, *locales):
532 def decorator(func):
533 def inner(*args, **kwds):
534 try:
535 import locale
536 category = getattr(locale, catstr)
537 orig_locale = locale.setlocale(category)
538 except AttributeError:
539 # if the test author gives us an invalid category string
540 raise
541 except:
542 # cannot retrieve original locale, so do nothing
543 locale = orig_locale = None
544 else:
545 for loc in locales:
546 try:
547 locale.setlocale(category, loc)
548 break
549 except:
550 pass
551
552 # now run the function, resetting the locale on exceptions
553 try:
554 return func(*args, **kwds)
555 finally:
556 if locale and orig_locale:
557 locale.setlocale(category, orig_locale)
Neal Norwitz221085d2007-02-25 20:55:47 +0000558 inner.__name__ = func.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +0000559 inner.__doc__ = func.__doc__
560 return inner
561 return decorator
562
563#=======================================================================
Georg Brandldb028442008-02-05 20:48:58 +0000564# Big-memory-test support. Separate from 'resources' because memory use
565# should be configurable.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000566
567# Some handy shorthands. Note that these are used for byte-limits as well
568# as size-limits, in the various bigmem tests
569_1M = 1024*1024
570_1G = 1024 * _1M
571_2G = 2 * _1G
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000572_4G = 4 * _1G
Thomas Wouters477c8d52006-05-27 19:21:47 +0000573
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000574MAX_Py_ssize_t = sys.maxsize
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000575
Thomas Wouters477c8d52006-05-27 19:21:47 +0000576def set_memlimit(limit):
577 import re
578 global max_memuse
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000579 global real_max_memuse
Thomas Wouters477c8d52006-05-27 19:21:47 +0000580 sizes = {
581 'k': 1024,
582 'm': _1M,
583 'g': _1G,
584 't': 1024*_1G,
585 }
586 m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit,
587 re.IGNORECASE | re.VERBOSE)
588 if m is None:
589 raise ValueError('Invalid memory limit %r' % (limit,))
590 memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()])
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000591 real_max_memuse = memlimit
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000592 if memlimit > MAX_Py_ssize_t:
593 memlimit = MAX_Py_ssize_t
594 if memlimit < _2G - 1:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000595 raise ValueError('Memory limit %r too low to be useful' % (limit,))
596 max_memuse = memlimit
597
598def bigmemtest(minsize, memuse, overhead=5*_1M):
599 """Decorator for bigmem tests.
600
601 'minsize' is the minimum useful size for the test (in arbitrary,
602 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
603 the test, or a good estimate of it. 'overhead' specifies fixed overhead,
Christian Heimes33fe8092008-04-13 13:53:33 +0000604 independent of the testsize, and defaults to 5Mb.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000605
606 The decorator tries to guess a good value for 'size' and passes it to
607 the decorated test function. If minsize * memuse is more than the
608 allowed memory use (as defined by max_memuse), the test is skipped.
609 Otherwise, minsize is adjusted upward to use up to max_memuse.
610 """
611 def decorator(f):
612 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000613 # Retrieve values in case someone decided to adjust them
614 minsize = wrapper.minsize
615 memuse = wrapper.memuse
616 overhead = wrapper.overhead
Thomas Wouters477c8d52006-05-27 19:21:47 +0000617 if not max_memuse:
618 # If max_memuse is 0 (the default),
619 # we still want to run the tests with size set to a few kb,
620 # to make sure they work. We still want to avoid using
621 # too much memory, though, but we do that noisily.
622 maxsize = 5147
623 self.failIf(maxsize * memuse + overhead > 20 * _1M)
624 else:
625 maxsize = int((max_memuse - overhead) / memuse)
626 if maxsize < minsize:
627 # Really ought to print 'test skipped' or something
628 if verbose:
629 sys.stderr.write("Skipping %s because of memory "
630 "constraint\n" % (f.__name__,))
631 return
632 # Try to keep some breathing room in memory use
633 maxsize = max(maxsize - 50 * _1M, minsize)
634 return f(self, maxsize)
635 wrapper.minsize = minsize
636 wrapper.memuse = memuse
637 wrapper.overhead = overhead
638 return wrapper
639 return decorator
640
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000641def precisionbigmemtest(size, memuse, overhead=5*_1M):
642 def decorator(f):
643 def wrapper(self):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000644 size = wrapper.size
645 memuse = wrapper.memuse
646 overhead = wrapper.overhead
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000647 if not real_max_memuse:
648 maxsize = 5147
649 else:
650 maxsize = size
651
652 if real_max_memuse and real_max_memuse < maxsize * memuse:
653 if verbose:
654 sys.stderr.write("Skipping %s because of memory "
655 "constraint\n" % (f.__name__,))
656 return
657
658 return f(self, maxsize)
659 wrapper.size = size
660 wrapper.memuse = memuse
661 wrapper.overhead = overhead
662 return wrapper
663 return decorator
664
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000665def bigaddrspacetest(f):
666 """Decorator for tests that fill the address space."""
667 def wrapper(self):
668 if max_memuse < MAX_Py_ssize_t:
669 if verbose:
670 sys.stderr.write("Skipping %s because of memory "
671 "constraint\n" % (f.__name__,))
672 else:
673 return f(self)
674 return wrapper
675
Thomas Wouters477c8d52006-05-27 19:21:47 +0000676#=======================================================================
Guido van Rossumd8faa362007-04-27 19:54:29 +0000677# unittest integration.
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000678
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000679class BasicTestRunner:
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000680 def run(self, test):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000681 result = unittest.TestResult()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000682 test(result)
683 return result
684
Benjamin Petersone549ead2009-03-28 21:42:05 +0000685def _id(obj):
686 return obj
687
688def requires_resource(resource):
689 if resource_is_enabled(resource):
690 return _id
691 else:
692 return unittest.skip("resource {0!r} is not enabled".format(resource))
693
694def cpython_only(test):
695 """
696 Decorator for tests only applicable on CPython.
697 """
698 return impl_detail(cpython=True)(test)
699
700def impl_detail(msg=None, **guards):
701 if check_impl_detail(**guards):
702 return _id
703 if msg is None:
704 guardnames, default = _parse_guards(guards)
705 if default:
706 msg = "implementation detail not available on {0}"
707 else:
708 msg = "implementation detail specific to {0}"
709 guardnames = sorted(guardnames.keys())
710 msg = msg.format(' or '.join(guardnames))
711 return unittest.skip(msg)
712
713def _parse_guards(guards):
714 # Returns a tuple ({platform_name: run_me}, default_value)
715 if not guards:
716 return ({'cpython': True}, False)
717 is_true = guards.values()[0]
718 assert guards.values() == [is_true] * len(guards) # all True or all False
719 return (guards, not is_true)
720
721# Use the following check to guard CPython's implementation-specific tests --
722# or to run them only on the implementation(s) guarded by the arguments.
723def check_impl_detail(**guards):
724 """This function returns True or False depending on the host platform.
725 Examples:
726 if check_impl_detail(): # only on CPython (default)
727 if check_impl_detail(jython=True): # only on Jython
728 if check_impl_detail(cpython=False): # everywhere except on CPython
729 """
730 guards, default = _parse_guards(guards)
731 return guards.get(platform.python_implementation().lower(), default)
732
733
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000734
Guido van Rossumd8faa362007-04-27 19:54:29 +0000735def _run_suite(suite):
Barry Warsawc88425e2001-09-20 06:31:22 +0000736 """Run tests from a unittest.TestSuite-derived class."""
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000737 if verbose:
Fred Drake84a59342001-03-23 04:21:17 +0000738 runner = unittest.TextTestRunner(sys.stdout, verbosity=2)
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000739 else:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000740 runner = BasicTestRunner()
Fred Drakecd1b1dd2001-03-21 18:26:33 +0000741
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000742 result = runner.run(suite)
743 if not result.wasSuccessful():
Fred Drake14f6c182001-07-16 18:51:32 +0000744 if len(result.errors) == 1 and not result.failures:
745 err = result.errors[0][1]
746 elif len(result.failures) == 1 and not result.errors:
747 err = result.failures[0][1]
748 else:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000749 err = "errors occurred; run in verbose mode for details"
Tim Peters2d84f2c2001-09-08 03:37:56 +0000750 raise TestFailed(err)
Tim Petersa0a62222001-09-09 06:12:01 +0000751
Barry Warsawc10d6902001-09-20 06:30:41 +0000752
Walter Dörwald21d3a322003-05-01 17:45:56 +0000753def run_unittest(*classes):
754 """Run tests from unittest.TestCase-derived classes."""
Guido van Rossumd8faa362007-04-27 19:54:29 +0000755 valid_types = (unittest.TestSuite, unittest.TestCase)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000756 suite = unittest.TestSuite()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000757 for cls in classes:
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000758 if isinstance(cls, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000759 if cls in sys.modules:
760 suite.addTest(unittest.findTestCases(sys.modules[cls]))
761 else:
762 raise ValueError("str arguments must be keys in sys.modules")
763 elif isinstance(cls, valid_types):
Raymond Hettinger21d99872003-07-16 02:59:32 +0000764 suite.addTest(cls)
765 else:
766 suite.addTest(unittest.makeSuite(cls))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000767 _run_suite(suite)
Raymond Hettinger9dcbbea2003-04-27 07:54:23 +0000768
Barry Warsawc10d6902001-09-20 06:30:41 +0000769
Tim Petersa0a62222001-09-09 06:12:01 +0000770#=======================================================================
771# doctest driver.
772
773def run_doctest(module, verbosity=None):
Tim Peters17111f32001-10-03 04:08:26 +0000774 """Run doctest on the given module. Return (#failures, #tests).
Tim Petersa0a62222001-09-09 06:12:01 +0000775
776 If optional argument verbosity is not specified (or is None), pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000777 support's belief about verbosity on to doctest. Else doctest's
Tim Petersbea3fb82001-09-10 01:39:21 +0000778 usual behavior is used (it searches sys.argv for -v).
Tim Petersa0a62222001-09-09 06:12:01 +0000779 """
780
781 import doctest
782
783 if verbosity is None:
784 verbosity = verbose
785 else:
786 verbosity = None
787
Tim Peters342ca752001-09-25 19:13:20 +0000788 # Direct doctest output (normally just errors) to real stdout; doctest
789 # output shouldn't be compared by regrtest.
790 save_stdout = sys.stdout
Tim Peters8dee8092001-09-25 20:05:11 +0000791 sys.stdout = get_original_stdout()
Tim Peters342ca752001-09-25 19:13:20 +0000792 try:
793 f, t = doctest.testmod(module, verbose=verbosity)
794 if f:
795 raise TestFailed("%d of %d doctests failed" % (f, t))
796 finally:
797 sys.stdout = save_stdout
Raymond Hettinger35b34bd2003-05-17 00:58:33 +0000798 if verbose:
Georg Brandldb028442008-02-05 20:48:58 +0000799 print('doctest (%s) ... %d tests with zero failures' %
800 (module.__name__, t))
Raymond Hettinger35b34bd2003-05-17 00:58:33 +0000801 return f, t
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000802
803#=======================================================================
804# Threading support to prevent reporting refleaks when running regrtest.py -R
805
806def threading_setup():
807 import threading
808 return len(threading._active), len(threading._limbo)
809
810def threading_cleanup(num_active, num_limbo):
811 import threading
812 import time
813
814 _MAX_COUNT = 10
815 count = 0
816 while len(threading._active) != num_active and count < _MAX_COUNT:
817 count += 1
818 time.sleep(0.1)
819
820 count = 0
821 while len(threading._limbo) != num_limbo and count < _MAX_COUNT:
822 count += 1
823 time.sleep(0.1)
824
825def reap_children():
826 """Use this function at the end of test_main() whenever sub-processes
827 are started. This will help ensure that no extra children (zombies)
828 stick around to hog resources and create problems when looking
829 for refleaks.
830 """
831
832 # Reap all our dead child processes so we don't leave zombies around.
833 # These hog resources and might be causing some of the buildbots to die.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000834 if hasattr(os, 'waitpid'):
835 any_process = -1
836 while True:
837 try:
838 # This will raise an exception on Windows. That's ok.
839 pid, status = os.waitpid(any_process, os.WNOHANG)
840 if pid == 0:
841 break
842 except:
843 break