annotate Lib/test/test_traceback.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 100606ef02cf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 """Test cases for traceback module"""
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
2
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
3 from _testcapi import traceback_print, exception_print
46664
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
4 from io import StringIO
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
5 import sys
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
6 import unittest
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
7 import re
64858
0d0f1db63431 rewrite nocaret test to not rely on a specific SyntaxError
Benjamin Peterson <benjamin@python.org>
parents: 58456
diff changeset
8 from test.support import run_unittest, Error, captured_output
49484
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
9 from test.support import TESTFN, unlink
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11 import traceback
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12
46664
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
13
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
14 class SyntaxTracebackCases(unittest.TestCase):
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
15 # For now, a very minimal set of tests. I want to be sure that
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
16 # formatting of SyntaxErrors works based on changes for 2.1.
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
17
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
18 def get_exception_format(self, func, exc):
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19 try:
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20 func()
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
21 except exc as value:
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22 return traceback.format_exception_only(exc, value)
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
23 else:
43014
9834301a2fd3 Raise statement normalization in Lib/test/.
Collin Winter <collinw@gmail.com>
parents: 42537
diff changeset
24 raise ValueError("call did not raise exception")
17341
83ee63bcf036 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 17117
diff changeset
25
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 def syntax_error_with_caret(self):
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
27 compile("def fact(x):\n\treturn x!\n", "?", "exec")
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28
54583
3a784b217220 Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52877
diff changeset
29 def syntax_error_with_caret_2(self):
3a784b217220 Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52877
diff changeset
30 compile("1 +\n", "?", "exec")
3a784b217220 Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52877
diff changeset
31
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 35890
diff changeset
32 def syntax_error_bad_indentation(self):
40788
e9a6234b26af * Remove PRINT_ITEM(_TO), PRINT_NEWLINE(_TO) opcodes.
Georg Brandl <georg@python.org>
parents: 40775
diff changeset
33 compile("def spam():\n print(1)\n print(2)", "?", "exec")
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 35890
diff changeset
34
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
35 def test_caret(self):
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36 err = self.get_exception_format(self.syntax_error_with_caret,
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
37 SyntaxError)
42188
81930eaae715 Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents: 41969
diff changeset
38 self.assertEqual(len(err), 4)
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
39 self.assertTrue(err[1].strip() == "return x!")
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
40 self.assertIn("^", err[2]) # third line has caret
42188
81930eaae715 Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents: 41969
diff changeset
41 self.assertEqual(err[1].find("!"), err[2].find("^")) # in the right place
17341
83ee63bcf036 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 17117
diff changeset
42
54583
3a784b217220 Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52877
diff changeset
43 err = self.get_exception_format(self.syntax_error_with_caret_2,
3a784b217220 Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52877
diff changeset
44 SyntaxError)
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
45 self.assertIn("^", err[2]) # third line has caret
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
46 self.assertTrue(err[2].count('\n') == 1) # and no additional newline
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
47 self.assertTrue(err[1].find("+") == err[2].find("^")) # in the right place
54583
3a784b217220 Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52877
diff changeset
48
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 def test_nocaret(self):
64858
0d0f1db63431 rewrite nocaret test to not rely on a specific SyntaxError
Benjamin Peterson <benjamin@python.org>
parents: 58456
diff changeset
50 exc = SyntaxError("error", ("x.py", 23, None, "bad syntax"))
0d0f1db63431 rewrite nocaret test to not rely on a specific SyntaxError
Benjamin Peterson <benjamin@python.org>
parents: 58456
diff changeset
51 err = traceback.format_exception_only(SyntaxError, exc)
42188
81930eaae715 Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents: 41969
diff changeset
52 self.assertEqual(len(err), 3)
64858
0d0f1db63431 rewrite nocaret test to not rely on a specific SyntaxError
Benjamin Peterson <benjamin@python.org>
parents: 58456
diff changeset
53 self.assertEqual(err[1].strip(), "bad syntax")
17117
33d8dd02aa99 Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
54
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 35890
diff changeset
55 def test_bad_indentation(self):
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 35890
diff changeset
56 err = self.get_exception_format(self.syntax_error_bad_indentation,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 35890
diff changeset
57 IndentationError)
42188
81930eaae715 Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents: 41969
diff changeset
58 self.assertEqual(len(err), 4)
81930eaae715 Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents: 41969
diff changeset
59 self.assertEqual(err[1].strip(), "print(2)")
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
60 self.assertIn("^", err[2])
42188
81930eaae715 Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents: 41969
diff changeset
61 self.assertEqual(err[1].find(")"), err[2].find("^"))
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 35890
diff changeset
62
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
63 def test_base_exception(self):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
64 # Test that exceptions derived from BaseException are formatted right
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
65 e = KeyboardInterrupt()
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
66 lst = traceback.format_exception_only(e.__class__, e)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
67 self.assertEqual(lst, ['KeyboardInterrupt\n'])
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
68
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
69 def test_format_exception_only_bad__str__(self):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
70 class X(Exception):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
71 def __str__(self):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
72 1/0
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
73 err = traceback.format_exception_only(X, X())
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
74 self.assertEqual(len(err), 1)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
75 str_value = '<unprintable %s object>' % X.__name__
44098
0889daf6d0d9 #1535: rename __builtin__ module to builtins.
Georg Brandl <georg@python.org>
parents: 43014
diff changeset
76 if X.__module__ in ('__main__', 'builtins'):
40958
e5e9837da70b Tweak the fix for test_traceback since the fix for it to run on its own broke
Brett Cannon <bcannon@gmail.com>
parents: 40954
diff changeset
77 str_name = X.__name__
e5e9837da70b Tweak the fix for test_traceback since the fix for it to run on its own broke
Brett Cannon <bcannon@gmail.com>
parents: 40954
diff changeset
78 else:
e5e9837da70b Tweak the fix for test_traceback since the fix for it to run on its own broke
Brett Cannon <bcannon@gmail.com>
parents: 40954
diff changeset
79 str_name = '.'.join([X.__module__, X.__name__])
e5e9837da70b Tweak the fix for test_traceback since the fix for it to run on its own broke
Brett Cannon <bcannon@gmail.com>
parents: 40954
diff changeset
80 self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value))
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
81
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39690
diff changeset
82 def test_without_exception(self):
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39690
diff changeset
83 err = traceback.format_exception_only(None, None)
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39690
diff changeset
84 self.assertEqual(err, ['None\n'])
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39690
diff changeset
85
49484
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
86 def test_encoded_file(self):
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
87 # Test that tracebacks are correctly printed for encoded source files:
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
88 # - correct line number (Issue2384)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
89 # - respect file encoding (Issue3975)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
90 import tempfile, sys, subprocess, os
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
91
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
92 # The spawned subprocess has its stdout redirected to a PIPE, and its
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
93 # encoding may be different from the current interpreter, on Windows
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
94 # at least.
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
95 process = subprocess.Popen([sys.executable, "-c",
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
96 "import sys; print(sys.stdout.encoding)"],
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
97 stdout=subprocess.PIPE,
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
98 stderr=subprocess.STDOUT)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
99 stdout, stderr = process.communicate()
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
100 output_encoding = str(stdout, 'ascii').splitlines()[0]
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
101
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
102 def do_test(firstlines, message, charset, lineno):
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
103 # Raise the message in a subprocess, and catch the output
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
104 try:
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
105 output = open(TESTFN, "w", encoding=charset)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
106 output.write("""{0}if 1:
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
107 import traceback;
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
108 raise RuntimeError('{1}')
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
109 """.format(firstlines, message))
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
110 output.close()
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
111 process = subprocess.Popen([sys.executable, TESTFN],
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
112 stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
113 stdout, stderr = process.communicate()
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
114 stdout = stdout.decode(output_encoding).splitlines()
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
115 finally:
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
116 unlink(TESTFN)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
117
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
118 # The source lines are encoded with the 'backslashreplace' handler
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
119 encoded_message = message.encode(output_encoding,
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
120 'backslashreplace')
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
121 # and we just decoded them with the output_encoding.
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
122 message_ascii = encoded_message.decode(output_encoding)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
123
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
124 err_line = "raise RuntimeError('{0}')".format(message_ascii)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
125 err_msg = "RuntimeError: {0}".format(message_ascii)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
126
58456
f0f221e1a7c0 use assert[Not]In where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58415
diff changeset
127 self.assertIn(("line %s" % lineno), stdout[1],
49484
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
128 "Invalid line number: {0!r} instead of {1}".format(
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
129 stdout[1], lineno))
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
130 self.assertTrue(stdout[2].endswith(err_line),
49484
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
131 "Invalid traceback line: {0!r} instead of {1!r}".format(
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
132 stdout[2], err_line))
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
133 self.assertTrue(stdout[3] == err_msg,
49484
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
134 "Invalid error message: {0!r} instead of {1!r}".format(
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
135 stdout[3], err_msg))
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
136
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
137 do_test("", "foo", "ascii", 3)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
138 for charset in ("ascii", "iso-8859-1", "utf-8", "GBK"):
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
139 if charset == "ascii":
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
140 text = "foo"
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
141 elif charset == "GBK":
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
142 text = "\u4E02\u5100"
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
143 else:
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
144 text = "h\xe9 ho"
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
145 do_test("# coding: {0}\n".format(charset),
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
146 text, charset, 4)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
147 do_test("#!shebang\n# coding: {0}\n".format(charset),
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
148 text, charset, 5)
0b7e023803fb Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48474
diff changeset
149
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
150
46664
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
151 class TracebackFormatTests(unittest.TestCase):
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
152
85046
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
153 def some_exception(self):
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
154 raise KeyError('blah')
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
155
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
156 def check_traceback_format(self, cleanup_func=None):
52877
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
157 try:
85046
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
158 self.some_exception()
52877
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
159 except KeyError:
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
160 type_, value, tb = sys.exc_info()
85046
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
161 if cleanup_func is not None:
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
162 # Clear the inner frames, not this one
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
163 cleanup_func(tb.tb_next)
52877
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
164 traceback_fmt = 'Traceback (most recent call last):\n' + \
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
165 ''.join(traceback.format_tb(tb))
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
166 file_ = StringIO()
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
167 traceback_print(tb, file_)
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
168 python_fmt = file_.getvalue()
83553
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
169 # Call all _tb and _exc functions
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
170 with captured_output("stderr") as tbstderr:
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
171 traceback.print_tb(tb)
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
172 tbfile = StringIO()
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
173 traceback.print_tb(tb, file=tbfile)
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
174 with captured_output("stderr") as excstderr:
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
175 traceback.print_exc()
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
176 excfmt = traceback.format_exc()
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
177 excfile = StringIO()
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
178 traceback.print_exc(file=excfile)
52877
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
179 else:
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
180 raise Error("unable to create test traceback string")
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
181
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
182 # Make sure that Python and the traceback module format the same thing
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
183 self.assertEqual(traceback_fmt, python_fmt)
83553
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
184 # Now verify the _tb func output
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
185 self.assertEqual(tbstderr.getvalue(), tbfile.getvalue())
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
186 # Now verify the _exc func output
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
187 self.assertEqual(excstderr.getvalue(), excfile.getvalue())
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
188 self.assertEqual(excfmt, excfile.getvalue())
52877
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
189
46664
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
190 # Make sure that the traceback is properly indented.
52877
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
191 tb_lines = python_fmt.splitlines()
85046
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
192 self.assertEqual(len(tb_lines), 5)
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
193 banner = tb_lines[0]
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
194 location, source_line = tb_lines[-2:]
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
195 self.assertTrue(banner.startswith('Traceback'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
196 self.assertTrue(location.startswith(' File'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
197 self.assertTrue(source_line.startswith(' raise'))
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
198
85046
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
199 def test_traceback_format(self):
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
200 self.check_traceback_format()
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
201
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
202 def test_traceback_format_with_cleared_frames(self):
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
203 # Check that traceback formatting also works with a clear()ed frame
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
204 def cleanup_tb(tb):
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
205 tb.tb_frame.clear()
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
206 self.check_traceback_format(cleanup_tb)
862ab99ab570 Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83553
diff changeset
207
83553
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
208 def test_stack_format(self):
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
209 # Verify _stack functions. Note we have to use _getframe(1) to
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
210 # compare them without this frame appearing in the output
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
211 with captured_output("stderr") as ststderr:
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
212 traceback.print_stack(sys._getframe(1))
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
213 stfile = StringIO()
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
214 traceback.print_stack(sys._getframe(1), file=stfile)
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
215 self.assertEqual(ststderr.getvalue(), stfile.getvalue())
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
216
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
217 stfmt = traceback.format_stack(sys._getframe(1))
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
218
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
219 self.assertEqual(ststderr.getvalue(), "".join(stfmt))
84cef4f1999a refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents: 75292
diff changeset
220
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
221
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
222 cause_message = (
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
223 "\nThe above exception was the direct cause "
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
224 "of the following exception:\n\n")
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
225
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
226 context_message = (
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
227 "\nDuring handling of the above exception, "
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
228 "another exception occurred:\n\n")
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
229
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
230 boundaries = re.compile(
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
231 '(%s|%s)' % (re.escape(cause_message), re.escape(context_message)))
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
232
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
233
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
234 class BaseExceptionReportingTests:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
235
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
236 def get_exception(self, exception_or_callable):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
237 if isinstance(exception_or_callable, Exception):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
238 return exception_or_callable
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
239 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
240 exception_or_callable()
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
241 except Exception as e:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
242 return e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
243
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
244 def zero_div(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
245 1/0 # In zero_div
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
246
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
247 def check_zero_div(self, msg):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
248 lines = msg.splitlines()
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
249 self.assertTrue(lines[-3].startswith(' File'))
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
250 self.assertIn('1/0 # In zero_div', lines[-2])
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
251 self.assertTrue(lines[-1].startswith('ZeroDivisionError'), lines[-1])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
252
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
253 def test_simple(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
254 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
255 1/0 # Marker
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
256 except ZeroDivisionError as _:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
257 e = _
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
258 lines = self.get_report(e).splitlines()
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
259 self.assertEqual(len(lines), 4)
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
260 self.assertTrue(lines[0].startswith('Traceback'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
261 self.assertTrue(lines[1].startswith(' File'))
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
262 self.assertIn('1/0 # Marker', lines[2])
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
263 self.assertTrue(lines[3].startswith('ZeroDivisionError'))
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
264
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
265 def test_cause(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
266 def inner_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
267 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
268 self.zero_div()
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
269 except ZeroDivisionError as e:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
270 raise KeyError from e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
271 def outer_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
272 inner_raise() # Marker
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
273 blocks = boundaries.split(self.get_report(outer_raise))
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
274 self.assertEqual(len(blocks), 3)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
275 self.assertEqual(blocks[1], cause_message)
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
276 self.check_zero_div(blocks[0])
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
277 self.assertIn('inner_raise() # Marker', blocks[2])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
278
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
279 def test_context(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
280 def inner_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
281 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
282 self.zero_div()
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
283 except ZeroDivisionError:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
284 raise KeyError
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
285 def outer_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
286 inner_raise() # Marker
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
287 blocks = boundaries.split(self.get_report(outer_raise))
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
288 self.assertEqual(len(blocks), 3)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
289 self.assertEqual(blocks[1], context_message)
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
290 self.check_zero_div(blocks[0])
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
291 self.assertIn('inner_raise() # Marker', blocks[2])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
292
75292
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
293 def test_context_suppression(self):
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
294 try:
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
295 try:
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
296 raise Exception
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
297 except:
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
298 raise ZeroDivisionError from None
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
299 except ZeroDivisionError as _:
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
300 e = _
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
301 lines = self.get_report(e).splitlines()
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
302 self.assertEqual(len(lines), 4)
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
303 self.assertTrue(lines[0].startswith('Traceback'))
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
304 self.assertTrue(lines[1].startswith(' File'))
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
305 self.assertIn('ZeroDivisionError from None', lines[2])
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
306 self.assertTrue(lines[3].startswith('ZeroDivisionError'))
b299c4f31ff2 Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents: 68257
diff changeset
307
57498
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
308 def test_cause_and_context(self):
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
309 # When both a cause and a context are set, only the cause should be
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
310 # displayed and the context should be muted.
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
311 def inner_raise():
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
312 try:
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
313 self.zero_div()
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
314 except ZeroDivisionError as _e:
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
315 e = _e
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
316 try:
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
317 xyzzy
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
318 except NameError:
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
319 raise KeyError from e
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
320 def outer_raise():
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
321 inner_raise() # Marker
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
322 blocks = boundaries.split(self.get_report(outer_raise))
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
323 self.assertEqual(len(blocks), 3)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
324 self.assertEqual(blocks[1], cause_message)
57498
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
325 self.check_zero_div(blocks[0])
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
326 self.assertIn('inner_raise() # Marker', blocks[2])
57498
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
327
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
328 def test_cause_recursive(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
329 def inner_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
330 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
331 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
332 self.zero_div()
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
333 except ZeroDivisionError as e:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
334 z = e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
335 raise KeyError from e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
336 except KeyError as e:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
337 raise z from e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
338 def outer_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
339 inner_raise() # Marker
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
340 blocks = boundaries.split(self.get_report(outer_raise))
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
341 self.assertEqual(len(blocks), 3)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
342 self.assertEqual(blocks[1], cause_message)
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
343 # The first block is the KeyError raised from the ZeroDivisionError
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
344 self.assertIn('raise KeyError from e', blocks[0])
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
345 self.assertNotIn('1/0', blocks[0])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
346 # The second block (apart from the boundary) is the ZeroDivisionError
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
347 # re-raised from the KeyError
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
348 self.assertIn('inner_raise() # Marker', blocks[2])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
349 self.check_zero_div(blocks[2])
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
350
65615
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
351 def test_syntax_error_offset_at_eol(self):
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
352 # See #10186.
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
353 def e():
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
354 raise SyntaxError('', ('', 0, 5, 'hello'))
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
355 msg = self.get_report(e).splitlines()
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
356 self.assertEqual(msg[-2], " ^")
65696
e8c8400caa99 Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65615
diff changeset
357 def e():
e8c8400caa99 Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65615
diff changeset
358 exec("x = 5 | 4 |")
e8c8400caa99 Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65615
diff changeset
359 msg = self.get_report(e).splitlines()
e8c8400caa99 Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65615
diff changeset
360 self.assertEqual(msg[-2], ' ^')
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
361
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
362
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
363 class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
364 #
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
365 # This checks reporting through the 'traceback' module, with both
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
366 # format_exception() and print_exception().
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
367 #
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
368
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
369 def get_report(self, e):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
370 e = self.get_exception(e)
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
371 s = ''.join(
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
372 traceback.format_exception(type(e), e, e.__traceback__))
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
373 with captured_output("stderr") as sio:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
374 traceback.print_exception(type(e), e, e.__traceback__)
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
375 self.assertEqual(sio.getvalue(), s)
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
376 return s
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
377
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
378
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
379 class CExcReportingTests(BaseExceptionReportingTests, unittest.TestCase):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
380 #
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
381 # This checks built-in reporting by the interpreter.
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
382 #
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
383
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
384 def get_report(self, e):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
385 e = self.get_exception(e)
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
386 with captured_output("stderr") as s:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
387 exception_print(e)
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
388 return s.getvalue()
46664
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
389
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44098
diff changeset
390
85723
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
391 class MiscTracebackCases(unittest.TestCase):
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
392 #
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
393 # Check non-printing functions in traceback module
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
394 #
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
395
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
396 def test_clear(self):
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
397 def outer():
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
398 middle()
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
399 def middle():
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
400 inner()
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
401 def inner():
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
402 i = 1
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
403 1/0
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
404
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
405 try:
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
406 outer()
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
407 except:
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
408 type_, value, tb = sys.exc_info()
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
409
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
410 # Initial assertion: there's one local in the inner frame.
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
411 inner_frame = tb.tb_next.tb_next.tb_next.tb_frame
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
412 self.assertEqual(len(inner_frame.f_locals), 1)
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
413
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
414 # Clear traceback frames
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
415 traceback.clear_frames(tb)
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
416
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
417 # Local variable dict should now be empty.
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
418 self.assertEqual(len(inner_frame.f_locals), 0)
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
419
100606ef02cf #1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents: 85046
diff changeset
420
20013
e3184e46303b Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents: 17558
diff changeset
421 def test_main():
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
422 run_unittest(__name__)
20013
e3184e46303b Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents: 17558
diff changeset
423
e3184e46303b Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents: 17558
diff changeset
424 if __name__ == "__main__":
e3184e46303b Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents: 17558
diff changeset
425 test_main()