def _convert_future_exc(exc):
exc_class = type(exc)
if exc_class is concurrent.futures.CancelledError:
- return exceptions.CancelledError(*exc.args)
- elif exc_class is concurrent.futures.TimeoutError:
- return exceptions.TimeoutError(*exc.args)
+ return exceptions.CancelledError(*exc.args).with_traceback(exc.__traceback__)
elif exc_class is concurrent.futures.InvalidStateError:
- return exceptions.InvalidStateError(*exc.args)
+ return exceptions.InvalidStateError(*exc.args).with_traceback(exc.__traceback__)
else:
return exc
import re
import sys
import threading
+import traceback
import unittest
from unittest import mock
from types import GenericAlias
_copy_future_state(f_cancelled, newf_cancelled)
self.assertTrue(newf_cancelled.cancelled())
+ try:
+ raise concurrent.futures.InvalidStateError
+ except BaseException as e:
+ f_exc = e
+
+ f_conexc = self._new_future(loop=self.loop)
+ f_conexc.set_exception(f_exc)
+
+ newf_conexc = self._new_future(loop=self.loop)
+ _copy_future_state(f_conexc, newf_conexc)
+ self.assertTrue(newf_conexc.done())
+ try:
+ newf_conexc.result()
+ except BaseException as e:
+ newf_exc = e # assertRaises context manager drops the traceback
+ newf_tb = ''.join(traceback.format_tb(newf_exc.__traceback__))
+ self.assertEqual(newf_tb.count('raise concurrent.futures.InvalidStateError'), 1)
+
def test_iter(self):
fut = self._new_future(loop=self.loop)