# Copyright 2016-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

from portage.tests import TestCase
from portage.tests.resolver.ResolverPlayground import (
    ResolverPlayground,
    ResolverPlaygroundTestCase,
)


class SlotOperatorReverseDepsTestCase(TestCase):
    def testSlotOperatorReverseDeps(self):
        ebuilds = {
            "media-libs/mesa-11.2.2": {
                "EAPI": "6",
                "SLOT": "0",
                "RDEPEND": ">=sys-devel/llvm-3.6.0:=",
            },
            "sys-devel/clang-3.7.1-r100": {
                "EAPI": "6",
                "SLOT": "0/3.7",
                "RDEPEND": "~sys-devel/llvm-3.7.1",
            },
            "sys-devel/clang-3.8.0-r100": {
                "EAPI": "6",
                "SLOT": "0/3.8",
                "RDEPEND": "~sys-devel/llvm-3.8.0",
            },
            "sys-devel/llvm-3.7.1-r2": {
                "EAPI": "6",
                "SLOT": "0/3.7.1",
                "PDEPEND": "=sys-devel/clang-3.7.1-r100",
            },
            "sys-devel/llvm-3.8.0-r2": {
                "EAPI": "6",
                "SLOT": "0/3.8.0",
                "PDEPEND": "=sys-devel/clang-3.8.0-r100",
            },
        }

        installed = {
            "media-libs/mesa-11.2.2": {
                "EAPI": "6",
                "SLOT": "0",
                "RDEPEND": ">=sys-devel/llvm-3.6.0:0/3.7.1=",
            },
            "sys-devel/clang-3.7.1-r100": {
                "EAPI": "6",
                "SLOT": "0/3.7",
                "RDEPEND": "~sys-devel/llvm-3.7.1",
            },
            "sys-devel/llvm-3.7.1-r2": {
                "EAPI": "6",
                "SLOT": "0/3.7.1",
                "PDEPEND": "=sys-devel/clang-3.7.1-r100",
            },
        }

        world = ["media-libs/mesa"]

        test_cases = (
            # Test bug #584626, where an llvm update is missed due to
            # the check_reverse_dependencies function seeing that
            # updating llvm will break a dependency of the installed
            # version of clang (though a clang update is available).
            ResolverPlaygroundTestCase(
                ["@world"],
                options={"--update": True, "--deep": True},
                success=True,
                mergelist=[
                    "sys-devel/llvm-3.8.0-r2",
                    "sys-devel/clang-3.8.0-r100",
                    "media-libs/mesa-11.2.2",
                ],
            ),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--ignore-built-slot-operator-deps": "y",
                },
                success=True,
                mergelist=[
                    "sys-devel/llvm-3.8.0-r2",
                    "sys-devel/clang-3.8.0-r100",
                ],
            ),
        )

        playground = ResolverPlayground(
            ebuilds=ebuilds, installed=installed, world=world, debug=False
        )
        try:
            for test_case in test_cases:
                playground.run_TestCase(test_case)
                self.assertEqual(test_case.test_success, True, test_case.fail_msg)
        finally:
            playground.cleanup()


class SlotOperatorReverseDepsLibGit2TestCase(TestCase):
    def testSlotOperatorReverseDepsLibGit2(self):
        """
        Test bug #717140, where the depgraph _slot_operator_update_probe
        method ignored <dev-libs/libgit2-1:0= dependency and tried to
        trigger an upgrade to dev-libs/libgit2-1.0.0-r1, ultimately
        resulting in an undesirable downgrade to dev-libs/libgit2-0.28.4-r1.
        """

        ebuilds = {
            "dev-libs/libgit2-0.28.4-r1": {
                "EAPI": "7",
                "SLOT": "0/28",
            },
            "dev-libs/libgit2-0.99.0-r1": {
                "EAPI": "7",
                "SLOT": "0/0.99",
            },
            "dev-libs/libgit2-1.0.0-r1": {
                "EAPI": "7",
                "SLOT": "0/1.0",
            },
            "dev-libs/libgit2-glib-0.28.0.1": {
                "EAPI": "7",
                "SLOT": "0",
                "RDEPEND": "<dev-libs/libgit2-0.29:0= >=dev-libs/libgit2-0.26.0",
            },
            "dev-libs/libgit2-glib-0.99.0.1": {
                "EAPI": "7",
                "SLOT": "0",
                "RDEPEND": "<dev-libs/libgit2-1:0= >=dev-libs/libgit2-0.26.0",
            },
            "dev-vcs/gitg-3.32.1-r1": {
                "EAPI": "7",
                "SLOT": "0",
                "RDEPEND": "dev-libs/libgit2:= >=dev-libs/libgit2-glib-0.27 <dev-libs/libgit2-glib-1",
            },
        }

        installed = {
            "dev-libs/libgit2-0.99.0-r1": {
                "EAPI": "7",
                "SLOT": "0/0.99",
            },
            "dev-libs/libgit2-glib-0.99.0.1": {
                "EAPI": "7",
                "SLOT": "0",
                "RDEPEND": "<dev-libs/libgit2-1:0/0.99= >=dev-libs/libgit2-0.26.0",
            },
            "dev-vcs/gitg-3.32.1-r1": {
                "EAPI": "7",
                "SLOT": "0",
                "RDEPEND": "dev-libs/libgit2:0/0.99= >=dev-libs/libgit2-glib-0.27 <dev-libs/libgit2-glib-1",
            },
        }

        world = ["dev-vcs/gitg"]

        test_cases = (
            ResolverPlaygroundTestCase(
                ["@world"],
                options={"--update": True, "--deep": True},
                success=True,
                # mergelist = ['dev-libs/libgit2-0.28.4-r1', 'dev-libs/libgit2-glib-0.99.0.1', 'dev-vcs/gitg-3.32.1-r1'],
                mergelist=[],
            ),
        )

        playground = ResolverPlayground(
            ebuilds=ebuilds, installed=installed, world=world, debug=False
        )
        try:
            for test_case in test_cases:
                playground.run_TestCase(test_case)
                self.assertEqual(test_case.test_success, True, test_case.fail_msg)
        finally:
            playground.debug = False
            playground.cleanup()


class SlotOperatorReverseDepsVirtualTestCase(TestCase):
    def testSlotOperatorReverseDepsVirtual(self):
        """
        Demonstrate bug #764764, where slot operator rebuilds were
        not triggered for reverse deps of virtual/dist-kernel.
        """

        ebuilds = {
            "app-emulation/virtualbox-modules-6.1.16-r1": {
                "EAPI": "7",
                "DEPEND": "virtual/dist-kernel",
                "RDEPEND": "virtual/dist-kernel:=",
            },
            "sys-kernel/gentoo-kernel-5.10.6": {
                "EAPI": "7",
                "SLOT": "5.10.6",
            },
            "sys-kernel/gentoo-kernel-5.10.5": {
                "EAPI": "7",
                "SLOT": "5.10.5",
            },
            "virtual/dist-kernel-5.10.5": {
                "EAPI": "7",
                "SLOT": "0/5.10.5",
                "RDEPEND": "~sys-kernel/gentoo-kernel-5.10.5",
            },
            "virtual/dist-kernel-5.10.6": {
                "EAPI": "7",
                "SLOT": "0/5.10.6",
                "RDEPEND": "~sys-kernel/gentoo-kernel-5.10.6",
            },
            "x11-drivers/nvidia-drivers-460.32.03": {
                "EAPI": "7",
                "DEPEND": "virtual/dist-kernel",
                "RDEPEND": "virtual/dist-kernel:=",
            },
        }

        installed = {
            "app-emulation/virtualbox-modules-6.1.16-r1": {
                "EAPI": "7",
                "DEPEND": "virtual/dist-kernel",
                "RDEPEND": "virtual/dist-kernel:0/5.10.5=",
            },
            "sys-kernel/gentoo-kernel-5.10.5": {
                "EAPI": "7",
                "SLOT": "5.10.5",
            },
            "virtual/dist-kernel-5.10.5": {
                "EAPI": "7",
                "SLOT": "0/5.10.5",
                "RDEPEND": "~sys-kernel/gentoo-kernel-5.10.5",
            },
            "x11-drivers/nvidia-drivers-460.32.03": {
                "EAPI": "7",
                "DEPEND": "virtual/dist-kernel",
                "RDEPEND": "virtual/dist-kernel:0/5.10.5=",
            },
        }

        world = ["app-emulation/virtualbox-modules", "x11-drivers/nvidia-drivers"]

        test_cases = (
            ResolverPlaygroundTestCase(
                ["@world"],
                options={"--update": True, "--deep": True},
                success=True,
                mergelist=[
                    "sys-kernel/gentoo-kernel-5.10.6",
                    "virtual/dist-kernel-5.10.6",
                    "app-emulation/virtualbox-modules-6.1.16-r1",
                    "x11-drivers/nvidia-drivers-460.32.03",
                ],
            ),
        )

        playground = ResolverPlayground(
            ebuilds=ebuilds, installed=installed, world=world, debug=False
        )
        try:
            for test_case in test_cases:
                playground.run_TestCase(test_case)
                self.assertEqual(test_case.test_success, True, test_case.fail_msg)
        finally:
            playground.debug = False
            playground.cleanup()
