add test_asyncio.py
This commit is contained in:
141
tests/test_asyncio.py
Normal file
141
tests/test_asyncio.py
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
from trollius import test_utils
|
||||||
|
from trollius import From, Return
|
||||||
|
import trollius
|
||||||
|
import trollius.coroutines
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
try:
|
||||||
|
import asyncio
|
||||||
|
except ImportError:
|
||||||
|
from trollius.test_utils import SkipTest
|
||||||
|
raise SkipTest('need asyncio')
|
||||||
|
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def asyncio_noop(value):
|
||||||
|
yield from []
|
||||||
|
return (value,)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def asyncio_coroutine(coro, value):
|
||||||
|
res = yield from coro
|
||||||
|
return res + (value,)
|
||||||
|
|
||||||
|
@trollius.coroutine
|
||||||
|
def trollius_noop(value):
|
||||||
|
yield From(None)
|
||||||
|
raise Return((value,))
|
||||||
|
|
||||||
|
@trollius.coroutine
|
||||||
|
def trollius_coroutine(coro, value):
|
||||||
|
res = yield trollius.From(coro)
|
||||||
|
raise trollius.Return(res + (value,))
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncioTests(test_utils.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
policy = trollius.get_event_loop_policy()
|
||||||
|
|
||||||
|
asyncio.set_event_loop_policy(policy)
|
||||||
|
self.addCleanup(asyncio.set_event_loop_policy, None)
|
||||||
|
|
||||||
|
self.loop = policy.new_event_loop()
|
||||||
|
self.addCleanup(self.loop.close)
|
||||||
|
policy.set_event_loop(self.loop)
|
||||||
|
|
||||||
|
def test_policy(self):
|
||||||
|
self.assertIs(asyncio.get_event_loop(), self.loop)
|
||||||
|
|
||||||
|
def test_asyncio(self):
|
||||||
|
coro = asyncio_noop("asyncio")
|
||||||
|
res = self.loop.run_until_complete(coro)
|
||||||
|
self.assertEqual(res, ("asyncio",))
|
||||||
|
|
||||||
|
def test_asyncio_in_trollius(self):
|
||||||
|
coro1 = asyncio_noop(1)
|
||||||
|
coro2 = asyncio_coroutine(coro1, 2)
|
||||||
|
res = self.loop.run_until_complete(trollius_coroutine(coro2, 3))
|
||||||
|
self.assertEqual(res, (1, 2, 3))
|
||||||
|
|
||||||
|
def test_trollius_in_asyncio(self):
|
||||||
|
coro1 = trollius_noop(4)
|
||||||
|
coro2 = trollius_coroutine(coro1, 5)
|
||||||
|
res = self.loop.run_until_complete(asyncio_coroutine(coro2, 6))
|
||||||
|
self.assertEqual(res, (4, 5, 6))
|
||||||
|
|
||||||
|
def test_step_future(self):
|
||||||
|
old_debug = trollius.coroutines._DEBUG
|
||||||
|
try:
|
||||||
|
def step_future():
|
||||||
|
future = asyncio.Future()
|
||||||
|
self.loop.call_soon(future.set_result, "asyncio.Future")
|
||||||
|
return (yield from future)
|
||||||
|
|
||||||
|
# test in release mode
|
||||||
|
trollius.coroutines._DEBUG = False
|
||||||
|
result = self.loop.run_until_complete(step_future())
|
||||||
|
self.assertEqual(result, "asyncio.Future")
|
||||||
|
|
||||||
|
# test in debug mode
|
||||||
|
trollius.coroutines._DEBUG = True
|
||||||
|
result = self.loop.run_until_complete(step_future())
|
||||||
|
self.assertEqual(result, "asyncio.Future")
|
||||||
|
finally:
|
||||||
|
trollius.coroutines._DEBUG = old_debug
|
||||||
|
|
||||||
|
def test_async(self):
|
||||||
|
fut = asyncio.Future()
|
||||||
|
self.assertIs(fut._loop, self.loop)
|
||||||
|
|
||||||
|
fut2 = trollius.async(fut)
|
||||||
|
self.assertIs(fut2, fut)
|
||||||
|
self.assertIs(fut._loop, self.loop)
|
||||||
|
|
||||||
|
def test_wrap_future(self):
|
||||||
|
fut = asyncio.Future()
|
||||||
|
self.assertIs(trollius.wrap_future(fut), fut)
|
||||||
|
|
||||||
|
def test_run_until_complete(self):
|
||||||
|
fut = asyncio.Future()
|
||||||
|
fut.set_result("ok")
|
||||||
|
self.assertEqual(self.loop.run_until_complete(fut),
|
||||||
|
"ok")
|
||||||
|
|
||||||
|
def test_coroutine_decorator(self):
|
||||||
|
@trollius.coroutine
|
||||||
|
def asyncio_future(fut):
|
||||||
|
return fut
|
||||||
|
|
||||||
|
fut = asyncio.Future()
|
||||||
|
self.loop.call_soon(fut.set_result, 'ok')
|
||||||
|
res = self.loop.run_until_complete(asyncio_future(fut))
|
||||||
|
self.assertEqual(res, "ok")
|
||||||
|
|
||||||
|
def test_as_completed(self):
|
||||||
|
fut = asyncio.Future()
|
||||||
|
fut.set_result("ok")
|
||||||
|
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
for f in trollius.as_completed(fut):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@trollius.coroutine
|
||||||
|
def get_results(fut):
|
||||||
|
results = []
|
||||||
|
for f in trollius.as_completed([fut]):
|
||||||
|
res = yield trollius.From(f)
|
||||||
|
results.append(res)
|
||||||
|
raise trollius.Return(results)
|
||||||
|
|
||||||
|
results = self.loop.run_until_complete(get_results(fut))
|
||||||
|
self.assertEqual(results, ["ok"])
|
||||||
|
|
||||||
|
def test_gather(self):
|
||||||
|
fut = asyncio.Future()
|
||||||
|
fut.set_result("ok")
|
||||||
|
results = self.loop.run_until_complete(trollius.gather(fut))
|
||||||
|
self.assertEqual(results, ["ok"])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user