| # Copyright 2018 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| import os |
| |
| from portage.process import find_binary, spawn |
| from portage.tests import TestCase |
| from portage.util._eventloop.global_event_loop import global_event_loop |
| from portage.util.futures import asyncio |
| from portage.util.futures.unix_events import DefaultEventLoopPolicy |
| |
| |
| class ChildWatcherTestCase(TestCase): |
| def testChildWatcher(self): |
| true_binary = find_binary("true") |
| self.assertNotEqual(true_binary, None) |
| |
| initial_policy = asyncio.get_event_loop_policy() |
| if not isinstance(initial_policy, DefaultEventLoopPolicy): |
| asyncio.set_event_loop_policy(DefaultEventLoopPolicy()) |
| |
| loop = None |
| try: |
| try: |
| asyncio.set_child_watcher(None) |
| except NotImplementedError: |
| pass |
| else: |
| self.assertTrue(False) |
| |
| args_tuple = ('hello', 'world') |
| |
| loop = asyncio._wrap_loop() |
| future = loop.create_future() |
| |
| def callback(pid, returncode, *args): |
| future.set_result((pid, returncode, args)) |
| |
| with asyncio.get_child_watcher() as watcher: |
| pids = spawn([true_binary], returnpid=True) |
| watcher.add_child_handler(pids[0], callback, *args_tuple) |
| |
| self.assertEqual( |
| loop.run_until_complete(future), |
| (pids[0], os.EX_OK, args_tuple)) |
| finally: |
| asyncio.set_event_loop_policy(initial_policy) |
| if loop not in (None, global_event_loop()): |
| loop.close() |
| self.assertFalse(global_event_loop().is_closed()) |