summaryrefslogtreecommitdiff
path: root/tests/hub_test.py
diff options
context:
space:
mode:
authorEdward George <edwardgeorge@gmail.com>2012-12-12 22:25:22 +0000
committerSergey Shepelev <temotor@gmail.com>2013-04-16 18:42:11 +0400
commit0195326cbec83e5358d18f03f0189daff593dac3 (patch)
tree9c576653e51e1117df98ea0f7be88a50c86af022 /tests/hub_test.py
parent2adaeb6159c5408acb761a22ad56ba96a4c0d69b (diff)
downloadeventlet-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.py62
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):