1*cda5da8dSAndroid Build Coastguard Worker"""Test case implementation""" 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Workerimport sys 4*cda5da8dSAndroid Build Coastguard Workerimport functools 5*cda5da8dSAndroid Build Coastguard Workerimport difflib 6*cda5da8dSAndroid Build Coastguard Workerimport pprint 7*cda5da8dSAndroid Build Coastguard Workerimport re 8*cda5da8dSAndroid Build Coastguard Workerimport warnings 9*cda5da8dSAndroid Build Coastguard Workerimport collections 10*cda5da8dSAndroid Build Coastguard Workerimport contextlib 11*cda5da8dSAndroid Build Coastguard Workerimport traceback 12*cda5da8dSAndroid Build Coastguard Workerimport types 13*cda5da8dSAndroid Build Coastguard Worker 14*cda5da8dSAndroid Build Coastguard Workerfrom . import result 15*cda5da8dSAndroid Build Coastguard Workerfrom .util import (strclass, safe_repr, _count_diff_all_purpose, 16*cda5da8dSAndroid Build Coastguard Worker _count_diff_hashable, _common_shorten_repr) 17*cda5da8dSAndroid Build Coastguard Worker 18*cda5da8dSAndroid Build Coastguard Worker__unittest = True 19*cda5da8dSAndroid Build Coastguard Worker 20*cda5da8dSAndroid Build Coastguard Worker_subtest_msg_sentinel = object() 21*cda5da8dSAndroid Build Coastguard Worker 22*cda5da8dSAndroid Build Coastguard WorkerDIFF_OMITTED = ('\nDiff is %s characters long. ' 23*cda5da8dSAndroid Build Coastguard Worker 'Set self.maxDiff to None to see it.') 24*cda5da8dSAndroid Build Coastguard Worker 25*cda5da8dSAndroid Build Coastguard Workerclass SkipTest(Exception): 26*cda5da8dSAndroid Build Coastguard Worker """ 27*cda5da8dSAndroid Build Coastguard Worker Raise this exception in a test to skip it. 28*cda5da8dSAndroid Build Coastguard Worker 29*cda5da8dSAndroid Build Coastguard Worker Usually you can use TestCase.skipTest() or one of the skipping decorators 30*cda5da8dSAndroid Build Coastguard Worker instead of raising this directly. 31*cda5da8dSAndroid Build Coastguard Worker """ 32*cda5da8dSAndroid Build Coastguard Worker 33*cda5da8dSAndroid Build Coastguard Workerclass _ShouldStop(Exception): 34*cda5da8dSAndroid Build Coastguard Worker """ 35*cda5da8dSAndroid Build Coastguard Worker The test should stop. 36*cda5da8dSAndroid Build Coastguard Worker """ 37*cda5da8dSAndroid Build Coastguard Worker 38*cda5da8dSAndroid Build Coastguard Workerclass _UnexpectedSuccess(Exception): 39*cda5da8dSAndroid Build Coastguard Worker """ 40*cda5da8dSAndroid Build Coastguard Worker The test was supposed to fail, but it didn't! 41*cda5da8dSAndroid Build Coastguard Worker """ 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Worker 44*cda5da8dSAndroid Build Coastguard Workerclass _Outcome(object): 45*cda5da8dSAndroid Build Coastguard Worker def __init__(self, result=None): 46*cda5da8dSAndroid Build Coastguard Worker self.expecting_failure = False 47*cda5da8dSAndroid Build Coastguard Worker self.result = result 48*cda5da8dSAndroid Build Coastguard Worker self.result_supports_subtests = hasattr(result, "addSubTest") 49*cda5da8dSAndroid Build Coastguard Worker self.success = True 50*cda5da8dSAndroid Build Coastguard Worker self.expectedFailure = None 51*cda5da8dSAndroid Build Coastguard Worker 52*cda5da8dSAndroid Build Coastguard Worker @contextlib.contextmanager 53*cda5da8dSAndroid Build Coastguard Worker def testPartExecutor(self, test_case, subTest=False): 54*cda5da8dSAndroid Build Coastguard Worker old_success = self.success 55*cda5da8dSAndroid Build Coastguard Worker self.success = True 56*cda5da8dSAndroid Build Coastguard Worker try: 57*cda5da8dSAndroid Build Coastguard Worker yield 58*cda5da8dSAndroid Build Coastguard Worker except KeyboardInterrupt: 59*cda5da8dSAndroid Build Coastguard Worker raise 60*cda5da8dSAndroid Build Coastguard Worker except SkipTest as e: 61*cda5da8dSAndroid Build Coastguard Worker self.success = False 62*cda5da8dSAndroid Build Coastguard Worker _addSkip(self.result, test_case, str(e)) 63*cda5da8dSAndroid Build Coastguard Worker except _ShouldStop: 64*cda5da8dSAndroid Build Coastguard Worker pass 65*cda5da8dSAndroid Build Coastguard Worker except: 66*cda5da8dSAndroid Build Coastguard Worker exc_info = sys.exc_info() 67*cda5da8dSAndroid Build Coastguard Worker if self.expecting_failure: 68*cda5da8dSAndroid Build Coastguard Worker self.expectedFailure = exc_info 69*cda5da8dSAndroid Build Coastguard Worker else: 70*cda5da8dSAndroid Build Coastguard Worker self.success = False 71*cda5da8dSAndroid Build Coastguard Worker if subTest: 72*cda5da8dSAndroid Build Coastguard Worker self.result.addSubTest(test_case.test_case, test_case, exc_info) 73*cda5da8dSAndroid Build Coastguard Worker else: 74*cda5da8dSAndroid Build Coastguard Worker _addError(self.result, test_case, exc_info) 75*cda5da8dSAndroid Build Coastguard Worker # explicitly break a reference cycle: 76*cda5da8dSAndroid Build Coastguard Worker # exc_info -> frame -> exc_info 77*cda5da8dSAndroid Build Coastguard Worker exc_info = None 78*cda5da8dSAndroid Build Coastguard Worker else: 79*cda5da8dSAndroid Build Coastguard Worker if subTest and self.success: 80*cda5da8dSAndroid Build Coastguard Worker self.result.addSubTest(test_case.test_case, test_case, None) 81*cda5da8dSAndroid Build Coastguard Worker finally: 82*cda5da8dSAndroid Build Coastguard Worker self.success = self.success and old_success 83*cda5da8dSAndroid Build Coastguard Worker 84*cda5da8dSAndroid Build Coastguard Worker 85*cda5da8dSAndroid Build Coastguard Workerdef _addSkip(result, test_case, reason): 86*cda5da8dSAndroid Build Coastguard Worker addSkip = getattr(result, 'addSkip', None) 87*cda5da8dSAndroid Build Coastguard Worker if addSkip is not None: 88*cda5da8dSAndroid Build Coastguard Worker addSkip(test_case, reason) 89*cda5da8dSAndroid Build Coastguard Worker else: 90*cda5da8dSAndroid Build Coastguard Worker warnings.warn("TestResult has no addSkip method, skips not reported", 91*cda5da8dSAndroid Build Coastguard Worker RuntimeWarning, 2) 92*cda5da8dSAndroid Build Coastguard Worker result.addSuccess(test_case) 93*cda5da8dSAndroid Build Coastguard Worker 94*cda5da8dSAndroid Build Coastguard Workerdef _addError(result, test, exc_info): 95*cda5da8dSAndroid Build Coastguard Worker if result is not None and exc_info is not None: 96*cda5da8dSAndroid Build Coastguard Worker if issubclass(exc_info[0], test.failureException): 97*cda5da8dSAndroid Build Coastguard Worker result.addFailure(test, exc_info) 98*cda5da8dSAndroid Build Coastguard Worker else: 99*cda5da8dSAndroid Build Coastguard Worker result.addError(test, exc_info) 100*cda5da8dSAndroid Build Coastguard Worker 101*cda5da8dSAndroid Build Coastguard Workerdef _id(obj): 102*cda5da8dSAndroid Build Coastguard Worker return obj 103*cda5da8dSAndroid Build Coastguard Worker 104*cda5da8dSAndroid Build Coastguard Worker 105*cda5da8dSAndroid Build Coastguard Workerdef _enter_context(cm, addcleanup): 106*cda5da8dSAndroid Build Coastguard Worker # We look up the special methods on the type to match the with 107*cda5da8dSAndroid Build Coastguard Worker # statement. 108*cda5da8dSAndroid Build Coastguard Worker cls = type(cm) 109*cda5da8dSAndroid Build Coastguard Worker try: 110*cda5da8dSAndroid Build Coastguard Worker enter = cls.__enter__ 111*cda5da8dSAndroid Build Coastguard Worker exit = cls.__exit__ 112*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 113*cda5da8dSAndroid Build Coastguard Worker raise TypeError(f"'{cls.__module__}.{cls.__qualname__}' object does " 114*cda5da8dSAndroid Build Coastguard Worker f"not support the context manager protocol") from None 115*cda5da8dSAndroid Build Coastguard Worker result = enter(cm) 116*cda5da8dSAndroid Build Coastguard Worker addcleanup(exit, cm, None, None, None) 117*cda5da8dSAndroid Build Coastguard Worker return result 118*cda5da8dSAndroid Build Coastguard Worker 119*cda5da8dSAndroid Build Coastguard Worker 120*cda5da8dSAndroid Build Coastguard Worker_module_cleanups = [] 121*cda5da8dSAndroid Build Coastguard Workerdef addModuleCleanup(function, /, *args, **kwargs): 122*cda5da8dSAndroid Build Coastguard Worker """Same as addCleanup, except the cleanup items are called even if 123*cda5da8dSAndroid Build Coastguard Worker setUpModule fails (unlike tearDownModule).""" 124*cda5da8dSAndroid Build Coastguard Worker _module_cleanups.append((function, args, kwargs)) 125*cda5da8dSAndroid Build Coastguard Worker 126*cda5da8dSAndroid Build Coastguard Workerdef enterModuleContext(cm): 127*cda5da8dSAndroid Build Coastguard Worker """Same as enterContext, but module-wide.""" 128*cda5da8dSAndroid Build Coastguard Worker return _enter_context(cm, addModuleCleanup) 129*cda5da8dSAndroid Build Coastguard Worker 130*cda5da8dSAndroid Build Coastguard Worker 131*cda5da8dSAndroid Build Coastguard Workerdef doModuleCleanups(): 132*cda5da8dSAndroid Build Coastguard Worker """Execute all module cleanup functions. Normally called for you after 133*cda5da8dSAndroid Build Coastguard Worker tearDownModule.""" 134*cda5da8dSAndroid Build Coastguard Worker exceptions = [] 135*cda5da8dSAndroid Build Coastguard Worker while _module_cleanups: 136*cda5da8dSAndroid Build Coastguard Worker function, args, kwargs = _module_cleanups.pop() 137*cda5da8dSAndroid Build Coastguard Worker try: 138*cda5da8dSAndroid Build Coastguard Worker function(*args, **kwargs) 139*cda5da8dSAndroid Build Coastguard Worker except Exception as exc: 140*cda5da8dSAndroid Build Coastguard Worker exceptions.append(exc) 141*cda5da8dSAndroid Build Coastguard Worker if exceptions: 142*cda5da8dSAndroid Build Coastguard Worker # Swallows all but first exception. If a multi-exception handler 143*cda5da8dSAndroid Build Coastguard Worker # gets written we should use that here instead. 144*cda5da8dSAndroid Build Coastguard Worker raise exceptions[0] 145*cda5da8dSAndroid Build Coastguard Worker 146*cda5da8dSAndroid Build Coastguard Worker 147*cda5da8dSAndroid Build Coastguard Workerdef skip(reason): 148*cda5da8dSAndroid Build Coastguard Worker """ 149*cda5da8dSAndroid Build Coastguard Worker Unconditionally skip a test. 150*cda5da8dSAndroid Build Coastguard Worker """ 151*cda5da8dSAndroid Build Coastguard Worker def decorator(test_item): 152*cda5da8dSAndroid Build Coastguard Worker if not isinstance(test_item, type): 153*cda5da8dSAndroid Build Coastguard Worker @functools.wraps(test_item) 154*cda5da8dSAndroid Build Coastguard Worker def skip_wrapper(*args, **kwargs): 155*cda5da8dSAndroid Build Coastguard Worker raise SkipTest(reason) 156*cda5da8dSAndroid Build Coastguard Worker test_item = skip_wrapper 157*cda5da8dSAndroid Build Coastguard Worker 158*cda5da8dSAndroid Build Coastguard Worker test_item.__unittest_skip__ = True 159*cda5da8dSAndroid Build Coastguard Worker test_item.__unittest_skip_why__ = reason 160*cda5da8dSAndroid Build Coastguard Worker return test_item 161*cda5da8dSAndroid Build Coastguard Worker if isinstance(reason, types.FunctionType): 162*cda5da8dSAndroid Build Coastguard Worker test_item = reason 163*cda5da8dSAndroid Build Coastguard Worker reason = '' 164*cda5da8dSAndroid Build Coastguard Worker return decorator(test_item) 165*cda5da8dSAndroid Build Coastguard Worker return decorator 166*cda5da8dSAndroid Build Coastguard Worker 167*cda5da8dSAndroid Build Coastguard Workerdef skipIf(condition, reason): 168*cda5da8dSAndroid Build Coastguard Worker """ 169*cda5da8dSAndroid Build Coastguard Worker Skip a test if the condition is true. 170*cda5da8dSAndroid Build Coastguard Worker """ 171*cda5da8dSAndroid Build Coastguard Worker if condition: 172*cda5da8dSAndroid Build Coastguard Worker return skip(reason) 173*cda5da8dSAndroid Build Coastguard Worker return _id 174*cda5da8dSAndroid Build Coastguard Worker 175*cda5da8dSAndroid Build Coastguard Workerdef skipUnless(condition, reason): 176*cda5da8dSAndroid Build Coastguard Worker """ 177*cda5da8dSAndroid Build Coastguard Worker Skip a test unless the condition is true. 178*cda5da8dSAndroid Build Coastguard Worker """ 179*cda5da8dSAndroid Build Coastguard Worker if not condition: 180*cda5da8dSAndroid Build Coastguard Worker return skip(reason) 181*cda5da8dSAndroid Build Coastguard Worker return _id 182*cda5da8dSAndroid Build Coastguard Worker 183*cda5da8dSAndroid Build Coastguard Workerdef expectedFailure(test_item): 184*cda5da8dSAndroid Build Coastguard Worker test_item.__unittest_expecting_failure__ = True 185*cda5da8dSAndroid Build Coastguard Worker return test_item 186*cda5da8dSAndroid Build Coastguard Worker 187*cda5da8dSAndroid Build Coastguard Workerdef _is_subtype(expected, basetype): 188*cda5da8dSAndroid Build Coastguard Worker if isinstance(expected, tuple): 189*cda5da8dSAndroid Build Coastguard Worker return all(_is_subtype(e, basetype) for e in expected) 190*cda5da8dSAndroid Build Coastguard Worker return isinstance(expected, type) and issubclass(expected, basetype) 191*cda5da8dSAndroid Build Coastguard Worker 192*cda5da8dSAndroid Build Coastguard Workerclass _BaseTestCaseContext: 193*cda5da8dSAndroid Build Coastguard Worker 194*cda5da8dSAndroid Build Coastguard Worker def __init__(self, test_case): 195*cda5da8dSAndroid Build Coastguard Worker self.test_case = test_case 196*cda5da8dSAndroid Build Coastguard Worker 197*cda5da8dSAndroid Build Coastguard Worker def _raiseFailure(self, standardMsg): 198*cda5da8dSAndroid Build Coastguard Worker msg = self.test_case._formatMessage(self.msg, standardMsg) 199*cda5da8dSAndroid Build Coastguard Worker raise self.test_case.failureException(msg) 200*cda5da8dSAndroid Build Coastguard Worker 201*cda5da8dSAndroid Build Coastguard Workerclass _AssertRaisesBaseContext(_BaseTestCaseContext): 202*cda5da8dSAndroid Build Coastguard Worker 203*cda5da8dSAndroid Build Coastguard Worker def __init__(self, expected, test_case, expected_regex=None): 204*cda5da8dSAndroid Build Coastguard Worker _BaseTestCaseContext.__init__(self, test_case) 205*cda5da8dSAndroid Build Coastguard Worker self.expected = expected 206*cda5da8dSAndroid Build Coastguard Worker self.test_case = test_case 207*cda5da8dSAndroid Build Coastguard Worker if expected_regex is not None: 208*cda5da8dSAndroid Build Coastguard Worker expected_regex = re.compile(expected_regex) 209*cda5da8dSAndroid Build Coastguard Worker self.expected_regex = expected_regex 210*cda5da8dSAndroid Build Coastguard Worker self.obj_name = None 211*cda5da8dSAndroid Build Coastguard Worker self.msg = None 212*cda5da8dSAndroid Build Coastguard Worker 213*cda5da8dSAndroid Build Coastguard Worker def handle(self, name, args, kwargs): 214*cda5da8dSAndroid Build Coastguard Worker """ 215*cda5da8dSAndroid Build Coastguard Worker If args is empty, assertRaises/Warns is being used as a 216*cda5da8dSAndroid Build Coastguard Worker context manager, so check for a 'msg' kwarg and return self. 217*cda5da8dSAndroid Build Coastguard Worker If args is not empty, call a callable passing positional and keyword 218*cda5da8dSAndroid Build Coastguard Worker arguments. 219*cda5da8dSAndroid Build Coastguard Worker """ 220*cda5da8dSAndroid Build Coastguard Worker try: 221*cda5da8dSAndroid Build Coastguard Worker if not _is_subtype(self.expected, self._base_type): 222*cda5da8dSAndroid Build Coastguard Worker raise TypeError('%s() arg 1 must be %s' % 223*cda5da8dSAndroid Build Coastguard Worker (name, self._base_type_str)) 224*cda5da8dSAndroid Build Coastguard Worker if not args: 225*cda5da8dSAndroid Build Coastguard Worker self.msg = kwargs.pop('msg', None) 226*cda5da8dSAndroid Build Coastguard Worker if kwargs: 227*cda5da8dSAndroid Build Coastguard Worker raise TypeError('%r is an invalid keyword argument for ' 228*cda5da8dSAndroid Build Coastguard Worker 'this function' % (next(iter(kwargs)),)) 229*cda5da8dSAndroid Build Coastguard Worker return self 230*cda5da8dSAndroid Build Coastguard Worker 231*cda5da8dSAndroid Build Coastguard Worker callable_obj, *args = args 232*cda5da8dSAndroid Build Coastguard Worker try: 233*cda5da8dSAndroid Build Coastguard Worker self.obj_name = callable_obj.__name__ 234*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 235*cda5da8dSAndroid Build Coastguard Worker self.obj_name = str(callable_obj) 236*cda5da8dSAndroid Build Coastguard Worker with self: 237*cda5da8dSAndroid Build Coastguard Worker callable_obj(*args, **kwargs) 238*cda5da8dSAndroid Build Coastguard Worker finally: 239*cda5da8dSAndroid Build Coastguard Worker # bpo-23890: manually break a reference cycle 240*cda5da8dSAndroid Build Coastguard Worker self = None 241*cda5da8dSAndroid Build Coastguard Worker 242*cda5da8dSAndroid Build Coastguard Worker 243*cda5da8dSAndroid Build Coastguard Workerclass _AssertRaisesContext(_AssertRaisesBaseContext): 244*cda5da8dSAndroid Build Coastguard Worker """A context manager used to implement TestCase.assertRaises* methods.""" 245*cda5da8dSAndroid Build Coastguard Worker 246*cda5da8dSAndroid Build Coastguard Worker _base_type = BaseException 247*cda5da8dSAndroid Build Coastguard Worker _base_type_str = 'an exception type or tuple of exception types' 248*cda5da8dSAndroid Build Coastguard Worker 249*cda5da8dSAndroid Build Coastguard Worker def __enter__(self): 250*cda5da8dSAndroid Build Coastguard Worker return self 251*cda5da8dSAndroid Build Coastguard Worker 252*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, exc_type, exc_value, tb): 253*cda5da8dSAndroid Build Coastguard Worker if exc_type is None: 254*cda5da8dSAndroid Build Coastguard Worker try: 255*cda5da8dSAndroid Build Coastguard Worker exc_name = self.expected.__name__ 256*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 257*cda5da8dSAndroid Build Coastguard Worker exc_name = str(self.expected) 258*cda5da8dSAndroid Build Coastguard Worker if self.obj_name: 259*cda5da8dSAndroid Build Coastguard Worker self._raiseFailure("{} not raised by {}".format(exc_name, 260*cda5da8dSAndroid Build Coastguard Worker self.obj_name)) 261*cda5da8dSAndroid Build Coastguard Worker else: 262*cda5da8dSAndroid Build Coastguard Worker self._raiseFailure("{} not raised".format(exc_name)) 263*cda5da8dSAndroid Build Coastguard Worker else: 264*cda5da8dSAndroid Build Coastguard Worker traceback.clear_frames(tb) 265*cda5da8dSAndroid Build Coastguard Worker if not issubclass(exc_type, self.expected): 266*cda5da8dSAndroid Build Coastguard Worker # let unexpected exceptions pass through 267*cda5da8dSAndroid Build Coastguard Worker return False 268*cda5da8dSAndroid Build Coastguard Worker # store exception, without traceback, for later retrieval 269*cda5da8dSAndroid Build Coastguard Worker self.exception = exc_value.with_traceback(None) 270*cda5da8dSAndroid Build Coastguard Worker if self.expected_regex is None: 271*cda5da8dSAndroid Build Coastguard Worker return True 272*cda5da8dSAndroid Build Coastguard Worker 273*cda5da8dSAndroid Build Coastguard Worker expected_regex = self.expected_regex 274*cda5da8dSAndroid Build Coastguard Worker if not expected_regex.search(str(exc_value)): 275*cda5da8dSAndroid Build Coastguard Worker self._raiseFailure('"{}" does not match "{}"'.format( 276*cda5da8dSAndroid Build Coastguard Worker expected_regex.pattern, str(exc_value))) 277*cda5da8dSAndroid Build Coastguard Worker return True 278*cda5da8dSAndroid Build Coastguard Worker 279*cda5da8dSAndroid Build Coastguard Worker __class_getitem__ = classmethod(types.GenericAlias) 280*cda5da8dSAndroid Build Coastguard Worker 281*cda5da8dSAndroid Build Coastguard Worker 282*cda5da8dSAndroid Build Coastguard Workerclass _AssertWarnsContext(_AssertRaisesBaseContext): 283*cda5da8dSAndroid Build Coastguard Worker """A context manager used to implement TestCase.assertWarns* methods.""" 284*cda5da8dSAndroid Build Coastguard Worker 285*cda5da8dSAndroid Build Coastguard Worker _base_type = Warning 286*cda5da8dSAndroid Build Coastguard Worker _base_type_str = 'a warning type or tuple of warning types' 287*cda5da8dSAndroid Build Coastguard Worker 288*cda5da8dSAndroid Build Coastguard Worker def __enter__(self): 289*cda5da8dSAndroid Build Coastguard Worker # The __warningregistry__'s need to be in a pristine state for tests 290*cda5da8dSAndroid Build Coastguard Worker # to work properly. 291*cda5da8dSAndroid Build Coastguard Worker for v in list(sys.modules.values()): 292*cda5da8dSAndroid Build Coastguard Worker if getattr(v, '__warningregistry__', None): 293*cda5da8dSAndroid Build Coastguard Worker v.__warningregistry__ = {} 294*cda5da8dSAndroid Build Coastguard Worker self.warnings_manager = warnings.catch_warnings(record=True) 295*cda5da8dSAndroid Build Coastguard Worker self.warnings = self.warnings_manager.__enter__() 296*cda5da8dSAndroid Build Coastguard Worker warnings.simplefilter("always", self.expected) 297*cda5da8dSAndroid Build Coastguard Worker return self 298*cda5da8dSAndroid Build Coastguard Worker 299*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, exc_type, exc_value, tb): 300*cda5da8dSAndroid Build Coastguard Worker self.warnings_manager.__exit__(exc_type, exc_value, tb) 301*cda5da8dSAndroid Build Coastguard Worker if exc_type is not None: 302*cda5da8dSAndroid Build Coastguard Worker # let unexpected exceptions pass through 303*cda5da8dSAndroid Build Coastguard Worker return 304*cda5da8dSAndroid Build Coastguard Worker try: 305*cda5da8dSAndroid Build Coastguard Worker exc_name = self.expected.__name__ 306*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 307*cda5da8dSAndroid Build Coastguard Worker exc_name = str(self.expected) 308*cda5da8dSAndroid Build Coastguard Worker first_matching = None 309*cda5da8dSAndroid Build Coastguard Worker for m in self.warnings: 310*cda5da8dSAndroid Build Coastguard Worker w = m.message 311*cda5da8dSAndroid Build Coastguard Worker if not isinstance(w, self.expected): 312*cda5da8dSAndroid Build Coastguard Worker continue 313*cda5da8dSAndroid Build Coastguard Worker if first_matching is None: 314*cda5da8dSAndroid Build Coastguard Worker first_matching = w 315*cda5da8dSAndroid Build Coastguard Worker if (self.expected_regex is not None and 316*cda5da8dSAndroid Build Coastguard Worker not self.expected_regex.search(str(w))): 317*cda5da8dSAndroid Build Coastguard Worker continue 318*cda5da8dSAndroid Build Coastguard Worker # store warning for later retrieval 319*cda5da8dSAndroid Build Coastguard Worker self.warning = w 320*cda5da8dSAndroid Build Coastguard Worker self.filename = m.filename 321*cda5da8dSAndroid Build Coastguard Worker self.lineno = m.lineno 322*cda5da8dSAndroid Build Coastguard Worker return 323*cda5da8dSAndroid Build Coastguard Worker # Now we simply try to choose a helpful failure message 324*cda5da8dSAndroid Build Coastguard Worker if first_matching is not None: 325*cda5da8dSAndroid Build Coastguard Worker self._raiseFailure('"{}" does not match "{}"'.format( 326*cda5da8dSAndroid Build Coastguard Worker self.expected_regex.pattern, str(first_matching))) 327*cda5da8dSAndroid Build Coastguard Worker if self.obj_name: 328*cda5da8dSAndroid Build Coastguard Worker self._raiseFailure("{} not triggered by {}".format(exc_name, 329*cda5da8dSAndroid Build Coastguard Worker self.obj_name)) 330*cda5da8dSAndroid Build Coastguard Worker else: 331*cda5da8dSAndroid Build Coastguard Worker self._raiseFailure("{} not triggered".format(exc_name)) 332*cda5da8dSAndroid Build Coastguard Worker 333*cda5da8dSAndroid Build Coastguard Worker 334*cda5da8dSAndroid Build Coastguard Workerclass _OrderedChainMap(collections.ChainMap): 335*cda5da8dSAndroid Build Coastguard Worker def __iter__(self): 336*cda5da8dSAndroid Build Coastguard Worker seen = set() 337*cda5da8dSAndroid Build Coastguard Worker for mapping in self.maps: 338*cda5da8dSAndroid Build Coastguard Worker for k in mapping: 339*cda5da8dSAndroid Build Coastguard Worker if k not in seen: 340*cda5da8dSAndroid Build Coastguard Worker seen.add(k) 341*cda5da8dSAndroid Build Coastguard Worker yield k 342*cda5da8dSAndroid Build Coastguard Worker 343*cda5da8dSAndroid Build Coastguard Worker 344*cda5da8dSAndroid Build Coastguard Workerclass TestCase(object): 345*cda5da8dSAndroid Build Coastguard Worker """A class whose instances are single test cases. 346*cda5da8dSAndroid Build Coastguard Worker 347*cda5da8dSAndroid Build Coastguard Worker By default, the test code itself should be placed in a method named 348*cda5da8dSAndroid Build Coastguard Worker 'runTest'. 349*cda5da8dSAndroid Build Coastguard Worker 350*cda5da8dSAndroid Build Coastguard Worker If the fixture may be used for many test cases, create as 351*cda5da8dSAndroid Build Coastguard Worker many test methods as are needed. When instantiating such a TestCase 352*cda5da8dSAndroid Build Coastguard Worker subclass, specify in the constructor arguments the name of the test method 353*cda5da8dSAndroid Build Coastguard Worker that the instance is to execute. 354*cda5da8dSAndroid Build Coastguard Worker 355*cda5da8dSAndroid Build Coastguard Worker Test authors should subclass TestCase for their own tests. Construction 356*cda5da8dSAndroid Build Coastguard Worker and deconstruction of the test's environment ('fixture') can be 357*cda5da8dSAndroid Build Coastguard Worker implemented by overriding the 'setUp' and 'tearDown' methods respectively. 358*cda5da8dSAndroid Build Coastguard Worker 359*cda5da8dSAndroid Build Coastguard Worker If it is necessary to override the __init__ method, the base class 360*cda5da8dSAndroid Build Coastguard Worker __init__ method must always be called. It is important that subclasses 361*cda5da8dSAndroid Build Coastguard Worker should not change the signature of their __init__ method, since instances 362*cda5da8dSAndroid Build Coastguard Worker of the classes are instantiated automatically by parts of the framework 363*cda5da8dSAndroid Build Coastguard Worker in order to be run. 364*cda5da8dSAndroid Build Coastguard Worker 365*cda5da8dSAndroid Build Coastguard Worker When subclassing TestCase, you can set these attributes: 366*cda5da8dSAndroid Build Coastguard Worker * failureException: determines which exception will be raised when 367*cda5da8dSAndroid Build Coastguard Worker the instance's assertion methods fail; test methods raising this 368*cda5da8dSAndroid Build Coastguard Worker exception will be deemed to have 'failed' rather than 'errored'. 369*cda5da8dSAndroid Build Coastguard Worker * longMessage: determines whether long messages (including repr of 370*cda5da8dSAndroid Build Coastguard Worker objects used in assert methods) will be printed on failure in *addition* 371*cda5da8dSAndroid Build Coastguard Worker to any explicit message passed. 372*cda5da8dSAndroid Build Coastguard Worker * maxDiff: sets the maximum length of a diff in failure messages 373*cda5da8dSAndroid Build Coastguard Worker by assert methods using difflib. It is looked up as an instance 374*cda5da8dSAndroid Build Coastguard Worker attribute so can be configured by individual tests if required. 375*cda5da8dSAndroid Build Coastguard Worker """ 376*cda5da8dSAndroid Build Coastguard Worker 377*cda5da8dSAndroid Build Coastguard Worker failureException = AssertionError 378*cda5da8dSAndroid Build Coastguard Worker 379*cda5da8dSAndroid Build Coastguard Worker longMessage = True 380*cda5da8dSAndroid Build Coastguard Worker 381*cda5da8dSAndroid Build Coastguard Worker maxDiff = 80*8 382*cda5da8dSAndroid Build Coastguard Worker 383*cda5da8dSAndroid Build Coastguard Worker # If a string is longer than _diffThreshold, use normal comparison instead 384*cda5da8dSAndroid Build Coastguard Worker # of difflib. See #11763. 385*cda5da8dSAndroid Build Coastguard Worker _diffThreshold = 2**16 386*cda5da8dSAndroid Build Coastguard Worker 387*cda5da8dSAndroid Build Coastguard Worker def __init_subclass__(cls, *args, **kwargs): 388*cda5da8dSAndroid Build Coastguard Worker # Attribute used by TestSuite for classSetUp 389*cda5da8dSAndroid Build Coastguard Worker cls._classSetupFailed = False 390*cda5da8dSAndroid Build Coastguard Worker cls._class_cleanups = [] 391*cda5da8dSAndroid Build Coastguard Worker super().__init_subclass__(*args, **kwargs) 392*cda5da8dSAndroid Build Coastguard Worker 393*cda5da8dSAndroid Build Coastguard Worker def __init__(self, methodName='runTest'): 394*cda5da8dSAndroid Build Coastguard Worker """Create an instance of the class that will use the named test 395*cda5da8dSAndroid Build Coastguard Worker method when executed. Raises a ValueError if the instance does 396*cda5da8dSAndroid Build Coastguard Worker not have a method with the specified name. 397*cda5da8dSAndroid Build Coastguard Worker """ 398*cda5da8dSAndroid Build Coastguard Worker self._testMethodName = methodName 399*cda5da8dSAndroid Build Coastguard Worker self._outcome = None 400*cda5da8dSAndroid Build Coastguard Worker self._testMethodDoc = 'No test' 401*cda5da8dSAndroid Build Coastguard Worker try: 402*cda5da8dSAndroid Build Coastguard Worker testMethod = getattr(self, methodName) 403*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 404*cda5da8dSAndroid Build Coastguard Worker if methodName != 'runTest': 405*cda5da8dSAndroid Build Coastguard Worker # we allow instantiation with no explicit method name 406*cda5da8dSAndroid Build Coastguard Worker # but not an *incorrect* or missing method name 407*cda5da8dSAndroid Build Coastguard Worker raise ValueError("no such test method in %s: %s" % 408*cda5da8dSAndroid Build Coastguard Worker (self.__class__, methodName)) 409*cda5da8dSAndroid Build Coastguard Worker else: 410*cda5da8dSAndroid Build Coastguard Worker self._testMethodDoc = testMethod.__doc__ 411*cda5da8dSAndroid Build Coastguard Worker self._cleanups = [] 412*cda5da8dSAndroid Build Coastguard Worker self._subtest = None 413*cda5da8dSAndroid Build Coastguard Worker 414*cda5da8dSAndroid Build Coastguard Worker # Map types to custom assertEqual functions that will compare 415*cda5da8dSAndroid Build Coastguard Worker # instances of said type in more detail to generate a more useful 416*cda5da8dSAndroid Build Coastguard Worker # error message. 417*cda5da8dSAndroid Build Coastguard Worker self._type_equality_funcs = {} 418*cda5da8dSAndroid Build Coastguard Worker self.addTypeEqualityFunc(dict, 'assertDictEqual') 419*cda5da8dSAndroid Build Coastguard Worker self.addTypeEqualityFunc(list, 'assertListEqual') 420*cda5da8dSAndroid Build Coastguard Worker self.addTypeEqualityFunc(tuple, 'assertTupleEqual') 421*cda5da8dSAndroid Build Coastguard Worker self.addTypeEqualityFunc(set, 'assertSetEqual') 422*cda5da8dSAndroid Build Coastguard Worker self.addTypeEqualityFunc(frozenset, 'assertSetEqual') 423*cda5da8dSAndroid Build Coastguard Worker self.addTypeEqualityFunc(str, 'assertMultiLineEqual') 424*cda5da8dSAndroid Build Coastguard Worker 425*cda5da8dSAndroid Build Coastguard Worker def addTypeEqualityFunc(self, typeobj, function): 426*cda5da8dSAndroid Build Coastguard Worker """Add a type specific assertEqual style function to compare a type. 427*cda5da8dSAndroid Build Coastguard Worker 428*cda5da8dSAndroid Build Coastguard Worker This method is for use by TestCase subclasses that need to register 429*cda5da8dSAndroid Build Coastguard Worker their own type equality functions to provide nicer error messages. 430*cda5da8dSAndroid Build Coastguard Worker 431*cda5da8dSAndroid Build Coastguard Worker Args: 432*cda5da8dSAndroid Build Coastguard Worker typeobj: The data type to call this function on when both values 433*cda5da8dSAndroid Build Coastguard Worker are of the same type in assertEqual(). 434*cda5da8dSAndroid Build Coastguard Worker function: The callable taking two arguments and an optional 435*cda5da8dSAndroid Build Coastguard Worker msg= argument that raises self.failureException with a 436*cda5da8dSAndroid Build Coastguard Worker useful error message when the two arguments are not equal. 437*cda5da8dSAndroid Build Coastguard Worker """ 438*cda5da8dSAndroid Build Coastguard Worker self._type_equality_funcs[typeobj] = function 439*cda5da8dSAndroid Build Coastguard Worker 440*cda5da8dSAndroid Build Coastguard Worker def addCleanup(self, function, /, *args, **kwargs): 441*cda5da8dSAndroid Build Coastguard Worker """Add a function, with arguments, to be called when the test is 442*cda5da8dSAndroid Build Coastguard Worker completed. Functions added are called on a LIFO basis and are 443*cda5da8dSAndroid Build Coastguard Worker called after tearDown on test failure or success. 444*cda5da8dSAndroid Build Coastguard Worker 445*cda5da8dSAndroid Build Coastguard Worker Cleanup items are called even if setUp fails (unlike tearDown).""" 446*cda5da8dSAndroid Build Coastguard Worker self._cleanups.append((function, args, kwargs)) 447*cda5da8dSAndroid Build Coastguard Worker 448*cda5da8dSAndroid Build Coastguard Worker def enterContext(self, cm): 449*cda5da8dSAndroid Build Coastguard Worker """Enters the supplied context manager. 450*cda5da8dSAndroid Build Coastguard Worker 451*cda5da8dSAndroid Build Coastguard Worker If successful, also adds its __exit__ method as a cleanup 452*cda5da8dSAndroid Build Coastguard Worker function and returns the result of the __enter__ method. 453*cda5da8dSAndroid Build Coastguard Worker """ 454*cda5da8dSAndroid Build Coastguard Worker return _enter_context(cm, self.addCleanup) 455*cda5da8dSAndroid Build Coastguard Worker 456*cda5da8dSAndroid Build Coastguard Worker @classmethod 457*cda5da8dSAndroid Build Coastguard Worker def addClassCleanup(cls, function, /, *args, **kwargs): 458*cda5da8dSAndroid Build Coastguard Worker """Same as addCleanup, except the cleanup items are called even if 459*cda5da8dSAndroid Build Coastguard Worker setUpClass fails (unlike tearDownClass).""" 460*cda5da8dSAndroid Build Coastguard Worker cls._class_cleanups.append((function, args, kwargs)) 461*cda5da8dSAndroid Build Coastguard Worker 462*cda5da8dSAndroid Build Coastguard Worker @classmethod 463*cda5da8dSAndroid Build Coastguard Worker def enterClassContext(cls, cm): 464*cda5da8dSAndroid Build Coastguard Worker """Same as enterContext, but class-wide.""" 465*cda5da8dSAndroid Build Coastguard Worker return _enter_context(cm, cls.addClassCleanup) 466*cda5da8dSAndroid Build Coastguard Worker 467*cda5da8dSAndroid Build Coastguard Worker def setUp(self): 468*cda5da8dSAndroid Build Coastguard Worker "Hook method for setting up the test fixture before exercising it." 469*cda5da8dSAndroid Build Coastguard Worker pass 470*cda5da8dSAndroid Build Coastguard Worker 471*cda5da8dSAndroid Build Coastguard Worker def tearDown(self): 472*cda5da8dSAndroid Build Coastguard Worker "Hook method for deconstructing the test fixture after testing it." 473*cda5da8dSAndroid Build Coastguard Worker pass 474*cda5da8dSAndroid Build Coastguard Worker 475*cda5da8dSAndroid Build Coastguard Worker @classmethod 476*cda5da8dSAndroid Build Coastguard Worker def setUpClass(cls): 477*cda5da8dSAndroid Build Coastguard Worker "Hook method for setting up class fixture before running tests in the class." 478*cda5da8dSAndroid Build Coastguard Worker 479*cda5da8dSAndroid Build Coastguard Worker @classmethod 480*cda5da8dSAndroid Build Coastguard Worker def tearDownClass(cls): 481*cda5da8dSAndroid Build Coastguard Worker "Hook method for deconstructing the class fixture after running all tests in the class." 482*cda5da8dSAndroid Build Coastguard Worker 483*cda5da8dSAndroid Build Coastguard Worker def countTestCases(self): 484*cda5da8dSAndroid Build Coastguard Worker return 1 485*cda5da8dSAndroid Build Coastguard Worker 486*cda5da8dSAndroid Build Coastguard Worker def defaultTestResult(self): 487*cda5da8dSAndroid Build Coastguard Worker return result.TestResult() 488*cda5da8dSAndroid Build Coastguard Worker 489*cda5da8dSAndroid Build Coastguard Worker def shortDescription(self): 490*cda5da8dSAndroid Build Coastguard Worker """Returns a one-line description of the test, or None if no 491*cda5da8dSAndroid Build Coastguard Worker description has been provided. 492*cda5da8dSAndroid Build Coastguard Worker 493*cda5da8dSAndroid Build Coastguard Worker The default implementation of this method returns the first line of 494*cda5da8dSAndroid Build Coastguard Worker the specified test method's docstring. 495*cda5da8dSAndroid Build Coastguard Worker """ 496*cda5da8dSAndroid Build Coastguard Worker doc = self._testMethodDoc 497*cda5da8dSAndroid Build Coastguard Worker return doc.strip().split("\n")[0].strip() if doc else None 498*cda5da8dSAndroid Build Coastguard Worker 499*cda5da8dSAndroid Build Coastguard Worker 500*cda5da8dSAndroid Build Coastguard Worker def id(self): 501*cda5da8dSAndroid Build Coastguard Worker return "%s.%s" % (strclass(self.__class__), self._testMethodName) 502*cda5da8dSAndroid Build Coastguard Worker 503*cda5da8dSAndroid Build Coastguard Worker def __eq__(self, other): 504*cda5da8dSAndroid Build Coastguard Worker if type(self) is not type(other): 505*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 506*cda5da8dSAndroid Build Coastguard Worker 507*cda5da8dSAndroid Build Coastguard Worker return self._testMethodName == other._testMethodName 508*cda5da8dSAndroid Build Coastguard Worker 509*cda5da8dSAndroid Build Coastguard Worker def __hash__(self): 510*cda5da8dSAndroid Build Coastguard Worker return hash((type(self), self._testMethodName)) 511*cda5da8dSAndroid Build Coastguard Worker 512*cda5da8dSAndroid Build Coastguard Worker def __str__(self): 513*cda5da8dSAndroid Build Coastguard Worker return "%s (%s.%s)" % (self._testMethodName, strclass(self.__class__), self._testMethodName) 514*cda5da8dSAndroid Build Coastguard Worker 515*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 516*cda5da8dSAndroid Build Coastguard Worker return "<%s testMethod=%s>" % \ 517*cda5da8dSAndroid Build Coastguard Worker (strclass(self.__class__), self._testMethodName) 518*cda5da8dSAndroid Build Coastguard Worker 519*cda5da8dSAndroid Build Coastguard Worker @contextlib.contextmanager 520*cda5da8dSAndroid Build Coastguard Worker def subTest(self, msg=_subtest_msg_sentinel, **params): 521*cda5da8dSAndroid Build Coastguard Worker """Return a context manager that will return the enclosed block 522*cda5da8dSAndroid Build Coastguard Worker of code in a subtest identified by the optional message and 523*cda5da8dSAndroid Build Coastguard Worker keyword parameters. A failure in the subtest marks the test 524*cda5da8dSAndroid Build Coastguard Worker case as failed but resumes execution at the end of the enclosed 525*cda5da8dSAndroid Build Coastguard Worker block, allowing further test code to be executed. 526*cda5da8dSAndroid Build Coastguard Worker """ 527*cda5da8dSAndroid Build Coastguard Worker if self._outcome is None or not self._outcome.result_supports_subtests: 528*cda5da8dSAndroid Build Coastguard Worker yield 529*cda5da8dSAndroid Build Coastguard Worker return 530*cda5da8dSAndroid Build Coastguard Worker parent = self._subtest 531*cda5da8dSAndroid Build Coastguard Worker if parent is None: 532*cda5da8dSAndroid Build Coastguard Worker params_map = _OrderedChainMap(params) 533*cda5da8dSAndroid Build Coastguard Worker else: 534*cda5da8dSAndroid Build Coastguard Worker params_map = parent.params.new_child(params) 535*cda5da8dSAndroid Build Coastguard Worker self._subtest = _SubTest(self, msg, params_map) 536*cda5da8dSAndroid Build Coastguard Worker try: 537*cda5da8dSAndroid Build Coastguard Worker with self._outcome.testPartExecutor(self._subtest, subTest=True): 538*cda5da8dSAndroid Build Coastguard Worker yield 539*cda5da8dSAndroid Build Coastguard Worker if not self._outcome.success: 540*cda5da8dSAndroid Build Coastguard Worker result = self._outcome.result 541*cda5da8dSAndroid Build Coastguard Worker if result is not None and result.failfast: 542*cda5da8dSAndroid Build Coastguard Worker raise _ShouldStop 543*cda5da8dSAndroid Build Coastguard Worker elif self._outcome.expectedFailure: 544*cda5da8dSAndroid Build Coastguard Worker # If the test is expecting a failure, we really want to 545*cda5da8dSAndroid Build Coastguard Worker # stop now and register the expected failure. 546*cda5da8dSAndroid Build Coastguard Worker raise _ShouldStop 547*cda5da8dSAndroid Build Coastguard Worker finally: 548*cda5da8dSAndroid Build Coastguard Worker self._subtest = parent 549*cda5da8dSAndroid Build Coastguard Worker 550*cda5da8dSAndroid Build Coastguard Worker def _addExpectedFailure(self, result, exc_info): 551*cda5da8dSAndroid Build Coastguard Worker try: 552*cda5da8dSAndroid Build Coastguard Worker addExpectedFailure = result.addExpectedFailure 553*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 554*cda5da8dSAndroid Build Coastguard Worker warnings.warn("TestResult has no addExpectedFailure method, reporting as passes", 555*cda5da8dSAndroid Build Coastguard Worker RuntimeWarning) 556*cda5da8dSAndroid Build Coastguard Worker result.addSuccess(self) 557*cda5da8dSAndroid Build Coastguard Worker else: 558*cda5da8dSAndroid Build Coastguard Worker addExpectedFailure(self, exc_info) 559*cda5da8dSAndroid Build Coastguard Worker 560*cda5da8dSAndroid Build Coastguard Worker def _addUnexpectedSuccess(self, result): 561*cda5da8dSAndroid Build Coastguard Worker try: 562*cda5da8dSAndroid Build Coastguard Worker addUnexpectedSuccess = result.addUnexpectedSuccess 563*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 564*cda5da8dSAndroid Build Coastguard Worker warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure", 565*cda5da8dSAndroid Build Coastguard Worker RuntimeWarning) 566*cda5da8dSAndroid Build Coastguard Worker # We need to pass an actual exception and traceback to addFailure, 567*cda5da8dSAndroid Build Coastguard Worker # otherwise the legacy result can choke. 568*cda5da8dSAndroid Build Coastguard Worker try: 569*cda5da8dSAndroid Build Coastguard Worker raise _UnexpectedSuccess from None 570*cda5da8dSAndroid Build Coastguard Worker except _UnexpectedSuccess: 571*cda5da8dSAndroid Build Coastguard Worker result.addFailure(self, sys.exc_info()) 572*cda5da8dSAndroid Build Coastguard Worker else: 573*cda5da8dSAndroid Build Coastguard Worker addUnexpectedSuccess(self) 574*cda5da8dSAndroid Build Coastguard Worker 575*cda5da8dSAndroid Build Coastguard Worker def _callSetUp(self): 576*cda5da8dSAndroid Build Coastguard Worker self.setUp() 577*cda5da8dSAndroid Build Coastguard Worker 578*cda5da8dSAndroid Build Coastguard Worker def _callTestMethod(self, method): 579*cda5da8dSAndroid Build Coastguard Worker if method() is not None: 580*cda5da8dSAndroid Build Coastguard Worker warnings.warn(f'It is deprecated to return a value that is not None from a ' 581*cda5da8dSAndroid Build Coastguard Worker f'test case ({method})', DeprecationWarning, stacklevel=3) 582*cda5da8dSAndroid Build Coastguard Worker 583*cda5da8dSAndroid Build Coastguard Worker def _callTearDown(self): 584*cda5da8dSAndroid Build Coastguard Worker self.tearDown() 585*cda5da8dSAndroid Build Coastguard Worker 586*cda5da8dSAndroid Build Coastguard Worker def _callCleanup(self, function, /, *args, **kwargs): 587*cda5da8dSAndroid Build Coastguard Worker function(*args, **kwargs) 588*cda5da8dSAndroid Build Coastguard Worker 589*cda5da8dSAndroid Build Coastguard Worker def run(self, result=None): 590*cda5da8dSAndroid Build Coastguard Worker if result is None: 591*cda5da8dSAndroid Build Coastguard Worker result = self.defaultTestResult() 592*cda5da8dSAndroid Build Coastguard Worker startTestRun = getattr(result, 'startTestRun', None) 593*cda5da8dSAndroid Build Coastguard Worker stopTestRun = getattr(result, 'stopTestRun', None) 594*cda5da8dSAndroid Build Coastguard Worker if startTestRun is not None: 595*cda5da8dSAndroid Build Coastguard Worker startTestRun() 596*cda5da8dSAndroid Build Coastguard Worker else: 597*cda5da8dSAndroid Build Coastguard Worker stopTestRun = None 598*cda5da8dSAndroid Build Coastguard Worker 599*cda5da8dSAndroid Build Coastguard Worker result.startTest(self) 600*cda5da8dSAndroid Build Coastguard Worker try: 601*cda5da8dSAndroid Build Coastguard Worker testMethod = getattr(self, self._testMethodName) 602*cda5da8dSAndroid Build Coastguard Worker if (getattr(self.__class__, "__unittest_skip__", False) or 603*cda5da8dSAndroid Build Coastguard Worker getattr(testMethod, "__unittest_skip__", False)): 604*cda5da8dSAndroid Build Coastguard Worker # If the class or method was skipped. 605*cda5da8dSAndroid Build Coastguard Worker skip_why = (getattr(self.__class__, '__unittest_skip_why__', '') 606*cda5da8dSAndroid Build Coastguard Worker or getattr(testMethod, '__unittest_skip_why__', '')) 607*cda5da8dSAndroid Build Coastguard Worker _addSkip(result, self, skip_why) 608*cda5da8dSAndroid Build Coastguard Worker return result 609*cda5da8dSAndroid Build Coastguard Worker 610*cda5da8dSAndroid Build Coastguard Worker expecting_failure = ( 611*cda5da8dSAndroid Build Coastguard Worker getattr(self, "__unittest_expecting_failure__", False) or 612*cda5da8dSAndroid Build Coastguard Worker getattr(testMethod, "__unittest_expecting_failure__", False) 613*cda5da8dSAndroid Build Coastguard Worker ) 614*cda5da8dSAndroid Build Coastguard Worker outcome = _Outcome(result) 615*cda5da8dSAndroid Build Coastguard Worker try: 616*cda5da8dSAndroid Build Coastguard Worker self._outcome = outcome 617*cda5da8dSAndroid Build Coastguard Worker 618*cda5da8dSAndroid Build Coastguard Worker with outcome.testPartExecutor(self): 619*cda5da8dSAndroid Build Coastguard Worker self._callSetUp() 620*cda5da8dSAndroid Build Coastguard Worker if outcome.success: 621*cda5da8dSAndroid Build Coastguard Worker outcome.expecting_failure = expecting_failure 622*cda5da8dSAndroid Build Coastguard Worker with outcome.testPartExecutor(self): 623*cda5da8dSAndroid Build Coastguard Worker self._callTestMethod(testMethod) 624*cda5da8dSAndroid Build Coastguard Worker outcome.expecting_failure = False 625*cda5da8dSAndroid Build Coastguard Worker with outcome.testPartExecutor(self): 626*cda5da8dSAndroid Build Coastguard Worker self._callTearDown() 627*cda5da8dSAndroid Build Coastguard Worker self.doCleanups() 628*cda5da8dSAndroid Build Coastguard Worker 629*cda5da8dSAndroid Build Coastguard Worker if outcome.success: 630*cda5da8dSAndroid Build Coastguard Worker if expecting_failure: 631*cda5da8dSAndroid Build Coastguard Worker if outcome.expectedFailure: 632*cda5da8dSAndroid Build Coastguard Worker self._addExpectedFailure(result, outcome.expectedFailure) 633*cda5da8dSAndroid Build Coastguard Worker else: 634*cda5da8dSAndroid Build Coastguard Worker self._addUnexpectedSuccess(result) 635*cda5da8dSAndroid Build Coastguard Worker else: 636*cda5da8dSAndroid Build Coastguard Worker result.addSuccess(self) 637*cda5da8dSAndroid Build Coastguard Worker return result 638*cda5da8dSAndroid Build Coastguard Worker finally: 639*cda5da8dSAndroid Build Coastguard Worker # explicitly break reference cycle: 640*cda5da8dSAndroid Build Coastguard Worker # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure 641*cda5da8dSAndroid Build Coastguard Worker outcome.expectedFailure = None 642*cda5da8dSAndroid Build Coastguard Worker outcome = None 643*cda5da8dSAndroid Build Coastguard Worker 644*cda5da8dSAndroid Build Coastguard Worker # clear the outcome, no more needed 645*cda5da8dSAndroid Build Coastguard Worker self._outcome = None 646*cda5da8dSAndroid Build Coastguard Worker 647*cda5da8dSAndroid Build Coastguard Worker finally: 648*cda5da8dSAndroid Build Coastguard Worker result.stopTest(self) 649*cda5da8dSAndroid Build Coastguard Worker if stopTestRun is not None: 650*cda5da8dSAndroid Build Coastguard Worker stopTestRun() 651*cda5da8dSAndroid Build Coastguard Worker 652*cda5da8dSAndroid Build Coastguard Worker def doCleanups(self): 653*cda5da8dSAndroid Build Coastguard Worker """Execute all cleanup functions. Normally called for you after 654*cda5da8dSAndroid Build Coastguard Worker tearDown.""" 655*cda5da8dSAndroid Build Coastguard Worker outcome = self._outcome or _Outcome() 656*cda5da8dSAndroid Build Coastguard Worker while self._cleanups: 657*cda5da8dSAndroid Build Coastguard Worker function, args, kwargs = self._cleanups.pop() 658*cda5da8dSAndroid Build Coastguard Worker with outcome.testPartExecutor(self): 659*cda5da8dSAndroid Build Coastguard Worker self._callCleanup(function, *args, **kwargs) 660*cda5da8dSAndroid Build Coastguard Worker 661*cda5da8dSAndroid Build Coastguard Worker # return this for backwards compatibility 662*cda5da8dSAndroid Build Coastguard Worker # even though we no longer use it internally 663*cda5da8dSAndroid Build Coastguard Worker return outcome.success 664*cda5da8dSAndroid Build Coastguard Worker 665*cda5da8dSAndroid Build Coastguard Worker @classmethod 666*cda5da8dSAndroid Build Coastguard Worker def doClassCleanups(cls): 667*cda5da8dSAndroid Build Coastguard Worker """Execute all class cleanup functions. Normally called for you after 668*cda5da8dSAndroid Build Coastguard Worker tearDownClass.""" 669*cda5da8dSAndroid Build Coastguard Worker cls.tearDown_exceptions = [] 670*cda5da8dSAndroid Build Coastguard Worker while cls._class_cleanups: 671*cda5da8dSAndroid Build Coastguard Worker function, args, kwargs = cls._class_cleanups.pop() 672*cda5da8dSAndroid Build Coastguard Worker try: 673*cda5da8dSAndroid Build Coastguard Worker function(*args, **kwargs) 674*cda5da8dSAndroid Build Coastguard Worker except Exception: 675*cda5da8dSAndroid Build Coastguard Worker cls.tearDown_exceptions.append(sys.exc_info()) 676*cda5da8dSAndroid Build Coastguard Worker 677*cda5da8dSAndroid Build Coastguard Worker def __call__(self, *args, **kwds): 678*cda5da8dSAndroid Build Coastguard Worker return self.run(*args, **kwds) 679*cda5da8dSAndroid Build Coastguard Worker 680*cda5da8dSAndroid Build Coastguard Worker def debug(self): 681*cda5da8dSAndroid Build Coastguard Worker """Run the test without collecting errors in a TestResult""" 682*cda5da8dSAndroid Build Coastguard Worker testMethod = getattr(self, self._testMethodName) 683*cda5da8dSAndroid Build Coastguard Worker if (getattr(self.__class__, "__unittest_skip__", False) or 684*cda5da8dSAndroid Build Coastguard Worker getattr(testMethod, "__unittest_skip__", False)): 685*cda5da8dSAndroid Build Coastguard Worker # If the class or method was skipped. 686*cda5da8dSAndroid Build Coastguard Worker skip_why = (getattr(self.__class__, '__unittest_skip_why__', '') 687*cda5da8dSAndroid Build Coastguard Worker or getattr(testMethod, '__unittest_skip_why__', '')) 688*cda5da8dSAndroid Build Coastguard Worker raise SkipTest(skip_why) 689*cda5da8dSAndroid Build Coastguard Worker 690*cda5da8dSAndroid Build Coastguard Worker self._callSetUp() 691*cda5da8dSAndroid Build Coastguard Worker self._callTestMethod(testMethod) 692*cda5da8dSAndroid Build Coastguard Worker self._callTearDown() 693*cda5da8dSAndroid Build Coastguard Worker while self._cleanups: 694*cda5da8dSAndroid Build Coastguard Worker function, args, kwargs = self._cleanups.pop() 695*cda5da8dSAndroid Build Coastguard Worker self._callCleanup(function, *args, **kwargs) 696*cda5da8dSAndroid Build Coastguard Worker 697*cda5da8dSAndroid Build Coastguard Worker def skipTest(self, reason): 698*cda5da8dSAndroid Build Coastguard Worker """Skip this test.""" 699*cda5da8dSAndroid Build Coastguard Worker raise SkipTest(reason) 700*cda5da8dSAndroid Build Coastguard Worker 701*cda5da8dSAndroid Build Coastguard Worker def fail(self, msg=None): 702*cda5da8dSAndroid Build Coastguard Worker """Fail immediately, with the given message.""" 703*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 704*cda5da8dSAndroid Build Coastguard Worker 705*cda5da8dSAndroid Build Coastguard Worker def assertFalse(self, expr, msg=None): 706*cda5da8dSAndroid Build Coastguard Worker """Check that the expression is false.""" 707*cda5da8dSAndroid Build Coastguard Worker if expr: 708*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr)) 709*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 710*cda5da8dSAndroid Build Coastguard Worker 711*cda5da8dSAndroid Build Coastguard Worker def assertTrue(self, expr, msg=None): 712*cda5da8dSAndroid Build Coastguard Worker """Check that the expression is true.""" 713*cda5da8dSAndroid Build Coastguard Worker if not expr: 714*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr)) 715*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 716*cda5da8dSAndroid Build Coastguard Worker 717*cda5da8dSAndroid Build Coastguard Worker def _formatMessage(self, msg, standardMsg): 718*cda5da8dSAndroid Build Coastguard Worker """Honour the longMessage attribute when generating failure messages. 719*cda5da8dSAndroid Build Coastguard Worker If longMessage is False this means: 720*cda5da8dSAndroid Build Coastguard Worker * Use only an explicit message if it is provided 721*cda5da8dSAndroid Build Coastguard Worker * Otherwise use the standard message for the assert 722*cda5da8dSAndroid Build Coastguard Worker 723*cda5da8dSAndroid Build Coastguard Worker If longMessage is True: 724*cda5da8dSAndroid Build Coastguard Worker * Use the standard message 725*cda5da8dSAndroid Build Coastguard Worker * If an explicit message is provided, plus ' : ' and the explicit message 726*cda5da8dSAndroid Build Coastguard Worker """ 727*cda5da8dSAndroid Build Coastguard Worker if not self.longMessage: 728*cda5da8dSAndroid Build Coastguard Worker return msg or standardMsg 729*cda5da8dSAndroid Build Coastguard Worker if msg is None: 730*cda5da8dSAndroid Build Coastguard Worker return standardMsg 731*cda5da8dSAndroid Build Coastguard Worker try: 732*cda5da8dSAndroid Build Coastguard Worker # don't switch to '{}' formatting in Python 2.X 733*cda5da8dSAndroid Build Coastguard Worker # it changes the way unicode input is handled 734*cda5da8dSAndroid Build Coastguard Worker return '%s : %s' % (standardMsg, msg) 735*cda5da8dSAndroid Build Coastguard Worker except UnicodeDecodeError: 736*cda5da8dSAndroid Build Coastguard Worker return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg)) 737*cda5da8dSAndroid Build Coastguard Worker 738*cda5da8dSAndroid Build Coastguard Worker def assertRaises(self, expected_exception, *args, **kwargs): 739*cda5da8dSAndroid Build Coastguard Worker """Fail unless an exception of class expected_exception is raised 740*cda5da8dSAndroid Build Coastguard Worker by the callable when invoked with specified positional and 741*cda5da8dSAndroid Build Coastguard Worker keyword arguments. If a different type of exception is 742*cda5da8dSAndroid Build Coastguard Worker raised, it will not be caught, and the test case will be 743*cda5da8dSAndroid Build Coastguard Worker deemed to have suffered an error, exactly as for an 744*cda5da8dSAndroid Build Coastguard Worker unexpected exception. 745*cda5da8dSAndroid Build Coastguard Worker 746*cda5da8dSAndroid Build Coastguard Worker If called with the callable and arguments omitted, will return a 747*cda5da8dSAndroid Build Coastguard Worker context object used like this:: 748*cda5da8dSAndroid Build Coastguard Worker 749*cda5da8dSAndroid Build Coastguard Worker with self.assertRaises(SomeException): 750*cda5da8dSAndroid Build Coastguard Worker do_something() 751*cda5da8dSAndroid Build Coastguard Worker 752*cda5da8dSAndroid Build Coastguard Worker An optional keyword argument 'msg' can be provided when assertRaises 753*cda5da8dSAndroid Build Coastguard Worker is used as a context object. 754*cda5da8dSAndroid Build Coastguard Worker 755*cda5da8dSAndroid Build Coastguard Worker The context manager keeps a reference to the exception as 756*cda5da8dSAndroid Build Coastguard Worker the 'exception' attribute. This allows you to inspect the 757*cda5da8dSAndroid Build Coastguard Worker exception after the assertion:: 758*cda5da8dSAndroid Build Coastguard Worker 759*cda5da8dSAndroid Build Coastguard Worker with self.assertRaises(SomeException) as cm: 760*cda5da8dSAndroid Build Coastguard Worker do_something() 761*cda5da8dSAndroid Build Coastguard Worker the_exception = cm.exception 762*cda5da8dSAndroid Build Coastguard Worker self.assertEqual(the_exception.error_code, 3) 763*cda5da8dSAndroid Build Coastguard Worker """ 764*cda5da8dSAndroid Build Coastguard Worker context = _AssertRaisesContext(expected_exception, self) 765*cda5da8dSAndroid Build Coastguard Worker try: 766*cda5da8dSAndroid Build Coastguard Worker return context.handle('assertRaises', args, kwargs) 767*cda5da8dSAndroid Build Coastguard Worker finally: 768*cda5da8dSAndroid Build Coastguard Worker # bpo-23890: manually break a reference cycle 769*cda5da8dSAndroid Build Coastguard Worker context = None 770*cda5da8dSAndroid Build Coastguard Worker 771*cda5da8dSAndroid Build Coastguard Worker def assertWarns(self, expected_warning, *args, **kwargs): 772*cda5da8dSAndroid Build Coastguard Worker """Fail unless a warning of class warnClass is triggered 773*cda5da8dSAndroid Build Coastguard Worker by the callable when invoked with specified positional and 774*cda5da8dSAndroid Build Coastguard Worker keyword arguments. If a different type of warning is 775*cda5da8dSAndroid Build Coastguard Worker triggered, it will not be handled: depending on the other 776*cda5da8dSAndroid Build Coastguard Worker warning filtering rules in effect, it might be silenced, printed 777*cda5da8dSAndroid Build Coastguard Worker out, or raised as an exception. 778*cda5da8dSAndroid Build Coastguard Worker 779*cda5da8dSAndroid Build Coastguard Worker If called with the callable and arguments omitted, will return a 780*cda5da8dSAndroid Build Coastguard Worker context object used like this:: 781*cda5da8dSAndroid Build Coastguard Worker 782*cda5da8dSAndroid Build Coastguard Worker with self.assertWarns(SomeWarning): 783*cda5da8dSAndroid Build Coastguard Worker do_something() 784*cda5da8dSAndroid Build Coastguard Worker 785*cda5da8dSAndroid Build Coastguard Worker An optional keyword argument 'msg' can be provided when assertWarns 786*cda5da8dSAndroid Build Coastguard Worker is used as a context object. 787*cda5da8dSAndroid Build Coastguard Worker 788*cda5da8dSAndroid Build Coastguard Worker The context manager keeps a reference to the first matching 789*cda5da8dSAndroid Build Coastguard Worker warning as the 'warning' attribute; similarly, the 'filename' 790*cda5da8dSAndroid Build Coastguard Worker and 'lineno' attributes give you information about the line 791*cda5da8dSAndroid Build Coastguard Worker of Python code from which the warning was triggered. 792*cda5da8dSAndroid Build Coastguard Worker This allows you to inspect the warning after the assertion:: 793*cda5da8dSAndroid Build Coastguard Worker 794*cda5da8dSAndroid Build Coastguard Worker with self.assertWarns(SomeWarning) as cm: 795*cda5da8dSAndroid Build Coastguard Worker do_something() 796*cda5da8dSAndroid Build Coastguard Worker the_warning = cm.warning 797*cda5da8dSAndroid Build Coastguard Worker self.assertEqual(the_warning.some_attribute, 147) 798*cda5da8dSAndroid Build Coastguard Worker """ 799*cda5da8dSAndroid Build Coastguard Worker context = _AssertWarnsContext(expected_warning, self) 800*cda5da8dSAndroid Build Coastguard Worker return context.handle('assertWarns', args, kwargs) 801*cda5da8dSAndroid Build Coastguard Worker 802*cda5da8dSAndroid Build Coastguard Worker def assertLogs(self, logger=None, level=None): 803*cda5da8dSAndroid Build Coastguard Worker """Fail unless a log message of level *level* or higher is emitted 804*cda5da8dSAndroid Build Coastguard Worker on *logger_name* or its children. If omitted, *level* defaults to 805*cda5da8dSAndroid Build Coastguard Worker INFO and *logger* defaults to the root logger. 806*cda5da8dSAndroid Build Coastguard Worker 807*cda5da8dSAndroid Build Coastguard Worker This method must be used as a context manager, and will yield 808*cda5da8dSAndroid Build Coastguard Worker a recording object with two attributes: `output` and `records`. 809*cda5da8dSAndroid Build Coastguard Worker At the end of the context manager, the `output` attribute will 810*cda5da8dSAndroid Build Coastguard Worker be a list of the matching formatted log messages and the 811*cda5da8dSAndroid Build Coastguard Worker `records` attribute will be a list of the corresponding LogRecord 812*cda5da8dSAndroid Build Coastguard Worker objects. 813*cda5da8dSAndroid Build Coastguard Worker 814*cda5da8dSAndroid Build Coastguard Worker Example:: 815*cda5da8dSAndroid Build Coastguard Worker 816*cda5da8dSAndroid Build Coastguard Worker with self.assertLogs('foo', level='INFO') as cm: 817*cda5da8dSAndroid Build Coastguard Worker logging.getLogger('foo').info('first message') 818*cda5da8dSAndroid Build Coastguard Worker logging.getLogger('foo.bar').error('second message') 819*cda5da8dSAndroid Build Coastguard Worker self.assertEqual(cm.output, ['INFO:foo:first message', 820*cda5da8dSAndroid Build Coastguard Worker 'ERROR:foo.bar:second message']) 821*cda5da8dSAndroid Build Coastguard Worker """ 822*cda5da8dSAndroid Build Coastguard Worker # Lazy import to avoid importing logging if it is not needed. 823*cda5da8dSAndroid Build Coastguard Worker from ._log import _AssertLogsContext 824*cda5da8dSAndroid Build Coastguard Worker return _AssertLogsContext(self, logger, level, no_logs=False) 825*cda5da8dSAndroid Build Coastguard Worker 826*cda5da8dSAndroid Build Coastguard Worker def assertNoLogs(self, logger=None, level=None): 827*cda5da8dSAndroid Build Coastguard Worker """ Fail unless no log messages of level *level* or higher are emitted 828*cda5da8dSAndroid Build Coastguard Worker on *logger_name* or its children. 829*cda5da8dSAndroid Build Coastguard Worker 830*cda5da8dSAndroid Build Coastguard Worker This method must be used as a context manager. 831*cda5da8dSAndroid Build Coastguard Worker """ 832*cda5da8dSAndroid Build Coastguard Worker from ._log import _AssertLogsContext 833*cda5da8dSAndroid Build Coastguard Worker return _AssertLogsContext(self, logger, level, no_logs=True) 834*cda5da8dSAndroid Build Coastguard Worker 835*cda5da8dSAndroid Build Coastguard Worker def _getAssertEqualityFunc(self, first, second): 836*cda5da8dSAndroid Build Coastguard Worker """Get a detailed comparison function for the types of the two args. 837*cda5da8dSAndroid Build Coastguard Worker 838*cda5da8dSAndroid Build Coastguard Worker Returns: A callable accepting (first, second, msg=None) that will 839*cda5da8dSAndroid Build Coastguard Worker raise a failure exception if first != second with a useful human 840*cda5da8dSAndroid Build Coastguard Worker readable error message for those types. 841*cda5da8dSAndroid Build Coastguard Worker """ 842*cda5da8dSAndroid Build Coastguard Worker # 843*cda5da8dSAndroid Build Coastguard Worker # NOTE(gregory.p.smith): I considered isinstance(first, type(second)) 844*cda5da8dSAndroid Build Coastguard Worker # and vice versa. I opted for the conservative approach in case 845*cda5da8dSAndroid Build Coastguard Worker # subclasses are not intended to be compared in detail to their super 846*cda5da8dSAndroid Build Coastguard Worker # class instances using a type equality func. This means testing 847*cda5da8dSAndroid Build Coastguard Worker # subtypes won't automagically use the detailed comparison. Callers 848*cda5da8dSAndroid Build Coastguard Worker # should use their type specific assertSpamEqual method to compare 849*cda5da8dSAndroid Build Coastguard Worker # subclasses if the detailed comparison is desired and appropriate. 850*cda5da8dSAndroid Build Coastguard Worker # See the discussion in http://bugs.python.org/issue2578. 851*cda5da8dSAndroid Build Coastguard Worker # 852*cda5da8dSAndroid Build Coastguard Worker if type(first) is type(second): 853*cda5da8dSAndroid Build Coastguard Worker asserter = self._type_equality_funcs.get(type(first)) 854*cda5da8dSAndroid Build Coastguard Worker if asserter is not None: 855*cda5da8dSAndroid Build Coastguard Worker if isinstance(asserter, str): 856*cda5da8dSAndroid Build Coastguard Worker asserter = getattr(self, asserter) 857*cda5da8dSAndroid Build Coastguard Worker return asserter 858*cda5da8dSAndroid Build Coastguard Worker 859*cda5da8dSAndroid Build Coastguard Worker return self._baseAssertEqual 860*cda5da8dSAndroid Build Coastguard Worker 861*cda5da8dSAndroid Build Coastguard Worker def _baseAssertEqual(self, first, second, msg=None): 862*cda5da8dSAndroid Build Coastguard Worker """The default assertEqual implementation, not type specific.""" 863*cda5da8dSAndroid Build Coastguard Worker if not first == second: 864*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s != %s' % _common_shorten_repr(first, second) 865*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, standardMsg) 866*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 867*cda5da8dSAndroid Build Coastguard Worker 868*cda5da8dSAndroid Build Coastguard Worker def assertEqual(self, first, second, msg=None): 869*cda5da8dSAndroid Build Coastguard Worker """Fail if the two objects are unequal as determined by the '==' 870*cda5da8dSAndroid Build Coastguard Worker operator. 871*cda5da8dSAndroid Build Coastguard Worker """ 872*cda5da8dSAndroid Build Coastguard Worker assertion_func = self._getAssertEqualityFunc(first, second) 873*cda5da8dSAndroid Build Coastguard Worker assertion_func(first, second, msg=msg) 874*cda5da8dSAndroid Build Coastguard Worker 875*cda5da8dSAndroid Build Coastguard Worker def assertNotEqual(self, first, second, msg=None): 876*cda5da8dSAndroid Build Coastguard Worker """Fail if the two objects are equal as determined by the '!=' 877*cda5da8dSAndroid Build Coastguard Worker operator. 878*cda5da8dSAndroid Build Coastguard Worker """ 879*cda5da8dSAndroid Build Coastguard Worker if not first != second: 880*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first), 881*cda5da8dSAndroid Build Coastguard Worker safe_repr(second))) 882*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 883*cda5da8dSAndroid Build Coastguard Worker 884*cda5da8dSAndroid Build Coastguard Worker def assertAlmostEqual(self, first, second, places=None, msg=None, 885*cda5da8dSAndroid Build Coastguard Worker delta=None): 886*cda5da8dSAndroid Build Coastguard Worker """Fail if the two objects are unequal as determined by their 887*cda5da8dSAndroid Build Coastguard Worker difference rounded to the given number of decimal places 888*cda5da8dSAndroid Build Coastguard Worker (default 7) and comparing to zero, or by comparing that the 889*cda5da8dSAndroid Build Coastguard Worker difference between the two objects is more than the given 890*cda5da8dSAndroid Build Coastguard Worker delta. 891*cda5da8dSAndroid Build Coastguard Worker 892*cda5da8dSAndroid Build Coastguard Worker Note that decimal places (from zero) are usually not the same 893*cda5da8dSAndroid Build Coastguard Worker as significant digits (measured from the most significant digit). 894*cda5da8dSAndroid Build Coastguard Worker 895*cda5da8dSAndroid Build Coastguard Worker If the two objects compare equal then they will automatically 896*cda5da8dSAndroid Build Coastguard Worker compare almost equal. 897*cda5da8dSAndroid Build Coastguard Worker """ 898*cda5da8dSAndroid Build Coastguard Worker if first == second: 899*cda5da8dSAndroid Build Coastguard Worker # shortcut 900*cda5da8dSAndroid Build Coastguard Worker return 901*cda5da8dSAndroid Build Coastguard Worker if delta is not None and places is not None: 902*cda5da8dSAndroid Build Coastguard Worker raise TypeError("specify delta or places not both") 903*cda5da8dSAndroid Build Coastguard Worker 904*cda5da8dSAndroid Build Coastguard Worker diff = abs(first - second) 905*cda5da8dSAndroid Build Coastguard Worker if delta is not None: 906*cda5da8dSAndroid Build Coastguard Worker if diff <= delta: 907*cda5da8dSAndroid Build Coastguard Worker return 908*cda5da8dSAndroid Build Coastguard Worker 909*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s != %s within %s delta (%s difference)' % ( 910*cda5da8dSAndroid Build Coastguard Worker safe_repr(first), 911*cda5da8dSAndroid Build Coastguard Worker safe_repr(second), 912*cda5da8dSAndroid Build Coastguard Worker safe_repr(delta), 913*cda5da8dSAndroid Build Coastguard Worker safe_repr(diff)) 914*cda5da8dSAndroid Build Coastguard Worker else: 915*cda5da8dSAndroid Build Coastguard Worker if places is None: 916*cda5da8dSAndroid Build Coastguard Worker places = 7 917*cda5da8dSAndroid Build Coastguard Worker 918*cda5da8dSAndroid Build Coastguard Worker if round(diff, places) == 0: 919*cda5da8dSAndroid Build Coastguard Worker return 920*cda5da8dSAndroid Build Coastguard Worker 921*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s != %s within %r places (%s difference)' % ( 922*cda5da8dSAndroid Build Coastguard Worker safe_repr(first), 923*cda5da8dSAndroid Build Coastguard Worker safe_repr(second), 924*cda5da8dSAndroid Build Coastguard Worker places, 925*cda5da8dSAndroid Build Coastguard Worker safe_repr(diff)) 926*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, standardMsg) 927*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 928*cda5da8dSAndroid Build Coastguard Worker 929*cda5da8dSAndroid Build Coastguard Worker def assertNotAlmostEqual(self, first, second, places=None, msg=None, 930*cda5da8dSAndroid Build Coastguard Worker delta=None): 931*cda5da8dSAndroid Build Coastguard Worker """Fail if the two objects are equal as determined by their 932*cda5da8dSAndroid Build Coastguard Worker difference rounded to the given number of decimal places 933*cda5da8dSAndroid Build Coastguard Worker (default 7) and comparing to zero, or by comparing that the 934*cda5da8dSAndroid Build Coastguard Worker difference between the two objects is less than the given delta. 935*cda5da8dSAndroid Build Coastguard Worker 936*cda5da8dSAndroid Build Coastguard Worker Note that decimal places (from zero) are usually not the same 937*cda5da8dSAndroid Build Coastguard Worker as significant digits (measured from the most significant digit). 938*cda5da8dSAndroid Build Coastguard Worker 939*cda5da8dSAndroid Build Coastguard Worker Objects that are equal automatically fail. 940*cda5da8dSAndroid Build Coastguard Worker """ 941*cda5da8dSAndroid Build Coastguard Worker if delta is not None and places is not None: 942*cda5da8dSAndroid Build Coastguard Worker raise TypeError("specify delta or places not both") 943*cda5da8dSAndroid Build Coastguard Worker diff = abs(first - second) 944*cda5da8dSAndroid Build Coastguard Worker if delta is not None: 945*cda5da8dSAndroid Build Coastguard Worker if not (first == second) and diff > delta: 946*cda5da8dSAndroid Build Coastguard Worker return 947*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s == %s within %s delta (%s difference)' % ( 948*cda5da8dSAndroid Build Coastguard Worker safe_repr(first), 949*cda5da8dSAndroid Build Coastguard Worker safe_repr(second), 950*cda5da8dSAndroid Build Coastguard Worker safe_repr(delta), 951*cda5da8dSAndroid Build Coastguard Worker safe_repr(diff)) 952*cda5da8dSAndroid Build Coastguard Worker else: 953*cda5da8dSAndroid Build Coastguard Worker if places is None: 954*cda5da8dSAndroid Build Coastguard Worker places = 7 955*cda5da8dSAndroid Build Coastguard Worker if not (first == second) and round(diff, places) != 0: 956*cda5da8dSAndroid Build Coastguard Worker return 957*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s == %s within %r places' % (safe_repr(first), 958*cda5da8dSAndroid Build Coastguard Worker safe_repr(second), 959*cda5da8dSAndroid Build Coastguard Worker places) 960*cda5da8dSAndroid Build Coastguard Worker 961*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, standardMsg) 962*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 963*cda5da8dSAndroid Build Coastguard Worker 964*cda5da8dSAndroid Build Coastguard Worker def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None): 965*cda5da8dSAndroid Build Coastguard Worker """An equality assertion for ordered sequences (like lists and tuples). 966*cda5da8dSAndroid Build Coastguard Worker 967*cda5da8dSAndroid Build Coastguard Worker For the purposes of this function, a valid ordered sequence type is one 968*cda5da8dSAndroid Build Coastguard Worker which can be indexed, has a length, and has an equality operator. 969*cda5da8dSAndroid Build Coastguard Worker 970*cda5da8dSAndroid Build Coastguard Worker Args: 971*cda5da8dSAndroid Build Coastguard Worker seq1: The first sequence to compare. 972*cda5da8dSAndroid Build Coastguard Worker seq2: The second sequence to compare. 973*cda5da8dSAndroid Build Coastguard Worker seq_type: The expected datatype of the sequences, or None if no 974*cda5da8dSAndroid Build Coastguard Worker datatype should be enforced. 975*cda5da8dSAndroid Build Coastguard Worker msg: Optional message to use on failure instead of a list of 976*cda5da8dSAndroid Build Coastguard Worker differences. 977*cda5da8dSAndroid Build Coastguard Worker """ 978*cda5da8dSAndroid Build Coastguard Worker if seq_type is not None: 979*cda5da8dSAndroid Build Coastguard Worker seq_type_name = seq_type.__name__ 980*cda5da8dSAndroid Build Coastguard Worker if not isinstance(seq1, seq_type): 981*cda5da8dSAndroid Build Coastguard Worker raise self.failureException('First sequence is not a %s: %s' 982*cda5da8dSAndroid Build Coastguard Worker % (seq_type_name, safe_repr(seq1))) 983*cda5da8dSAndroid Build Coastguard Worker if not isinstance(seq2, seq_type): 984*cda5da8dSAndroid Build Coastguard Worker raise self.failureException('Second sequence is not a %s: %s' 985*cda5da8dSAndroid Build Coastguard Worker % (seq_type_name, safe_repr(seq2))) 986*cda5da8dSAndroid Build Coastguard Worker else: 987*cda5da8dSAndroid Build Coastguard Worker seq_type_name = "sequence" 988*cda5da8dSAndroid Build Coastguard Worker 989*cda5da8dSAndroid Build Coastguard Worker differing = None 990*cda5da8dSAndroid Build Coastguard Worker try: 991*cda5da8dSAndroid Build Coastguard Worker len1 = len(seq1) 992*cda5da8dSAndroid Build Coastguard Worker except (TypeError, NotImplementedError): 993*cda5da8dSAndroid Build Coastguard Worker differing = 'First %s has no length. Non-sequence?' % ( 994*cda5da8dSAndroid Build Coastguard Worker seq_type_name) 995*cda5da8dSAndroid Build Coastguard Worker 996*cda5da8dSAndroid Build Coastguard Worker if differing is None: 997*cda5da8dSAndroid Build Coastguard Worker try: 998*cda5da8dSAndroid Build Coastguard Worker len2 = len(seq2) 999*cda5da8dSAndroid Build Coastguard Worker except (TypeError, NotImplementedError): 1000*cda5da8dSAndroid Build Coastguard Worker differing = 'Second %s has no length. Non-sequence?' % ( 1001*cda5da8dSAndroid Build Coastguard Worker seq_type_name) 1002*cda5da8dSAndroid Build Coastguard Worker 1003*cda5da8dSAndroid Build Coastguard Worker if differing is None: 1004*cda5da8dSAndroid Build Coastguard Worker if seq1 == seq2: 1005*cda5da8dSAndroid Build Coastguard Worker return 1006*cda5da8dSAndroid Build Coastguard Worker 1007*cda5da8dSAndroid Build Coastguard Worker differing = '%ss differ: %s != %s\n' % ( 1008*cda5da8dSAndroid Build Coastguard Worker (seq_type_name.capitalize(),) + 1009*cda5da8dSAndroid Build Coastguard Worker _common_shorten_repr(seq1, seq2)) 1010*cda5da8dSAndroid Build Coastguard Worker 1011*cda5da8dSAndroid Build Coastguard Worker for i in range(min(len1, len2)): 1012*cda5da8dSAndroid Build Coastguard Worker try: 1013*cda5da8dSAndroid Build Coastguard Worker item1 = seq1[i] 1014*cda5da8dSAndroid Build Coastguard Worker except (TypeError, IndexError, NotImplementedError): 1015*cda5da8dSAndroid Build Coastguard Worker differing += ('\nUnable to index element %d of first %s\n' % 1016*cda5da8dSAndroid Build Coastguard Worker (i, seq_type_name)) 1017*cda5da8dSAndroid Build Coastguard Worker break 1018*cda5da8dSAndroid Build Coastguard Worker 1019*cda5da8dSAndroid Build Coastguard Worker try: 1020*cda5da8dSAndroid Build Coastguard Worker item2 = seq2[i] 1021*cda5da8dSAndroid Build Coastguard Worker except (TypeError, IndexError, NotImplementedError): 1022*cda5da8dSAndroid Build Coastguard Worker differing += ('\nUnable to index element %d of second %s\n' % 1023*cda5da8dSAndroid Build Coastguard Worker (i, seq_type_name)) 1024*cda5da8dSAndroid Build Coastguard Worker break 1025*cda5da8dSAndroid Build Coastguard Worker 1026*cda5da8dSAndroid Build Coastguard Worker if item1 != item2: 1027*cda5da8dSAndroid Build Coastguard Worker differing += ('\nFirst differing element %d:\n%s\n%s\n' % 1028*cda5da8dSAndroid Build Coastguard Worker ((i,) + _common_shorten_repr(item1, item2))) 1029*cda5da8dSAndroid Build Coastguard Worker break 1030*cda5da8dSAndroid Build Coastguard Worker else: 1031*cda5da8dSAndroid Build Coastguard Worker if (len1 == len2 and seq_type is None and 1032*cda5da8dSAndroid Build Coastguard Worker type(seq1) != type(seq2)): 1033*cda5da8dSAndroid Build Coastguard Worker # The sequences are the same, but have differing types. 1034*cda5da8dSAndroid Build Coastguard Worker return 1035*cda5da8dSAndroid Build Coastguard Worker 1036*cda5da8dSAndroid Build Coastguard Worker if len1 > len2: 1037*cda5da8dSAndroid Build Coastguard Worker differing += ('\nFirst %s contains %d additional ' 1038*cda5da8dSAndroid Build Coastguard Worker 'elements.\n' % (seq_type_name, len1 - len2)) 1039*cda5da8dSAndroid Build Coastguard Worker try: 1040*cda5da8dSAndroid Build Coastguard Worker differing += ('First extra element %d:\n%s\n' % 1041*cda5da8dSAndroid Build Coastguard Worker (len2, safe_repr(seq1[len2]))) 1042*cda5da8dSAndroid Build Coastguard Worker except (TypeError, IndexError, NotImplementedError): 1043*cda5da8dSAndroid Build Coastguard Worker differing += ('Unable to index element %d ' 1044*cda5da8dSAndroid Build Coastguard Worker 'of first %s\n' % (len2, seq_type_name)) 1045*cda5da8dSAndroid Build Coastguard Worker elif len1 < len2: 1046*cda5da8dSAndroid Build Coastguard Worker differing += ('\nSecond %s contains %d additional ' 1047*cda5da8dSAndroid Build Coastguard Worker 'elements.\n' % (seq_type_name, len2 - len1)) 1048*cda5da8dSAndroid Build Coastguard Worker try: 1049*cda5da8dSAndroid Build Coastguard Worker differing += ('First extra element %d:\n%s\n' % 1050*cda5da8dSAndroid Build Coastguard Worker (len1, safe_repr(seq2[len1]))) 1051*cda5da8dSAndroid Build Coastguard Worker except (TypeError, IndexError, NotImplementedError): 1052*cda5da8dSAndroid Build Coastguard Worker differing += ('Unable to index element %d ' 1053*cda5da8dSAndroid Build Coastguard Worker 'of second %s\n' % (len1, seq_type_name)) 1054*cda5da8dSAndroid Build Coastguard Worker standardMsg = differing 1055*cda5da8dSAndroid Build Coastguard Worker diffMsg = '\n' + '\n'.join( 1056*cda5da8dSAndroid Build Coastguard Worker difflib.ndiff(pprint.pformat(seq1).splitlines(), 1057*cda5da8dSAndroid Build Coastguard Worker pprint.pformat(seq2).splitlines())) 1058*cda5da8dSAndroid Build Coastguard Worker 1059*cda5da8dSAndroid Build Coastguard Worker standardMsg = self._truncateMessage(standardMsg, diffMsg) 1060*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, standardMsg) 1061*cda5da8dSAndroid Build Coastguard Worker self.fail(msg) 1062*cda5da8dSAndroid Build Coastguard Worker 1063*cda5da8dSAndroid Build Coastguard Worker def _truncateMessage(self, message, diff): 1064*cda5da8dSAndroid Build Coastguard Worker max_diff = self.maxDiff 1065*cda5da8dSAndroid Build Coastguard Worker if max_diff is None or len(diff) <= max_diff: 1066*cda5da8dSAndroid Build Coastguard Worker return message + diff 1067*cda5da8dSAndroid Build Coastguard Worker return message + (DIFF_OMITTED % len(diff)) 1068*cda5da8dSAndroid Build Coastguard Worker 1069*cda5da8dSAndroid Build Coastguard Worker def assertListEqual(self, list1, list2, msg=None): 1070*cda5da8dSAndroid Build Coastguard Worker """A list-specific equality assertion. 1071*cda5da8dSAndroid Build Coastguard Worker 1072*cda5da8dSAndroid Build Coastguard Worker Args: 1073*cda5da8dSAndroid Build Coastguard Worker list1: The first list to compare. 1074*cda5da8dSAndroid Build Coastguard Worker list2: The second list to compare. 1075*cda5da8dSAndroid Build Coastguard Worker msg: Optional message to use on failure instead of a list of 1076*cda5da8dSAndroid Build Coastguard Worker differences. 1077*cda5da8dSAndroid Build Coastguard Worker 1078*cda5da8dSAndroid Build Coastguard Worker """ 1079*cda5da8dSAndroid Build Coastguard Worker self.assertSequenceEqual(list1, list2, msg, seq_type=list) 1080*cda5da8dSAndroid Build Coastguard Worker 1081*cda5da8dSAndroid Build Coastguard Worker def assertTupleEqual(self, tuple1, tuple2, msg=None): 1082*cda5da8dSAndroid Build Coastguard Worker """A tuple-specific equality assertion. 1083*cda5da8dSAndroid Build Coastguard Worker 1084*cda5da8dSAndroid Build Coastguard Worker Args: 1085*cda5da8dSAndroid Build Coastguard Worker tuple1: The first tuple to compare. 1086*cda5da8dSAndroid Build Coastguard Worker tuple2: The second tuple to compare. 1087*cda5da8dSAndroid Build Coastguard Worker msg: Optional message to use on failure instead of a list of 1088*cda5da8dSAndroid Build Coastguard Worker differences. 1089*cda5da8dSAndroid Build Coastguard Worker """ 1090*cda5da8dSAndroid Build Coastguard Worker self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple) 1091*cda5da8dSAndroid Build Coastguard Worker 1092*cda5da8dSAndroid Build Coastguard Worker def assertSetEqual(self, set1, set2, msg=None): 1093*cda5da8dSAndroid Build Coastguard Worker """A set-specific equality assertion. 1094*cda5da8dSAndroid Build Coastguard Worker 1095*cda5da8dSAndroid Build Coastguard Worker Args: 1096*cda5da8dSAndroid Build Coastguard Worker set1: The first set to compare. 1097*cda5da8dSAndroid Build Coastguard Worker set2: The second set to compare. 1098*cda5da8dSAndroid Build Coastguard Worker msg: Optional message to use on failure instead of a list of 1099*cda5da8dSAndroid Build Coastguard Worker differences. 1100*cda5da8dSAndroid Build Coastguard Worker 1101*cda5da8dSAndroid Build Coastguard Worker assertSetEqual uses ducktyping to support different types of sets, and 1102*cda5da8dSAndroid Build Coastguard Worker is optimized for sets specifically (parameters must support a 1103*cda5da8dSAndroid Build Coastguard Worker difference method). 1104*cda5da8dSAndroid Build Coastguard Worker """ 1105*cda5da8dSAndroid Build Coastguard Worker try: 1106*cda5da8dSAndroid Build Coastguard Worker difference1 = set1.difference(set2) 1107*cda5da8dSAndroid Build Coastguard Worker except TypeError as e: 1108*cda5da8dSAndroid Build Coastguard Worker self.fail('invalid type when attempting set difference: %s' % e) 1109*cda5da8dSAndroid Build Coastguard Worker except AttributeError as e: 1110*cda5da8dSAndroid Build Coastguard Worker self.fail('first argument does not support set difference: %s' % e) 1111*cda5da8dSAndroid Build Coastguard Worker 1112*cda5da8dSAndroid Build Coastguard Worker try: 1113*cda5da8dSAndroid Build Coastguard Worker difference2 = set2.difference(set1) 1114*cda5da8dSAndroid Build Coastguard Worker except TypeError as e: 1115*cda5da8dSAndroid Build Coastguard Worker self.fail('invalid type when attempting set difference: %s' % e) 1116*cda5da8dSAndroid Build Coastguard Worker except AttributeError as e: 1117*cda5da8dSAndroid Build Coastguard Worker self.fail('second argument does not support set difference: %s' % e) 1118*cda5da8dSAndroid Build Coastguard Worker 1119*cda5da8dSAndroid Build Coastguard Worker if not (difference1 or difference2): 1120*cda5da8dSAndroid Build Coastguard Worker return 1121*cda5da8dSAndroid Build Coastguard Worker 1122*cda5da8dSAndroid Build Coastguard Worker lines = [] 1123*cda5da8dSAndroid Build Coastguard Worker if difference1: 1124*cda5da8dSAndroid Build Coastguard Worker lines.append('Items in the first set but not the second:') 1125*cda5da8dSAndroid Build Coastguard Worker for item in difference1: 1126*cda5da8dSAndroid Build Coastguard Worker lines.append(repr(item)) 1127*cda5da8dSAndroid Build Coastguard Worker if difference2: 1128*cda5da8dSAndroid Build Coastguard Worker lines.append('Items in the second set but not the first:') 1129*cda5da8dSAndroid Build Coastguard Worker for item in difference2: 1130*cda5da8dSAndroid Build Coastguard Worker lines.append(repr(item)) 1131*cda5da8dSAndroid Build Coastguard Worker 1132*cda5da8dSAndroid Build Coastguard Worker standardMsg = '\n'.join(lines) 1133*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1134*cda5da8dSAndroid Build Coastguard Worker 1135*cda5da8dSAndroid Build Coastguard Worker def assertIn(self, member, container, msg=None): 1136*cda5da8dSAndroid Build Coastguard Worker """Just like self.assertTrue(a in b), but with a nicer default message.""" 1137*cda5da8dSAndroid Build Coastguard Worker if member not in container: 1138*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s not found in %s' % (safe_repr(member), 1139*cda5da8dSAndroid Build Coastguard Worker safe_repr(container)) 1140*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1141*cda5da8dSAndroid Build Coastguard Worker 1142*cda5da8dSAndroid Build Coastguard Worker def assertNotIn(self, member, container, msg=None): 1143*cda5da8dSAndroid Build Coastguard Worker """Just like self.assertTrue(a not in b), but with a nicer default message.""" 1144*cda5da8dSAndroid Build Coastguard Worker if member in container: 1145*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s unexpectedly found in %s' % (safe_repr(member), 1146*cda5da8dSAndroid Build Coastguard Worker safe_repr(container)) 1147*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1148*cda5da8dSAndroid Build Coastguard Worker 1149*cda5da8dSAndroid Build Coastguard Worker def assertIs(self, expr1, expr2, msg=None): 1150*cda5da8dSAndroid Build Coastguard Worker """Just like self.assertTrue(a is b), but with a nicer default message.""" 1151*cda5da8dSAndroid Build Coastguard Worker if expr1 is not expr2: 1152*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s is not %s' % (safe_repr(expr1), 1153*cda5da8dSAndroid Build Coastguard Worker safe_repr(expr2)) 1154*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1155*cda5da8dSAndroid Build Coastguard Worker 1156*cda5da8dSAndroid Build Coastguard Worker def assertIsNot(self, expr1, expr2, msg=None): 1157*cda5da8dSAndroid Build Coastguard Worker """Just like self.assertTrue(a is not b), but with a nicer default message.""" 1158*cda5da8dSAndroid Build Coastguard Worker if expr1 is expr2: 1159*cda5da8dSAndroid Build Coastguard Worker standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),) 1160*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1161*cda5da8dSAndroid Build Coastguard Worker 1162*cda5da8dSAndroid Build Coastguard Worker def assertDictEqual(self, d1, d2, msg=None): 1163*cda5da8dSAndroid Build Coastguard Worker self.assertIsInstance(d1, dict, 'First argument is not a dictionary') 1164*cda5da8dSAndroid Build Coastguard Worker self.assertIsInstance(d2, dict, 'Second argument is not a dictionary') 1165*cda5da8dSAndroid Build Coastguard Worker 1166*cda5da8dSAndroid Build Coastguard Worker if d1 != d2: 1167*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s != %s' % _common_shorten_repr(d1, d2) 1168*cda5da8dSAndroid Build Coastguard Worker diff = ('\n' + '\n'.join(difflib.ndiff( 1169*cda5da8dSAndroid Build Coastguard Worker pprint.pformat(d1).splitlines(), 1170*cda5da8dSAndroid Build Coastguard Worker pprint.pformat(d2).splitlines()))) 1171*cda5da8dSAndroid Build Coastguard Worker standardMsg = self._truncateMessage(standardMsg, diff) 1172*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1173*cda5da8dSAndroid Build Coastguard Worker 1174*cda5da8dSAndroid Build Coastguard Worker def assertDictContainsSubset(self, subset, dictionary, msg=None): 1175*cda5da8dSAndroid Build Coastguard Worker """Checks whether dictionary is a superset of subset.""" 1176*cda5da8dSAndroid Build Coastguard Worker warnings.warn('assertDictContainsSubset is deprecated', 1177*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning) 1178*cda5da8dSAndroid Build Coastguard Worker missing = [] 1179*cda5da8dSAndroid Build Coastguard Worker mismatched = [] 1180*cda5da8dSAndroid Build Coastguard Worker for key, value in subset.items(): 1181*cda5da8dSAndroid Build Coastguard Worker if key not in dictionary: 1182*cda5da8dSAndroid Build Coastguard Worker missing.append(key) 1183*cda5da8dSAndroid Build Coastguard Worker elif value != dictionary[key]: 1184*cda5da8dSAndroid Build Coastguard Worker mismatched.append('%s, expected: %s, actual: %s' % 1185*cda5da8dSAndroid Build Coastguard Worker (safe_repr(key), safe_repr(value), 1186*cda5da8dSAndroid Build Coastguard Worker safe_repr(dictionary[key]))) 1187*cda5da8dSAndroid Build Coastguard Worker 1188*cda5da8dSAndroid Build Coastguard Worker if not (missing or mismatched): 1189*cda5da8dSAndroid Build Coastguard Worker return 1190*cda5da8dSAndroid Build Coastguard Worker 1191*cda5da8dSAndroid Build Coastguard Worker standardMsg = '' 1192*cda5da8dSAndroid Build Coastguard Worker if missing: 1193*cda5da8dSAndroid Build Coastguard Worker standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in 1194*cda5da8dSAndroid Build Coastguard Worker missing) 1195*cda5da8dSAndroid Build Coastguard Worker if mismatched: 1196*cda5da8dSAndroid Build Coastguard Worker if standardMsg: 1197*cda5da8dSAndroid Build Coastguard Worker standardMsg += '; ' 1198*cda5da8dSAndroid Build Coastguard Worker standardMsg += 'Mismatched values: %s' % ','.join(mismatched) 1199*cda5da8dSAndroid Build Coastguard Worker 1200*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1201*cda5da8dSAndroid Build Coastguard Worker 1202*cda5da8dSAndroid Build Coastguard Worker 1203*cda5da8dSAndroid Build Coastguard Worker def assertCountEqual(self, first, second, msg=None): 1204*cda5da8dSAndroid Build Coastguard Worker """Asserts that two iterables have the same elements, the same number of 1205*cda5da8dSAndroid Build Coastguard Worker times, without regard to order. 1206*cda5da8dSAndroid Build Coastguard Worker 1207*cda5da8dSAndroid Build Coastguard Worker self.assertEqual(Counter(list(first)), 1208*cda5da8dSAndroid Build Coastguard Worker Counter(list(second))) 1209*cda5da8dSAndroid Build Coastguard Worker 1210*cda5da8dSAndroid Build Coastguard Worker Example: 1211*cda5da8dSAndroid Build Coastguard Worker - [0, 1, 1] and [1, 0, 1] compare equal. 1212*cda5da8dSAndroid Build Coastguard Worker - [0, 0, 1] and [0, 1] compare unequal. 1213*cda5da8dSAndroid Build Coastguard Worker 1214*cda5da8dSAndroid Build Coastguard Worker """ 1215*cda5da8dSAndroid Build Coastguard Worker first_seq, second_seq = list(first), list(second) 1216*cda5da8dSAndroid Build Coastguard Worker try: 1217*cda5da8dSAndroid Build Coastguard Worker first = collections.Counter(first_seq) 1218*cda5da8dSAndroid Build Coastguard Worker second = collections.Counter(second_seq) 1219*cda5da8dSAndroid Build Coastguard Worker except TypeError: 1220*cda5da8dSAndroid Build Coastguard Worker # Handle case with unhashable elements 1221*cda5da8dSAndroid Build Coastguard Worker differences = _count_diff_all_purpose(first_seq, second_seq) 1222*cda5da8dSAndroid Build Coastguard Worker else: 1223*cda5da8dSAndroid Build Coastguard Worker if first == second: 1224*cda5da8dSAndroid Build Coastguard Worker return 1225*cda5da8dSAndroid Build Coastguard Worker differences = _count_diff_hashable(first_seq, second_seq) 1226*cda5da8dSAndroid Build Coastguard Worker 1227*cda5da8dSAndroid Build Coastguard Worker if differences: 1228*cda5da8dSAndroid Build Coastguard Worker standardMsg = 'Element counts were not equal:\n' 1229*cda5da8dSAndroid Build Coastguard Worker lines = ['First has %d, Second has %d: %r' % diff for diff in differences] 1230*cda5da8dSAndroid Build Coastguard Worker diffMsg = '\n'.join(lines) 1231*cda5da8dSAndroid Build Coastguard Worker standardMsg = self._truncateMessage(standardMsg, diffMsg) 1232*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, standardMsg) 1233*cda5da8dSAndroid Build Coastguard Worker self.fail(msg) 1234*cda5da8dSAndroid Build Coastguard Worker 1235*cda5da8dSAndroid Build Coastguard Worker def assertMultiLineEqual(self, first, second, msg=None): 1236*cda5da8dSAndroid Build Coastguard Worker """Assert that two multi-line strings are equal.""" 1237*cda5da8dSAndroid Build Coastguard Worker self.assertIsInstance(first, str, 'First argument is not a string') 1238*cda5da8dSAndroid Build Coastguard Worker self.assertIsInstance(second, str, 'Second argument is not a string') 1239*cda5da8dSAndroid Build Coastguard Worker 1240*cda5da8dSAndroid Build Coastguard Worker if first != second: 1241*cda5da8dSAndroid Build Coastguard Worker # don't use difflib if the strings are too long 1242*cda5da8dSAndroid Build Coastguard Worker if (len(first) > self._diffThreshold or 1243*cda5da8dSAndroid Build Coastguard Worker len(second) > self._diffThreshold): 1244*cda5da8dSAndroid Build Coastguard Worker self._baseAssertEqual(first, second, msg) 1245*cda5da8dSAndroid Build Coastguard Worker firstlines = first.splitlines(keepends=True) 1246*cda5da8dSAndroid Build Coastguard Worker secondlines = second.splitlines(keepends=True) 1247*cda5da8dSAndroid Build Coastguard Worker if len(firstlines) == 1 and first.strip('\r\n') == first: 1248*cda5da8dSAndroid Build Coastguard Worker firstlines = [first + '\n'] 1249*cda5da8dSAndroid Build Coastguard Worker secondlines = [second + '\n'] 1250*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s != %s' % _common_shorten_repr(first, second) 1251*cda5da8dSAndroid Build Coastguard Worker diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines)) 1252*cda5da8dSAndroid Build Coastguard Worker standardMsg = self._truncateMessage(standardMsg, diff) 1253*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1254*cda5da8dSAndroid Build Coastguard Worker 1255*cda5da8dSAndroid Build Coastguard Worker def assertLess(self, a, b, msg=None): 1256*cda5da8dSAndroid Build Coastguard Worker """Just like self.assertTrue(a < b), but with a nicer default message.""" 1257*cda5da8dSAndroid Build Coastguard Worker if not a < b: 1258*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b)) 1259*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1260*cda5da8dSAndroid Build Coastguard Worker 1261*cda5da8dSAndroid Build Coastguard Worker def assertLessEqual(self, a, b, msg=None): 1262*cda5da8dSAndroid Build Coastguard Worker """Just like self.assertTrue(a <= b), but with a nicer default message.""" 1263*cda5da8dSAndroid Build Coastguard Worker if not a <= b: 1264*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b)) 1265*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1266*cda5da8dSAndroid Build Coastguard Worker 1267*cda5da8dSAndroid Build Coastguard Worker def assertGreater(self, a, b, msg=None): 1268*cda5da8dSAndroid Build Coastguard Worker """Just like self.assertTrue(a > b), but with a nicer default message.""" 1269*cda5da8dSAndroid Build Coastguard Worker if not a > b: 1270*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b)) 1271*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1272*cda5da8dSAndroid Build Coastguard Worker 1273*cda5da8dSAndroid Build Coastguard Worker def assertGreaterEqual(self, a, b, msg=None): 1274*cda5da8dSAndroid Build Coastguard Worker """Just like self.assertTrue(a >= b), but with a nicer default message.""" 1275*cda5da8dSAndroid Build Coastguard Worker if not a >= b: 1276*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b)) 1277*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1278*cda5da8dSAndroid Build Coastguard Worker 1279*cda5da8dSAndroid Build Coastguard Worker def assertIsNone(self, obj, msg=None): 1280*cda5da8dSAndroid Build Coastguard Worker """Same as self.assertTrue(obj is None), with a nicer default message.""" 1281*cda5da8dSAndroid Build Coastguard Worker if obj is not None: 1282*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s is not None' % (safe_repr(obj),) 1283*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1284*cda5da8dSAndroid Build Coastguard Worker 1285*cda5da8dSAndroid Build Coastguard Worker def assertIsNotNone(self, obj, msg=None): 1286*cda5da8dSAndroid Build Coastguard Worker """Included for symmetry with assertIsNone.""" 1287*cda5da8dSAndroid Build Coastguard Worker if obj is None: 1288*cda5da8dSAndroid Build Coastguard Worker standardMsg = 'unexpectedly None' 1289*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1290*cda5da8dSAndroid Build Coastguard Worker 1291*cda5da8dSAndroid Build Coastguard Worker def assertIsInstance(self, obj, cls, msg=None): 1292*cda5da8dSAndroid Build Coastguard Worker """Same as self.assertTrue(isinstance(obj, cls)), with a nicer 1293*cda5da8dSAndroid Build Coastguard Worker default message.""" 1294*cda5da8dSAndroid Build Coastguard Worker if not isinstance(obj, cls): 1295*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls) 1296*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1297*cda5da8dSAndroid Build Coastguard Worker 1298*cda5da8dSAndroid Build Coastguard Worker def assertNotIsInstance(self, obj, cls, msg=None): 1299*cda5da8dSAndroid Build Coastguard Worker """Included for symmetry with assertIsInstance.""" 1300*cda5da8dSAndroid Build Coastguard Worker if isinstance(obj, cls): 1301*cda5da8dSAndroid Build Coastguard Worker standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls) 1302*cda5da8dSAndroid Build Coastguard Worker self.fail(self._formatMessage(msg, standardMsg)) 1303*cda5da8dSAndroid Build Coastguard Worker 1304*cda5da8dSAndroid Build Coastguard Worker def assertRaisesRegex(self, expected_exception, expected_regex, 1305*cda5da8dSAndroid Build Coastguard Worker *args, **kwargs): 1306*cda5da8dSAndroid Build Coastguard Worker """Asserts that the message in a raised exception matches a regex. 1307*cda5da8dSAndroid Build Coastguard Worker 1308*cda5da8dSAndroid Build Coastguard Worker Args: 1309*cda5da8dSAndroid Build Coastguard Worker expected_exception: Exception class expected to be raised. 1310*cda5da8dSAndroid Build Coastguard Worker expected_regex: Regex (re.Pattern object or string) expected 1311*cda5da8dSAndroid Build Coastguard Worker to be found in error message. 1312*cda5da8dSAndroid Build Coastguard Worker args: Function to be called and extra positional args. 1313*cda5da8dSAndroid Build Coastguard Worker kwargs: Extra kwargs. 1314*cda5da8dSAndroid Build Coastguard Worker msg: Optional message used in case of failure. Can only be used 1315*cda5da8dSAndroid Build Coastguard Worker when assertRaisesRegex is used as a context manager. 1316*cda5da8dSAndroid Build Coastguard Worker """ 1317*cda5da8dSAndroid Build Coastguard Worker context = _AssertRaisesContext(expected_exception, self, expected_regex) 1318*cda5da8dSAndroid Build Coastguard Worker return context.handle('assertRaisesRegex', args, kwargs) 1319*cda5da8dSAndroid Build Coastguard Worker 1320*cda5da8dSAndroid Build Coastguard Worker def assertWarnsRegex(self, expected_warning, expected_regex, 1321*cda5da8dSAndroid Build Coastguard Worker *args, **kwargs): 1322*cda5da8dSAndroid Build Coastguard Worker """Asserts that the message in a triggered warning matches a regexp. 1323*cda5da8dSAndroid Build Coastguard Worker Basic functioning is similar to assertWarns() with the addition 1324*cda5da8dSAndroid Build Coastguard Worker that only warnings whose messages also match the regular expression 1325*cda5da8dSAndroid Build Coastguard Worker are considered successful matches. 1326*cda5da8dSAndroid Build Coastguard Worker 1327*cda5da8dSAndroid Build Coastguard Worker Args: 1328*cda5da8dSAndroid Build Coastguard Worker expected_warning: Warning class expected to be triggered. 1329*cda5da8dSAndroid Build Coastguard Worker expected_regex: Regex (re.Pattern object or string) expected 1330*cda5da8dSAndroid Build Coastguard Worker to be found in error message. 1331*cda5da8dSAndroid Build Coastguard Worker args: Function to be called and extra positional args. 1332*cda5da8dSAndroid Build Coastguard Worker kwargs: Extra kwargs. 1333*cda5da8dSAndroid Build Coastguard Worker msg: Optional message used in case of failure. Can only be used 1334*cda5da8dSAndroid Build Coastguard Worker when assertWarnsRegex is used as a context manager. 1335*cda5da8dSAndroid Build Coastguard Worker """ 1336*cda5da8dSAndroid Build Coastguard Worker context = _AssertWarnsContext(expected_warning, self, expected_regex) 1337*cda5da8dSAndroid Build Coastguard Worker return context.handle('assertWarnsRegex', args, kwargs) 1338*cda5da8dSAndroid Build Coastguard Worker 1339*cda5da8dSAndroid Build Coastguard Worker def assertRegex(self, text, expected_regex, msg=None): 1340*cda5da8dSAndroid Build Coastguard Worker """Fail the test unless the text matches the regular expression.""" 1341*cda5da8dSAndroid Build Coastguard Worker if isinstance(expected_regex, (str, bytes)): 1342*cda5da8dSAndroid Build Coastguard Worker assert expected_regex, "expected_regex must not be empty." 1343*cda5da8dSAndroid Build Coastguard Worker expected_regex = re.compile(expected_regex) 1344*cda5da8dSAndroid Build Coastguard Worker if not expected_regex.search(text): 1345*cda5da8dSAndroid Build Coastguard Worker standardMsg = "Regex didn't match: %r not found in %r" % ( 1346*cda5da8dSAndroid Build Coastguard Worker expected_regex.pattern, text) 1347*cda5da8dSAndroid Build Coastguard Worker # _formatMessage ensures the longMessage option is respected 1348*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, standardMsg) 1349*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 1350*cda5da8dSAndroid Build Coastguard Worker 1351*cda5da8dSAndroid Build Coastguard Worker def assertNotRegex(self, text, unexpected_regex, msg=None): 1352*cda5da8dSAndroid Build Coastguard Worker """Fail the test if the text matches the regular expression.""" 1353*cda5da8dSAndroid Build Coastguard Worker if isinstance(unexpected_regex, (str, bytes)): 1354*cda5da8dSAndroid Build Coastguard Worker unexpected_regex = re.compile(unexpected_regex) 1355*cda5da8dSAndroid Build Coastguard Worker match = unexpected_regex.search(text) 1356*cda5da8dSAndroid Build Coastguard Worker if match: 1357*cda5da8dSAndroid Build Coastguard Worker standardMsg = 'Regex matched: %r matches %r in %r' % ( 1358*cda5da8dSAndroid Build Coastguard Worker text[match.start() : match.end()], 1359*cda5da8dSAndroid Build Coastguard Worker unexpected_regex.pattern, 1360*cda5da8dSAndroid Build Coastguard Worker text) 1361*cda5da8dSAndroid Build Coastguard Worker # _formatMessage ensures the longMessage option is respected 1362*cda5da8dSAndroid Build Coastguard Worker msg = self._formatMessage(msg, standardMsg) 1363*cda5da8dSAndroid Build Coastguard Worker raise self.failureException(msg) 1364*cda5da8dSAndroid Build Coastguard Worker 1365*cda5da8dSAndroid Build Coastguard Worker 1366*cda5da8dSAndroid Build Coastguard Worker def _deprecate(original_func): 1367*cda5da8dSAndroid Build Coastguard Worker def deprecated_func(*args, **kwargs): 1368*cda5da8dSAndroid Build Coastguard Worker warnings.warn( 1369*cda5da8dSAndroid Build Coastguard Worker 'Please use {0} instead.'.format(original_func.__name__), 1370*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, 2) 1371*cda5da8dSAndroid Build Coastguard Worker return original_func(*args, **kwargs) 1372*cda5da8dSAndroid Build Coastguard Worker return deprecated_func 1373*cda5da8dSAndroid Build Coastguard Worker 1374*cda5da8dSAndroid Build Coastguard Worker # see #9424 1375*cda5da8dSAndroid Build Coastguard Worker failUnlessEqual = assertEquals = _deprecate(assertEqual) 1376*cda5da8dSAndroid Build Coastguard Worker failIfEqual = assertNotEquals = _deprecate(assertNotEqual) 1377*cda5da8dSAndroid Build Coastguard Worker failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual) 1378*cda5da8dSAndroid Build Coastguard Worker failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual) 1379*cda5da8dSAndroid Build Coastguard Worker failUnless = assert_ = _deprecate(assertTrue) 1380*cda5da8dSAndroid Build Coastguard Worker failUnlessRaises = _deprecate(assertRaises) 1381*cda5da8dSAndroid Build Coastguard Worker failIf = _deprecate(assertFalse) 1382*cda5da8dSAndroid Build Coastguard Worker assertRaisesRegexp = _deprecate(assertRaisesRegex) 1383*cda5da8dSAndroid Build Coastguard Worker assertRegexpMatches = _deprecate(assertRegex) 1384*cda5da8dSAndroid Build Coastguard Worker assertNotRegexpMatches = _deprecate(assertNotRegex) 1385*cda5da8dSAndroid Build Coastguard Worker 1386*cda5da8dSAndroid Build Coastguard Worker 1387*cda5da8dSAndroid Build Coastguard Worker 1388*cda5da8dSAndroid Build Coastguard Workerclass FunctionTestCase(TestCase): 1389*cda5da8dSAndroid Build Coastguard Worker """A test case that wraps a test function. 1390*cda5da8dSAndroid Build Coastguard Worker 1391*cda5da8dSAndroid Build Coastguard Worker This is useful for slipping pre-existing test functions into the 1392*cda5da8dSAndroid Build Coastguard Worker unittest framework. Optionally, set-up and tidy-up functions can be 1393*cda5da8dSAndroid Build Coastguard Worker supplied. As with TestCase, the tidy-up ('tearDown') function will 1394*cda5da8dSAndroid Build Coastguard Worker always be called if the set-up ('setUp') function ran successfully. 1395*cda5da8dSAndroid Build Coastguard Worker """ 1396*cda5da8dSAndroid Build Coastguard Worker 1397*cda5da8dSAndroid Build Coastguard Worker def __init__(self, testFunc, setUp=None, tearDown=None, description=None): 1398*cda5da8dSAndroid Build Coastguard Worker super(FunctionTestCase, self).__init__() 1399*cda5da8dSAndroid Build Coastguard Worker self._setUpFunc = setUp 1400*cda5da8dSAndroid Build Coastguard Worker self._tearDownFunc = tearDown 1401*cda5da8dSAndroid Build Coastguard Worker self._testFunc = testFunc 1402*cda5da8dSAndroid Build Coastguard Worker self._description = description 1403*cda5da8dSAndroid Build Coastguard Worker 1404*cda5da8dSAndroid Build Coastguard Worker def setUp(self): 1405*cda5da8dSAndroid Build Coastguard Worker if self._setUpFunc is not None: 1406*cda5da8dSAndroid Build Coastguard Worker self._setUpFunc() 1407*cda5da8dSAndroid Build Coastguard Worker 1408*cda5da8dSAndroid Build Coastguard Worker def tearDown(self): 1409*cda5da8dSAndroid Build Coastguard Worker if self._tearDownFunc is not None: 1410*cda5da8dSAndroid Build Coastguard Worker self._tearDownFunc() 1411*cda5da8dSAndroid Build Coastguard Worker 1412*cda5da8dSAndroid Build Coastguard Worker def runTest(self): 1413*cda5da8dSAndroid Build Coastguard Worker self._testFunc() 1414*cda5da8dSAndroid Build Coastguard Worker 1415*cda5da8dSAndroid Build Coastguard Worker def id(self): 1416*cda5da8dSAndroid Build Coastguard Worker return self._testFunc.__name__ 1417*cda5da8dSAndroid Build Coastguard Worker 1418*cda5da8dSAndroid Build Coastguard Worker def __eq__(self, other): 1419*cda5da8dSAndroid Build Coastguard Worker if not isinstance(other, self.__class__): 1420*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 1421*cda5da8dSAndroid Build Coastguard Worker 1422*cda5da8dSAndroid Build Coastguard Worker return self._setUpFunc == other._setUpFunc and \ 1423*cda5da8dSAndroid Build Coastguard Worker self._tearDownFunc == other._tearDownFunc and \ 1424*cda5da8dSAndroid Build Coastguard Worker self._testFunc == other._testFunc and \ 1425*cda5da8dSAndroid Build Coastguard Worker self._description == other._description 1426*cda5da8dSAndroid Build Coastguard Worker 1427*cda5da8dSAndroid Build Coastguard Worker def __hash__(self): 1428*cda5da8dSAndroid Build Coastguard Worker return hash((type(self), self._setUpFunc, self._tearDownFunc, 1429*cda5da8dSAndroid Build Coastguard Worker self._testFunc, self._description)) 1430*cda5da8dSAndroid Build Coastguard Worker 1431*cda5da8dSAndroid Build Coastguard Worker def __str__(self): 1432*cda5da8dSAndroid Build Coastguard Worker return "%s (%s)" % (strclass(self.__class__), 1433*cda5da8dSAndroid Build Coastguard Worker self._testFunc.__name__) 1434*cda5da8dSAndroid Build Coastguard Worker 1435*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 1436*cda5da8dSAndroid Build Coastguard Worker return "<%s tec=%s>" % (strclass(self.__class__), 1437*cda5da8dSAndroid Build Coastguard Worker self._testFunc) 1438*cda5da8dSAndroid Build Coastguard Worker 1439*cda5da8dSAndroid Build Coastguard Worker def shortDescription(self): 1440*cda5da8dSAndroid Build Coastguard Worker if self._description is not None: 1441*cda5da8dSAndroid Build Coastguard Worker return self._description 1442*cda5da8dSAndroid Build Coastguard Worker doc = self._testFunc.__doc__ 1443*cda5da8dSAndroid Build Coastguard Worker return doc and doc.split("\n")[0].strip() or None 1444*cda5da8dSAndroid Build Coastguard Worker 1445*cda5da8dSAndroid Build Coastguard Worker 1446*cda5da8dSAndroid Build Coastguard Workerclass _SubTest(TestCase): 1447*cda5da8dSAndroid Build Coastguard Worker 1448*cda5da8dSAndroid Build Coastguard Worker def __init__(self, test_case, message, params): 1449*cda5da8dSAndroid Build Coastguard Worker super().__init__() 1450*cda5da8dSAndroid Build Coastguard Worker self._message = message 1451*cda5da8dSAndroid Build Coastguard Worker self.test_case = test_case 1452*cda5da8dSAndroid Build Coastguard Worker self.params = params 1453*cda5da8dSAndroid Build Coastguard Worker self.failureException = test_case.failureException 1454*cda5da8dSAndroid Build Coastguard Worker 1455*cda5da8dSAndroid Build Coastguard Worker def runTest(self): 1456*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError("subtests cannot be run directly") 1457*cda5da8dSAndroid Build Coastguard Worker 1458*cda5da8dSAndroid Build Coastguard Worker def _subDescription(self): 1459*cda5da8dSAndroid Build Coastguard Worker parts = [] 1460*cda5da8dSAndroid Build Coastguard Worker if self._message is not _subtest_msg_sentinel: 1461*cda5da8dSAndroid Build Coastguard Worker parts.append("[{}]".format(self._message)) 1462*cda5da8dSAndroid Build Coastguard Worker if self.params: 1463*cda5da8dSAndroid Build Coastguard Worker params_desc = ', '.join( 1464*cda5da8dSAndroid Build Coastguard Worker "{}={!r}".format(k, v) 1465*cda5da8dSAndroid Build Coastguard Worker for (k, v) in self.params.items()) 1466*cda5da8dSAndroid Build Coastguard Worker parts.append("({})".format(params_desc)) 1467*cda5da8dSAndroid Build Coastguard Worker return " ".join(parts) or '(<subtest>)' 1468*cda5da8dSAndroid Build Coastguard Worker 1469*cda5da8dSAndroid Build Coastguard Worker def id(self): 1470*cda5da8dSAndroid Build Coastguard Worker return "{} {}".format(self.test_case.id(), self._subDescription()) 1471*cda5da8dSAndroid Build Coastguard Worker 1472*cda5da8dSAndroid Build Coastguard Worker def shortDescription(self): 1473*cda5da8dSAndroid Build Coastguard Worker """Returns a one-line description of the subtest, or None if no 1474*cda5da8dSAndroid Build Coastguard Worker description has been provided. 1475*cda5da8dSAndroid Build Coastguard Worker """ 1476*cda5da8dSAndroid Build Coastguard Worker return self.test_case.shortDescription() 1477*cda5da8dSAndroid Build Coastguard Worker 1478*cda5da8dSAndroid Build Coastguard Worker def __str__(self): 1479*cda5da8dSAndroid Build Coastguard Worker return "{} {}".format(self.test_case, self._subDescription()) 1480