def test_format_bad_filename(self): # Filenames in Python2 may be bytestrings that will fail to implicit # decode. # This won't decode via the implicit(ascii) codec or the default # fs encoding (unless the encoding is a wildcard encoding). fname = b('\x8b') lines = u("1\n2\n3\n") fake_module = dict(__name__='fred', __loader__=FakeLoader(lines)) linecache.updatecache(fname, fake_module) e = SyntaxError("uh oh") e.filename = fname e.lineno = 2 e.text = b('something wrong') e.offset = 1 c = test_code(fname, 'method') f = test_frame(c, fake_module, {'something': 1}) tb = test_tb(f, 2, None) exc = traceback.TracebackException(SyntaxError, e, tb) list(exc.format_exception_only()) self.assertEqual([ u('Traceback (most recent call last):\n'), b(' File "b\'\\x8b\'", line 2, in method\n 2\n').decode(), b(' File "b\'\\x8b\'", line 2\n').decode(), u(' something wrong\n'), u(' ^\n'), u('SyntaxError: uh oh\n') ], list(exc.format()))
def test_syntax_undecoded_lines(self): # If the interpreter returns bytestrings, we have to decode ourselves. lines = u("1\n\u5341\n3\n") fake_module = dict( __name__='fred', __loader__=FakeLoader(lines) ) linecache.updatecache('/foo.py', fake_module) e = SyntaxError("uh oh") e.filename = '/foo.py' e.lineno = 2 e.text = b('something wrong') e.offset = 1 c = test_code('/foo.py', 'method') f = test_frame(c, fake_module, {'something': 1}) tb = test_tb(f, 2, None) exc = traceback.TracebackException(SyntaxError, e, tb) list(exc.format_exception_only()) self.assertEqual([ u('Traceback (most recent call last):\n'), u(' File "/foo.py", line 2, in method\n \u5341\n'), u(' File "/foo.py", line 2\n'), u(' \u5341\n'), u(' ^\n'), u('SyntaxError: uh oh\n')], list(exc.format()))
def test_format_unicode_filename(self): # Filenames in Python2 may be bytestrings that will fail to implicit # decode. fname = u('\u5341').encode(sys.getfilesystemencoding()) lines = u("1\n2\n3\n") fake_module = dict(__name__='fred', __loader__=FakeLoader(lines)) linecache.updatecache(fname, fake_module) e = SyntaxError("uh oh") e.filename = fname e.lineno = 2 e.text = b('something wrong') e.offset = 1 c = test_code(fname, 'method') f = test_frame(c, fake_module, {'something': 1}) tb = test_tb(f, 2, None) exc = traceback.TracebackException(SyntaxError, e, tb) list(exc.format_exception_only()) self.assertEqual([ u('Traceback (most recent call last):\n'), u(' File "\u5341", line 2, in method\n 2\n'), u(' File "\u5341", line 2\n'), u(' something wrong\n'), u(' ^\n'), u('SyntaxError: uh oh\n') ], list(exc.format()))
def _exc_info_to_string(self, err, test): """Converts a sys.exc_info()-style tuple of values into a string.""" exctype, value, tb = err # Skip test runner traceback levels while tb and self._is_relevant_tb_level(tb): tb = tb.tb_next if exctype is test.failureException: # Skip assert*() traceback levels length = self._count_relevant_tb_levels(tb) else: length = None tb_e = traceback.TracebackException(exctype, value, tb, limit=length, capture_locals=self.tb_locals) msgLines = list(tb_e.format()) if self.buffer: output = sys.stdout.getvalue() error = sys.stderr.getvalue() if output: if not output.endswith('\n'): output += '\n' msgLines.append(STDOUT_LINE % output) if error: if not error.endswith('\n'): error += '\n' msgLines.append(STDERR_LINE % error) return ''.join(msgLines)
def test_no_locals(self): linecache.updatecache('/foo.py', fake_module) e = Exception("uh oh") c = test_code('/foo.py', 'method') f = test_frame(c, fake_module, {'something': 1}) tb = test_tb(f, 6, None) exc = traceback.TracebackException(Exception, e, tb) self.assertEqual(exc.stack[0].locals, None)
def test_context(self): try: try: 1 / 0 finally: exc_info_context = sys.exc_info() exc_context = traceback.TracebackException(*exc_info_context) raise Exception("uh oh") except Exception: exc_info = sys.exc_info() exc = traceback.TracebackException(*exc_info) expected_stack = traceback.StackSummary.extract( traceback.walk_tb(exc_info[2])) self.assertEqual(None, exc.__cause__) self.assertEqual(exc_context, exc.__context__) self.assertEqual(False, exc.__suppress_context__) self.assertEqual(expected_stack, exc.stack) self.assertEqual(exc_info[0], exc.exc_type) self.assertEqual(str(exc_info[1]), str(exc))
def test_locals(self): linecache.updatecache('/foo.py', fake_module) e = Exception("uh oh") c = test_code('/foo.py', 'method') f = test_frame(c, globals(), {'something': 1, 'other': 'string'}) tb = test_tb(f, 6, None) exc = traceback.TracebackException( Exception, e, tb, capture_locals=True) self.assertEqual( exc.stack[0].locals, {'something': '1', 'other': "'string'"})
def test_lookup_lines(self): linecache.clearcache() e = Exception("uh oh") c = test_code('/foo.py', 'method') f = test_frame(c, None, None) tb = test_tb(f, 8, None) exc = traceback.TracebackException(Exception, e, tb, lookup_lines=False) self.assertEqual({}, linecache.cache) linecache.updatecache('/foo.py', fake_module) self.assertEqual(exc.stack[0].line, "import sys")
def test_cause(self): try: try: 1 / 0 finally: exc_info_context = sys.exc_info() exc_context = traceback.TracebackException(*exc_info_context) cause = Exception("cause") raise_from(Exception("uh ok"), cause) except Exception: exc_info = sys.exc_info() exc = traceback.TracebackException(*exc_info) expected_stack = traceback.StackSummary.extract( traceback.walk_tb(exc_info[2])) exc_cause = traceback.TracebackException(Exception, cause, None) self.assertEqual(exc_cause, exc.__cause__) self.assertEqual(exc_context, exc.__context__) if hasattr(exc_info[1], '__suppress_context__'): self.assertEqual(True, exc.__suppress_context__) self.assertEqual(expected_stack, exc.stack) self.assertEqual(exc_info[0], exc.exc_type) self.assertEqual(str(exc_info[1]), str(exc))
def test_syntax_no_extras(self): linecache.updatecache('/foo.py', fake_module) e = SyntaxError("uh oh") c = test_code('/foo.py', 'method') f = test_frame(c, fake_module, {'something': 1}) tb = test_tb(f, 6, None) exc = traceback.TracebackException(SyntaxError, e, tb) self.assertEqual([ u('Traceback (most recent call last):\n'), u(' File "/foo.py", line 6, in method\n from io import StringIO\n'), u(' File "<string>", line None\n'), u('SyntaxError: uh oh\n')], list(exc.format()))
def test_limit(self): def recurse(n): if n: recurse(n-1) else: 1/0 try: recurse(10) except Exception: exc_info = sys.exc_info() exc = traceback.TracebackException(*exc_info, limit=5) expected_stack = traceback.StackSummary.extract( traceback.walk_tb(exc_info[2]), limit=5) self.assertEqual(expected_stack, exc.stack)
def test_traceback_header(self): # do not print a traceback header if exc_traceback is None # see issue #24695 exc = traceback.TracebackException(Exception, Exception("haven"), None) self.assertEqual(list(exc.format()), [u("Exception: haven\n")])