blob: 8a9f1c0a9d7b6ed8e0e5c06cb49a0b4b54b77cbc [file] [log] [blame]
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001"""Test case implementation"""
2
3import sys
4import functools
5import difflib
Antoine Pitrou0715b9f2013-09-14 19:45:47 +02006import logging
Benjamin Petersonbed7d042009-07-19 21:01:52 +00007import pprint
8import re
9import warnings
Raymond Hettinger6e165b32010-11-27 09:31:37 +000010import collections
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010011import contextlib
Antoine Pitrou96810222014-04-29 01:23:50 +020012import traceback
Benjamin Petersonbed7d042009-07-19 21:01:52 +000013
Benjamin Peterson847a4112010-03-14 15:04:17 +000014from . import result
Florent Xiclunac53ae582011-11-04 08:25:54 +010015from .util import (strclass, safe_repr, _count_diff_all_purpose,
Serhiy Storchaka77622f52013-09-23 23:07:00 +030016 _count_diff_hashable, _common_shorten_repr)
Benjamin Petersonbed7d042009-07-19 21:01:52 +000017
Benjamin Petersondccc1fc2010-03-22 00:15:53 +000018__unittest = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +000019
Michael Foord9dad32e2010-06-05 13:49:56 +000020
21DIFF_OMITTED = ('\nDiff is %s characters long. '
22 'Set self.maxDiff to None to see it.')
23
Benjamin Petersonbed7d042009-07-19 21:01:52 +000024class SkipTest(Exception):
25 """
26 Raise this exception in a test to skip it.
27
Ezio Melotti265281a2013-03-27 20:11:55 +020028 Usually you can use TestCase.skipTest() or one of the skipping decorators
Benjamin Petersonbed7d042009-07-19 21:01:52 +000029 instead of raising this directly.
30 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +000031
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010032class _ShouldStop(Exception):
Benjamin Petersonbed7d042009-07-19 21:01:52 +000033 """
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010034 The test should stop.
Benjamin Petersonbed7d042009-07-19 21:01:52 +000035 """
36
Benjamin Petersonbed7d042009-07-19 21:01:52 +000037class _UnexpectedSuccess(Exception):
38 """
39 The test was supposed to fail, but it didn't!
40 """
Michael Foordb3468f72010-12-19 03:19:47 +000041
42
43class _Outcome(object):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010044 def __init__(self, result=None):
45 self.expecting_failure = False
46 self.result = result
47 self.result_supports_subtests = hasattr(result, "addSubTest")
Michael Foordb3468f72010-12-19 03:19:47 +000048 self.success = True
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010049 self.skipped = []
Michael Foordb3468f72010-12-19 03:19:47 +000050 self.expectedFailure = None
51 self.errors = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010052
53 @contextlib.contextmanager
54 def testPartExecutor(self, test_case, isTest=False):
55 old_success = self.success
56 self.success = True
57 try:
58 yield
59 except KeyboardInterrupt:
60 raise
61 except SkipTest as e:
62 self.success = False
63 self.skipped.append((test_case, str(e)))
64 except _ShouldStop:
65 pass
66 except:
67 exc_info = sys.exc_info()
68 if self.expecting_failure:
69 self.expectedFailure = exc_info
70 else:
71 self.success = False
72 self.errors.append((test_case, exc_info))
Victor Stinner031bd532013-12-09 01:52:50 +010073 # explicitly break a reference cycle:
74 # exc_info -> frame -> exc_info
75 exc_info = None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010076 else:
77 if self.result_supports_subtests and self.success:
78 self.errors.append((test_case, None))
79 finally:
80 self.success = self.success and old_success
Michael Foordb3468f72010-12-19 03:19:47 +000081
Benjamin Petersonbed7d042009-07-19 21:01:52 +000082
83def _id(obj):
84 return obj
85
86def skip(reason):
87 """
88 Unconditionally skip a test.
89 """
90 def decorator(test_item):
Antoine Pitroub05ac862012-04-25 14:56:46 +020091 if not isinstance(test_item, type):
Benjamin Peterson847a4112010-03-14 15:04:17 +000092 @functools.wraps(test_item)
93 def skip_wrapper(*args, **kwargs):
94 raise SkipTest(reason)
95 test_item = skip_wrapper
96
97 test_item.__unittest_skip__ = True
98 test_item.__unittest_skip_why__ = reason
99 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000100 return decorator
101
102def skipIf(condition, reason):
103 """
104 Skip a test if the condition is true.
105 """
106 if condition:
107 return skip(reason)
108 return _id
109
110def skipUnless(condition, reason):
111 """
112 Skip a test unless the condition is true.
113 """
114 if not condition:
115 return skip(reason)
116 return _id
117
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100118def expectedFailure(test_item):
119 test_item.__unittest_expecting_failure__ = True
120 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000121
122
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200123class _BaseTestCaseContext:
124
125 def __init__(self, test_case):
126 self.test_case = test_case
127
128 def _raiseFailure(self, standardMsg):
129 msg = self.test_case._formatMessage(self.msg, standardMsg)
130 raise self.test_case.failureException(msg)
131
132
133class _AssertRaisesBaseContext(_BaseTestCaseContext):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000134
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300135 def __init__(self, expected, test_case, callable_obj=None,
Ezio Melottib4dc2502011-05-06 15:01:41 +0300136 expected_regex=None):
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200137 _BaseTestCaseContext.__init__(self, test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000138 self.expected = expected
Ezio Melottib4dc2502011-05-06 15:01:41 +0300139 self.test_case = test_case
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300140 if callable_obj is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000141 try:
142 self.obj_name = callable_obj.__name__
143 except AttributeError:
144 self.obj_name = str(callable_obj)
145 else:
146 self.obj_name = None
R David Murrayef1c2672014-03-25 15:31:50 -0400147 if expected_regex is not None:
Ezio Melottied3a7d22010-12-01 02:32:32 +0000148 expected_regex = re.compile(expected_regex)
149 self.expected_regex = expected_regex
Ezio Melottib4dc2502011-05-06 15:01:41 +0300150 self.msg = None
151
Ezio Melottib4dc2502011-05-06 15:01:41 +0300152 def handle(self, name, callable_obj, args, kwargs):
153 """
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300154 If callable_obj is None, assertRaises/Warns is being used as a
Ezio Melottib4dc2502011-05-06 15:01:41 +0300155 context manager, so check for a 'msg' kwarg and return self.
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300156 If callable_obj is not None, call it passing args and kwargs.
Ezio Melottib4dc2502011-05-06 15:01:41 +0300157 """
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300158 if callable_obj is None:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300159 self.msg = kwargs.pop('msg', None)
160 return self
161 with self:
162 callable_obj(*args, **kwargs)
163
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000164
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000165class _AssertRaisesContext(_AssertRaisesBaseContext):
166 """A context manager used to implement TestCase.assertRaises* methods."""
167
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000168 def __enter__(self):
Ezio Melotti49008232010-02-08 21:57:48 +0000169 return self
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000170
171 def __exit__(self, exc_type, exc_value, tb):
172 if exc_type is None:
173 try:
174 exc_name = self.expected.__name__
175 except AttributeError:
176 exc_name = str(self.expected)
177 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300178 self._raiseFailure("{} not raised by {}".format(exc_name,
179 self.obj_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000180 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300181 self._raiseFailure("{} not raised".format(exc_name))
Antoine Pitrou96810222014-04-29 01:23:50 +0200182 else:
183 traceback.clear_frames(tb)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000184 if not issubclass(exc_type, self.expected):
185 # let unexpected exceptions pass through
186 return False
Ezio Melotti49008232010-02-08 21:57:48 +0000187 # store exception, without traceback, for later retrieval
188 self.exception = exc_value.with_traceback(None)
Ezio Melottied3a7d22010-12-01 02:32:32 +0000189 if self.expected_regex is None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000190 return True
191
Ezio Melottied3a7d22010-12-01 02:32:32 +0000192 expected_regex = self.expected_regex
193 if not expected_regex.search(str(exc_value)):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300194 self._raiseFailure('"{}" does not match "{}"'.format(
195 expected_regex.pattern, str(exc_value)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000196 return True
197
198
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000199class _AssertWarnsContext(_AssertRaisesBaseContext):
200 """A context manager used to implement TestCase.assertWarns* methods."""
201
202 def __enter__(self):
203 # The __warningregistry__'s need to be in a pristine state for tests
204 # to work properly.
205 for v in sys.modules.values():
206 if getattr(v, '__warningregistry__', None):
207 v.__warningregistry__ = {}
208 self.warnings_manager = warnings.catch_warnings(record=True)
209 self.warnings = self.warnings_manager.__enter__()
210 warnings.simplefilter("always", self.expected)
211 return self
212
213 def __exit__(self, exc_type, exc_value, tb):
214 self.warnings_manager.__exit__(exc_type, exc_value, tb)
215 if exc_type is not None:
216 # let unexpected exceptions pass through
217 return
218 try:
219 exc_name = self.expected.__name__
220 except AttributeError:
221 exc_name = str(self.expected)
222 first_matching = None
223 for m in self.warnings:
224 w = m.message
225 if not isinstance(w, self.expected):
226 continue
227 if first_matching is None:
228 first_matching = w
Ezio Melottied3a7d22010-12-01 02:32:32 +0000229 if (self.expected_regex is not None and
230 not self.expected_regex.search(str(w))):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000231 continue
232 # store warning for later retrieval
233 self.warning = w
234 self.filename = m.filename
235 self.lineno = m.lineno
236 return
237 # Now we simply try to choose a helpful failure message
238 if first_matching is not None:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300239 self._raiseFailure('"{}" does not match "{}"'.format(
240 self.expected_regex.pattern, str(first_matching)))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000241 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300242 self._raiseFailure("{} not triggered by {}".format(exc_name,
243 self.obj_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000244 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300245 self._raiseFailure("{} not triggered".format(exc_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000246
247
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200248
249_LoggingWatcher = collections.namedtuple("_LoggingWatcher",
250 ["records", "output"])
251
252
253class _CapturingHandler(logging.Handler):
254 """
255 A logging handler capturing all (raw and formatted) logging output.
256 """
257
258 def __init__(self):
259 logging.Handler.__init__(self)
260 self.watcher = _LoggingWatcher([], [])
261
262 def flush(self):
263 pass
264
265 def emit(self, record):
266 self.watcher.records.append(record)
267 msg = self.format(record)
268 self.watcher.output.append(msg)
269
270
271
272class _AssertLogsContext(_BaseTestCaseContext):
273 """A context manager used to implement TestCase.assertLogs()."""
274
275 LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s"
276
277 def __init__(self, test_case, logger_name, level):
278 _BaseTestCaseContext.__init__(self, test_case)
279 self.logger_name = logger_name
280 if level:
281 self.level = logging._nameToLevel.get(level, level)
282 else:
283 self.level = logging.INFO
284 self.msg = None
285
286 def __enter__(self):
287 if isinstance(self.logger_name, logging.Logger):
288 logger = self.logger = self.logger_name
289 else:
290 logger = self.logger = logging.getLogger(self.logger_name)
291 formatter = logging.Formatter(self.LOGGING_FORMAT)
292 handler = _CapturingHandler()
293 handler.setFormatter(formatter)
294 self.watcher = handler.watcher
295 self.old_handlers = logger.handlers[:]
296 self.old_level = logger.level
297 self.old_propagate = logger.propagate
298 logger.handlers = [handler]
299 logger.setLevel(self.level)
300 logger.propagate = False
301 return handler.watcher
302
303 def __exit__(self, exc_type, exc_value, tb):
304 self.logger.handlers = self.old_handlers
305 self.logger.propagate = self.old_propagate
306 self.logger.setLevel(self.old_level)
307 if exc_type is not None:
308 # let unexpected exceptions pass through
309 return False
310 if len(self.watcher.records) == 0:
311 self._raiseFailure(
312 "no logs of level {} or higher triggered on {}"
313 .format(logging.getLevelName(self.level), self.logger.name))
314
315
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000316class TestCase(object):
317 """A class whose instances are single test cases.
318
319 By default, the test code itself should be placed in a method named
320 'runTest'.
321
322 If the fixture may be used for many test cases, create as
323 many test methods as are needed. When instantiating such a TestCase
324 subclass, specify in the constructor arguments the name of the test method
325 that the instance is to execute.
326
327 Test authors should subclass TestCase for their own tests. Construction
328 and deconstruction of the test's environment ('fixture') can be
329 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
330
331 If it is necessary to override the __init__ method, the base class
332 __init__ method must always be called. It is important that subclasses
333 should not change the signature of their __init__ method, since instances
334 of the classes are instantiated automatically by parts of the framework
335 in order to be run.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000336
Ezio Melotti31797e52013-03-29 03:42:29 +0200337 When subclassing TestCase, you can set these attributes:
338 * failureException: determines which exception will be raised when
339 the instance's assertion methods fail; test methods raising this
340 exception will be deemed to have 'failed' rather than 'errored'.
341 * longMessage: determines whether long messages (including repr of
342 objects used in assert methods) will be printed on failure in *addition*
343 to any explicit message passed.
344 * maxDiff: sets the maximum length of a diff in failure messages
345 by assert methods using difflib. It is looked up as an instance
346 attribute so can be configured by individual tests if required.
347 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000348
349 failureException = AssertionError
350
Michael Foord5074df62010-12-03 00:53:09 +0000351 longMessage = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000352
Michael Foord085dfd32010-06-05 12:17:02 +0000353 maxDiff = 80*8
354
Ezio Melottiedd117f2011-04-27 10:20:38 +0300355 # If a string is longer than _diffThreshold, use normal comparison instead
356 # of difflib. See #11763.
357 _diffThreshold = 2**16
358
Benjamin Peterson847a4112010-03-14 15:04:17 +0000359 # Attribute used by TestSuite for classSetUp
360
361 _classSetupFailed = False
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000362
363 def __init__(self, methodName='runTest'):
364 """Create an instance of the class that will use the named test
365 method when executed. Raises a ValueError if the instance does
366 not have a method with the specified name.
367 """
368 self._testMethodName = methodName
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100369 self._outcome = None
Michael Foord32e1d832011-01-03 17:00:11 +0000370 self._testMethodDoc = 'No test'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000371 try:
372 testMethod = getattr(self, methodName)
373 except AttributeError:
Michael Foord32e1d832011-01-03 17:00:11 +0000374 if methodName != 'runTest':
375 # we allow instantiation with no explicit method name
376 # but not an *incorrect* or missing method name
377 raise ValueError("no such test method in %s: %s" %
378 (self.__class__, methodName))
379 else:
380 self._testMethodDoc = testMethod.__doc__
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000381 self._cleanups = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100382 self._subtest = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000383
384 # Map types to custom assertEqual functions that will compare
385 # instances of said type in more detail to generate a more useful
386 # error message.
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500387 self._type_equality_funcs = {}
Michael Foord8ca6d982010-11-20 15:34:26 +0000388 self.addTypeEqualityFunc(dict, 'assertDictEqual')
389 self.addTypeEqualityFunc(list, 'assertListEqual')
390 self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
391 self.addTypeEqualityFunc(set, 'assertSetEqual')
392 self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
393 self.addTypeEqualityFunc(str, 'assertMultiLineEqual')
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000394
395 def addTypeEqualityFunc(self, typeobj, function):
396 """Add a type specific assertEqual style function to compare a type.
397
398 This method is for use by TestCase subclasses that need to register
399 their own type equality functions to provide nicer error messages.
400
401 Args:
402 typeobj: The data type to call this function on when both values
403 are of the same type in assertEqual().
404 function: The callable taking two arguments and an optional
405 msg= argument that raises self.failureException with a
406 useful error message when the two arguments are not equal.
407 """
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000408 self._type_equality_funcs[typeobj] = function
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000409
410 def addCleanup(self, function, *args, **kwargs):
411 """Add a function, with arguments, to be called when the test is
412 completed. Functions added are called on a LIFO basis and are
413 called after tearDown on test failure or success.
414
415 Cleanup items are called even if setUp fails (unlike tearDown)."""
416 self._cleanups.append((function, args, kwargs))
417
418 def setUp(self):
419 "Hook method for setting up the test fixture before exercising it."
420 pass
421
422 def tearDown(self):
423 "Hook method for deconstructing the test fixture after testing it."
424 pass
425
Benjamin Peterson847a4112010-03-14 15:04:17 +0000426 @classmethod
427 def setUpClass(cls):
428 "Hook method for setting up class fixture before running tests in the class."
429
430 @classmethod
431 def tearDownClass(cls):
432 "Hook method for deconstructing the class fixture after running all tests in the class."
433
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000434 def countTestCases(self):
435 return 1
436
437 def defaultTestResult(self):
438 return result.TestResult()
439
440 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000441 """Returns a one-line description of the test, or None if no
442 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000443
Michael Foord34c94622010-02-10 15:51:42 +0000444 The default implementation of this method returns the first line of
445 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000446 """
Michael Foord34c94622010-02-10 15:51:42 +0000447 doc = self._testMethodDoc
448 return doc and doc.split("\n")[0].strip() or None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000449
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000450
451 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000452 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000453
454 def __eq__(self, other):
455 if type(self) is not type(other):
456 return NotImplemented
457
458 return self._testMethodName == other._testMethodName
459
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000460 def __hash__(self):
461 return hash((type(self), self._testMethodName))
462
463 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000464 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000465
466 def __repr__(self):
467 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000468 (strclass(self.__class__), self._testMethodName)
469
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100470 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000471 addSkip = getattr(result, 'addSkip', None)
472 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100473 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000474 else:
475 warnings.warn("TestResult has no addSkip method, skips not reported",
476 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100477 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000478
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100479 @contextlib.contextmanager
480 def subTest(self, msg=None, **params):
481 """Return a context manager that will return the enclosed block
482 of code in a subtest identified by the optional message and
483 keyword parameters. A failure in the subtest marks the test
484 case as failed but resumes execution at the end of the enclosed
485 block, allowing further test code to be executed.
486 """
487 if not self._outcome.result_supports_subtests:
488 yield
489 return
490 parent = self._subtest
491 if parent is None:
492 params_map = collections.ChainMap(params)
493 else:
494 params_map = parent.params.new_child(params)
495 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000496 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100497 with self._outcome.testPartExecutor(self._subtest, isTest=True):
498 yield
499 if not self._outcome.success:
500 result = self._outcome.result
501 if result is not None and result.failfast:
502 raise _ShouldStop
503 elif self._outcome.expectedFailure:
504 # If the test is expecting a failure, we really want to
505 # stop now and register the expected failure.
506 raise _ShouldStop
507 finally:
508 self._subtest = parent
509
510 def _feedErrorsToResult(self, result, errors):
511 for test, exc_info in errors:
512 if isinstance(test, _SubTest):
513 result.addSubTest(test.test_case, test, exc_info)
514 elif exc_info is not None:
515 if issubclass(exc_info[0], self.failureException):
516 result.addFailure(test, exc_info)
517 else:
518 result.addError(test, exc_info)
519
520 def _addExpectedFailure(self, result, exc_info):
521 try:
522 addExpectedFailure = result.addExpectedFailure
523 except AttributeError:
524 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
525 RuntimeWarning)
526 result.addSuccess(self)
527 else:
528 addExpectedFailure(self, exc_info)
529
530 def _addUnexpectedSuccess(self, result):
531 try:
532 addUnexpectedSuccess = result.addUnexpectedSuccess
533 except AttributeError:
534 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
535 RuntimeWarning)
536 # We need to pass an actual exception and traceback to addFailure,
537 # otherwise the legacy result can choke.
538 try:
539 raise _UnexpectedSuccess from None
540 except _UnexpectedSuccess:
541 result.addFailure(self, sys.exc_info())
542 else:
543 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000544
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000545 def run(self, result=None):
546 orig_result = result
547 if result is None:
548 result = self.defaultTestResult()
549 startTestRun = getattr(result, 'startTestRun', None)
550 if startTestRun is not None:
551 startTestRun()
552
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000553 result.startTest(self)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000554
555 testMethod = getattr(self, self._testMethodName)
556 if (getattr(self.__class__, "__unittest_skip__", False) or
557 getattr(testMethod, "__unittest_skip__", False)):
558 # If the class or method was skipped.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000559 try:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000560 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
561 or getattr(testMethod, '__unittest_skip_why__', ''))
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100562 self._addSkip(result, self, skip_why)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000563 finally:
564 result.stopTest(self)
565 return
Robert Collinsed599b72015-08-28 10:34:51 +1200566 expecting_failure_method = getattr(testMethod,
567 "__unittest_expecting_failure__", False)
568 expecting_failure_class = getattr(self,
569 "__unittest_expecting_failure__", False)
570 expecting_failure = expecting_failure_class or expecting_failure_method
Victor Stinner031bd532013-12-09 01:52:50 +0100571 outcome = _Outcome(result)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000572 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100573 self._outcome = outcome
Michael Foordb3468f72010-12-19 03:19:47 +0000574
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100575 with outcome.testPartExecutor(self):
576 self.setUp()
Michael Foordb3468f72010-12-19 03:19:47 +0000577 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100578 outcome.expecting_failure = expecting_failure
579 with outcome.testPartExecutor(self, isTest=True):
580 testMethod()
581 outcome.expecting_failure = False
582 with outcome.testPartExecutor(self):
583 self.tearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000584
585 self.doCleanups()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100586 for test, reason in outcome.skipped:
587 self._addSkip(result, test, reason)
588 self._feedErrorsToResult(result, outcome.errors)
Michael Foordb3468f72010-12-19 03:19:47 +0000589 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100590 if expecting_failure:
591 if outcome.expectedFailure:
592 self._addExpectedFailure(result, outcome.expectedFailure)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000593 else:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100594 self._addUnexpectedSuccess(result)
595 else:
596 result.addSuccess(self)
Michael Foord1341bb02011-03-14 19:01:46 -0400597 return result
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000598 finally:
599 result.stopTest(self)
600 if orig_result is None:
601 stopTestRun = getattr(result, 'stopTestRun', None)
602 if stopTestRun is not None:
603 stopTestRun()
604
Victor Stinner031bd532013-12-09 01:52:50 +0100605 # explicitly break reference cycles:
606 # outcome.errors -> frame -> outcome -> outcome.errors
607 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
608 outcome.errors.clear()
609 outcome.expectedFailure = None
610
611 # clear the outcome, no more needed
612 self._outcome = None
613
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000614 def doCleanups(self):
615 """Execute all cleanup functions. Normally called for you after
616 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100617 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000618 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000619 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100620 with outcome.testPartExecutor(self):
621 function(*args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000622
623 # return this for backwards compatibility
624 # even though we no longer us it internally
625 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000626
627 def __call__(self, *args, **kwds):
628 return self.run(*args, **kwds)
629
630 def debug(self):
631 """Run the test without collecting errors in a TestResult"""
632 self.setUp()
633 getattr(self, self._testMethodName)()
634 self.tearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000635 while self._cleanups:
636 function, args, kwargs = self._cleanups.pop(-1)
637 function(*args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000638
639 def skipTest(self, reason):
640 """Skip this test."""
641 raise SkipTest(reason)
642
643 def fail(self, msg=None):
644 """Fail immediately, with the given message."""
645 raise self.failureException(msg)
646
647 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000648 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000649 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000650 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000651 raise self.failureException(msg)
652
653 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000654 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000655 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000656 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000657 raise self.failureException(msg)
658
659 def _formatMessage(self, msg, standardMsg):
660 """Honour the longMessage attribute when generating failure messages.
661 If longMessage is False this means:
662 * Use only an explicit message if it is provided
663 * Otherwise use the standard message for the assert
664
665 If longMessage is True:
666 * Use the standard message
667 * If an explicit message is provided, plus ' : ' and the explicit message
668 """
669 if not self.longMessage:
670 return msg or standardMsg
671 if msg is None:
672 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000673 try:
674 # don't switch to '{}' formatting in Python 2.X
675 # it changes the way unicode input is handled
676 return '%s : %s' % (standardMsg, msg)
677 except UnicodeDecodeError:
678 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000679
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300680 def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
Andrew Svetlov737fb892012-12-18 21:14:22 +0200681 """Fail unless an exception of class excClass is raised
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000682 by callableObj when invoked with arguments args and keyword
683 arguments kwargs. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200684 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000685 deemed to have suffered an error, exactly as for an
686 unexpected exception.
687
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300688 If called with callableObj omitted or None, will return a
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000689 context object used like this::
690
Michael Foord1c42b122010-02-05 22:58:21 +0000691 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000692 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000693
Ezio Melottib4dc2502011-05-06 15:01:41 +0300694 An optional keyword argument 'msg' can be provided when assertRaises
695 is used as a context object.
696
Michael Foord1c42b122010-02-05 22:58:21 +0000697 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000698 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000699 exception after the assertion::
700
701 with self.assertRaises(SomeException) as cm:
702 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000703 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000704 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000705 """
706 context = _AssertRaisesContext(excClass, self, callableObj)
Ezio Melottib4dc2502011-05-06 15:01:41 +0300707 return context.handle('assertRaises', callableObj, args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000708
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300709 def assertWarns(self, expected_warning, callable_obj=None, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000710 """Fail unless a warning of class warnClass is triggered
Ezio Melottib4dc2502011-05-06 15:01:41 +0300711 by callable_obj when invoked with arguments args and keyword
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000712 arguments kwargs. If a different type of warning is
713 triggered, it will not be handled: depending on the other
714 warning filtering rules in effect, it might be silenced, printed
715 out, or raised as an exception.
716
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +0300717 If called with callable_obj omitted or None, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000718 context object used like this::
719
720 with self.assertWarns(SomeWarning):
721 do_something()
722
Ezio Melottib4dc2502011-05-06 15:01:41 +0300723 An optional keyword argument 'msg' can be provided when assertWarns
724 is used as a context object.
725
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000726 The context manager keeps a reference to the first matching
727 warning as the 'warning' attribute; similarly, the 'filename'
728 and 'lineno' attributes give you information about the line
729 of Python code from which the warning was triggered.
730 This allows you to inspect the warning after the assertion::
731
732 with self.assertWarns(SomeWarning) as cm:
733 do_something()
734 the_warning = cm.warning
735 self.assertEqual(the_warning.some_attribute, 147)
736 """
737 context = _AssertWarnsContext(expected_warning, self, callable_obj)
Ezio Melottib4dc2502011-05-06 15:01:41 +0300738 return context.handle('assertWarns', callable_obj, args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000739
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200740 def assertLogs(self, logger=None, level=None):
741 """Fail unless a log message of level *level* or higher is emitted
742 on *logger_name* or its children. If omitted, *level* defaults to
743 INFO and *logger* defaults to the root logger.
744
745 This method must be used as a context manager, and will yield
746 a recording object with two attributes: `output` and `records`.
747 At the end of the context manager, the `output` attribute will
748 be a list of the matching formatted log messages and the
749 `records` attribute will be a list of the corresponding LogRecord
750 objects.
751
752 Example::
753
754 with self.assertLogs('foo', level='INFO') as cm:
755 logging.getLogger('foo').info('first message')
756 logging.getLogger('foo.bar').error('second message')
757 self.assertEqual(cm.output, ['INFO:foo:first message',
758 'ERROR:foo.bar:second message'])
759 """
760 return _AssertLogsContext(self, logger, level)
761
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000762 def _getAssertEqualityFunc(self, first, second):
763 """Get a detailed comparison function for the types of the two args.
764
765 Returns: A callable accepting (first, second, msg=None) that will
766 raise a failure exception if first != second with a useful human
767 readable error message for those types.
768 """
769 #
770 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
771 # and vice versa. I opted for the conservative approach in case
772 # subclasses are not intended to be compared in detail to their super
773 # class instances using a type equality func. This means testing
774 # subtypes won't automagically use the detailed comparison. Callers
775 # should use their type specific assertSpamEqual method to compare
776 # subclasses if the detailed comparison is desired and appropriate.
777 # See the discussion in http://bugs.python.org/issue2578.
778 #
779 if type(first) is type(second):
780 asserter = self._type_equality_funcs.get(type(first))
781 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500782 if isinstance(asserter, str):
783 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000784 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000785
786 return self._baseAssertEqual
787
788 def _baseAssertEqual(self, first, second, msg=None):
789 """The default assertEqual implementation, not type specific."""
790 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300791 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000792 msg = self._formatMessage(msg, standardMsg)
793 raise self.failureException(msg)
794
795 def assertEqual(self, first, second, msg=None):
796 """Fail if the two objects are unequal as determined by the '=='
797 operator.
798 """
799 assertion_func = self._getAssertEqualityFunc(first, second)
800 assertion_func(first, second, msg=msg)
801
802 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200803 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000804 operator.
805 """
806 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000807 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
808 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000809 raise self.failureException(msg)
810
Michael Foord321d0592010-11-02 13:44:51 +0000811 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000812 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000813 """Fail if the two objects are unequal as determined by their
814 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000815 (default 7) and comparing to zero, or by comparing that the
816 between the two objects is more than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000817
818 Note that decimal places (from zero) are usually not the same
819 as significant digits (measured from the most signficant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000820
821 If the two objects compare equal then they will automatically
822 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000823 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000824 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000825 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000826 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000827 if delta is not None and places is not None:
828 raise TypeError("specify delta or places not both")
829
830 if delta is not None:
831 if abs(first - second) <= delta:
832 return
833
834 standardMsg = '%s != %s within %s delta' % (safe_repr(first),
835 safe_repr(second),
836 safe_repr(delta))
837 else:
838 if places is None:
839 places = 7
840
841 if round(abs(second-first), places) == 0:
842 return
843
Benjamin Peterson847a4112010-03-14 15:04:17 +0000844 standardMsg = '%s != %s within %r places' % (safe_repr(first),
845 safe_repr(second),
846 places)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000847 msg = self._formatMessage(msg, standardMsg)
848 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000849
Michael Foord321d0592010-11-02 13:44:51 +0000850 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000851 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000852 """Fail if the two objects are equal as determined by their
853 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000854 (default 7) and comparing to zero, or by comparing that the
855 between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000856
857 Note that decimal places (from zero) are usually not the same
858 as significant digits (measured from the most signficant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000859
860 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000861 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000862 if delta is not None and places is not None:
863 raise TypeError("specify delta or places not both")
864 if delta is not None:
865 if not (first == second) and abs(first - second) > delta:
866 return
867 standardMsg = '%s == %s within %s delta' % (safe_repr(first),
868 safe_repr(second),
869 safe_repr(delta))
870 else:
871 if places is None:
872 places = 7
873 if not (first == second) and round(abs(second-first), places) != 0:
874 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000875 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000876 safe_repr(second),
877 places)
878
879 msg = self._formatMessage(msg, standardMsg)
880 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000881
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000882
Michael Foord085dfd32010-06-05 12:17:02 +0000883 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000884 """An equality assertion for ordered sequences (like lists and tuples).
885
R. David Murrayad13f222010-01-29 22:17:58 +0000886 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000887 which can be indexed, has a length, and has an equality operator.
888
889 Args:
890 seq1: The first sequence to compare.
891 seq2: The second sequence to compare.
892 seq_type: The expected datatype of the sequences, or None if no
893 datatype should be enforced.
894 msg: Optional message to use on failure instead of a list of
895 differences.
896 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400897 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000898 seq_type_name = seq_type.__name__
899 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000900 raise self.failureException('First sequence is not a %s: %s'
901 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000902 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000903 raise self.failureException('Second sequence is not a %s: %s'
904 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000905 else:
906 seq_type_name = "sequence"
907
908 differing = None
909 try:
910 len1 = len(seq1)
911 except (TypeError, NotImplementedError):
912 differing = 'First %s has no length. Non-sequence?' % (
913 seq_type_name)
914
915 if differing is None:
916 try:
917 len2 = len(seq2)
918 except (TypeError, NotImplementedError):
919 differing = 'Second %s has no length. Non-sequence?' % (
920 seq_type_name)
921
922 if differing is None:
923 if seq1 == seq2:
924 return
925
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300926 differing = '%ss differ: %s != %s\n' % (
927 (seq_type_name.capitalize(),) +
928 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000929
930 for i in range(min(len1, len2)):
931 try:
932 item1 = seq1[i]
933 except (TypeError, IndexError, NotImplementedError):
934 differing += ('\nUnable to index element %d of first %s\n' %
935 (i, seq_type_name))
936 break
937
938 try:
939 item2 = seq2[i]
940 except (TypeError, IndexError, NotImplementedError):
941 differing += ('\nUnable to index element %d of second %s\n' %
942 (i, seq_type_name))
943 break
944
945 if item1 != item2:
946 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
947 (i, item1, item2))
948 break
949 else:
950 if (len1 == len2 and seq_type is None and
951 type(seq1) != type(seq2)):
952 # The sequences are the same, but have differing types.
953 return
954
955 if len1 > len2:
956 differing += ('\nFirst %s contains %d additional '
957 'elements.\n' % (seq_type_name, len1 - len2))
958 try:
959 differing += ('First extra element %d:\n%s\n' %
960 (len2, seq1[len2]))
961 except (TypeError, IndexError, NotImplementedError):
962 differing += ('Unable to index element %d '
963 'of first %s\n' % (len2, seq_type_name))
964 elif len1 < len2:
965 differing += ('\nSecond %s contains %d additional '
966 'elements.\n' % (seq_type_name, len2 - len1))
967 try:
968 differing += ('First extra element %d:\n%s\n' %
969 (len1, seq2[len1]))
970 except (TypeError, IndexError, NotImplementedError):
971 differing += ('Unable to index element %d '
972 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +0000973 standardMsg = differing
974 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +0000975 difflib.ndiff(pprint.pformat(seq1).splitlines(),
976 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +0000977
978 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000979 msg = self._formatMessage(msg, standardMsg)
980 self.fail(msg)
981
Michael Foord085dfd32010-06-05 12:17:02 +0000982 def _truncateMessage(self, message, diff):
983 max_diff = self.maxDiff
984 if max_diff is None or len(diff) <= max_diff:
985 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +0000986 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +0000987
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000988 def assertListEqual(self, list1, list2, msg=None):
989 """A list-specific equality assertion.
990
991 Args:
992 list1: The first list to compare.
993 list2: The second list to compare.
994 msg: Optional message to use on failure instead of a list of
995 differences.
996
997 """
998 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
999
1000 def assertTupleEqual(self, tuple1, tuple2, msg=None):
1001 """A tuple-specific equality assertion.
1002
1003 Args:
1004 tuple1: The first tuple to compare.
1005 tuple2: The second tuple to compare.
1006 msg: Optional message to use on failure instead of a list of
1007 differences.
1008 """
1009 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
1010
1011 def assertSetEqual(self, set1, set2, msg=None):
1012 """A set-specific equality assertion.
1013
1014 Args:
1015 set1: The first set to compare.
1016 set2: The second set to compare.
1017 msg: Optional message to use on failure instead of a list of
1018 differences.
1019
Michael Foord91c9da32010-03-20 17:21:27 +00001020 assertSetEqual uses ducktyping to support different types of sets, and
1021 is optimized for sets specifically (parameters must support a
1022 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001023 """
1024 try:
1025 difference1 = set1.difference(set2)
1026 except TypeError as e:
1027 self.fail('invalid type when attempting set difference: %s' % e)
1028 except AttributeError as e:
1029 self.fail('first argument does not support set difference: %s' % e)
1030
1031 try:
1032 difference2 = set2.difference(set1)
1033 except TypeError as e:
1034 self.fail('invalid type when attempting set difference: %s' % e)
1035 except AttributeError as e:
1036 self.fail('second argument does not support set difference: %s' % e)
1037
1038 if not (difference1 or difference2):
1039 return
1040
1041 lines = []
1042 if difference1:
1043 lines.append('Items in the first set but not the second:')
1044 for item in difference1:
1045 lines.append(repr(item))
1046 if difference2:
1047 lines.append('Items in the second set but not the first:')
1048 for item in difference2:
1049 lines.append(repr(item))
1050
1051 standardMsg = '\n'.join(lines)
1052 self.fail(self._formatMessage(msg, standardMsg))
1053
1054 def assertIn(self, member, container, msg=None):
1055 """Just like self.assertTrue(a in b), but with a nicer default message."""
1056 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001057 standardMsg = '%s not found in %s' % (safe_repr(member),
1058 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001059 self.fail(self._formatMessage(msg, standardMsg))
1060
1061 def assertNotIn(self, member, container, msg=None):
1062 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1063 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001064 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1065 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001066 self.fail(self._formatMessage(msg, standardMsg))
1067
1068 def assertIs(self, expr1, expr2, msg=None):
1069 """Just like self.assertTrue(a is b), but with a nicer default message."""
1070 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001071 standardMsg = '%s is not %s' % (safe_repr(expr1),
1072 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001073 self.fail(self._formatMessage(msg, standardMsg))
1074
1075 def assertIsNot(self, expr1, expr2, msg=None):
1076 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1077 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001078 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001079 self.fail(self._formatMessage(msg, standardMsg))
1080
1081 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001082 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1083 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001084
1085 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001086 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001087 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001088 pprint.pformat(d1).splitlines(),
1089 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001090 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001091 self.fail(self._formatMessage(msg, standardMsg))
1092
Ezio Melotti0f535012011-04-03 18:02:13 +03001093 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1094 """Checks whether dictionary is a superset of subset."""
1095 warnings.warn('assertDictContainsSubset is deprecated',
1096 DeprecationWarning)
1097 missing = []
1098 mismatched = []
1099 for key, value in subset.items():
1100 if key not in dictionary:
1101 missing.append(key)
1102 elif value != dictionary[key]:
1103 mismatched.append('%s, expected: %s, actual: %s' %
1104 (safe_repr(key), safe_repr(value),
1105 safe_repr(dictionary[key])))
1106
1107 if not (missing or mismatched):
1108 return
1109
1110 standardMsg = ''
1111 if missing:
1112 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1113 missing)
1114 if mismatched:
1115 if standardMsg:
1116 standardMsg += '; '
1117 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1118
1119 self.fail(self._formatMessage(msg, standardMsg))
1120
1121
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001122 def assertCountEqual(self, first, second, msg=None):
1123 """An unordered sequence comparison asserting that the same elements,
1124 regardless of order. If the same element occurs more than once,
1125 it verifies that the elements occur the same number of times.
Michael Foord8442a602010-03-20 16:58:04 +00001126
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001127 self.assertEqual(Counter(list(first)),
1128 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001129
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001130 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001131 - [0, 1, 1] and [1, 0, 1] compare equal.
1132 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001133
Michael Foord8442a602010-03-20 16:58:04 +00001134 """
Michael Foorde180d392011-01-28 19:51:48 +00001135 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001136 try:
Michael Foorde180d392011-01-28 19:51:48 +00001137 first = collections.Counter(first_seq)
1138 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001139 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001140 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001141 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001142 else:
Michael Foorde180d392011-01-28 19:51:48 +00001143 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001144 return
Michael Foorde180d392011-01-28 19:51:48 +00001145 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001146
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001147 if differences:
1148 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001149 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001150 diffMsg = '\n'.join(lines)
1151 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1152 msg = self._formatMessage(msg, standardMsg)
1153 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001154
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001155 def assertMultiLineEqual(self, first, second, msg=None):
1156 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001157 self.assertIsInstance(first, str, 'First argument is not a string')
1158 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001159
1160 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001161 # don't use difflib if the strings are too long
1162 if (len(first) > self._diffThreshold or
1163 len(second) > self._diffThreshold):
1164 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001165 firstlines = first.splitlines(keepends=True)
1166 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001167 if len(firstlines) == 1 and first.strip('\r\n') == first:
1168 firstlines = [first + '\n']
1169 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001170 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001171 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
Michael Foordcb11b252010-06-05 13:14:43 +00001172 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001173 self.fail(self._formatMessage(msg, standardMsg))
1174
1175 def assertLess(self, a, b, msg=None):
1176 """Just like self.assertTrue(a < b), but with a nicer default message."""
1177 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001178 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001179 self.fail(self._formatMessage(msg, standardMsg))
1180
1181 def assertLessEqual(self, a, b, msg=None):
1182 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1183 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001184 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001185 self.fail(self._formatMessage(msg, standardMsg))
1186
1187 def assertGreater(self, a, b, msg=None):
1188 """Just like self.assertTrue(a > b), but with a nicer default message."""
1189 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001190 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001191 self.fail(self._formatMessage(msg, standardMsg))
1192
1193 def assertGreaterEqual(self, a, b, msg=None):
1194 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1195 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001196 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001197 self.fail(self._formatMessage(msg, standardMsg))
1198
1199 def assertIsNone(self, obj, msg=None):
1200 """Same as self.assertTrue(obj is None), with a nicer default message."""
1201 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001202 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001203 self.fail(self._formatMessage(msg, standardMsg))
1204
1205 def assertIsNotNone(self, obj, msg=None):
1206 """Included for symmetry with assertIsNone."""
1207 if obj is None:
1208 standardMsg = 'unexpectedly None'
1209 self.fail(self._formatMessage(msg, standardMsg))
1210
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001211 def assertIsInstance(self, obj, cls, msg=None):
1212 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1213 default message."""
1214 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001215 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001216 self.fail(self._formatMessage(msg, standardMsg))
1217
1218 def assertNotIsInstance(self, obj, cls, msg=None):
1219 """Included for symmetry with assertIsInstance."""
1220 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001221 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001222 self.fail(self._formatMessage(msg, standardMsg))
1223
Ezio Melottied3a7d22010-12-01 02:32:32 +00001224 def assertRaisesRegex(self, expected_exception, expected_regex,
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +03001225 callable_obj=None, *args, **kwargs):
Ezio Melottied3a7d22010-12-01 02:32:32 +00001226 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001227
1228 Args:
1229 expected_exception: Exception class expected to be raised.
Ezio Melottied3a7d22010-12-01 02:32:32 +00001230 expected_regex: Regex (re pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001231 to be found in error message.
1232 callable_obj: Function to be called.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001233 msg: Optional message used in case of failure. Can only be used
1234 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001235 args: Extra args.
1236 kwargs: Extra kwargs.
1237 """
1238 context = _AssertRaisesContext(expected_exception, self, callable_obj,
Ezio Melottied3a7d22010-12-01 02:32:32 +00001239 expected_regex)
Ezio Melottib4dc2502011-05-06 15:01:41 +03001240
1241 return context.handle('assertRaisesRegex', callable_obj, args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001242
Ezio Melottied3a7d22010-12-01 02:32:32 +00001243 def assertWarnsRegex(self, expected_warning, expected_regex,
Serhiy Storchakaa7d00c22015-05-16 16:25:43 +03001244 callable_obj=None, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001245 """Asserts that the message in a triggered warning matches a regexp.
1246 Basic functioning is similar to assertWarns() with the addition
1247 that only warnings whose messages also match the regular expression
1248 are considered successful matches.
1249
1250 Args:
1251 expected_warning: Warning class expected to be triggered.
Ezio Melottied3a7d22010-12-01 02:32:32 +00001252 expected_regex: Regex (re pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001253 to be found in error message.
1254 callable_obj: Function to be called.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001255 msg: Optional message used in case of failure. Can only be used
1256 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001257 args: Extra args.
1258 kwargs: Extra kwargs.
1259 """
1260 context = _AssertWarnsContext(expected_warning, self, callable_obj,
Ezio Melottied3a7d22010-12-01 02:32:32 +00001261 expected_regex)
Ezio Melottib4dc2502011-05-06 15:01:41 +03001262 return context.handle('assertWarnsRegex', callable_obj, args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001263
Ezio Melottied3a7d22010-12-01 02:32:32 +00001264 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001265 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001266 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001267 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001268 expected_regex = re.compile(expected_regex)
1269 if not expected_regex.search(text):
1270 msg = msg or "Regex didn't match"
1271 msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001272 raise self.failureException(msg)
1273
Ezio Melotti8f776302010-12-10 02:32:05 +00001274 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001275 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001276 if isinstance(unexpected_regex, (str, bytes)):
1277 unexpected_regex = re.compile(unexpected_regex)
1278 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001279 if match:
Ezio Melottied3a7d22010-12-01 02:32:32 +00001280 msg = msg or "Regex matched"
Benjamin Petersonb48af542010-04-11 20:43:16 +00001281 msg = '%s: %r matches %r in %r' % (msg,
1282 text[match.start():match.end()],
Ezio Melottied3a7d22010-12-01 02:32:32 +00001283 unexpected_regex.pattern,
Benjamin Petersonb48af542010-04-11 20:43:16 +00001284 text)
1285 raise self.failureException(msg)
1286
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001287
Ezio Melottied3a7d22010-12-01 02:32:32 +00001288 def _deprecate(original_func):
1289 def deprecated_func(*args, **kwargs):
1290 warnings.warn(
1291 'Please use {0} instead.'.format(original_func.__name__),
1292 DeprecationWarning, 2)
1293 return original_func(*args, **kwargs)
1294 return deprecated_func
1295
Ezio Melotti361467e2011-04-03 17:37:58 +03001296 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001297 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1298 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1299 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1300 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1301 failUnless = assert_ = _deprecate(assertTrue)
1302 failUnlessRaises = _deprecate(assertRaises)
1303 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001304 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1305 assertRegexpMatches = _deprecate(assertRegex)
1306
1307
1308
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001309class FunctionTestCase(TestCase):
1310 """A test case that wraps a test function.
1311
1312 This is useful for slipping pre-existing test functions into the
1313 unittest framework. Optionally, set-up and tidy-up functions can be
1314 supplied. As with TestCase, the tidy-up ('tearDown') function will
1315 always be called if the set-up ('setUp') function ran successfully.
1316 """
1317
1318 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1319 super(FunctionTestCase, self).__init__()
1320 self._setUpFunc = setUp
1321 self._tearDownFunc = tearDown
1322 self._testFunc = testFunc
1323 self._description = description
1324
1325 def setUp(self):
1326 if self._setUpFunc is not None:
1327 self._setUpFunc()
1328
1329 def tearDown(self):
1330 if self._tearDownFunc is not None:
1331 self._tearDownFunc()
1332
1333 def runTest(self):
1334 self._testFunc()
1335
1336 def id(self):
1337 return self._testFunc.__name__
1338
1339 def __eq__(self, other):
1340 if not isinstance(other, self.__class__):
1341 return NotImplemented
1342
1343 return self._setUpFunc == other._setUpFunc and \
1344 self._tearDownFunc == other._tearDownFunc and \
1345 self._testFunc == other._testFunc and \
1346 self._description == other._description
1347
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001348 def __hash__(self):
1349 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1350 self._testFunc, self._description))
1351
1352 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001353 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001354 self._testFunc.__name__)
1355
1356 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001357 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001358 self._testFunc)
1359
1360 def shortDescription(self):
1361 if self._description is not None:
1362 return self._description
1363 doc = self._testFunc.__doc__
1364 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001365
1366
1367class _SubTest(TestCase):
1368
1369 def __init__(self, test_case, message, params):
1370 super().__init__()
1371 self._message = message
1372 self.test_case = test_case
1373 self.params = params
1374 self.failureException = test_case.failureException
1375
1376 def runTest(self):
1377 raise NotImplementedError("subtests cannot be run directly")
1378
1379 def _subDescription(self):
1380 parts = []
1381 if self._message:
1382 parts.append("[{}]".format(self._message))
1383 if self.params:
1384 params_desc = ', '.join(
1385 "{}={!r}".format(k, v)
1386 for (k, v) in sorted(self.params.items()))
1387 parts.append("({})".format(params_desc))
1388 return " ".join(parts) or '(<subtest>)'
1389
1390 def id(self):
1391 return "{} {}".format(self.test_case.id(), self._subDescription())
1392
1393 def shortDescription(self):
1394 """Returns a one-line description of the subtest, or None if no
1395 description has been provided.
1396 """
1397 return self.test_case.shortDescription()
1398
1399 def __str__(self):
1400 return "{} {}".format(self.test_case, self._subDescription())