from paste.exceptions import formatter from paste.exceptions import collector import sys import os import difflib class Mock(object): def __init__(self, **kw): for name, value in kw.items(): setattr(self, name, value) class Supplement(Mock): object = 'test_object' source_url = 'http://whatever.com' info = 'This is some supplemental information' args = () def getInfo(self): return self.info def __call__(self, *args): self.args = args return self class BadSupplement(Supplement): def getInfo(self): raise ValueError("This supplemental info is buggy") def call_error(sup): 1 + 2 __traceback_supplement__ = (sup, ()) assert 0, "I am an error" def raise_error(sup='default'): if sup == 'default': sup = Supplement() for i in range(10): __traceback_info__ = i if i == 5: call_error(sup=sup) def hide(t, inner, *args, **kw): __traceback_hide__ = t return inner(*args, **kw) def pass_through(info, inner, *args, **kw): """ To add another frame to the call; detectable because __tracback_info__ is set to `info` """ __traceback_info__ = info return inner(*args, **kw) def format(type='html', **ops): data = collector.collect_exception(*sys.exc_info()) report = getattr(formatter, 'format_' + type)(data, **ops) return report formats = ('text', 'html') def test_excersize(): for f in formats: try: raise_error() except: format(f) def test_content(): for f in formats: try: raise_error() except: result = format(f) print(result) assert 'test_object' in result assert 'http://whatever.com' in result assert 'This is some supplemental information' in result assert 'raise_error' in result assert 'call_error' in result assert '5' in result assert 'test_content' in result else: assert 0 def test_trim(): current = os.path.abspath(os.getcwd()) for f in formats: try: raise_error() except: result = format(f, trim_source_paths=[(current, '.')]) assert current not in result assert ('%stest_formatter.py' % os.sep) in result, ValueError(repr(result)) else: assert 0 def test_hide(): for f in formats: try: hide(True, raise_error) except: result = format(f) print(result) assert 'in hide_inner' not in result assert 'inner(*args, **kw)' not in result else: assert 0 def print_diff(s1, s2): differ = difflib.Differ() result = list(differ.compare(s1.splitlines(), s2.splitlines())) print('\n'.join(result)) def test_hide_supppressed(): """ When an error occurs and __traceback_stop__ is true for the erroneous frame, then that setting should be ignored. """ for f in ['html']: #formats: results = [] for hide_value in (False, 'after'): try: pass_through( 'a', hide, hide_value, pass_through, 'b', raise_error) except: results.append(format(f)) else: assert 0 if results[0] != results[1]: print_diff(results[0], results[1]) assert 0 def test_hide_after(): for f in formats: try: pass_through( 'AABB', hide, 'after', pass_through, 'CCDD', # A little whitespace to keep this line out of the # content part of the report hide, 'reset', raise_error) except: result = format(f) assert 'AABB' in result assert 'CCDD' not in result assert 'raise_error' in result else: assert 0 def test_hide_before(): for f in formats: try: pass_through( 'AABB', hide, 'before', raise_error) except: result = format(f) print(result) assert 'AABB' not in result assert 'raise_error' in result else: assert 0 def test_make_wrappable(): assert '' in formatter.make_wrappable('x'*1000) # I'm just going to test that this doesn't excede the stack limit: formatter.make_wrappable(';'*2000) assert (formatter.make_wrappable('this that the other') == 'this that the other') assert (formatter.make_wrappable('this that ' + ('x'*50) + ';' + ('y'*50) + ' and the other') == 'this that '+('x'*50) + ';' + ('y'*50) + ' and the other')