1 |
commit: b37256a524a0fbf88ffad20c9f01aaf37409ec66 |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Mon Sep 3 20:16:37 2018 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Sep 3 20:20:40 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=b37256a5 |
7 |
|
8 |
compat_coroutine: CancelledError cancels coroutine's future |
9 |
|
10 |
lib/portage/tests/util/futures/test_compat_coroutine.py | 8 ++++++-- |
11 |
lib/portage/util/futures/compat_coroutine.py | 2 ++ |
12 |
2 files changed, 8 insertions(+), 2 deletions(-) |
13 |
|
14 |
diff --git a/lib/portage/tests/util/futures/test_compat_coroutine.py b/lib/portage/tests/util/futures/test_compat_coroutine.py |
15 |
index cbc070869..b6f75b1a2 100644 |
16 |
--- a/lib/portage/tests/util/futures/test_compat_coroutine.py |
17 |
+++ b/lib/portage/tests/util/futures/test_compat_coroutine.py |
18 |
@@ -71,6 +71,10 @@ class CompatCoroutineTestCase(TestCase): |
19 |
loop.run_until_complete, future) |
20 |
|
21 |
def test_cancelled_future(self): |
22 |
+ """ |
23 |
+ When a coroutine raises CancelledError, the coroutine's |
24 |
+ future is cancelled. |
25 |
+ """ |
26 |
|
27 |
@coroutine |
28 |
def cancelled_future_coroutine(loop=None): |
29 |
@@ -81,8 +85,8 @@ class CompatCoroutineTestCase(TestCase): |
30 |
yield future |
31 |
|
32 |
loop = asyncio.get_event_loop() |
33 |
- self.assertRaises(asyncio.CancelledError, |
34 |
- loop.run_until_complete, cancelled_future_coroutine(loop=loop)) |
35 |
+ future = loop.run_until_complete(asyncio.wait([cancelled_future_coroutine()]))[0].pop() |
36 |
+ self.assertTrue(future.cancelled()) |
37 |
|
38 |
def test_yield_expression_result(self): |
39 |
@coroutine |
40 |
|
41 |
diff --git a/lib/portage/util/futures/compat_coroutine.py b/lib/portage/util/futures/compat_coroutine.py |
42 |
index 59fdc31b6..3edfa6bee 100644 |
43 |
--- a/lib/portage/util/futures/compat_coroutine.py |
44 |
+++ b/lib/portage/util/futures/compat_coroutine.py |
45 |
@@ -102,6 +102,8 @@ class _GeneratorTask(object): |
46 |
self._generator.throw(previous.exception()) |
47 |
future = next(self._generator) |
48 |
|
49 |
+ except asyncio.CancelledError: |
50 |
+ self._result.cancel() |
51 |
except _CoroutineReturnValue as e: |
52 |
if not self._result.cancelled(): |
53 |
self._result.set_result(e.result) |