summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-11-21 02:49:58 +0100
committerVictor Stinner <victor.stinner@gmail.com>2014-11-21 02:49:58 +0100
commit19391bbc96a7de41e082d54200b16e3f500335db (patch)
tree8d2e03b058f4c69828ccf74c72c13984ed921023
parenta7ba3e2484cccaeefb07222c57acae9f8a247193 (diff)
downloadaioeventlet-19391bbc96a7de41e082d54200b16e3f500335db.tar.gz
Test for chain coroutine to greenthread
-rw-r--r--tests/test_eventlet.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/test_eventlet.py b/tests/test_eventlet.py
index 9e6b699..a77f772 100644
--- a/tests/test_eventlet.py
+++ b/tests/test_eventlet.py
@@ -1,6 +1,106 @@
import eventlet
import tests
+def slow_append(result, value, delay):
+ eventlet.sleep(delay)
+ result.append(value)
+ return value * 10
+
+def slow_error(delay):
+ eventlet.sleep(delay)
+ raise ValueError("error")
+
+try:
+ import asyncio
+
+ exec('''if 1:
+ @asyncio.coroutine
+ def wait_greenthread(gt, loop=None):
+ if loop is None:
+ loop = asyncio.get_event_loop()
+ fut = asyncio.Future(loop=loop)
+
+ def copy_result(gt):
+ try:
+ value = gt.wait()
+ except Exception as exc:
+ loop.call_soon_threadsafe(fut.set_exception, exc)
+ else:
+ loop.call_soon_threadsafe(fut.set_result, value)
+ gt.link(copy_result)
+
+ value = yield from fut
+ return value
+
+ @asyncio.coroutine
+ def coro_chain_greenthread():
+ result = []
+ loop = asyncio.get_event_loop()
+
+ g1 = eventlet.spawn(slow_append, result, 1, 0.2)
+
+ value = yield from wait_greenthread(g1, loop=loop)
+ result.append(value)
+
+ g2 = eventlet.spawn(slow_append, result, 2, 0.1)
+ value = yield from wait_greenthread(g2, loop=loop)
+ result.append(value)
+
+ g3 = eventlet.spawn(slow_error, 0.001)
+ try:
+ yield from wait_greenthread(g3, loop=loop)
+ except ValueError as exc:
+ result.append(str(exc))
+
+ result.append(4)
+ return result
+ ''')
+except ImportError:
+ import trollius as asyncio
+ from trollius import From, Return
+
+ @asyncio.coroutine
+ def wait_greenthread(gt, loop=None):
+ if loop is None:
+ loop = asyncio.get_event_loop()
+ fut = asyncio.Future(loop=loop)
+
+ def copy_result(gt):
+ try:
+ value = gt.wait()
+ except Exception as exc:
+ loop.call_soon_threadsafe(fut.set_exception, exc)
+ else:
+ loop.call_soon_threadsafe(fut.set_result, value)
+ gt.link(copy_result)
+
+ value = yield From(fut)
+ raise Return(value)
+
+ @asyncio.coroutine
+ def coro_chain_greenthread():
+ result = []
+ loop = asyncio.get_event_loop()
+
+ g1 = eventlet.spawn(slow_append, result, 1, 0.2)
+
+ value = yield From(wait_greenthread(g1, loop=loop))
+ result.append(value)
+
+ g2 = eventlet.spawn(slow_append, result, 2, 0.1)
+ value = yield From(wait_greenthread(g2, loop=loop))
+ result.append(value)
+
+ g3 = eventlet.spawn(slow_error, 0.001)
+ try:
+ yield From(wait_greenthread(g3, loop=loop))
+ except ValueError as exc:
+ result.append(str(exc))
+
+ result.append(4)
+ raise Return(result)
+
+
class EventletTests(tests.TestCase):
def test_stop(self):
def func():
@@ -44,6 +144,10 @@ class EventletTests(tests.TestCase):
self.loop.run_forever()
self.assertEqual(result, ["spawn", "spawn_after"])
+ def test_coro_chain_greenthread(self):
+ result = self.loop.run_until_complete(coro_chain_greenthread())
+ self.assertEqual(result, [1, 10, 2, 20, 'error', 4])
+
if __name__ == '__main__':
import unittest