Blame tests/test_base.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 binascii
Packit 6f3914
import itertools
Packit 6f3914
import re
Packit 6f3914
Packit 6f3914
import hawkey
Packit 6f3914
import libdnf.transaction
Packit 6f3914
import rpm
Packit 6f3914
Packit 6f3914
import dnf
Packit 6f3914
import dnf.exceptions
Packit 6f3914
import dnf.package
Packit 6f3914
import dnf.subject
Packit 6f3914
import dnf.transaction
Packit 6f3914
Packit 6f3914
import tests.support
Packit 6f3914
from tests.support import mock
Packit 6f3914
Packit 6f3914
Packit 6f3914
class BaseTest(tests.support.TestCase):
Packit 6f3914
Packit 6f3914
    @staticmethod
Packit 6f3914
    def _setup_packages(history):
Packit 6f3914
        pkg = tests.support.MockPackage('pepper-20-0.x86_64')
Packit 6f3914
        pkg._force_swdb_repoid = "main"
Packit 6f3914
        history.rpm.add_install(pkg)
Packit 6f3914
        history.beg("", [], [])
Packit 6f3914
        for tsi in history._swdb.getItems():
Packit 6f3914
            if tsi.getState() == libdnf.transaction.TransactionItemState_UNKNOWN:
Packit 6f3914
                tsi.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
        history.end("")
Packit 6f3914
        history.close()
Packit 6f3914
Packit 6f3914
    def test_instance(self):
Packit 6f3914
        base = tests.support.MockBase()
Packit 6f3914
        self.assertIsNotNone(base)
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
    @mock.patch('dnf.rpm.detect_releasever', lambda x: 'x')
Packit 6f3914
    @mock.patch('dnf.util.am_i_root', lambda: True)
Packit 6f3914
    def test_default_config_root(self):
Packit 6f3914
        base = dnf.Base()
Packit 6f3914
        self.assertIsNotNone(base.conf)
Packit 6f3914
        self.assertIsNotNone(base.conf.cachedir)
Packit 6f3914
        reg = re.compile('/var/cache/dnf')
Packit 6f3914
        self.assertIsNotNone(reg.match(base.conf.cachedir))
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
    @mock.patch('dnf.rpm.detect_releasever', lambda x: 'x')
Packit 6f3914
    @mock.patch('dnf.util.am_i_root', lambda: False)
Packit 6f3914
    def test_default_config_user(self):
Packit 6f3914
        base = dnf.Base()
Packit 6f3914
        self.assertIsNotNone(base.conf)
Packit 6f3914
        self.assertIsNotNone(base.conf.cachedir)
Packit 6f3914
        reg = re.compile('/var/tmp/dnf-[a-zA-Z0-9_-]+')
Packit 6f3914
        self.assertIsNotNone(reg.match(base.conf.cachedir))
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
    def test_reset(self):
Packit 6f3914
        base = tests.support.MockBase('main')
Packit 6f3914
        base.reset(sack=True, repos=False)
Packit 6f3914
        self.assertIsNone(base._sack)
Packit 6f3914
        self.assertLength(base.repos, 1)
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
    @mock.patch('dnf.rpm.transaction.TransactionWrapper')
Packit 6f3914
    def test_ts(self, mock_ts):
Packit 6f3914
        base = dnf.Base()
Packit 6f3914
        self.assertEqual(base._priv_ts, None)
Packit 6f3914
        ts = base._ts
Packit 6f3914
        # check the setup is correct
Packit 6f3914
        ts.setFlags.call_args.assert_called_with(0)
Packit 6f3914
        flags = ts.setProbFilter.call_args[0][0]
Packit 6f3914
        self.assertTrue(flags & rpm.RPMPROB_FILTER_OLDPACKAGE)
Packit 6f3914
        self.assertFalse(flags & rpm.RPMPROB_FILTER_REPLACEPKG)
Packit 6f3914
        # check file conflicts are reported:
Packit 6f3914
        self.assertFalse(flags & rpm.RPMPROB_FILTER_REPLACENEWFILES)
Packit 6f3914
        # check we can close the connection
Packit 6f3914
        del base._ts
Packit 6f3914
        self.assertEqual(base._priv_ts, None)
Packit 6f3914
        ts.close.assert_called_once_with()
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
    def test_iter_userinstalled(self):
Packit 6f3914
        """Test iter_userinstalled with a package installed by the user."""
Packit 6f3914
        base = tests.support.MockBase()
Packit 6f3914
        self._setup_packages(base.history)
Packit 6f3914
        base._sack = tests.support.mock_sack('main')
Packit 6f3914
        pkg, = base.sack.query().installed().filter(name='pepper')
Packit 6f3914
        # reason and repo are set in _setup_packages() already
Packit 6f3914
        self.assertEqual(base.history.user_installed(pkg), True)
Packit 6f3914
        self.assertEqual(base.history.repo(pkg), 'main')
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
    def test_iter_userinstalled_badfromrepo(self):
Packit 6f3914
        """Test iter_userinstalled with a package installed from a bad repository."""
Packit 6f3914
        base = tests.support.MockBase()
Packit 6f3914
        base._sack = tests.support.mock_sack('main')
Packit 6f3914
        self._setup_packages(base.history)
Packit 6f3914
Packit 6f3914
        history = base.history
Packit 6f3914
        pkg = tests.support.MockPackage('pepper-20-0.x86_64')
Packit 6f3914
        pkg._force_swdb_repoid = "anakonda"
Packit 6f3914
        history.rpm.add_install(pkg)
Packit 6f3914
        history.beg("", [], [])
Packit 6f3914
        for tsi in history._swdb.getItems():
Packit 6f3914
            if tsi.getState() == libdnf.transaction.TransactionItemState_UNKNOWN:
Packit 6f3914
                tsi.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
        history.end("")
Packit 6f3914
        history.close()
Packit 6f3914
Packit 6f3914
        pkg, = base.sack.query().installed().filter(name='pepper')
Packit 6f3914
        self.assertEqual(base.history.user_installed(pkg), True)
Packit 6f3914
        self.assertEqual(base.history.repo(pkg), 'anakonda')
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
    def test_iter_userinstalled_badreason(self):
Packit 6f3914
        """Test iter_userinstalled with a package installed for a wrong reason."""
Packit 6f3914
        base = tests.support.MockBase()
Packit 6f3914
        base._sack = tests.support.mock_sack('main')
Packit 6f3914
        self._setup_packages(base.history)
Packit 6f3914
Packit 6f3914
        history = base.history
Packit 6f3914
        pkg = tests.support.MockPackage('pepper-20-0.x86_64')
Packit 6f3914
        pkg._force_swdb_repoid = "main"
Packit 6f3914
        history.rpm.add_install(pkg, reason=libdnf.transaction.TransactionItemReason_DEPENDENCY)
Packit 6f3914
        history.beg("", [], [])
Packit 6f3914
        for tsi in history._swdb.getItems():
Packit 6f3914
            if tsi.getState() == libdnf.transaction.TransactionItemState_UNKNOWN:
Packit 6f3914
                tsi.setState(libdnf.transaction.TransactionItemState_DONE)
Packit 6f3914
        history.end("")
Packit 6f3914
        history.close()
Packit 6f3914
Packit 6f3914
        pkg, = base.sack.query().installed().filter(name='pepper')
Packit 6f3914
        self.assertEqual(base.history.user_installed(pkg), False)
Packit 6f3914
        self.assertEqual(base.history.repo(pkg), 'main')
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
    def test_translate_comps_pkg_types(self):
Packit 6f3914
        base = tests.support.MockBase()
Packit 6f3914
        num = base._translate_comps_pkg_types(('mandatory', 'optional'))
Packit 6f3914
        self.assertEqual(num, 12)
Packit 6f3914
        base.close()
Packit 6f3914
Packit 6f3914
Packit 6f3914
class MockBaseTest(tests.support.DnfBaseTestCase):
Packit 6f3914
    """Test the Base methods that need a Sack."""
Packit 6f3914
Packit 6f3914
    REPOS = ["main"]
Packit Service 8b25b4
    INIT_SACK = True
Packit 6f3914
Packit 6f3914
    def test_add_remote_rpms(self):
Packit 6f3914
        pkgs = self.base.add_remote_rpms([tests.support.TOUR_50_PKG_PATH])
Packit 6f3914
        self.assertIsInstance(pkgs[0], dnf.package.Package)
Packit 6f3914
        self.assertEqual(pkgs[0].name, 'tour')
Packit 6f3914
Packit 6f3914
Packit 6f3914
class BuildTransactionTest(tests.support.DnfBaseTestCase):
Packit 6f3914
Packit 6f3914
    REPOS = ["updates"]
Packit 6f3914
Packit 6f3914
    def test_resolve(self):
Packit 6f3914
        self.base.upgrade("pepper")
Packit 6f3914
        self.assertTrue(self.base.resolve())
Packit 6f3914
        self.base._ds_callback.assert_has_calls([
Packit 6f3914
            mock.call.start(),
Packit 6f3914
            mock.call.pkg_added(mock.ANY, 'ud'),
Packit 6f3914
            mock.call.pkg_added(mock.ANY, 'u')
Packit 6f3914
        ])
Packit 6f3914
        self.assertLength(self.base.transaction, 2)
Packit 6f3914
Packit 6f3914
Packit 6f3914
# verify transaction test helpers
Packit 6f3914
HASH = "68e9ded8ea25137c964a638f12e9987c"
Packit 6f3914
Packit 6f3914
Packit 6f3914
def mock_sack_fn():
Packit 6f3914
    return (lambda base: tests.support.TestSack(tests.support.REPO_DIR, base))
Packit 6f3914
Packit 6f3914
Packit 6f3914
@property
Packit 6f3914
def ret_pkgid(self):
Packit 6f3914
    return self.name
Packit 6f3914
Packit 6f3914
Packit 6f3914
class VerifyTransactionTest(tests.support.DnfBaseTestCase):
Packit 6f3914
Packit 6f3914
    REPOS = ["main"]
Packit 6f3914
    INIT_TRANSACTION = True
Packit 6f3914
Packit 6f3914
    @mock.patch('dnf.sack._build_sack', new_callable=mock_sack_fn)
Packit 6f3914
    @mock.patch('dnf.package.Package._pkgid', ret_pkgid)  # neutralize @property
Packit 6f3914
    def test_verify_transaction(self, unused_build_sack):
Packit 6f3914
        # we don't simulate the transaction itself here, just "install" what is
Packit 6f3914
        # already there and "remove" what is not.
Packit 6f3914
Packit 6f3914
        tsis = []
Packit 6f3914
Packit 6f3914
        new_pkg = self.base.sack.query().available().filter(name="pepper")[1]
Packit 6f3914
        new_pkg._chksum = (hawkey.CHKSUM_MD5, binascii.unhexlify(HASH))
Packit 6f3914
        new_pkg.repo = mock.Mock()
Packit 6f3914
        new_pkg._force_swdb_repoid = "main"
Packit 6f3914
        self.history.rpm.add_install(new_pkg)
Packit 6f3914
Packit 6f3914
        removed_pkg = self.base.sack.query().available().filter(name="mrkite")[0]
Packit 6f3914
        removed_pkg._force_swdb_repoid = "main"
Packit 6f3914
        self.history.rpm.add_remove(removed_pkg)
Packit 6f3914
Packit 6f3914
        self._swdb_commit(tsis)
Packit 6f3914
        self.base._verify_transaction()
Packit 6f3914
Packit 6f3914
        pkg = self.base.history.package_data(new_pkg)
Packit 6f3914
        self.assertEqual(pkg.ui_from_repo(), '@main')
Packit 6f3914
        self.assertEqual(pkg.action_name, "Install")
Packit 6f3914
        self.assertEqual(pkg.get_reason(), libdnf.transaction.TransactionItemReason_USER)
Packit 6f3914
Packit 6f3914
Packit 6f3914
class InstallReasonTest(tests.support.ResultTestCase):
Packit 6f3914
Packit 6f3914
    REPOS = ["main"]
Packit 6f3914
Packit 6f3914
    def test_reason(self):
Packit 6f3914
        self.base.install("mrkite")
Packit 6f3914
        self.base.resolve()
Packit 6f3914
        new_pkgs = self.base._transaction._get_items(dnf.transaction.PKG_INSTALL)
Packit 6f3914
        pkg_reasons = [(tsi.name, tsi.reason) for tsi in new_pkgs]
Packit 6f3914
        self.assertCountEqual([
Packit 6f3914
            ("mrkite", libdnf.transaction.TransactionItemReason_USER),
Packit 6f3914
            ("trampoline", libdnf.transaction.TransactionItemReason_DEPENDENCY)],
Packit 6f3914
            pkg_reasons
Packit 6f3914
        )
Packit 6f3914
Packit 6f3914
Packit 6f3914
class InstalledMatchingTest(tests.support.ResultTestCase):
Packit 6f3914
Packit 6f3914
    REPOS = ["main"]
Packit 6f3914
Packit 6f3914
    def test_query_matching(self):
Packit 6f3914
        subj = dnf.subject.Subject("pepper")
Packit 6f3914
        query = subj.get_best_query(self.sack)
Packit 6f3914
        inst, avail = self.base._query_matches_installed(query)
Packit 6f3914
        self.assertCountEqual(['pepper-20-0.x86_64'], map(str, inst))
Packit 6f3914
        self.assertCountEqual(['pepper-20-0.src'], map(str, itertools.chain.from_iterable(avail)))
Packit 6f3914
Packit 6f3914
    def test_selector_matching(self):
Packit 6f3914
        subj = dnf.subject.Subject("pepper")
Packit 6f3914
        sltr = subj.get_best_selector(self.sack)
Packit 6f3914
        inst = self.base._sltr_matches_installed(sltr)
Packit 6f3914
        self.assertCountEqual(['pepper-20-0.x86_64'], map(str, inst))
Packit 6f3914
Packit 6f3914
Packit 6f3914
class CompsTest(tests.support.DnfBaseTestCase):
Packit 6f3914
    # Also see test_comps.py
Packit 6f3914
Packit 6f3914
    REPOS = ["main"]
Packit 6f3914
    COMPS = True
Packit 6f3914
Packit 6f3914
    # prevent creating the gen/ directory:
Packit 6f3914
    @mock.patch('dnf.yum.misc.repo_gen_decompress', lambda x, y: x)
Packit 6f3914
    def test_read_comps(self):
Packit 6f3914
        self.assertLength(self.base.comps.groups, tests.support.TOTAL_GROUPS)
Packit 6f3914
Packit 6f3914
    def test_read_comps_disabled(self):
Packit 6f3914
        self.base.repos['main'].enablegroups = False
Packit 6f3914
        self.assertEmpty(self.base.read_comps())
Packit 6f3914
Packit 6f3914
Packit 6f3914
class Goal2TransactionTest(tests.support.DnfBaseTestCase):
Packit 6f3914
Packit 6f3914
    REPOS = ["main", "updates"]
Packit 6f3914
Packit 6f3914
    def test_upgrade(self):
Packit 6f3914
        self.base.upgrade("hole")
Packit 6f3914
        self.assertTrue(self.base._run_hawkey_goal(self.goal, allow_erasing=False))
Packit 6f3914
        ts = self.base._goal2transaction(self.goal)
Packit 6f3914
        self.assertLength(ts, 3)
Packit 6f3914
        tsis = list(ts)
Packit 6f3914
Packit 6f3914
        tsi = tsis[0]
Packit 6f3914
        self.assertEqual(str(tsi.pkg), "hole-2-1.x86_64")
Packit 6f3914
        self.assertEqual(tsi.action, libdnf.transaction.TransactionItemAction_UPGRADE)
Packit 6f3914
Packit 6f3914
        tsi = tsis[1]
Packit 6f3914
        self.assertEqual(str(tsi.pkg), "hole-1-1.x86_64")
Packit 6f3914
        self.assertEqual(tsi.action, libdnf.transaction.TransactionItemAction_UPGRADED)
Packit 6f3914
Packit 6f3914
        tsi = tsis[2]
Packit 6f3914
        self.assertEqual(str(tsi.pkg), "tour-5-0.noarch")
Packit 6f3914
        self.assertEqual(tsi.action, libdnf.transaction.TransactionItemAction_OBSOLETED)