From 5d476c4e500248929d6b042de302b1e7c923dc60 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 6 Mar 2020 00:11:05 -0800 Subject: AsynchronousTask: handle addExistListener after exit When addExistListener is called after the task has already exited with a returncode, immediately schedule the listener to be invoked via call_soon. This behavior is similar to the Future add_done_callback method. Signed-off-by: Zac Medico --- .../util/futures/test_done_callback_after_exit.py | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 lib/portage/tests/util/futures/test_done_callback_after_exit.py (limited to 'lib/portage/tests/util/futures/test_done_callback_after_exit.py') diff --git a/lib/portage/tests/util/futures/test_done_callback_after_exit.py b/lib/portage/tests/util/futures/test_done_callback_after_exit.py new file mode 100644 index 000000000..46a51c271 --- /dev/null +++ b/lib/portage/tests/util/futures/test_done_callback_after_exit.py @@ -0,0 +1,40 @@ +# Copyright 2020 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +from _emerge.AsynchronousTask import AsynchronousTask +from portage.tests import TestCase +from portage.util.futures import asyncio + + +class DoneCallbackAfterExitTestCase(TestCase): + + def test_done_callback_after_exit(self): + """ + Test that callbacks can be registered via the Future + add_done_callback method even after the future is done, and + verify that the callbacks are called. + """ + loop = asyncio._wrap_loop() + future = loop.create_future() + future.set_result(None) + + for i in range(3): + event = loop.create_future() + future.add_done_callback(lambda future: event.set_result(None)) + loop.run_until_complete(event) + + def test_exit_listener_after_exit(self): + """ + Test that callbacks can be registered via the AsynchronousTask + addExitListener method even after the task is done, and + verify that the callbacks are called. + """ + loop = asyncio._wrap_loop() + task = AsynchronousTask(scheduler=loop) + loop.run_until_complete(task.async_start()) + loop.run_until_complete(task.async_wait()) + + for i in range(3): + event = loop.create_future() + task.addExitListener(lambda task: event.set_result(None)) + loop.run_until_complete(event) -- cgit v1.2.3-65-gdbad