|
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)
|