Skip to content

Commit

Permalink
pythongh-92118: Add test for traceback when exception is modified by …
Browse files Browse the repository at this point in the history
…(Async)ExitStack.__exit__ (pythonGH-92339)

(cherry picked from commit e65e587)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
  • Loading branch information
iritkatriel authored and miss-islington committed May 5, 2022
1 parent bb2dcf1 commit 343813a
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
36 changes: 36 additions & 0 deletions Lib/test/test_contextlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -701,6 +701,38 @@ def test_exit_suppress(self):
stack.push(lambda *exc: True)
1/0

def test_exit_exception_traceback(self):
# This test captures the current behavior of ExitStack so that we know
# if we ever unintendedly change it. It is not a statement of what the
# desired behavior is (for instance, we may want to remove some of the
# internal contextlib frames).

def raise_exc(exc):
raise exc

try:
with self.exit_stack() as stack:
stack.callback(raise_exc, ValueError)
1/0
except ValueError as e:
exc = e

self.assertIsInstance(exc, ValueError)
ve_frames = traceback.extract_tb(exc.__traceback__)
expected = \
[('test_exit_exception_traceback', 'with self.exit_stack() as stack:')] + \
self.callback_error_internal_frames + \
[('_exit_wrapper', 'callback(*args, **kwds)'),
('raise_exc', 'raise exc')]

self.assertEqual(
[(f.name, f.line) for f in ve_frames], expected)

self.assertIsInstance(exc.__context__, ZeroDivisionError)
zde_frames = traceback.extract_tb(exc.__context__.__traceback__)
self.assertEqual([(f.name, f.line) for f in zde_frames],
[('test_exit_exception_traceback', '1/0')])

def test_exit_exception_chaining_reference(self):
# Sanity check to make sure that ExitStack chaining matches
# actual nested with statements
Expand Down Expand Up @@ -968,6 +1000,10 @@ def first():

class TestExitStack(TestBaseExitStack, unittest.TestCase):
exit_stack = ExitStack
callback_error_internal_frames = [
('__exit__', 'raise exc_details[1]'),
('__exit__', 'if cb(*exc_details):'),
]


class TestRedirectStream:
Expand Down
7 changes: 7 additions & 0 deletions Lib/test/test_contextlib_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,13 @@ def __exit__(self, *exc_details):
return self.run_coroutine(self.__aexit__(*exc_details))

exit_stack = SyncAsyncExitStack
callback_error_internal_frames = [
('__exit__', 'return self.run_coroutine(self.__aexit__(*exc_details))'),
('run_coroutine', 'raise exc'),
('run_coroutine', 'raise exc'),
('__aexit__', 'raise exc_details[1]'),
('__aexit__', 'cb_suppress = cb(*exc_details)'),
]

def setUp(self):
self.loop = asyncio.new_event_loop()
Expand Down

0 comments on commit 343813a

Please sign in to comment.