From 6a7297abca88c5d86ac299e51a52547baac791f1 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 29 Oct 2023 21:43:42 -0700 Subject: test_doebuild_fd_pipes.py: multiprocessing spawn compat Use multiprocessing.Pipe for compatibility with the spawn start method. Also pass QueryCommand._db to the child process, like MergeProcess does. Bug: https://bugs.gentoo.org/916247 Signed-off-by: Zac Medico --- lib/portage/tests/ebuild/test_doebuild_fd_pipes.py | 30 ++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/lib/portage/tests/ebuild/test_doebuild_fd_pipes.py b/lib/portage/tests/ebuild/test_doebuild_fd_pipes.py index 51ddc2390..678486ed1 100644 --- a/lib/portage/tests/ebuild/test_doebuild_fd_pipes.py +++ b/lib/portage/tests/ebuild/test_doebuild_fd_pipes.py @@ -1,6 +1,8 @@ # Copyright 2013-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 +import multiprocessing + import portage from portage import os from portage.tests import TestCase @@ -13,6 +15,8 @@ from _emerge.PipeReader import PipeReader class DoebuildFdPipesTestCase(TestCase): + output_fd = 200 + def testDoebuild(self): """ Invoke portage.doebuild() with the fd_pipes parameter, and @@ -21,7 +25,7 @@ class DoebuildFdPipesTestCase(TestCase): supported for API consumers (see bug #475812). """ - output_fd = 200 + output_fd = self.output_fd ebuild_body = ["S=${WORKDIR}"] for phase_func in ( "pkg_info", @@ -117,21 +121,19 @@ class DoebuildFdPipesTestCase(TestCase): "clean", "merge", ): - pr, pw = os.pipe() + pr, pw = multiprocessing.Pipe(duplex=False) producer = ForkProcess( - target=portage.doebuild, - args=(ebuildpath, phase), + target=self._doebuild, + fd_pipes={ + 1: dev_null.fileno(), + }, + args=(QueryCommand._db, pw, ebuildpath, phase), kwargs={ "settings": settings, "mydbapi": portdb, "tree": "porttree", "vartree": root_config.trees["vartree"], - "fd_pipes": { - 1: dev_null.fileno(), - 2: dev_null.fileno(), - output_fd: pw, - }, "prev_mtimes": {}, }, ) @@ -144,7 +146,7 @@ class DoebuildFdPipesTestCase(TestCase): task_scheduler.start() finally: # PipeReader closes pr - os.close(pw) + pw.close() task_scheduler.wait() output = portage._unicode_decode(consumer.getvalue()).rstrip("\n") @@ -161,3 +163,11 @@ class DoebuildFdPipesTestCase(TestCase): dev_null.close() playground.cleanup() QueryCommand._db = None + + @staticmethod + def _doebuild(db, pw, *args, **kwargs): + QueryCommand._db = db + kwargs["fd_pipes"] = { + DoebuildFdPipesTestCase.output_fd: pw.fileno(), + } + return portage.doebuild(*args, **kwargs) -- cgit v1.2.3-65-gdbad