1*3ac0a46fSAndroid Build Coastguard Worker# mock.py 2*3ac0a46fSAndroid Build Coastguard Worker# Test tools for mocking and patching. 3*3ac0a46fSAndroid Build Coastguard Worker# Copyright (C) 2007-2012 Michael Foord & the mock team 4*3ac0a46fSAndroid Build Coastguard Worker# E-mail: fuzzyman AT voidspace DOT org DOT uk 5*3ac0a46fSAndroid Build Coastguard Worker 6*3ac0a46fSAndroid Build Coastguard Worker# mock 1.0 7*3ac0a46fSAndroid Build Coastguard Worker# http://www.voidspace.org.uk/python/mock/ 8*3ac0a46fSAndroid Build Coastguard Worker 9*3ac0a46fSAndroid Build Coastguard Worker# Released subject to the BSD License 10*3ac0a46fSAndroid Build Coastguard Worker# Please see http://www.voidspace.org.uk/python/license.shtml 11*3ac0a46fSAndroid Build Coastguard Worker 12*3ac0a46fSAndroid Build Coastguard Worker# Scripts maintained at http://www.voidspace.org.uk/python/index.shtml 13*3ac0a46fSAndroid Build Coastguard Worker# Comments, suggestions and bug reports welcome. 14*3ac0a46fSAndroid Build Coastguard Worker 15*3ac0a46fSAndroid Build Coastguard Worker 16*3ac0a46fSAndroid Build Coastguard Worker__all__ = ( 17*3ac0a46fSAndroid Build Coastguard Worker 'Mock', 18*3ac0a46fSAndroid Build Coastguard Worker 'MagicMock', 19*3ac0a46fSAndroid Build Coastguard Worker 'patch', 20*3ac0a46fSAndroid Build Coastguard Worker 'sentinel', 21*3ac0a46fSAndroid Build Coastguard Worker 'DEFAULT', 22*3ac0a46fSAndroid Build Coastguard Worker 'ANY', 23*3ac0a46fSAndroid Build Coastguard Worker 'call', 24*3ac0a46fSAndroid Build Coastguard Worker 'create_autospec', 25*3ac0a46fSAndroid Build Coastguard Worker 'FILTER_DIR', 26*3ac0a46fSAndroid Build Coastguard Worker 'NonCallableMock', 27*3ac0a46fSAndroid Build Coastguard Worker 'NonCallableMagicMock', 28*3ac0a46fSAndroid Build Coastguard Worker 'mock_open', 29*3ac0a46fSAndroid Build Coastguard Worker 'PropertyMock', 30*3ac0a46fSAndroid Build Coastguard Worker) 31*3ac0a46fSAndroid Build Coastguard Worker 32*3ac0a46fSAndroid Build Coastguard Worker 33*3ac0a46fSAndroid Build Coastguard Worker__version__ = '1.0.1' 34*3ac0a46fSAndroid Build Coastguard Worker 35*3ac0a46fSAndroid Build Coastguard Worker 36*3ac0a46fSAndroid Build Coastguard Workerimport pprint 37*3ac0a46fSAndroid Build Coastguard Workerimport sys 38*3ac0a46fSAndroid Build Coastguard Worker 39*3ac0a46fSAndroid Build Coastguard Workertry: 40*3ac0a46fSAndroid Build Coastguard Worker import inspect 41*3ac0a46fSAndroid Build Coastguard Workerexcept ImportError: 42*3ac0a46fSAndroid Build Coastguard Worker # for alternative platforms that 43*3ac0a46fSAndroid Build Coastguard Worker # may not have inspect 44*3ac0a46fSAndroid Build Coastguard Worker inspect = None 45*3ac0a46fSAndroid Build Coastguard Worker 46*3ac0a46fSAndroid Build Coastguard Workertry: 47*3ac0a46fSAndroid Build Coastguard Worker from functools import wraps as original_wraps 48*3ac0a46fSAndroid Build Coastguard Workerexcept ImportError: 49*3ac0a46fSAndroid Build Coastguard Worker # Python 2.4 compatibility 50*3ac0a46fSAndroid Build Coastguard Worker def wraps(original): 51*3ac0a46fSAndroid Build Coastguard Worker def inner(f): 52*3ac0a46fSAndroid Build Coastguard Worker f.__name__ = original.__name__ 53*3ac0a46fSAndroid Build Coastguard Worker f.__doc__ = original.__doc__ 54*3ac0a46fSAndroid Build Coastguard Worker f.__module__ = original.__module__ 55*3ac0a46fSAndroid Build Coastguard Worker f.__wrapped__ = original 56*3ac0a46fSAndroid Build Coastguard Worker return f 57*3ac0a46fSAndroid Build Coastguard Worker return inner 58*3ac0a46fSAndroid Build Coastguard Workerelse: 59*3ac0a46fSAndroid Build Coastguard Worker if sys.version_info[:2] >= (3, 3): 60*3ac0a46fSAndroid Build Coastguard Worker wraps = original_wraps 61*3ac0a46fSAndroid Build Coastguard Worker else: 62*3ac0a46fSAndroid Build Coastguard Worker def wraps(func): 63*3ac0a46fSAndroid Build Coastguard Worker def inner(f): 64*3ac0a46fSAndroid Build Coastguard Worker f = original_wraps(func)(f) 65*3ac0a46fSAndroid Build Coastguard Worker f.__wrapped__ = func 66*3ac0a46fSAndroid Build Coastguard Worker return f 67*3ac0a46fSAndroid Build Coastguard Worker return inner 68*3ac0a46fSAndroid Build Coastguard Worker 69*3ac0a46fSAndroid Build Coastguard Workertry: 70*3ac0a46fSAndroid Build Coastguard Worker unicode 71*3ac0a46fSAndroid Build Coastguard Workerexcept NameError: 72*3ac0a46fSAndroid Build Coastguard Worker # Python 3 73*3ac0a46fSAndroid Build Coastguard Worker basestring = unicode = str 74*3ac0a46fSAndroid Build Coastguard Worker 75*3ac0a46fSAndroid Build Coastguard Workertry: 76*3ac0a46fSAndroid Build Coastguard Worker long 77*3ac0a46fSAndroid Build Coastguard Workerexcept NameError: 78*3ac0a46fSAndroid Build Coastguard Worker # Python 3 79*3ac0a46fSAndroid Build Coastguard Worker long = int 80*3ac0a46fSAndroid Build Coastguard Worker 81*3ac0a46fSAndroid Build Coastguard Workertry: 82*3ac0a46fSAndroid Build Coastguard Worker BaseException 83*3ac0a46fSAndroid Build Coastguard Workerexcept NameError: 84*3ac0a46fSAndroid Build Coastguard Worker # Python 2.4 compatibility 85*3ac0a46fSAndroid Build Coastguard Worker BaseException = Exception 86*3ac0a46fSAndroid Build Coastguard Worker 87*3ac0a46fSAndroid Build Coastguard Workertry: 88*3ac0a46fSAndroid Build Coastguard Worker next 89*3ac0a46fSAndroid Build Coastguard Workerexcept NameError: 90*3ac0a46fSAndroid Build Coastguard Worker def next(obj): 91*3ac0a46fSAndroid Build Coastguard Worker return obj.next() 92*3ac0a46fSAndroid Build Coastguard Worker 93*3ac0a46fSAndroid Build Coastguard Worker 94*3ac0a46fSAndroid Build Coastguard WorkerBaseExceptions = (BaseException,) 95*3ac0a46fSAndroid Build Coastguard Workerif 'java' in sys.platform: 96*3ac0a46fSAndroid Build Coastguard Worker # jython 97*3ac0a46fSAndroid Build Coastguard Worker import java 98*3ac0a46fSAndroid Build Coastguard Worker BaseExceptions = (BaseException, java.lang.Throwable) 99*3ac0a46fSAndroid Build Coastguard Worker 100*3ac0a46fSAndroid Build Coastguard Workertry: 101*3ac0a46fSAndroid Build Coastguard Worker _isidentifier = str.isidentifier 102*3ac0a46fSAndroid Build Coastguard Workerexcept AttributeError: 103*3ac0a46fSAndroid Build Coastguard Worker # Python 2.X 104*3ac0a46fSAndroid Build Coastguard Worker import keyword 105*3ac0a46fSAndroid Build Coastguard Worker import re 106*3ac0a46fSAndroid Build Coastguard Worker regex = re.compile(r'^[a-z_][a-z0-9_]*$', re.I) 107*3ac0a46fSAndroid Build Coastguard Worker def _isidentifier(string): 108*3ac0a46fSAndroid Build Coastguard Worker if string in keyword.kwlist: 109*3ac0a46fSAndroid Build Coastguard Worker return False 110*3ac0a46fSAndroid Build Coastguard Worker return regex.match(string) 111*3ac0a46fSAndroid Build Coastguard Worker 112*3ac0a46fSAndroid Build Coastguard Worker 113*3ac0a46fSAndroid Build Coastguard WorkerinPy3k = sys.version_info[0] == 3 114*3ac0a46fSAndroid Build Coastguard Worker 115*3ac0a46fSAndroid Build Coastguard Worker# Needed to work around Python 3 bug where use of "super" interferes with 116*3ac0a46fSAndroid Build Coastguard Worker# defining __class__ as a descriptor 117*3ac0a46fSAndroid Build Coastguard Worker_super = super 118*3ac0a46fSAndroid Build Coastguard Worker 119*3ac0a46fSAndroid Build Coastguard Workerself = 'im_self' 120*3ac0a46fSAndroid Build Coastguard Workerbuiltin = '__builtin__' 121*3ac0a46fSAndroid Build Coastguard Workerif inPy3k: 122*3ac0a46fSAndroid Build Coastguard Worker self = '__self__' 123*3ac0a46fSAndroid Build Coastguard Worker builtin = 'builtins' 124*3ac0a46fSAndroid Build Coastguard Worker 125*3ac0a46fSAndroid Build Coastguard WorkerFILTER_DIR = True 126*3ac0a46fSAndroid Build Coastguard Worker 127*3ac0a46fSAndroid Build Coastguard Worker 128*3ac0a46fSAndroid Build Coastguard Workerdef _is_instance_mock(obj): 129*3ac0a46fSAndroid Build Coastguard Worker # can't use isinstance on Mock objects because they override __class__ 130*3ac0a46fSAndroid Build Coastguard Worker # The base class for all mocks is NonCallableMock 131*3ac0a46fSAndroid Build Coastguard Worker return issubclass(type(obj), NonCallableMock) 132*3ac0a46fSAndroid Build Coastguard Worker 133*3ac0a46fSAndroid Build Coastguard Worker 134*3ac0a46fSAndroid Build Coastguard Workerdef _is_exception(obj): 135*3ac0a46fSAndroid Build Coastguard Worker return ( 136*3ac0a46fSAndroid Build Coastguard Worker isinstance(obj, BaseExceptions) or 137*3ac0a46fSAndroid Build Coastguard Worker isinstance(obj, ClassTypes) and issubclass(obj, BaseExceptions) 138*3ac0a46fSAndroid Build Coastguard Worker ) 139*3ac0a46fSAndroid Build Coastguard Worker 140*3ac0a46fSAndroid Build Coastguard Worker 141*3ac0a46fSAndroid Build Coastguard Workerclass _slotted(object): 142*3ac0a46fSAndroid Build Coastguard Worker __slots__ = ['a'] 143*3ac0a46fSAndroid Build Coastguard Worker 144*3ac0a46fSAndroid Build Coastguard Worker 145*3ac0a46fSAndroid Build Coastguard WorkerDescriptorTypes = ( 146*3ac0a46fSAndroid Build Coastguard Worker type(_slotted.a), 147*3ac0a46fSAndroid Build Coastguard Worker property, 148*3ac0a46fSAndroid Build Coastguard Worker) 149*3ac0a46fSAndroid Build Coastguard Worker 150*3ac0a46fSAndroid Build Coastguard Worker 151*3ac0a46fSAndroid Build Coastguard Workerdef _getsignature(func, skipfirst, instance=False): 152*3ac0a46fSAndroid Build Coastguard Worker if inspect is None: 153*3ac0a46fSAndroid Build Coastguard Worker raise ImportError('inspect module not available') 154*3ac0a46fSAndroid Build Coastguard Worker 155*3ac0a46fSAndroid Build Coastguard Worker if isinstance(func, ClassTypes) and not instance: 156*3ac0a46fSAndroid Build Coastguard Worker try: 157*3ac0a46fSAndroid Build Coastguard Worker func = func.__init__ 158*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 159*3ac0a46fSAndroid Build Coastguard Worker return 160*3ac0a46fSAndroid Build Coastguard Worker skipfirst = True 161*3ac0a46fSAndroid Build Coastguard Worker elif not isinstance(func, FunctionTypes): 162*3ac0a46fSAndroid Build Coastguard Worker # for classes where instance is True we end up here too 163*3ac0a46fSAndroid Build Coastguard Worker try: 164*3ac0a46fSAndroid Build Coastguard Worker func = func.__call__ 165*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 166*3ac0a46fSAndroid Build Coastguard Worker return 167*3ac0a46fSAndroid Build Coastguard Worker 168*3ac0a46fSAndroid Build Coastguard Worker if inPy3k: 169*3ac0a46fSAndroid Build Coastguard Worker try: 170*3ac0a46fSAndroid Build Coastguard Worker argspec = inspect.getfullargspec(func) 171*3ac0a46fSAndroid Build Coastguard Worker except TypeError: 172*3ac0a46fSAndroid Build Coastguard Worker # C function / method, possibly inherited object().__init__ 173*3ac0a46fSAndroid Build Coastguard Worker return 174*3ac0a46fSAndroid Build Coastguard Worker regargs, varargs, varkw, defaults, kwonly, kwonlydef, ann = argspec 175*3ac0a46fSAndroid Build Coastguard Worker else: 176*3ac0a46fSAndroid Build Coastguard Worker try: 177*3ac0a46fSAndroid Build Coastguard Worker regargs, varargs, varkwargs, defaults = inspect.getargspec(func) 178*3ac0a46fSAndroid Build Coastguard Worker except TypeError: 179*3ac0a46fSAndroid Build Coastguard Worker # C function / method, possibly inherited object().__init__ 180*3ac0a46fSAndroid Build Coastguard Worker return 181*3ac0a46fSAndroid Build Coastguard Worker 182*3ac0a46fSAndroid Build Coastguard Worker # instance methods and classmethods need to lose the self argument 183*3ac0a46fSAndroid Build Coastguard Worker if getattr(func, self, None) is not None: 184*3ac0a46fSAndroid Build Coastguard Worker regargs = regargs[1:] 185*3ac0a46fSAndroid Build Coastguard Worker if skipfirst: 186*3ac0a46fSAndroid Build Coastguard Worker # this condition and the above one are never both True - why? 187*3ac0a46fSAndroid Build Coastguard Worker regargs = regargs[1:] 188*3ac0a46fSAndroid Build Coastguard Worker 189*3ac0a46fSAndroid Build Coastguard Worker if inPy3k: 190*3ac0a46fSAndroid Build Coastguard Worker signature = inspect.formatargspec( 191*3ac0a46fSAndroid Build Coastguard Worker regargs, varargs, varkw, defaults, 192*3ac0a46fSAndroid Build Coastguard Worker kwonly, kwonlydef, ann, formatvalue=lambda value: "") 193*3ac0a46fSAndroid Build Coastguard Worker else: 194*3ac0a46fSAndroid Build Coastguard Worker signature = inspect.formatargspec( 195*3ac0a46fSAndroid Build Coastguard Worker regargs, varargs, varkwargs, defaults, 196*3ac0a46fSAndroid Build Coastguard Worker formatvalue=lambda value: "") 197*3ac0a46fSAndroid Build Coastguard Worker return signature[1:-1], func 198*3ac0a46fSAndroid Build Coastguard Worker 199*3ac0a46fSAndroid Build Coastguard Worker 200*3ac0a46fSAndroid Build Coastguard Workerdef _check_signature(func, mock, skipfirst, instance=False): 201*3ac0a46fSAndroid Build Coastguard Worker if not _callable(func): 202*3ac0a46fSAndroid Build Coastguard Worker return 203*3ac0a46fSAndroid Build Coastguard Worker 204*3ac0a46fSAndroid Build Coastguard Worker result = _getsignature(func, skipfirst, instance) 205*3ac0a46fSAndroid Build Coastguard Worker if result is None: 206*3ac0a46fSAndroid Build Coastguard Worker return 207*3ac0a46fSAndroid Build Coastguard Worker signature, func = result 208*3ac0a46fSAndroid Build Coastguard Worker 209*3ac0a46fSAndroid Build Coastguard Worker # can't use self because "self" is common as an argument name 210*3ac0a46fSAndroid Build Coastguard Worker # unfortunately even not in the first place 211*3ac0a46fSAndroid Build Coastguard Worker src = "lambda _mock_self, %s: None" % signature 212*3ac0a46fSAndroid Build Coastguard Worker checksig = eval(src, {}) 213*3ac0a46fSAndroid Build Coastguard Worker _copy_func_details(func, checksig) 214*3ac0a46fSAndroid Build Coastguard Worker type(mock)._mock_check_sig = checksig 215*3ac0a46fSAndroid Build Coastguard Worker 216*3ac0a46fSAndroid Build Coastguard Worker 217*3ac0a46fSAndroid Build Coastguard Workerdef _copy_func_details(func, funcopy): 218*3ac0a46fSAndroid Build Coastguard Worker funcopy.__name__ = func.__name__ 219*3ac0a46fSAndroid Build Coastguard Worker funcopy.__doc__ = func.__doc__ 220*3ac0a46fSAndroid Build Coastguard Worker #funcopy.__dict__.update(func.__dict__) 221*3ac0a46fSAndroid Build Coastguard Worker funcopy.__module__ = func.__module__ 222*3ac0a46fSAndroid Build Coastguard Worker if not inPy3k: 223*3ac0a46fSAndroid Build Coastguard Worker funcopy.func_defaults = func.func_defaults 224*3ac0a46fSAndroid Build Coastguard Worker return 225*3ac0a46fSAndroid Build Coastguard Worker funcopy.__defaults__ = func.__defaults__ 226*3ac0a46fSAndroid Build Coastguard Worker funcopy.__kwdefaults__ = func.__kwdefaults__ 227*3ac0a46fSAndroid Build Coastguard Worker 228*3ac0a46fSAndroid Build Coastguard Worker 229*3ac0a46fSAndroid Build Coastguard Workerdef _callable(obj): 230*3ac0a46fSAndroid Build Coastguard Worker if isinstance(obj, ClassTypes): 231*3ac0a46fSAndroid Build Coastguard Worker return True 232*3ac0a46fSAndroid Build Coastguard Worker if getattr(obj, '__call__', None) is not None: 233*3ac0a46fSAndroid Build Coastguard Worker return True 234*3ac0a46fSAndroid Build Coastguard Worker return False 235*3ac0a46fSAndroid Build Coastguard Worker 236*3ac0a46fSAndroid Build Coastguard Worker 237*3ac0a46fSAndroid Build Coastguard Workerdef _is_list(obj): 238*3ac0a46fSAndroid Build Coastguard Worker # checks for list or tuples 239*3ac0a46fSAndroid Build Coastguard Worker # XXXX badly named! 240*3ac0a46fSAndroid Build Coastguard Worker return type(obj) in (list, tuple) 241*3ac0a46fSAndroid Build Coastguard Worker 242*3ac0a46fSAndroid Build Coastguard Worker 243*3ac0a46fSAndroid Build Coastguard Workerdef _instance_callable(obj): 244*3ac0a46fSAndroid Build Coastguard Worker """Given an object, return True if the object is callable. 245*3ac0a46fSAndroid Build Coastguard Worker For classes, return True if instances would be callable.""" 246*3ac0a46fSAndroid Build Coastguard Worker if not isinstance(obj, ClassTypes): 247*3ac0a46fSAndroid Build Coastguard Worker # already an instance 248*3ac0a46fSAndroid Build Coastguard Worker return getattr(obj, '__call__', None) is not None 249*3ac0a46fSAndroid Build Coastguard Worker 250*3ac0a46fSAndroid Build Coastguard Worker klass = obj 251*3ac0a46fSAndroid Build Coastguard Worker # uses __bases__ instead of __mro__ so that we work with old style classes 252*3ac0a46fSAndroid Build Coastguard Worker if klass.__dict__.get('__call__') is not None: 253*3ac0a46fSAndroid Build Coastguard Worker return True 254*3ac0a46fSAndroid Build Coastguard Worker 255*3ac0a46fSAndroid Build Coastguard Worker for base in klass.__bases__: 256*3ac0a46fSAndroid Build Coastguard Worker if _instance_callable(base): 257*3ac0a46fSAndroid Build Coastguard Worker return True 258*3ac0a46fSAndroid Build Coastguard Worker return False 259*3ac0a46fSAndroid Build Coastguard Worker 260*3ac0a46fSAndroid Build Coastguard Worker 261*3ac0a46fSAndroid Build Coastguard Workerdef _set_signature(mock, original, instance=False): 262*3ac0a46fSAndroid Build Coastguard Worker # creates a function with signature (*args, **kwargs) that delegates to a 263*3ac0a46fSAndroid Build Coastguard Worker # mock. It still does signature checking by calling a lambda with the same 264*3ac0a46fSAndroid Build Coastguard Worker # signature as the original. 265*3ac0a46fSAndroid Build Coastguard Worker if not _callable(original): 266*3ac0a46fSAndroid Build Coastguard Worker return 267*3ac0a46fSAndroid Build Coastguard Worker 268*3ac0a46fSAndroid Build Coastguard Worker skipfirst = isinstance(original, ClassTypes) 269*3ac0a46fSAndroid Build Coastguard Worker result = _getsignature(original, skipfirst, instance) 270*3ac0a46fSAndroid Build Coastguard Worker if result is None: 271*3ac0a46fSAndroid Build Coastguard Worker # was a C function (e.g. object().__init__ ) that can't be mocked 272*3ac0a46fSAndroid Build Coastguard Worker return 273*3ac0a46fSAndroid Build Coastguard Worker 274*3ac0a46fSAndroid Build Coastguard Worker signature, func = result 275*3ac0a46fSAndroid Build Coastguard Worker 276*3ac0a46fSAndroid Build Coastguard Worker src = "lambda %s: None" % signature 277*3ac0a46fSAndroid Build Coastguard Worker checksig = eval(src, {}) 278*3ac0a46fSAndroid Build Coastguard Worker _copy_func_details(func, checksig) 279*3ac0a46fSAndroid Build Coastguard Worker 280*3ac0a46fSAndroid Build Coastguard Worker name = original.__name__ 281*3ac0a46fSAndroid Build Coastguard Worker if not _isidentifier(name): 282*3ac0a46fSAndroid Build Coastguard Worker name = 'funcopy' 283*3ac0a46fSAndroid Build Coastguard Worker context = {'_checksig_': checksig, 'mock': mock} 284*3ac0a46fSAndroid Build Coastguard Worker src = """def %s(*args, **kwargs): 285*3ac0a46fSAndroid Build Coastguard Worker _checksig_(*args, **kwargs) 286*3ac0a46fSAndroid Build Coastguard Worker return mock(*args, **kwargs)""" % name 287*3ac0a46fSAndroid Build Coastguard Worker exec (src, context) 288*3ac0a46fSAndroid Build Coastguard Worker funcopy = context[name] 289*3ac0a46fSAndroid Build Coastguard Worker _setup_func(funcopy, mock) 290*3ac0a46fSAndroid Build Coastguard Worker return funcopy 291*3ac0a46fSAndroid Build Coastguard Worker 292*3ac0a46fSAndroid Build Coastguard Worker 293*3ac0a46fSAndroid Build Coastguard Workerdef _setup_func(funcopy, mock): 294*3ac0a46fSAndroid Build Coastguard Worker funcopy.mock = mock 295*3ac0a46fSAndroid Build Coastguard Worker 296*3ac0a46fSAndroid Build Coastguard Worker # can't use isinstance with mocks 297*3ac0a46fSAndroid Build Coastguard Worker if not _is_instance_mock(mock): 298*3ac0a46fSAndroid Build Coastguard Worker return 299*3ac0a46fSAndroid Build Coastguard Worker 300*3ac0a46fSAndroid Build Coastguard Worker def assert_called_with(*args, **kwargs): 301*3ac0a46fSAndroid Build Coastguard Worker return mock.assert_called_with(*args, **kwargs) 302*3ac0a46fSAndroid Build Coastguard Worker def assert_called_once_with(*args, **kwargs): 303*3ac0a46fSAndroid Build Coastguard Worker return mock.assert_called_once_with(*args, **kwargs) 304*3ac0a46fSAndroid Build Coastguard Worker def assert_has_calls(*args, **kwargs): 305*3ac0a46fSAndroid Build Coastguard Worker return mock.assert_has_calls(*args, **kwargs) 306*3ac0a46fSAndroid Build Coastguard Worker def assert_any_call(*args, **kwargs): 307*3ac0a46fSAndroid Build Coastguard Worker return mock.assert_any_call(*args, **kwargs) 308*3ac0a46fSAndroid Build Coastguard Worker def reset_mock(): 309*3ac0a46fSAndroid Build Coastguard Worker funcopy.method_calls = _CallList() 310*3ac0a46fSAndroid Build Coastguard Worker funcopy.mock_calls = _CallList() 311*3ac0a46fSAndroid Build Coastguard Worker mock.reset_mock() 312*3ac0a46fSAndroid Build Coastguard Worker ret = funcopy.return_value 313*3ac0a46fSAndroid Build Coastguard Worker if _is_instance_mock(ret) and not ret is mock: 314*3ac0a46fSAndroid Build Coastguard Worker ret.reset_mock() 315*3ac0a46fSAndroid Build Coastguard Worker 316*3ac0a46fSAndroid Build Coastguard Worker funcopy.called = False 317*3ac0a46fSAndroid Build Coastguard Worker funcopy.call_count = 0 318*3ac0a46fSAndroid Build Coastguard Worker funcopy.call_args = None 319*3ac0a46fSAndroid Build Coastguard Worker funcopy.call_args_list = _CallList() 320*3ac0a46fSAndroid Build Coastguard Worker funcopy.method_calls = _CallList() 321*3ac0a46fSAndroid Build Coastguard Worker funcopy.mock_calls = _CallList() 322*3ac0a46fSAndroid Build Coastguard Worker 323*3ac0a46fSAndroid Build Coastguard Worker funcopy.return_value = mock.return_value 324*3ac0a46fSAndroid Build Coastguard Worker funcopy.side_effect = mock.side_effect 325*3ac0a46fSAndroid Build Coastguard Worker funcopy._mock_children = mock._mock_children 326*3ac0a46fSAndroid Build Coastguard Worker 327*3ac0a46fSAndroid Build Coastguard Worker funcopy.assert_called_with = assert_called_with 328*3ac0a46fSAndroid Build Coastguard Worker funcopy.assert_called_once_with = assert_called_once_with 329*3ac0a46fSAndroid Build Coastguard Worker funcopy.assert_has_calls = assert_has_calls 330*3ac0a46fSAndroid Build Coastguard Worker funcopy.assert_any_call = assert_any_call 331*3ac0a46fSAndroid Build Coastguard Worker funcopy.reset_mock = reset_mock 332*3ac0a46fSAndroid Build Coastguard Worker 333*3ac0a46fSAndroid Build Coastguard Worker mock._mock_delegate = funcopy 334*3ac0a46fSAndroid Build Coastguard Worker 335*3ac0a46fSAndroid Build Coastguard Worker 336*3ac0a46fSAndroid Build Coastguard Workerdef _is_magic(name): 337*3ac0a46fSAndroid Build Coastguard Worker return '__%s__' % name[2:-2] == name 338*3ac0a46fSAndroid Build Coastguard Worker 339*3ac0a46fSAndroid Build Coastguard Worker 340*3ac0a46fSAndroid Build Coastguard Workerclass _SentinelObject(object): 341*3ac0a46fSAndroid Build Coastguard Worker "A unique, named, sentinel object." 342*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, name): 343*3ac0a46fSAndroid Build Coastguard Worker self.name = name 344*3ac0a46fSAndroid Build Coastguard Worker 345*3ac0a46fSAndroid Build Coastguard Worker def __repr__(self): 346*3ac0a46fSAndroid Build Coastguard Worker return 'sentinel.%s' % self.name 347*3ac0a46fSAndroid Build Coastguard Worker 348*3ac0a46fSAndroid Build Coastguard Worker 349*3ac0a46fSAndroid Build Coastguard Workerclass _Sentinel(object): 350*3ac0a46fSAndroid Build Coastguard Worker """Access attributes to return a named object, usable as a sentinel.""" 351*3ac0a46fSAndroid Build Coastguard Worker def __init__(self): 352*3ac0a46fSAndroid Build Coastguard Worker self._sentinels = {} 353*3ac0a46fSAndroid Build Coastguard Worker 354*3ac0a46fSAndroid Build Coastguard Worker def __getattr__(self, name): 355*3ac0a46fSAndroid Build Coastguard Worker if name == '__bases__': 356*3ac0a46fSAndroid Build Coastguard Worker # Without this help(mock) raises an exception 357*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError 358*3ac0a46fSAndroid Build Coastguard Worker return self._sentinels.setdefault(name, _SentinelObject(name)) 359*3ac0a46fSAndroid Build Coastguard Worker 360*3ac0a46fSAndroid Build Coastguard Worker 361*3ac0a46fSAndroid Build Coastguard Workersentinel = _Sentinel() 362*3ac0a46fSAndroid Build Coastguard Worker 363*3ac0a46fSAndroid Build Coastguard WorkerDEFAULT = sentinel.DEFAULT 364*3ac0a46fSAndroid Build Coastguard Worker_missing = sentinel.MISSING 365*3ac0a46fSAndroid Build Coastguard Worker_deleted = sentinel.DELETED 366*3ac0a46fSAndroid Build Coastguard Worker 367*3ac0a46fSAndroid Build Coastguard Worker 368*3ac0a46fSAndroid Build Coastguard Workerclass OldStyleClass: 369*3ac0a46fSAndroid Build Coastguard Worker pass 370*3ac0a46fSAndroid Build Coastguard WorkerClassType = type(OldStyleClass) 371*3ac0a46fSAndroid Build Coastguard Worker 372*3ac0a46fSAndroid Build Coastguard Worker 373*3ac0a46fSAndroid Build Coastguard Workerdef _copy(value): 374*3ac0a46fSAndroid Build Coastguard Worker if type(value) in (dict, list, tuple, set): 375*3ac0a46fSAndroid Build Coastguard Worker return type(value)(value) 376*3ac0a46fSAndroid Build Coastguard Worker return value 377*3ac0a46fSAndroid Build Coastguard Worker 378*3ac0a46fSAndroid Build Coastguard Worker 379*3ac0a46fSAndroid Build Coastguard WorkerClassTypes = (type,) 380*3ac0a46fSAndroid Build Coastguard Workerif not inPy3k: 381*3ac0a46fSAndroid Build Coastguard Worker ClassTypes = (type, ClassType) 382*3ac0a46fSAndroid Build Coastguard Worker 383*3ac0a46fSAndroid Build Coastguard Worker_allowed_names = set( 384*3ac0a46fSAndroid Build Coastguard Worker [ 385*3ac0a46fSAndroid Build Coastguard Worker 'return_value', '_mock_return_value', 'side_effect', 386*3ac0a46fSAndroid Build Coastguard Worker '_mock_side_effect', '_mock_parent', '_mock_new_parent', 387*3ac0a46fSAndroid Build Coastguard Worker '_mock_name', '_mock_new_name' 388*3ac0a46fSAndroid Build Coastguard Worker ] 389*3ac0a46fSAndroid Build Coastguard Worker) 390*3ac0a46fSAndroid Build Coastguard Worker 391*3ac0a46fSAndroid Build Coastguard Worker 392*3ac0a46fSAndroid Build Coastguard Workerdef _delegating_property(name): 393*3ac0a46fSAndroid Build Coastguard Worker _allowed_names.add(name) 394*3ac0a46fSAndroid Build Coastguard Worker _the_name = '_mock_' + name 395*3ac0a46fSAndroid Build Coastguard Worker def _get(self, name=name, _the_name=_the_name): 396*3ac0a46fSAndroid Build Coastguard Worker sig = self._mock_delegate 397*3ac0a46fSAndroid Build Coastguard Worker if sig is None: 398*3ac0a46fSAndroid Build Coastguard Worker return getattr(self, _the_name) 399*3ac0a46fSAndroid Build Coastguard Worker return getattr(sig, name) 400*3ac0a46fSAndroid Build Coastguard Worker def _set(self, value, name=name, _the_name=_the_name): 401*3ac0a46fSAndroid Build Coastguard Worker sig = self._mock_delegate 402*3ac0a46fSAndroid Build Coastguard Worker if sig is None: 403*3ac0a46fSAndroid Build Coastguard Worker self.__dict__[_the_name] = value 404*3ac0a46fSAndroid Build Coastguard Worker else: 405*3ac0a46fSAndroid Build Coastguard Worker setattr(sig, name, value) 406*3ac0a46fSAndroid Build Coastguard Worker 407*3ac0a46fSAndroid Build Coastguard Worker return property(_get, _set) 408*3ac0a46fSAndroid Build Coastguard Worker 409*3ac0a46fSAndroid Build Coastguard Worker 410*3ac0a46fSAndroid Build Coastguard Worker 411*3ac0a46fSAndroid Build Coastguard Workerclass _CallList(list): 412*3ac0a46fSAndroid Build Coastguard Worker 413*3ac0a46fSAndroid Build Coastguard Worker def __contains__(self, value): 414*3ac0a46fSAndroid Build Coastguard Worker if not isinstance(value, list): 415*3ac0a46fSAndroid Build Coastguard Worker return list.__contains__(self, value) 416*3ac0a46fSAndroid Build Coastguard Worker len_value = len(value) 417*3ac0a46fSAndroid Build Coastguard Worker len_self = len(self) 418*3ac0a46fSAndroid Build Coastguard Worker if len_value > len_self: 419*3ac0a46fSAndroid Build Coastguard Worker return False 420*3ac0a46fSAndroid Build Coastguard Worker 421*3ac0a46fSAndroid Build Coastguard Worker for i in range(0, len_self - len_value + 1): 422*3ac0a46fSAndroid Build Coastguard Worker sub_list = self[i:i+len_value] 423*3ac0a46fSAndroid Build Coastguard Worker if sub_list == value: 424*3ac0a46fSAndroid Build Coastguard Worker return True 425*3ac0a46fSAndroid Build Coastguard Worker return False 426*3ac0a46fSAndroid Build Coastguard Worker 427*3ac0a46fSAndroid Build Coastguard Worker def __repr__(self): 428*3ac0a46fSAndroid Build Coastguard Worker return pprint.pformat(list(self)) 429*3ac0a46fSAndroid Build Coastguard Worker 430*3ac0a46fSAndroid Build Coastguard Worker 431*3ac0a46fSAndroid Build Coastguard Workerdef _check_and_set_parent(parent, value, name, new_name): 432*3ac0a46fSAndroid Build Coastguard Worker if not _is_instance_mock(value): 433*3ac0a46fSAndroid Build Coastguard Worker return False 434*3ac0a46fSAndroid Build Coastguard Worker if ((value._mock_name or value._mock_new_name) or 435*3ac0a46fSAndroid Build Coastguard Worker (value._mock_parent is not None) or 436*3ac0a46fSAndroid Build Coastguard Worker (value._mock_new_parent is not None)): 437*3ac0a46fSAndroid Build Coastguard Worker return False 438*3ac0a46fSAndroid Build Coastguard Worker 439*3ac0a46fSAndroid Build Coastguard Worker _parent = parent 440*3ac0a46fSAndroid Build Coastguard Worker while _parent is not None: 441*3ac0a46fSAndroid Build Coastguard Worker # setting a mock (value) as a child or return value of itself 442*3ac0a46fSAndroid Build Coastguard Worker # should not modify the mock 443*3ac0a46fSAndroid Build Coastguard Worker if _parent is value: 444*3ac0a46fSAndroid Build Coastguard Worker return False 445*3ac0a46fSAndroid Build Coastguard Worker _parent = _parent._mock_new_parent 446*3ac0a46fSAndroid Build Coastguard Worker 447*3ac0a46fSAndroid Build Coastguard Worker if new_name: 448*3ac0a46fSAndroid Build Coastguard Worker value._mock_new_parent = parent 449*3ac0a46fSAndroid Build Coastguard Worker value._mock_new_name = new_name 450*3ac0a46fSAndroid Build Coastguard Worker if name: 451*3ac0a46fSAndroid Build Coastguard Worker value._mock_parent = parent 452*3ac0a46fSAndroid Build Coastguard Worker value._mock_name = name 453*3ac0a46fSAndroid Build Coastguard Worker return True 454*3ac0a46fSAndroid Build Coastguard Worker 455*3ac0a46fSAndroid Build Coastguard Worker 456*3ac0a46fSAndroid Build Coastguard Worker 457*3ac0a46fSAndroid Build Coastguard Workerclass Base(object): 458*3ac0a46fSAndroid Build Coastguard Worker _mock_return_value = DEFAULT 459*3ac0a46fSAndroid Build Coastguard Worker _mock_side_effect = None 460*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, *args, **kwargs): 461*3ac0a46fSAndroid Build Coastguard Worker pass 462*3ac0a46fSAndroid Build Coastguard Worker 463*3ac0a46fSAndroid Build Coastguard Worker 464*3ac0a46fSAndroid Build Coastguard Worker 465*3ac0a46fSAndroid Build Coastguard Workerclass NonCallableMock(Base): 466*3ac0a46fSAndroid Build Coastguard Worker """A non-callable version of `Mock`""" 467*3ac0a46fSAndroid Build Coastguard Worker 468*3ac0a46fSAndroid Build Coastguard Worker def __new__(cls, *args, **kw): 469*3ac0a46fSAndroid Build Coastguard Worker # every instance has its own class 470*3ac0a46fSAndroid Build Coastguard Worker # so we can create magic methods on the 471*3ac0a46fSAndroid Build Coastguard Worker # class without stomping on other mocks 472*3ac0a46fSAndroid Build Coastguard Worker new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__}) 473*3ac0a46fSAndroid Build Coastguard Worker instance = object.__new__(new) 474*3ac0a46fSAndroid Build Coastguard Worker return instance 475*3ac0a46fSAndroid Build Coastguard Worker 476*3ac0a46fSAndroid Build Coastguard Worker 477*3ac0a46fSAndroid Build Coastguard Worker def __init__( 478*3ac0a46fSAndroid Build Coastguard Worker self, spec=None, wraps=None, name=None, spec_set=None, 479*3ac0a46fSAndroid Build Coastguard Worker parent=None, _spec_state=None, _new_name='', _new_parent=None, 480*3ac0a46fSAndroid Build Coastguard Worker **kwargs 481*3ac0a46fSAndroid Build Coastguard Worker ): 482*3ac0a46fSAndroid Build Coastguard Worker if _new_parent is None: 483*3ac0a46fSAndroid Build Coastguard Worker _new_parent = parent 484*3ac0a46fSAndroid Build Coastguard Worker 485*3ac0a46fSAndroid Build Coastguard Worker __dict__ = self.__dict__ 486*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_parent'] = parent 487*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_name'] = name 488*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_new_name'] = _new_name 489*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_new_parent'] = _new_parent 490*3ac0a46fSAndroid Build Coastguard Worker 491*3ac0a46fSAndroid Build Coastguard Worker if spec_set is not None: 492*3ac0a46fSAndroid Build Coastguard Worker spec = spec_set 493*3ac0a46fSAndroid Build Coastguard Worker spec_set = True 494*3ac0a46fSAndroid Build Coastguard Worker 495*3ac0a46fSAndroid Build Coastguard Worker self._mock_add_spec(spec, spec_set) 496*3ac0a46fSAndroid Build Coastguard Worker 497*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_children'] = {} 498*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_wraps'] = wraps 499*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_delegate'] = None 500*3ac0a46fSAndroid Build Coastguard Worker 501*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_called'] = False 502*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_call_args'] = None 503*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_call_count'] = 0 504*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_call_args_list'] = _CallList() 505*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_mock_calls'] = _CallList() 506*3ac0a46fSAndroid Build Coastguard Worker 507*3ac0a46fSAndroid Build Coastguard Worker __dict__['method_calls'] = _CallList() 508*3ac0a46fSAndroid Build Coastguard Worker 509*3ac0a46fSAndroid Build Coastguard Worker if kwargs: 510*3ac0a46fSAndroid Build Coastguard Worker self.configure_mock(**kwargs) 511*3ac0a46fSAndroid Build Coastguard Worker 512*3ac0a46fSAndroid Build Coastguard Worker _super(NonCallableMock, self).__init__( 513*3ac0a46fSAndroid Build Coastguard Worker spec, wraps, name, spec_set, parent, 514*3ac0a46fSAndroid Build Coastguard Worker _spec_state 515*3ac0a46fSAndroid Build Coastguard Worker ) 516*3ac0a46fSAndroid Build Coastguard Worker 517*3ac0a46fSAndroid Build Coastguard Worker 518*3ac0a46fSAndroid Build Coastguard Worker def attach_mock(self, mock, attribute): 519*3ac0a46fSAndroid Build Coastguard Worker """ 520*3ac0a46fSAndroid Build Coastguard Worker Attach a mock as an attribute of this one, replacing its name and 521*3ac0a46fSAndroid Build Coastguard Worker parent. Calls to the attached mock will be recorded in the 522*3ac0a46fSAndroid Build Coastguard Worker `method_calls` and `mock_calls` attributes of this one.""" 523*3ac0a46fSAndroid Build Coastguard Worker mock._mock_parent = None 524*3ac0a46fSAndroid Build Coastguard Worker mock._mock_new_parent = None 525*3ac0a46fSAndroid Build Coastguard Worker mock._mock_name = '' 526*3ac0a46fSAndroid Build Coastguard Worker mock._mock_new_name = None 527*3ac0a46fSAndroid Build Coastguard Worker 528*3ac0a46fSAndroid Build Coastguard Worker setattr(self, attribute, mock) 529*3ac0a46fSAndroid Build Coastguard Worker 530*3ac0a46fSAndroid Build Coastguard Worker 531*3ac0a46fSAndroid Build Coastguard Worker def mock_add_spec(self, spec, spec_set=False): 532*3ac0a46fSAndroid Build Coastguard Worker """Add a spec to a mock. `spec` can either be an object or a 533*3ac0a46fSAndroid Build Coastguard Worker list of strings. Only attributes on the `spec` can be fetched as 534*3ac0a46fSAndroid Build Coastguard Worker attributes from the mock. 535*3ac0a46fSAndroid Build Coastguard Worker 536*3ac0a46fSAndroid Build Coastguard Worker If `spec_set` is True then only attributes on the spec can be set.""" 537*3ac0a46fSAndroid Build Coastguard Worker self._mock_add_spec(spec, spec_set) 538*3ac0a46fSAndroid Build Coastguard Worker 539*3ac0a46fSAndroid Build Coastguard Worker 540*3ac0a46fSAndroid Build Coastguard Worker def _mock_add_spec(self, spec, spec_set): 541*3ac0a46fSAndroid Build Coastguard Worker _spec_class = None 542*3ac0a46fSAndroid Build Coastguard Worker 543*3ac0a46fSAndroid Build Coastguard Worker if spec is not None and not _is_list(spec): 544*3ac0a46fSAndroid Build Coastguard Worker if isinstance(spec, ClassTypes): 545*3ac0a46fSAndroid Build Coastguard Worker _spec_class = spec 546*3ac0a46fSAndroid Build Coastguard Worker else: 547*3ac0a46fSAndroid Build Coastguard Worker _spec_class = _get_class(spec) 548*3ac0a46fSAndroid Build Coastguard Worker 549*3ac0a46fSAndroid Build Coastguard Worker spec = dir(spec) 550*3ac0a46fSAndroid Build Coastguard Worker 551*3ac0a46fSAndroid Build Coastguard Worker __dict__ = self.__dict__ 552*3ac0a46fSAndroid Build Coastguard Worker __dict__['_spec_class'] = _spec_class 553*3ac0a46fSAndroid Build Coastguard Worker __dict__['_spec_set'] = spec_set 554*3ac0a46fSAndroid Build Coastguard Worker __dict__['_mock_methods'] = spec 555*3ac0a46fSAndroid Build Coastguard Worker 556*3ac0a46fSAndroid Build Coastguard Worker 557*3ac0a46fSAndroid Build Coastguard Worker def __get_return_value(self): 558*3ac0a46fSAndroid Build Coastguard Worker ret = self._mock_return_value 559*3ac0a46fSAndroid Build Coastguard Worker if self._mock_delegate is not None: 560*3ac0a46fSAndroid Build Coastguard Worker ret = self._mock_delegate.return_value 561*3ac0a46fSAndroid Build Coastguard Worker 562*3ac0a46fSAndroid Build Coastguard Worker if ret is DEFAULT: 563*3ac0a46fSAndroid Build Coastguard Worker ret = self._get_child_mock( 564*3ac0a46fSAndroid Build Coastguard Worker _new_parent=self, _new_name='()' 565*3ac0a46fSAndroid Build Coastguard Worker ) 566*3ac0a46fSAndroid Build Coastguard Worker self.return_value = ret 567*3ac0a46fSAndroid Build Coastguard Worker return ret 568*3ac0a46fSAndroid Build Coastguard Worker 569*3ac0a46fSAndroid Build Coastguard Worker 570*3ac0a46fSAndroid Build Coastguard Worker def __set_return_value(self, value): 571*3ac0a46fSAndroid Build Coastguard Worker if self._mock_delegate is not None: 572*3ac0a46fSAndroid Build Coastguard Worker self._mock_delegate.return_value = value 573*3ac0a46fSAndroid Build Coastguard Worker else: 574*3ac0a46fSAndroid Build Coastguard Worker self._mock_return_value = value 575*3ac0a46fSAndroid Build Coastguard Worker _check_and_set_parent(self, value, None, '()') 576*3ac0a46fSAndroid Build Coastguard Worker 577*3ac0a46fSAndroid Build Coastguard Worker __return_value_doc = "The value to be returned when the mock is called." 578*3ac0a46fSAndroid Build Coastguard Worker return_value = property(__get_return_value, __set_return_value, 579*3ac0a46fSAndroid Build Coastguard Worker __return_value_doc) 580*3ac0a46fSAndroid Build Coastguard Worker 581*3ac0a46fSAndroid Build Coastguard Worker 582*3ac0a46fSAndroid Build Coastguard Worker @property 583*3ac0a46fSAndroid Build Coastguard Worker def __class__(self): 584*3ac0a46fSAndroid Build Coastguard Worker if self._spec_class is None: 585*3ac0a46fSAndroid Build Coastguard Worker return type(self) 586*3ac0a46fSAndroid Build Coastguard Worker return self._spec_class 587*3ac0a46fSAndroid Build Coastguard Worker 588*3ac0a46fSAndroid Build Coastguard Worker called = _delegating_property('called') 589*3ac0a46fSAndroid Build Coastguard Worker call_count = _delegating_property('call_count') 590*3ac0a46fSAndroid Build Coastguard Worker call_args = _delegating_property('call_args') 591*3ac0a46fSAndroid Build Coastguard Worker call_args_list = _delegating_property('call_args_list') 592*3ac0a46fSAndroid Build Coastguard Worker mock_calls = _delegating_property('mock_calls') 593*3ac0a46fSAndroid Build Coastguard Worker 594*3ac0a46fSAndroid Build Coastguard Worker 595*3ac0a46fSAndroid Build Coastguard Worker def __get_side_effect(self): 596*3ac0a46fSAndroid Build Coastguard Worker sig = self._mock_delegate 597*3ac0a46fSAndroid Build Coastguard Worker if sig is None: 598*3ac0a46fSAndroid Build Coastguard Worker return self._mock_side_effect 599*3ac0a46fSAndroid Build Coastguard Worker return sig.side_effect 600*3ac0a46fSAndroid Build Coastguard Worker 601*3ac0a46fSAndroid Build Coastguard Worker def __set_side_effect(self, value): 602*3ac0a46fSAndroid Build Coastguard Worker value = _try_iter(value) 603*3ac0a46fSAndroid Build Coastguard Worker sig = self._mock_delegate 604*3ac0a46fSAndroid Build Coastguard Worker if sig is None: 605*3ac0a46fSAndroid Build Coastguard Worker self._mock_side_effect = value 606*3ac0a46fSAndroid Build Coastguard Worker else: 607*3ac0a46fSAndroid Build Coastguard Worker sig.side_effect = value 608*3ac0a46fSAndroid Build Coastguard Worker 609*3ac0a46fSAndroid Build Coastguard Worker side_effect = property(__get_side_effect, __set_side_effect) 610*3ac0a46fSAndroid Build Coastguard Worker 611*3ac0a46fSAndroid Build Coastguard Worker 612*3ac0a46fSAndroid Build Coastguard Worker def reset_mock(self): 613*3ac0a46fSAndroid Build Coastguard Worker "Restore the mock object to its initial state." 614*3ac0a46fSAndroid Build Coastguard Worker self.called = False 615*3ac0a46fSAndroid Build Coastguard Worker self.call_args = None 616*3ac0a46fSAndroid Build Coastguard Worker self.call_count = 0 617*3ac0a46fSAndroid Build Coastguard Worker self.mock_calls = _CallList() 618*3ac0a46fSAndroid Build Coastguard Worker self.call_args_list = _CallList() 619*3ac0a46fSAndroid Build Coastguard Worker self.method_calls = _CallList() 620*3ac0a46fSAndroid Build Coastguard Worker 621*3ac0a46fSAndroid Build Coastguard Worker for child in self._mock_children.values(): 622*3ac0a46fSAndroid Build Coastguard Worker if isinstance(child, _SpecState): 623*3ac0a46fSAndroid Build Coastguard Worker continue 624*3ac0a46fSAndroid Build Coastguard Worker child.reset_mock() 625*3ac0a46fSAndroid Build Coastguard Worker 626*3ac0a46fSAndroid Build Coastguard Worker ret = self._mock_return_value 627*3ac0a46fSAndroid Build Coastguard Worker if _is_instance_mock(ret) and ret is not self: 628*3ac0a46fSAndroid Build Coastguard Worker ret.reset_mock() 629*3ac0a46fSAndroid Build Coastguard Worker 630*3ac0a46fSAndroid Build Coastguard Worker 631*3ac0a46fSAndroid Build Coastguard Worker def configure_mock(self, **kwargs): 632*3ac0a46fSAndroid Build Coastguard Worker """Set attributes on the mock through keyword arguments. 633*3ac0a46fSAndroid Build Coastguard Worker 634*3ac0a46fSAndroid Build Coastguard Worker Attributes plus return values and side effects can be set on child 635*3ac0a46fSAndroid Build Coastguard Worker mocks using standard dot notation and unpacking a dictionary in the 636*3ac0a46fSAndroid Build Coastguard Worker method call: 637*3ac0a46fSAndroid Build Coastguard Worker 638*3ac0a46fSAndroid Build Coastguard Worker >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError} 639*3ac0a46fSAndroid Build Coastguard Worker >>> mock.configure_mock(**attrs)""" 640*3ac0a46fSAndroid Build Coastguard Worker for arg, val in sorted(kwargs.items(), 641*3ac0a46fSAndroid Build Coastguard Worker # we sort on the number of dots so that 642*3ac0a46fSAndroid Build Coastguard Worker # attributes are set before we set attributes on 643*3ac0a46fSAndroid Build Coastguard Worker # attributes 644*3ac0a46fSAndroid Build Coastguard Worker key=lambda entry: entry[0].count('.')): 645*3ac0a46fSAndroid Build Coastguard Worker args = arg.split('.') 646*3ac0a46fSAndroid Build Coastguard Worker final = args.pop() 647*3ac0a46fSAndroid Build Coastguard Worker obj = self 648*3ac0a46fSAndroid Build Coastguard Worker for entry in args: 649*3ac0a46fSAndroid Build Coastguard Worker obj = getattr(obj, entry) 650*3ac0a46fSAndroid Build Coastguard Worker setattr(obj, final, val) 651*3ac0a46fSAndroid Build Coastguard Worker 652*3ac0a46fSAndroid Build Coastguard Worker 653*3ac0a46fSAndroid Build Coastguard Worker def __getattr__(self, name): 654*3ac0a46fSAndroid Build Coastguard Worker if name == '_mock_methods': 655*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError(name) 656*3ac0a46fSAndroid Build Coastguard Worker elif self._mock_methods is not None: 657*3ac0a46fSAndroid Build Coastguard Worker if name not in self._mock_methods or name in _all_magics: 658*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError("Mock object has no attribute %r" % name) 659*3ac0a46fSAndroid Build Coastguard Worker elif _is_magic(name): 660*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError(name) 661*3ac0a46fSAndroid Build Coastguard Worker 662*3ac0a46fSAndroid Build Coastguard Worker result = self._mock_children.get(name) 663*3ac0a46fSAndroid Build Coastguard Worker if result is _deleted: 664*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError(name) 665*3ac0a46fSAndroid Build Coastguard Worker elif result is None: 666*3ac0a46fSAndroid Build Coastguard Worker wraps = None 667*3ac0a46fSAndroid Build Coastguard Worker if self._mock_wraps is not None: 668*3ac0a46fSAndroid Build Coastguard Worker # XXXX should we get the attribute without triggering code 669*3ac0a46fSAndroid Build Coastguard Worker # execution? 670*3ac0a46fSAndroid Build Coastguard Worker wraps = getattr(self._mock_wraps, name) 671*3ac0a46fSAndroid Build Coastguard Worker 672*3ac0a46fSAndroid Build Coastguard Worker result = self._get_child_mock( 673*3ac0a46fSAndroid Build Coastguard Worker parent=self, name=name, wraps=wraps, _new_name=name, 674*3ac0a46fSAndroid Build Coastguard Worker _new_parent=self 675*3ac0a46fSAndroid Build Coastguard Worker ) 676*3ac0a46fSAndroid Build Coastguard Worker self._mock_children[name] = result 677*3ac0a46fSAndroid Build Coastguard Worker 678*3ac0a46fSAndroid Build Coastguard Worker elif isinstance(result, _SpecState): 679*3ac0a46fSAndroid Build Coastguard Worker result = create_autospec( 680*3ac0a46fSAndroid Build Coastguard Worker result.spec, result.spec_set, result.instance, 681*3ac0a46fSAndroid Build Coastguard Worker result.parent, result.name 682*3ac0a46fSAndroid Build Coastguard Worker ) 683*3ac0a46fSAndroid Build Coastguard Worker self._mock_children[name] = result 684*3ac0a46fSAndroid Build Coastguard Worker 685*3ac0a46fSAndroid Build Coastguard Worker return result 686*3ac0a46fSAndroid Build Coastguard Worker 687*3ac0a46fSAndroid Build Coastguard Worker 688*3ac0a46fSAndroid Build Coastguard Worker def __repr__(self): 689*3ac0a46fSAndroid Build Coastguard Worker _name_list = [self._mock_new_name] 690*3ac0a46fSAndroid Build Coastguard Worker _parent = self._mock_new_parent 691*3ac0a46fSAndroid Build Coastguard Worker last = self 692*3ac0a46fSAndroid Build Coastguard Worker 693*3ac0a46fSAndroid Build Coastguard Worker dot = '.' 694*3ac0a46fSAndroid Build Coastguard Worker if _name_list == ['()']: 695*3ac0a46fSAndroid Build Coastguard Worker dot = '' 696*3ac0a46fSAndroid Build Coastguard Worker seen = set() 697*3ac0a46fSAndroid Build Coastguard Worker while _parent is not None: 698*3ac0a46fSAndroid Build Coastguard Worker last = _parent 699*3ac0a46fSAndroid Build Coastguard Worker 700*3ac0a46fSAndroid Build Coastguard Worker _name_list.append(_parent._mock_new_name + dot) 701*3ac0a46fSAndroid Build Coastguard Worker dot = '.' 702*3ac0a46fSAndroid Build Coastguard Worker if _parent._mock_new_name == '()': 703*3ac0a46fSAndroid Build Coastguard Worker dot = '' 704*3ac0a46fSAndroid Build Coastguard Worker 705*3ac0a46fSAndroid Build Coastguard Worker _parent = _parent._mock_new_parent 706*3ac0a46fSAndroid Build Coastguard Worker 707*3ac0a46fSAndroid Build Coastguard Worker # use ids here so as not to call __hash__ on the mocks 708*3ac0a46fSAndroid Build Coastguard Worker if id(_parent) in seen: 709*3ac0a46fSAndroid Build Coastguard Worker break 710*3ac0a46fSAndroid Build Coastguard Worker seen.add(id(_parent)) 711*3ac0a46fSAndroid Build Coastguard Worker 712*3ac0a46fSAndroid Build Coastguard Worker _name_list = list(reversed(_name_list)) 713*3ac0a46fSAndroid Build Coastguard Worker _first = last._mock_name or 'mock' 714*3ac0a46fSAndroid Build Coastguard Worker if len(_name_list) > 1: 715*3ac0a46fSAndroid Build Coastguard Worker if _name_list[1] not in ('()', '().'): 716*3ac0a46fSAndroid Build Coastguard Worker _first += '.' 717*3ac0a46fSAndroid Build Coastguard Worker _name_list[0] = _first 718*3ac0a46fSAndroid Build Coastguard Worker name = ''.join(_name_list) 719*3ac0a46fSAndroid Build Coastguard Worker 720*3ac0a46fSAndroid Build Coastguard Worker name_string = '' 721*3ac0a46fSAndroid Build Coastguard Worker if name not in ('mock', 'mock.'): 722*3ac0a46fSAndroid Build Coastguard Worker name_string = ' name=%r' % name 723*3ac0a46fSAndroid Build Coastguard Worker 724*3ac0a46fSAndroid Build Coastguard Worker spec_string = '' 725*3ac0a46fSAndroid Build Coastguard Worker if self._spec_class is not None: 726*3ac0a46fSAndroid Build Coastguard Worker spec_string = ' spec=%r' 727*3ac0a46fSAndroid Build Coastguard Worker if self._spec_set: 728*3ac0a46fSAndroid Build Coastguard Worker spec_string = ' spec_set=%r' 729*3ac0a46fSAndroid Build Coastguard Worker spec_string = spec_string % self._spec_class.__name__ 730*3ac0a46fSAndroid Build Coastguard Worker return "<%s%s%s id='%s'>" % ( 731*3ac0a46fSAndroid Build Coastguard Worker type(self).__name__, 732*3ac0a46fSAndroid Build Coastguard Worker name_string, 733*3ac0a46fSAndroid Build Coastguard Worker spec_string, 734*3ac0a46fSAndroid Build Coastguard Worker id(self) 735*3ac0a46fSAndroid Build Coastguard Worker ) 736*3ac0a46fSAndroid Build Coastguard Worker 737*3ac0a46fSAndroid Build Coastguard Worker 738*3ac0a46fSAndroid Build Coastguard Worker def __dir__(self): 739*3ac0a46fSAndroid Build Coastguard Worker """Filter the output of `dir(mock)` to only useful members. 740*3ac0a46fSAndroid Build Coastguard Worker XXXX 741*3ac0a46fSAndroid Build Coastguard Worker """ 742*3ac0a46fSAndroid Build Coastguard Worker extras = self._mock_methods or [] 743*3ac0a46fSAndroid Build Coastguard Worker from_type = dir(type(self)) 744*3ac0a46fSAndroid Build Coastguard Worker from_dict = list(self.__dict__) 745*3ac0a46fSAndroid Build Coastguard Worker 746*3ac0a46fSAndroid Build Coastguard Worker if FILTER_DIR: 747*3ac0a46fSAndroid Build Coastguard Worker from_type = [e for e in from_type if not e.startswith('_')] 748*3ac0a46fSAndroid Build Coastguard Worker from_dict = [e for e in from_dict if not e.startswith('_') or 749*3ac0a46fSAndroid Build Coastguard Worker _is_magic(e)] 750*3ac0a46fSAndroid Build Coastguard Worker return sorted(set(extras + from_type + from_dict + 751*3ac0a46fSAndroid Build Coastguard Worker list(self._mock_children))) 752*3ac0a46fSAndroid Build Coastguard Worker 753*3ac0a46fSAndroid Build Coastguard Worker 754*3ac0a46fSAndroid Build Coastguard Worker def __setattr__(self, name, value): 755*3ac0a46fSAndroid Build Coastguard Worker if name in _allowed_names: 756*3ac0a46fSAndroid Build Coastguard Worker # property setters go through here 757*3ac0a46fSAndroid Build Coastguard Worker return object.__setattr__(self, name, value) 758*3ac0a46fSAndroid Build Coastguard Worker elif (self._spec_set and self._mock_methods is not None and 759*3ac0a46fSAndroid Build Coastguard Worker name not in self._mock_methods and 760*3ac0a46fSAndroid Build Coastguard Worker name not in self.__dict__): 761*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError("Mock object has no attribute '%s'" % name) 762*3ac0a46fSAndroid Build Coastguard Worker elif name in _unsupported_magics: 763*3ac0a46fSAndroid Build Coastguard Worker msg = 'Attempting to set unsupported magic method %r.' % name 764*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError(msg) 765*3ac0a46fSAndroid Build Coastguard Worker elif name in _all_magics: 766*3ac0a46fSAndroid Build Coastguard Worker if self._mock_methods is not None and name not in self._mock_methods: 767*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError("Mock object has no attribute '%s'" % name) 768*3ac0a46fSAndroid Build Coastguard Worker 769*3ac0a46fSAndroid Build Coastguard Worker if not _is_instance_mock(value): 770*3ac0a46fSAndroid Build Coastguard Worker setattr(type(self), name, _get_method(name, value)) 771*3ac0a46fSAndroid Build Coastguard Worker original = value 772*3ac0a46fSAndroid Build Coastguard Worker value = lambda *args, **kw: original(self, *args, **kw) 773*3ac0a46fSAndroid Build Coastguard Worker else: 774*3ac0a46fSAndroid Build Coastguard Worker # only set _new_name and not name so that mock_calls is tracked 775*3ac0a46fSAndroid Build Coastguard Worker # but not method calls 776*3ac0a46fSAndroid Build Coastguard Worker _check_and_set_parent(self, value, None, name) 777*3ac0a46fSAndroid Build Coastguard Worker setattr(type(self), name, value) 778*3ac0a46fSAndroid Build Coastguard Worker self._mock_children[name] = value 779*3ac0a46fSAndroid Build Coastguard Worker elif name == '__class__': 780*3ac0a46fSAndroid Build Coastguard Worker self._spec_class = value 781*3ac0a46fSAndroid Build Coastguard Worker return 782*3ac0a46fSAndroid Build Coastguard Worker else: 783*3ac0a46fSAndroid Build Coastguard Worker if _check_and_set_parent(self, value, name, name): 784*3ac0a46fSAndroid Build Coastguard Worker self._mock_children[name] = value 785*3ac0a46fSAndroid Build Coastguard Worker return object.__setattr__(self, name, value) 786*3ac0a46fSAndroid Build Coastguard Worker 787*3ac0a46fSAndroid Build Coastguard Worker 788*3ac0a46fSAndroid Build Coastguard Worker def __delattr__(self, name): 789*3ac0a46fSAndroid Build Coastguard Worker if name in _all_magics and name in type(self).__dict__: 790*3ac0a46fSAndroid Build Coastguard Worker delattr(type(self), name) 791*3ac0a46fSAndroid Build Coastguard Worker if name not in self.__dict__: 792*3ac0a46fSAndroid Build Coastguard Worker # for magic methods that are still MagicProxy objects and 793*3ac0a46fSAndroid Build Coastguard Worker # not set on the instance itself 794*3ac0a46fSAndroid Build Coastguard Worker return 795*3ac0a46fSAndroid Build Coastguard Worker 796*3ac0a46fSAndroid Build Coastguard Worker if name in self.__dict__: 797*3ac0a46fSAndroid Build Coastguard Worker object.__delattr__(self, name) 798*3ac0a46fSAndroid Build Coastguard Worker 799*3ac0a46fSAndroid Build Coastguard Worker obj = self._mock_children.get(name, _missing) 800*3ac0a46fSAndroid Build Coastguard Worker if obj is _deleted: 801*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError(name) 802*3ac0a46fSAndroid Build Coastguard Worker if obj is not _missing: 803*3ac0a46fSAndroid Build Coastguard Worker del self._mock_children[name] 804*3ac0a46fSAndroid Build Coastguard Worker self._mock_children[name] = _deleted 805*3ac0a46fSAndroid Build Coastguard Worker 806*3ac0a46fSAndroid Build Coastguard Worker 807*3ac0a46fSAndroid Build Coastguard Worker 808*3ac0a46fSAndroid Build Coastguard Worker def _format_mock_call_signature(self, args, kwargs): 809*3ac0a46fSAndroid Build Coastguard Worker name = self._mock_name or 'mock' 810*3ac0a46fSAndroid Build Coastguard Worker return _format_call_signature(name, args, kwargs) 811*3ac0a46fSAndroid Build Coastguard Worker 812*3ac0a46fSAndroid Build Coastguard Worker 813*3ac0a46fSAndroid Build Coastguard Worker def _format_mock_failure_message(self, args, kwargs): 814*3ac0a46fSAndroid Build Coastguard Worker message = 'Expected call: %s\nActual call: %s' 815*3ac0a46fSAndroid Build Coastguard Worker expected_string = self._format_mock_call_signature(args, kwargs) 816*3ac0a46fSAndroid Build Coastguard Worker call_args = self.call_args 817*3ac0a46fSAndroid Build Coastguard Worker if len(call_args) == 3: 818*3ac0a46fSAndroid Build Coastguard Worker call_args = call_args[1:] 819*3ac0a46fSAndroid Build Coastguard Worker actual_string = self._format_mock_call_signature(*call_args) 820*3ac0a46fSAndroid Build Coastguard Worker return message % (expected_string, actual_string) 821*3ac0a46fSAndroid Build Coastguard Worker 822*3ac0a46fSAndroid Build Coastguard Worker 823*3ac0a46fSAndroid Build Coastguard Worker def assert_called_with(_mock_self, *args, **kwargs): 824*3ac0a46fSAndroid Build Coastguard Worker """assert that the mock was called with the specified arguments. 825*3ac0a46fSAndroid Build Coastguard Worker 826*3ac0a46fSAndroid Build Coastguard Worker Raises an AssertionError if the args and keyword args passed in are 827*3ac0a46fSAndroid Build Coastguard Worker different to the last call to the mock.""" 828*3ac0a46fSAndroid Build Coastguard Worker self = _mock_self 829*3ac0a46fSAndroid Build Coastguard Worker if self.call_args is None: 830*3ac0a46fSAndroid Build Coastguard Worker expected = self._format_mock_call_signature(args, kwargs) 831*3ac0a46fSAndroid Build Coastguard Worker raise AssertionError('Expected call: %s\nNot called' % (expected,)) 832*3ac0a46fSAndroid Build Coastguard Worker 833*3ac0a46fSAndroid Build Coastguard Worker if self.call_args != (args, kwargs): 834*3ac0a46fSAndroid Build Coastguard Worker msg = self._format_mock_failure_message(args, kwargs) 835*3ac0a46fSAndroid Build Coastguard Worker raise AssertionError(msg) 836*3ac0a46fSAndroid Build Coastguard Worker 837*3ac0a46fSAndroid Build Coastguard Worker 838*3ac0a46fSAndroid Build Coastguard Worker def assert_called_once_with(_mock_self, *args, **kwargs): 839*3ac0a46fSAndroid Build Coastguard Worker """assert that the mock was called exactly once and with the specified 840*3ac0a46fSAndroid Build Coastguard Worker arguments.""" 841*3ac0a46fSAndroid Build Coastguard Worker self = _mock_self 842*3ac0a46fSAndroid Build Coastguard Worker if not self.call_count == 1: 843*3ac0a46fSAndroid Build Coastguard Worker msg = ("Expected to be called once. Called %s times." % 844*3ac0a46fSAndroid Build Coastguard Worker self.call_count) 845*3ac0a46fSAndroid Build Coastguard Worker raise AssertionError(msg) 846*3ac0a46fSAndroid Build Coastguard Worker return self.assert_called_with(*args, **kwargs) 847*3ac0a46fSAndroid Build Coastguard Worker 848*3ac0a46fSAndroid Build Coastguard Worker 849*3ac0a46fSAndroid Build Coastguard Worker def assert_has_calls(self, calls, any_order=False): 850*3ac0a46fSAndroid Build Coastguard Worker """assert the mock has been called with the specified calls. 851*3ac0a46fSAndroid Build Coastguard Worker The `mock_calls` list is checked for the calls. 852*3ac0a46fSAndroid Build Coastguard Worker 853*3ac0a46fSAndroid Build Coastguard Worker If `any_order` is False (the default) then the calls must be 854*3ac0a46fSAndroid Build Coastguard Worker sequential. There can be extra calls before or after the 855*3ac0a46fSAndroid Build Coastguard Worker specified calls. 856*3ac0a46fSAndroid Build Coastguard Worker 857*3ac0a46fSAndroid Build Coastguard Worker If `any_order` is True then the calls can be in any order, but 858*3ac0a46fSAndroid Build Coastguard Worker they must all appear in `mock_calls`.""" 859*3ac0a46fSAndroid Build Coastguard Worker if not any_order: 860*3ac0a46fSAndroid Build Coastguard Worker if calls not in self.mock_calls: 861*3ac0a46fSAndroid Build Coastguard Worker raise AssertionError( 862*3ac0a46fSAndroid Build Coastguard Worker 'Calls not found.\nExpected: %r\n' 863*3ac0a46fSAndroid Build Coastguard Worker 'Actual: %r' % (calls, self.mock_calls) 864*3ac0a46fSAndroid Build Coastguard Worker ) 865*3ac0a46fSAndroid Build Coastguard Worker return 866*3ac0a46fSAndroid Build Coastguard Worker 867*3ac0a46fSAndroid Build Coastguard Worker all_calls = list(self.mock_calls) 868*3ac0a46fSAndroid Build Coastguard Worker 869*3ac0a46fSAndroid Build Coastguard Worker not_found = [] 870*3ac0a46fSAndroid Build Coastguard Worker for kall in calls: 871*3ac0a46fSAndroid Build Coastguard Worker try: 872*3ac0a46fSAndroid Build Coastguard Worker all_calls.remove(kall) 873*3ac0a46fSAndroid Build Coastguard Worker except ValueError: 874*3ac0a46fSAndroid Build Coastguard Worker not_found.append(kall) 875*3ac0a46fSAndroid Build Coastguard Worker if not_found: 876*3ac0a46fSAndroid Build Coastguard Worker raise AssertionError( 877*3ac0a46fSAndroid Build Coastguard Worker '%r not all found in call list' % (tuple(not_found),) 878*3ac0a46fSAndroid Build Coastguard Worker ) 879*3ac0a46fSAndroid Build Coastguard Worker 880*3ac0a46fSAndroid Build Coastguard Worker 881*3ac0a46fSAndroid Build Coastguard Worker def assert_any_call(self, *args, **kwargs): 882*3ac0a46fSAndroid Build Coastguard Worker """assert the mock has been called with the specified arguments. 883*3ac0a46fSAndroid Build Coastguard Worker 884*3ac0a46fSAndroid Build Coastguard Worker The assert passes if the mock has *ever* been called, unlike 885*3ac0a46fSAndroid Build Coastguard Worker `assert_called_with` and `assert_called_once_with` that only pass if 886*3ac0a46fSAndroid Build Coastguard Worker the call is the most recent one.""" 887*3ac0a46fSAndroid Build Coastguard Worker kall = call(*args, **kwargs) 888*3ac0a46fSAndroid Build Coastguard Worker if kall not in self.call_args_list: 889*3ac0a46fSAndroid Build Coastguard Worker expected_string = self._format_mock_call_signature(args, kwargs) 890*3ac0a46fSAndroid Build Coastguard Worker raise AssertionError( 891*3ac0a46fSAndroid Build Coastguard Worker '%s call not found' % expected_string 892*3ac0a46fSAndroid Build Coastguard Worker ) 893*3ac0a46fSAndroid Build Coastguard Worker 894*3ac0a46fSAndroid Build Coastguard Worker 895*3ac0a46fSAndroid Build Coastguard Worker def _get_child_mock(self, **kw): 896*3ac0a46fSAndroid Build Coastguard Worker """Create the child mocks for attributes and return value. 897*3ac0a46fSAndroid Build Coastguard Worker By default child mocks will be the same type as the parent. 898*3ac0a46fSAndroid Build Coastguard Worker Subclasses of Mock may want to override this to customize the way 899*3ac0a46fSAndroid Build Coastguard Worker child mocks are made. 900*3ac0a46fSAndroid Build Coastguard Worker 901*3ac0a46fSAndroid Build Coastguard Worker For non-callable mocks the callable variant will be used (rather than 902*3ac0a46fSAndroid Build Coastguard Worker any custom subclass).""" 903*3ac0a46fSAndroid Build Coastguard Worker _type = type(self) 904*3ac0a46fSAndroid Build Coastguard Worker if not issubclass(_type, CallableMixin): 905*3ac0a46fSAndroid Build Coastguard Worker if issubclass(_type, NonCallableMagicMock): 906*3ac0a46fSAndroid Build Coastguard Worker klass = MagicMock 907*3ac0a46fSAndroid Build Coastguard Worker elif issubclass(_type, NonCallableMock) : 908*3ac0a46fSAndroid Build Coastguard Worker klass = Mock 909*3ac0a46fSAndroid Build Coastguard Worker else: 910*3ac0a46fSAndroid Build Coastguard Worker klass = _type.__mro__[1] 911*3ac0a46fSAndroid Build Coastguard Worker return klass(**kw) 912*3ac0a46fSAndroid Build Coastguard Worker 913*3ac0a46fSAndroid Build Coastguard Worker 914*3ac0a46fSAndroid Build Coastguard Worker 915*3ac0a46fSAndroid Build Coastguard Workerdef _try_iter(obj): 916*3ac0a46fSAndroid Build Coastguard Worker if obj is None: 917*3ac0a46fSAndroid Build Coastguard Worker return obj 918*3ac0a46fSAndroid Build Coastguard Worker if _is_exception(obj): 919*3ac0a46fSAndroid Build Coastguard Worker return obj 920*3ac0a46fSAndroid Build Coastguard Worker if _callable(obj): 921*3ac0a46fSAndroid Build Coastguard Worker return obj 922*3ac0a46fSAndroid Build Coastguard Worker try: 923*3ac0a46fSAndroid Build Coastguard Worker return iter(obj) 924*3ac0a46fSAndroid Build Coastguard Worker except TypeError: 925*3ac0a46fSAndroid Build Coastguard Worker # XXXX backwards compatibility 926*3ac0a46fSAndroid Build Coastguard Worker # but this will blow up on first call - so maybe we should fail early? 927*3ac0a46fSAndroid Build Coastguard Worker return obj 928*3ac0a46fSAndroid Build Coastguard Worker 929*3ac0a46fSAndroid Build Coastguard Worker 930*3ac0a46fSAndroid Build Coastguard Worker 931*3ac0a46fSAndroid Build Coastguard Workerclass CallableMixin(Base): 932*3ac0a46fSAndroid Build Coastguard Worker 933*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, spec=None, side_effect=None, return_value=DEFAULT, 934*3ac0a46fSAndroid Build Coastguard Worker wraps=None, name=None, spec_set=None, parent=None, 935*3ac0a46fSAndroid Build Coastguard Worker _spec_state=None, _new_name='', _new_parent=None, **kwargs): 936*3ac0a46fSAndroid Build Coastguard Worker self.__dict__['_mock_return_value'] = return_value 937*3ac0a46fSAndroid Build Coastguard Worker 938*3ac0a46fSAndroid Build Coastguard Worker _super(CallableMixin, self).__init__( 939*3ac0a46fSAndroid Build Coastguard Worker spec, wraps, name, spec_set, parent, 940*3ac0a46fSAndroid Build Coastguard Worker _spec_state, _new_name, _new_parent, **kwargs 941*3ac0a46fSAndroid Build Coastguard Worker ) 942*3ac0a46fSAndroid Build Coastguard Worker 943*3ac0a46fSAndroid Build Coastguard Worker self.side_effect = side_effect 944*3ac0a46fSAndroid Build Coastguard Worker 945*3ac0a46fSAndroid Build Coastguard Worker 946*3ac0a46fSAndroid Build Coastguard Worker def _mock_check_sig(self, *args, **kwargs): 947*3ac0a46fSAndroid Build Coastguard Worker # stub method that can be replaced with one with a specific signature 948*3ac0a46fSAndroid Build Coastguard Worker pass 949*3ac0a46fSAndroid Build Coastguard Worker 950*3ac0a46fSAndroid Build Coastguard Worker 951*3ac0a46fSAndroid Build Coastguard Worker def __call__(_mock_self, *args, **kwargs): 952*3ac0a46fSAndroid Build Coastguard Worker # can't use self in-case a function / method we are mocking uses self 953*3ac0a46fSAndroid Build Coastguard Worker # in the signature 954*3ac0a46fSAndroid Build Coastguard Worker _mock_self._mock_check_sig(*args, **kwargs) 955*3ac0a46fSAndroid Build Coastguard Worker return _mock_self._mock_call(*args, **kwargs) 956*3ac0a46fSAndroid Build Coastguard Worker 957*3ac0a46fSAndroid Build Coastguard Worker 958*3ac0a46fSAndroid Build Coastguard Worker def _mock_call(_mock_self, *args, **kwargs): 959*3ac0a46fSAndroid Build Coastguard Worker self = _mock_self 960*3ac0a46fSAndroid Build Coastguard Worker self.called = True 961*3ac0a46fSAndroid Build Coastguard Worker self.call_count += 1 962*3ac0a46fSAndroid Build Coastguard Worker self.call_args = _Call((args, kwargs), two=True) 963*3ac0a46fSAndroid Build Coastguard Worker self.call_args_list.append(_Call((args, kwargs), two=True)) 964*3ac0a46fSAndroid Build Coastguard Worker 965*3ac0a46fSAndroid Build Coastguard Worker _new_name = self._mock_new_name 966*3ac0a46fSAndroid Build Coastguard Worker _new_parent = self._mock_new_parent 967*3ac0a46fSAndroid Build Coastguard Worker self.mock_calls.append(_Call(('', args, kwargs))) 968*3ac0a46fSAndroid Build Coastguard Worker 969*3ac0a46fSAndroid Build Coastguard Worker seen = set() 970*3ac0a46fSAndroid Build Coastguard Worker skip_next_dot = _new_name == '()' 971*3ac0a46fSAndroid Build Coastguard Worker do_method_calls = self._mock_parent is not None 972*3ac0a46fSAndroid Build Coastguard Worker name = self._mock_name 973*3ac0a46fSAndroid Build Coastguard Worker while _new_parent is not None: 974*3ac0a46fSAndroid Build Coastguard Worker this_mock_call = _Call((_new_name, args, kwargs)) 975*3ac0a46fSAndroid Build Coastguard Worker if _new_parent._mock_new_name: 976*3ac0a46fSAndroid Build Coastguard Worker dot = '.' 977*3ac0a46fSAndroid Build Coastguard Worker if skip_next_dot: 978*3ac0a46fSAndroid Build Coastguard Worker dot = '' 979*3ac0a46fSAndroid Build Coastguard Worker 980*3ac0a46fSAndroid Build Coastguard Worker skip_next_dot = False 981*3ac0a46fSAndroid Build Coastguard Worker if _new_parent._mock_new_name == '()': 982*3ac0a46fSAndroid Build Coastguard Worker skip_next_dot = True 983*3ac0a46fSAndroid Build Coastguard Worker 984*3ac0a46fSAndroid Build Coastguard Worker _new_name = _new_parent._mock_new_name + dot + _new_name 985*3ac0a46fSAndroid Build Coastguard Worker 986*3ac0a46fSAndroid Build Coastguard Worker if do_method_calls: 987*3ac0a46fSAndroid Build Coastguard Worker if _new_name == name: 988*3ac0a46fSAndroid Build Coastguard Worker this_method_call = this_mock_call 989*3ac0a46fSAndroid Build Coastguard Worker else: 990*3ac0a46fSAndroid Build Coastguard Worker this_method_call = _Call((name, args, kwargs)) 991*3ac0a46fSAndroid Build Coastguard Worker _new_parent.method_calls.append(this_method_call) 992*3ac0a46fSAndroid Build Coastguard Worker 993*3ac0a46fSAndroid Build Coastguard Worker do_method_calls = _new_parent._mock_parent is not None 994*3ac0a46fSAndroid Build Coastguard Worker if do_method_calls: 995*3ac0a46fSAndroid Build Coastguard Worker name = _new_parent._mock_name + '.' + name 996*3ac0a46fSAndroid Build Coastguard Worker 997*3ac0a46fSAndroid Build Coastguard Worker _new_parent.mock_calls.append(this_mock_call) 998*3ac0a46fSAndroid Build Coastguard Worker _new_parent = _new_parent._mock_new_parent 999*3ac0a46fSAndroid Build Coastguard Worker 1000*3ac0a46fSAndroid Build Coastguard Worker # use ids here so as not to call __hash__ on the mocks 1001*3ac0a46fSAndroid Build Coastguard Worker _new_parent_id = id(_new_parent) 1002*3ac0a46fSAndroid Build Coastguard Worker if _new_parent_id in seen: 1003*3ac0a46fSAndroid Build Coastguard Worker break 1004*3ac0a46fSAndroid Build Coastguard Worker seen.add(_new_parent_id) 1005*3ac0a46fSAndroid Build Coastguard Worker 1006*3ac0a46fSAndroid Build Coastguard Worker ret_val = DEFAULT 1007*3ac0a46fSAndroid Build Coastguard Worker effect = self.side_effect 1008*3ac0a46fSAndroid Build Coastguard Worker if effect is not None: 1009*3ac0a46fSAndroid Build Coastguard Worker if _is_exception(effect): 1010*3ac0a46fSAndroid Build Coastguard Worker raise effect 1011*3ac0a46fSAndroid Build Coastguard Worker 1012*3ac0a46fSAndroid Build Coastguard Worker if not _callable(effect): 1013*3ac0a46fSAndroid Build Coastguard Worker result = next(effect) 1014*3ac0a46fSAndroid Build Coastguard Worker if _is_exception(result): 1015*3ac0a46fSAndroid Build Coastguard Worker raise result 1016*3ac0a46fSAndroid Build Coastguard Worker return result 1017*3ac0a46fSAndroid Build Coastguard Worker 1018*3ac0a46fSAndroid Build Coastguard Worker ret_val = effect(*args, **kwargs) 1019*3ac0a46fSAndroid Build Coastguard Worker if ret_val is DEFAULT: 1020*3ac0a46fSAndroid Build Coastguard Worker ret_val = self.return_value 1021*3ac0a46fSAndroid Build Coastguard Worker 1022*3ac0a46fSAndroid Build Coastguard Worker if (self._mock_wraps is not None and 1023*3ac0a46fSAndroid Build Coastguard Worker self._mock_return_value is DEFAULT): 1024*3ac0a46fSAndroid Build Coastguard Worker return self._mock_wraps(*args, **kwargs) 1025*3ac0a46fSAndroid Build Coastguard Worker if ret_val is DEFAULT: 1026*3ac0a46fSAndroid Build Coastguard Worker ret_val = self.return_value 1027*3ac0a46fSAndroid Build Coastguard Worker return ret_val 1028*3ac0a46fSAndroid Build Coastguard Worker 1029*3ac0a46fSAndroid Build Coastguard Worker 1030*3ac0a46fSAndroid Build Coastguard Worker 1031*3ac0a46fSAndroid Build Coastguard Workerclass Mock(CallableMixin, NonCallableMock): 1032*3ac0a46fSAndroid Build Coastguard Worker """ 1033*3ac0a46fSAndroid Build Coastguard Worker Create a new `Mock` object. `Mock` takes several optional arguments 1034*3ac0a46fSAndroid Build Coastguard Worker that specify the behaviour of the Mock object: 1035*3ac0a46fSAndroid Build Coastguard Worker 1036*3ac0a46fSAndroid Build Coastguard Worker * `spec`: This can be either a list of strings or an existing object (a 1037*3ac0a46fSAndroid Build Coastguard Worker class or instance) that acts as the specification for the mock object. If 1038*3ac0a46fSAndroid Build Coastguard Worker you pass in an object then a list of strings is formed by calling dir on 1039*3ac0a46fSAndroid Build Coastguard Worker the object (excluding unsupported magic attributes and methods). Accessing 1040*3ac0a46fSAndroid Build Coastguard Worker any attribute not in this list will raise an `AttributeError`. 1041*3ac0a46fSAndroid Build Coastguard Worker 1042*3ac0a46fSAndroid Build Coastguard Worker If `spec` is an object (rather than a list of strings) then 1043*3ac0a46fSAndroid Build Coastguard Worker `mock.__class__` returns the class of the spec object. This allows mocks 1044*3ac0a46fSAndroid Build Coastguard Worker to pass `isinstance` tests. 1045*3ac0a46fSAndroid Build Coastguard Worker 1046*3ac0a46fSAndroid Build Coastguard Worker * `spec_set`: A stricter variant of `spec`. If used, attempting to *set* 1047*3ac0a46fSAndroid Build Coastguard Worker or get an attribute on the mock that isn't on the object passed as 1048*3ac0a46fSAndroid Build Coastguard Worker `spec_set` will raise an `AttributeError`. 1049*3ac0a46fSAndroid Build Coastguard Worker 1050*3ac0a46fSAndroid Build Coastguard Worker * `side_effect`: A function to be called whenever the Mock is called. See 1051*3ac0a46fSAndroid Build Coastguard Worker the `side_effect` attribute. Useful for raising exceptions or 1052*3ac0a46fSAndroid Build Coastguard Worker dynamically changing return values. The function is called with the same 1053*3ac0a46fSAndroid Build Coastguard Worker arguments as the mock, and unless it returns `DEFAULT`, the return 1054*3ac0a46fSAndroid Build Coastguard Worker value of this function is used as the return value. 1055*3ac0a46fSAndroid Build Coastguard Worker 1056*3ac0a46fSAndroid Build Coastguard Worker Alternatively `side_effect` can be an exception class or instance. In 1057*3ac0a46fSAndroid Build Coastguard Worker this case the exception will be raised when the mock is called. 1058*3ac0a46fSAndroid Build Coastguard Worker 1059*3ac0a46fSAndroid Build Coastguard Worker If `side_effect` is an iterable then each call to the mock will return 1060*3ac0a46fSAndroid Build Coastguard Worker the next value from the iterable. If any of the members of the iterable 1061*3ac0a46fSAndroid Build Coastguard Worker are exceptions they will be raised instead of returned. 1062*3ac0a46fSAndroid Build Coastguard Worker 1063*3ac0a46fSAndroid Build Coastguard Worker * `return_value`: The value returned when the mock is called. By default 1064*3ac0a46fSAndroid Build Coastguard Worker this is a new Mock (created on first access). See the 1065*3ac0a46fSAndroid Build Coastguard Worker `return_value` attribute. 1066*3ac0a46fSAndroid Build Coastguard Worker 1067*3ac0a46fSAndroid Build Coastguard Worker * `wraps`: Item for the mock object to wrap. If `wraps` is not None then 1068*3ac0a46fSAndroid Build Coastguard Worker calling the Mock will pass the call through to the wrapped object 1069*3ac0a46fSAndroid Build Coastguard Worker (returning the real result). Attribute access on the mock will return a 1070*3ac0a46fSAndroid Build Coastguard Worker Mock object that wraps the corresponding attribute of the wrapped object 1071*3ac0a46fSAndroid Build Coastguard Worker (so attempting to access an attribute that doesn't exist will raise an 1072*3ac0a46fSAndroid Build Coastguard Worker `AttributeError`). 1073*3ac0a46fSAndroid Build Coastguard Worker 1074*3ac0a46fSAndroid Build Coastguard Worker If the mock has an explicit `return_value` set then calls are not passed 1075*3ac0a46fSAndroid Build Coastguard Worker to the wrapped object and the `return_value` is returned instead. 1076*3ac0a46fSAndroid Build Coastguard Worker 1077*3ac0a46fSAndroid Build Coastguard Worker * `name`: If the mock has a name then it will be used in the repr of the 1078*3ac0a46fSAndroid Build Coastguard Worker mock. This can be useful for debugging. The name is propagated to child 1079*3ac0a46fSAndroid Build Coastguard Worker mocks. 1080*3ac0a46fSAndroid Build Coastguard Worker 1081*3ac0a46fSAndroid Build Coastguard Worker Mocks can also be called with arbitrary keyword arguments. These will be 1082*3ac0a46fSAndroid Build Coastguard Worker used to set attributes on the mock after it is created. 1083*3ac0a46fSAndroid Build Coastguard Worker """ 1084*3ac0a46fSAndroid Build Coastguard Worker 1085*3ac0a46fSAndroid Build Coastguard Worker 1086*3ac0a46fSAndroid Build Coastguard Worker 1087*3ac0a46fSAndroid Build Coastguard Workerdef _dot_lookup(thing, comp, import_path): 1088*3ac0a46fSAndroid Build Coastguard Worker try: 1089*3ac0a46fSAndroid Build Coastguard Worker return getattr(thing, comp) 1090*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 1091*3ac0a46fSAndroid Build Coastguard Worker __import__(import_path) 1092*3ac0a46fSAndroid Build Coastguard Worker return getattr(thing, comp) 1093*3ac0a46fSAndroid Build Coastguard Worker 1094*3ac0a46fSAndroid Build Coastguard Worker 1095*3ac0a46fSAndroid Build Coastguard Workerdef _importer(target): 1096*3ac0a46fSAndroid Build Coastguard Worker components = target.split('.') 1097*3ac0a46fSAndroid Build Coastguard Worker import_path = components.pop(0) 1098*3ac0a46fSAndroid Build Coastguard Worker thing = __import__(import_path) 1099*3ac0a46fSAndroid Build Coastguard Worker 1100*3ac0a46fSAndroid Build Coastguard Worker for comp in components: 1101*3ac0a46fSAndroid Build Coastguard Worker import_path += ".%s" % comp 1102*3ac0a46fSAndroid Build Coastguard Worker thing = _dot_lookup(thing, comp, import_path) 1103*3ac0a46fSAndroid Build Coastguard Worker return thing 1104*3ac0a46fSAndroid Build Coastguard Worker 1105*3ac0a46fSAndroid Build Coastguard Worker 1106*3ac0a46fSAndroid Build Coastguard Workerdef _is_started(patcher): 1107*3ac0a46fSAndroid Build Coastguard Worker # XXXX horrible 1108*3ac0a46fSAndroid Build Coastguard Worker return hasattr(patcher, 'is_local') 1109*3ac0a46fSAndroid Build Coastguard Worker 1110*3ac0a46fSAndroid Build Coastguard Worker 1111*3ac0a46fSAndroid Build Coastguard Workerclass _patch(object): 1112*3ac0a46fSAndroid Build Coastguard Worker 1113*3ac0a46fSAndroid Build Coastguard Worker attribute_name = None 1114*3ac0a46fSAndroid Build Coastguard Worker _active_patches = set() 1115*3ac0a46fSAndroid Build Coastguard Worker 1116*3ac0a46fSAndroid Build Coastguard Worker def __init__( 1117*3ac0a46fSAndroid Build Coastguard Worker self, getter, attribute, new, spec, create, 1118*3ac0a46fSAndroid Build Coastguard Worker spec_set, autospec, new_callable, kwargs 1119*3ac0a46fSAndroid Build Coastguard Worker ): 1120*3ac0a46fSAndroid Build Coastguard Worker if new_callable is not None: 1121*3ac0a46fSAndroid Build Coastguard Worker if new is not DEFAULT: 1122*3ac0a46fSAndroid Build Coastguard Worker raise ValueError( 1123*3ac0a46fSAndroid Build Coastguard Worker "Cannot use 'new' and 'new_callable' together" 1124*3ac0a46fSAndroid Build Coastguard Worker ) 1125*3ac0a46fSAndroid Build Coastguard Worker if autospec is not None: 1126*3ac0a46fSAndroid Build Coastguard Worker raise ValueError( 1127*3ac0a46fSAndroid Build Coastguard Worker "Cannot use 'autospec' and 'new_callable' together" 1128*3ac0a46fSAndroid Build Coastguard Worker ) 1129*3ac0a46fSAndroid Build Coastguard Worker 1130*3ac0a46fSAndroid Build Coastguard Worker self.getter = getter 1131*3ac0a46fSAndroid Build Coastguard Worker self.attribute = attribute 1132*3ac0a46fSAndroid Build Coastguard Worker self.new = new 1133*3ac0a46fSAndroid Build Coastguard Worker self.new_callable = new_callable 1134*3ac0a46fSAndroid Build Coastguard Worker self.spec = spec 1135*3ac0a46fSAndroid Build Coastguard Worker self.create = create 1136*3ac0a46fSAndroid Build Coastguard Worker self.has_local = False 1137*3ac0a46fSAndroid Build Coastguard Worker self.spec_set = spec_set 1138*3ac0a46fSAndroid Build Coastguard Worker self.autospec = autospec 1139*3ac0a46fSAndroid Build Coastguard Worker self.kwargs = kwargs 1140*3ac0a46fSAndroid Build Coastguard Worker self.additional_patchers = [] 1141*3ac0a46fSAndroid Build Coastguard Worker 1142*3ac0a46fSAndroid Build Coastguard Worker 1143*3ac0a46fSAndroid Build Coastguard Worker def copy(self): 1144*3ac0a46fSAndroid Build Coastguard Worker patcher = _patch( 1145*3ac0a46fSAndroid Build Coastguard Worker self.getter, self.attribute, self.new, self.spec, 1146*3ac0a46fSAndroid Build Coastguard Worker self.create, self.spec_set, 1147*3ac0a46fSAndroid Build Coastguard Worker self.autospec, self.new_callable, self.kwargs 1148*3ac0a46fSAndroid Build Coastguard Worker ) 1149*3ac0a46fSAndroid Build Coastguard Worker patcher.attribute_name = self.attribute_name 1150*3ac0a46fSAndroid Build Coastguard Worker patcher.additional_patchers = [ 1151*3ac0a46fSAndroid Build Coastguard Worker p.copy() for p in self.additional_patchers 1152*3ac0a46fSAndroid Build Coastguard Worker ] 1153*3ac0a46fSAndroid Build Coastguard Worker return patcher 1154*3ac0a46fSAndroid Build Coastguard Worker 1155*3ac0a46fSAndroid Build Coastguard Worker 1156*3ac0a46fSAndroid Build Coastguard Worker def __call__(self, func): 1157*3ac0a46fSAndroid Build Coastguard Worker if isinstance(func, ClassTypes): 1158*3ac0a46fSAndroid Build Coastguard Worker return self.decorate_class(func) 1159*3ac0a46fSAndroid Build Coastguard Worker return self.decorate_callable(func) 1160*3ac0a46fSAndroid Build Coastguard Worker 1161*3ac0a46fSAndroid Build Coastguard Worker 1162*3ac0a46fSAndroid Build Coastguard Worker def decorate_class(self, klass): 1163*3ac0a46fSAndroid Build Coastguard Worker for attr in dir(klass): 1164*3ac0a46fSAndroid Build Coastguard Worker if not attr.startswith(patch.TEST_PREFIX): 1165*3ac0a46fSAndroid Build Coastguard Worker continue 1166*3ac0a46fSAndroid Build Coastguard Worker 1167*3ac0a46fSAndroid Build Coastguard Worker attr_value = getattr(klass, attr) 1168*3ac0a46fSAndroid Build Coastguard Worker if not hasattr(attr_value, "__call__"): 1169*3ac0a46fSAndroid Build Coastguard Worker continue 1170*3ac0a46fSAndroid Build Coastguard Worker 1171*3ac0a46fSAndroid Build Coastguard Worker patcher = self.copy() 1172*3ac0a46fSAndroid Build Coastguard Worker setattr(klass, attr, patcher(attr_value)) 1173*3ac0a46fSAndroid Build Coastguard Worker return klass 1174*3ac0a46fSAndroid Build Coastguard Worker 1175*3ac0a46fSAndroid Build Coastguard Worker 1176*3ac0a46fSAndroid Build Coastguard Worker def decorate_callable(self, func): 1177*3ac0a46fSAndroid Build Coastguard Worker if hasattr(func, 'patchings'): 1178*3ac0a46fSAndroid Build Coastguard Worker func.patchings.append(self) 1179*3ac0a46fSAndroid Build Coastguard Worker return func 1180*3ac0a46fSAndroid Build Coastguard Worker 1181*3ac0a46fSAndroid Build Coastguard Worker @wraps(func) 1182*3ac0a46fSAndroid Build Coastguard Worker def patched(*args, **keywargs): 1183*3ac0a46fSAndroid Build Coastguard Worker # don't use a with here (backwards compatability with Python 2.4) 1184*3ac0a46fSAndroid Build Coastguard Worker extra_args = [] 1185*3ac0a46fSAndroid Build Coastguard Worker entered_patchers = [] 1186*3ac0a46fSAndroid Build Coastguard Worker 1187*3ac0a46fSAndroid Build Coastguard Worker # can't use try...except...finally because of Python 2.4 1188*3ac0a46fSAndroid Build Coastguard Worker # compatibility 1189*3ac0a46fSAndroid Build Coastguard Worker exc_info = tuple() 1190*3ac0a46fSAndroid Build Coastguard Worker try: 1191*3ac0a46fSAndroid Build Coastguard Worker try: 1192*3ac0a46fSAndroid Build Coastguard Worker for patching in patched.patchings: 1193*3ac0a46fSAndroid Build Coastguard Worker arg = patching.__enter__() 1194*3ac0a46fSAndroid Build Coastguard Worker entered_patchers.append(patching) 1195*3ac0a46fSAndroid Build Coastguard Worker if patching.attribute_name is not None: 1196*3ac0a46fSAndroid Build Coastguard Worker keywargs.update(arg) 1197*3ac0a46fSAndroid Build Coastguard Worker elif patching.new is DEFAULT: 1198*3ac0a46fSAndroid Build Coastguard Worker extra_args.append(arg) 1199*3ac0a46fSAndroid Build Coastguard Worker 1200*3ac0a46fSAndroid Build Coastguard Worker args += tuple(extra_args) 1201*3ac0a46fSAndroid Build Coastguard Worker return func(*args, **keywargs) 1202*3ac0a46fSAndroid Build Coastguard Worker except: 1203*3ac0a46fSAndroid Build Coastguard Worker if (patching not in entered_patchers and 1204*3ac0a46fSAndroid Build Coastguard Worker _is_started(patching)): 1205*3ac0a46fSAndroid Build Coastguard Worker # the patcher may have been started, but an exception 1206*3ac0a46fSAndroid Build Coastguard Worker # raised whilst entering one of its additional_patchers 1207*3ac0a46fSAndroid Build Coastguard Worker entered_patchers.append(patching) 1208*3ac0a46fSAndroid Build Coastguard Worker # Pass the exception to __exit__ 1209*3ac0a46fSAndroid Build Coastguard Worker exc_info = sys.exc_info() 1210*3ac0a46fSAndroid Build Coastguard Worker # re-raise the exception 1211*3ac0a46fSAndroid Build Coastguard Worker raise 1212*3ac0a46fSAndroid Build Coastguard Worker finally: 1213*3ac0a46fSAndroid Build Coastguard Worker for patching in reversed(entered_patchers): 1214*3ac0a46fSAndroid Build Coastguard Worker patching.__exit__(*exc_info) 1215*3ac0a46fSAndroid Build Coastguard Worker 1216*3ac0a46fSAndroid Build Coastguard Worker patched.patchings = [self] 1217*3ac0a46fSAndroid Build Coastguard Worker if hasattr(func, 'func_code'): 1218*3ac0a46fSAndroid Build Coastguard Worker # not in Python 3 1219*3ac0a46fSAndroid Build Coastguard Worker patched.compat_co_firstlineno = getattr( 1220*3ac0a46fSAndroid Build Coastguard Worker func, "compat_co_firstlineno", 1221*3ac0a46fSAndroid Build Coastguard Worker func.func_code.co_firstlineno 1222*3ac0a46fSAndroid Build Coastguard Worker ) 1223*3ac0a46fSAndroid Build Coastguard Worker return patched 1224*3ac0a46fSAndroid Build Coastguard Worker 1225*3ac0a46fSAndroid Build Coastguard Worker 1226*3ac0a46fSAndroid Build Coastguard Worker def get_original(self): 1227*3ac0a46fSAndroid Build Coastguard Worker target = self.getter() 1228*3ac0a46fSAndroid Build Coastguard Worker name = self.attribute 1229*3ac0a46fSAndroid Build Coastguard Worker 1230*3ac0a46fSAndroid Build Coastguard Worker original = DEFAULT 1231*3ac0a46fSAndroid Build Coastguard Worker local = False 1232*3ac0a46fSAndroid Build Coastguard Worker 1233*3ac0a46fSAndroid Build Coastguard Worker try: 1234*3ac0a46fSAndroid Build Coastguard Worker original = target.__dict__[name] 1235*3ac0a46fSAndroid Build Coastguard Worker except (AttributeError, KeyError): 1236*3ac0a46fSAndroid Build Coastguard Worker original = getattr(target, name, DEFAULT) 1237*3ac0a46fSAndroid Build Coastguard Worker else: 1238*3ac0a46fSAndroid Build Coastguard Worker local = True 1239*3ac0a46fSAndroid Build Coastguard Worker 1240*3ac0a46fSAndroid Build Coastguard Worker if not self.create and original is DEFAULT: 1241*3ac0a46fSAndroid Build Coastguard Worker raise AttributeError( 1242*3ac0a46fSAndroid Build Coastguard Worker "%s does not have the attribute %r" % (target, name) 1243*3ac0a46fSAndroid Build Coastguard Worker ) 1244*3ac0a46fSAndroid Build Coastguard Worker return original, local 1245*3ac0a46fSAndroid Build Coastguard Worker 1246*3ac0a46fSAndroid Build Coastguard Worker 1247*3ac0a46fSAndroid Build Coastguard Worker def __enter__(self): 1248*3ac0a46fSAndroid Build Coastguard Worker """Perform the patch.""" 1249*3ac0a46fSAndroid Build Coastguard Worker new, spec, spec_set = self.new, self.spec, self.spec_set 1250*3ac0a46fSAndroid Build Coastguard Worker autospec, kwargs = self.autospec, self.kwargs 1251*3ac0a46fSAndroid Build Coastguard Worker new_callable = self.new_callable 1252*3ac0a46fSAndroid Build Coastguard Worker self.target = self.getter() 1253*3ac0a46fSAndroid Build Coastguard Worker 1254*3ac0a46fSAndroid Build Coastguard Worker # normalise False to None 1255*3ac0a46fSAndroid Build Coastguard Worker if spec is False: 1256*3ac0a46fSAndroid Build Coastguard Worker spec = None 1257*3ac0a46fSAndroid Build Coastguard Worker if spec_set is False: 1258*3ac0a46fSAndroid Build Coastguard Worker spec_set = None 1259*3ac0a46fSAndroid Build Coastguard Worker if autospec is False: 1260*3ac0a46fSAndroid Build Coastguard Worker autospec = None 1261*3ac0a46fSAndroid Build Coastguard Worker 1262*3ac0a46fSAndroid Build Coastguard Worker if spec is not None and autospec is not None: 1263*3ac0a46fSAndroid Build Coastguard Worker raise TypeError("Can't specify spec and autospec") 1264*3ac0a46fSAndroid Build Coastguard Worker if ((spec is not None or autospec is not None) and 1265*3ac0a46fSAndroid Build Coastguard Worker spec_set not in (True, None)): 1266*3ac0a46fSAndroid Build Coastguard Worker raise TypeError("Can't provide explicit spec_set *and* spec or autospec") 1267*3ac0a46fSAndroid Build Coastguard Worker 1268*3ac0a46fSAndroid Build Coastguard Worker original, local = self.get_original() 1269*3ac0a46fSAndroid Build Coastguard Worker 1270*3ac0a46fSAndroid Build Coastguard Worker if new is DEFAULT and autospec is None: 1271*3ac0a46fSAndroid Build Coastguard Worker inherit = False 1272*3ac0a46fSAndroid Build Coastguard Worker if spec is True: 1273*3ac0a46fSAndroid Build Coastguard Worker # set spec to the object we are replacing 1274*3ac0a46fSAndroid Build Coastguard Worker spec = original 1275*3ac0a46fSAndroid Build Coastguard Worker if spec_set is True: 1276*3ac0a46fSAndroid Build Coastguard Worker spec_set = original 1277*3ac0a46fSAndroid Build Coastguard Worker spec = None 1278*3ac0a46fSAndroid Build Coastguard Worker elif spec is not None: 1279*3ac0a46fSAndroid Build Coastguard Worker if spec_set is True: 1280*3ac0a46fSAndroid Build Coastguard Worker spec_set = spec 1281*3ac0a46fSAndroid Build Coastguard Worker spec = None 1282*3ac0a46fSAndroid Build Coastguard Worker elif spec_set is True: 1283*3ac0a46fSAndroid Build Coastguard Worker spec_set = original 1284*3ac0a46fSAndroid Build Coastguard Worker 1285*3ac0a46fSAndroid Build Coastguard Worker if spec is not None or spec_set is not None: 1286*3ac0a46fSAndroid Build Coastguard Worker if original is DEFAULT: 1287*3ac0a46fSAndroid Build Coastguard Worker raise TypeError("Can't use 'spec' with create=True") 1288*3ac0a46fSAndroid Build Coastguard Worker if isinstance(original, ClassTypes): 1289*3ac0a46fSAndroid Build Coastguard Worker # If we're patching out a class and there is a spec 1290*3ac0a46fSAndroid Build Coastguard Worker inherit = True 1291*3ac0a46fSAndroid Build Coastguard Worker 1292*3ac0a46fSAndroid Build Coastguard Worker Klass = MagicMock 1293*3ac0a46fSAndroid Build Coastguard Worker _kwargs = {} 1294*3ac0a46fSAndroid Build Coastguard Worker if new_callable is not None: 1295*3ac0a46fSAndroid Build Coastguard Worker Klass = new_callable 1296*3ac0a46fSAndroid Build Coastguard Worker elif spec is not None or spec_set is not None: 1297*3ac0a46fSAndroid Build Coastguard Worker this_spec = spec 1298*3ac0a46fSAndroid Build Coastguard Worker if spec_set is not None: 1299*3ac0a46fSAndroid Build Coastguard Worker this_spec = spec_set 1300*3ac0a46fSAndroid Build Coastguard Worker if _is_list(this_spec): 1301*3ac0a46fSAndroid Build Coastguard Worker not_callable = '__call__' not in this_spec 1302*3ac0a46fSAndroid Build Coastguard Worker else: 1303*3ac0a46fSAndroid Build Coastguard Worker not_callable = not _callable(this_spec) 1304*3ac0a46fSAndroid Build Coastguard Worker if not_callable: 1305*3ac0a46fSAndroid Build Coastguard Worker Klass = NonCallableMagicMock 1306*3ac0a46fSAndroid Build Coastguard Worker 1307*3ac0a46fSAndroid Build Coastguard Worker if spec is not None: 1308*3ac0a46fSAndroid Build Coastguard Worker _kwargs['spec'] = spec 1309*3ac0a46fSAndroid Build Coastguard Worker if spec_set is not None: 1310*3ac0a46fSAndroid Build Coastguard Worker _kwargs['spec_set'] = spec_set 1311*3ac0a46fSAndroid Build Coastguard Worker 1312*3ac0a46fSAndroid Build Coastguard Worker # add a name to mocks 1313*3ac0a46fSAndroid Build Coastguard Worker if (isinstance(Klass, type) and 1314*3ac0a46fSAndroid Build Coastguard Worker issubclass(Klass, NonCallableMock) and self.attribute): 1315*3ac0a46fSAndroid Build Coastguard Worker _kwargs['name'] = self.attribute 1316*3ac0a46fSAndroid Build Coastguard Worker 1317*3ac0a46fSAndroid Build Coastguard Worker _kwargs.update(kwargs) 1318*3ac0a46fSAndroid Build Coastguard Worker new = Klass(**_kwargs) 1319*3ac0a46fSAndroid Build Coastguard Worker 1320*3ac0a46fSAndroid Build Coastguard Worker if inherit and _is_instance_mock(new): 1321*3ac0a46fSAndroid Build Coastguard Worker # we can only tell if the instance should be callable if the 1322*3ac0a46fSAndroid Build Coastguard Worker # spec is not a list 1323*3ac0a46fSAndroid Build Coastguard Worker this_spec = spec 1324*3ac0a46fSAndroid Build Coastguard Worker if spec_set is not None: 1325*3ac0a46fSAndroid Build Coastguard Worker this_spec = spec_set 1326*3ac0a46fSAndroid Build Coastguard Worker if (not _is_list(this_spec) and not 1327*3ac0a46fSAndroid Build Coastguard Worker _instance_callable(this_spec)): 1328*3ac0a46fSAndroid Build Coastguard Worker Klass = NonCallableMagicMock 1329*3ac0a46fSAndroid Build Coastguard Worker 1330*3ac0a46fSAndroid Build Coastguard Worker _kwargs.pop('name') 1331*3ac0a46fSAndroid Build Coastguard Worker new.return_value = Klass(_new_parent=new, _new_name='()', 1332*3ac0a46fSAndroid Build Coastguard Worker **_kwargs) 1333*3ac0a46fSAndroid Build Coastguard Worker elif autospec is not None: 1334*3ac0a46fSAndroid Build Coastguard Worker # spec is ignored, new *must* be default, spec_set is treated 1335*3ac0a46fSAndroid Build Coastguard Worker # as a boolean. Should we check spec is not None and that spec_set 1336*3ac0a46fSAndroid Build Coastguard Worker # is a bool? 1337*3ac0a46fSAndroid Build Coastguard Worker if new is not DEFAULT: 1338*3ac0a46fSAndroid Build Coastguard Worker raise TypeError( 1339*3ac0a46fSAndroid Build Coastguard Worker "autospec creates the mock for you. Can't specify " 1340*3ac0a46fSAndroid Build Coastguard Worker "autospec and new." 1341*3ac0a46fSAndroid Build Coastguard Worker ) 1342*3ac0a46fSAndroid Build Coastguard Worker if original is DEFAULT: 1343*3ac0a46fSAndroid Build Coastguard Worker raise TypeError("Can't use 'autospec' with create=True") 1344*3ac0a46fSAndroid Build Coastguard Worker spec_set = bool(spec_set) 1345*3ac0a46fSAndroid Build Coastguard Worker if autospec is True: 1346*3ac0a46fSAndroid Build Coastguard Worker autospec = original 1347*3ac0a46fSAndroid Build Coastguard Worker 1348*3ac0a46fSAndroid Build Coastguard Worker new = create_autospec(autospec, spec_set=spec_set, 1349*3ac0a46fSAndroid Build Coastguard Worker _name=self.attribute, **kwargs) 1350*3ac0a46fSAndroid Build Coastguard Worker elif kwargs: 1351*3ac0a46fSAndroid Build Coastguard Worker # can't set keyword args when we aren't creating the mock 1352*3ac0a46fSAndroid Build Coastguard Worker # XXXX If new is a Mock we could call new.configure_mock(**kwargs) 1353*3ac0a46fSAndroid Build Coastguard Worker raise TypeError("Can't pass kwargs to a mock we aren't creating") 1354*3ac0a46fSAndroid Build Coastguard Worker 1355*3ac0a46fSAndroid Build Coastguard Worker new_attr = new 1356*3ac0a46fSAndroid Build Coastguard Worker 1357*3ac0a46fSAndroid Build Coastguard Worker self.temp_original = original 1358*3ac0a46fSAndroid Build Coastguard Worker self.is_local = local 1359*3ac0a46fSAndroid Build Coastguard Worker setattr(self.target, self.attribute, new_attr) 1360*3ac0a46fSAndroid Build Coastguard Worker if self.attribute_name is not None: 1361*3ac0a46fSAndroid Build Coastguard Worker extra_args = {} 1362*3ac0a46fSAndroid Build Coastguard Worker if self.new is DEFAULT: 1363*3ac0a46fSAndroid Build Coastguard Worker extra_args[self.attribute_name] = new 1364*3ac0a46fSAndroid Build Coastguard Worker for patching in self.additional_patchers: 1365*3ac0a46fSAndroid Build Coastguard Worker arg = patching.__enter__() 1366*3ac0a46fSAndroid Build Coastguard Worker if patching.new is DEFAULT: 1367*3ac0a46fSAndroid Build Coastguard Worker extra_args.update(arg) 1368*3ac0a46fSAndroid Build Coastguard Worker return extra_args 1369*3ac0a46fSAndroid Build Coastguard Worker 1370*3ac0a46fSAndroid Build Coastguard Worker return new 1371*3ac0a46fSAndroid Build Coastguard Worker 1372*3ac0a46fSAndroid Build Coastguard Worker 1373*3ac0a46fSAndroid Build Coastguard Worker def __exit__(self, *exc_info): 1374*3ac0a46fSAndroid Build Coastguard Worker """Undo the patch.""" 1375*3ac0a46fSAndroid Build Coastguard Worker if not _is_started(self): 1376*3ac0a46fSAndroid Build Coastguard Worker raise RuntimeError('stop called on unstarted patcher') 1377*3ac0a46fSAndroid Build Coastguard Worker 1378*3ac0a46fSAndroid Build Coastguard Worker if self.is_local and self.temp_original is not DEFAULT: 1379*3ac0a46fSAndroid Build Coastguard Worker setattr(self.target, self.attribute, self.temp_original) 1380*3ac0a46fSAndroid Build Coastguard Worker else: 1381*3ac0a46fSAndroid Build Coastguard Worker delattr(self.target, self.attribute) 1382*3ac0a46fSAndroid Build Coastguard Worker if not self.create and not hasattr(self.target, self.attribute): 1383*3ac0a46fSAndroid Build Coastguard Worker # needed for proxy objects like django settings 1384*3ac0a46fSAndroid Build Coastguard Worker setattr(self.target, self.attribute, self.temp_original) 1385*3ac0a46fSAndroid Build Coastguard Worker 1386*3ac0a46fSAndroid Build Coastguard Worker del self.temp_original 1387*3ac0a46fSAndroid Build Coastguard Worker del self.is_local 1388*3ac0a46fSAndroid Build Coastguard Worker del self.target 1389*3ac0a46fSAndroid Build Coastguard Worker for patcher in reversed(self.additional_patchers): 1390*3ac0a46fSAndroid Build Coastguard Worker if _is_started(patcher): 1391*3ac0a46fSAndroid Build Coastguard Worker patcher.__exit__(*exc_info) 1392*3ac0a46fSAndroid Build Coastguard Worker 1393*3ac0a46fSAndroid Build Coastguard Worker 1394*3ac0a46fSAndroid Build Coastguard Worker def start(self): 1395*3ac0a46fSAndroid Build Coastguard Worker """Activate a patch, returning any created mock.""" 1396*3ac0a46fSAndroid Build Coastguard Worker result = self.__enter__() 1397*3ac0a46fSAndroid Build Coastguard Worker self._active_patches.add(self) 1398*3ac0a46fSAndroid Build Coastguard Worker return result 1399*3ac0a46fSAndroid Build Coastguard Worker 1400*3ac0a46fSAndroid Build Coastguard Worker 1401*3ac0a46fSAndroid Build Coastguard Worker def stop(self): 1402*3ac0a46fSAndroid Build Coastguard Worker """Stop an active patch.""" 1403*3ac0a46fSAndroid Build Coastguard Worker self._active_patches.discard(self) 1404*3ac0a46fSAndroid Build Coastguard Worker return self.__exit__() 1405*3ac0a46fSAndroid Build Coastguard Worker 1406*3ac0a46fSAndroid Build Coastguard Worker 1407*3ac0a46fSAndroid Build Coastguard Worker 1408*3ac0a46fSAndroid Build Coastguard Workerdef _get_target(target): 1409*3ac0a46fSAndroid Build Coastguard Worker try: 1410*3ac0a46fSAndroid Build Coastguard Worker target, attribute = target.rsplit('.', 1) 1411*3ac0a46fSAndroid Build Coastguard Worker except (TypeError, ValueError): 1412*3ac0a46fSAndroid Build Coastguard Worker raise TypeError("Need a valid target to patch. You supplied: %r" % 1413*3ac0a46fSAndroid Build Coastguard Worker (target,)) 1414*3ac0a46fSAndroid Build Coastguard Worker getter = lambda: _importer(target) 1415*3ac0a46fSAndroid Build Coastguard Worker return getter, attribute 1416*3ac0a46fSAndroid Build Coastguard Worker 1417*3ac0a46fSAndroid Build Coastguard Worker 1418*3ac0a46fSAndroid Build Coastguard Workerdef _patch_object( 1419*3ac0a46fSAndroid Build Coastguard Worker target, attribute, new=DEFAULT, spec=None, 1420*3ac0a46fSAndroid Build Coastguard Worker create=False, spec_set=None, autospec=None, 1421*3ac0a46fSAndroid Build Coastguard Worker new_callable=None, **kwargs 1422*3ac0a46fSAndroid Build Coastguard Worker ): 1423*3ac0a46fSAndroid Build Coastguard Worker """ 1424*3ac0a46fSAndroid Build Coastguard Worker patch.object(target, attribute, new=DEFAULT, spec=None, create=False, 1425*3ac0a46fSAndroid Build Coastguard Worker spec_set=None, autospec=None, new_callable=None, **kwargs) 1426*3ac0a46fSAndroid Build Coastguard Worker 1427*3ac0a46fSAndroid Build Coastguard Worker patch the named member (`attribute`) on an object (`target`) with a mock 1428*3ac0a46fSAndroid Build Coastguard Worker object. 1429*3ac0a46fSAndroid Build Coastguard Worker 1430*3ac0a46fSAndroid Build Coastguard Worker `patch.object` can be used as a decorator, class decorator or a context 1431*3ac0a46fSAndroid Build Coastguard Worker manager. Arguments `new`, `spec`, `create`, `spec_set`, 1432*3ac0a46fSAndroid Build Coastguard Worker `autospec` and `new_callable` have the same meaning as for `patch`. Like 1433*3ac0a46fSAndroid Build Coastguard Worker `patch`, `patch.object` takes arbitrary keyword arguments for configuring 1434*3ac0a46fSAndroid Build Coastguard Worker the mock object it creates. 1435*3ac0a46fSAndroid Build Coastguard Worker 1436*3ac0a46fSAndroid Build Coastguard Worker When used as a class decorator `patch.object` honours `patch.TEST_PREFIX` 1437*3ac0a46fSAndroid Build Coastguard Worker for choosing which methods to wrap. 1438*3ac0a46fSAndroid Build Coastguard Worker """ 1439*3ac0a46fSAndroid Build Coastguard Worker getter = lambda: target 1440*3ac0a46fSAndroid Build Coastguard Worker return _patch( 1441*3ac0a46fSAndroid Build Coastguard Worker getter, attribute, new, spec, create, 1442*3ac0a46fSAndroid Build Coastguard Worker spec_set, autospec, new_callable, kwargs 1443*3ac0a46fSAndroid Build Coastguard Worker ) 1444*3ac0a46fSAndroid Build Coastguard Worker 1445*3ac0a46fSAndroid Build Coastguard Worker 1446*3ac0a46fSAndroid Build Coastguard Workerdef _patch_multiple(target, spec=None, create=False, spec_set=None, 1447*3ac0a46fSAndroid Build Coastguard Worker autospec=None, new_callable=None, **kwargs): 1448*3ac0a46fSAndroid Build Coastguard Worker """Perform multiple patches in a single call. It takes the object to be 1449*3ac0a46fSAndroid Build Coastguard Worker patched (either as an object or a string to fetch the object by importing) 1450*3ac0a46fSAndroid Build Coastguard Worker and keyword arguments for the patches:: 1451*3ac0a46fSAndroid Build Coastguard Worker 1452*3ac0a46fSAndroid Build Coastguard Worker with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'): 1453*3ac0a46fSAndroid Build Coastguard Worker ... 1454*3ac0a46fSAndroid Build Coastguard Worker 1455*3ac0a46fSAndroid Build Coastguard Worker Use `DEFAULT` as the value if you want `patch.multiple` to create 1456*3ac0a46fSAndroid Build Coastguard Worker mocks for you. In this case the created mocks are passed into a decorated 1457*3ac0a46fSAndroid Build Coastguard Worker function by keyword, and a dictionary is returned when `patch.multiple` is 1458*3ac0a46fSAndroid Build Coastguard Worker used as a context manager. 1459*3ac0a46fSAndroid Build Coastguard Worker 1460*3ac0a46fSAndroid Build Coastguard Worker `patch.multiple` can be used as a decorator, class decorator or a context 1461*3ac0a46fSAndroid Build Coastguard Worker manager. The arguments `spec`, `spec_set`, `create`, 1462*3ac0a46fSAndroid Build Coastguard Worker `autospec` and `new_callable` have the same meaning as for `patch`. These 1463*3ac0a46fSAndroid Build Coastguard Worker arguments will be applied to *all* patches done by `patch.multiple`. 1464*3ac0a46fSAndroid Build Coastguard Worker 1465*3ac0a46fSAndroid Build Coastguard Worker When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX` 1466*3ac0a46fSAndroid Build Coastguard Worker for choosing which methods to wrap. 1467*3ac0a46fSAndroid Build Coastguard Worker """ 1468*3ac0a46fSAndroid Build Coastguard Worker if type(target) in (unicode, str): 1469*3ac0a46fSAndroid Build Coastguard Worker getter = lambda: _importer(target) 1470*3ac0a46fSAndroid Build Coastguard Worker else: 1471*3ac0a46fSAndroid Build Coastguard Worker getter = lambda: target 1472*3ac0a46fSAndroid Build Coastguard Worker 1473*3ac0a46fSAndroid Build Coastguard Worker if not kwargs: 1474*3ac0a46fSAndroid Build Coastguard Worker raise ValueError( 1475*3ac0a46fSAndroid Build Coastguard Worker 'Must supply at least one keyword argument with patch.multiple' 1476*3ac0a46fSAndroid Build Coastguard Worker ) 1477*3ac0a46fSAndroid Build Coastguard Worker # need to wrap in a list for python 3, where items is a view 1478*3ac0a46fSAndroid Build Coastguard Worker items = list(kwargs.items()) 1479*3ac0a46fSAndroid Build Coastguard Worker attribute, new = items[0] 1480*3ac0a46fSAndroid Build Coastguard Worker patcher = _patch( 1481*3ac0a46fSAndroid Build Coastguard Worker getter, attribute, new, spec, create, spec_set, 1482*3ac0a46fSAndroid Build Coastguard Worker autospec, new_callable, {} 1483*3ac0a46fSAndroid Build Coastguard Worker ) 1484*3ac0a46fSAndroid Build Coastguard Worker patcher.attribute_name = attribute 1485*3ac0a46fSAndroid Build Coastguard Worker for attribute, new in items[1:]: 1486*3ac0a46fSAndroid Build Coastguard Worker this_patcher = _patch( 1487*3ac0a46fSAndroid Build Coastguard Worker getter, attribute, new, spec, create, spec_set, 1488*3ac0a46fSAndroid Build Coastguard Worker autospec, new_callable, {} 1489*3ac0a46fSAndroid Build Coastguard Worker ) 1490*3ac0a46fSAndroid Build Coastguard Worker this_patcher.attribute_name = attribute 1491*3ac0a46fSAndroid Build Coastguard Worker patcher.additional_patchers.append(this_patcher) 1492*3ac0a46fSAndroid Build Coastguard Worker return patcher 1493*3ac0a46fSAndroid Build Coastguard Worker 1494*3ac0a46fSAndroid Build Coastguard Worker 1495*3ac0a46fSAndroid Build Coastguard Workerdef patch( 1496*3ac0a46fSAndroid Build Coastguard Worker target, new=DEFAULT, spec=None, create=False, 1497*3ac0a46fSAndroid Build Coastguard Worker spec_set=None, autospec=None, new_callable=None, **kwargs 1498*3ac0a46fSAndroid Build Coastguard Worker ): 1499*3ac0a46fSAndroid Build Coastguard Worker """ 1500*3ac0a46fSAndroid Build Coastguard Worker `patch` acts as a function decorator, class decorator or a context 1501*3ac0a46fSAndroid Build Coastguard Worker manager. Inside the body of the function or with statement, the `target` 1502*3ac0a46fSAndroid Build Coastguard Worker is patched with a `new` object. When the function/with statement exits 1503*3ac0a46fSAndroid Build Coastguard Worker the patch is undone. 1504*3ac0a46fSAndroid Build Coastguard Worker 1505*3ac0a46fSAndroid Build Coastguard Worker If `new` is omitted, then the target is replaced with a 1506*3ac0a46fSAndroid Build Coastguard Worker `MagicMock`. If `patch` is used as a decorator and `new` is 1507*3ac0a46fSAndroid Build Coastguard Worker omitted, the created mock is passed in as an extra argument to the 1508*3ac0a46fSAndroid Build Coastguard Worker decorated function. If `patch` is used as a context manager the created 1509*3ac0a46fSAndroid Build Coastguard Worker mock is returned by the context manager. 1510*3ac0a46fSAndroid Build Coastguard Worker 1511*3ac0a46fSAndroid Build Coastguard Worker `target` should be a string in the form `'package.module.ClassName'`. The 1512*3ac0a46fSAndroid Build Coastguard Worker `target` is imported and the specified object replaced with the `new` 1513*3ac0a46fSAndroid Build Coastguard Worker object, so the `target` must be importable from the environment you are 1514*3ac0a46fSAndroid Build Coastguard Worker calling `patch` from. The target is imported when the decorated function 1515*3ac0a46fSAndroid Build Coastguard Worker is executed, not at decoration time. 1516*3ac0a46fSAndroid Build Coastguard Worker 1517*3ac0a46fSAndroid Build Coastguard Worker The `spec` and `spec_set` keyword arguments are passed to the `MagicMock` 1518*3ac0a46fSAndroid Build Coastguard Worker if patch is creating one for you. 1519*3ac0a46fSAndroid Build Coastguard Worker 1520*3ac0a46fSAndroid Build Coastguard Worker In addition you can pass `spec=True` or `spec_set=True`, which causes 1521*3ac0a46fSAndroid Build Coastguard Worker patch to pass in the object being mocked as the spec/spec_set object. 1522*3ac0a46fSAndroid Build Coastguard Worker 1523*3ac0a46fSAndroid Build Coastguard Worker `new_callable` allows you to specify a different class, or callable object, 1524*3ac0a46fSAndroid Build Coastguard Worker that will be called to create the `new` object. By default `MagicMock` is 1525*3ac0a46fSAndroid Build Coastguard Worker used. 1526*3ac0a46fSAndroid Build Coastguard Worker 1527*3ac0a46fSAndroid Build Coastguard Worker A more powerful form of `spec` is `autospec`. If you set `autospec=True` 1528*3ac0a46fSAndroid Build Coastguard Worker then the mock with be created with a spec from the object being replaced. 1529*3ac0a46fSAndroid Build Coastguard Worker All attributes of the mock will also have the spec of the corresponding 1530*3ac0a46fSAndroid Build Coastguard Worker attribute of the object being replaced. Methods and functions being 1531*3ac0a46fSAndroid Build Coastguard Worker mocked will have their arguments checked and will raise a `TypeError` if 1532*3ac0a46fSAndroid Build Coastguard Worker they are called with the wrong signature. For mocks replacing a class, 1533*3ac0a46fSAndroid Build Coastguard Worker their return value (the 'instance') will have the same spec as the class. 1534*3ac0a46fSAndroid Build Coastguard Worker 1535*3ac0a46fSAndroid Build Coastguard Worker Instead of `autospec=True` you can pass `autospec=some_object` to use an 1536*3ac0a46fSAndroid Build Coastguard Worker arbitrary object as the spec instead of the one being replaced. 1537*3ac0a46fSAndroid Build Coastguard Worker 1538*3ac0a46fSAndroid Build Coastguard Worker By default `patch` will fail to replace attributes that don't exist. If 1539*3ac0a46fSAndroid Build Coastguard Worker you pass in `create=True`, and the attribute doesn't exist, patch will 1540*3ac0a46fSAndroid Build Coastguard Worker create the attribute for you when the patched function is called, and 1541*3ac0a46fSAndroid Build Coastguard Worker delete it again afterwards. This is useful for writing tests against 1542*3ac0a46fSAndroid Build Coastguard Worker attributes that your production code creates at runtime. It is off by by 1543*3ac0a46fSAndroid Build Coastguard Worker default because it can be dangerous. With it switched on you can write 1544*3ac0a46fSAndroid Build Coastguard Worker passing tests against APIs that don't actually exist! 1545*3ac0a46fSAndroid Build Coastguard Worker 1546*3ac0a46fSAndroid Build Coastguard Worker Patch can be used as a `TestCase` class decorator. It works by 1547*3ac0a46fSAndroid Build Coastguard Worker decorating each test method in the class. This reduces the boilerplate 1548*3ac0a46fSAndroid Build Coastguard Worker code when your test methods share a common patchings set. `patch` finds 1549*3ac0a46fSAndroid Build Coastguard Worker tests by looking for method names that start with `patch.TEST_PREFIX`. 1550*3ac0a46fSAndroid Build Coastguard Worker By default this is `test`, which matches the way `unittest` finds tests. 1551*3ac0a46fSAndroid Build Coastguard Worker You can specify an alternative prefix by setting `patch.TEST_PREFIX`. 1552*3ac0a46fSAndroid Build Coastguard Worker 1553*3ac0a46fSAndroid Build Coastguard Worker Patch can be used as a context manager, with the with statement. Here the 1554*3ac0a46fSAndroid Build Coastguard Worker patching applies to the indented block after the with statement. If you 1555*3ac0a46fSAndroid Build Coastguard Worker use "as" then the patched object will be bound to the name after the 1556*3ac0a46fSAndroid Build Coastguard Worker "as"; very useful if `patch` is creating a mock object for you. 1557*3ac0a46fSAndroid Build Coastguard Worker 1558*3ac0a46fSAndroid Build Coastguard Worker `patch` takes arbitrary keyword arguments. These will be passed to 1559*3ac0a46fSAndroid Build Coastguard Worker the `Mock` (or `new_callable`) on construction. 1560*3ac0a46fSAndroid Build Coastguard Worker 1561*3ac0a46fSAndroid Build Coastguard Worker `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are 1562*3ac0a46fSAndroid Build Coastguard Worker available for alternate use-cases. 1563*3ac0a46fSAndroid Build Coastguard Worker """ 1564*3ac0a46fSAndroid Build Coastguard Worker getter, attribute = _get_target(target) 1565*3ac0a46fSAndroid Build Coastguard Worker return _patch( 1566*3ac0a46fSAndroid Build Coastguard Worker getter, attribute, new, spec, create, 1567*3ac0a46fSAndroid Build Coastguard Worker spec_set, autospec, new_callable, kwargs 1568*3ac0a46fSAndroid Build Coastguard Worker ) 1569*3ac0a46fSAndroid Build Coastguard Worker 1570*3ac0a46fSAndroid Build Coastguard Worker 1571*3ac0a46fSAndroid Build Coastguard Workerclass _patch_dict(object): 1572*3ac0a46fSAndroid Build Coastguard Worker """ 1573*3ac0a46fSAndroid Build Coastguard Worker Patch a dictionary, or dictionary like object, and restore the dictionary 1574*3ac0a46fSAndroid Build Coastguard Worker to its original state after the test. 1575*3ac0a46fSAndroid Build Coastguard Worker 1576*3ac0a46fSAndroid Build Coastguard Worker `in_dict` can be a dictionary or a mapping like container. If it is a 1577*3ac0a46fSAndroid Build Coastguard Worker mapping then it must at least support getting, setting and deleting items 1578*3ac0a46fSAndroid Build Coastguard Worker plus iterating over keys. 1579*3ac0a46fSAndroid Build Coastguard Worker 1580*3ac0a46fSAndroid Build Coastguard Worker `in_dict` can also be a string specifying the name of the dictionary, which 1581*3ac0a46fSAndroid Build Coastguard Worker will then be fetched by importing it. 1582*3ac0a46fSAndroid Build Coastguard Worker 1583*3ac0a46fSAndroid Build Coastguard Worker `values` can be a dictionary of values to set in the dictionary. `values` 1584*3ac0a46fSAndroid Build Coastguard Worker can also be an iterable of `(key, value)` pairs. 1585*3ac0a46fSAndroid Build Coastguard Worker 1586*3ac0a46fSAndroid Build Coastguard Worker If `clear` is True then the dictionary will be cleared before the new 1587*3ac0a46fSAndroid Build Coastguard Worker values are set. 1588*3ac0a46fSAndroid Build Coastguard Worker 1589*3ac0a46fSAndroid Build Coastguard Worker `patch.dict` can also be called with arbitrary keyword arguments to set 1590*3ac0a46fSAndroid Build Coastguard Worker values in the dictionary:: 1591*3ac0a46fSAndroid Build Coastguard Worker 1592*3ac0a46fSAndroid Build Coastguard Worker with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()): 1593*3ac0a46fSAndroid Build Coastguard Worker ... 1594*3ac0a46fSAndroid Build Coastguard Worker 1595*3ac0a46fSAndroid Build Coastguard Worker `patch.dict` can be used as a context manager, decorator or class 1596*3ac0a46fSAndroid Build Coastguard Worker decorator. When used as a class decorator `patch.dict` honours 1597*3ac0a46fSAndroid Build Coastguard Worker `patch.TEST_PREFIX` for choosing which methods to wrap. 1598*3ac0a46fSAndroid Build Coastguard Worker """ 1599*3ac0a46fSAndroid Build Coastguard Worker 1600*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, in_dict, values=(), clear=False, **kwargs): 1601*3ac0a46fSAndroid Build Coastguard Worker if isinstance(in_dict, basestring): 1602*3ac0a46fSAndroid Build Coastguard Worker in_dict = _importer(in_dict) 1603*3ac0a46fSAndroid Build Coastguard Worker self.in_dict = in_dict 1604*3ac0a46fSAndroid Build Coastguard Worker # support any argument supported by dict(...) constructor 1605*3ac0a46fSAndroid Build Coastguard Worker self.values = dict(values) 1606*3ac0a46fSAndroid Build Coastguard Worker self.values.update(kwargs) 1607*3ac0a46fSAndroid Build Coastguard Worker self.clear = clear 1608*3ac0a46fSAndroid Build Coastguard Worker self._original = None 1609*3ac0a46fSAndroid Build Coastguard Worker 1610*3ac0a46fSAndroid Build Coastguard Worker 1611*3ac0a46fSAndroid Build Coastguard Worker def __call__(self, f): 1612*3ac0a46fSAndroid Build Coastguard Worker if isinstance(f, ClassTypes): 1613*3ac0a46fSAndroid Build Coastguard Worker return self.decorate_class(f) 1614*3ac0a46fSAndroid Build Coastguard Worker @wraps(f) 1615*3ac0a46fSAndroid Build Coastguard Worker def _inner(*args, **kw): 1616*3ac0a46fSAndroid Build Coastguard Worker self._patch_dict() 1617*3ac0a46fSAndroid Build Coastguard Worker try: 1618*3ac0a46fSAndroid Build Coastguard Worker return f(*args, **kw) 1619*3ac0a46fSAndroid Build Coastguard Worker finally: 1620*3ac0a46fSAndroid Build Coastguard Worker self._unpatch_dict() 1621*3ac0a46fSAndroid Build Coastguard Worker 1622*3ac0a46fSAndroid Build Coastguard Worker return _inner 1623*3ac0a46fSAndroid Build Coastguard Worker 1624*3ac0a46fSAndroid Build Coastguard Worker 1625*3ac0a46fSAndroid Build Coastguard Worker def decorate_class(self, klass): 1626*3ac0a46fSAndroid Build Coastguard Worker for attr in dir(klass): 1627*3ac0a46fSAndroid Build Coastguard Worker attr_value = getattr(klass, attr) 1628*3ac0a46fSAndroid Build Coastguard Worker if (attr.startswith(patch.TEST_PREFIX) and 1629*3ac0a46fSAndroid Build Coastguard Worker hasattr(attr_value, "__call__")): 1630*3ac0a46fSAndroid Build Coastguard Worker decorator = _patch_dict(self.in_dict, self.values, self.clear) 1631*3ac0a46fSAndroid Build Coastguard Worker decorated = decorator(attr_value) 1632*3ac0a46fSAndroid Build Coastguard Worker setattr(klass, attr, decorated) 1633*3ac0a46fSAndroid Build Coastguard Worker return klass 1634*3ac0a46fSAndroid Build Coastguard Worker 1635*3ac0a46fSAndroid Build Coastguard Worker 1636*3ac0a46fSAndroid Build Coastguard Worker def __enter__(self): 1637*3ac0a46fSAndroid Build Coastguard Worker """Patch the dict.""" 1638*3ac0a46fSAndroid Build Coastguard Worker self._patch_dict() 1639*3ac0a46fSAndroid Build Coastguard Worker 1640*3ac0a46fSAndroid Build Coastguard Worker 1641*3ac0a46fSAndroid Build Coastguard Worker def _patch_dict(self): 1642*3ac0a46fSAndroid Build Coastguard Worker values = self.values 1643*3ac0a46fSAndroid Build Coastguard Worker in_dict = self.in_dict 1644*3ac0a46fSAndroid Build Coastguard Worker clear = self.clear 1645*3ac0a46fSAndroid Build Coastguard Worker 1646*3ac0a46fSAndroid Build Coastguard Worker try: 1647*3ac0a46fSAndroid Build Coastguard Worker original = in_dict.copy() 1648*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 1649*3ac0a46fSAndroid Build Coastguard Worker # dict like object with no copy method 1650*3ac0a46fSAndroid Build Coastguard Worker # must support iteration over keys 1651*3ac0a46fSAndroid Build Coastguard Worker original = {} 1652*3ac0a46fSAndroid Build Coastguard Worker for key in in_dict: 1653*3ac0a46fSAndroid Build Coastguard Worker original[key] = in_dict[key] 1654*3ac0a46fSAndroid Build Coastguard Worker self._original = original 1655*3ac0a46fSAndroid Build Coastguard Worker 1656*3ac0a46fSAndroid Build Coastguard Worker if clear: 1657*3ac0a46fSAndroid Build Coastguard Worker _clear_dict(in_dict) 1658*3ac0a46fSAndroid Build Coastguard Worker 1659*3ac0a46fSAndroid Build Coastguard Worker try: 1660*3ac0a46fSAndroid Build Coastguard Worker in_dict.update(values) 1661*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 1662*3ac0a46fSAndroid Build Coastguard Worker # dict like object with no update method 1663*3ac0a46fSAndroid Build Coastguard Worker for key in values: 1664*3ac0a46fSAndroid Build Coastguard Worker in_dict[key] = values[key] 1665*3ac0a46fSAndroid Build Coastguard Worker 1666*3ac0a46fSAndroid Build Coastguard Worker 1667*3ac0a46fSAndroid Build Coastguard Worker def _unpatch_dict(self): 1668*3ac0a46fSAndroid Build Coastguard Worker in_dict = self.in_dict 1669*3ac0a46fSAndroid Build Coastguard Worker original = self._original 1670*3ac0a46fSAndroid Build Coastguard Worker 1671*3ac0a46fSAndroid Build Coastguard Worker _clear_dict(in_dict) 1672*3ac0a46fSAndroid Build Coastguard Worker 1673*3ac0a46fSAndroid Build Coastguard Worker try: 1674*3ac0a46fSAndroid Build Coastguard Worker in_dict.update(original) 1675*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 1676*3ac0a46fSAndroid Build Coastguard Worker for key in original: 1677*3ac0a46fSAndroid Build Coastguard Worker in_dict[key] = original[key] 1678*3ac0a46fSAndroid Build Coastguard Worker 1679*3ac0a46fSAndroid Build Coastguard Worker 1680*3ac0a46fSAndroid Build Coastguard Worker def __exit__(self, *args): 1681*3ac0a46fSAndroid Build Coastguard Worker """Unpatch the dict.""" 1682*3ac0a46fSAndroid Build Coastguard Worker self._unpatch_dict() 1683*3ac0a46fSAndroid Build Coastguard Worker return False 1684*3ac0a46fSAndroid Build Coastguard Worker 1685*3ac0a46fSAndroid Build Coastguard Worker start = __enter__ 1686*3ac0a46fSAndroid Build Coastguard Worker stop = __exit__ 1687*3ac0a46fSAndroid Build Coastguard Worker 1688*3ac0a46fSAndroid Build Coastguard Worker 1689*3ac0a46fSAndroid Build Coastguard Workerdef _clear_dict(in_dict): 1690*3ac0a46fSAndroid Build Coastguard Worker try: 1691*3ac0a46fSAndroid Build Coastguard Worker in_dict.clear() 1692*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 1693*3ac0a46fSAndroid Build Coastguard Worker keys = list(in_dict) 1694*3ac0a46fSAndroid Build Coastguard Worker for key in keys: 1695*3ac0a46fSAndroid Build Coastguard Worker del in_dict[key] 1696*3ac0a46fSAndroid Build Coastguard Worker 1697*3ac0a46fSAndroid Build Coastguard Worker 1698*3ac0a46fSAndroid Build Coastguard Workerdef _patch_stopall(): 1699*3ac0a46fSAndroid Build Coastguard Worker """Stop all active patches.""" 1700*3ac0a46fSAndroid Build Coastguard Worker for patch in list(_patch._active_patches): 1701*3ac0a46fSAndroid Build Coastguard Worker patch.stop() 1702*3ac0a46fSAndroid Build Coastguard Worker 1703*3ac0a46fSAndroid Build Coastguard Worker 1704*3ac0a46fSAndroid Build Coastguard Workerpatch.object = _patch_object 1705*3ac0a46fSAndroid Build Coastguard Workerpatch.dict = _patch_dict 1706*3ac0a46fSAndroid Build Coastguard Workerpatch.multiple = _patch_multiple 1707*3ac0a46fSAndroid Build Coastguard Workerpatch.stopall = _patch_stopall 1708*3ac0a46fSAndroid Build Coastguard Workerpatch.TEST_PREFIX = 'test' 1709*3ac0a46fSAndroid Build Coastguard Worker 1710*3ac0a46fSAndroid Build Coastguard Workermagic_methods = ( 1711*3ac0a46fSAndroid Build Coastguard Worker "lt le gt ge eq ne " 1712*3ac0a46fSAndroid Build Coastguard Worker "getitem setitem delitem " 1713*3ac0a46fSAndroid Build Coastguard Worker "len contains iter " 1714*3ac0a46fSAndroid Build Coastguard Worker "hash str sizeof " 1715*3ac0a46fSAndroid Build Coastguard Worker "enter exit " 1716*3ac0a46fSAndroid Build Coastguard Worker "divmod neg pos abs invert " 1717*3ac0a46fSAndroid Build Coastguard Worker "complex int float index " 1718*3ac0a46fSAndroid Build Coastguard Worker "trunc floor ceil " 1719*3ac0a46fSAndroid Build Coastguard Worker) 1720*3ac0a46fSAndroid Build Coastguard Worker 1721*3ac0a46fSAndroid Build Coastguard Workernumerics = "add sub mul div floordiv mod lshift rshift and xor or pow " 1722*3ac0a46fSAndroid Build Coastguard Workerinplace = ' '.join('i%s' % n for n in numerics.split()) 1723*3ac0a46fSAndroid Build Coastguard Workerright = ' '.join('r%s' % n for n in numerics.split()) 1724*3ac0a46fSAndroid Build Coastguard Workerextra = '' 1725*3ac0a46fSAndroid Build Coastguard Workerif inPy3k: 1726*3ac0a46fSAndroid Build Coastguard Worker extra = 'bool next ' 1727*3ac0a46fSAndroid Build Coastguard Workerelse: 1728*3ac0a46fSAndroid Build Coastguard Worker extra = 'unicode long nonzero oct hex truediv rtruediv ' 1729*3ac0a46fSAndroid Build Coastguard Worker 1730*3ac0a46fSAndroid Build Coastguard Worker# not including __prepare__, __instancecheck__, __subclasscheck__ 1731*3ac0a46fSAndroid Build Coastguard Worker# (as they are metaclass methods) 1732*3ac0a46fSAndroid Build Coastguard Worker# __del__ is not supported at all as it causes problems if it exists 1733*3ac0a46fSAndroid Build Coastguard Worker 1734*3ac0a46fSAndroid Build Coastguard Worker_non_defaults = set('__%s__' % method for method in [ 1735*3ac0a46fSAndroid Build Coastguard Worker 'cmp', 'getslice', 'setslice', 'coerce', 'subclasses', 1736*3ac0a46fSAndroid Build Coastguard Worker 'format', 'get', 'set', 'delete', 'reversed', 1737*3ac0a46fSAndroid Build Coastguard Worker 'missing', 'reduce', 'reduce_ex', 'getinitargs', 1738*3ac0a46fSAndroid Build Coastguard Worker 'getnewargs', 'getstate', 'setstate', 'getformat', 1739*3ac0a46fSAndroid Build Coastguard Worker 'setformat', 'repr', 'dir' 1740*3ac0a46fSAndroid Build Coastguard Worker]) 1741*3ac0a46fSAndroid Build Coastguard Worker 1742*3ac0a46fSAndroid Build Coastguard Worker 1743*3ac0a46fSAndroid Build Coastguard Workerdef _get_method(name, func): 1744*3ac0a46fSAndroid Build Coastguard Worker "Turns a callable object (like a mock) into a real function" 1745*3ac0a46fSAndroid Build Coastguard Worker def method(self, *args, **kw): 1746*3ac0a46fSAndroid Build Coastguard Worker return func(self, *args, **kw) 1747*3ac0a46fSAndroid Build Coastguard Worker method.__name__ = name 1748*3ac0a46fSAndroid Build Coastguard Worker return method 1749*3ac0a46fSAndroid Build Coastguard Worker 1750*3ac0a46fSAndroid Build Coastguard Worker 1751*3ac0a46fSAndroid Build Coastguard Worker_magics = set( 1752*3ac0a46fSAndroid Build Coastguard Worker '__%s__' % method for method in 1753*3ac0a46fSAndroid Build Coastguard Worker ' '.join([magic_methods, numerics, inplace, right, extra]).split() 1754*3ac0a46fSAndroid Build Coastguard Worker) 1755*3ac0a46fSAndroid Build Coastguard Worker 1756*3ac0a46fSAndroid Build Coastguard Worker_all_magics = _magics | _non_defaults 1757*3ac0a46fSAndroid Build Coastguard Worker 1758*3ac0a46fSAndroid Build Coastguard Worker_unsupported_magics = set([ 1759*3ac0a46fSAndroid Build Coastguard Worker '__getattr__', '__setattr__', 1760*3ac0a46fSAndroid Build Coastguard Worker '__init__', '__new__', '__prepare__' 1761*3ac0a46fSAndroid Build Coastguard Worker '__instancecheck__', '__subclasscheck__', 1762*3ac0a46fSAndroid Build Coastguard Worker '__del__' 1763*3ac0a46fSAndroid Build Coastguard Worker]) 1764*3ac0a46fSAndroid Build Coastguard Worker 1765*3ac0a46fSAndroid Build Coastguard Worker_calculate_return_value = { 1766*3ac0a46fSAndroid Build Coastguard Worker '__hash__': lambda self: object.__hash__(self), 1767*3ac0a46fSAndroid Build Coastguard Worker '__str__': lambda self: object.__str__(self), 1768*3ac0a46fSAndroid Build Coastguard Worker '__sizeof__': lambda self: object.__sizeof__(self), 1769*3ac0a46fSAndroid Build Coastguard Worker '__unicode__': lambda self: unicode(object.__str__(self)), 1770*3ac0a46fSAndroid Build Coastguard Worker} 1771*3ac0a46fSAndroid Build Coastguard Worker 1772*3ac0a46fSAndroid Build Coastguard Worker_return_values = { 1773*3ac0a46fSAndroid Build Coastguard Worker '__lt__': NotImplemented, 1774*3ac0a46fSAndroid Build Coastguard Worker '__gt__': NotImplemented, 1775*3ac0a46fSAndroid Build Coastguard Worker '__le__': NotImplemented, 1776*3ac0a46fSAndroid Build Coastguard Worker '__ge__': NotImplemented, 1777*3ac0a46fSAndroid Build Coastguard Worker '__int__': 1, 1778*3ac0a46fSAndroid Build Coastguard Worker '__contains__': False, 1779*3ac0a46fSAndroid Build Coastguard Worker '__len__': 0, 1780*3ac0a46fSAndroid Build Coastguard Worker '__exit__': False, 1781*3ac0a46fSAndroid Build Coastguard Worker '__complex__': 1j, 1782*3ac0a46fSAndroid Build Coastguard Worker '__float__': 1.0, 1783*3ac0a46fSAndroid Build Coastguard Worker '__bool__': True, 1784*3ac0a46fSAndroid Build Coastguard Worker '__nonzero__': True, 1785*3ac0a46fSAndroid Build Coastguard Worker '__oct__': '1', 1786*3ac0a46fSAndroid Build Coastguard Worker '__hex__': '0x1', 1787*3ac0a46fSAndroid Build Coastguard Worker '__long__': long(1), 1788*3ac0a46fSAndroid Build Coastguard Worker '__index__': 1, 1789*3ac0a46fSAndroid Build Coastguard Worker} 1790*3ac0a46fSAndroid Build Coastguard Worker 1791*3ac0a46fSAndroid Build Coastguard Worker 1792*3ac0a46fSAndroid Build Coastguard Workerdef _get_eq(self): 1793*3ac0a46fSAndroid Build Coastguard Worker def __eq__(other): 1794*3ac0a46fSAndroid Build Coastguard Worker ret_val = self.__eq__._mock_return_value 1795*3ac0a46fSAndroid Build Coastguard Worker if ret_val is not DEFAULT: 1796*3ac0a46fSAndroid Build Coastguard Worker return ret_val 1797*3ac0a46fSAndroid Build Coastguard Worker return self is other 1798*3ac0a46fSAndroid Build Coastguard Worker return __eq__ 1799*3ac0a46fSAndroid Build Coastguard Worker 1800*3ac0a46fSAndroid Build Coastguard Workerdef _get_ne(self): 1801*3ac0a46fSAndroid Build Coastguard Worker def __ne__(other): 1802*3ac0a46fSAndroid Build Coastguard Worker if self.__ne__._mock_return_value is not DEFAULT: 1803*3ac0a46fSAndroid Build Coastguard Worker return DEFAULT 1804*3ac0a46fSAndroid Build Coastguard Worker return self is not other 1805*3ac0a46fSAndroid Build Coastguard Worker return __ne__ 1806*3ac0a46fSAndroid Build Coastguard Worker 1807*3ac0a46fSAndroid Build Coastguard Workerdef _get_iter(self): 1808*3ac0a46fSAndroid Build Coastguard Worker def __iter__(): 1809*3ac0a46fSAndroid Build Coastguard Worker ret_val = self.__iter__._mock_return_value 1810*3ac0a46fSAndroid Build Coastguard Worker if ret_val is DEFAULT: 1811*3ac0a46fSAndroid Build Coastguard Worker return iter([]) 1812*3ac0a46fSAndroid Build Coastguard Worker # if ret_val was already an iterator, then calling iter on it should 1813*3ac0a46fSAndroid Build Coastguard Worker # return the iterator unchanged 1814*3ac0a46fSAndroid Build Coastguard Worker return iter(ret_val) 1815*3ac0a46fSAndroid Build Coastguard Worker return __iter__ 1816*3ac0a46fSAndroid Build Coastguard Worker 1817*3ac0a46fSAndroid Build Coastguard Worker_side_effect_methods = { 1818*3ac0a46fSAndroid Build Coastguard Worker '__eq__': _get_eq, 1819*3ac0a46fSAndroid Build Coastguard Worker '__ne__': _get_ne, 1820*3ac0a46fSAndroid Build Coastguard Worker '__iter__': _get_iter, 1821*3ac0a46fSAndroid Build Coastguard Worker} 1822*3ac0a46fSAndroid Build Coastguard Worker 1823*3ac0a46fSAndroid Build Coastguard Worker 1824*3ac0a46fSAndroid Build Coastguard Worker 1825*3ac0a46fSAndroid Build Coastguard Workerdef _set_return_value(mock, method, name): 1826*3ac0a46fSAndroid Build Coastguard Worker fixed = _return_values.get(name, DEFAULT) 1827*3ac0a46fSAndroid Build Coastguard Worker if fixed is not DEFAULT: 1828*3ac0a46fSAndroid Build Coastguard Worker method.return_value = fixed 1829*3ac0a46fSAndroid Build Coastguard Worker return 1830*3ac0a46fSAndroid Build Coastguard Worker 1831*3ac0a46fSAndroid Build Coastguard Worker return_calulator = _calculate_return_value.get(name) 1832*3ac0a46fSAndroid Build Coastguard Worker if return_calulator is not None: 1833*3ac0a46fSAndroid Build Coastguard Worker try: 1834*3ac0a46fSAndroid Build Coastguard Worker return_value = return_calulator(mock) 1835*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 1836*3ac0a46fSAndroid Build Coastguard Worker # XXXX why do we return AttributeError here? 1837*3ac0a46fSAndroid Build Coastguard Worker # set it as a side_effect instead? 1838*3ac0a46fSAndroid Build Coastguard Worker return_value = AttributeError(name) 1839*3ac0a46fSAndroid Build Coastguard Worker method.return_value = return_value 1840*3ac0a46fSAndroid Build Coastguard Worker return 1841*3ac0a46fSAndroid Build Coastguard Worker 1842*3ac0a46fSAndroid Build Coastguard Worker side_effector = _side_effect_methods.get(name) 1843*3ac0a46fSAndroid Build Coastguard Worker if side_effector is not None: 1844*3ac0a46fSAndroid Build Coastguard Worker method.side_effect = side_effector(mock) 1845*3ac0a46fSAndroid Build Coastguard Worker 1846*3ac0a46fSAndroid Build Coastguard Worker 1847*3ac0a46fSAndroid Build Coastguard Worker 1848*3ac0a46fSAndroid Build Coastguard Workerclass MagicMixin(object): 1849*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, *args, **kw): 1850*3ac0a46fSAndroid Build Coastguard Worker _super(MagicMixin, self).__init__(*args, **kw) 1851*3ac0a46fSAndroid Build Coastguard Worker self._mock_set_magics() 1852*3ac0a46fSAndroid Build Coastguard Worker 1853*3ac0a46fSAndroid Build Coastguard Worker 1854*3ac0a46fSAndroid Build Coastguard Worker def _mock_set_magics(self): 1855*3ac0a46fSAndroid Build Coastguard Worker these_magics = _magics 1856*3ac0a46fSAndroid Build Coastguard Worker 1857*3ac0a46fSAndroid Build Coastguard Worker if self._mock_methods is not None: 1858*3ac0a46fSAndroid Build Coastguard Worker these_magics = _magics.intersection(self._mock_methods) 1859*3ac0a46fSAndroid Build Coastguard Worker 1860*3ac0a46fSAndroid Build Coastguard Worker remove_magics = set() 1861*3ac0a46fSAndroid Build Coastguard Worker remove_magics = _magics - these_magics 1862*3ac0a46fSAndroid Build Coastguard Worker 1863*3ac0a46fSAndroid Build Coastguard Worker for entry in remove_magics: 1864*3ac0a46fSAndroid Build Coastguard Worker if entry in type(self).__dict__: 1865*3ac0a46fSAndroid Build Coastguard Worker # remove unneeded magic methods 1866*3ac0a46fSAndroid Build Coastguard Worker delattr(self, entry) 1867*3ac0a46fSAndroid Build Coastguard Worker 1868*3ac0a46fSAndroid Build Coastguard Worker # don't overwrite existing attributes if called a second time 1869*3ac0a46fSAndroid Build Coastguard Worker these_magics = these_magics - set(type(self).__dict__) 1870*3ac0a46fSAndroid Build Coastguard Worker 1871*3ac0a46fSAndroid Build Coastguard Worker _type = type(self) 1872*3ac0a46fSAndroid Build Coastguard Worker for entry in these_magics: 1873*3ac0a46fSAndroid Build Coastguard Worker setattr(_type, entry, MagicProxy(entry, self)) 1874*3ac0a46fSAndroid Build Coastguard Worker 1875*3ac0a46fSAndroid Build Coastguard Worker 1876*3ac0a46fSAndroid Build Coastguard Worker 1877*3ac0a46fSAndroid Build Coastguard Workerclass NonCallableMagicMock(MagicMixin, NonCallableMock): 1878*3ac0a46fSAndroid Build Coastguard Worker """A version of `MagicMock` that isn't callable.""" 1879*3ac0a46fSAndroid Build Coastguard Worker def mock_add_spec(self, spec, spec_set=False): 1880*3ac0a46fSAndroid Build Coastguard Worker """Add a spec to a mock. `spec` can either be an object or a 1881*3ac0a46fSAndroid Build Coastguard Worker list of strings. Only attributes on the `spec` can be fetched as 1882*3ac0a46fSAndroid Build Coastguard Worker attributes from the mock. 1883*3ac0a46fSAndroid Build Coastguard Worker 1884*3ac0a46fSAndroid Build Coastguard Worker If `spec_set` is True then only attributes on the spec can be set.""" 1885*3ac0a46fSAndroid Build Coastguard Worker self._mock_add_spec(spec, spec_set) 1886*3ac0a46fSAndroid Build Coastguard Worker self._mock_set_magics() 1887*3ac0a46fSAndroid Build Coastguard Worker 1888*3ac0a46fSAndroid Build Coastguard Worker 1889*3ac0a46fSAndroid Build Coastguard Worker 1890*3ac0a46fSAndroid Build Coastguard Workerclass MagicMock(MagicMixin, Mock): 1891*3ac0a46fSAndroid Build Coastguard Worker """ 1892*3ac0a46fSAndroid Build Coastguard Worker MagicMock is a subclass of Mock with default implementations 1893*3ac0a46fSAndroid Build Coastguard Worker of most of the magic methods. You can use MagicMock without having to 1894*3ac0a46fSAndroid Build Coastguard Worker configure the magic methods yourself. 1895*3ac0a46fSAndroid Build Coastguard Worker 1896*3ac0a46fSAndroid Build Coastguard Worker If you use the `spec` or `spec_set` arguments then *only* magic 1897*3ac0a46fSAndroid Build Coastguard Worker methods that exist in the spec will be created. 1898*3ac0a46fSAndroid Build Coastguard Worker 1899*3ac0a46fSAndroid Build Coastguard Worker Attributes and the return value of a `MagicMock` will also be `MagicMocks`. 1900*3ac0a46fSAndroid Build Coastguard Worker """ 1901*3ac0a46fSAndroid Build Coastguard Worker def mock_add_spec(self, spec, spec_set=False): 1902*3ac0a46fSAndroid Build Coastguard Worker """Add a spec to a mock. `spec` can either be an object or a 1903*3ac0a46fSAndroid Build Coastguard Worker list of strings. Only attributes on the `spec` can be fetched as 1904*3ac0a46fSAndroid Build Coastguard Worker attributes from the mock. 1905*3ac0a46fSAndroid Build Coastguard Worker 1906*3ac0a46fSAndroid Build Coastguard Worker If `spec_set` is True then only attributes on the spec can be set.""" 1907*3ac0a46fSAndroid Build Coastguard Worker self._mock_add_spec(spec, spec_set) 1908*3ac0a46fSAndroid Build Coastguard Worker self._mock_set_magics() 1909*3ac0a46fSAndroid Build Coastguard Worker 1910*3ac0a46fSAndroid Build Coastguard Worker 1911*3ac0a46fSAndroid Build Coastguard Worker 1912*3ac0a46fSAndroid Build Coastguard Workerclass MagicProxy(object): 1913*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, name, parent): 1914*3ac0a46fSAndroid Build Coastguard Worker self.name = name 1915*3ac0a46fSAndroid Build Coastguard Worker self.parent = parent 1916*3ac0a46fSAndroid Build Coastguard Worker 1917*3ac0a46fSAndroid Build Coastguard Worker def __call__(self, *args, **kwargs): 1918*3ac0a46fSAndroid Build Coastguard Worker m = self.create_mock() 1919*3ac0a46fSAndroid Build Coastguard Worker return m(*args, **kwargs) 1920*3ac0a46fSAndroid Build Coastguard Worker 1921*3ac0a46fSAndroid Build Coastguard Worker def create_mock(self): 1922*3ac0a46fSAndroid Build Coastguard Worker entry = self.name 1923*3ac0a46fSAndroid Build Coastguard Worker parent = self.parent 1924*3ac0a46fSAndroid Build Coastguard Worker m = parent._get_child_mock(name=entry, _new_name=entry, 1925*3ac0a46fSAndroid Build Coastguard Worker _new_parent=parent) 1926*3ac0a46fSAndroid Build Coastguard Worker setattr(parent, entry, m) 1927*3ac0a46fSAndroid Build Coastguard Worker _set_return_value(parent, m, entry) 1928*3ac0a46fSAndroid Build Coastguard Worker return m 1929*3ac0a46fSAndroid Build Coastguard Worker 1930*3ac0a46fSAndroid Build Coastguard Worker def __get__(self, obj, _type=None): 1931*3ac0a46fSAndroid Build Coastguard Worker return self.create_mock() 1932*3ac0a46fSAndroid Build Coastguard Worker 1933*3ac0a46fSAndroid Build Coastguard Worker 1934*3ac0a46fSAndroid Build Coastguard Worker 1935*3ac0a46fSAndroid Build Coastguard Workerclass _ANY(object): 1936*3ac0a46fSAndroid Build Coastguard Worker "A helper object that compares equal to everything." 1937*3ac0a46fSAndroid Build Coastguard Worker 1938*3ac0a46fSAndroid Build Coastguard Worker def __eq__(self, other): 1939*3ac0a46fSAndroid Build Coastguard Worker return True 1940*3ac0a46fSAndroid Build Coastguard Worker 1941*3ac0a46fSAndroid Build Coastguard Worker def __ne__(self, other): 1942*3ac0a46fSAndroid Build Coastguard Worker return False 1943*3ac0a46fSAndroid Build Coastguard Worker 1944*3ac0a46fSAndroid Build Coastguard Worker def __repr__(self): 1945*3ac0a46fSAndroid Build Coastguard Worker return '<ANY>' 1946*3ac0a46fSAndroid Build Coastguard Worker 1947*3ac0a46fSAndroid Build Coastguard WorkerANY = _ANY() 1948*3ac0a46fSAndroid Build Coastguard Worker 1949*3ac0a46fSAndroid Build Coastguard Worker 1950*3ac0a46fSAndroid Build Coastguard Worker 1951*3ac0a46fSAndroid Build Coastguard Workerdef _format_call_signature(name, args, kwargs): 1952*3ac0a46fSAndroid Build Coastguard Worker message = '%s(%%s)' % name 1953*3ac0a46fSAndroid Build Coastguard Worker formatted_args = '' 1954*3ac0a46fSAndroid Build Coastguard Worker args_string = ', '.join([repr(arg) for arg in args]) 1955*3ac0a46fSAndroid Build Coastguard Worker kwargs_string = ', '.join([ 1956*3ac0a46fSAndroid Build Coastguard Worker '%s=%r' % (key, value) for key, value in kwargs.items() 1957*3ac0a46fSAndroid Build Coastguard Worker ]) 1958*3ac0a46fSAndroid Build Coastguard Worker if args_string: 1959*3ac0a46fSAndroid Build Coastguard Worker formatted_args = args_string 1960*3ac0a46fSAndroid Build Coastguard Worker if kwargs_string: 1961*3ac0a46fSAndroid Build Coastguard Worker if formatted_args: 1962*3ac0a46fSAndroid Build Coastguard Worker formatted_args += ', ' 1963*3ac0a46fSAndroid Build Coastguard Worker formatted_args += kwargs_string 1964*3ac0a46fSAndroid Build Coastguard Worker 1965*3ac0a46fSAndroid Build Coastguard Worker return message % formatted_args 1966*3ac0a46fSAndroid Build Coastguard Worker 1967*3ac0a46fSAndroid Build Coastguard Worker 1968*3ac0a46fSAndroid Build Coastguard Worker 1969*3ac0a46fSAndroid Build Coastguard Workerclass _Call(tuple): 1970*3ac0a46fSAndroid Build Coastguard Worker """ 1971*3ac0a46fSAndroid Build Coastguard Worker A tuple for holding the results of a call to a mock, either in the form 1972*3ac0a46fSAndroid Build Coastguard Worker `(args, kwargs)` or `(name, args, kwargs)`. 1973*3ac0a46fSAndroid Build Coastguard Worker 1974*3ac0a46fSAndroid Build Coastguard Worker If args or kwargs are empty then a call tuple will compare equal to 1975*3ac0a46fSAndroid Build Coastguard Worker a tuple without those values. This makes comparisons less verbose:: 1976*3ac0a46fSAndroid Build Coastguard Worker 1977*3ac0a46fSAndroid Build Coastguard Worker _Call(('name', (), {})) == ('name',) 1978*3ac0a46fSAndroid Build Coastguard Worker _Call(('name', (1,), {})) == ('name', (1,)) 1979*3ac0a46fSAndroid Build Coastguard Worker _Call(((), {'a': 'b'})) == ({'a': 'b'},) 1980*3ac0a46fSAndroid Build Coastguard Worker 1981*3ac0a46fSAndroid Build Coastguard Worker The `_Call` object provides a useful shortcut for comparing with call:: 1982*3ac0a46fSAndroid Build Coastguard Worker 1983*3ac0a46fSAndroid Build Coastguard Worker _Call(((1, 2), {'a': 3})) == call(1, 2, a=3) 1984*3ac0a46fSAndroid Build Coastguard Worker _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3) 1985*3ac0a46fSAndroid Build Coastguard Worker 1986*3ac0a46fSAndroid Build Coastguard Worker If the _Call has no name then it will match any name. 1987*3ac0a46fSAndroid Build Coastguard Worker """ 1988*3ac0a46fSAndroid Build Coastguard Worker def __new__(cls, value=(), name=None, parent=None, two=False, 1989*3ac0a46fSAndroid Build Coastguard Worker from_kall=True): 1990*3ac0a46fSAndroid Build Coastguard Worker name = '' 1991*3ac0a46fSAndroid Build Coastguard Worker args = () 1992*3ac0a46fSAndroid Build Coastguard Worker kwargs = {} 1993*3ac0a46fSAndroid Build Coastguard Worker _len = len(value) 1994*3ac0a46fSAndroid Build Coastguard Worker if _len == 3: 1995*3ac0a46fSAndroid Build Coastguard Worker name, args, kwargs = value 1996*3ac0a46fSAndroid Build Coastguard Worker elif _len == 2: 1997*3ac0a46fSAndroid Build Coastguard Worker first, second = value 1998*3ac0a46fSAndroid Build Coastguard Worker if isinstance(first, basestring): 1999*3ac0a46fSAndroid Build Coastguard Worker name = first 2000*3ac0a46fSAndroid Build Coastguard Worker if isinstance(second, tuple): 2001*3ac0a46fSAndroid Build Coastguard Worker args = second 2002*3ac0a46fSAndroid Build Coastguard Worker else: 2003*3ac0a46fSAndroid Build Coastguard Worker kwargs = second 2004*3ac0a46fSAndroid Build Coastguard Worker else: 2005*3ac0a46fSAndroid Build Coastguard Worker args, kwargs = first, second 2006*3ac0a46fSAndroid Build Coastguard Worker elif _len == 1: 2007*3ac0a46fSAndroid Build Coastguard Worker value, = value 2008*3ac0a46fSAndroid Build Coastguard Worker if isinstance(value, basestring): 2009*3ac0a46fSAndroid Build Coastguard Worker name = value 2010*3ac0a46fSAndroid Build Coastguard Worker elif isinstance(value, tuple): 2011*3ac0a46fSAndroid Build Coastguard Worker args = value 2012*3ac0a46fSAndroid Build Coastguard Worker else: 2013*3ac0a46fSAndroid Build Coastguard Worker kwargs = value 2014*3ac0a46fSAndroid Build Coastguard Worker 2015*3ac0a46fSAndroid Build Coastguard Worker if two: 2016*3ac0a46fSAndroid Build Coastguard Worker return tuple.__new__(cls, (args, kwargs)) 2017*3ac0a46fSAndroid Build Coastguard Worker 2018*3ac0a46fSAndroid Build Coastguard Worker return tuple.__new__(cls, (name, args, kwargs)) 2019*3ac0a46fSAndroid Build Coastguard Worker 2020*3ac0a46fSAndroid Build Coastguard Worker 2021*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, value=(), name=None, parent=None, two=False, 2022*3ac0a46fSAndroid Build Coastguard Worker from_kall=True): 2023*3ac0a46fSAndroid Build Coastguard Worker self.name = name 2024*3ac0a46fSAndroid Build Coastguard Worker self.parent = parent 2025*3ac0a46fSAndroid Build Coastguard Worker self.from_kall = from_kall 2026*3ac0a46fSAndroid Build Coastguard Worker 2027*3ac0a46fSAndroid Build Coastguard Worker 2028*3ac0a46fSAndroid Build Coastguard Worker def __eq__(self, other): 2029*3ac0a46fSAndroid Build Coastguard Worker if other is ANY: 2030*3ac0a46fSAndroid Build Coastguard Worker return True 2031*3ac0a46fSAndroid Build Coastguard Worker try: 2032*3ac0a46fSAndroid Build Coastguard Worker len_other = len(other) 2033*3ac0a46fSAndroid Build Coastguard Worker except TypeError: 2034*3ac0a46fSAndroid Build Coastguard Worker return False 2035*3ac0a46fSAndroid Build Coastguard Worker 2036*3ac0a46fSAndroid Build Coastguard Worker self_name = '' 2037*3ac0a46fSAndroid Build Coastguard Worker if len(self) == 2: 2038*3ac0a46fSAndroid Build Coastguard Worker self_args, self_kwargs = self 2039*3ac0a46fSAndroid Build Coastguard Worker else: 2040*3ac0a46fSAndroid Build Coastguard Worker self_name, self_args, self_kwargs = self 2041*3ac0a46fSAndroid Build Coastguard Worker 2042*3ac0a46fSAndroid Build Coastguard Worker other_name = '' 2043*3ac0a46fSAndroid Build Coastguard Worker if len_other == 0: 2044*3ac0a46fSAndroid Build Coastguard Worker other_args, other_kwargs = (), {} 2045*3ac0a46fSAndroid Build Coastguard Worker elif len_other == 3: 2046*3ac0a46fSAndroid Build Coastguard Worker other_name, other_args, other_kwargs = other 2047*3ac0a46fSAndroid Build Coastguard Worker elif len_other == 1: 2048*3ac0a46fSAndroid Build Coastguard Worker value, = other 2049*3ac0a46fSAndroid Build Coastguard Worker if isinstance(value, tuple): 2050*3ac0a46fSAndroid Build Coastguard Worker other_args = value 2051*3ac0a46fSAndroid Build Coastguard Worker other_kwargs = {} 2052*3ac0a46fSAndroid Build Coastguard Worker elif isinstance(value, basestring): 2053*3ac0a46fSAndroid Build Coastguard Worker other_name = value 2054*3ac0a46fSAndroid Build Coastguard Worker other_args, other_kwargs = (), {} 2055*3ac0a46fSAndroid Build Coastguard Worker else: 2056*3ac0a46fSAndroid Build Coastguard Worker other_args = () 2057*3ac0a46fSAndroid Build Coastguard Worker other_kwargs = value 2058*3ac0a46fSAndroid Build Coastguard Worker else: 2059*3ac0a46fSAndroid Build Coastguard Worker # len 2 2060*3ac0a46fSAndroid Build Coastguard Worker # could be (name, args) or (name, kwargs) or (args, kwargs) 2061*3ac0a46fSAndroid Build Coastguard Worker first, second = other 2062*3ac0a46fSAndroid Build Coastguard Worker if isinstance(first, basestring): 2063*3ac0a46fSAndroid Build Coastguard Worker other_name = first 2064*3ac0a46fSAndroid Build Coastguard Worker if isinstance(second, tuple): 2065*3ac0a46fSAndroid Build Coastguard Worker other_args, other_kwargs = second, {} 2066*3ac0a46fSAndroid Build Coastguard Worker else: 2067*3ac0a46fSAndroid Build Coastguard Worker other_args, other_kwargs = (), second 2068*3ac0a46fSAndroid Build Coastguard Worker else: 2069*3ac0a46fSAndroid Build Coastguard Worker other_args, other_kwargs = first, second 2070*3ac0a46fSAndroid Build Coastguard Worker 2071*3ac0a46fSAndroid Build Coastguard Worker if self_name and other_name != self_name: 2072*3ac0a46fSAndroid Build Coastguard Worker return False 2073*3ac0a46fSAndroid Build Coastguard Worker 2074*3ac0a46fSAndroid Build Coastguard Worker # this order is important for ANY to work! 2075*3ac0a46fSAndroid Build Coastguard Worker return (other_args, other_kwargs) == (self_args, self_kwargs) 2076*3ac0a46fSAndroid Build Coastguard Worker 2077*3ac0a46fSAndroid Build Coastguard Worker 2078*3ac0a46fSAndroid Build Coastguard Worker def __ne__(self, other): 2079*3ac0a46fSAndroid Build Coastguard Worker return not self.__eq__(other) 2080*3ac0a46fSAndroid Build Coastguard Worker 2081*3ac0a46fSAndroid Build Coastguard Worker 2082*3ac0a46fSAndroid Build Coastguard Worker def __call__(self, *args, **kwargs): 2083*3ac0a46fSAndroid Build Coastguard Worker if self.name is None: 2084*3ac0a46fSAndroid Build Coastguard Worker return _Call(('', args, kwargs), name='()') 2085*3ac0a46fSAndroid Build Coastguard Worker 2086*3ac0a46fSAndroid Build Coastguard Worker name = self.name + '()' 2087*3ac0a46fSAndroid Build Coastguard Worker return _Call((self.name, args, kwargs), name=name, parent=self) 2088*3ac0a46fSAndroid Build Coastguard Worker 2089*3ac0a46fSAndroid Build Coastguard Worker 2090*3ac0a46fSAndroid Build Coastguard Worker def __getattr__(self, attr): 2091*3ac0a46fSAndroid Build Coastguard Worker if self.name is None: 2092*3ac0a46fSAndroid Build Coastguard Worker return _Call(name=attr, from_kall=False) 2093*3ac0a46fSAndroid Build Coastguard Worker name = '%s.%s' % (self.name, attr) 2094*3ac0a46fSAndroid Build Coastguard Worker return _Call(name=name, parent=self, from_kall=False) 2095*3ac0a46fSAndroid Build Coastguard Worker 2096*3ac0a46fSAndroid Build Coastguard Worker 2097*3ac0a46fSAndroid Build Coastguard Worker def __repr__(self): 2098*3ac0a46fSAndroid Build Coastguard Worker if not self.from_kall: 2099*3ac0a46fSAndroid Build Coastguard Worker name = self.name or 'call' 2100*3ac0a46fSAndroid Build Coastguard Worker if name.startswith('()'): 2101*3ac0a46fSAndroid Build Coastguard Worker name = 'call%s' % name 2102*3ac0a46fSAndroid Build Coastguard Worker return name 2103*3ac0a46fSAndroid Build Coastguard Worker 2104*3ac0a46fSAndroid Build Coastguard Worker if len(self) == 2: 2105*3ac0a46fSAndroid Build Coastguard Worker name = 'call' 2106*3ac0a46fSAndroid Build Coastguard Worker args, kwargs = self 2107*3ac0a46fSAndroid Build Coastguard Worker else: 2108*3ac0a46fSAndroid Build Coastguard Worker name, args, kwargs = self 2109*3ac0a46fSAndroid Build Coastguard Worker if not name: 2110*3ac0a46fSAndroid Build Coastguard Worker name = 'call' 2111*3ac0a46fSAndroid Build Coastguard Worker elif not name.startswith('()'): 2112*3ac0a46fSAndroid Build Coastguard Worker name = 'call.%s' % name 2113*3ac0a46fSAndroid Build Coastguard Worker else: 2114*3ac0a46fSAndroid Build Coastguard Worker name = 'call%s' % name 2115*3ac0a46fSAndroid Build Coastguard Worker return _format_call_signature(name, args, kwargs) 2116*3ac0a46fSAndroid Build Coastguard Worker 2117*3ac0a46fSAndroid Build Coastguard Worker 2118*3ac0a46fSAndroid Build Coastguard Worker def call_list(self): 2119*3ac0a46fSAndroid Build Coastguard Worker """For a call object that represents multiple calls, `call_list` 2120*3ac0a46fSAndroid Build Coastguard Worker returns a list of all the intermediate calls as well as the 2121*3ac0a46fSAndroid Build Coastguard Worker final call.""" 2122*3ac0a46fSAndroid Build Coastguard Worker vals = [] 2123*3ac0a46fSAndroid Build Coastguard Worker thing = self 2124*3ac0a46fSAndroid Build Coastguard Worker while thing is not None: 2125*3ac0a46fSAndroid Build Coastguard Worker if thing.from_kall: 2126*3ac0a46fSAndroid Build Coastguard Worker vals.append(thing) 2127*3ac0a46fSAndroid Build Coastguard Worker thing = thing.parent 2128*3ac0a46fSAndroid Build Coastguard Worker return _CallList(reversed(vals)) 2129*3ac0a46fSAndroid Build Coastguard Worker 2130*3ac0a46fSAndroid Build Coastguard Worker 2131*3ac0a46fSAndroid Build Coastguard Workercall = _Call(from_kall=False) 2132*3ac0a46fSAndroid Build Coastguard Worker 2133*3ac0a46fSAndroid Build Coastguard Worker 2134*3ac0a46fSAndroid Build Coastguard Worker 2135*3ac0a46fSAndroid Build Coastguard Workerdef create_autospec(spec, spec_set=False, instance=False, _parent=None, 2136*3ac0a46fSAndroid Build Coastguard Worker _name=None, **kwargs): 2137*3ac0a46fSAndroid Build Coastguard Worker """Create a mock object using another object as a spec. Attributes on the 2138*3ac0a46fSAndroid Build Coastguard Worker mock will use the corresponding attribute on the `spec` object as their 2139*3ac0a46fSAndroid Build Coastguard Worker spec. 2140*3ac0a46fSAndroid Build Coastguard Worker 2141*3ac0a46fSAndroid Build Coastguard Worker Functions or methods being mocked will have their arguments checked 2142*3ac0a46fSAndroid Build Coastguard Worker to check that they are called with the correct signature. 2143*3ac0a46fSAndroid Build Coastguard Worker 2144*3ac0a46fSAndroid Build Coastguard Worker If `spec_set` is True then attempting to set attributes that don't exist 2145*3ac0a46fSAndroid Build Coastguard Worker on the spec object will raise an `AttributeError`. 2146*3ac0a46fSAndroid Build Coastguard Worker 2147*3ac0a46fSAndroid Build Coastguard Worker If a class is used as a spec then the return value of the mock (the 2148*3ac0a46fSAndroid Build Coastguard Worker instance of the class) will have the same spec. You can use a class as the 2149*3ac0a46fSAndroid Build Coastguard Worker spec for an instance object by passing `instance=True`. The returned mock 2150*3ac0a46fSAndroid Build Coastguard Worker will only be callable if instances of the mock are callable. 2151*3ac0a46fSAndroid Build Coastguard Worker 2152*3ac0a46fSAndroid Build Coastguard Worker `create_autospec` also takes arbitrary keyword arguments that are passed to 2153*3ac0a46fSAndroid Build Coastguard Worker the constructor of the created mock.""" 2154*3ac0a46fSAndroid Build Coastguard Worker if _is_list(spec): 2155*3ac0a46fSAndroid Build Coastguard Worker # can't pass a list instance to the mock constructor as it will be 2156*3ac0a46fSAndroid Build Coastguard Worker # interpreted as a list of strings 2157*3ac0a46fSAndroid Build Coastguard Worker spec = type(spec) 2158*3ac0a46fSAndroid Build Coastguard Worker 2159*3ac0a46fSAndroid Build Coastguard Worker is_type = isinstance(spec, ClassTypes) 2160*3ac0a46fSAndroid Build Coastguard Worker 2161*3ac0a46fSAndroid Build Coastguard Worker _kwargs = {'spec': spec} 2162*3ac0a46fSAndroid Build Coastguard Worker if spec_set: 2163*3ac0a46fSAndroid Build Coastguard Worker _kwargs = {'spec_set': spec} 2164*3ac0a46fSAndroid Build Coastguard Worker elif spec is None: 2165*3ac0a46fSAndroid Build Coastguard Worker # None we mock with a normal mock without a spec 2166*3ac0a46fSAndroid Build Coastguard Worker _kwargs = {} 2167*3ac0a46fSAndroid Build Coastguard Worker 2168*3ac0a46fSAndroid Build Coastguard Worker _kwargs.update(kwargs) 2169*3ac0a46fSAndroid Build Coastguard Worker 2170*3ac0a46fSAndroid Build Coastguard Worker Klass = MagicMock 2171*3ac0a46fSAndroid Build Coastguard Worker if type(spec) in DescriptorTypes: 2172*3ac0a46fSAndroid Build Coastguard Worker # descriptors don't have a spec 2173*3ac0a46fSAndroid Build Coastguard Worker # because we don't know what type they return 2174*3ac0a46fSAndroid Build Coastguard Worker _kwargs = {} 2175*3ac0a46fSAndroid Build Coastguard Worker elif not _callable(spec): 2176*3ac0a46fSAndroid Build Coastguard Worker Klass = NonCallableMagicMock 2177*3ac0a46fSAndroid Build Coastguard Worker elif is_type and instance and not _instance_callable(spec): 2178*3ac0a46fSAndroid Build Coastguard Worker Klass = NonCallableMagicMock 2179*3ac0a46fSAndroid Build Coastguard Worker 2180*3ac0a46fSAndroid Build Coastguard Worker _new_name = _name 2181*3ac0a46fSAndroid Build Coastguard Worker if _parent is None: 2182*3ac0a46fSAndroid Build Coastguard Worker # for a top level object no _new_name should be set 2183*3ac0a46fSAndroid Build Coastguard Worker _new_name = '' 2184*3ac0a46fSAndroid Build Coastguard Worker 2185*3ac0a46fSAndroid Build Coastguard Worker mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name, 2186*3ac0a46fSAndroid Build Coastguard Worker name=_name, **_kwargs) 2187*3ac0a46fSAndroid Build Coastguard Worker 2188*3ac0a46fSAndroid Build Coastguard Worker if isinstance(spec, FunctionTypes): 2189*3ac0a46fSAndroid Build Coastguard Worker # should only happen at the top level because we don't 2190*3ac0a46fSAndroid Build Coastguard Worker # recurse for functions 2191*3ac0a46fSAndroid Build Coastguard Worker mock = _set_signature(mock, spec) 2192*3ac0a46fSAndroid Build Coastguard Worker else: 2193*3ac0a46fSAndroid Build Coastguard Worker _check_signature(spec, mock, is_type, instance) 2194*3ac0a46fSAndroid Build Coastguard Worker 2195*3ac0a46fSAndroid Build Coastguard Worker if _parent is not None and not instance: 2196*3ac0a46fSAndroid Build Coastguard Worker _parent._mock_children[_name] = mock 2197*3ac0a46fSAndroid Build Coastguard Worker 2198*3ac0a46fSAndroid Build Coastguard Worker if is_type and not instance and 'return_value' not in kwargs: 2199*3ac0a46fSAndroid Build Coastguard Worker mock.return_value = create_autospec(spec, spec_set, instance=True, 2200*3ac0a46fSAndroid Build Coastguard Worker _name='()', _parent=mock) 2201*3ac0a46fSAndroid Build Coastguard Worker 2202*3ac0a46fSAndroid Build Coastguard Worker for entry in dir(spec): 2203*3ac0a46fSAndroid Build Coastguard Worker if _is_magic(entry): 2204*3ac0a46fSAndroid Build Coastguard Worker # MagicMock already does the useful magic methods for us 2205*3ac0a46fSAndroid Build Coastguard Worker continue 2206*3ac0a46fSAndroid Build Coastguard Worker 2207*3ac0a46fSAndroid Build Coastguard Worker if isinstance(spec, FunctionTypes) and entry in FunctionAttributes: 2208*3ac0a46fSAndroid Build Coastguard Worker # allow a mock to actually be a function 2209*3ac0a46fSAndroid Build Coastguard Worker continue 2210*3ac0a46fSAndroid Build Coastguard Worker 2211*3ac0a46fSAndroid Build Coastguard Worker # XXXX do we need a better way of getting attributes without 2212*3ac0a46fSAndroid Build Coastguard Worker # triggering code execution (?) Probably not - we need the actual 2213*3ac0a46fSAndroid Build Coastguard Worker # object to mock it so we would rather trigger a property than mock 2214*3ac0a46fSAndroid Build Coastguard Worker # the property descriptor. Likewise we want to mock out dynamically 2215*3ac0a46fSAndroid Build Coastguard Worker # provided attributes. 2216*3ac0a46fSAndroid Build Coastguard Worker # XXXX what about attributes that raise exceptions other than 2217*3ac0a46fSAndroid Build Coastguard Worker # AttributeError on being fetched? 2218*3ac0a46fSAndroid Build Coastguard Worker # we could be resilient against it, or catch and propagate the 2219*3ac0a46fSAndroid Build Coastguard Worker # exception when the attribute is fetched from the mock 2220*3ac0a46fSAndroid Build Coastguard Worker try: 2221*3ac0a46fSAndroid Build Coastguard Worker original = getattr(spec, entry) 2222*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 2223*3ac0a46fSAndroid Build Coastguard Worker continue 2224*3ac0a46fSAndroid Build Coastguard Worker 2225*3ac0a46fSAndroid Build Coastguard Worker kwargs = {'spec': original} 2226*3ac0a46fSAndroid Build Coastguard Worker if spec_set: 2227*3ac0a46fSAndroid Build Coastguard Worker kwargs = {'spec_set': original} 2228*3ac0a46fSAndroid Build Coastguard Worker 2229*3ac0a46fSAndroid Build Coastguard Worker if not isinstance(original, FunctionTypes): 2230*3ac0a46fSAndroid Build Coastguard Worker new = _SpecState(original, spec_set, mock, entry, instance) 2231*3ac0a46fSAndroid Build Coastguard Worker mock._mock_children[entry] = new 2232*3ac0a46fSAndroid Build Coastguard Worker else: 2233*3ac0a46fSAndroid Build Coastguard Worker parent = mock 2234*3ac0a46fSAndroid Build Coastguard Worker if isinstance(spec, FunctionTypes): 2235*3ac0a46fSAndroid Build Coastguard Worker parent = mock.mock 2236*3ac0a46fSAndroid Build Coastguard Worker 2237*3ac0a46fSAndroid Build Coastguard Worker new = MagicMock(parent=parent, name=entry, _new_name=entry, 2238*3ac0a46fSAndroid Build Coastguard Worker _new_parent=parent, **kwargs) 2239*3ac0a46fSAndroid Build Coastguard Worker mock._mock_children[entry] = new 2240*3ac0a46fSAndroid Build Coastguard Worker skipfirst = _must_skip(spec, entry, is_type) 2241*3ac0a46fSAndroid Build Coastguard Worker _check_signature(original, new, skipfirst=skipfirst) 2242*3ac0a46fSAndroid Build Coastguard Worker 2243*3ac0a46fSAndroid Build Coastguard Worker # so functions created with _set_signature become instance attributes, 2244*3ac0a46fSAndroid Build Coastguard Worker # *plus* their underlying mock exists in _mock_children of the parent 2245*3ac0a46fSAndroid Build Coastguard Worker # mock. Adding to _mock_children may be unnecessary where we are also 2246*3ac0a46fSAndroid Build Coastguard Worker # setting as an instance attribute? 2247*3ac0a46fSAndroid Build Coastguard Worker if isinstance(new, FunctionTypes): 2248*3ac0a46fSAndroid Build Coastguard Worker setattr(mock, entry, new) 2249*3ac0a46fSAndroid Build Coastguard Worker 2250*3ac0a46fSAndroid Build Coastguard Worker return mock 2251*3ac0a46fSAndroid Build Coastguard Worker 2252*3ac0a46fSAndroid Build Coastguard Worker 2253*3ac0a46fSAndroid Build Coastguard Workerdef _must_skip(spec, entry, is_type): 2254*3ac0a46fSAndroid Build Coastguard Worker if not isinstance(spec, ClassTypes): 2255*3ac0a46fSAndroid Build Coastguard Worker if entry in getattr(spec, '__dict__', {}): 2256*3ac0a46fSAndroid Build Coastguard Worker # instance attribute - shouldn't skip 2257*3ac0a46fSAndroid Build Coastguard Worker return False 2258*3ac0a46fSAndroid Build Coastguard Worker spec = spec.__class__ 2259*3ac0a46fSAndroid Build Coastguard Worker if not hasattr(spec, '__mro__'): 2260*3ac0a46fSAndroid Build Coastguard Worker # old style class: can't have descriptors anyway 2261*3ac0a46fSAndroid Build Coastguard Worker return is_type 2262*3ac0a46fSAndroid Build Coastguard Worker 2263*3ac0a46fSAndroid Build Coastguard Worker for klass in spec.__mro__: 2264*3ac0a46fSAndroid Build Coastguard Worker result = klass.__dict__.get(entry, DEFAULT) 2265*3ac0a46fSAndroid Build Coastguard Worker if result is DEFAULT: 2266*3ac0a46fSAndroid Build Coastguard Worker continue 2267*3ac0a46fSAndroid Build Coastguard Worker if isinstance(result, (staticmethod, classmethod)): 2268*3ac0a46fSAndroid Build Coastguard Worker return False 2269*3ac0a46fSAndroid Build Coastguard Worker return is_type 2270*3ac0a46fSAndroid Build Coastguard Worker 2271*3ac0a46fSAndroid Build Coastguard Worker # shouldn't get here unless function is a dynamically provided attribute 2272*3ac0a46fSAndroid Build Coastguard Worker # XXXX untested behaviour 2273*3ac0a46fSAndroid Build Coastguard Worker return is_type 2274*3ac0a46fSAndroid Build Coastguard Worker 2275*3ac0a46fSAndroid Build Coastguard Worker 2276*3ac0a46fSAndroid Build Coastguard Workerdef _get_class(obj): 2277*3ac0a46fSAndroid Build Coastguard Worker try: 2278*3ac0a46fSAndroid Build Coastguard Worker return obj.__class__ 2279*3ac0a46fSAndroid Build Coastguard Worker except AttributeError: 2280*3ac0a46fSAndroid Build Coastguard Worker # in Python 2, _sre.SRE_Pattern objects have no __class__ 2281*3ac0a46fSAndroid Build Coastguard Worker return type(obj) 2282*3ac0a46fSAndroid Build Coastguard Worker 2283*3ac0a46fSAndroid Build Coastguard Worker 2284*3ac0a46fSAndroid Build Coastguard Workerclass _SpecState(object): 2285*3ac0a46fSAndroid Build Coastguard Worker 2286*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, spec, spec_set=False, parent=None, 2287*3ac0a46fSAndroid Build Coastguard Worker name=None, ids=None, instance=False): 2288*3ac0a46fSAndroid Build Coastguard Worker self.spec = spec 2289*3ac0a46fSAndroid Build Coastguard Worker self.ids = ids 2290*3ac0a46fSAndroid Build Coastguard Worker self.spec_set = spec_set 2291*3ac0a46fSAndroid Build Coastguard Worker self.parent = parent 2292*3ac0a46fSAndroid Build Coastguard Worker self.instance = instance 2293*3ac0a46fSAndroid Build Coastguard Worker self.name = name 2294*3ac0a46fSAndroid Build Coastguard Worker 2295*3ac0a46fSAndroid Build Coastguard Worker 2296*3ac0a46fSAndroid Build Coastguard WorkerFunctionTypes = ( 2297*3ac0a46fSAndroid Build Coastguard Worker # python function 2298*3ac0a46fSAndroid Build Coastguard Worker type(create_autospec), 2299*3ac0a46fSAndroid Build Coastguard Worker # instance method 2300*3ac0a46fSAndroid Build Coastguard Worker type(ANY.__eq__), 2301*3ac0a46fSAndroid Build Coastguard Worker # unbound method 2302*3ac0a46fSAndroid Build Coastguard Worker type(_ANY.__eq__), 2303*3ac0a46fSAndroid Build Coastguard Worker) 2304*3ac0a46fSAndroid Build Coastguard Worker 2305*3ac0a46fSAndroid Build Coastguard WorkerFunctionAttributes = set([ 2306*3ac0a46fSAndroid Build Coastguard Worker 'func_closure', 2307*3ac0a46fSAndroid Build Coastguard Worker 'func_code', 2308*3ac0a46fSAndroid Build Coastguard Worker 'func_defaults', 2309*3ac0a46fSAndroid Build Coastguard Worker 'func_dict', 2310*3ac0a46fSAndroid Build Coastguard Worker 'func_doc', 2311*3ac0a46fSAndroid Build Coastguard Worker 'func_globals', 2312*3ac0a46fSAndroid Build Coastguard Worker 'func_name', 2313*3ac0a46fSAndroid Build Coastguard Worker]) 2314*3ac0a46fSAndroid Build Coastguard Worker 2315*3ac0a46fSAndroid Build Coastguard Worker 2316*3ac0a46fSAndroid Build Coastguard Workerfile_spec = None 2317*3ac0a46fSAndroid Build Coastguard Worker 2318*3ac0a46fSAndroid Build Coastguard Worker 2319*3ac0a46fSAndroid Build Coastguard Workerdef mock_open(mock=None, read_data=''): 2320*3ac0a46fSAndroid Build Coastguard Worker """ 2321*3ac0a46fSAndroid Build Coastguard Worker A helper function to create a mock to replace the use of `open`. It works 2322*3ac0a46fSAndroid Build Coastguard Worker for `open` called directly or used as a context manager. 2323*3ac0a46fSAndroid Build Coastguard Worker 2324*3ac0a46fSAndroid Build Coastguard Worker The `mock` argument is the mock object to configure. If `None` (the 2325*3ac0a46fSAndroid Build Coastguard Worker default) then a `MagicMock` will be created for you, with the API limited 2326*3ac0a46fSAndroid Build Coastguard Worker to methods or attributes available on standard file handles. 2327*3ac0a46fSAndroid Build Coastguard Worker 2328*3ac0a46fSAndroid Build Coastguard Worker `read_data` is a string for the `read` method of the file handle to return. 2329*3ac0a46fSAndroid Build Coastguard Worker This is an empty string by default. 2330*3ac0a46fSAndroid Build Coastguard Worker """ 2331*3ac0a46fSAndroid Build Coastguard Worker global file_spec 2332*3ac0a46fSAndroid Build Coastguard Worker if file_spec is None: 2333*3ac0a46fSAndroid Build Coastguard Worker # set on first use 2334*3ac0a46fSAndroid Build Coastguard Worker if inPy3k: 2335*3ac0a46fSAndroid Build Coastguard Worker import _io 2336*3ac0a46fSAndroid Build Coastguard Worker file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO)))) 2337*3ac0a46fSAndroid Build Coastguard Worker else: 2338*3ac0a46fSAndroid Build Coastguard Worker file_spec = file 2339*3ac0a46fSAndroid Build Coastguard Worker 2340*3ac0a46fSAndroid Build Coastguard Worker if mock is None: 2341*3ac0a46fSAndroid Build Coastguard Worker mock = MagicMock(name='open', spec=open) 2342*3ac0a46fSAndroid Build Coastguard Worker 2343*3ac0a46fSAndroid Build Coastguard Worker handle = MagicMock(spec=file_spec) 2344*3ac0a46fSAndroid Build Coastguard Worker handle.write.return_value = None 2345*3ac0a46fSAndroid Build Coastguard Worker handle.__enter__.return_value = handle 2346*3ac0a46fSAndroid Build Coastguard Worker handle.read.return_value = read_data 2347*3ac0a46fSAndroid Build Coastguard Worker 2348*3ac0a46fSAndroid Build Coastguard Worker mock.return_value = handle 2349*3ac0a46fSAndroid Build Coastguard Worker return mock 2350*3ac0a46fSAndroid Build Coastguard Worker 2351*3ac0a46fSAndroid Build Coastguard Worker 2352*3ac0a46fSAndroid Build Coastguard Workerclass PropertyMock(Mock): 2353*3ac0a46fSAndroid Build Coastguard Worker """ 2354*3ac0a46fSAndroid Build Coastguard Worker A mock intended to be used as a property, or other descriptor, on a class. 2355*3ac0a46fSAndroid Build Coastguard Worker `PropertyMock` provides `__get__` and `__set__` methods so you can specify 2356*3ac0a46fSAndroid Build Coastguard Worker a return value when it is fetched. 2357*3ac0a46fSAndroid Build Coastguard Worker 2358*3ac0a46fSAndroid Build Coastguard Worker Fetching a `PropertyMock` instance from an object calls the mock, with 2359*3ac0a46fSAndroid Build Coastguard Worker no args. Setting it calls the mock with the value being set. 2360*3ac0a46fSAndroid Build Coastguard Worker """ 2361*3ac0a46fSAndroid Build Coastguard Worker def _get_child_mock(self, **kwargs): 2362*3ac0a46fSAndroid Build Coastguard Worker return MagicMock(**kwargs) 2363*3ac0a46fSAndroid Build Coastguard Worker 2364*3ac0a46fSAndroid Build Coastguard Worker def __get__(self, obj, obj_type): 2365*3ac0a46fSAndroid Build Coastguard Worker return self() 2366*3ac0a46fSAndroid Build Coastguard Worker def __set__(self, obj, val): 2367*3ac0a46fSAndroid Build Coastguard Worker self(val) 2368