commit:     25f666914fd7b7be845d4d1fb9fc276fad566779
Author:     David Palao <david.palao <AT> gmail <DOT> com>
AuthorDate: Fri Jun 30 14:05:54 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Oct 30 03:14:22 2023 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=25f66691

tests/emerge: Add simple_command parametrized fixture.

Add simple_command parametrized fixture. This is work in progress:
in order to include post-checks to some tests, a different approach
is needed.

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    | 395 +++++++++++++++++++++++++++++++-
 lib/portage/tests/emerge/test_simple.py | 391 +++----------------------------
 2 files changed, 428 insertions(+), 358 deletions(-)

diff --git a/lib/portage/tests/emerge/conftest.py 
b/lib/portage/tests/emerge/conftest.py
index 716bb6a85e..6f78f17935 100644
--- a/lib/portage/tests/emerge/conftest.py
+++ b/lib/portage/tests/emerge/conftest.py
@@ -1,12 +1,21 @@
 # Copyright 2023 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
-from portage.const import SUPPORTED_GENTOO_BINPKG_FORMATS
+import argparse
+
+from portage.const import (
+    SUPPORTED_GENTOO_BINPKG_FORMATS,
+    BASH_BINARY,
+    BINREPOS_CONF_FILE,
+)
 from portage.tests.resolver.ResolverPlayground import ResolverPlayground
 from portage.cache.mappings import Mapping
 from portage.tests.util.test_socks5 import AsyncHTTPServer
 from portage import os
 from portage.util.futures import asyncio
+from portage.tests import cnf_bindir, cnf_sbindir
+from portage.process import find_binary
+import portage
 
 import pytest
 
@@ -167,6 +176,51 @@ _INSTALLED_EBUILDS = {
 }
 
 
+_TEST_COMMAND_NAMES = [
+    "emerge_w_parse_intermixed_args",
+    "emerge --root --quickpkg-direct-root",
+    "emerge --quickpkg-direct-root",
+    "env-update",
+    "portageq envvar",
+    "etc-update",
+    "dispatch-conf",
+    "emerge --version",
+    "emerge --info",
+    "emerge --info --verbose",
+    "emerge --list-sets",
+    "emerge --check-news",
+    "rm -rf {cachedir}",
+    "rm -rf {cachedir_pregen}",
+    "emerge --regen",
+    "rm -rf {cachedir} (2)",
+    "FEATURES=metadata-transfer emerge --regen",
+    "rm -rf {cachedir} (3)",
+    "FEATURES=metadata-transfer emerge --regen (2)",
+    "rm -rf {cachedir} (4)",
+    "egencache --update",
+    "FEATURES=metadata-transfer emerge --metadata",
+    "rm -rf {cachedir} (5)",
+    "FEATURES=metadata-transfer emerge --metadata (2)",
+    "emerge --metadata",
+    "rm -rf {cachedir} (6)",
+    "emerge --oneshot virtual/foo",
+]
+
+
+def pytest_generate_tests(metafunc):
+    if "simple_command" in metafunc.fixturenames:
+        metafunc.parametrize("simple_command", _TEST_COMMAND_NAMES, 
indirect=True)
+
+
+def _have_python_xml():
+    try:
+        __import__("xml.etree.ElementTree")
+        __import__("xml.parsers.expat").parsers.expat.ExpatError
+    except (AttributeError, ImportError):
+        return False
+    return True
+
+
 class BinhostContentMap(Mapping):
     def __init__(self, remote_path, local_path):
         self._remote_path = remote_path
@@ -223,5 +277,342 @@ def binhost(playground, async_loop):
         port=binhost_server.server_port,
         path=binhost_remote_path,
     )
-    yield {"server": binhost_server, "uri": binhost_uri}
+    yield {"server": binhost_server, "uri": binhost_uri, "dir": binhost_dir}
     binhost_server.__exit__(None, None, None)
+
+
[email protected]()
+def simple_command(playground, binhost, request):
+    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(cnf_sbindir, "dispatch-conf"),
+    )
+    ebuild_cmd = (portage_python, "-b", "-Wd", os.path.join(cnf_bindir, 
"ebuild"))
+    egencache_cmd = (
+        portage_python,
+        "-b",
+        "-Wd",
+        os.path.join(cnf_bindir, "egencache"),
+        "--repo",
+        "test_repo",
+        "--repositories-configuration",
+        settings.repositories.config_string(),
+    )
+    emerge_cmd = (portage_python, "-b", "-Wd", os.path.join(cnf_bindir, 
"emerge"))
+    emaint_cmd = (portage_python, "-b", "-Wd", os.path.join(cnf_sbindir, 
"emaint"))
+    env_update_cmd = (
+        portage_python,
+        "-b",
+        "-Wd",
+        os.path.join(cnf_sbindir, "env-update"),
+    )
+    etc_update_cmd = (BASH_BINARY, os.path.join(cnf_sbindir, "etc-update"))
+    fixpackages_cmd = (
+        portage_python,
+        "-b",
+        "-Wd",
+        os.path.join(cnf_sbindir, "fixpackages"),
+    )
+    portageq_cmd = (
+        portage_python,
+        "-b",
+        "-Wd",
+        os.path.join(cnf_bindir, "portageq"),
+    )
+    quickpkg_cmd = (
+        portage_python,
+        "-b",
+        "-Wd",
+        os.path.join(cnf_bindir, "quickpkg"),
+    )
+    regenworld_cmd = (
+        portage_python,
+        "-b",
+        "-Wd",
+        os.path.join(cnf_sbindir, "regenworld"),
+    )
+
+    rm_binary = find_binary("rm")
+    assert rm_binary is not None, "rm command not found"
+    rm_cmd = (rm_binary,)
+
+    egencache_extra_args = []
+    if _have_python_xml():
+        egencache_extra_args.append("--update-use-local-desc")
+
+    test_ebuild = portdb.findname("dev-libs/A-1")
+    assert test_ebuild is not 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))
+
+    binpkg_format = settings.get("BINPKG_FORMAT", 
SUPPORTED_GENTOO_BINPKG_FORMATS[0])
+    assert binpkg_format in ("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_w_parse_intermixed_args"] = emerge_cmd + (
+            "--oneshot",
+            "dev-libs/A",
+            "-v",
+            "dev-libs/A",
+        )
+
+    test_commands["emerge --root --quickpkg-direct-root"] = emerge_cmd + (
+        "--usepkgonly",
+        "--root",
+        cross_root,
+        "--quickpkg-direct=y",
+        "--quickpkg-direct-root",
+        "/",
+        "dev-libs/A",
+    )
+    test_commands["emerge --quickpkg-direct-root"] = emerge_cmd + (
+        "--usepkgonly",
+        "--quickpkg-direct=y",
+        "--quickpkg-direct-root",
+        cross_root,
+        "dev-libs/A",
+    )
+    test_commands["env-update"] = env_update_cmd
+    test_commands["portageq envvar"] = portageq_cmd + (
+        "envvar",
+        "-v",
+        "CONFIG_PROTECT",
+        "EROOT",
+        "PORTAGE_CONFIGROOT",
+        "PORTAGE_TMPDIR",
+        "USERLAND",
+    )
+    test_commands["etc-update"] = etc_update_cmd
+    test_commands["dispatch-conf"] = dispatch_conf_cmd
+    test_commands["emerge --version"] = emerge_cmd + ("--version",)
+    test_commands["emerge --info"] = emerge_cmd + ("--info",)
+    test_commands["emerge --info --verbose"] = emerge_cmd + ("--info", 
"--verbose")
+    test_commands["emerge --list-sets"] = emerge_cmd + ("--list-sets",)
+    test_commands["emerge --check-news"] = emerge_cmd + ("--check-news",)
+    test_commands["rm -rf {cachedir}"] = rm_cmd + ("-rf", cachedir)
+    test_commands["rm -rf {cachedir_pregen}"] = rm_cmd + ("-rf", 
cachedir_pregen)
+    test_commands["emerge --regen"] = emerge_cmd + ("--regen",)
+    test_commands["rm -rf {cachedir} (2)"] = rm_cmd + ("-rf", cachedir)
+    test_commands["FEATURES=metadata-transfer emerge --regen"] = (
+        ({"FEATURES": "metadata-transfer"},) + emerge_cmd + ("--regen",)
+    )
+    test_commands["rm -rf {cachedir} (3)"] = rm_cmd + ("-rf", cachedir)
+    test_commands["FEATURES=metadata-transfer emerge --regen (2)"] = (
+        ({"FEATURES": "metadata-transfer"},) + emerge_cmd + ("--regen",)
+    )
+    test_commands["rm -rf {cachedir} (4)"] = rm_cmd + ("-rf", cachedir)
+    test_commands["egencache --update"] = (
+        egencache_cmd + ("--update",) + tuple(egencache_extra_args)
+    )
+    test_commands["FEATURES=metadata-transfer emerge --metadata"] = (
+        ({"FEATURES": "metadata-transfer"},) + emerge_cmd + ("--metadata",)
+    )
+    test_commands["rm -rf {cachedir} (5)"] = rm_cmd + ("-rf", cachedir)
+    test_commands["FEATURES=metadata-transfer emerge --metadata (2)"] = (
+        ({"FEATURES": "metadata-transfer"},) + emerge_cmd + ("--metadata",)
+    )
+    test_commands["emerge --metadata"] = emerge_cmd + ("--metadata",)
+    test_commands["rm -rf {cachedir} (6)"] = rm_cmd + ("-rf", cachedir)
+    test_commands["emerge --oneshot virtual/foo"] = emerge_cmd + (
+        "--oneshot",
+        "virtual/foo",
+    )
+    # test_commands["virtual/foo exists"] = (
+    #     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)
+    # binhost_uri = binhost["uri"]
+    # binhost_dir = binhost["dir"]
+    # 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(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),
+    #     )
+    return test_commands[request.param]

diff --git a/lib/portage/tests/emerge/test_simple.py 
b/lib/portage/tests/emerge/test_simple.py
index 0389961740..6e417f8de3 100644
--- a/lib/portage/tests/emerge/test_simple.py
+++ b/lib/portage/tests/emerge/test_simple.py
@@ -1,22 +1,17 @@
 # Copyright 2011-2021, 2023 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
-import argparse
 import subprocess
 
-import pytest
-
 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.process import find_binary
-from portage.tests import cnf_bindir, cnf_sbindir, cnf_etc_path
+from portage.tests import cnf_etc_path
 from portage.util import ensure_dirs, find_updated_config_files, shlex_split
 from portage.util.futures import asyncio
 
@@ -37,349 +32,32 @@ _METADATA_XML_FILES = (
 )
 
 
-def _have_python_xml():
-    try:
-        __import__("xml.etree.ElementTree")
-        __import__("xml.parsers.expat").parsers.expat.ExpatError
-    except (AttributeError, ImportError):
-        return False
-    return True
-
-
-def make_test_commands(settings, trees, binhost_uri):
-    eprefix = settings["EPREFIX"]
-    eroot = settings["EROOT"]
-    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(cnf_sbindir, "dispatch-conf"),
-    )
-    ebuild_cmd = (portage_python, "-b", "-Wd", os.path.join(cnf_bindir, 
"ebuild"))
-    egencache_cmd = (
-        portage_python,
-        "-b",
-        "-Wd",
-        os.path.join(cnf_bindir, "egencache"),
-        "--repo",
-        "test_repo",
-        "--repositories-configuration",
-        settings.repositories.config_string(),
-    )
-    emerge_cmd = (portage_python, "-b", "-Wd", os.path.join(cnf_bindir, 
"emerge"))
-    emaint_cmd = (portage_python, "-b", "-Wd", os.path.join(cnf_sbindir, 
"emaint"))
-    env_update_cmd = (
-        portage_python,
-        "-b",
-        "-Wd",
-        os.path.join(cnf_sbindir, "env-update"),
-    )
-    etc_update_cmd = (BASH_BINARY, os.path.join(cnf_sbindir, "etc-update"))
-    fixpackages_cmd = (
-        portage_python,
-        "-b",
-        "-Wd",
-        os.path.join(cnf_sbindir, "fixpackages"),
-    )
-    portageq_cmd = (
-        portage_python,
-        "-b",
-        "-Wd",
-        os.path.join(cnf_bindir, "portageq"),
-    )
-    quickpkg_cmd = (
-        portage_python,
-        "-b",
-        "-Wd",
-        os.path.join(cnf_bindir, "quickpkg"),
-    )
-    regenworld_cmd = (
-        portage_python,
-        "-b",
-        "-Wd",
-        os.path.join(cnf_sbindir, "regenworld"),
-    )
-
-    rm_binary = find_binary("rm")
-    assert rm_binary is not None, "rm command not found"
-    rm_cmd = (rm_binary,)
-
-    egencache_extra_args = []
-    if _have_python_xml():
-        egencache_extra_args.append("--update-use-local-desc")
-
-    test_ebuild = portdb.findname("dev-libs/A-1")
-    assert test_ebuild is not 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))
-
-    binpkg_format = settings.get("BINPKG_FORMAT", 
SUPPORTED_GENTOO_BINPKG_FORMATS[0])
-    assert binpkg_format in ("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(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),
-        )
-    return test_commands
+class SimpleTestCommand:
+    ...
 
 
-def test_simple_emerge(async_loop, playground, binhost):
+def test_simple_emerge(async_loop, playground, binhost, simple_command):
     async_loop.run_until_complete(
         asyncio.ensure_future(
             _async_test_simple(
-                playground, binhost, _METADATA_XML_FILES, loop=async_loop
+                playground,
+                binhost,
+                simple_command,
+                _METADATA_XML_FILES,
+                loop=async_loop,
             ),
             loop=async_loop,
         )
     )
 
 
-async def _async_test_simple(playground, binhost, metadata_xml_files, loop):
+async def _async_test_simple(playground, binhost, command, metadata_xml_files, 
loop):
     debug = playground.debug
     settings = playground.settings
     trees = playground.trees
     eprefix = settings["EPREFIX"]
 
-    test_commands = make_test_commands(settings, trees, binhost["uri"])
+    # test_commands = make_test_commands(settings, trees, binhost["uri"])
 
     test_repo_location = settings.repositories["test_repo"].location
     var_cache_edb = os.path.join(eprefix, "var", "cache", "edb")
@@ -494,29 +172,30 @@ move dev-util/git dev-vcs/git
         # triggered by python -Wd will be visible.
         stdout = subprocess.PIPE
 
-    for idx, args in enumerate(test_commands):
-        if hasattr(args, "__call__"):
-            args()
-            continue
+    if hasattr(command, "__call__"):
+        command()
+        return
 
-        if isinstance(args[0], dict):
-            local_env = env.copy()
-            local_env.update(args[0])
-            args = args[1:]
-        else:
-            local_env = env
-
-        # with self.subTest(cmd=args, i=idx):
-        proc = await asyncio.create_subprocess_exec(
-            *args, env=local_env, stderr=None, stdout=stdout
-        )
+    if isinstance(command[0], dict):
+        local_env = env.copy()
+        local_env.update(command[0])
+        command = command[1:]
+    else:
+        local_env = env
 
-        if debug:
-            await proc.wait()
-        else:
-            output, _err = await proc.communicate()
-            await proc.wait()
-            if proc.returncode != os.EX_OK:
-                portage.writemsg(output)
+    # with self.subTest(cmd=command, i=idx):
+    proc = await asyncio.create_subprocess_exec(
+        *command, env=local_env, stderr=None, stdout=stdout
+    )
 
-        assert os.EX_OK == proc.returncode, f"emerge failed with args {args}"
+    if debug:
+        await proc.wait()
+    else:
+        output, _err = await proc.communicate()
+        await proc.wait()
+        if proc.returncode != os.EX_OK:
+            portage.writemsg(output)
+
+    real_command = command[0]
+    args = command[1:]
+    assert os.EX_OK == proc.returncode, f"'{real_command}' failed with args 
'{args}'"

Reply via email to