Blame tests/test_comps.py

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