anaconda/anaconda-40.22.3.13/tests/unit_tests/pyanaconda_tests/ui/test_software.py
2024-11-14 21:39:56 -08:00

341 lines
13 KiB
Python

#
# Copyright (C) 2021 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# the GNU General Public License v.2, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY expressed or implied, including the implied warranties of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details. You should have received a copy of the
# GNU General Public License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
# source code or documentation are not subject to the GNU General Public
# License and may only be used or replicated with the express permission of
# Red Hat, Inc.
#
import unittest
from unittest.mock import patch
from unittest.mock import Mock
from dasbus.structure import compare_data
from pyanaconda.modules.common.structures.comps import CompsEnvironmentData, CompsGroupData
from pyanaconda.modules.common.structures.packages import PackagesSelectionData
from pyanaconda.modules.payloads.payload.dnf.dnf import DNFModule
from pyanaconda.modules.payloads.payload.dnf.dnf_manager import DNFManager
from pyanaconda.ui.lib.software import is_software_selection_complete, \
get_software_selection_status, SoftwareSelectionCache, get_kernel_from_properties, \
get_available_kernel_features, KernelFeatures
def get_dnf_proxy(dnf_manager):
"""Create a DNF payload proxy using the specified DNF manager."""
dnf_module = DNFModule()
dnf_module._dnf_manager = dnf_manager
return dnf_module.for_publication()
class SoftwareSelectionUITestCase(unittest.TestCase):
"""Test the helper functions of the Software Selection spoke."""
def setUp(self):
self.dnf_manager = Mock(spec=DNFManager)
self.dnf_proxy = get_dnf_proxy(self.dnf_manager)
def test_is_software_selection_complete(self):
"""Test the is_software_selection_complete function."""
selection = PackagesSelectionData()
selection.environment = "e1"
self.dnf_manager.resolve_environment.return_value = "e1"
assert is_software_selection_complete(self.dnf_proxy, selection)
assert is_software_selection_complete(self.dnf_proxy, selection, kickstarted=True)
self.dnf_manager.resolve_environment.return_value = None
assert not is_software_selection_complete(self.dnf_proxy, selection)
assert not is_software_selection_complete(self.dnf_proxy, selection, kickstarted=True)
selection.environment = ""
assert not is_software_selection_complete(self.dnf_proxy, selection)
assert is_software_selection_complete(self.dnf_proxy, selection, kickstarted=True)
def test_get_software_selection_status(self):
"""Test the get_software_selection_status function."""
selection = PackagesSelectionData()
selection.environment = "e1"
environment_data = CompsEnvironmentData()
environment_data.name = "The e1 environment"
self.dnf_manager.resolve_environment.return_value = "e1"
self.dnf_manager.get_environment_data.return_value = environment_data
status = get_software_selection_status(self.dnf_proxy, selection)
assert status == "The e1 environment"
status = get_software_selection_status(self.dnf_proxy, selection, kickstarted=True)
assert status == "The e1 environment"
self.dnf_manager.resolve_environment.return_value = None
status = get_software_selection_status(self.dnf_proxy, selection)
assert status == "Selected environment is not valid"
status = get_software_selection_status(self.dnf_proxy, selection, kickstarted=True)
assert status == "Invalid environment specified in kickstart"
selection.environment = ""
status = get_software_selection_status(self.dnf_proxy, selection)
assert status == "Please confirm software selection"
status = get_software_selection_status(self.dnf_proxy, selection, kickstarted=True)
assert status == "Custom software selected"
def test_get_kernel_from_properties(self):
"""Test if kernel features are translated to corrent package names."""
assert get_kernel_from_properties(
KernelFeatures(page_size_64k=False)) is None
assert get_kernel_from_properties(
KernelFeatures(page_size_64k=True)) == "kernel-64k"
@patch("pyanaconda.ui.lib.software.is_aarch64")
def test_get_available_kernel_features(self, is_aarch64):
"""test availability of kernel packages"""
self.dnf_manager.match_available_packages.return_value = \
["kernel-64k-5.14.0-408.el9.aarch64.rpm"]
is_aarch64.return_value = False
res = get_available_kernel_features(self.dnf_proxy)
assert isinstance(res, dict)
assert len(res) > 0
assert not res["64k"]
is_aarch64.assert_called_once()
is_aarch64.return_value = True
assert is_aarch64()
res = get_available_kernel_features(self.dnf_proxy)
assert res["64k"]
self.dnf_manager.match_available_packages.return_value = []
res = get_available_kernel_features(self.dnf_proxy)
assert not res["64k"]
class SoftwareSelectionCacheTestCase(unittest.TestCase):
"""Test the cache for the Software Selection spoke."""
def setUp(self):
"""Set up the test."""
self.environment_data = CompsEnvironmentData()
self.environment_data.id = "e1"
self.environment_data.optional_groups = ["g1", "g2", "g3", "g4", "g5"]
self.dnf_manager = Mock(spec=DNFManager)
self.dnf_manager.resolve_environment.return_value = True
self.dnf_manager.get_environment_data.return_value = self.environment_data
self.dnf_manager.get_group_data.side_effect = self._get_group_data
self.dnf_manager.resolve_group.return_value = True
self.cache = SoftwareSelectionCache(get_dnf_proxy(self.dnf_manager))
def _get_group_data(self, group):
"""Mock the get_group_data method of the DNF manager."""
data = CompsGroupData()
data.id = group
return data
def test_available_environments(self):
"""Test the available_environments property."""
self.dnf_manager.environments = []
assert self.cache.available_environments == []
self.dnf_manager.environments = ["e1", "e2"]
assert self.cache.available_environments == ["e1", "e2"]
def test_is_environment_selected(self):
"""Test the is_environment_selected method."""
assert self.cache.is_environment_selected("e1") is False
self.cache.select_environment("e1")
assert self.cache.is_environment_selected("e1") is True
self.cache.select_environment("")
assert self.cache.is_environment_selected("e1") is False
def test_environment(self):
"""Test the environment property."""
assert self.cache.environment == ""
self.cache.select_environment("e1")
assert self.cache.environment == "e1"
def test_available_groups(self):
"""Test the available_groups property."""
self.cache.select_environment("e1")
assert self.cache.available_groups == ["g1", "g2", "g3", "g4", "g5"]
self.cache.select_environment("")
assert self.cache.available_groups == []
def test_groups(self):
"""Test the groups property."""
self.environment_data.default_groups = ["g2", "g4"]
self.cache.select_environment("e1")
assert self.cache.groups == ["g2", "g4"]
self.cache.select_group("g1")
assert self.cache.groups == ["g1", "g2", "g4"]
self.cache.deselect_group("g4")
assert self.cache.groups == ["g1", "g2"]
def test_is_group_selected(self):
"""Test the is_group_selected method."""
self.environment_data.default_groups = ["g2", "g4"]
self.cache.select_environment("e1")
assert self.cache.is_group_selected("g1") is False
assert self.cache.is_group_selected("g4") is True
assert self.cache.is_group_selected("g7") is False
self.cache.select_group("g1")
assert self.cache.is_group_selected("g1") is True
assert self.cache.is_group_selected("g4") is True
assert self.cache.is_group_selected("g7") is False
self.cache.deselect_group("g4")
assert self.cache.is_group_selected("g1") is True
assert self.cache.is_group_selected("g4") is False
assert self.cache.is_group_selected("g7") is False
def test_apply_selection_data(self):
"""Test the apply_selection_data method."""
selection = PackagesSelectionData()
selection.environment = "e1"
selection.groups = ["g1", "g2", "g3"]
self.cache.apply_selection_data(selection)
assert self.cache.environment == "e1"
assert self.cache.groups == ["g1", "g2", "g3"]
def test_apply_selection_data_default_environment(self):
"""Test the apply_selection_data method with a default environment."""
self.dnf_manager.default_environment = "e1"
self.dnf_manager.resolve_environment.return_value = False
selection = PackagesSelectionData()
selection.environment = "e2"
self.cache.apply_selection_data(selection)
assert self.cache.environment == "e1"
assert self.cache.groups == []
def test_apply_selection_data_invalid_environment(self):
"""Test the apply_selection_data method with an invalid environment."""
self.dnf_manager.default_environment = ""
self.dnf_manager.resolve_environment.return_value = False
selection = PackagesSelectionData()
selection.environment = "e2"
self.cache.apply_selection_data(selection)
assert self.cache.environment == ""
assert self.cache.groups == []
def test_apply_selection_data_invalid_groups(self):
"""Test the apply_selection_data method with invalid groups."""
self.dnf_manager.resolve_group.return_value = False
selection = PackagesSelectionData()
selection.environment = "e1"
selection.groups = ["g1", "g2", "g3"]
self.cache.apply_selection_data(selection)
assert self.cache.environment == "e1"
assert self.cache.groups == []
def test_get_selection_data(self):
"""Test the get_selection_data method."""
self.cache.select_environment("e1")
self.cache.select_group("g1")
self.cache.select_group("g2")
self.cache.select_group("g3")
expected = PackagesSelectionData()
expected.environment = "e1"
expected.groups = ["g1", "g2", "g3"]
data = self.cache.get_selection_data()
assert compare_data(data, expected)
def test_default_selection(self):
"""Test the default environment and group selection."""
self.environment_data.id = "e1"
self.environment_data.default_groups = ["g2", "g4"]
self.cache.select_environment("e1")
assert self.cache.groups == ["g2", "g4"]
self.cache.select_group("g2")
assert self.cache.groups == ["g2", "g4"]
self.cache.select_group("g4")
assert self.cache.groups == ["g2", "g4"]
self.environment_data.id = "e2"
self.environment_data.default_groups = ["g1", "g3", "g5"]
self.cache.select_environment("e2")
assert self.cache.groups == ["g1", "g3", "g5"]
def test_selection(self):
"""Test the environment and group selection."""
self.environment_data.id = "e1"
self.cache.select_environment("e1")
assert self.cache.groups == []
self.cache.select_group("g2")
assert self.cache.groups == ["g2"]
self.cache.select_group("g4")
assert self.cache.groups == ["g2", "g4"]
self.environment_data.id = "e2"
self.environment_data.default_groups = ["g1", "g3", "g5"]
self.cache.select_environment("e2")
assert self.cache.groups == ["g1", "g2", "g3", "g4", "g5"]
def test_deselection(self):
"""Test the environment and group deselection."""
self.environment_data.id = "e1"
self.environment_data.default_groups = ["g2", "g4"]
self.cache.select_environment("e1")
assert self.cache.groups == ["g2", "g4"]
self.cache.select_group("g1")
assert self.cache.groups == ["g1", "g2", "g4"]
self.cache.deselect_group("g4")
assert self.cache.groups == ["g1", "g2"]
self.cache.select_group("g5")
assert self.cache.groups == ["g1", "g2", "g5"]
self.cache.deselect_group("g5")
assert self.cache.groups == ["g1", "g2"]
self.environment_data.id = "e2"
self.environment_data.default_groups = ["g2", "g3", "g4", "g5"]
self.cache.select_environment("e2")
assert self.cache.groups == ["g1", "g2", "g3"]