def test_capture_exception_twice_caches_object(error): try: try: raise RuntimeError() except RuntimeError: err1 = Error.capture_exception() raise except RuntimeError: err2 = Error.capture_exception() assert err1 is err2
def test_capture_exception_twice_caches_object(): try: try: raise RuntimeError() except RuntimeError: err1 = Error.capture_exception() raise except RuntimeError: err2 = Error.capture_exception() assert err1 is err2
def test_self_attribute_throws(): class CustomException(Exception): pass def func(): x = DangerousObject() x.method() class DangerousObject(object): def __getattribute__(self, attr): if attr == '__dict__': 1/0 # pylint: disable=pointless-statement return super(DangerousObject, self).__getattribute__(attr) def method(self): raise CustomException() try: func() except CustomException: error = Error(exc_info=sys.exc_info()) else: assert False, 'Did not raise' locals = error.traceback.frames[-1].locals assert 'self' in locals for key in locals: assert 'self.' not in key
def test_traceback_line_numbers(tmpdir): filename = tmpdir.join('filename.py') with filename.open('w') as f: f.write('''from contextlib import contextmanager def f(): with context(): a = 1 b = 2 g() c = 3 d = 4 def g(): 1/0 @contextmanager def context(): yield ''') mod = emport.import_file(str(filename)) try: mod.f() except ZeroDivisionError: err = Error(exc_info=sys.exc_info()) else: assert False, 'did not fail' assert err.traceback.frames[-2].lineno == 6
def error(): try: func_1() except: return Error.capture_exception() else: assert False, "Did not fail"
def test_dict_getting_raises_exception(): def func(): x = NonDictable() x.method() try: func() except ZeroDivisionError: error_string = Error(exc_info=sys.exc_info()).traceback.to_string(include_vars=True) assert 'self:' in error_string
def test_variable_capping(): def f(): g() def g(): long_var = 'a' * 1000 assert len(long_var) > _MAX_VARIABLE_VALUE_LENGTH 1/0 # pylint: disable=pointless-statement try: f() except ZeroDivisionError: err = Error(exc_info=sys.exc_info()) distilled = err.traceback.to_list() assert len(distilled[-1]['locals']['long_var']['value']) == _MAX_VARIABLE_VALUE_LENGTH
def error(): class MyException(Exception): def __init__(self): super(MyException, self).__init__() self.x = 2 self.y = [str(i) for i in range(10)] self.d = {'some': 'dict', 'here': 'too'} self.unprintable = Unprintable() def func(): raise MyException() try: func() except MyException: return Error(exc_info=sys.exc_info()) else: assert False, 'Did not raise'
def test_error_frame_correction(): class CustomException(Exception): pass def f(): g() def g(): h() def h(): raise mark_exception_frame_correction(CustomException(), +2) try: f() except CustomException: err = Error.capture_exception() assert err.traceback.frames[-1].func_name == 'f'
def assertion_error(tmpdir): filename = tmpdir.join("file.py") filename.write(""" def f(x): return x def g(x): return x def func(): assert f(g(1)) == g(f(2))""") with dessert.rewrite_assertions_context(): module = emport.import_file(str(filename)) try: module.func() except: return Error.capture_exception() else: assert False, "Did not fail"
def test_exception_attributes_with_message(): assert Error('x').exception_attributes is None
def func2(): return Error('some_error')