annotate Lib/test/test_traceback.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 3c9232a684ae
children b299c4f31ff2
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
52877
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
153 def test_traceback_format(self):
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
154 try:
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
155 raise KeyError('blah')
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
156 except KeyError:
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
157 type_, value, tb = sys.exc_info()
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
158 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
159 ''.join(traceback.format_tb(tb))
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
160 file_ = StringIO()
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
161 traceback_print(tb, file_)
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
162 python_fmt = file_.getvalue()
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
163 else:
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
164 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
165
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
166 # 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
167 self.assertEqual(traceback_fmt, python_fmt)
52877
37d6af6f85aa Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49484
diff changeset
168
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
169 # 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
170 tb_lines = python_fmt.splitlines()
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
171 self.assertEqual(len(tb_lines), 3)
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
172 banner, location, source_line = tb_lines
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
173 self.assertTrue(banner.startswith('Traceback'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
174 self.assertTrue(location.startswith(' File'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
175 self.assertTrue(source_line.startswith(' raise'))
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
176
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
177
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
178 cause_message = (
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
179 "\nThe above exception was the direct cause "
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
180 "of the following exception:\n\n")
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
181
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
182 context_message = (
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
183 "\nDuring handling of the above exception, "
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
184 "another exception occurred:\n\n")
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
185
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
186 boundaries = re.compile(
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
187 '(%s|%s)' % (re.escape(cause_message), re.escape(context_message)))
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
188
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
189
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
190 class BaseExceptionReportingTests:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
191
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
192 def get_exception(self, exception_or_callable):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
193 if isinstance(exception_or_callable, Exception):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
194 return exception_or_callable
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
195 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
196 exception_or_callable()
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
197 except Exception as e:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
198 return e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
199
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
200 def zero_div(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
201 1/0 # In zero_div
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
202
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
203 def check_zero_div(self, msg):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
204 lines = msg.splitlines()
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
205 self.assertTrue(lines[-3].startswith(' File'))
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
206 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
207 self.assertTrue(lines[-1].startswith('ZeroDivisionError'), lines[-1])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
208
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
209 def test_simple(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
210 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
211 1/0 # Marker
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
212 except ZeroDivisionError as _:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
213 e = _
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
214 lines = self.get_report(e).splitlines()
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
215 self.assertEqual(len(lines), 4)
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
216 self.assertTrue(lines[0].startswith('Traceback'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
217 self.assertTrue(lines[1].startswith(' File'))
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
218 self.assertIn('1/0 # Marker', lines[2])
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54583
diff changeset
219 self.assertTrue(lines[3].startswith('ZeroDivisionError'))
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
220
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
221 def test_cause(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
222 def inner_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
223 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
224 self.zero_div()
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
225 except ZeroDivisionError as e:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
226 raise KeyError from e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
227 def outer_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
228 inner_raise() # Marker
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
229 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
230 self.assertEqual(len(blocks), 3)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
231 self.assertEqual(blocks[1], cause_message)
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
232 self.check_zero_div(blocks[0])
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
233 self.assertIn('inner_raise() # Marker', blocks[2])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
234
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
235 def test_context(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
236 def inner_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
237 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
238 self.zero_div()
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
239 except ZeroDivisionError:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
240 raise KeyError
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
241 def outer_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
242 inner_raise() # Marker
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
243 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
244 self.assertEqual(len(blocks), 3)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
245 self.assertEqual(blocks[1], context_message)
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
246 self.check_zero_div(blocks[0])
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
247 self.assertIn('inner_raise() # Marker', blocks[2])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
248
57498
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
249 def test_cause_and_context(self):
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
250 # 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
251 # displayed and the context should be muted.
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
252 def inner_raise():
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
253 try:
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
254 self.zero_div()
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
255 except ZeroDivisionError as _e:
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
256 e = _e
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
257 try:
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
258 xyzzy
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
259 except NameError:
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
260 raise KeyError from e
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
261 def outer_raise():
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
262 inner_raise() # Marker
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
263 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
264 self.assertEqual(len(blocks), 3)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
265 self.assertEqual(blocks[1], cause_message)
57498
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
266 self.check_zero_div(blocks[0])
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
267 self.assertIn('inner_raise() # Marker', blocks[2])
57498
4bed796ee0d7 Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
268
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
269 def test_cause_recursive(self):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
270 def inner_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
271 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
272 try:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
273 self.zero_div()
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
274 except ZeroDivisionError as e:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
275 z = e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
276 raise KeyError from e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
277 except KeyError as e:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
278 raise z from e
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
279 def outer_raise():
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
280 inner_raise() # Marker
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
281 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
282 self.assertEqual(len(blocks), 3)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65696
diff changeset
283 self.assertEqual(blocks[1], cause_message)
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
284 # 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
285 self.assertIn('raise KeyError from e', blocks[0])
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
286 self.assertNotIn('1/0', blocks[0])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
287 # The second block (apart from the boundary) is the ZeroDivisionError
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
288 # re-raised from the KeyError
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
289 self.assertIn('inner_raise() # Marker', blocks[2])
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
290 self.check_zero_div(blocks[2])
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
291
65615
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
292 def test_syntax_error_offset_at_eol(self):
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
293 # See #10186.
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
294 def e():
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
295 raise SyntaxError('', ('', 0, 5, 'hello'))
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
296 msg = self.get_report(e).splitlines()
53639e57ba40 Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57498
diff changeset
297 self.assertEqual(msg[-2], " ^")
65696
e8c8400caa99 Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65615
diff changeset
298 def e():
e8c8400caa99 Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65615
diff changeset
299 exec("x = 5 | 4 |")
e8c8400caa99 Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65615
diff changeset
300 msg = self.get_report(e).splitlines()
e8c8400caa99 Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65615
diff changeset
301 self.assertEqual(msg[-2], ' ^')
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
302
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
303
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
304 class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
305 #
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
306 # This checks reporting through the 'traceback' module, with both
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
307 # format_exception() and print_exception().
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
308 #
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
309
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
310 def get_report(self, e):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
311 e = self.get_exception(e)
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
312 s = ''.join(
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
313 traceback.format_exception(type(e), e, e.__traceback__))
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
314 with captured_output("stderr") as sio:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
315 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
316 self.assertEqual(sio.getvalue(), s)
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
317 return s
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
318
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
319
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
320 class CExcReportingTests(BaseExceptionReportingTests, unittest.TestCase):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
321 #
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
322 # This checks built-in reporting by the interpreter.
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
323 #
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
324
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
325 def get_report(self, e):
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
326 e = self.get_exception(e)
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
327 with captured_output("stderr") as s:
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
328 exception_print(e)
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
329 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
330
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
331
20013
e3184e46303b Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents: 17558
diff changeset
332 def test_main():
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
333 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
334
e3184e46303b Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents: 17558
diff changeset
335 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
336 test_main()