Blame tests/test_groups.py

Packit 6f3914
# -*- coding: utf-8 -*-
Packit 6f3914
Packit 6f3914
# Copyright (C) 2012-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 unicode_literals
Packit 6f3914
Packit 6f3914
import operator
Packit 6f3914
Packit 6f3914
import libdnf.transaction
Packit 6f3914
Packit 6f3914
import dnf.comps
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
class EmptyPersistorTest(tests.support.ResultTestCase):
Packit 6f3914
    """Test group operations with empty persistor."""
Packit 6f3914
Packit 6f3914
    REPOS = ['main']
Packit 6f3914
    COMPS = True
Packit 6f3914
Packit 6f3914
    @mock.patch('locale.getlocale', return_value=('cs_CZ', 'UTF-8'))
Packit 6f3914
    def test_group_install_locale(self, _unused):
Packit 6f3914
        grp = self.comps.group_by_pattern('Kritick\xe1 cesta (Z\xe1klad)')
Packit 6f3914
        cnt = self.base.group_install(grp.id, ('mandatory',))
Packit 6f3914
        self.assertEqual(cnt, 2)
Packit 6f3914
Packit 6f3914
    def test_finalize_comps_trans(self):
Packit 6f3914
        trans = dnf.comps.TransactionBunch()
Packit 6f3914
        trans.install = ('trampoline',)
Packit 6f3914
        self.assertGreater(self.base._add_comps_trans(trans), 0)
Packit 6f3914
        self.base._finalize_comps_trans()
Packit 6f3914
        self.assertIn('trampoline', self.base._goal.group_members)
Packit 6f3914
        (installed, removed) = self.installed_removed(self.base)
Packit 6f3914
        self.assertCountEqual(map(str, installed), ('trampoline-2.1-1.noarch',))
Packit 6f3914
        self.assertEmpty(removed)
Packit 6f3914
Packit 6f3914
Packit 6f3914
class PresetPersistorTest(tests.support.ResultTestCase):
Packit 6f3914
    """Test group operations with some data in the persistor."""
Packit 6f3914
Packit 6f3914
    REPOS = ['main']
Packit 6f3914
    COMPS = True
Packit 6f3914
    COMPS_SEED_HISTORY = True
Packit 6f3914
Packit 6f3914
    def _install_test_env(self):
Packit 6f3914
        """Env installation itself does not handle packages. We need to handle
Packit 6f3914
           them manually for proper functionality of env remove"""
Packit 6f3914
Packit 6f3914
        env_id = 'sugar-desktop-environment'
Packit 6f3914
        comps_env = self.comps._environment_by_id(env_id)
Packit 6f3914
        self.base.environment_install(comps_env.id, ('mandatory',))
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
Packit 6f3914
        for comps_group in comps_env.mandatory_groups:
Packit 6f3914
            swdb_group = self.history.group.get(comps_group.id)
Packit 6f3914
            self.assertIsNotNone(swdb_group)
Packit 6f3914
Packit 6f3914
        tsis = []
Packit 6f3914
        seen_pkgs = set()
Packit 6f3914
        for swdb_env_group in swdb_env.getGroups():
Packit 6f3914
            swdb_group = self.history.group.get(swdb_env_group.getGroupId())
Packit 6f3914
            if not swdb_group:
Packit 6f3914
                continue
Packit 6f3914
            for swdb_pkg in swdb_group.getPackages():
Packit 6f3914
                swdb_pkg.setInstalled(True)
Packit 6f3914
                pkgs = self.base.sack.query().filter(name=swdb_pkg.getName(), arch="x86_64").run()
Packit 6f3914
                if not pkgs:
Packit 6f3914
                    continue
Packit 6f3914
                pkg = pkgs[0]
Packit 6f3914
                if pkg in seen_pkgs:
Packit 6f3914
                    # prevent RPMs from being twice in a transaction and triggering unique constraint error
Packit 6f3914
                    continue
Packit 6f3914
                seen_pkgs.add(pkg)
Packit 6f3914
                pkg._force_swdb_repoid = "main"
Packit 6f3914
                self.history.rpm.add_install(pkg, reason=libdnf.transaction.TransactionItemReason_GROUP)
Packit 6f3914
#                tsi = dnf.transaction.TransactionItem(
Packit 6f3914
#                    dnf.transaction.INSTALL,
Packit 6f3914
#                    installed=pkg,
Packit 6f3914
#                    reason=libdnf.transaction.TransactionItemReason_GROUP
Packit 6f3914
#                )
Packit 6f3914
#                tsis.append(tsi)
Packit 6f3914
Packit 6f3914
        self._swdb_commit(tsis)
Packit 6f3914
Packit 6f3914
    def _install_test_group(self):
Packit 6f3914
        """Group installation itself does not handle packages. We need to
Packit 6f3914
           handle them manually for proper functionality of group remove"""
Packit 6f3914
        group_id = 'somerset'
Packit 6f3914
        self.base.group_install(group_id, ('mandatory',))
Packit 6f3914
        swdb_group = self.history.group._installed[group_id]
Packit 6f3914
        tsis = []
Packit 6f3914
        for swdb_pkg in swdb_group.getPackages():
Packit 6f3914
            swdb_pkg.setInstalled(True)
Packit 6f3914
            pkgs = self.base.sack.query().filter(name=swdb_pkg.getName(), arch="x86_64").run()
Packit 6f3914
            if not pkgs:
Packit 6f3914
                continue
Packit 6f3914
            pkg = pkgs[0]
Packit 6f3914
            pkg._force_swdb_repoid = "main"
Packit 6f3914
            self.history.rpm.add_install(pkg, reason=libdnf.transaction.TransactionItemReason_GROUP)
Packit 6f3914
#            tsi = dnf.transaction.TransactionItem(
Packit 6f3914
#                dnf.transaction.INSTALL,
Packit 6f3914
#                installed=pkg,
Packit 6f3914
#                reason=libdnf.transaction.TransactionItemReason_GROUP
Packit 6f3914
#            )
Packit 6f3914
#            tsis.append(tsi)
Packit 6f3914
Packit 6f3914
        self._swdb_commit(tsis)
Packit 6f3914
        self.base.reset(goal=True)
Packit 6f3914
Packit 6f3914
    def test_env_group_remove(self):
Packit 6f3914
        self._install_test_env()
Packit 6f3914
        env_id = 'sugar-desktop-environment'
Packit 6f3914
        pkg_count = self.base.env_group_remove([env_id])
Packit 6f3914
        self._swdb_commit()
Packit 6f3914
        self.assertEqual(3, pkg_count)
Packit 6f3914
        with tests.support.mock.patch('logging.Logger.error'):
Packit 6f3914
            self.assertRaises(dnf.exceptions.Error,
Packit 6f3914
                              self.base.env_group_remove,
Packit 6f3914
                              ['nonexistent'])
Packit 6f3914
Packit 6f3914
    def test_environment_remove(self):
Packit 6f3914
        self._install_test_env()
Packit 6f3914
        env_id = 'sugar-desktop-environment'
Packit 6f3914
        swdb_env = self.history.env.get(env_id)
Packit 6f3914
        self.assertIsNotNone(swdb_env)
Packit 6f3914
        self.assertEqual(swdb_env.getEnvironmentId(), 'sugar-desktop-environment')
Packit 6f3914
Packit 6f3914
        removed_pkg_count = self.base.environment_remove(env_id)
Packit 6f3914
        self.assertGreater(removed_pkg_count, 0)
Packit 6f3914
        self._swdb_commit()
Packit 6f3914
Packit 6f3914
        swdb_env = self.history.env.get(env_id)
Packit 6f3914
        self.assertIsNone(swdb_env)
Packit 6f3914
Packit 6f3914
        peppers = self.history.group.get('Peppers')
Packit 6f3914
        self.assertIsNone(peppers)
Packit 6f3914
Packit 6f3914
        somerset = self.history.group.get('somerset')
Packit 6f3914
        self.assertIsNone(somerset)
Packit 6f3914
Packit 6f3914
    def test_env_upgrade(self):
Packit 6f3914
        self._install_test_env()
Packit 6f3914
        cnt = self.base.environment_upgrade("sugar-desktop-environment")
Packit 6f3914
        self.assertEqual(5, cnt)
Packit 6f3914
Packit 6f3914
        peppers = self.history.group.get('Peppers')
Packit 6f3914
        self.assertIsNotNone(peppers)
Packit 6f3914
Packit 6f3914
        somerset = self.history.group.get('somerset')
Packit 6f3914
        self.assertIsNotNone(somerset)
Packit 6f3914
Packit 6f3914
    def test_group_install(self):
Packit 6f3914
        comps_group = self.base.comps.group_by_pattern('Base')
Packit 6f3914
        pkg_count = self.base.group_install(comps_group.id, ('mandatory',))
Packit 6f3914
        self.assertEqual(pkg_count, 2)
Packit 6f3914
        self._swdb_commit()
Packit 6f3914
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertEmpty(installed)
Packit 6f3914
        self.assertEmpty(removed)
Packit 6f3914
        swdb_group = self.history.group.get(comps_group.id)
Packit 6f3914
        self.assertIsNotNone(swdb_group)
Packit 6f3914
Packit 6f3914
    def test_group_remove(self):
Packit 6f3914
        self._install_test_group()
Packit 6f3914
        group_id = 'somerset'
Packit 6f3914
Packit 6f3914
        pkgs_removed = self.base.group_remove(group_id)
Packit 6f3914
        self.assertGreater(pkgs_removed, 0)
Packit 6f3914
Packit 6f3914
        self._swdb_begin()
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertEmpty(installed)
Packit 6f3914
        self.assertCountEqual([pkg.name for pkg in removed], ('pepper',))
Packit 6f3914
        self._swdb_end()
Packit 6f3914
Packit 6f3914
Packit 6f3914
class ProblemGroupTest(tests.support.ResultTestCase):
Packit 6f3914
    """Test some cases involving problems in groups: packages that
Packit 6f3914
    don't exist, and packages that exist but cannot be installed. The
Packit 6f3914
    "broken" group lists three packages. "meaning-of-life", explicitly
Packit 6f3914
    'default', does not exist. "lotus", implicitly 'mandatory' (no
Packit 6f3914
    explicit type), exists and is installable. "brokendeps",
Packit 6f3914
    explicitly 'optional', exists but has broken dependencies. See
Packit 6f3914
    https://bugzilla.redhat.com/show_bug.cgi?id=1292892,
Packit 6f3914
    https://bugzilla.redhat.com/show_bug.cgi?id=1337731,
Packit 6f3914
    https://bugzilla.redhat.com/show_bug.cgi?id=1427365, and
Packit 6f3914
    https://bugzilla.redhat.com/show_bug.cgi?id=1461539 for some of
Packit 6f3914
    the background on this.
Packit 6f3914
    """
Packit 6f3914
Packit 6f3914
    REPOS = ['main', 'broken_group']
Packit 6f3914
    COMPS = True
Packit 6f3914
    COMPS_SEED_PERSISTOR = True
Packit 6f3914
Packit 6f3914
    def test_group_install_broken_mandatory(self):
Packit 6f3914
        """Here we will test installing the group with only mandatory
Packit 6f3914
        packages. We expect this to succeed, leaving out the
Packit 6f3914
        non-existent 'meaning-of-life': it should also log a warning,
Packit 6f3914
        but we don't test that.
Packit 6f3914
        """
Packit 6f3914
        comps_group = self.base.comps.group_by_pattern('Broken Group')
Packit 6f3914
        swdb_group = self.history.group.get(comps_group.id)
Packit 6f3914
        self.assertIsNone(swdb_group)
Packit 6f3914
Packit 6f3914
        cnt = self.base.group_install(comps_group.id, ('mandatory'))
Packit 6f3914
        self._swdb_commit()
Packit 6f3914
        self.base.resolve()
Packit 6f3914
        # this counts packages *listed* in the group, so 2
Packit 6f3914
        self.assertEqual(cnt, 2)
Packit 6f3914
Packit 6f3914
        inst, removed = self.installed_removed(self.base)
Packit 6f3914
        # the above should work, but only 'lotus' actually installed
Packit 6f3914
        self.assertLength(inst, 1)
Packit 6f3914
        self.assertEmpty(removed)
Packit 6f3914
Packit 6f3914
    def test_group_install_broken_default(self):
Packit 6f3914
        """Here we will test installing the group with only mandatory
Packit 6f3914
        and default packages. Again we expect this to succeed: the new
Packit 6f3914
        factor is an entry pulling in librita if no-such-package is
Packit 6f3914
        also included or installed. We expect this not to actually
Packit 6f3914
        pull in librita (as no-such-package obviously *isn't* there),
Packit 6f3914
        but also not to cause a fatal error.
Packit 6f3914
        """
Packit 6f3914
        comps_group = self.base.comps.group_by_pattern('Broken Group')
Packit 6f3914
        swdb_group = self.history.group.get(comps_group.id)
Packit 6f3914
        self.assertIsNone(swdb_group)
Packit 6f3914
Packit 6f3914
        cnt = self.base.group_install(comps_group.id, ('mandatory', 'default'))
Packit 6f3914
        self._swdb_commit()
Packit 6f3914
        self.base.resolve()
Packit 6f3914
        # this counts packages *listed* in the group, so 3
Packit 6f3914
        self.assertEqual(cnt, 3)
Packit 6f3914
Packit 6f3914
        inst, removed = self.installed_removed(self.base)
Packit 6f3914
        # the above should work, but only 'lotus' actually installed
Packit 6f3914
        self.assertLength(inst, 1)
Packit 6f3914
        self.assertEmpty(removed)
Packit 6f3914
Packit 6f3914
    def test_group_install_broken_optional(self):
Packit 6f3914
        """Here we test installing the group with optional packages
Packit 6f3914
        included. We expect this to fail, as a package that exists but
Packit 6f3914
        has broken dependencies is now included.
Packit 6f3914
        """
Packit 6f3914
        comps_group = self.base.comps.group_by_pattern('Broken Group')
Packit 6f3914
        swdb_group = self.history.group.get(comps_group.id)
Packit 6f3914
        self.assertIsNone(swdb_group)
Packit 6f3914
Packit 6f3914
        cnt = self.base.group_install(comps_group.id, ('mandatory', 'default', 'optional'))
Packit 6f3914
        self.assertEqual(cnt, 4)
Packit 6f3914
Packit 6f3914
        self._swdb_commit()
Packit 6f3914
        # this should fail, as optional 'brokendeps' is now pulled in
Packit 6f3914
        self.assertRaises(dnf.exceptions.DepsolveError, self.base.resolve)
Packit 6f3914
Packit 6f3914
    def test_group_install_broken_optional_nonstrict(self):
Packit 6f3914
        """Here we test installing the group with optional packages
Packit 6f3914
        included, but with strict=False. We expect this to succeed,
Packit 6f3914
        skipping the package with broken dependencies.
Packit 6f3914
        """
Packit 6f3914
        comps_group = self.base.comps.group_by_pattern('Broken Group')
Packit 6f3914
        swdb_group = self.history.group.get(comps_group.id)
Packit 6f3914
        self.assertIsNone(swdb_group)
Packit 6f3914
Packit 6f3914
        cnt = self.base.group_install(comps_group.id, ('mandatory', 'default', 'optional'),
Packit 6f3914
                                      strict=False)
Packit 6f3914
        self._swdb_commit()
Packit 6f3914
        self.base.resolve()
Packit 6f3914
        self.assertEqual(cnt, 4)
Packit 6f3914
Packit 6f3914
        inst, removed = self.installed_removed(self.base)
Packit 6f3914
        # the above should work, but only 'lotus' actually installed
Packit 6f3914
        self.assertLength(inst, 1)
Packit 6f3914
        self.assertEmpty(removed)
Packit 6f3914
Packit Service 49e6e8
    def test_group_install_missing_name(self):
Packit Service 49e6e8
        comps_group = self.base.comps.group_by_pattern('missing-name-group')
Packit Service 49e6e8
Packit Service 49e6e8
        cnt = self.base.group_install(comps_group.id, ('mandatory', 'default', 'optional'),
Packit Service 49e6e8
                                      strict=False)
Packit Service 49e6e8
        self._swdb_commit()
Packit Service 49e6e8
        self.base.resolve()
Packit Service 49e6e8
        self.assertEqual(cnt, 1)
Packit Service 49e6e8
Packit 6f3914
Packit 6f3914
class EnvironmentInstallTest(tests.support.ResultTestCase):
Packit 6f3914
    """Set up a test where sugar is considered not installed."""
Packit 6f3914
Packit 6f3914
    REPOS = ['main']
Packit 6f3914
    COMPS = True
Packit 6f3914
    COMPS_SEED_HISTORY = True
Packit 6f3914
Packit 6f3914
    def test_environment_install(self):
Packit 6f3914
        env_id = 'sugar-desktop-environment'
Packit 6f3914
        comps_env = self.comps.environment_by_pattern(env_id)
Packit 6f3914
        self.base.environment_install(comps_env.id, ('mandatory',))
Packit 6f3914
        self._swdb_commit()
Packit 6f3914
Packit 6f3914
        installed, _ = self.installed_removed(self.base)
Packit 6f3914
        self.assertCountEqual(map(operator.attrgetter('name'), installed),
Packit 6f3914
                              ('trampoline', 'lotus'))
Packit 6f3914
Packit 6f3914
        swdb_env = self.history.env.get(env_id)
Packit 6f3914
        self.assertCountEqual([i.getGroupId() for i in swdb_env.getGroups()], ('somerset', 'Peppers', 'base'))
Packit 6f3914
Packit 6f3914
        peppers = self.history.group.get('Peppers')
Packit 6f3914
        self.assertIsNotNone(peppers)
Packit 6f3914
Packit 6f3914
        somerset = self.history.group.get('somerset')
Packit 6f3914
        self.assertIsNotNone(somerset)
Packit 6f3914
Packit 6f3914
        base = self.history.group.get('base')
Packit 6f3914
        self.assertIsNone(base)