commit:     6a7297abca88c5d86ac299e51a52547baac791f1
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 30 04:43:42 2023 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Oct 30 04:47:55 2023 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=6a7297ab

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 <zmedico <AT> gentoo.org>

 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 51ddc23908..678486ed16 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)

Reply via email to