xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/unittest/case.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
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