public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:master commit in: lib/portage/tests/emerge/
Date: Mon, 30 Oct 2023 03:14:29 +0000 (UTC)	[thread overview]
Message-ID: <1698635665.e324f300247f4181362325d46a7232f0bbaf561e.sam@gentoo> (raw)

commit:     e324f300247f4181362325d46a7232f0bbaf561e
Author:     David Palao <david.palao <AT> gmail <DOT> com>
AuthorDate: Tue Oct 10 01:36:02 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Oct 30 03:14:25 2023 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=e324f300

tests: Adapt to UTF-8 changes

Adapt to UTF-8 changes in 4f5f6f571e52af6d2703db760bad4e0ad7439d5a.

Signed-off-by: David Palao <david.palao <AT> gmail.com>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 lib/portage/tests/emerge/conftest.py      |  22 +-
 lib/portage/tests/emerge/test_baseline.py |   4 +-
 lib/portage/tests/emerge/test_simple.py   | 740 ++++++++++++++++++++++++++++++
 3 files changed, 754 insertions(+), 12 deletions(-)

diff --git a/lib/portage/tests/emerge/conftest.py b/lib/portage/tests/emerge/conftest.py
index aaa603f731..c534f5e9d3 100644
--- a/lib/portage/tests/emerge/conftest.py
+++ b/lib/portage/tests/emerge/conftest.py
@@ -267,7 +267,7 @@ class PortageCommandSequence:
 
 class Emerge(PortageCommand):
     name = "emerge"
-    command = (PORTAGE_PYTHON, "-b", "-Wd", os.path.join(cnf_bindir, name))
+    command = (PORTAGE_PYTHON, "-b", "-Wd", os.path.join(str(cnf_bindir), name))
 
 
 class Noop(PortageCommand):
@@ -276,7 +276,7 @@ class Noop(PortageCommand):
 
 class EnvUpdate(PortageCommand):
     name = "env-update"
-    command = (PORTAGE_PYTHON, "-b", "-Wd", os.path.join(cnf_sbindir, name))
+    command = (PORTAGE_PYTHON, "-b", "-Wd", os.path.join(str(cnf_sbindir), name))
 
 
 class DispatchConf(PortageCommand):
@@ -285,13 +285,13 @@ class DispatchConf(PortageCommand):
         PORTAGE_PYTHON,
         "-b",
         "-Wd",
-        os.path.join(cnf_sbindir, name),
+        os.path.join(str(cnf_sbindir), name),
     )
 
 
 class Ebuild(PortageCommand):
     name = "ebuild"
-    command = (PORTAGE_PYTHON, "-b", "-Wd", os.path.join(cnf_bindir, name))
+    command = (PORTAGE_PYTHON, "-b", "-Wd", os.path.join(str(cnf_bindir), name))
 
 
 class Egencache(PortageCommand):
@@ -300,18 +300,18 @@ class Egencache(PortageCommand):
         PORTAGE_PYTHON,
         "-b",
         "-Wd",
-        os.path.join(cnf_bindir, name),
+        os.path.join(str(cnf_bindir), name),
     )
 
 
 class Emaint(PortageCommand):
     name = "emaint"
-    command = (PORTAGE_PYTHON, "-b", "-Wd", os.path.join(cnf_sbindir, name))
+    command = (PORTAGE_PYTHON, "-b", "-Wd", os.path.join(str(cnf_sbindir), name))
 
 
 class EtcUpdate(PortageCommand):
     name = "etc-update"
-    command = (BASH_BINARY, os.path.join(cnf_sbindir, name))
+    command = (BASH_BINARY, os.path.join(str(cnf_sbindir), name))
 
 
 class Fixpackages(PortageCommand):
@@ -320,7 +320,7 @@ class Fixpackages(PortageCommand):
         PORTAGE_PYTHON,
         "-b",
         "-Wd",
-        os.path.join(cnf_sbindir, name),
+        os.path.join(str(cnf_sbindir), name),
     )
 
 
@@ -330,7 +330,7 @@ class Portageq(PortageCommand):
         PORTAGE_PYTHON,
         "-b",
         "-Wd",
-        os.path.join(cnf_bindir, name),
+        os.path.join(str(cnf_bindir), name),
     )
 
 
@@ -340,7 +340,7 @@ class Quickpkg(PortageCommand):
         PORTAGE_PYTHON,
         "-b",
         "-Wd",
-        os.path.join(cnf_bindir, name),
+        os.path.join(str(cnf_bindir), name),
     )
 
 
@@ -350,7 +350,7 @@ class Regenworld(PortageCommand):
         PORTAGE_PYTHON,
         "-b",
         "-Wd",
-        os.path.join(cnf_sbindir, name),
+        os.path.join(str(cnf_sbindir), name),
     )
 
 

diff --git a/lib/portage/tests/emerge/test_baseline.py b/lib/portage/tests/emerge/test_baseline.py
index 55722d900e..8f44528949 100644
--- a/lib/portage/tests/emerge/test_baseline.py
+++ b/lib/portage/tests/emerge/test_baseline.py
@@ -173,7 +173,9 @@ async def _async_test_baseline(playground, binhost, commands):
             pass
     for x in etc_symlinks:
         try:
-            os.symlink(os.path.join(cnf_etc_path, x), os.path.join(eprefix, "etc", x))
+            os.symlink(
+                os.path.join(str(cnf_etc_path), x), os.path.join(eprefix, "etc", x)
+            )
         except FileExistsError:
             pass
     with open(os.path.join(var_cache_edb, "counter"), "wb") as f:

diff --git a/lib/portage/tests/emerge/test_simple.py b/lib/portage/tests/emerge/test_simple.py
new file mode 100644
index 0000000000..1cc6457ef1
--- /dev/null
+++ b/lib/portage/tests/emerge/test_simple.py
@@ -0,0 +1,740 @@
+# Copyright 2011-2021, 2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+import argparse
+import subprocess
+import sys
+
+import portage
+from portage import shutil, os
+from portage.const import (
+    BASH_BINARY,
+    BINREPOS_CONF_FILE,
+    PORTAGE_PYM_PATH,
+    USER_CONFIG_PATH,
+    SUPPORTED_GENTOO_BINPKG_FORMATS,
+)
+from portage.cache.mappings import Mapping
+from portage.process import find_binary
+from portage.tests import TestCase
+from portage.tests.resolver.ResolverPlayground import ResolverPlayground
+from portage.tests.util.test_socks5 import AsyncHTTPServer
+from portage.util import ensure_dirs, find_updated_config_files, shlex_split
+from portage.util.futures import asyncio
+from portage.output import colorize
+
+
+class BinhostContentMap(Mapping):
+    def __init__(self, remote_path, local_path):
+        self._remote_path = remote_path
+        self._local_path = local_path
+
+    def __getitem__(self, request_path):
+        safe_path = os.path.normpath(request_path)
+        if not safe_path.startswith(self._remote_path + "/"):
+            raise KeyError(request_path)
+        local_path = os.path.join(
+            self._local_path, safe_path[len(self._remote_path) + 1 :]
+        )
+        try:
+            with open(local_path, "rb") as f:
+                return f.read()
+        except OSError:
+            raise KeyError(request_path)
+
+
+class SimpleEmergeTestCase(TestCase):
+    def _have_python_xml(self):
+        try:
+            __import__("xml.etree.ElementTree")
+            __import__("xml.parsers.expat").parsers.expat.ExpatError
+        except (AttributeError, ImportError):
+            return False
+        return True
+
+    def testSimple(self):
+        debug = False
+
+        install_something = """
+S="${WORKDIR}"
+
+pkg_pretend() {
+	einfo "called pkg_pretend for $CATEGORY/$PF"
+}
+
+src_install() {
+	einfo "installing something..."
+	insinto /usr/lib/${P}
+	echo "blah blah blah" > "${T}"/regular-file
+	doins "${T}"/regular-file
+	dosym regular-file /usr/lib/${P}/symlink || die
+
+	# Test CONFIG_PROTECT
+	insinto /etc
+	newins "${T}"/regular-file ${PN}-${SLOT%/*}
+
+	# Test code for bug #381629, using a copyright symbol encoded with latin-1.
+	# We use $(printf "\\xa9") rather than $'\\xa9', since printf apparently
+	# works in any case, while $'\\xa9' transforms to \\xef\\xbf\\xbd under
+	# some conditions. TODO: Find out why it transforms to \\xef\\xbf\\xbd when
+	# running tests for Python 3.2 (even though it's bash that is ultimately
+	# responsible for performing the transformation).
+	local latin_1_dir=/usr/lib/${P}/latin-1-$(printf "\\xa9")-directory
+	insinto "${latin_1_dir}"
+	echo "blah blah blah" > "${T}"/latin-1-$(printf "\\xa9")-regular-file || die
+	doins "${T}"/latin-1-$(printf "\\xa9")-regular-file
+	dosym latin-1-$(printf "\\xa9")-regular-file ${latin_1_dir}/latin-1-$(printf "\\xa9")-symlink || die
+
+	call_has_and_best_version
+}
+
+pkg_config() {
+	einfo "called pkg_config for $CATEGORY/$PF"
+}
+
+pkg_info() {
+	einfo "called pkg_info for $CATEGORY/$PF"
+}
+
+pkg_preinst() {
+	if ! ___eapi_best_version_and_has_version_support_-b_-d_-r; then
+		# The BROOT variable is unset during pkg_* phases for EAPI 7,
+		# therefore best/has_version -b is expected to fail if we attempt
+		# to call it for EAPI 7 here.
+		call_has_and_best_version
+	fi
+}
+
+call_has_and_best_version() {
+	local root_arg
+	if ___eapi_best_version_and_has_version_support_-b_-d_-r; then
+		root_arg="-b"
+	else
+		root_arg="--host-root"
+	fi
+	einfo "called ${EBUILD_PHASE_FUNC} for $CATEGORY/$PF"
+	einfo "EPREFIX=${EPREFIX}"
+	einfo "PORTAGE_OVERRIDE_EPREFIX=${PORTAGE_OVERRIDE_EPREFIX}"
+	einfo "ROOT=${ROOT}"
+	einfo "EROOT=${EROOT}"
+	einfo "SYSROOT=${SYSROOT}"
+	einfo "ESYSROOT=${ESYSROOT}"
+	einfo "BROOT=${BROOT}"
+	# Test that has_version and best_version work correctly with
+	# prefix (involves internal ROOT -> EROOT calculation in order
+	# to support ROOT override via the environment with EAPIs 3
+	# and later which support prefix).
+	if has_version $CATEGORY/$PN:$SLOT ; then
+		einfo "has_version detects an installed instance of $CATEGORY/$PN:$SLOT"
+		einfo "best_version reports that the installed instance is $(best_version $CATEGORY/$PN:$SLOT)"
+	else
+		einfo "has_version does not detect an installed instance of $CATEGORY/$PN:$SLOT"
+	fi
+	if [[ ${EPREFIX} != ${PORTAGE_OVERRIDE_EPREFIX} ]] ; then
+		if has_version ${root_arg} $CATEGORY/$PN:$SLOT ; then
+			einfo "has_version ${root_arg} detects an installed instance of $CATEGORY/$PN:$SLOT"
+			einfo "best_version ${root_arg} reports that the installed instance is $(best_version ${root_arg} $CATEGORY/$PN:$SLOT)"
+		else
+			einfo "has_version ${root_arg} does not detect an installed instance of $CATEGORY/$PN:$SLOT"
+		fi
+	fi
+}
+
+"""
+
+        ebuilds = {
+            "dev-libs/A-1": {
+                "EAPI": "5",
+                "IUSE": "+flag",
+                "KEYWORDS": "x86",
+                "LICENSE": "GPL-2",
+                "MISC_CONTENT": install_something,
+                "RDEPEND": "flag? ( dev-libs/B[flag] )",
+            },
+            "dev-libs/B-1": {
+                "EAPI": "5",
+                "IUSE": "+flag",
+                "KEYWORDS": "x86",
+                "LICENSE": "GPL-2",
+                "MISC_CONTENT": install_something,
+            },
+            "dev-libs/C-1": {
+                "EAPI": "7",
+                "KEYWORDS": "~x86",
+                "RDEPEND": "dev-libs/D[flag]",
+                "MISC_CONTENT": install_something,
+            },
+            "dev-libs/D-1": {
+                "EAPI": "7",
+                "KEYWORDS": "~x86",
+                "IUSE": "flag",
+                "MISC_CONTENT": install_something,
+            },
+            "virtual/foo-0": {
+                "EAPI": "5",
+                "KEYWORDS": "x86",
+                "LICENSE": "GPL-2",
+            },
+        }
+
+        installed = {
+            "dev-libs/A-1": {
+                "EAPI": "5",
+                "IUSE": "+flag",
+                "KEYWORDS": "x86",
+                "LICENSE": "GPL-2",
+                "RDEPEND": "flag? ( dev-libs/B[flag] )",
+                "USE": "flag",
+            },
+            "dev-libs/B-1": {
+                "EAPI": "5",
+                "IUSE": "+flag",
+                "KEYWORDS": "x86",
+                "LICENSE": "GPL-2",
+                "USE": "flag",
+            },
+            "dev-libs/depclean-me-1": {
+                "EAPI": "5",
+                "IUSE": "",
+                "KEYWORDS": "x86",
+                "LICENSE": "GPL-2",
+                "USE": "",
+            },
+            "app-misc/depclean-me-1": {
+                "EAPI": "5",
+                "IUSE": "",
+                "KEYWORDS": "x86",
+                "LICENSE": "GPL-2",
+                "RDEPEND": "dev-libs/depclean-me",
+                "USE": "",
+            },
+        }
+
+        metadata_xml_files = (
+            (
+                "dev-libs/A",
+                {
+                    "flags": "<flag name='flag'>Description of how USE='flag' affects this package</flag>",
+                },
+            ),
+            (
+                "dev-libs/B",
+                {
+                    "flags": "<flag name='flag'>Description of how USE='flag' affects this package</flag>",
+                },
+            ),
+        )
+
+        for binpkg_format in SUPPORTED_GENTOO_BINPKG_FORMATS:
+            with self.subTest(binpkg_format=binpkg_format):
+                print(colorize("HILITE", binpkg_format), end=" ... ")
+                sys.stdout.flush()
+                playground = ResolverPlayground(
+                    ebuilds=ebuilds,
+                    installed=installed,
+                    debug=debug,
+                    user_config={
+                        "make.conf": (f'BINPKG_FORMAT="{binpkg_format}"',),
+                    },
+                )
+
+                loop = asyncio._wrap_loop()
+                loop.run_until_complete(
+                    asyncio.ensure_future(
+                        self._async_test_simple(
+                            playground, metadata_xml_files, loop=loop
+                        ),
+                        loop=loop,
+                    )
+                )
+
+    async def _async_test_simple(self, playground, metadata_xml_files, loop):
+        debug = playground.debug
+        settings = playground.settings
+        eprefix = settings["EPREFIX"]
+        eroot = settings["EROOT"]
+        trees = playground.trees
+        portdb = trees[eroot]["porttree"].dbapi
+        test_repo_location = settings.repositories["test_repo"].location
+        var_cache_edb = os.path.join(eprefix, "var", "cache", "edb")
+        cachedir = os.path.join(var_cache_edb, "dep")
+        cachedir_pregen = os.path.join(test_repo_location, "metadata", "md5-cache")
+
+        portage_python = portage._python_interpreter
+        dispatch_conf_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.sbindir), "dispatch-conf"),
+        )
+        ebuild_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.bindir), "ebuild"),
+        )
+        egencache_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.bindir), "egencache"),
+            "--repo",
+            "test_repo",
+            "--repositories-configuration",
+            settings.repositories.config_string(),
+        )
+        emerge_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.bindir), "emerge"),
+        )
+        emaint_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.sbindir), "emaint"),
+        )
+        env_update_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.sbindir), "env-update"),
+        )
+        etc_update_cmd = (BASH_BINARY, os.path.join(str(self.sbindir), "etc-update"))
+        fixpackages_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.sbindir), "fixpackages"),
+        )
+        portageq_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.bindir), "portageq"),
+        )
+        quickpkg_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.bindir), "quickpkg"),
+        )
+        regenworld_cmd = (
+            portage_python,
+            "-b",
+            "-Wd",
+            os.path.join(str(self.sbindir), "regenworld"),
+        )
+
+        rm_binary = find_binary("rm")
+        self.assertEqual(rm_binary is None, False, "rm command not found")
+        rm_cmd = (rm_binary,)
+
+        egencache_extra_args = []
+        if self._have_python_xml():
+            egencache_extra_args.append("--update-use-local-desc")
+
+        test_ebuild = portdb.findname("dev-libs/A-1")
+        self.assertFalse(test_ebuild is None)
+
+        cross_prefix = os.path.join(eprefix, "cross_prefix")
+        cross_root = os.path.join(eprefix, "cross_root")
+        cross_eroot = os.path.join(cross_root, eprefix.lstrip(os.sep))
+
+        binhost_dir = os.path.join(eprefix, "binhost")
+        binhost_address = "127.0.0.1"
+        binhost_remote_path = "/binhost"
+        binhost_server = AsyncHTTPServer(
+            binhost_address, BinhostContentMap(binhost_remote_path, binhost_dir), loop
+        ).__enter__()
+        binhost_uri = "http://{address}:{port}{path}".format(
+            address=binhost_address,
+            port=binhost_server.server_port,
+            path=binhost_remote_path,
+        )
+
+        binpkg_format = settings.get(
+            "BINPKG_FORMAT", SUPPORTED_GENTOO_BINPKG_FORMATS[0]
+        )
+        self.assertIn(binpkg_format, ("xpak", "gpkg"))
+        if binpkg_format == "xpak":
+            foo_filename = "foo-0-1.xpak"
+        elif binpkg_format == "gpkg":
+            foo_filename = "foo-0-1.gpkg.tar"
+
+        test_commands = ()
+
+        if hasattr(argparse.ArgumentParser, "parse_intermixed_args"):
+            test_commands += (
+                emerge_cmd + ("--oneshot", "dev-libs/A", "-v", "dev-libs/A"),
+            )
+
+        test_commands += (
+            emerge_cmd
+            + (
+                "--usepkgonly",
+                "--root",
+                cross_root,
+                "--quickpkg-direct=y",
+                "--quickpkg-direct-root",
+                "/",
+                "dev-libs/A",
+            ),
+            emerge_cmd
+            + (
+                "--usepkgonly",
+                "--quickpkg-direct=y",
+                "--quickpkg-direct-root",
+                cross_root,
+                "dev-libs/A",
+            ),
+            env_update_cmd,
+            portageq_cmd
+            + (
+                "envvar",
+                "-v",
+                "CONFIG_PROTECT",
+                "EROOT",
+                "PORTAGE_CONFIGROOT",
+                "PORTAGE_TMPDIR",
+                "USERLAND",
+            ),
+            etc_update_cmd,
+            dispatch_conf_cmd,
+            emerge_cmd + ("--version",),
+            emerge_cmd + ("--info",),
+            emerge_cmd + ("--info", "--verbose"),
+            emerge_cmd + ("--list-sets",),
+            emerge_cmd + ("--check-news",),
+            rm_cmd + ("-rf", cachedir),
+            rm_cmd + ("-rf", cachedir_pregen),
+            emerge_cmd + ("--regen",),
+            rm_cmd + ("-rf", cachedir),
+            ({"FEATURES": "metadata-transfer"},) + emerge_cmd + ("--regen",),
+            rm_cmd + ("-rf", cachedir),
+            ({"FEATURES": "metadata-transfer"},) + emerge_cmd + ("--regen",),
+            rm_cmd + ("-rf", cachedir),
+            egencache_cmd + ("--update",) + tuple(egencache_extra_args),
+            ({"FEATURES": "metadata-transfer"},) + emerge_cmd + ("--metadata",),
+            rm_cmd + ("-rf", cachedir),
+            ({"FEATURES": "metadata-transfer"},) + emerge_cmd + ("--metadata",),
+            emerge_cmd + ("--metadata",),
+            rm_cmd + ("-rf", cachedir),
+            emerge_cmd + ("--oneshot", "virtual/foo"),
+            lambda: self.assertFalse(
+                os.path.exists(os.path.join(pkgdir, "virtual", "foo", foo_filename))
+            ),
+            ({"FEATURES": "unmerge-backup"},)
+            + emerge_cmd
+            + ("--unmerge", "virtual/foo"),
+            lambda: self.assertTrue(
+                os.path.exists(os.path.join(pkgdir, "virtual", "foo", foo_filename))
+            ),
+            emerge_cmd + ("--pretend", "dev-libs/A"),
+            ebuild_cmd + (test_ebuild, "manifest", "clean", "package", "merge"),
+            emerge_cmd + ("--pretend", "--tree", "--complete-graph", "dev-libs/A"),
+            emerge_cmd + ("-p", "dev-libs/B"),
+            emerge_cmd + ("-p", "--newrepo", "dev-libs/B"),
+            emerge_cmd
+            + (
+                "-B",
+                "dev-libs/B",
+            ),
+            emerge_cmd
+            + (
+                "--oneshot",
+                "--usepkg",
+                "dev-libs/B",
+            ),
+            # trigger clean prior to pkg_pretend as in bug #390711
+            ebuild_cmd + (test_ebuild, "unpack"),
+            emerge_cmd
+            + (
+                "--oneshot",
+                "dev-libs/A",
+            ),
+            emerge_cmd
+            + (
+                "--noreplace",
+                "dev-libs/A",
+            ),
+            emerge_cmd
+            + (
+                "--config",
+                "dev-libs/A",
+            ),
+            emerge_cmd + ("--info", "dev-libs/A", "dev-libs/B"),
+            emerge_cmd + ("--pretend", "--depclean", "--verbose", "dev-libs/B"),
+            emerge_cmd
+            + (
+                "--pretend",
+                "--depclean",
+            ),
+            emerge_cmd + ("--depclean",),
+            quickpkg_cmd
+            + (
+                "--include-config",
+                "y",
+                "dev-libs/A",
+            ),
+            # Test bug #523684, where a file renamed or removed by the
+            # admin forces replacement files to be merged with config
+            # protection.
+            lambda: self.assertEqual(
+                0,
+                len(
+                    list(
+                        find_updated_config_files(
+                            eroot, shlex_split(settings["CONFIG_PROTECT"])
+                        )
+                    )
+                ),
+            ),
+            lambda: os.unlink(os.path.join(eprefix, "etc", "A-0")),
+            emerge_cmd + ("--usepkgonly", "dev-libs/A"),
+            lambda: self.assertEqual(
+                1,
+                len(
+                    list(
+                        find_updated_config_files(
+                            eroot, shlex_split(settings["CONFIG_PROTECT"])
+                        )
+                    )
+                ),
+            ),
+            emaint_cmd + ("--check", "all"),
+            emaint_cmd + ("--fix", "all"),
+            fixpackages_cmd,
+            regenworld_cmd,
+            portageq_cmd + ("match", eroot, "dev-libs/A"),
+            portageq_cmd + ("best_visible", eroot, "dev-libs/A"),
+            portageq_cmd + ("best_visible", eroot, "binary", "dev-libs/A"),
+            portageq_cmd + ("contents", eroot, "dev-libs/A-1"),
+            portageq_cmd
+            + ("metadata", eroot, "ebuild", "dev-libs/A-1", "EAPI", "IUSE", "RDEPEND"),
+            portageq_cmd
+            + ("metadata", eroot, "binary", "dev-libs/A-1", "EAPI", "USE", "RDEPEND"),
+            portageq_cmd
+            + (
+                "metadata",
+                eroot,
+                "installed",
+                "dev-libs/A-1",
+                "EAPI",
+                "USE",
+                "RDEPEND",
+            ),
+            portageq_cmd + ("owners", eroot, eroot + "usr"),
+            emerge_cmd + ("-p", eroot + "usr"),
+            emerge_cmd + ("-p", "--unmerge", "-q", eroot + "usr"),
+            emerge_cmd + ("--unmerge", "--quiet", "dev-libs/A"),
+            emerge_cmd + ("-C", "--quiet", "dev-libs/B"),
+            # If EMERGE_DEFAULT_OPTS contains --autounmask=n, then --autounmask
+            # must be specified with --autounmask-continue.
+            ({"EMERGE_DEFAULT_OPTS": "--autounmask=n"},)
+            + emerge_cmd
+            + (
+                "--autounmask",
+                "--autounmask-continue",
+                "dev-libs/C",
+            ),
+            # Verify that the above --autounmask-continue command caused
+            # USE=flag to be applied correctly to dev-libs/D.
+            portageq_cmd + ("match", eroot, "dev-libs/D[flag]"),
+            # Test cross-prefix usage, including chpathtool for binpkgs.
+            # EAPI 7
+            ({"EPREFIX": cross_prefix},) + emerge_cmd + ("dev-libs/C",),
+            ({"EPREFIX": cross_prefix},)
+            + portageq_cmd
+            + ("has_version", cross_prefix, "dev-libs/C"),
+            ({"EPREFIX": cross_prefix},)
+            + portageq_cmd
+            + ("has_version", cross_prefix, "dev-libs/D"),
+            ({"ROOT": cross_root},) + emerge_cmd + ("dev-libs/D",),
+            portageq_cmd + ("has_version", cross_eroot, "dev-libs/D"),
+            # EAPI 5
+            ({"EPREFIX": cross_prefix},) + emerge_cmd + ("--usepkgonly", "dev-libs/A"),
+            ({"EPREFIX": cross_prefix},)
+            + portageq_cmd
+            + ("has_version", cross_prefix, "dev-libs/A"),
+            ({"EPREFIX": cross_prefix},)
+            + portageq_cmd
+            + ("has_version", cross_prefix, "dev-libs/B"),
+            ({"EPREFIX": cross_prefix},) + emerge_cmd + ("-C", "--quiet", "dev-libs/B"),
+            ({"EPREFIX": cross_prefix},) + emerge_cmd + ("-C", "--quiet", "dev-libs/A"),
+            ({"EPREFIX": cross_prefix},) + emerge_cmd + ("dev-libs/A",),
+            ({"EPREFIX": cross_prefix},)
+            + portageq_cmd
+            + ("has_version", cross_prefix, "dev-libs/A"),
+            ({"EPREFIX": cross_prefix},)
+            + portageq_cmd
+            + ("has_version", cross_prefix, "dev-libs/B"),
+            # Test ROOT support
+            ({"ROOT": cross_root},) + emerge_cmd + ("dev-libs/B",),
+            portageq_cmd + ("has_version", cross_eroot, "dev-libs/B"),
+        )
+
+        # Test binhost support if FETCHCOMMAND is available.
+        binrepos_conf_file = os.path.join(os.sep, eprefix, BINREPOS_CONF_FILE)
+        with open(binrepos_conf_file, "w") as f:
+            f.write("[test-binhost]\n")
+            f.write(f"sync-uri = {binhost_uri}\n")
+        fetchcommand = portage.util.shlex_split(playground.settings["FETCHCOMMAND"])
+        fetch_bin = portage.process.find_binary(fetchcommand[0])
+        if fetch_bin is not None:
+            test_commands = test_commands + (
+                lambda: os.rename(pkgdir, binhost_dir),
+                emerge_cmd + ("-e", "--getbinpkgonly", "dev-libs/A"),
+                lambda: shutil.rmtree(pkgdir),
+                lambda: os.rename(binhost_dir, pkgdir),
+                # Remove binrepos.conf and test PORTAGE_BINHOST.
+                lambda: os.unlink(binrepos_conf_file),
+                lambda: os.rename(pkgdir, binhost_dir),
+                ({"PORTAGE_BINHOST": binhost_uri},)
+                + emerge_cmd
+                + ("-fe", "--getbinpkgonly", "dev-libs/A"),
+                lambda: shutil.rmtree(pkgdir),
+                lambda: os.rename(binhost_dir, pkgdir),
+            )
+
+        distdir = playground.distdir
+        pkgdir = playground.pkgdir
+        fake_bin = os.path.join(eprefix, "bin")
+        portage_tmpdir = os.path.join(eprefix, "var", "tmp", "portage")
+        profile_path = settings.profile_path
+        user_config_dir = os.path.join(os.sep, eprefix, USER_CONFIG_PATH)
+
+        path = os.environ.get("PATH")
+        if path is not None and not path.strip():
+            path = None
+        if path is None:
+            path = ""
+        else:
+            path = ":" + path
+        path = fake_bin + path
+
+        pythonpath = os.environ.get("PYTHONPATH")
+        if pythonpath is not None and not pythonpath.strip():
+            pythonpath = None
+        if pythonpath is not None and pythonpath.split(":")[0] == PORTAGE_PYM_PATH:
+            pass
+        else:
+            if pythonpath is None:
+                pythonpath = ""
+            else:
+                pythonpath = ":" + pythonpath
+            pythonpath = PORTAGE_PYM_PATH + pythonpath
+
+        env = {
+            "PORTAGE_OVERRIDE_EPREFIX": eprefix,
+            "CLEAN_DELAY": "0",
+            "DISTDIR": distdir,
+            "EMERGE_WARNING_DELAY": "0",
+            "INFODIR": "",
+            "INFOPATH": "",
+            "PATH": path,
+            "PKGDIR": pkgdir,
+            "PORTAGE_INST_GID": str(os.getgid()),  # str(portage.data.portage_gid),
+            "PORTAGE_INST_UID": str(os.getuid()),  # str(portage.data.portage_uid),
+            "PORTAGE_PYTHON": portage_python,
+            "PORTAGE_REPOSITORIES": settings.repositories.config_string(),
+            "PORTAGE_TMPDIR": portage_tmpdir,
+            "PORTAGE_LOGDIR": portage_tmpdir,
+            "PYTHONDONTWRITEBYTECODE": os.environ.get("PYTHONDONTWRITEBYTECODE", ""),
+            "PYTHONPATH": pythonpath,
+            "__PORTAGE_TEST_PATH_OVERRIDE": fake_bin,
+        }
+
+        if "__PORTAGE_TEST_HARDLINK_LOCKS" in os.environ:
+            env["__PORTAGE_TEST_HARDLINK_LOCKS"] = os.environ[
+                "__PORTAGE_TEST_HARDLINK_LOCKS"
+            ]
+
+        updates_dir = os.path.join(test_repo_location, "profiles", "updates")
+        dirs = [
+            cachedir,
+            cachedir_pregen,
+            cross_eroot,
+            cross_prefix,
+            distdir,
+            fake_bin,
+            portage_tmpdir,
+            updates_dir,
+            user_config_dir,
+            var_cache_edb,
+        ]
+        etc_symlinks = ("dispatch-conf.conf", "etc-update.conf")
+        # Override things that may be unavailable, or may have portability
+        # issues when running tests in exotic environments.
+        #   prepstrip - bug #447810 (bash read builtin EINTR problem)
+        true_symlinks = ["find", "prepstrip", "sed", "scanelf"]
+        true_binary = find_binary("true")
+        self.assertEqual(true_binary is None, False, "true command not found")
+        try:
+            for d in dirs:
+                ensure_dirs(d)
+            for x in true_symlinks:
+                os.symlink(true_binary, os.path.join(fake_bin, x))
+            for x in etc_symlinks:
+                os.symlink(
+                    os.path.join(str(self.cnf_etc_path), x),
+                    os.path.join(eprefix, "etc", x),
+                )
+            with open(os.path.join(var_cache_edb, "counter"), "wb") as f:
+                f.write(b"100")
+            # non-empty system set keeps --depclean quiet
+            with open(os.path.join(profile_path, "packages"), "w") as f:
+                f.write("*dev-libs/token-system-pkg")
+            for cp, xml_data in metadata_xml_files:
+                with open(
+                    os.path.join(test_repo_location, cp, "metadata.xml"), "w"
+                ) as f:
+                    f.write(playground.metadata_xml_template % xml_data)
+            with open(os.path.join(updates_dir, "1Q-2010"), "w") as f:
+                f.write(
+                    """
+slotmove =app-doc/pms-3 2 3
+move dev-util/git dev-vcs/git
+"""
+                )
+
+            if debug:
+                # The subprocess inherits both stdout and stderr, for
+                # debugging purposes.
+                stdout = None
+            else:
+                # The subprocess inherits stderr so that any warnings
+                # triggered by python -Wd will be visible.
+                stdout = subprocess.PIPE
+
+            for args in test_commands:
+                if hasattr(args, "__call__"):
+                    args()
+                    continue
+
+                if isinstance(args[0], dict):
+                    local_env = env.copy()
+                    local_env.update(args[0])
+                    args = args[1:]
+                else:
+                    local_env = env
+
+                proc = await asyncio.create_subprocess_exec(
+                    *args, env=local_env, stderr=None, stdout=stdout
+                )
+
+                if debug:
+                    await proc.wait()
+                else:
+                    output, _err = await proc.communicate()
+                    await proc.wait()
+                    if proc.returncode != os.EX_OK:
+                        portage.writemsg(output)
+
+                self.assertEqual(
+                    os.EX_OK, proc.returncode, f"emerge failed with args {args}"
+                )
+        finally:
+            binhost_server.__exit__(None, None, None)
+            playground.cleanup()


             reply	other threads:[~2023-10-30  3:14 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-30  3:14 Sam James [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-02-25  8:25 [gentoo-commits] proj/portage:master commit in: lib/portage/tests/emerge/ Sam James
2024-02-24  3:36 Zac Medico
2024-01-03 19:59 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-10-30  3:14 Sam James
2023-05-26 15:45 Sam James
2023-05-26 15:45 Sam James
2022-09-25 19:12 Mike Gilbert
2021-01-18 12:20 Zac Medico
2020-10-17  9:21 Zac Medico
2020-10-12 18:03 Zac Medico
2020-08-03 23:28 Zac Medico
2020-08-03 19:30 Zac Medico
2020-03-08 22:29 Zac Medico
2020-03-08  7:33 Zac Medico

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1698635665.e324f300247f4181362325d46a7232f0bbaf561e.sam@gentoo \
    --to=sam@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox