1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
import sys
import unittest
from greenlet import greenlet
def switch(*args):
return greenlet.getcurrent().parent.switch(*args)
class ThrowTests(unittest.TestCase):
def test_class(self):
def f():
try:
switch("ok")
except RuntimeError:
switch("ok")
return
switch("fail")
g = greenlet(f)
res = g.switch()
self.assertEquals(res, "ok")
res = g.throw(RuntimeError)
self.assertEquals(res, "ok")
def test_val(self):
def f():
try:
switch("ok")
except RuntimeError:
val = sys.exc_info()[1]
if str(val) == "ciao":
switch("ok")
return
switch("fail")
g = greenlet(f)
res = g.switch()
self.assertEquals(res, "ok")
res = g.throw(RuntimeError("ciao"))
self.assertEquals(res, "ok")
g = greenlet(f)
res = g.switch()
self.assertEquals(res, "ok")
res = g.throw(RuntimeError, "ciao")
self.assertEquals(res, "ok")
def test_kill(self):
def f():
switch("ok")
switch("fail")
g = greenlet(f)
res = g.switch()
self.assertEquals(res, "ok")
res = g.throw()
self.assertTrue(isinstance(res, greenlet.GreenletExit))
self.assertTrue(g.dead)
res = g.throw() # immediately eaten by the already-dead greenlet
self.assertTrue(isinstance(res, greenlet.GreenletExit))
def test_throw_goes_to_original_parent(self):
main = greenlet.getcurrent()
def f1():
try:
main.switch("f1 ready to catch")
except IndexError:
return "caught"
else:
return "normal exit"
def f2():
main.switch("from f2")
g1 = greenlet(f1)
g2 = greenlet(f2, parent=g1)
self.assertRaises(IndexError, g2.throw, IndexError)
self.assertTrue(g2.dead)
self.assertTrue(g1.dead)
g1 = greenlet(f1)
g2 = greenlet(f2, parent=g1)
res = g1.switch()
self.assertEquals(res, "f1 ready to catch")
res = g2.throw(IndexError)
self.assertEquals(res, "caught")
self.assertTrue(g2.dead)
self.assertTrue(g1.dead)
g1 = greenlet(f1)
g2 = greenlet(f2, parent=g1)
res = g1.switch()
self.assertEquals(res, "f1 ready to catch")
res = g2.switch()
self.assertEquals(res, "from f2")
res = g2.throw(IndexError)
self.assertEquals(res, "caught")
self.assertTrue(g2.dead)
self.assertTrue(g1.dead)
|