Blame tests/test_base.py

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