Blame tests/test_transaction.py

Packit 6f3914
# -*- coding: utf-8 -*-
Packit 6f3914
Packit 6f3914
# Copyright (C) 2013-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 libdnf.transaction
Packit 6f3914
import rpm
Packit 6f3914
Packit 6f3914
import dnf.goal
Packit 6f3914
import dnf.repo
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 TransactionItemTest(tests.support.DnfBaseTestCase):
Packit 6f3914
Packit 6f3914
    REPOS = ['main', 'search']
Packit 6f3914
Packit 6f3914
    @classmethod
Packit 6f3914
    def setUpClass(cls):
Packit 6f3914
        """Prepare the class level fixture."""
Packit 6f3914
        cls.newpkg = tests.support.MockPackage('new-1.0-1.x86_64')
Packit 6f3914
        cls.oldpkg = tests.support.MockPackage('old-4.23-13.x86_64')
Packit 6f3914
        cls.obspkg1 = tests.support.MockPackage('obs1-3.12-12.x86_64')
Packit 6f3914
        cls.obspkg2 = tests.support.MockPackage('obs2-2.1-11.x86_64')
Packit 6f3914
        cls.obspkg3 = tests.support.MockPackage('obs3-1.0-10.x86_64')
Packit 6f3914
Packit 6f3914
    def test_active_hist_state_erase(self):
Packit 6f3914
        """Test active_history_state with the erase op_type."""
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.ERASE, erased=self.oldpkg)
Packit 6f3914
Packit 6f3914
        history_state = tsi._active_history_state
Packit 6f3914
Packit 6f3914
        self.assertEqual(history_state, 'Erase')
Packit 6f3914
Packit 6f3914
    def test_active_hist_state_install(self):
Packit 6f3914
        """Test active_history_state with the install op_type."""
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.INSTALL, installed=self.newpkg,
Packit 6f3914
            obsoleted=[self.obspkg1, self.obspkg2])
Packit 6f3914
Packit 6f3914
        history_state = tsi._active_history_state
Packit 6f3914
Packit 6f3914
        self.assertEqual(history_state, 'Install')
Packit 6f3914
Packit 6f3914
    def test_creating(self):
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.UPGRADE, self.newpkg, self.oldpkg,
Packit 6f3914
            [self.obspkg1, self.obspkg2, self.obspkg3])
Packit 6f3914
        self.assertEqual(tsi.installed, self.newpkg)
Packit 6f3914
        self.assertEqual(tsi.erased, self.oldpkg)
Packit 6f3914
        self.assertCountEqual(
Packit 6f3914
            tsi.obsoleted, [self.obspkg1, self.obspkg2, self.obspkg3])
Packit 6f3914
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(dnf.transaction.ERASE,
Packit 6f3914
                                              erased=self.oldpkg)
Packit 6f3914
        self.assertEqual(tsi.installed, None)
Packit 6f3914
        self.assertEqual(tsi.erased, self.oldpkg)
Packit 6f3914
        self.assertCountEqual(tsi.obsoleted, ())
Packit 6f3914
Packit 6f3914
    def test_history_iterator_reinstall(self):
Packit 6f3914
        """Test self.history_iterator with the reinstall op_type."""
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.REINSTALL, self.newpkg, self.oldpkg,
Packit 6f3914
            [self.obspkg1, self.obspkg2, self.obspkg3])
Packit 6f3914
        self.assertCountEqual(
Packit 6f3914
            tsi._history_iterator(),
Packit 6f3914
            [(self.newpkg, 'Reinstall', True), (self.oldpkg, 'Reinstalled', False),
Packit 6f3914
             (self.obspkg1, 'Obsoleted', False), (self.obspkg2, 'Obsoleted', False),
Packit 6f3914
             (self.obspkg3, 'Obsoleted', False)])
Packit 6f3914
Packit 6f3914
    def test_history_iterator_upgrade(self):
Packit 6f3914
        """Test self.history_iterator with the upgrade op_type."""
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.UPGRADE, self.newpkg, self.oldpkg,
Packit 6f3914
            [self.obspkg1, self.obspkg2, self.obspkg3])
Packit 6f3914
        self.assertCountEqual(
Packit 6f3914
            tsi._history_iterator(),
Packit 6f3914
            [(self.newpkg, 'Update', True), (self.oldpkg, 'Updated', False),
Packit 6f3914
             (self.obspkg1, 'Obsoleted', False), (self.obspkg2, 'Obsoleted', False),
Packit 6f3914
             (self.obspkg3, 'Obsoleted', False)])
Packit 6f3914
Packit 6f3914
    def test_propagated_reason(self):
Packit 6f3914
Packit 6f3914
        self.newpkg._force_swdb_repoid = "main"
Packit 6f3914
        tsi1 = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.INSTALL,
Packit 6f3914
            installed=self.newpkg,
Packit 6f3914
            reason=libdnf.transaction.TransactionItemReason_DEPENDENCY
Packit 6f3914
        )
Packit 6f3914
Packit 6f3914
        self.oldpkg._force_swdb_repoid = "main"
Packit 6f3914
        tsi2 = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.INSTALL,
Packit 6f3914
            installed=self.oldpkg,
Packit 6f3914
            reason=libdnf.transaction.TransactionItemReason_DEPENDENCY
Packit 6f3914
        )
Packit 6f3914
Packit 6f3914
        tsis = [tsi1, tsi2]
Packit 6f3914
        self._swdb_commit(tsis)
Packit 6f3914
Packit 6f3914
        ionly = self.sack.query().filter(empty=True)  # installonly_query
Packit 6f3914
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.INSTALL,
Packit 6f3914
            installed=self.newpkg,
Packit 6f3914
            reason='user'
Packit 6f3914
        )
Packit 6f3914
        actual = tsi._propagated_reason(self.history, ionly)
Packit 6f3914
        expected = libdnf.transaction.TransactionItemReason_USER
Packit 6f3914
        self.assertEqual(actual, expected)
Packit 6f3914
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.UPGRADE,
Packit 6f3914
            installed=self.newpkg,
Packit 6f3914
            erased=self.oldpkg
Packit 6f3914
        )
Packit 6f3914
        actual = tsi._propagated_reason(self.history, ionly)
Packit 6f3914
        expected = libdnf.transaction.TransactionItemReason_DEPENDENCY
Packit 6f3914
        self.assertEqual(actual, expected)
Packit 6f3914
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.DOWNGRADE,
Packit 6f3914
            installed=self.newpkg,
Packit 6f3914
            erased=self.oldpkg
Packit 6f3914
        )
Packit 6f3914
        actual = tsi._propagated_reason(self.history, ionly)
Packit 6f3914
        expected = libdnf.transaction.TransactionItemReason_DEPENDENCY
Packit 6f3914
        self.assertEqual(actual, expected)
Packit 6f3914
Packit 6f3914
        # test the call can survive if no reason is known:
Packit 6f3914
        self.history.reset_db()
Packit 6f3914
        actual = tsi._propagated_reason(self.history, ionly)
Packit 6f3914
        expected = libdnf.transaction.TransactionItemReason_UNKNOWN
Packit 6f3914
        self.assertEqual(actual, expected)
Packit 6f3914
Packit 6f3914
    def test_removes(self):
Packit 6f3914
        tsi = dnf.transaction.TransactionItem(
Packit 6f3914
            dnf.transaction.UPGRADE, self.newpkg, self.oldpkg,
Packit 6f3914
            [self.obspkg1, self.obspkg2, self.obspkg3])
Packit 6f3914
        self.assertCountEqual(
Packit 6f3914
            tsi.removes(),
Packit 6f3914
            [self.oldpkg, self.obspkg1, self.obspkg2, self.obspkg3])
Packit 6f3914
Packit 6f3914
Packit 6f3914
class TransactionTest(tests.support.TestCase):
Packit 6f3914
    def setUp(self):
Packit 6f3914
        self.ipkg = tests.support.MockPackage('inst-1.0-1.x86_64')
Packit 6f3914
        self.upkg1 = tests.support.MockPackage('upg1-2.1-2.x86_64')
Packit 6f3914
        self.upkg2 = tests.support.MockPackage('upg2-3.2-3.x86_64')
Packit 6f3914
        self.dpkg = tests.support.MockPackage('down-4.3-4.x86_64')
Packit 6f3914
        self.rpkg1 = tests.support.MockPackage('rem1-2.1-1.x86_64')
Packit 6f3914
        self.rpkg2 = tests.support.MockPackage('rem2-3.2-2.x86_64')
Packit 6f3914
        self.rpkg3 = tests.support.MockPackage('rem3-4.3-5.x86_64')
Packit 6f3914
        self.opkg1 = tests.support.MockPackage('obs1-4.23-13.x86_64')
Packit 6f3914
        self.opkg2 = tests.support.MockPackage('obs2-3.12-12.x86_64')
Packit 6f3914
        self.opkg3 = tests.support.MockPackage('obs3-2.1-11.x86_64')
Packit 6f3914
        self.opkg4 = tests.support.MockPackage('obs4-1.0-10.x86_64')
Packit 6f3914
        self.trans = dnf.transaction.Transaction()
Packit 6f3914
        self.trans.add_install(self.ipkg, [self.opkg1, self.opkg2, self.opkg3])
Packit 6f3914
        self.trans.add_upgrade(self.upkg1, self.rpkg1, [self.opkg4])
Packit 6f3914
        self.trans.add_upgrade(self.upkg2, self.rpkg2, [])
Packit 6f3914
        self.trans.add_downgrade(self.dpkg, self.rpkg3, [])
Packit 6f3914
Packit 6f3914
    def test_get_items(self):
Packit 6f3914
        self.assertLength(self.trans._get_items(dnf.transaction.ERASE), 0)
Packit 6f3914
        self.assertLength(self.trans._get_items(dnf.transaction.UPGRADE), 2)
Packit 6f3914
Packit 6f3914
    def test_iter(self):
Packit 6f3914
        self.assertLength(list(self.trans), 4)
Packit 6f3914
        self.assertIsInstance(next(iter(self.trans)),
Packit 6f3914
                              dnf.transaction.TransactionItem)
Packit 6f3914
Packit 6f3914
    def test_length(self):
Packit 6f3914
        self.assertLength(self.trans, 4)
Packit 6f3914
Packit 6f3914
    def test_sets(self):
Packit 6f3914
        self.assertCountEqual(
Packit 6f3914
            self.trans.install_set,
Packit 6f3914
            [self.ipkg, self.upkg1, self.upkg2, self.dpkg])
Packit 6f3914
        self.assertCountEqual(
Packit 6f3914
            self.trans.remove_set,
Packit 6f3914
            [self.opkg1, self.opkg2, self.opkg3, self.opkg4,
Packit 6f3914
             self.rpkg1, self.rpkg2, self.rpkg3])
Packit 6f3914
Packit 6f3914
    def test_total_package_count(self):
Packit 6f3914
        self.assertEqual(self.trans._total_package_count(), 11)
Packit 6f3914
Packit 6f3914
Packit 6f3914
class RPMLimitationsTest(tests.support.TestCase):
Packit 6f3914
    def test_rpm_limitations(self):
Packit 6f3914
        ts = dnf.transaction.Transaction()
Packit 6f3914
        pkg = tests.support.MockPackage('anyway-2-0.src')
Packit 6f3914
        ts.add_install(pkg, [])
Packit 6f3914
        msg = ts._rpm_limitations()
Packit 6f3914
        self.assertIsNot(msg, None)
Packit 6f3914
Packit 6f3914
Packit 6f3914
class PopulateTSTest(tests.support.TestCase):
Packit 6f3914
    @staticmethod
Packit 6f3914
    def test_populate_rpm_ts():
Packit 6f3914
        ts = dnf.transaction.Transaction()
Packit 6f3914
        conf = tests.support.FakeConf(cachedir='/tmp')
Packit 6f3914
        repo = dnf.repo.Repo('r', conf)
Packit 6f3914
Packit 6f3914
        inst = tests.support.MockPackage("ago-20.0-1.x86_64.fc69", repo)
Packit 6f3914
        upg = tests.support.MockPackage("billy-1.2-1.x86_64.fc69", repo)
Packit 6f3914
        old = tests.support.MockPackage("billy-1.1-1.x86_64.fc69", repo)
Packit 6f3914
        ts.add_install(inst, [])
Packit 6f3914
        ts.add_upgrade(upg, old, [])
Packit 6f3914
        rpm_ts = ts._populate_rpm_ts(mock.Mock())
Packit 6f3914
        rpm_ts.assert_has_calls([mock.call.addInstall(None, ts._tsis[0], 'i'),
Packit 6f3914
                                 mock.call.addInstall(None, ts._tsis[1], 'u')])
Packit 6f3914
Packit 6f3914
Packit 6f3914
class RPMProbFilters(tests.support.DnfBaseTestCase):
Packit 6f3914
Packit 6f3914
    REPOS = ['main', 'search']
Packit 6f3914
Packit 6f3914
    @mock.patch('dnf.rpm.transaction.TransactionWrapper')
Packit 6f3914
    def test_filters_install(self, _mock_ts):
Packit 6f3914
        self.base.install("lotus")
Packit 6f3914
        ts = self.base._ts
Packit 6f3914
        ts.setProbFilter.assert_called_with(rpm.RPMPROB_FILTER_OLDPACKAGE)
Packit 6f3914
Packit 6f3914
    @mock.patch('dnf.rpm.transaction.TransactionWrapper')
Packit 6f3914
    def test_filters_downgrade(self, _ts):
Packit 6f3914
        self.base.downgrade("tour")
Packit 6f3914
        ts = self.base._ts
Packit 6f3914
        ts.setProbFilter.assert_called_with(rpm.RPMPROB_FILTER_OLDPACKAGE)
Packit 6f3914
Packit 6f3914
    @mock.patch('dnf.rpm.transaction.TransactionWrapper')
Packit 6f3914
    def test_filters_reinstall(self, _ts):
Packit 6f3914
        self.base.reinstall("librita")
Packit 6f3914
        expected = rpm.RPMPROB_FILTER_OLDPACKAGE
Packit 6f3914
        self.base._ts.setProbFilter.assert_called_with(expected)
Packit 6f3914
'''