# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests the chroot_util module."""

import itertools

from chromite.lib import chroot_util
from chromite.lib import constants
from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.utils import os_util


pytestmark = cros_test_lib.pytestmark_inside_only

if cros_build_lib.IsInsideChroot():
    from chromite.scripts import cros_list_modified_packages


class ChrootUtilTest(cros_test_lib.RunCommandTempDirTestCase):
    """Test class for the chroot_util functions."""

    def testEmerge(self) -> None:
        """Tests correct invocation of emerge."""
        packages = ["foo-app/bar", "sys-baz/clap"]
        self.PatchObject(
            cros_list_modified_packages,
            "ListModifiedWorkonPackages",
            return_value=[packages[0]],
        )

        toolchain_packages = [
            "sys-devel/binutils",
            "sys-devel/gcc",
            "sys-kernel/linux-headers",
            "sys-libs/glibc",
            "sys-devel/gdb",
        ]
        self.PatchObject(
            chroot_util,
            "_GetToolchainPackages",
            return_value=toolchain_packages,
        )
        toolchain_package_list = " ".join(toolchain_packages)

        input_values = [
            ["/", "/build/thesysrootname"],  # sysroot
            [True, False],  # with_deps
            [True, False],  # rebuild_deps
            [True, False],  # use_binary
            [0, 1, 2, 3],  # jobs
            [True, False],  # debug_output
        ]
        inputs = itertools.product(*input_values)
        for (
            sysroot,
            with_deps,
            rebuild_deps,
            use_binary,
            jobs,
            debug_output,
        ) in inputs:
            chroot_util.Emerge(
                packages,
                sysroot=sysroot,
                with_deps=with_deps,
                rebuild_deps=rebuild_deps,
                use_binary=use_binary,
                jobs=jobs,
                debug_output=debug_output,
            )
            cmd = self.rc.call_args_list[-1][0][-1]
            self.assertEqual(
                sysroot != "/", any(str(p).startswith("--sysroot") for p in cmd)
            )
            self.assertEqual(with_deps, "--deep" in cmd)
            self.assertEqual(not with_deps, "--nodeps" in cmd)
            self.assertEqual(rebuild_deps, "--rebuild-if-unbuilt" in cmd)
            self.assertEqual(use_binary, "-g" in cmd)
            self.assertEqual(use_binary, "--with-bdeps=y" in cmd)
            self.assertEqual(
                use_binary and sysroot == "/",
                "--useoldpkg-atoms=%s" % toolchain_package_list in cmd,
            )
            self.assertEqual(bool(jobs), "--jobs=%d" % jobs in cmd)
            self.assertEqual(debug_output, "--show-output" in cmd)

    def testRunUnittests(self) -> None:
        """Tests running unit tests invoking emerge with provided flags"""

        self.PatchObject(os_util, "is_root_user", return_value=True)
        chroot_util.RunUnittests(
            sysroot="/sysroot/",
            packages=["package1", "package2"],
            extra_env={
                "USE": "chrome_internal coverage",
                "FEATURES": "noclean",
            },
            keep_going=True,
        )
        self.rc.assertCommandCalled(
            [
                constants.CHROMITE_BIN_DIR / "parallel_emerge",
                "--sysroot=/sysroot/",
                "--keep-going=y",
                "package1",
                "package2",
            ],
            extra_env={
                "USE": "chrome_internal coverage",
                "FEATURES": "noclean test",
                "PKGDIR": "/sysroot/tmp/test-packages",
            },
        )
