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

"""Unittests for cros_install_debug_syms.py"""

from collections import namedtuple
import os

from chromite.lib import cros_test_lib
from chromite.scripts import cros_install_debug_syms
from chromite.utils import outcap


pytestmark = cros_test_lib.pytestmark_inside_only


SimpleIndex = namedtuple("SimpleIndex", "header packages")


class InstallDebugSymsTest(cros_test_lib.MockTestCase):
    """Test the parsing of package index"""

    def setUp(self) -> None:
        self.local_binhosts = [
            "/build/something/packages/",
            "file:///build/somethingelse/packages",
            "file://localhost/build/another/packages",
        ]

        self.remote_binhosts = [
            "http://domain.com/binhost",
            "gs://chromeos-stuff/binhost",
        ]

    def testGetLocalPackageIndex(self) -> None:
        """Check that local binhosts are fetched correctly."""
        self.PatchObject(
            cros_install_debug_syms.binpkg,
            "GrabLocalPackageIndex",
            return_value=SimpleIndex({}, {}),
        )
        self.PatchObject(
            cros_install_debug_syms.os.path, "isdir", return_value=True
        )
        for binhost in self.local_binhosts:
            cros_install_debug_syms.GetPackageIndex(binhost)

    def testGetRemotePackageIndex(self) -> None:
        """Check that remote binhosts are fetched correctly."""
        self.PatchObject(
            cros_install_debug_syms.binpkg,
            "GrabRemotePackageIndex",
            return_value=SimpleIndex({}, {}),
        )
        for binhost in self.remote_binhosts:
            cros_install_debug_syms.GetPackageIndex(binhost)

    def testListRemoteBinhost(self) -> None:
        """Check that urls are generated correctly for remote binhosts."""
        chaps_cpv = "chromeos-base/chaps-0-r2"
        metrics_cpv = "chromeos-base/metrics-0-r4"

        index = SimpleIndex(
            {},
            [
                {"CPV": "chromeos-base/shill-0-r1"},
                {"CPV": chaps_cpv, "DEBUG_SYMBOLS": "yes"},
                {
                    "CPV": metrics_cpv,
                    "DEBUG_SYMBOLS": "yes",
                    "PATH": "path/to/binpkg.tbz2",
                },
            ],
        )
        self.PatchObject(
            cros_install_debug_syms, "GetPackageIndex", return_value=index
        )

        for binhost in self.remote_binhosts:
            expected = {
                chaps_cpv: os.path.join(binhost, chaps_cpv + ".debug.tbz2"),
                metrics_cpv: os.path.join(binhost, "path/to/binpkg.debug.tbz2"),
            }
            self.assertEqual(
                cros_install_debug_syms.ListBinhost(binhost), expected
            )

    def testListRemoteBinhostWithURI(self) -> None:
        """Check that urls are generated correctly when URI is defined."""
        index = SimpleIndex(
            {"URI": "gs://chromeos-prebuilts"},
            [
                {
                    "CPV": "chromeos-base/shill-0-r1",
                    "DEBUG_SYMBOLS": "yes",
                    "PATH": "amd64-generic/paladin1234/shill-0-r1.tbz2",
                }
            ],
        )
        self.PatchObject(
            cros_install_debug_syms, "GetPackageIndex", return_value=index
        )

        binhost = "gs://chromeos-prebuilts/gizmo-paladin/"
        debug_symbols_url = (
            "gs://chromeos-prebuilts/amd64-generic"
            "/paladin1234/shill-0-r1.debug.tbz2"
        )
        self.assertEqual(
            cros_install_debug_syms.ListBinhost(binhost),
            {"chromeos-base/shill-0-r1": debug_symbols_url},
        )


class InstallArgsTest(cros_test_lib.MockTestCase):
    """Test InstallArgs utility funcs."""

    def testListInstallArgs(self) -> None:
        """Check ListInstallArgs behavior."""
        parser = cros_install_debug_syms.GetParser()
        opts = parser.parse_args(["--board", "betty", "sys-fs/fuse"])
        self.PatchObject(
            cros_install_debug_syms,
            "GetInstallArgs",
            return_value=[
                ("a/b-1", "gs://bucket/b-1.tbz2"),
                ("c/d-1", "gs://bucket/d-1.tbz2"),
            ],
        )
        with outcap.OutputCapturer() as cap:
            cros_install_debug_syms.ListInstallArgs(opts, "/foo")
        self.assertEqual(
            "a/b-1 gs://bucket/b-1.tbz2\nc/d-1 gs://bucket/d-1.tbz2\n",
            cap.GetStdout(),
        )

    def testGetInstallArgsList(self) -> None:
        """Check GetInstallArgsList behavior."""
        stdout = (
            "sys-apps/which-2.21 gs://bucket/board/which-2.21.debug.tbz2\n"
            "dev-libs/foo-1-r1 gs://bucket/board/foo-1-r1.debug.tbz2\n"
        )
        rc = self.StartPatcher(cros_test_lib.RunCommandMock())
        rc.AddCmdResult(cmd=["foo", "--list"], stdout=stdout)
        self.assertEqual(
            [
                [
                    "sys-apps/which-2.21",
                    "gs://bucket/board/which-2.21.debug.tbz2",
                ],
                ["dev-libs/foo-1-r1", "gs://bucket/board/foo-1-r1.debug.tbz2"],
            ],
            cros_install_debug_syms.GetInstallArgsList(["foo"]),
        )
