# -*- coding: utf-8 -*-
# Copyright (C) 2013-2018 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# the GNU General Public License v.2, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY expressed or implied, including the implied warranties of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details. You should have received a copy of the
# GNU General Public License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
# source code or documentation are not subject to the GNU General Public
# License and may only be used or replicated with the express permission of
# Red Hat, Inc.
#
from __future__ import absolute_import
from __future__ import unicode_literals
import libdnf.transaction
import rpm
import dnf.goal
import dnf.repo
import dnf.transaction
import tests.support
from tests.support import mock
'''
class TransactionItemTest(tests.support.DnfBaseTestCase):
REPOS = ['main', 'search']
@classmethod
def setUpClass(cls):
"""Prepare the class level fixture."""
cls.newpkg = tests.support.MockPackage('new-1.0-1.x86_64')
cls.oldpkg = tests.support.MockPackage('old-4.23-13.x86_64')
cls.obspkg1 = tests.support.MockPackage('obs1-3.12-12.x86_64')
cls.obspkg2 = tests.support.MockPackage('obs2-2.1-11.x86_64')
cls.obspkg3 = tests.support.MockPackage('obs3-1.0-10.x86_64')
def test_active_hist_state_erase(self):
"""Test active_history_state with the erase op_type."""
tsi = dnf.transaction.TransactionItem(
dnf.transaction.ERASE, erased=self.oldpkg)
history_state = tsi._active_history_state
self.assertEqual(history_state, 'Erase')
def test_active_hist_state_install(self):
"""Test active_history_state with the install op_type."""
tsi = dnf.transaction.TransactionItem(
dnf.transaction.INSTALL, installed=self.newpkg,
obsoleted=[self.obspkg1, self.obspkg2])
history_state = tsi._active_history_state
self.assertEqual(history_state, 'Install')
def test_creating(self):
tsi = dnf.transaction.TransactionItem(
dnf.transaction.UPGRADE, self.newpkg, self.oldpkg,
[self.obspkg1, self.obspkg2, self.obspkg3])
self.assertEqual(tsi.installed, self.newpkg)
self.assertEqual(tsi.erased, self.oldpkg)
self.assertCountEqual(
tsi.obsoleted, [self.obspkg1, self.obspkg2, self.obspkg3])
tsi = dnf.transaction.TransactionItem(dnf.transaction.ERASE,
erased=self.oldpkg)
self.assertEqual(tsi.installed, None)
self.assertEqual(tsi.erased, self.oldpkg)
self.assertCountEqual(tsi.obsoleted, ())
def test_history_iterator_reinstall(self):
"""Test self.history_iterator with the reinstall op_type."""
tsi = dnf.transaction.TransactionItem(
dnf.transaction.REINSTALL, self.newpkg, self.oldpkg,
[self.obspkg1, self.obspkg2, self.obspkg3])
self.assertCountEqual(
tsi._history_iterator(),
[(self.newpkg, 'Reinstall', True), (self.oldpkg, 'Reinstalled', False),
(self.obspkg1, 'Obsoleted', False), (self.obspkg2, 'Obsoleted', False),
(self.obspkg3, 'Obsoleted', False)])
def test_history_iterator_upgrade(self):
"""Test self.history_iterator with the upgrade op_type."""
tsi = dnf.transaction.TransactionItem(
dnf.transaction.UPGRADE, self.newpkg, self.oldpkg,
[self.obspkg1, self.obspkg2, self.obspkg3])
self.assertCountEqual(
tsi._history_iterator(),
[(self.newpkg, 'Update', True), (self.oldpkg, 'Updated', False),
(self.obspkg1, 'Obsoleted', False), (self.obspkg2, 'Obsoleted', False),
(self.obspkg3, 'Obsoleted', False)])
def test_propagated_reason(self):
self.newpkg._force_swdb_repoid = "main"
tsi1 = dnf.transaction.TransactionItem(
dnf.transaction.INSTALL,
installed=self.newpkg,
reason=libdnf.transaction.TransactionItemReason_DEPENDENCY
)
self.oldpkg._force_swdb_repoid = "main"
tsi2 = dnf.transaction.TransactionItem(
dnf.transaction.INSTALL,
installed=self.oldpkg,
reason=libdnf.transaction.TransactionItemReason_DEPENDENCY
)
tsis = [tsi1, tsi2]
self._swdb_commit(tsis)
ionly = self.sack.query().filter(empty=True) # installonly_query
tsi = dnf.transaction.TransactionItem(
dnf.transaction.INSTALL,
installed=self.newpkg,
reason='user'
)
actual = tsi._propagated_reason(self.history, ionly)
expected = libdnf.transaction.TransactionItemReason_USER
self.assertEqual(actual, expected)
tsi = dnf.transaction.TransactionItem(
dnf.transaction.UPGRADE,
installed=self.newpkg,
erased=self.oldpkg
)
actual = tsi._propagated_reason(self.history, ionly)
expected = libdnf.transaction.TransactionItemReason_DEPENDENCY
self.assertEqual(actual, expected)
tsi = dnf.transaction.TransactionItem(
dnf.transaction.DOWNGRADE,
installed=self.newpkg,
erased=self.oldpkg
)
actual = tsi._propagated_reason(self.history, ionly)
expected = libdnf.transaction.TransactionItemReason_DEPENDENCY
self.assertEqual(actual, expected)
# test the call can survive if no reason is known:
self.history.reset_db()
actual = tsi._propagated_reason(self.history, ionly)
expected = libdnf.transaction.TransactionItemReason_UNKNOWN
self.assertEqual(actual, expected)
def test_removes(self):
tsi = dnf.transaction.TransactionItem(
dnf.transaction.UPGRADE, self.newpkg, self.oldpkg,
[self.obspkg1, self.obspkg2, self.obspkg3])
self.assertCountEqual(
tsi.removes(),
[self.oldpkg, self.obspkg1, self.obspkg2, self.obspkg3])
class TransactionTest(tests.support.TestCase):
def setUp(self):
self.ipkg = tests.support.MockPackage('inst-1.0-1.x86_64')
self.upkg1 = tests.support.MockPackage('upg1-2.1-2.x86_64')
self.upkg2 = tests.support.MockPackage('upg2-3.2-3.x86_64')
self.dpkg = tests.support.MockPackage('down-4.3-4.x86_64')
self.rpkg1 = tests.support.MockPackage('rem1-2.1-1.x86_64')
self.rpkg2 = tests.support.MockPackage('rem2-3.2-2.x86_64')
self.rpkg3 = tests.support.MockPackage('rem3-4.3-5.x86_64')
self.opkg1 = tests.support.MockPackage('obs1-4.23-13.x86_64')
self.opkg2 = tests.support.MockPackage('obs2-3.12-12.x86_64')
self.opkg3 = tests.support.MockPackage('obs3-2.1-11.x86_64')
self.opkg4 = tests.support.MockPackage('obs4-1.0-10.x86_64')
self.trans = dnf.transaction.Transaction()
self.trans.add_install(self.ipkg, [self.opkg1, self.opkg2, self.opkg3])
self.trans.add_upgrade(self.upkg1, self.rpkg1, [self.opkg4])
self.trans.add_upgrade(self.upkg2, self.rpkg2, [])
self.trans.add_downgrade(self.dpkg, self.rpkg3, [])
def test_get_items(self):
self.assertLength(self.trans._get_items(dnf.transaction.ERASE), 0)
self.assertLength(self.trans._get_items(dnf.transaction.UPGRADE), 2)
def test_iter(self):
self.assertLength(list(self.trans), 4)
self.assertIsInstance(next(iter(self.trans)),
dnf.transaction.TransactionItem)
def test_length(self):
self.assertLength(self.trans, 4)
def test_sets(self):
self.assertCountEqual(
self.trans.install_set,
[self.ipkg, self.upkg1, self.upkg2, self.dpkg])
self.assertCountEqual(
self.trans.remove_set,
[self.opkg1, self.opkg2, self.opkg3, self.opkg4,
self.rpkg1, self.rpkg2, self.rpkg3])
def test_total_package_count(self):
self.assertEqual(self.trans._total_package_count(), 11)
class RPMLimitationsTest(tests.support.TestCase):
def test_rpm_limitations(self):
ts = dnf.transaction.Transaction()
pkg = tests.support.MockPackage('anyway-2-0.src')
ts.add_install(pkg, [])
msg = ts._rpm_limitations()
self.assertIsNot(msg, None)
class PopulateTSTest(tests.support.TestCase):
@staticmethod
def test_populate_rpm_ts():
ts = dnf.transaction.Transaction()
conf = tests.support.FakeConf(cachedir='/tmp')
repo = dnf.repo.Repo('r', conf)
inst = tests.support.MockPackage("ago-20.0-1.x86_64.fc69", repo)
upg = tests.support.MockPackage("billy-1.2-1.x86_64.fc69", repo)
old = tests.support.MockPackage("billy-1.1-1.x86_64.fc69", repo)
ts.add_install(inst, [])
ts.add_upgrade(upg, old, [])
rpm_ts = ts._populate_rpm_ts(mock.Mock())
rpm_ts.assert_has_calls([mock.call.addInstall(None, ts._tsis[0], 'i'),
mock.call.addInstall(None, ts._tsis[1], 'u')])
class RPMProbFilters(tests.support.DnfBaseTestCase):
REPOS = ['main', 'search']
@mock.patch('dnf.rpm.transaction.TransactionWrapper')
def test_filters_install(self, _mock_ts):
self.base.install("lotus")
ts = self.base._ts
ts.setProbFilter.assert_called_with(rpm.RPMPROB_FILTER_OLDPACKAGE)
@mock.patch('dnf.rpm.transaction.TransactionWrapper')
def test_filters_downgrade(self, _ts):
self.base.downgrade("tour")
ts = self.base._ts
ts.setProbFilter.assert_called_with(rpm.RPMPROB_FILTER_OLDPACKAGE)
@mock.patch('dnf.rpm.transaction.TransactionWrapper')
def test_filters_reinstall(self, _ts):
self.base.reinstall("librita")
expected = rpm.RPMPROB_FILTER_OLDPACKAGE
self.base._ts.setProbFilter.assert_called_with(expected)
'''