diff options
| author | Edward George <edwardgeorge@gmail.com> | 2012-12-12 22:25:22 +0000 |
|---|---|---|
| committer | Sergey Shepelev <temotor@gmail.com> | 2013-04-16 18:42:11 +0400 |
| commit | 0195326cbec83e5358d18f03f0189daff593dac3 (patch) | |
| tree | 9c576653e51e1117df98ea0f7be88a50c86af022 /tests/hub_test.py | |
| parent | 2adaeb6159c5408acb761a22ad56ba96a4c0d69b (diff) | |
| download | eventlet-0195326cbec83e5358d18f03f0189daff593dac3.tar.gz | |
support: do not clear sys.exc_info if can be preserved (greenlet >= 0.3.2)
Diffstat (limited to 'tests/hub_test.py')
| -rw-r--r-- | tests/hub_test.py | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/tests/hub_test.py b/tests/hub_test.py index 70789e6..6fd1e3b 100644 --- a/tests/hub_test.py +++ b/tests/hub_test.py @@ -1,10 +1,14 @@ from __future__ import with_statement +import sys -from tests import LimitedTestCase, main, skip_with_pyevent, skip_if_no_itimer +from tests import LimitedTestCase, main, skip_with_pyevent, skip_if_no_itimer, skip_unless import time import eventlet from eventlet import hubs from eventlet.green import socket +from eventlet.event import Event +from eventlet.semaphore import Semaphore +from eventlet.support import greenlets DELAY = 0.001 def noop(): @@ -132,6 +136,62 @@ class TestExceptionInMainloop(LimitedTestCase): assert delay >= DELAY*0.9, 'sleep returned after %s seconds (was scheduled for %s)' % (delay, DELAY) +class TestExceptionInGreenthread(LimitedTestCase): + @skip_unless(greenlets.preserves_excinfo) + def test_exceptionpreservation(self): + # events for controlling execution order + gt1event = Event() + gt2event = Event() + + def test_gt1(): + try: + raise KeyError() + except KeyError: + gt1event.send('exception') + gt2event.wait() + assert sys.exc_info()[0] is KeyError + gt1event.send('test passed') + + def test_gt2(): + gt1event.wait() + gt1event.reset() + assert sys.exc_info()[0] is None + try: + raise ValueError() + except ValueError: + gt2event.send('exception') + gt1event.wait() + assert sys.exc_info()[0] is ValueError + + g1 = eventlet.spawn(test_gt1) + g2 = eventlet.spawn(test_gt2) + try: + g1.wait() + g2.wait() + finally: + g1.kill() + g2.kill() + + def test_exceptionleaks(self): + # tests expected behaviour with all versions of greenlet + def test_gt(sem): + try: + raise KeyError() + except KeyError: + sem.release() + hubs.get_hub().switch() + + # semaphores for controlling execution order + sem = Semaphore() + sem.acquire() + g = eventlet.spawn(test_gt, sem) + try: + sem.acquire() + assert sys.exc_info()[0] is None + finally: + g.kill() + + class TestHubSelection(LimitedTestCase): def test_explicit_hub(self): if getattr(hubs.get_hub(), 'uses_twisted_reactor', None): |
