| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  | """Tests support for new syntax introduced by PEP 492.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-21 06:44:07 -08:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2015-06-24 11:44:51 -04:00
										 |  |  | import types | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2015-05-13 15:34:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-11 10:04:40 -05:00
										 |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  | from unittest import mock | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import asyncio | 
					
						
							| 
									
										
										
										
											2017-12-11 10:04:40 -05:00
										 |  |  | from test.test_asyncio import utils as test_utils | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-01 20:34:09 -07:00
										 |  |  | def tearDownModule(): | 
					
						
							|  |  |  |     asyncio.set_event_loop_policy(None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-23 12:44:29 -05:00
										 |  |  | # Test that asyncio.iscoroutine() uses collections.abc.Coroutine | 
					
						
							|  |  |  | class FakeCoro: | 
					
						
							|  |  |  |     def send(self, value): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def throw(self, typ, val=None, tb=None): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def close(self): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __await__(self): | 
					
						
							|  |  |  |         yield | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  | class BaseTest(test_utils.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2016-11-04 14:29:28 -04:00
										 |  |  |         super().setUp() | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  |         self.loop = asyncio.BaseEventLoop() | 
					
						
							|  |  |  |         self.loop._process_events = mock.Mock() | 
					
						
							|  |  |  |         self.loop._selector = mock.Mock() | 
					
						
							|  |  |  |         self.loop._selector.select.return_value = () | 
					
						
							|  |  |  |         self.set_event_loop(self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class LockTests(BaseTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_context_manager_async_with(self): | 
					
						
							|  |  |  |         primitives = [ | 
					
						
							|  |  |  |             asyncio.Lock(loop=self.loop), | 
					
						
							|  |  |  |             asyncio.Condition(loop=self.loop), | 
					
						
							|  |  |  |             asyncio.Semaphore(loop=self.loop), | 
					
						
							|  |  |  |             asyncio.BoundedSemaphore(loop=self.loop), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def test(lock): | 
					
						
							| 
									
										
										
										
											2018-10-02 13:53:06 -04:00
										 |  |  |             await asyncio.sleep(0.01) | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  |             self.assertFalse(lock.locked()) | 
					
						
							|  |  |  |             async with lock as _lock: | 
					
						
							|  |  |  |                 self.assertIs(_lock, None) | 
					
						
							|  |  |  |                 self.assertTrue(lock.locked()) | 
					
						
							| 
									
										
										
										
											2018-10-02 13:53:06 -04:00
										 |  |  |                 await asyncio.sleep(0.01) | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  |                 self.assertTrue(lock.locked()) | 
					
						
							|  |  |  |             self.assertFalse(lock.locked()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for primitive in primitives: | 
					
						
							|  |  |  |             self.loop.run_until_complete(test(primitive)) | 
					
						
							|  |  |  |             self.assertFalse(primitive.locked()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_context_manager_with_await(self): | 
					
						
							|  |  |  |         primitives = [ | 
					
						
							|  |  |  |             asyncio.Lock(loop=self.loop), | 
					
						
							|  |  |  |             asyncio.Condition(loop=self.loop), | 
					
						
							|  |  |  |             asyncio.Semaphore(loop=self.loop), | 
					
						
							|  |  |  |             asyncio.BoundedSemaphore(loop=self.loop), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def test(lock): | 
					
						
							| 
									
										
										
										
											2018-10-02 13:53:06 -04:00
										 |  |  |             await asyncio.sleep(0.01) | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  |             self.assertFalse(lock.locked()) | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  |             with self.assertWarns(DeprecationWarning): | 
					
						
							|  |  |  |                 with await lock as _lock: | 
					
						
							|  |  |  |                     self.assertIs(_lock, None) | 
					
						
							|  |  |  |                     self.assertTrue(lock.locked()) | 
					
						
							| 
									
										
										
										
											2018-10-02 13:53:06 -04:00
										 |  |  |                     await asyncio.sleep(0.01) | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  |                     self.assertTrue(lock.locked()) | 
					
						
							|  |  |  |                 self.assertFalse(lock.locked()) | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for primitive in primitives: | 
					
						
							|  |  |  |             self.loop.run_until_complete(test(primitive)) | 
					
						
							|  |  |  |             self.assertFalse(primitive.locked()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 14:23:29 -04:00
										 |  |  | class StreamReaderTests(BaseTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_readline(self): | 
					
						
							|  |  |  |         DATA = b'line1\nline2\nline3' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stream = asyncio.StreamReader(loop=self.loop) | 
					
						
							|  |  |  |         stream.feed_data(DATA) | 
					
						
							|  |  |  |         stream.feed_eof() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def reader(): | 
					
						
							|  |  |  |             data = [] | 
					
						
							|  |  |  |             async for line in stream: | 
					
						
							|  |  |  |                 data.append(line) | 
					
						
							|  |  |  |             return data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         data = self.loop.run_until_complete(reader()) | 
					
						
							|  |  |  |         self.assertEqual(data, [b'line1\n', b'line2\n', b'line3']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:34:12 -04:00
										 |  |  | class CoroutineTests(BaseTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_iscoroutine(self): | 
					
						
							|  |  |  |         async def foo(): pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         f = foo() | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             self.assertTrue(asyncio.iscoroutine(f)) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             f.close() # silence warning | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-29 09:01:29 -04:00
										 |  |  |         self.assertTrue(asyncio.iscoroutine(FakeCoro())) | 
					
						
							| 
									
										
										
										
											2015-05-13 15:34:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-05 14:47:33 -04:00
										 |  |  |     def test_iscoroutinefunction(self): | 
					
						
							|  |  |  |         async def foo(): pass | 
					
						
							|  |  |  |         self.assertTrue(asyncio.iscoroutinefunction(foo)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-30 21:04:37 -04:00
										 |  |  |     def test_function_returning_awaitable(self): | 
					
						
							|  |  |  |         class Awaitable: | 
					
						
							|  |  |  |             def __await__(self): | 
					
						
							|  |  |  |                 return ('spam',) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @asyncio.coroutine | 
					
						
							|  |  |  |         def func(): | 
					
						
							|  |  |  |             return Awaitable() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         coro = func() | 
					
						
							| 
									
										
										
										
											2015-05-31 11:28:35 -04:00
										 |  |  |         self.assertEqual(coro.send(None), 'spam') | 
					
						
							| 
									
										
										
										
											2015-05-30 21:04:37 -04:00
										 |  |  |         coro.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 10:32:22 -04:00
										 |  |  |     def test_async_def_coroutines(self): | 
					
						
							| 
									
										
										
										
											2015-05-31 21:44:05 -04:00
										 |  |  |         async def bar(): | 
					
						
							|  |  |  |             return 'spam' | 
					
						
							|  |  |  |         async def foo(): | 
					
						
							|  |  |  |             return await bar() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # production mode | 
					
						
							|  |  |  |         data = self.loop.run_until_complete(foo()) | 
					
						
							|  |  |  |         self.assertEqual(data, 'spam') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # debug mode | 
					
						
							|  |  |  |         self.loop.set_debug(True) | 
					
						
							|  |  |  |         data = self.loop.run_until_complete(foo()) | 
					
						
							|  |  |  |         self.assertEqual(data, 'spam') | 
					
						
							| 
									
										
										
										
											2015-05-13 15:34:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-21 06:44:07 -08:00
										 |  |  |     def test_debug_mode_manages_coroutine_origin_tracking(self): | 
					
						
							| 
									
										
										
										
											2015-06-24 10:32:22 -04:00
										 |  |  |         async def start(): | 
					
						
							| 
									
										
										
										
											2018-01-21 06:44:07 -08:00
										 |  |  |             self.assertTrue(sys.get_coroutine_origin_tracking_depth() > 0) | 
					
						
							| 
									
										
										
										
											2015-06-24 10:32:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-21 06:44:07 -08:00
										 |  |  |         self.assertEqual(sys.get_coroutine_origin_tracking_depth(), 0) | 
					
						
							| 
									
										
										
										
											2015-06-24 10:32:22 -04:00
										 |  |  |         self.loop.set_debug(True) | 
					
						
							|  |  |  |         self.loop.run_until_complete(start()) | 
					
						
							| 
									
										
										
										
											2018-01-21 06:44:07 -08:00
										 |  |  |         self.assertEqual(sys.get_coroutine_origin_tracking_depth(), 0) | 
					
						
							| 
									
										
										
										
											2015-06-24 10:32:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 11:44:51 -04:00
										 |  |  |     def test_types_coroutine(self): | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             yield from () | 
					
						
							|  |  |  |             return 'spam' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @types.coroutine | 
					
						
							|  |  |  |         def func(): | 
					
						
							|  |  |  |             return gen() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def coro(): | 
					
						
							|  |  |  |             wrapper = func() | 
					
						
							|  |  |  |             self.assertIsInstance(wrapper, types._GeneratorWrapper) | 
					
						
							|  |  |  |             return await wrapper | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         data = self.loop.run_until_complete(coro()) | 
					
						
							|  |  |  |         self.assertEqual(data, 'spam') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 14:46:51 -04:00
										 |  |  |     def test_task_print_stack(self): | 
					
						
							|  |  |  |         T = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def foo(): | 
					
						
							|  |  |  |             f = T.get_stack(limit=1) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 self.assertEqual(f[0].f_code.co_name, 'foo') | 
					
						
							|  |  |  |             finally: | 
					
						
							|  |  |  |                 f = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def runner(): | 
					
						
							|  |  |  |             nonlocal T | 
					
						
							|  |  |  |             T = asyncio.ensure_future(foo(), loop=self.loop) | 
					
						
							|  |  |  |             await T | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.loop.run_until_complete(runner()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-18 12:40:26 -05:00
										 |  |  |     def test_double_await(self): | 
					
						
							|  |  |  |         async def afunc(): | 
					
						
							| 
									
										
										
										
											2018-10-02 13:53:06 -04:00
										 |  |  |             await asyncio.sleep(0.1) | 
					
						
							| 
									
										
										
										
											2015-11-18 12:40:26 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         async def runner(): | 
					
						
							|  |  |  |             coro = afunc() | 
					
						
							|  |  |  |             t = asyncio.Task(coro, loop=self.loop) | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2018-10-02 13:53:06 -04:00
										 |  |  |                 await asyncio.sleep(0) | 
					
						
							| 
									
										
										
										
											2015-11-18 12:40:26 -05:00
										 |  |  |                 await coro | 
					
						
							|  |  |  |             finally: | 
					
						
							|  |  |  |                 t.cancel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.loop.set_debug(True) | 
					
						
							| 
									
										
										
										
											2018-01-21 06:44:07 -08:00
										 |  |  |         with self.assertRaises( | 
					
						
							|  |  |  |                 RuntimeError, | 
					
						
							|  |  |  |                 msg='coroutine is being awaited already'): | 
					
						
							| 
									
										
										
										
											2015-11-18 12:40:26 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             self.loop.run_until_complete(runner()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 11:44:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 14:10:38 -04:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |