Blame tests/test_comps.py

Packit Service 21c75c
# -*- coding: utf-8 -*-
Packit Service 21c75c
Packit Service 21c75c
# Copyright (C) 2013-2018 Red Hat, Inc.
Packit Service 21c75c
#
Packit Service 21c75c
# This copyrighted material is made available to anyone wishing to use,
Packit Service 21c75c
# modify, copy, or redistribute it subject to the terms and conditions of
Packit Service 21c75c
# the GNU General Public License v.2, or (at your option) any later version.
Packit Service 21c75c
# This program is distributed in the hope that it will be useful, but WITHOUT
Packit Service 21c75c
# ANY WARRANTY expressed or implied, including the implied warranties of
Packit Service 21c75c
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit Service 21c75c
# Public License for more details.  You should have received a copy of the
Packit Service 21c75c
# GNU General Public License along with this program; if not, write to the
Packit Service 21c75c
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service 21c75c
# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the
Packit Service 21c75c
# source code or documentation are not subject to the GNU General Public
Packit Service 21c75c
# License and may only be used or replicated with the express permission of
Packit Service 21c75c
# Red Hat, Inc.
Packit Service 21c75c
#
Packit Service 21c75c
Packit Service 21c75c
from __future__ import absolute_import
Packit Service 21c75c
from __future__ import print_function
Packit Service 21c75c
from __future__ import unicode_literals
Packit Service 21c75c
Packit Service 21c75c
import operator
Packit Service 21c75c
Packit Service 21c75c
import libcomps
Packit Service 21c75c
import libdnf.transaction
Packit Service 21c75c
Packit Service 21c75c
import dnf.comps
Packit Service 21c75c
import dnf.exceptions
Packit Service 21c75c
import dnf.persistor
Packit Service 21c75c
import dnf.util
Packit Service 21c75c
Packit Service 21c75c
import tests.support
Packit Service 21c75c
from tests.support import mock
Packit Service 21c75c
Packit Service 21c75c
Packit Service 21c75c
TRANSLATION = u"""Tato skupina zahrnuje nejmenší možnou množinu balíčků. Je vhodná například na instalace malých routerů nebo firewallů."""
Packit Service 21c75c
Packit Service 21c75c
Packit Service 21c75c
class LangsTest(tests.support.TestCase):
Packit Service 21c75c
    @mock.patch('locale.getlocale', return_value=('cs_CZ', 'UTF-8'))
Packit Service 21c75c
    def test_get(self, _unused):
Packit Service 21c75c
        langs = dnf.comps._Langs().get()
Packit Service 21c75c
        self.assertEqual(langs, ['cs_CZ.UTF-8', 'cs_CZ', 'cs.UTF-8', 'cs', 'C'])
Packit Service 21c75c
Packit Service 21c75c
Packit Service 21c75c
class CompsTest(tests.support.TestCase):
Packit Service 21c75c
    def setUp(self):
Packit Service 21c75c
        comps = dnf.comps.Comps()
Packit Service 21c75c
        comps._add_from_xml_filename(tests.support.COMPS_PATH)
Packit Service 21c75c
        self.comps = comps
Packit Service 21c75c
Packit Service 21c75c
    def test_by_pattern(self):
Packit Service 21c75c
        comps = self.comps
Packit Service 21c75c
        self.assertLength(comps.groups_by_pattern('Base'), 1)
Packit Service 21c75c
        self.assertLength(comps.groups_by_pattern('*'), tests.support.TOTAL_GROUPS)
Packit Service 21c75c
        self.assertLength(comps.groups_by_pattern('Solid*'), 1)
Packit Service 21c75c
Packit Service 21c75c
        group = dnf.util.first(comps.groups_by_pattern('Base'))
Packit Service 21c75c
        self.assertIsInstance(group, dnf.comps.Group)
Packit Service 21c75c
Packit Service 21c75c
    def test_categories(self):
Packit Service 21c75c
        cat = self.comps.categories[0]
Packit Service 21c75c
        self.assertEqual(cat.name_by_lang['cs'], u'Základ systému')
Packit Service 21c75c
        self.assertEqual(cat.desc_by_lang['de'],
Packit Service 21c75c
                         u'Verschiedene Kernstücke des Systems.')
Packit Service 21c75c
        self.assertCountEqual((id_.name for id_ in cat.group_ids),
Packit Service 21c75c
                              ('base', ))
Packit Service 21c75c
        self.assertCountEqual((id_.default for id_ in cat.group_ids),
Packit Service 21c75c
                              (False, ))
Packit Service 21c75c
        self.assertTrue(all(isinstance(grp, dnf.comps.Group)
Packit Service 21c75c
                            for grp in cat.groups_iter()))
Packit Service 21c75c
Packit Service 21c75c
    def test_environments(self):
Packit Service 21c75c
        env = self.comps.environments[0]
Packit Service 21c75c
        self.assertEqual(env.name_by_lang['cs'], u'Prostředí Sugar')
Packit Service 21c75c
        self.assertEqual(env.desc_by_lang['de'],
Packit Service 21c75c
Packit Service 21c75c
                         u'Eine Software-Spielwiese zum Lernen des Lernens.')
Packit Service 21c75c
        self.assertCountEqual((id_.name for id_ in env.group_ids),
Packit Service 21c75c
                              ('somerset', 'Peppers'))
Packit Service 21c75c
        self.assertEqual(2, len(env.mandatory_groups))
Packit Service 21c75c
        self.assertTrue(all(isinstance(grp, dnf.comps.Group)
Packit Service 21c75c
                            for grp in env.mandatory_groups))
Packit Service 21c75c
        self.assertCountEqual((id_.default for id_ in env.group_ids),
Packit Service 21c75c
                              (True, False))
Packit Service 21c75c
        self.assertCountEqual((id_.name for id_ in env.option_ids),
Packit Service 21c75c
                              ('base',))
Packit Service 21c75c
        self.assertEqual(1, len(env.optional_groups))
Packit Service 21c75c
        self.assertTrue(all(isinstance(grp, dnf.comps.Group)
Packit Service 21c75c
                            for grp in env.optional_groups))
Packit Service 21c75c
        self.assertTrue(all(isinstance(grp, dnf.comps.Group)
Packit Service 21c75c
                            for grp in env.groups_iter()))
Packit Service 21c75c
Packit Service 21c75c
    def test_groups(self):
Packit Service 21c75c
        g = self.comps.group_by_pattern('base')
Packit Service 21c75c
        self.assertTrue(g.visible)
Packit Service 21c75c
        g = self.comps.group_by_pattern('somerset')
Packit Service 21c75c
        self.assertFalse(g.visible)
Packit Service 21c75c
Packit Service 21c75c
    def test_group_packages(self):
Packit Service 21c75c
        g = self.comps.group_by_pattern('base')
Packit Service 21c75c
        self.assertCountEqual(map(operator.attrgetter('name'), g.packages_iter()),
Packit Service 21c75c
                              ('tour', 'pepper'))
Packit Service 21c75c
Packit Service 21c75c
    def test_iteration(self):
Packit Service 21c75c
        comps = self.comps
Packit Service 21c75c
        self.assertEqual([g.name for g in comps.groups_iter()],
Packit Service 21c75c
                         ['Base', 'Solid Ground', "Pepper's", "Broken Group", None])
Packit Service 21c75c
        self.assertEqual([c.name for c in comps.categories_iter()],
Packit Service 21c75c
                         ['Base System'])
Packit Service 21c75c
        g = dnf.util.first(comps.groups_iter())
Packit Service 21c75c
        self.assertEqual(g.desc_by_lang['cs'], TRANSLATION)
Packit Service 21c75c
Packit Service 21c75c
    def test_group_display_order(self):
Packit Service 21c75c
        self.assertEqual([g.name for g in self.comps.groups],
Packit Service 21c75c
                         ["Pepper's", 'Base', 'Solid Ground', 'Broken Group', None])
Packit Service 21c75c
Packit Service 21c75c
    def test_packages(self):
Packit Service 21c75c
        comps = self.comps
Packit Service 21c75c
        group = dnf.util.first(comps.groups_iter())
Packit Service 21c75c
        self.assertSequenceEqual([pkg.name for pkg in group.packages],
Packit Service 21c75c
                                 (u'pepper', u'tour'))
Packit Service 21c75c
        self.assertSequenceEqual([pkg.name for pkg in group.mandatory_packages],
Packit Service 21c75c
                                 (u'pepper', u'tour'))
Packit Service 21c75c
Packit Service 21c75c
    def test_size(self):
Packit Service 21c75c
        comps = self.comps
Packit Service 21c75c
        self.assertLength(comps, 7)
Packit Service 21c75c
        self.assertLength(comps.groups, tests.support.TOTAL_GROUPS)
Packit Service 21c75c
        self.assertLength(comps.categories, 1)
Packit Service 21c75c
        self.assertLength(comps.environments, 1)
Packit Service 21c75c
Packit Service 21c75c
    @mock.patch('locale.getlocale', return_value=('cs_CZ', 'UTF-8'))
Packit Service 21c75c
    def test_ui_name(self, _unused):
Packit Service 21c75c
        comps = self.comps
Packit Service 21c75c
        group = dnf.util.first(comps.groups_by_pattern('base'))
Packit Service 21c75c
        self.assertEqual(group.ui_name, u'Kritická cesta (Základ)')
Packit Service 21c75c
Packit Service 21c75c
    @mock.patch('locale.getlocale', return_value=('cs_CZ', 'UTF-8'))
Packit Service 21c75c
    def test_ui_desc(self, _unused):
Packit Service 21c75c
        comps = self.comps
Packit Service 21c75c
        env = dnf.util.first(comps.environments_by_pattern('sugar-*'))
Packit Service 21c75c
        self.assertEqual(env.ui_description, u'Software pro výuku o vyučování.')
Packit Service 21c75c
Packit Service 21c75c
Packit Service 21c75c
class PackageTest(tests.support.TestCase):
Packit Service 21c75c
    def test_instance(self):
Packit Service 21c75c
        lc_pkg = libcomps.Package('weather', libcomps.PACKAGE_TYPE_OPTIONAL)
Packit Service 21c75c
        pkg = dnf.comps.Package(lc_pkg)
Packit Service 21c75c
        self.assertEqual(pkg.name, 'weather')
Packit Service 21c75c
        self.assertEqual(pkg.option_type, dnf.comps.OPTIONAL)
Packit Service 21c75c
Packit Service 21c75c
Packit Service 21c75c
class TestTransactionBunch(tests.support.TestCase):
Packit Service 21c75c
Packit Service 21c75c
    def test_adding(self):
Packit Service 21c75c
        t1 = dnf.comps.TransactionBunch()
Packit Service 21c75c
        t1.install = {'right'}
Packit Service 21c75c
        t1.upgrade = {'tour'}
Packit Service 21c75c
        t1.remove = {'pepper'}
Packit Service 21c75c
        t2 = dnf.comps.TransactionBunch()
Packit Service 21c75c
        t2.install = {'pepper'}
Packit Service 21c75c
        t2.upgrade = {'right'}
Packit Service 21c75c
        t1 += t2
Packit Service 21c75c
        self.assertTransEqual(t1.install, ('right', 'pepper'))
Packit Service 21c75c
        self.assertTransEqual(t1.upgrade, ('tour', 'right'))
Packit Service 21c75c
        self.assertEmpty(t1.remove)
Packit Service 21c75c
Packit Service 21c75c
Packit Service 21c75c
class SolverGroupTest(tests.support.DnfBaseTestCase):
Packit Service 21c75c
Packit Service 21c75c
    REPOS = []
Packit Service 21c75c
    COMPS = True
Packit Service 21c75c
    COMPS_SOLVER = True
Packit Service 21c75c
Packit Service 21c75c
    def test_install(self):
Packit Service 21c75c
        group_id = 'base'
Packit Service 21c75c
        trans = self.solver._group_install(group_id, dnf.comps.MANDATORY)
Packit Service 21c75c
        self.assertLength(trans.install, 2)
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        swdb_group = self.history.group.get(group_id)
Packit Service 21c75c
        self.assertCountEqual([i.getName() for i in swdb_group.getPackages()], ['pepper', 'tour'])
Packit Service 21c75c
        self.assertEqual(swdb_group.getPackageTypes(), dnf.comps.MANDATORY)
Packit Service 21c75c
Packit Service 21c75c
    def test_removable_pkg(self):
Packit Service 21c75c
        comps_group = self.comps.group_by_pattern('base')
Packit Service 21c75c
        self.solver._group_install(comps_group.id, dnf.comps.MANDATORY, [])
Packit Service 21c75c
Packit Service 21c75c
        tsis = []
Packit Service 21c75c
Packit Service 21c75c
        pkg1 = self.base.sack.query().filter(name="pepper", epoch=0, version="20", release="0", arch="x86_64")[0]
Packit Service 21c75c
        self.history.rpm.add_install(pkg1, reason=libdnf.transaction.TransactionItemReason_GROUP)
Packit Service 21c75c
Packit Service 21c75c
        pkg3 = self.base.sack.query().filter(name="tour", version="5", release="0", arch="noarch")[0]
Packit Service 21c75c
        self.history.rpm.add_install(pkg3, reason=libdnf.transaction.TransactionItemReason_GROUP)
Packit Service 21c75c
Packit Service 21c75c
        group_id = "dupl"
Packit Service 21c75c
        swdb_group = self.history.group.new(group_id, group_id, group_id, dnf.comps.DEFAULT)
Packit Service 21c75c
        swdb_group.addPackage("tour", True, dnf.comps.MANDATORY)
Packit Service 21c75c
        self.history.group.install(swdb_group)
Packit Service 21c75c
        self._swdb_commit(tsis)
Packit Service 21c75c
Packit Service 21c75c
        # pepper is in single group with reason "group"
Packit Service 21c75c
        self.assertTrue(self.solver._removable_pkg('pepper'))
Packit Service 21c75c
        # right's reason is "dep"
Packit Service 21c75c
        self.assertFalse(self.solver._removable_pkg('right'))
Packit Service 21c75c
        # tour appears in more than one group
Packit Service 21c75c
        self.assertFalse(self.solver._removable_pkg('tour'))
Packit Service 21c75c
Packit Service 21c75c
        swdb_group = self.history.group.get(group_id)
Packit Service 21c75c
        self.history.group.remove(swdb_group)
Packit Service 21c75c
Packit Service 21c75c
        # tour appears only in one group now
Packit Service 21c75c
        self.assertTrue(self.solver._removable_pkg('tour'))
Packit Service 21c75c
Packit Service 21c75c
    def test_remove(self):
Packit Service 21c75c
        grp = self.comps.group_by_pattern('base')
Packit Service 21c75c
        self.solver._group_install(grp.id, dnf.comps.MANDATORY, [])
Packit Service 21c75c
Packit Service 21c75c
        grps = self.history.group.search_by_pattern('base')
Packit Service 21c75c
        for grp in grps:
Packit Service 21c75c
            self.solver._group_remove(grp)
Packit Service 21c75c
Packit Service 21c75c
        # need to load groups again - loaded object is stays the same
Packit Service 21c75c
        grps = self.history.group.search_by_pattern('base')
Packit Service 21c75c
        for grp in grps:
Packit Service 21c75c
            self.assertFalse(grp.installed)
Packit Service 21c75c
Packit Service 21c75c
    def test_upgrade(self):
Packit Service 21c75c
        # setup of the "current state"
Packit Service 21c75c
        group_id = 'base'
Packit Service 21c75c
Packit Service 21c75c
        swdb_group = self.history.group.new(group_id, group_id, group_id, dnf.comps.MANDATORY)
Packit Service 21c75c
        for pkg_name in ['pepper', 'handerson']:
Packit Service 21c75c
            swdb_group.addPackage(pkg_name, True, dnf.comps.MANDATORY)
Packit Service 21c75c
        self.history.group.install(swdb_group)
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        swdb_group = self.history.group.get(group_id)
Packit Service 21c75c
        self.assertCountEqual([i.getName() for i in swdb_group.getPackages()], ('handerson', 'pepper'))
Packit Service 21c75c
Packit Service 21c75c
        comps_group = self.comps.group_by_pattern(group_id)
Packit Service 21c75c
Packit Service 21c75c
        trans = self.solver._group_upgrade(group_id)
Packit Service 21c75c
        self.assertTransEqual(trans.install, ('tour',))
Packit Service 21c75c
        self.assertTransEqual(trans.remove, ('handerson',))
Packit Service 21c75c
        self.assertTransEqual(trans.upgrade, ('pepper',))
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        swdb_group = self.history.group.get(group_id)
Packit Service 21c75c
        self.assertCountEqual([i.getName() for i in swdb_group.getPackages()], ('tour', 'pepper'))
Packit Service 21c75c
Packit Service 21c75c
class SolverEnvironmentTest(tests.support.DnfBaseTestCase):
Packit Service 21c75c
Packit Service 21c75c
    REPOS = []
Packit Service 21c75c
    COMPS = True
Packit Service 21c75c
    COMPS_SOLVER = True
Packit Service 21c75c
Packit Service 21c75c
    def test_install(self):
Packit Service 21c75c
        env_id = 'sugar-desktop-environment'
Packit Service 21c75c
        env = self.comps._environment_by_id(env_id)
Packit Service 21c75c
        trans = self.solver._environment_install(env_id, dnf.comps.MANDATORY, [])
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        self.assertCountEqual([pkg.name for pkg in trans.install], ('pepper', 'trampoline', 'hole', 'lotus'))
Packit Service 21c75c
Packit Service 21c75c
        sugar = self.history.env.get(env_id)
Packit Service 21c75c
        self.assertCountEqual([i.getGroupId() for i in sugar.getGroups()], ('Peppers', 'somerset', 'base'))
Packit Service 21c75c
Packit Service 21c75c
        somerset = self.history.group.get('somerset')
Packit Service 21c75c
        self.assertIsNotNone(somerset)
Packit Service 21c75c
        self.assertEqual(somerset.getPackageTypes(), dnf.comps.MANDATORY)
Packit Service 21c75c
Packit Service 21c75c
        base = self.history.group.get('base')
Packit Service 21c75c
        self.assertEqual(base, None)
Packit Service 21c75c
Packit Service 21c75c
    def test_remove(self):
Packit Service 21c75c
        env_id = 'sugar-desktop-environment'
Packit Service 21c75c
        comps_env = self.comps.environment_by_pattern(env_id)
Packit Service 21c75c
Packit Service 21c75c
        self.solver._environment_install(comps_env.id, dnf.comps.MANDATORY, [])
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        swdb_env = self.history.env.get(comps_env.id)
Packit Service 21c75c
        self.assertEqual(swdb_env.getPackageTypes(), dnf.comps.MANDATORY)
Packit Service 21c75c
        group_ids = [i.getGroupId() for i in swdb_env.getGroups()]
Packit Service 21c75c
Packit Service 21c75c
        self.solver._environment_remove(comps_env.id)
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        swdb_env = self.history.env.get(comps_env.id)
Packit Service 21c75c
        # if swdb_env is None, then it's removed
Packit Service 21c75c
        self.assertIsNone(swdb_env)
Packit Service 21c75c
        # test if also all groups were removed
Packit Service 21c75c
        for group_id in group_ids:
Packit Service 21c75c
            swdb_group = self.history.group.get(group_id)
Packit Service 21c75c
            self.assertIsNone(swdb_group)
Packit Service 21c75c
Packit Service 21c75c
        # install it again with different pkg_types
Packit Service 21c75c
        self.solver._environment_install(comps_env.id, dnf.comps.OPTIONAL, [])
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        swdb_env = self.history.env.get(comps_env.id)
Packit Service 21c75c
        self.assertIsNotNone(swdb_env)
Packit Service 21c75c
        self.assertEqual(swdb_env.getPackageTypes(), dnf.comps.OPTIONAL)
Packit Service 21c75c
Packit Service 21c75c
        group_ids = [i.getGroupId() for i in swdb_env.getGroups()]
Packit Service 21c75c
        self.assertTrue(len(group_ids))
Packit Service 21c75c
        for group_id in group_ids:
Packit Service 21c75c
            swdb_group = self.history.group.get(group_id)
Packit Service 21c75c
            if group_id == "base" and swdb_group is None:
Packit Service 21c75c
                continue
Packit Service 21c75c
            self.assertEqual(swdb_group.getPackageTypes(), dnf.comps.OPTIONAL)
Packit Service 21c75c
Packit Service 21c75c
    def test_upgrade(self):
Packit Service 21c75c
        """Upgrade environment, the one group it knows is no longer installed."""
Packit Service 21c75c
        env_id = "sugar-desktop-environment"
Packit Service 21c75c
        comps_env = self.comps.environment_by_pattern(env_id)
Packit Service 21c75c
Packit Service 21c75c
        self.solver._environment_install(comps_env.id, dnf.comps.ALL_TYPES, [])
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        swdb_env = self.history.env.get(comps_env.id)
Packit Service 21c75c
        self.assertNotEqual(swdb_env, None)
Packit Service 21c75c
Packit Service 21c75c
        # create a new transaction item for group Peppers with no packages
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
        swdb_group = self.history.group.get('Peppers')
Packit Service 21c75c
        swdb_group = self.history.group.new(swdb_group.getGroupId(), swdb_group.getName(), swdb_group.getTranslatedName(), swdb_group.getPackageTypes())
Packit Service 21c75c
        self.history.group.install(swdb_group)
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
Packit Service 21c75c
        trans = self.solver._environment_upgrade(comps_env.id)
Packit Service 21c75c
        self._swdb_commit()
Packit Service 21c75c
        self.assertTransEqual(trans.install, ('hole', 'lotus'))
Packit Service 21c75c
        self.assertTransEqual(trans.upgrade, ('pepper', 'trampoline', 'lotus'))
Packit Service 21c75c
        self.assertEmpty(trans.remove)