| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | """Tests for tasks.py.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import gc | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  | import os.path | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  | from test.script_helper import assert_python_ok | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  | import asyncio | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | from asyncio import test_utils | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-11 11:54:08 +01:00
										 |  |  | @asyncio.coroutine | 
					
						
							|  |  |  | def coroutine_function(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | class Dummy: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return 'Dummy()' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __call__(self, *args): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TaskTests(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.loop = test_utils.TestLoop() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         asyncio.set_event_loop(None) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.loop.close() | 
					
						
							|  |  |  |         gc.collect() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_task_class(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def notmuch(): | 
					
						
							|  |  |  |             return 'ok' | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(notmuch(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertEqual(t.result(), 'ok') | 
					
						
							|  |  |  |         self.assertIs(t._loop, self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop = asyncio.new_event_loop() | 
					
						
							|  |  |  |         t = asyncio.Task(notmuch(), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(t._loop, loop) | 
					
						
							|  |  |  |         loop.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_async_coroutine(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def notmuch(): | 
					
						
							|  |  |  |             return 'ok' | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.async(notmuch(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertEqual(t.result(), 'ok') | 
					
						
							|  |  |  |         self.assertIs(t._loop, self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop = asyncio.new_event_loop() | 
					
						
							|  |  |  |         t = asyncio.async(notmuch(), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(t._loop, loop) | 
					
						
							|  |  |  |         loop.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_async_future(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f_orig = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         f_orig.set_result('ko') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.async(f_orig) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.loop.run_until_complete(f) | 
					
						
							|  |  |  |         self.assertTrue(f.done()) | 
					
						
							|  |  |  |         self.assertEqual(f.result(), 'ko') | 
					
						
							|  |  |  |         self.assertIs(f, f_orig) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop = asyncio.new_event_loop() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             f = asyncio.async(f_orig, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         loop.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.async(f_orig, loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(f, f_orig) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_async_task(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def notmuch(): | 
					
						
							|  |  |  |             return 'ok' | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t_orig = asyncio.Task(notmuch(), loop=self.loop) | 
					
						
							|  |  |  |         t = asyncio.async(t_orig) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertEqual(t.result(), 'ok') | 
					
						
							|  |  |  |         self.assertIs(t, t_orig) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop = asyncio.new_event_loop() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             t = asyncio.async(t_orig, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         loop.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.async(t_orig, loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(t, t_orig) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_async_neither(self): | 
					
						
							|  |  |  |         with self.assertRaises(TypeError): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.async('ok') | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_task_repr(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def notmuch(): | 
					
						
							|  |  |  |             yield from [] | 
					
						
							|  |  |  |             return 'abc' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(notmuch(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         t.add_done_callback(Dummy()) | 
					
						
							|  |  |  |         self.assertEqual(repr(t), 'Task(<notmuch>)<PENDING, [Dummy()]>') | 
					
						
							|  |  |  |         t.cancel()  # Does not take immediate effect! | 
					
						
							|  |  |  |         self.assertEqual(repr(t), 'Task(<notmuch>)<CANCELLING, [Dummy()]>') | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertRaises(asyncio.CancelledError, | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                           self.loop.run_until_complete, t) | 
					
						
							|  |  |  |         self.assertEqual(repr(t), 'Task(<notmuch>)<CANCELLED>') | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(notmuch(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertEqual(repr(t), "Task(<notmuch>)<result='abc'>") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_task_repr_custom(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def coro(): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         class T(asyncio.Future): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             def __repr__(self): | 
					
						
							|  |  |  |                 return 'T[]' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         class MyTask(asyncio.Task, T): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             def __repr__(self): | 
					
						
							|  |  |  |                 return super().__repr__() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         gen = coro() | 
					
						
							|  |  |  |         t = MyTask(gen, loop=self.loop) | 
					
						
							|  |  |  |         self.assertEqual(repr(t), 'T[](<coro>)') | 
					
						
							|  |  |  |         gen.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_task_basics(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def outer(): | 
					
						
							|  |  |  |             a = yield from inner1() | 
					
						
							|  |  |  |             b = yield from inner2() | 
					
						
							|  |  |  |             return a+b | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def inner1(): | 
					
						
							|  |  |  |             return 42 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def inner2(): | 
					
						
							|  |  |  |             return 1000 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         t = outer() | 
					
						
							|  |  |  |         self.assertEqual(self.loop.run_until_complete(t), 1042) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cancel(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(10.0, when) | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def task(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.sleep(10.0, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             return 12 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(task(), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         loop.call_soon(t.cancel) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         with self.assertRaises(asyncio.CancelledError): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertTrue(t.cancelled()) | 
					
						
							|  |  |  |         self.assertFalse(t.cancel()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cancel_yield(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def task(): | 
					
						
							|  |  |  |             yield | 
					
						
							|  |  |  |             yield | 
					
						
							|  |  |  |             return 12 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(task(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop)  # start coro | 
					
						
							|  |  |  |         t.cancel() | 
					
						
							|  |  |  |         self.assertRaises( | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.CancelledError, self.loop.run_until_complete, t) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertTrue(t.cancelled()) | 
					
						
							|  |  |  |         self.assertFalse(t.cancel()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cancel_inner_future(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def task(): | 
					
						
							|  |  |  |             yield from f | 
					
						
							|  |  |  |             return 12 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(task(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop)  # start task | 
					
						
							|  |  |  |         f.cancel() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         with self.assertRaises(asyncio.CancelledError): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             self.loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertTrue(f.cancelled()) | 
					
						
							|  |  |  |         self.assertTrue(t.cancelled()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cancel_both_task_and_inner_future(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def task(): | 
					
						
							|  |  |  |             yield from f | 
					
						
							|  |  |  |             return 12 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(task(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         f.cancel() | 
					
						
							|  |  |  |         t.cancel() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         with self.assertRaises(asyncio.CancelledError): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             self.loop.run_until_complete(t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertTrue(f.cancelled()) | 
					
						
							|  |  |  |         self.assertTrue(t.cancelled()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cancel_task_catching(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut1 = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         fut2 = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def task(): | 
					
						
							|  |  |  |             yield from fut1 | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 yield from fut2 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             except asyncio.CancelledError: | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 return 42 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(task(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertIs(t._fut_waiter, fut1)  # White-box test. | 
					
						
							|  |  |  |         fut1.set_result(None) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertIs(t._fut_waiter, fut2)  # White-box test. | 
					
						
							|  |  |  |         t.cancel() | 
					
						
							|  |  |  |         self.assertTrue(fut2.cancelled()) | 
					
						
							|  |  |  |         res = self.loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertEqual(res, 42) | 
					
						
							|  |  |  |         self.assertFalse(t.cancelled()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cancel_task_ignoring(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut1 = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         fut2 = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         fut3 = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def task(): | 
					
						
							|  |  |  |             yield from fut1 | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 yield from fut2 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             except asyncio.CancelledError: | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 pass | 
					
						
							|  |  |  |             res = yield from fut3 | 
					
						
							|  |  |  |             return res | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(task(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertIs(t._fut_waiter, fut1)  # White-box test. | 
					
						
							|  |  |  |         fut1.set_result(None) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertIs(t._fut_waiter, fut2)  # White-box test. | 
					
						
							|  |  |  |         t.cancel() | 
					
						
							|  |  |  |         self.assertTrue(fut2.cancelled()) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertIs(t._fut_waiter, fut3)  # White-box test. | 
					
						
							|  |  |  |         fut3.set_result(42) | 
					
						
							|  |  |  |         res = self.loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertEqual(res, 42) | 
					
						
							|  |  |  |         self.assertFalse(fut3.cancelled()) | 
					
						
							|  |  |  |         self.assertFalse(t.cancelled()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cancel_current_task(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop = asyncio.new_event_loop() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def task(): | 
					
						
							|  |  |  |             t.cancel() | 
					
						
							|  |  |  |             self.assertTrue(t._must_cancel)  # White-box test. | 
					
						
							|  |  |  |             # The sleep should be cancelled immediately. | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.sleep(100, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             return 12 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(task(), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertRaises( | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.CancelledError, loop.run_until_complete, t) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertFalse(t._must_cancel)  # White-box test. | 
					
						
							|  |  |  |         self.assertFalse(t.cancel()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_stop_while_run_in_complete(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             when = yield 0.1 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.2, when) | 
					
						
							|  |  |  |             when = yield 0.1 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.3, when) | 
					
						
							|  |  |  |             yield 0.1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x = 0 | 
					
						
							|  |  |  |         waiters = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def task(): | 
					
						
							|  |  |  |             nonlocal x | 
					
						
							|  |  |  |             while x < 10: | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |                 waiters.append(asyncio.sleep(0.1, loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 yield from waiters[-1] | 
					
						
							|  |  |  |                 x += 1 | 
					
						
							|  |  |  |                 if x == 2: | 
					
						
							|  |  |  |                     loop.stop() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(task(), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertRaises( | 
					
						
							|  |  |  |             RuntimeError, loop.run_until_complete, t) | 
					
						
							|  |  |  |         self.assertFalse(t.done()) | 
					
						
							|  |  |  |         self.assertEqual(x, 2) | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.3, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # close generators | 
					
						
							|  |  |  |         for w in waiters: | 
					
						
							|  |  |  |             w.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_for(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.2, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             when = yield 0.1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 17:40:59 +01:00
										 |  |  |         foo_running = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def foo(): | 
					
						
							| 
									
										
										
										
											2014-01-23 17:40:59 +01:00
										 |  |  |             nonlocal foo_running | 
					
						
							|  |  |  |             foo_running = True | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |                 yield from asyncio.sleep(0.2, loop=loop) | 
					
						
							| 
									
										
										
										
											2014-01-23 17:40:59 +01:00
										 |  |  |             finally: | 
					
						
							|  |  |  |                 foo_running = False | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             return 'done' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.Task(foo(), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         with self.assertRaises(asyncio.TimeoutError): | 
					
						
							|  |  |  |             loop.run_until_complete(asyncio.wait_for(fut, 0.1, loop=loop)) | 
					
						
							| 
									
										
										
										
											2014-01-23 17:40:59 +01:00
										 |  |  |         self.assertTrue(fut.done()) | 
					
						
							|  |  |  |         # it should have been cancelled due to the timeout | 
					
						
							|  |  |  |         self.assertTrue(fut.cancelled()) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertAlmostEqual(0.1, loop.time()) | 
					
						
							| 
									
										
										
										
											2014-01-23 17:40:59 +01:00
										 |  |  |         self.assertEqual(foo_running, False) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-29 14:30:38 -08:00
										 |  |  |     def test_wait_for_blocking(self): | 
					
						
							|  |  |  |         loop = test_utils.TestLoop() | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @asyncio.coroutine | 
					
						
							|  |  |  |         def coro(): | 
					
						
							|  |  |  |             return 'done' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |         res = loop.run_until_complete(asyncio.wait_for(coro(), | 
					
						
							|  |  |  |                                                        timeout=None, | 
					
						
							|  |  |  |                                                        loop=loop)) | 
					
						
							| 
									
										
										
										
											2014-01-29 14:30:38 -08:00
										 |  |  |         self.assertEqual(res, 'done') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |     def test_wait_for_with_global_loop(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.2, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.01, when) | 
					
						
							|  |  |  |             yield 0.01 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def foo(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.sleep(0.2, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             return 'done' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         asyncio.set_event_loop(loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             fut = asyncio.Task(foo(), loop=loop) | 
					
						
							|  |  |  |             with self.assertRaises(asyncio.TimeoutError): | 
					
						
							|  |  |  |                 loop.run_until_complete(asyncio.wait_for(fut, 0.01)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         finally: | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.set_event_loop(None) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.01, loop.time()) | 
					
						
							| 
									
										
										
										
											2014-01-23 17:40:59 +01:00
										 |  |  |         self.assertTrue(fut.done()) | 
					
						
							|  |  |  |         self.assertTrue(fut.cancelled()) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_wait(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.15, when) | 
					
						
							|  |  |  |             yield 0.15 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop) | 
					
						
							|  |  |  |         b = asyncio.Task(asyncio.sleep(0.15, loop=loop), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def foo(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             done, pending = yield from asyncio.wait([b, a], loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             self.assertEqual(done, set([a, b])) | 
					
						
							|  |  |  |             self.assertEqual(pending, set()) | 
					
						
							|  |  |  |             return 42 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         res = loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertEqual(res, 42) | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.15, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Doing it again should take no time and exercise a different path. | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         res = loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertAlmostEqual(0.15, loop.time()) | 
					
						
							|  |  |  |         self.assertEqual(res, 42) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_with_global_loop(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.01, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.015, when) | 
					
						
							|  |  |  |             yield 0.015 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(asyncio.sleep(0.01, loop=loop), loop=loop) | 
					
						
							|  |  |  |         b = asyncio.Task(asyncio.sleep(0.015, loop=loop), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def foo(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             done, pending = yield from asyncio.wait([b, a]) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             self.assertEqual(done, set([a, b])) | 
					
						
							|  |  |  |             self.assertEqual(pending, set()) | 
					
						
							|  |  |  |             return 42 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         asyncio.set_event_loop(loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         try: | 
					
						
							|  |  |  |             res = loop.run_until_complete( | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |                 asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         finally: | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.set_event_loop(None) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(res, 42) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-06 22:06:16 -05:00
										 |  |  |     def test_wait_duplicate_coroutines(self): | 
					
						
							|  |  |  |         @asyncio.coroutine | 
					
						
							|  |  |  |         def coro(s): | 
					
						
							|  |  |  |             return s | 
					
						
							|  |  |  |         c = coro('test') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         task = asyncio.Task( | 
					
						
							|  |  |  |             asyncio.wait([c, c, coro('spam')], loop=self.loop), | 
					
						
							|  |  |  |             loop=self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         done, pending = self.loop.run_until_complete(task) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertFalse(pending) | 
					
						
							|  |  |  |         self.assertEqual(set(f.result() for f in done), {'test', 'spam'}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |     def test_wait_errors(self): | 
					
						
							|  |  |  |         self.assertRaises( | 
					
						
							|  |  |  |             ValueError, self.loop.run_until_complete, | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.wait(set(), loop=self.loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises( | 
					
						
							|  |  |  |             ValueError, self.loop.run_until_complete, | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.wait([asyncio.sleep(10.0, loop=self.loop)], | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                          return_when=-1, loop=self.loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_first_completed(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(10.0, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             yield 0.1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(asyncio.sleep(10.0, loop=loop), loop=loop) | 
					
						
							|  |  |  |         b = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop) | 
					
						
							|  |  |  |         task = asyncio.Task( | 
					
						
							|  |  |  |             asyncio.wait([b, a], return_when=asyncio.FIRST_COMPLETED, | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                          loop=loop), | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             loop=loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         done, pending = loop.run_until_complete(task) | 
					
						
							|  |  |  |         self.assertEqual({b}, done) | 
					
						
							|  |  |  |         self.assertEqual({a}, pending) | 
					
						
							|  |  |  |         self.assertFalse(a.done()) | 
					
						
							|  |  |  |         self.assertTrue(b.done()) | 
					
						
							|  |  |  |         self.assertIsNone(b.result()) | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.1, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # move forward to close generator | 
					
						
							|  |  |  |         loop.advance_time(10) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.wait([a, b], loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_really_done(self): | 
					
						
							|  |  |  |         # there is possibility that some tasks in the pending list | 
					
						
							|  |  |  |         # became done but their callbacks haven't all been called yet | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def coro1(): | 
					
						
							|  |  |  |             yield | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def coro2(): | 
					
						
							|  |  |  |             yield | 
					
						
							|  |  |  |             yield | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(coro1(), loop=self.loop) | 
					
						
							|  |  |  |         b = asyncio.Task(coro2(), loop=self.loop) | 
					
						
							|  |  |  |         task = asyncio.Task( | 
					
						
							|  |  |  |             asyncio.wait([b, a], return_when=asyncio.FIRST_COMPLETED, | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                          loop=self.loop), | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             loop=self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         done, pending = self.loop.run_until_complete(task) | 
					
						
							|  |  |  |         self.assertEqual({a, b}, done) | 
					
						
							|  |  |  |         self.assertTrue(a.done()) | 
					
						
							|  |  |  |         self.assertIsNone(a.result()) | 
					
						
							|  |  |  |         self.assertTrue(b.done()) | 
					
						
							|  |  |  |         self.assertIsNone(b.result()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_first_exception(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(10.0, when) | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # first_exception, task already has exception | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(asyncio.sleep(10.0, loop=loop), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def exc(): | 
					
						
							|  |  |  |             raise ZeroDivisionError('err') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         b = asyncio.Task(exc(), loop=loop) | 
					
						
							|  |  |  |         task = asyncio.Task( | 
					
						
							|  |  |  |             asyncio.wait([b, a], return_when=asyncio.FIRST_EXCEPTION, | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                          loop=loop), | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             loop=loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         done, pending = loop.run_until_complete(task) | 
					
						
							|  |  |  |         self.assertEqual({b}, done) | 
					
						
							|  |  |  |         self.assertEqual({a}, pending) | 
					
						
							|  |  |  |         self.assertAlmostEqual(0, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # move forward to close generator | 
					
						
							|  |  |  |         loop.advance_time(10) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.wait([a, b], loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_first_exception_in_wait(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(10.0, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.01, when) | 
					
						
							|  |  |  |             yield 0.01 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # first_exception, exception during waiting | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(asyncio.sleep(10.0, loop=loop), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def exc(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.sleep(0.01, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             raise ZeroDivisionError('err') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         b = asyncio.Task(exc(), loop=loop) | 
					
						
							|  |  |  |         task = asyncio.wait([b, a], return_when=asyncio.FIRST_EXCEPTION, | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                             loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         done, pending = loop.run_until_complete(task) | 
					
						
							|  |  |  |         self.assertEqual({b}, done) | 
					
						
							|  |  |  |         self.assertEqual({a}, pending) | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.01, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # move forward to close generator | 
					
						
							|  |  |  |         loop.advance_time(10) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.wait([a, b], loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_with_exception(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.15, when) | 
					
						
							|  |  |  |             yield 0.15 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def sleeper(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.sleep(0.15, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             raise ZeroDivisionError('really') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         b = asyncio.Task(sleeper(), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def foo(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             done, pending = yield from asyncio.wait([b, a], loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             self.assertEqual(len(done), 2) | 
					
						
							|  |  |  |             self.assertEqual(pending, set()) | 
					
						
							|  |  |  |             errors = set(f for f in done if f.exception() is not None) | 
					
						
							|  |  |  |             self.assertEqual(len(errors), 1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertAlmostEqual(0.15, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertAlmostEqual(0.15, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_with_timeout(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.15, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.11, when) | 
					
						
							|  |  |  |             yield 0.11 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop) | 
					
						
							|  |  |  |         b = asyncio.Task(asyncio.sleep(0.15, loop=loop), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def foo(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             done, pending = yield from asyncio.wait([b, a], timeout=0.11, | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                                                     loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             self.assertEqual(done, set([a])) | 
					
						
							|  |  |  |             self.assertEqual(pending, set([b])) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertAlmostEqual(0.11, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # move forward to close generator | 
					
						
							|  |  |  |         loop.advance_time(10) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.wait([a, b], loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_concurrent_complete(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.15, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             yield 0.1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Task(asyncio.sleep(0.1, loop=loop), loop=loop) | 
					
						
							|  |  |  |         b = asyncio.Task(asyncio.sleep(0.15, loop=loop), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         done, pending = loop.run_until_complete( | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.wait([b, a], timeout=0.1, loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(done, set([a])) | 
					
						
							|  |  |  |         self.assertEqual(pending, set([b])) | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.1, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # move forward to close generator | 
					
						
							|  |  |  |         loop.advance_time(10) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.wait([a, b], loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_as_completed(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  |             yield 0.01 | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  |         completed = set() | 
					
						
							|  |  |  |         time_shifted = False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def sleeper(dt, x): | 
					
						
							|  |  |  |             nonlocal time_shifted | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.sleep(dt, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             completed.add(x) | 
					
						
							|  |  |  |             if not time_shifted and 'a' in completed and 'b' in completed: | 
					
						
							|  |  |  |                 time_shifted = True | 
					
						
							|  |  |  |                 loop.advance_time(0.14) | 
					
						
							|  |  |  |             return x | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         a = sleeper(0.01, 'a') | 
					
						
							|  |  |  |         b = sleeper(0.01, 'b') | 
					
						
							|  |  |  |         c = sleeper(0.15, 'c') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def foo(): | 
					
						
							|  |  |  |             values = [] | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             for f in asyncio.as_completed([b, c, a], loop=loop): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 values.append((yield from f)) | 
					
						
							|  |  |  |             return values | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         res = loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertAlmostEqual(0.15, loop.time()) | 
					
						
							|  |  |  |         self.assertTrue('a' in res[:2]) | 
					
						
							|  |  |  |         self.assertTrue('b' in res[:2]) | 
					
						
							|  |  |  |         self.assertEqual(res[2], 'c') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Doing it again should take no time and exercise a different path. | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         res = loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertAlmostEqual(0.15, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_as_completed_with_timeout(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							| 
									
										
										
										
											2014-02-06 22:06:16 -05:00
										 |  |  |             yield | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  |             yield 0.1 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.sleep(0.1, 'a', loop=loop) | 
					
						
							|  |  |  |         b = asyncio.sleep(0.15, 'b', loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def foo(): | 
					
						
							|  |  |  |             values = [] | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             for f in asyncio.as_completed([a, b], timeout=0.12, loop=loop): | 
					
						
							| 
									
										
										
										
											2014-02-12 17:58:19 -08:00
										 |  |  |                 if values: | 
					
						
							|  |  |  |                     loop.advance_time(0.02) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 try: | 
					
						
							|  |  |  |                     v = yield from f | 
					
						
							|  |  |  |                     values.append((1, v)) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |                 except asyncio.TimeoutError as exc: | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                     values.append((2, exc)) | 
					
						
							|  |  |  |             return values | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         res = loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertEqual(len(res), 2, res) | 
					
						
							|  |  |  |         self.assertEqual(res[0], (1, 'a')) | 
					
						
							|  |  |  |         self.assertEqual(res[1][0], 2) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertIsInstance(res[1][1], asyncio.TimeoutError) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertAlmostEqual(0.12, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # move forward to close generator | 
					
						
							|  |  |  |         loop.advance_time(10) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         loop.run_until_complete(asyncio.wait([a, b], loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-12 17:58:19 -08:00
										 |  |  |     def test_as_completed_with_unused_timeout(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             yield | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  |             yield 0.01 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         a = asyncio.sleep(0.01, 'a', loop=loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @asyncio.coroutine | 
					
						
							|  |  |  |         def foo(): | 
					
						
							|  |  |  |             for f in asyncio.as_completed([a], timeout=1, loop=loop): | 
					
						
							|  |  |  |                 v = yield from f | 
					
						
							|  |  |  |                 self.assertEqual(v, 'a') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-26 11:07:42 +01:00
										 |  |  |         loop.run_until_complete(asyncio.Task(foo(), loop=loop)) | 
					
						
							| 
									
										
										
										
											2014-02-12 17:58:19 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |     def test_as_completed_reverse_wait(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  |             yield 0.05 | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.sleep(0.05, 'a', loop=loop) | 
					
						
							|  |  |  |         b = asyncio.sleep(0.10, 'b', loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         fs = {a, b} | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         futs = list(asyncio.as_completed(fs, loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertEqual(len(futs), 2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x = loop.run_until_complete(futs[1]) | 
					
						
							|  |  |  |         self.assertEqual(x, 'a') | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.05, loop.time()) | 
					
						
							|  |  |  |         loop.advance_time(0.05) | 
					
						
							|  |  |  |         y = loop.run_until_complete(futs[0]) | 
					
						
							|  |  |  |         self.assertEqual(y, 'b') | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.10, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_as_completed_concurrent(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.05, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.05, when) | 
					
						
							|  |  |  |             yield 0.05 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.sleep(0.05, 'a', loop=loop) | 
					
						
							|  |  |  |         b = asyncio.sleep(0.05, 'b', loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         fs = {a, b} | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         futs = list(asyncio.as_completed(fs, loop=loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertEqual(len(futs), 2) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         waiter = asyncio.wait(futs, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         done, pending = loop.run_until_complete(waiter) | 
					
						
							|  |  |  |         self.assertEqual(set(f.result() for f in done), {'a', 'b'}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-06 22:06:16 -05:00
										 |  |  |     def test_as_completed_duplicate_coroutines(self): | 
					
						
							| 
									
										
										
										
											2014-02-18 22:56:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-06 22:06:16 -05:00
										 |  |  |         @asyncio.coroutine | 
					
						
							|  |  |  |         def coro(s): | 
					
						
							|  |  |  |             return s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @asyncio.coroutine | 
					
						
							|  |  |  |         def runner(): | 
					
						
							|  |  |  |             result = [] | 
					
						
							|  |  |  |             c = coro('ham') | 
					
						
							| 
									
										
										
										
											2014-02-18 22:56:15 -05:00
										 |  |  |             for f in asyncio.as_completed([c, c, coro('spam')], | 
					
						
							|  |  |  |                                           loop=self.loop): | 
					
						
							| 
									
										
										
										
											2014-02-06 22:06:16 -05:00
										 |  |  |                 result.append((yield from f)) | 
					
						
							|  |  |  |             return result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fut = asyncio.Task(runner(), loop=self.loop) | 
					
						
							|  |  |  |         self.loop.run_until_complete(fut) | 
					
						
							|  |  |  |         result = fut.result() | 
					
						
							|  |  |  |         self.assertEqual(set(result), {'ham', 'spam'}) | 
					
						
							|  |  |  |         self.assertEqual(len(result), 2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |     def test_sleep(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.05, when) | 
					
						
							|  |  |  |             when = yield 0.05 | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             yield 0.05 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def sleeper(dt, arg): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.sleep(dt/2, loop=loop) | 
					
						
							|  |  |  |             res = yield from asyncio.sleep(dt/2, arg, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             return res | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(sleeper(0.1, 'yeah'), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         loop.run_until_complete(t) | 
					
						
							|  |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertEqual(t.result(), 'yeah') | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.1, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_sleep_cancel(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(10.0, when) | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(asyncio.sleep(10.0, 'yeah', loop=loop), | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                          loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         handle = None | 
					
						
							|  |  |  |         orig_call_later = loop.call_later | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def call_later(self, delay, callback, *args): | 
					
						
							|  |  |  |             nonlocal handle | 
					
						
							|  |  |  |             handle = orig_call_later(self, delay, callback, *args) | 
					
						
							|  |  |  |             return handle | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop.call_later = call_later | 
					
						
							|  |  |  |         test_utils.run_briefly(loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertFalse(handle._cancelled) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         t.cancel() | 
					
						
							|  |  |  |         test_utils.run_briefly(loop) | 
					
						
							|  |  |  |         self.assertTrue(handle._cancelled) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_task_cancel_sleeping_task(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(0.1, when) | 
					
						
							|  |  |  |             when = yield 0 | 
					
						
							|  |  |  |             self.assertAlmostEqual(5000, when) | 
					
						
							|  |  |  |             yield 0.1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def sleep(dt): | 
					
						
							| 
									
										
										
										
											2014-02-26 11:07:42 +01:00
										 |  |  |             yield from asyncio.sleep(dt, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def doit(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             sleeper = asyncio.Task(sleep(5000), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             loop.call_later(0.1, sleeper.cancel) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 yield from sleeper | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             except asyncio.CancelledError: | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 return 'cancelled' | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return 'slept in' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         doer = doit() | 
					
						
							|  |  |  |         self.assertEqual(loop.run_until_complete(doer), 'cancelled') | 
					
						
							|  |  |  |         self.assertAlmostEqual(0.1, loop.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_task_cancel_waiter_future(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def coro(): | 
					
						
							|  |  |  |             yield from fut | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         task = asyncio.Task(coro(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertIs(task._fut_waiter, fut) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         task.cancel() | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertRaises( | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.CancelledError, self.loop.run_until_complete, task) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIsNone(task._fut_waiter) | 
					
						
							|  |  |  |         self.assertTrue(fut.cancelled()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_step_in_completed_task(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def notmuch(): | 
					
						
							|  |  |  |             return 'ko' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         gen = notmuch() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         task = asyncio.Task(gen, loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         task.set_result('ok') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(AssertionError, task._step) | 
					
						
							|  |  |  |         gen.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_step_result(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def notmuch(): | 
					
						
							|  |  |  |             yield None | 
					
						
							|  |  |  |             yield 1 | 
					
						
							|  |  |  |             return 'ko' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises( | 
					
						
							|  |  |  |             RuntimeError, self.loop.run_until_complete, notmuch()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_step_result_future(self): | 
					
						
							|  |  |  |         # If coroutine returns future, task waits on this future. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         class Fut(asyncio.Future): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             def __init__(self, *args, **kwds): | 
					
						
							|  |  |  |                 self.cb_added = False | 
					
						
							|  |  |  |                 super().__init__(*args, **kwds) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def add_done_callback(self, fn): | 
					
						
							|  |  |  |                 self.cb_added = True | 
					
						
							|  |  |  |                 super().add_done_callback(fn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fut = Fut(loop=self.loop) | 
					
						
							|  |  |  |         result = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def wait_for_future(): | 
					
						
							|  |  |  |             nonlocal result | 
					
						
							|  |  |  |             result = yield from fut | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t = asyncio.Task(wait_for_future(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertTrue(fut.cb_added) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = object() | 
					
						
							|  |  |  |         fut.set_result(res) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertIs(res, result) | 
					
						
							|  |  |  |         self.assertTrue(t.done()) | 
					
						
							|  |  |  |         self.assertIsNone(t.result()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_step_with_baseexception(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def notmutch(): | 
					
						
							|  |  |  |             raise BaseException() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         task = asyncio.Task(notmutch(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertRaises(BaseException, task._step) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertTrue(task.done()) | 
					
						
							|  |  |  |         self.assertIsInstance(task.exception(), BaseException) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_baseexception_during_cancel(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gen(): | 
					
						
							|  |  |  |             when = yield | 
					
						
							|  |  |  |             self.assertAlmostEqual(10.0, when) | 
					
						
							|  |  |  |             yield 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loop = test_utils.TestLoop(gen) | 
					
						
							|  |  |  |         self.addCleanup(loop.close) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def sleeper(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.sleep(10, loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         base_exc = BaseException() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def notmutch(): | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 yield from sleeper() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             except asyncio.CancelledError: | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 raise base_exc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         task = asyncio.Task(notmutch(), loop=loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         task.cancel() | 
					
						
							|  |  |  |         self.assertFalse(task.done()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(BaseException, test_utils.run_briefly, loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertTrue(task.done()) | 
					
						
							|  |  |  |         self.assertFalse(task.cancelled()) | 
					
						
							|  |  |  |         self.assertIs(task.exception(), base_exc) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_iscoroutinefunction(self): | 
					
						
							|  |  |  |         def fn(): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertFalse(asyncio.iscoroutinefunction(fn)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def fn1(): | 
					
						
							|  |  |  |             yield | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertFalse(asyncio.iscoroutinefunction(fn1)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def fn2(): | 
					
						
							|  |  |  |             yield | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertTrue(asyncio.iscoroutinefunction(fn2)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_yield_vs_yield_from(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def wait_for_future(): | 
					
						
							|  |  |  |             yield fut | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         task = wait_for_future() | 
					
						
							|  |  |  |         with self.assertRaises(RuntimeError): | 
					
						
							|  |  |  |             self.loop.run_until_complete(task) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertFalse(fut.done()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_yield_vs_yield_from_generator(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def coro(): | 
					
						
							|  |  |  |             yield | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def wait_for_future(): | 
					
						
							|  |  |  |             gen = coro() | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 yield gen | 
					
						
							|  |  |  |             finally: | 
					
						
							|  |  |  |                 gen.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         task = wait_for_future() | 
					
						
							|  |  |  |         self.assertRaises( | 
					
						
							|  |  |  |             RuntimeError, | 
					
						
							|  |  |  |             self.loop.run_until_complete, task) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_coroutine_non_gen_function(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def func(): | 
					
						
							|  |  |  |             return 'test' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertTrue(asyncio.iscoroutinefunction(func)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         coro = func() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertTrue(asyncio.iscoroutine(coro)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         res = self.loop.run_until_complete(coro) | 
					
						
							|  |  |  |         self.assertEqual(res, 'test') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_coroutine_non_gen_function_return_future(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def func(): | 
					
						
							|  |  |  |             return fut | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def coro(): | 
					
						
							|  |  |  |             fut.set_result('test') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         t1 = asyncio.Task(func(), loop=self.loop) | 
					
						
							|  |  |  |         t2 = asyncio.Task(coro(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         res = self.loop.run_until_complete(t1) | 
					
						
							|  |  |  |         self.assertEqual(res, 'test') | 
					
						
							|  |  |  |         self.assertIsNone(t2.result()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  |     def test_current_task(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertIsNone(asyncio.Task.current_task(loop=self.loop)) | 
					
						
							| 
									
										
										
										
											2013-12-19 13:49:32 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  |         def coro(loop): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             self.assertTrue(asyncio.Task.current_task(loop=loop) is task) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         task = asyncio.Task(coro(self.loop), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  |         self.loop.run_until_complete(task) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertIsNone(asyncio.Task.current_task(loop=self.loop)) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_current_task_with_interleaving_tasks(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertIsNone(asyncio.Task.current_task(loop=self.loop)) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut1 = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         fut2 = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  |         def coro1(loop): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             self.assertTrue(asyncio.Task.current_task(loop=loop) is task1) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  |             yield from fut1 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             self.assertTrue(asyncio.Task.current_task(loop=loop) is task1) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  |             fut2.set_result(True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  |         def coro2(loop): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             self.assertTrue(asyncio.Task.current_task(loop=loop) is task2) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  |             fut1.set_result(True) | 
					
						
							|  |  |  |             yield from fut2 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             self.assertTrue(asyncio.Task.current_task(loop=loop) is task2) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         task1 = asyncio.Task(coro1(self.loop), loop=self.loop) | 
					
						
							|  |  |  |         task2 = asyncio.Task(coro2(self.loop), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.loop.run_until_complete(asyncio.wait((task1, task2), | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                                                   loop=self.loop)) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertIsNone(asyncio.Task.current_task(loop=self.loop)) | 
					
						
							| 
									
										
										
										
											2013-12-06 12:57:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |     # Some thorough tests for cancellation propagation through | 
					
						
							|  |  |  |     # coroutines, tasks and wait(). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_yield_future_passes_cancel(self): | 
					
						
							|  |  |  |         # Cancelling outer() cancels inner() cancels waiter. | 
					
						
							|  |  |  |         proof = 0 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         waiter = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def inner(): | 
					
						
							|  |  |  |             nonlocal proof | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 yield from waiter | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             except asyncio.CancelledError: | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 proof += 1 | 
					
						
							|  |  |  |                 raise | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.fail('got past sleep() in inner()') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def outer(): | 
					
						
							|  |  |  |             nonlocal proof | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 yield from inner() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             except asyncio.CancelledError: | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                 proof += 100  # Expect this path. | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 proof += 10 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.async(outer(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         f.cancel() | 
					
						
							|  |  |  |         self.loop.run_until_complete(f) | 
					
						
							|  |  |  |         self.assertEqual(proof, 101) | 
					
						
							|  |  |  |         self.assertTrue(waiter.cancelled()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_yield_wait_does_not_shield_cancel(self): | 
					
						
							|  |  |  |         # Cancelling outer() makes wait() return early, leaves inner() | 
					
						
							|  |  |  |         # running. | 
					
						
							|  |  |  |         proof = 0 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         waiter = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def inner(): | 
					
						
							|  |  |  |             nonlocal proof | 
					
						
							|  |  |  |             yield from waiter | 
					
						
							|  |  |  |             proof += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def outer(): | 
					
						
							|  |  |  |             nonlocal proof | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             d, p = yield from asyncio.wait([inner()], loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             proof += 100 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.async(outer(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         f.cancel() | 
					
						
							|  |  |  |         self.assertRaises( | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.CancelledError, self.loop.run_until_complete, f) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         waiter.set_result(None) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertEqual(proof, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_shield_result(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         inner = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         outer = asyncio.shield(inner) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         inner.set_result(42) | 
					
						
							|  |  |  |         res = self.loop.run_until_complete(outer) | 
					
						
							|  |  |  |         self.assertEqual(res, 42) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_shield_exception(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         inner = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         outer = asyncio.shield(inner) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         exc = RuntimeError('expected') | 
					
						
							|  |  |  |         inner.set_exception(exc) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertIs(outer.exception(), exc) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_shield_cancel(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         inner = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         outer = asyncio.shield(inner) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         inner.cancel() | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertTrue(outer.cancelled()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_shield_shortcut(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         fut.set_result(42) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         res = self.loop.run_until_complete(asyncio.shield(fut)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertEqual(res, 42) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_shield_effect(self): | 
					
						
							|  |  |  |         # Cancelling outer() does not affect inner(). | 
					
						
							|  |  |  |         proof = 0 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         waiter = asyncio.Future(loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def inner(): | 
					
						
							|  |  |  |             nonlocal proof | 
					
						
							|  |  |  |             yield from waiter | 
					
						
							|  |  |  |             proof += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def outer(): | 
					
						
							|  |  |  |             nonlocal proof | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.shield(inner(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             proof += 100 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.async(outer(), loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         f.cancel() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         with self.assertRaises(asyncio.CancelledError): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             self.loop.run_until_complete(f) | 
					
						
							|  |  |  |         waiter.set_result(None) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertEqual(proof, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_shield_gather(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         child1 = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         child2 = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         parent = asyncio.gather(child1, child2, loop=self.loop) | 
					
						
							|  |  |  |         outer = asyncio.shield(parent, loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         outer.cancel() | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertTrue(outer.cancelled()) | 
					
						
							|  |  |  |         child1.set_result(1) | 
					
						
							|  |  |  |         child2.set_result(2) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         self.assertEqual(parent.result(), [1, 2]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_gather_shield(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         child1 = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         child2 = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  |         inner1 = asyncio.shield(child1, loop=self.loop) | 
					
						
							|  |  |  |         inner2 = asyncio.shield(child2, loop=self.loop) | 
					
						
							|  |  |  |         parent = asyncio.gather(inner1, inner2, loop=self.loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  |         parent.cancel() | 
					
						
							|  |  |  |         # This should cancel inner1 and inner2 but bot child1 and child2. | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertIsInstance(parent.exception(), asyncio.CancelledError) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertTrue(inner1.cancelled()) | 
					
						
							|  |  |  |         self.assertTrue(inner2.cancelled()) | 
					
						
							|  |  |  |         child1.set_result(1) | 
					
						
							|  |  |  |         child2.set_result(2) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-11 11:54:08 +01:00
										 |  |  |     def test_as_completed_invalid_args(self): | 
					
						
							|  |  |  |         fut = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # as_completed() expects a list of futures, not a future instance | 
					
						
							|  |  |  |         self.assertRaises(TypeError, self.loop.run_until_complete, | 
					
						
							|  |  |  |             asyncio.as_completed(fut, loop=self.loop)) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, self.loop.run_until_complete, | 
					
						
							|  |  |  |             asyncio.as_completed(coroutine_function(), loop=self.loop)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_wait_invalid_args(self): | 
					
						
							|  |  |  |         fut = asyncio.Future(loop=self.loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # wait() expects a list of futures, not a future instance | 
					
						
							|  |  |  |         self.assertRaises(TypeError, self.loop.run_until_complete, | 
					
						
							|  |  |  |             asyncio.wait(fut, loop=self.loop)) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, self.loop.run_until_complete, | 
					
						
							|  |  |  |             asyncio.wait(coroutine_function(), loop=self.loop)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # wait() expects at least a future | 
					
						
							|  |  |  |         self.assertRaises(ValueError, self.loop.run_until_complete, | 
					
						
							|  |  |  |             asyncio.wait([], loop=self.loop)) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class GatherTestsBase: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.one_loop = test_utils.TestLoop() | 
					
						
							|  |  |  |         self.other_loop = test_utils.TestLoop() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.one_loop.close() | 
					
						
							|  |  |  |         self.other_loop.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _run_loop(self, loop): | 
					
						
							|  |  |  |         while loop._ready: | 
					
						
							|  |  |  |             test_utils.run_briefly(loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _check_success(self, **kwargs): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a, b, c = [asyncio.Future(loop=self.one_loop) for i in range(3)] | 
					
						
							|  |  |  |         fut = asyncio.gather(*self.wrap_futures(a, b, c), **kwargs) | 
					
						
							| 
									
										
										
										
											2014-02-11 11:34:30 +01:00
										 |  |  |         cb = test_utils.MockCallback() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         fut.add_done_callback(cb) | 
					
						
							|  |  |  |         b.set_result(1) | 
					
						
							|  |  |  |         a.set_result(2) | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         self.assertEqual(cb.called, False) | 
					
						
							|  |  |  |         self.assertFalse(fut.done()) | 
					
						
							|  |  |  |         c.set_result(3) | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         cb.assert_called_once_with(fut) | 
					
						
							|  |  |  |         self.assertEqual(fut.result(), [2, 1, 3]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_success(self): | 
					
						
							|  |  |  |         self._check_success() | 
					
						
							|  |  |  |         self._check_success(return_exceptions=False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_result_exception_success(self): | 
					
						
							|  |  |  |         self._check_success(return_exceptions=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_one_exception(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a, b, c, d, e = [asyncio.Future(loop=self.one_loop) for i in range(5)] | 
					
						
							|  |  |  |         fut = asyncio.gather(*self.wrap_futures(a, b, c, d, e)) | 
					
						
							| 
									
										
										
										
											2014-02-11 11:34:30 +01:00
										 |  |  |         cb = test_utils.MockCallback() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         fut.add_done_callback(cb) | 
					
						
							|  |  |  |         exc = ZeroDivisionError() | 
					
						
							|  |  |  |         a.set_result(1) | 
					
						
							|  |  |  |         b.set_exception(exc) | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         self.assertTrue(fut.done()) | 
					
						
							|  |  |  |         cb.assert_called_once_with(fut) | 
					
						
							|  |  |  |         self.assertIs(fut.exception(), exc) | 
					
						
							|  |  |  |         # Does nothing | 
					
						
							|  |  |  |         c.set_result(3) | 
					
						
							|  |  |  |         d.cancel() | 
					
						
							|  |  |  |         e.set_exception(RuntimeError()) | 
					
						
							| 
									
										
										
										
											2013-12-19 22:42:40 +01:00
										 |  |  |         e.exception() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_return_exceptions(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a, b, c, d = [asyncio.Future(loop=self.one_loop) for i in range(4)] | 
					
						
							|  |  |  |         fut = asyncio.gather(*self.wrap_futures(a, b, c, d), | 
					
						
							| 
									
										
										
										
											2014-01-30 16:05:28 -08:00
										 |  |  |                              return_exceptions=True) | 
					
						
							| 
									
										
										
										
											2014-02-11 11:34:30 +01:00
										 |  |  |         cb = test_utils.MockCallback() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         fut.add_done_callback(cb) | 
					
						
							|  |  |  |         exc = ZeroDivisionError() | 
					
						
							|  |  |  |         exc2 = RuntimeError() | 
					
						
							|  |  |  |         b.set_result(1) | 
					
						
							|  |  |  |         c.set_exception(exc) | 
					
						
							|  |  |  |         a.set_result(3) | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         self.assertFalse(fut.done()) | 
					
						
							|  |  |  |         d.set_exception(exc2) | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         self.assertTrue(fut.done()) | 
					
						
							|  |  |  |         cb.assert_called_once_with(fut) | 
					
						
							|  |  |  |         self.assertEqual(fut.result(), [3, 1, exc, exc2]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  |     def test_env_var_debug(self): | 
					
						
							|  |  |  |         path = os.path.dirname(asyncio.__file__) | 
					
						
							|  |  |  |         path = os.path.normpath(os.path.join(path, '..')) | 
					
						
							|  |  |  |         code = '\n'.join(( | 
					
						
							|  |  |  |             'import sys', | 
					
						
							|  |  |  |             'sys.path.insert(0, %r)' % path, | 
					
						
							|  |  |  |             'import asyncio.tasks', | 
					
						
							|  |  |  |             'print(asyncio.tasks._DEBUG)')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Test with -E to not fail if the unit test was run with | 
					
						
							|  |  |  |         # PYTHONASYNCIODEBUG set to a non-empty string | 
					
						
							|  |  |  |         sts, stdout, stderr = assert_python_ok('-E', '-c', code) | 
					
						
							|  |  |  |         self.assertEqual(stdout.rstrip(), b'False') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         sts, stdout, stderr = assert_python_ok('-c', code, | 
					
						
							|  |  |  |                                                PYTHONASYNCIODEBUG='') | 
					
						
							|  |  |  |         self.assertEqual(stdout.rstrip(), b'False') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         sts, stdout, stderr = assert_python_ok('-c', code, | 
					
						
							|  |  |  |                                                PYTHONASYNCIODEBUG='1') | 
					
						
							|  |  |  |         self.assertEqual(stdout.rstrip(), b'True') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         sts, stdout, stderr = assert_python_ok('-E', '-c', code, | 
					
						
							|  |  |  |                                                PYTHONASYNCIODEBUG='1') | 
					
						
							|  |  |  |         self.assertEqual(stdout.rstrip(), b'False') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class FutureGatherTests(GatherTestsBase, unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def wrap_futures(self, *futures): | 
					
						
							|  |  |  |         return futures | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _check_empty_sequence(self, seq_or_iter): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         asyncio.set_event_loop(self.one_loop) | 
					
						
							|  |  |  |         self.addCleanup(asyncio.set_event_loop, None) | 
					
						
							|  |  |  |         fut = asyncio.gather(*seq_or_iter) | 
					
						
							|  |  |  |         self.assertIsInstance(fut, asyncio.Future) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(fut._loop, self.one_loop) | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         self.assertTrue(fut.done()) | 
					
						
							|  |  |  |         self.assertEqual(fut.result(), []) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.gather(*seq_or_iter, loop=self.other_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(fut._loop, self.other_loop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_constructor_empty_sequence(self): | 
					
						
							|  |  |  |         self._check_empty_sequence([]) | 
					
						
							|  |  |  |         self._check_empty_sequence(()) | 
					
						
							|  |  |  |         self._check_empty_sequence(set()) | 
					
						
							|  |  |  |         self._check_empty_sequence(iter("")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_constructor_heterogenous_futures(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut1 = asyncio.Future(loop=self.one_loop) | 
					
						
							|  |  |  |         fut2 = asyncio.Future(loop=self.other_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         with self.assertRaises(ValueError): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.gather(fut1, fut2) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         with self.assertRaises(ValueError): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             asyncio.gather(fut1, loop=self.other_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_constructor_homogenous_futures(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         children = [asyncio.Future(loop=self.other_loop) for i in range(3)] | 
					
						
							|  |  |  |         fut = asyncio.gather(*children) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(fut._loop, self.other_loop) | 
					
						
							|  |  |  |         self._run_loop(self.other_loop) | 
					
						
							|  |  |  |         self.assertFalse(fut.done()) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.gather(*children, loop=self.other_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(fut._loop, self.other_loop) | 
					
						
							|  |  |  |         self._run_loop(self.other_loop) | 
					
						
							|  |  |  |         self.assertFalse(fut.done()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_one_cancellation(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a, b, c, d, e = [asyncio.Future(loop=self.one_loop) for i in range(5)] | 
					
						
							|  |  |  |         fut = asyncio.gather(a, b, c, d, e) | 
					
						
							| 
									
										
										
										
											2014-02-11 11:34:30 +01:00
										 |  |  |         cb = test_utils.MockCallback() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         fut.add_done_callback(cb) | 
					
						
							|  |  |  |         a.set_result(1) | 
					
						
							|  |  |  |         b.cancel() | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         self.assertTrue(fut.done()) | 
					
						
							|  |  |  |         cb.assert_called_once_with(fut) | 
					
						
							|  |  |  |         self.assertFalse(fut.cancelled()) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertIsInstance(fut.exception(), asyncio.CancelledError) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         # Does nothing | 
					
						
							|  |  |  |         c.set_result(3) | 
					
						
							|  |  |  |         d.cancel() | 
					
						
							|  |  |  |         e.set_exception(RuntimeError()) | 
					
						
							| 
									
										
										
										
											2013-12-19 22:42:40 +01:00
										 |  |  |         e.exception() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_result_exception_one_cancellation(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a, b, c, d, e, f = [asyncio.Future(loop=self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |                             for i in range(6)] | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.gather(a, b, c, d, e, f, return_exceptions=True) | 
					
						
							| 
									
										
										
										
											2014-02-11 11:34:30 +01:00
										 |  |  |         cb = test_utils.MockCallback() | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         fut.add_done_callback(cb) | 
					
						
							|  |  |  |         a.set_result(1) | 
					
						
							|  |  |  |         zde = ZeroDivisionError() | 
					
						
							|  |  |  |         b.set_exception(zde) | 
					
						
							|  |  |  |         c.cancel() | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         self.assertFalse(fut.done()) | 
					
						
							|  |  |  |         d.set_result(3) | 
					
						
							|  |  |  |         e.cancel() | 
					
						
							|  |  |  |         rte = RuntimeError() | 
					
						
							|  |  |  |         f.set_exception(rte) | 
					
						
							|  |  |  |         res = self.one_loop.run_until_complete(fut) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         self.assertIsInstance(res[2], asyncio.CancelledError) | 
					
						
							|  |  |  |         self.assertIsInstance(res[4], asyncio.CancelledError) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         res[2] = res[4] = None | 
					
						
							|  |  |  |         self.assertEqual(res, [1, zde, None, 3, None, rte]) | 
					
						
							|  |  |  |         cb.assert_called_once_with(fut) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CoroutineGatherTests(GatherTestsBase, unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         super().setUp() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         asyncio.set_event_loop(self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         asyncio.set_event_loop(None) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         super().tearDown() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def wrap_futures(self, *futures): | 
					
						
							|  |  |  |         coros = [] | 
					
						
							|  |  |  |         for fut in futures: | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             def coro(fut=fut): | 
					
						
							|  |  |  |                 return (yield from fut) | 
					
						
							|  |  |  |             coros.append(coro()) | 
					
						
							|  |  |  |         return coros | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_constructor_loop_selection(self): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def coro(): | 
					
						
							|  |  |  |             return 'abc' | 
					
						
							|  |  |  |         gen1 = coro() | 
					
						
							|  |  |  |         gen2 = coro() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.gather(gen1, gen2) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(fut._loop, self.one_loop) | 
					
						
							|  |  |  |         gen1.close() | 
					
						
							|  |  |  |         gen2.close() | 
					
						
							|  |  |  |         gen3 = coro() | 
					
						
							|  |  |  |         gen4 = coro() | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         fut = asyncio.gather(gen3, gen4, loop=self.other_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         self.assertIs(fut._loop, self.other_loop) | 
					
						
							|  |  |  |         gen3.close() | 
					
						
							|  |  |  |         gen4.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-06 22:06:16 -05:00
										 |  |  |     def test_duplicate_coroutines(self): | 
					
						
							|  |  |  |         @asyncio.coroutine | 
					
						
							|  |  |  |         def coro(s): | 
					
						
							|  |  |  |             return s | 
					
						
							|  |  |  |         c = coro('abc') | 
					
						
							|  |  |  |         fut = asyncio.gather(c, c, coro('def'), c, loop=self.one_loop) | 
					
						
							|  |  |  |         self._run_loop(self.one_loop) | 
					
						
							|  |  |  |         self.assertEqual(fut.result(), ['abc', 'abc', 'def', 'abc']) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |     def test_cancellation_broadcast(self): | 
					
						
							|  |  |  |         # Cancelling outer() cancels all children. | 
					
						
							|  |  |  |         proof = 0 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         waiter = asyncio.Future(loop=self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def inner(): | 
					
						
							|  |  |  |             nonlocal proof | 
					
						
							|  |  |  |             yield from waiter | 
					
						
							|  |  |  |             proof += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         child1 = asyncio.async(inner(), loop=self.one_loop) | 
					
						
							|  |  |  |         child2 = asyncio.async(inner(), loop=self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         gatherer = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def outer(): | 
					
						
							|  |  |  |             nonlocal proof, gatherer | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             gatherer = asyncio.gather(child1, child2, loop=self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             yield from gatherer | 
					
						
							|  |  |  |             proof += 100 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.async(outer(), loop=self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.one_loop) | 
					
						
							|  |  |  |         self.assertTrue(f.cancel()) | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         with self.assertRaises(asyncio.CancelledError): | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |             self.one_loop.run_until_complete(f) | 
					
						
							|  |  |  |         self.assertFalse(gatherer.cancel()) | 
					
						
							|  |  |  |         self.assertTrue(waiter.cancelled()) | 
					
						
							|  |  |  |         self.assertTrue(child1.cancelled()) | 
					
						
							|  |  |  |         self.assertTrue(child2.cancelled()) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.one_loop) | 
					
						
							|  |  |  |         self.assertEqual(proof, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_exception_marking(self): | 
					
						
							|  |  |  |         # Test for the first line marked "Mark exception retrieved." | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def inner(f): | 
					
						
							|  |  |  |             yield from f | 
					
						
							|  |  |  |             raise RuntimeError('should not be ignored') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         a = asyncio.Future(loop=self.one_loop) | 
					
						
							|  |  |  |         b = asyncio.Future(loop=self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         @asyncio.coroutine | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         def outer(): | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |             yield from asyncio.gather(inner(a), inner(b), loop=self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 15:32:06 +01:00
										 |  |  |         f = asyncio.async(outer(), loop=self.one_loop) | 
					
						
							| 
									
										
										
										
											2013-10-17 13:40:50 -07:00
										 |  |  |         test_utils.run_briefly(self.one_loop) | 
					
						
							|  |  |  |         a.set_result(None) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.one_loop) | 
					
						
							|  |  |  |         b.set_result(None) | 
					
						
							|  |  |  |         test_utils.run_briefly(self.one_loop) | 
					
						
							|  |  |  |         self.assertIsInstance(f.exception(), RuntimeError) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |