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 97
|
##
# Copyright (c) 2013 Yury Selivanov
# License: Apache 2.0
##
import asyncio
import greenio
import unittest
class TaskTests(unittest.TestCase):
def setUp(self):
policy = greenio.GreenEventLoopPolicy()
asyncio.set_event_loop_policy(policy)
self.loop = policy.new_event_loop()
policy.set_event_loop(self.loop)
def tearDown(self):
self.loop.close()
asyncio.set_event_loop_policy(None)
def test_task_yield_from_plain(self):
@asyncio.coroutine
def bar():
yield from []
return 30
@asyncio.coroutine
def foo():
bar_result = greenio.yield_from(bar())
return bar_result + 12
@greenio.task
def test():
return (yield from foo())
fut = test()
self.loop.run_until_complete(fut)
self.assertEqual(fut.result(), 42)
def test_task_yield_from_exception_propagation(self):
CHK = 0
@asyncio.coroutine
def bar():
yield
yield
1/0
@greenio.task
def foo():
greenio.yield_from(bar())
@asyncio.coroutine
def test():
try:
return (yield from foo())
except ZeroDivisionError:
nonlocal CHK
CHK += 1
self.loop.run_until_complete(test())
self.assertEqual(CHK, 1)
def test_task_yield_from_coroutine(self):
@asyncio.coroutine
def bar():
yield from []
return 5
@greenio.task
def foo():
return greenio.yield_from(bar())
fut = foo()
self.loop.run_until_complete(fut)
self.assertEqual(fut.result(), 5)
def test_task_yield_from_invalid(self):
def bar():
pass
if hasattr(asyncio.AbstractEventLoop, 'create_task'):
err_msg = (r"^greenlet.yield_from was supposed to receive "
r"only Futures, got .* in task .*$")
else:
err_msg = (r'^"greenio\.yield_from" was supposed to be called '
r'from a "greenio\.task" or a subsequent coroutine$')
@asyncio.coroutine
def foo():
with self.assertRaisesRegex(RuntimeError, err_msg):
greenio.yield_from(bar)
self.loop.run_until_complete(foo())
|