Mercurial > cpython-lru_cache-weakref
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 |
| 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() |
