1"""
2    :synopsis: Unit Tests for 'module.yumkernelpkg'
3    :platform: Linux
4    :maturity: develop
5    .. versionadded:: 2018.3.0
6"""
7# pylint: disable=invalid-name,no-member
8
9
10try:
11    # Import Salt Testing Libs
12    from tests.support.mixins import LoaderModuleMockMixin
13    from tests.support.unit import TestCase, skipIf
14    from tests.support.mock import MagicMock, patch
15
16    # Import Salt Libs
17    from tests.support.kernelpkg import KernelPkgTestCase
18    import salt.modules.kernelpkg_linux_yum as kernelpkg
19    import salt.modules.yumpkg as pkg
20    from salt.exceptions import CommandExecutionError
21
22    HAS_MODULES = True
23except ImportError:
24    HAS_MODULES = False
25
26
27@skipIf(not HAS_MODULES, "Salt modules could not be loaded")
28class YumKernelPkgTestCase(KernelPkgTestCase, TestCase, LoaderModuleMockMixin):
29    """
30    Test cases for salt.modules.kernelpkg_linux_yum
31    """
32
33    _kernelpkg = kernelpkg
34    KERNEL_LIST = ["3.10.0-327.el7", "3.11.0-327.el7", "4.9.1-100.el7"]
35    LATEST = KERNEL_LIST[-1]
36    OS_ARCH = "x86_64"
37    OS_NAME = "RedHat"
38    OS_MAJORRELEASE = "7"
39
40    def setup_loader_modules(self):
41        return {
42            kernelpkg: {
43                "__grains__": {
44                    "os": self.OS_NAME,
45                    "osmajorrelease": self.OS_MAJORRELEASE,
46                    "kernelrelease": "{}.{}".format(self.KERNEL_LIST[0], self.OS_ARCH),
47                },
48                "__salt__": {
49                    "pkg.normalize_name": pkg.normalize_name,
50                    "pkg.upgrade": MagicMock(return_value={}),
51                    "pkg.list_pkgs": MagicMock(return_value={}),
52                    "pkg.version": MagicMock(return_value=self.KERNEL_LIST),
53                    "system.reboot": MagicMock(return_value=None),
54                    "config.get": MagicMock(return_value=True),
55                },
56            },
57            pkg: {"__grains__": {"osarch": self.OS_ARCH}},
58        }
59
60    def test_list_installed(self):
61        """
62        Test - Return the latest installed kernel version
63        """
64        mock = MagicMock(return_value=self.KERNEL_LIST)
65        with patch.dict(self._kernelpkg.__salt__, {"pkg.version": mock}):
66            self.assertListEqual(self._kernelpkg.list_installed(), self.KERNEL_LIST)
67
68    def test_list_installed_none(self):
69        """
70        Test - Return the latest installed kernel version
71        """
72        mock = MagicMock(return_value=None)
73        with patch.dict(self._kernelpkg.__salt__, {"pkg.version": mock}):
74            self.assertListEqual(self._kernelpkg.list_installed(), [])
75
76    def test_remove_success(self):
77        """
78        Test - remove kernel package
79        """
80        mock = MagicMock(return_value={"retcode": 0, "stderr": []})
81        with patch.dict(self._kernelpkg.__salt__, {"cmd.run_all": mock}):
82            with patch.object(
83                self._kernelpkg, "active", return_value=self.KERNEL_LIST[-1]
84            ):
85                with patch.object(
86                    self._kernelpkg, "list_installed", return_value=self.KERNEL_LIST
87                ):
88                    result = self._kernelpkg.remove(release=self.KERNEL_LIST[0])
89                    self.assertIn("removed", result)
90                    target = "{}-{}".format(
91                        self._kernelpkg._package_name(), self.KERNEL_LIST[0]
92                    )  # pylint: disable=protected-access
93                    self.assertListEqual(result["removed"], [target])
94
95    def test_remove_error(self):
96        """
97        Test - remove kernel package
98        """
99        mock = MagicMock(return_value={"retcode": -1, "stderr": []})
100        with patch.dict(self._kernelpkg.__salt__, {"cmd.run_all": mock}):
101            with patch.object(
102                self._kernelpkg, "active", return_value=self.KERNEL_LIST[-1]
103            ):
104                with patch.object(
105                    self._kernelpkg, "list_installed", return_value=self.KERNEL_LIST
106                ):
107                    self.assertRaises(
108                        CommandExecutionError,
109                        self._kernelpkg.remove,
110                        release=self.KERNEL_LIST[0],
111                    )
112