Blame tests/test_install.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 itertools
Packit 6f3914
import logging
Packit 6f3914
Packit 6f3914
import dnf.exceptions
Packit 6f3914
Packit 6f3914
import tests.support
Packit 6f3914
Packit 6f3914
Packit 6f3914
class CommonTest(tests.support.ResultTestCase):
Packit 6f3914
Packit 6f3914
    """Tests common to any 'multilib_policy' and 'best'.
Packit 6f3914
Packit 6f3914
    The test fixture consists of a dnf.Base instance that:
Packit 6f3914
Packit 6f3914
    - contains a package "lotus-3-17.x86_64" (The package can be installed.)
Packit 6f3914
    - contains a package "lotus-3-17.i686" (The package can be installed.)
Packit 6f3914
    - contains a package "trampoline-2.1-1.noarch" that contains
Packit 6f3914
      "/all/be/there", provides "splendid > 2.0" and "php(a/b)" (The package
Packit 6f3914
      can be installed.)
Packit 6f3914
    - contains a package "mrkite-2-0.x86_64" (The package can be installed
Packit 6f3914
      together with the package "trampoline".)
Packit 6f3914
    - contains a package "mrkite-k-h-1-1.x86_64" (The package can be
Packit 6f3914
      installed.)
Packit 6f3914
    - contains a package "pepper-20-0.src"
Packit 6f3914
    - contains a package "pepper-20-2.x86_64" (The package cannot be
Packit 6f3914
      installed.)
Packit 6f3914
    - contains a package "librita-1-1.x86_64" (The package is already
Packit 6f3914
      installed.)
Packit 6f3914
    - contains a package "hole-1-2.x86_64" (The package can be installed as an
Packit 6f3914
      upgrade.)
Packit 6f3914
Packit 6f3914
    """
Packit 6f3914
Packit 6f3914
    REPOS = ['main', 'third_party', 'broken_deps']
Packit 6f3914
Packit 6f3914
    def test_install_arch_glob(self):
Packit 6f3914
        """Test that the pkg specification can contain an architecture glob."""
Packit 6f3914
        self.base.install("lotus.*6*")
Packit 6f3914
        installed = self.installed_removed(self.base)[0]
Packit 6f3914
        self.assertCountEqual(map(str, installed),
Packit 6f3914
                              ['lotus-3-17.i686',
Packit 6f3914
                               'lotus-3-17.x86_64'])
Packit 6f3914
Packit 6f3914
    def test_install_filename_glob(self):
Packit 6f3914
        """Test that the pkg to be installed can be specified by fname glob."""
Packit 6f3914
        self.base.install("*/there")
Packit 6f3914
        (installed, _) = self.installed_removed(self.base)
Packit 6f3914
        self.assertCountEqual(map(str, installed),
Packit 6f3914
                              ('trampoline-2.1-1.noarch',))
Packit 6f3914
Packit 6f3914
        self.base.install("/all/*/there")
Packit 6f3914
        (installed, _) = self.installed_removed(self.base)
Packit 6f3914
        self.assertCountEqual(map(str, installed),
Packit 6f3914
                              ('trampoline-2.1-1.noarch',))
Packit 6f3914
Packit 6f3914
    def test_install_name(self):
Packit 6f3914
        """Test that the package to be installed can be specified by name."""
Packit 6f3914
        self.base.install("mrkite")
Packit 6f3914
        available = self.base.sack.query().available()
Packit 6f3914
        expected = available.filter(name=["mrkite", "trampoline"]).run()
Packit 6f3914
        # ensure sanity of the test (otherwise it would pass no matter what):
Packit 6f3914
        self.assertEqual(len(expected), 2)
Packit 6f3914
        new_set = self.base.sack.query().installed() + expected
Packit 6f3914
        self.assertResult(self.base, new_set)
Packit 6f3914
Packit 6f3914
    def test_install_name_glob(self):
Packit 6f3914
        """Test that the pkg to be installed can be specified by name glob."""
Packit 6f3914
        self.base.install("mrkite*")
Packit 6f3914
        installed = self.installed_removed(self.base)[0]
Packit 6f3914
        self.assertCountEqual(map(str, installed),
Packit 6f3914
                              ['mrkite-2-0.x86_64',
Packit 6f3914
                               'mrkite-k-h-1-1.x86_64',
Packit 6f3914
                               'trampoline-2.1-1.noarch'])
Packit 6f3914
Packit 6f3914
    def test_install_name_glob_exclude(self):
Packit 6f3914
        """Test that glob excludes play well with glob installs."""
Packit 6f3914
        subj_ex = dnf.subject.Subject('*-1')
Packit 6f3914
        pkgs_ex = subj_ex.get_best_query(self.base.sack)
Packit 6f3914
        self.base.sack.add_excludes(pkgs_ex)
Packit 6f3914
Packit 6f3914
        self.base.install('mrkite*')
Packit 6f3914
        (installed, _) = self.installed_removed(self.base)
Packit 6f3914
        self.assertCountEqual(map(str, installed),
Packit 6f3914
                              ['mrkite-2-0.x86_64',
Packit 6f3914
                               'trampoline-2.1-1.noarch'])
Packit 6f3914
Packit 6f3914
    def test_install_nevra(self):
Packit 6f3914
        """Test that the package to be installed can be specified by NEVRA."""
Packit 6f3914
        self.base.install("lotus-3-17.i686")
Packit 6f3914
        lotus, = dnf.subject.Subject('lotus-3-17.i686').get_best_query(self.base.sack)
Packit 6f3914
        new_set = self.base.sack.query().installed() + [lotus]
Packit 6f3914
        self.assertResult(self.base, new_set)
Packit 6f3914
Packit 6f3914
    def test_install_provide_slash(self):
Packit 6f3914
        self.base.install("php(a/b)")
Packit 6f3914
        (installed, _) = self.installed_removed(self.base)
Packit 6f3914
        self.assertCountEqual(map(str, installed),
Packit 6f3914
                              ('trampoline-2.1-1.noarch',))
Packit 6f3914
Packit 6f3914
    def test_install_provide_version(self):
Packit 6f3914
        """Test that the pkg to be installed can be spec. by provide ver."""
Packit 6f3914
        self.base.install('splendid > 2.0')
Packit 6f3914
        self.assertGreater(self.base._goal.req_length(), 0)
Packit 6f3914
        trampoline = self.base.sack.query().available().filter(
Packit 6f3914
            name="trampoline")
Packit 6f3914
        new_set = self.base.sack.query().installed() + trampoline.run()
Packit 6f3914
        self.assertResult(self.base, new_set)
Packit 6f3914
Packit 6f3914
    def test_package_install_conflict(self):
Packit 6f3914
        """Test that a conflicting package cannot be installed."""
Packit 6f3914
        p = self.base.sack.query().available().filter(
Packit 6f3914
            nevra='pepper-20-2.x86_64')[0]
Packit 6f3914
        self.assertEqual(1, self.base.package_install(p))
Packit 6f3914
        with self.assertRaises(dnf.exceptions.DepsolveError):
Packit 6f3914
            self.base.resolve()
Packit 6f3914
Packit 6f3914
    def test_package_install_installed(self):
Packit 6f3914
        """Test that nothing changes if an installed package matches."""
Packit 6f3914
        p = self.base.sack.query().available()._nevra("librita-1-1.x86_64")[0]
Packit 6f3914
        with tests.support.mock.patch('logging.Logger.warning'):
Packit 6f3914
            self.base.package_install(p)
Packit 6f3914
        self.base.resolve()
Packit 6f3914
        self.assertEmpty(self.base._goal.list_reinstalls())
Packit 6f3914
Packit 6f3914
        self.base.history.close()
Packit 6f3914
Packit 6f3914
        self.base.package_reinstall(p)
Packit 6f3914
        self.base.resolve()
Packit 6f3914
        self.assertLength(self.base._goal.list_reinstalls(), 1)
Packit 6f3914
Packit 6f3914
    def test_package_install_upgrade(self):
Packit 6f3914
        """Test that the pkg to be installed can be an upgrade."""
Packit 6f3914
        p = self.base.sack.query().available().filter(
Packit 6f3914
            nevra='hole-1-2.x86_64')[0]
Packit 6f3914
        self.assertEqual(1, self.base.package_install(p))
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertIn(p, installed)
Packit 6f3914
        self.assertGreaterEqual(
Packit 6f3914
            removed,
Packit 6f3914
            set(self.base.sack.query().installed().filter(name='hole')))
Packit 6f3914
Packit 6f3914
    def test_pkg_install_installable(self):
Packit 6f3914
        """Test that the package to be installed can be a package instance."""
Packit 6f3914
        p = self.base.sack.query().available().filter(
Packit 6f3914
            nevra='lotus-3-17.x86_64')[0]
Packit 6f3914
        self.assertEqual(1, self.base.package_install(p))
Packit 6f3914
        self.base.resolve()
Packit 6f3914
        self.assertEqual(1, len(self.base._goal.list_installs()))
Packit 6f3914
Packit 6f3914
    def test_pkg_install_installonly(self):
Packit 6f3914
        """Test that installonly packages are installed, not upgraded."""
Packit 6f3914
        self.base.conf.installonlypkgs += ['hole']
Packit 6f3914
        p = self.base.sack.query().available().filter(
Packit 6f3914
            nevra='hole-1-2.x86_64')[0]
Packit 6f3914
        self.assertEqual(1, self.base.package_install(p))
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertIn(p, installed)
Packit 6f3914
        self.assertFalse(
Packit 6f3914
            set(removed) &
Packit 6f3914
            set(self.base.sack.query().installed().filter(name='hole')))
Packit 6f3914
Packit 6f3914
Packit 6f3914
class MultilibAllTest(tests.support.ResultTestCase):
Packit 6f3914
Packit 6f3914
    """Tests for multilib_policy='all'.
Packit 6f3914
Packit 6f3914
    The test fixture consists of a dnf.Base instance that:
Packit 6f3914
Packit 6f3914
    - has conf.multilib_policy == "all"
Packit 6f3914
    - has conf.best == False
Packit 6f3914
    - contains a package "pepper-20-2" (The package cannot be installed.)
Packit 6f3914
    - contains a package "lotus-3-16.x86_64" that contains "/usr/lib*/liblot*"
Packit 6f3914
      in a "main" repository (The package can be installed.)
Packit 6f3914
    - contains a package "lotus-3-16.i686" that contains "/usr/lib*/liblot*" in
Packit 6f3914
      the "main" repository (The package can be installed.)
Packit 6f3914
    - contains a package "librita-1-1.x86_64" (The package is already
Packit 6f3914
      installed.)
Packit 6f3914
    - contains a package "hole-1-2.x86_64" (The package can be installed as an
Packit 6f3914
      upgrade.)
Packit 6f3914
    - contains a package "pepper-20-0.src"
Packit 6f3914
    - contains a package "pepper-20-0.x86_64" (The package is already
Packit 6f3914
      installed.)
Packit 6f3914
    - contains nothing that matches "not-available"
Packit 6f3914
    - contains a package that provides "henry(the_horse)" (The package can be
Packit 6f3914
      installed.)
Packit 6f3914
    - contains a package "lotus-3-17.x86_64" not in a "main" repository (The
Packit 6f3914
      package can be installed.)
Packit 6f3914
    - contains a package "lotus-3-17.i686" not in the "main" repository (The
Packit 6f3914
      package can be installed.)
Packit 6f3914
Packit 6f3914
    """
Packit 6f3914
Packit 6f3914
    REPOS = ['main', 'third_party', 'broken_deps']
Packit 6f3914
Packit 6f3914
    def setUp(self):
Packit 6f3914
        super(MultilibAllTest, self).setUp()
Packit 6f3914
        self.base.conf.multilib_policy = "all"
Packit 6f3914
        assert self.base.conf.best is False
Packit 6f3914
Packit 6f3914
    def test_install_conflict(self):
Packit 6f3914
        """Test that the exception is raised if the package conflicts."""
Packit 6f3914
        self.base.install('pepper-20-2')
Packit 6f3914
        with self.assertRaises(dnf.exceptions.DepsolveError):
Packit 6f3914
            self.base.resolve()
Packit 6f3914
Packit 6f3914
    def test_install_filename(self):
Packit 6f3914
        """Test that the pkg to be installed can be specified by filename."""
Packit 6f3914
        self.base.install("/usr/lib*/liblot*")
Packit 6f3914
        inst, _ = self.installed_removed(self.base)
Packit 6f3914
        self.assertCountEqual(
Packit 6f3914
            map(str, inst), ['lotus-3-16.x86_64', 'lotus-3-16.i686'])
Packit 6f3914
Packit 6f3914
    def test_install_installed(self):
Packit 6f3914
        """Test that nothing changes if an installed package matches."""
Packit 6f3914
        stdout = dnf.pycomp.StringIO()
Packit 6f3914
        with tests.support.wiretap_logs('dnf', logging.INFO, stdout):
Packit 6f3914
            self.base.install('librita')
Packit 6f3914
        self.assertEqual(self.base._goal.req_length(), 0)
Packit 6f3914
        self.assertIn(
Packit 6f3914
            'Package librita-1-1.x86_64 is already installed.',
Packit 6f3914
            stdout.getvalue())
Packit 6f3914
Packit 6f3914
    def test_install_installonly(self):
Packit 6f3914
        """Test that installonly packages are installed, not upgraded."""
Packit 6f3914
        self.base.conf.installonlypkgs += ['hole']
Packit 6f3914
        self.base.install('hole-1-2')
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertGreaterEqual(
Packit 6f3914
            installed,
Packit 6f3914
            set(self.base.sack.query().available()._nevra('hole-1-2.x86_64')))
Packit 6f3914
        self.assertEmpty(removed)
Packit 6f3914
Packit 6f3914
    def test_install_multilib(self):
Packit 6f3914
        """Test that pkgs for all architectures are installed if available."""
Packit 6f3914
        cnt = self.base.install("lotus")
Packit 6f3914
        self.assertEqual(cnt, 2)
Packit 6f3914
        installed = self.installed_removed(self.base)[0]
Packit 6f3914
        self.assertLessEqual(
Packit 6f3914
            set(installed),
Packit 6f3914
            set(self.base.sack.query().available().filter(name='lotus')))
Packit 6f3914
Packit 6f3914
    def test_install_name_choice(self):
Packit 6f3914
        """Test that the matching pkg that can be installed is installed."""
Packit 6f3914
        # Don't install the SRPM.
Packit 6f3914
        self.base.sack.add_excludes(
Packit 6f3914
            dnf.subject.Subject('pepper.src').get_best_query(self.base.sack))
Packit 6f3914
Packit 6f3914
        stdout = dnf.pycomp.StringIO()
Packit 6f3914
        with tests.support.wiretap_logs('dnf', logging.INFO, stdout):
Packit 6f3914
            self.base.install('pepper')
Packit 6f3914
        self.assertEqual(self.base._goal.req_length(), 0)
Packit 6f3914
        self.assertIn(
Packit 6f3914
            'Package pepper-20-0.x86_64 is already installed.',
Packit 6f3914
            stdout.getvalue())
Packit 6f3914
Packit 6f3914
    def test_install_nonexistent(self):
Packit 6f3914
        """Test that the exception is raised if no package matches."""
Packit 6f3914
        with self.assertRaises(dnf.exceptions.MarkingError) as context:
Packit 6f3914
            self.base.install('not-available')
Packit 6f3914
        self.assertEqual(context.exception.pkg_spec, 'not-available')
Packit 6f3914
        installed_pkgs = self.base.sack.query().installed().run()
Packit 6f3914
        self.assertResult(self.base, installed_pkgs)
Packit 6f3914
Packit 6f3914
    def test_install_provide(self):
Packit 6f3914
        """Test that the pkg to be installed can be specified by provide."""
Packit 6f3914
        self.base.install("henry(the_horse)")
Packit 6f3914
        self.assertGreater(self.base._goal.req_length(), 0)
Packit 6f3914
Packit 6f3914
    def test_install_reponame(self):
Packit 6f3914
        """Test whether packages are filtered by the reponame."""
Packit 6f3914
        result = itertools.chain(
Packit 6f3914
            self.base.sack.query().installed(),
Packit 6f3914
            dnf.subject.Subject('lotus-3-16').get_best_query(self.base.sack))
Packit 6f3914
Packit 6f3914
        self.base.install('lotus', reponame='main')
Packit 6f3914
        self.assertResult(self.base, result)
Packit 6f3914
Packit 6f3914
        assert dnf.subject.Subject('lotus-3-17').get_best_query(self.base.sack), \
Packit 6f3914
            ('the base must contain packages a package in another repo '
Packit 6f3914
             'which matches the pattern but is preferred, otherwise the '
Packit 6f3914
             'test makes no sense')
Packit 6f3914
Packit 6f3914
    def test_install_upgrade(self):
Packit 6f3914
        """Test that the pkg to be installed can be an upgrade."""
Packit 6f3914
        self.base.install('hole-1-2')
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertGreaterEqual(
Packit 6f3914
            installed,
Packit 6f3914
            set(self.base.sack.query().available()._nevra('hole-1-2.x86_64')))
Packit 6f3914
        self.assertGreaterEqual(
Packit 6f3914
            removed,
Packit 6f3914
            set(self.base.sack.query().installed().filter(name='hole')))
Packit 6f3914
Packit 6f3914
Packit 6f3914
class MultilibBestTest(tests.support.ResultTestCase):
Packit 6f3914
Packit 6f3914
    """Tests for multilib_policy='best'.
Packit 6f3914
Packit 6f3914
    The test fixture consists of a dnf.Base instance that:
Packit 6f3914
Packit 6f3914
    - has conf.multilib_policy == "best"
Packit 6f3914
    - has conf.best == False
Packit 6f3914
    - contains a package "pepper-20-2" (The package cannot be installed.)
Packit 6f3914
    - contains a package "lotus-3-16.x86_64" that contains "/usr/lib*/liblot*"
Packit 6f3914
      in a "main" repository (The package can be installed.)
Packit 6f3914
    - contains a package "lotus-3-16.i686" that contains "/usr/lib*/liblot*"
Packit 6f3914
      in the "main" repository (The package can be installed.)
Packit 6f3914
    - contains nothing that matches "/not/exist/"
Packit 6f3914
    - contains a package "librita-1-1.x86_64" (The package is already
Packit 6f3914
      installed.)
Packit 6f3914
    - contains a package "hole-1-2.x86_64" (The package can be installed as an
Packit 6f3914
      upgrade.)
Packit 6f3914
    - contains a package "lotus-3-17.x86_64" not in the "main" repository (The
Packit 6f3914
      package can be installed.)
Packit 6f3914
    - contains a package "pepper-20-0.src"
Packit 6f3914
    - contains a package "pepper-20-0.x86_64" (The package is already
Packit 6f3914
      installed.)
Packit 6f3914
    - contains nothing that matches "not-available"
Packit 6f3914
    - contains a package "trampoline" that provides "henry(the_horse)" (The
Packit 6f3914
      package can be installed.)
Packit 6f3914
    - contains a package "lotus-3-17.i686" not in the "main" repository (The
Packit 6f3914
      package can be installed.)
Packit 6f3914
    - contains a package "hole-1-1.x86_64" (The package is already installed
Packit 6f3914
      and is not available.)
Packit 6f3914
Packit 6f3914
    """
Packit 6f3914
Packit 6f3914
    REPOS = ['main', 'third_party', 'broken_deps']
Packit 6f3914
Packit 6f3914
    def setUp(self):
Packit 6f3914
        super(MultilibBestTest, self).setUp()
Packit 6f3914
        self.installed = self.base.sack.query().installed().run()
Packit 6f3914
        self.assertEqual(self.base.conf.multilib_policy, "best")
Packit 6f3914
        assert self.base.conf.best is False
Packit 6f3914
Packit 6f3914
    def test_install_conflict(self):
Packit 6f3914
        """Test that the exception is raised if the package conflicts."""
Packit 6f3914
        self.base.install('pepper-20-2')
Packit 6f3914
        with self.assertRaises(dnf.exceptions.DepsolveError):
Packit 6f3914
            self.base.resolve()
Packit 6f3914
Packit 6f3914
    def test_install_filename(self):
Packit 6f3914
        """Test that the pkg to be installed can be specified by filename."""
Packit 6f3914
        self.base.install("/usr/lib*/liblot*")
Packit 6f3914
        inst, _ = self.installed_removed(self.base)
Packit 6f3914
        self.assertCountEqual(map(str, inst), ['lotus-3-16.x86_64'])
Packit 6f3914
Packit 6f3914
        self.assertRaises(dnf.exceptions.MarkingError,
Packit 6f3914
                          self.base.install, "/not/exist/")
Packit 6f3914
Packit 6f3914
    def test_install_installed(self):
Packit 6f3914
        """Test that nothing changes if an installed package matches."""
Packit 6f3914
        stdout = dnf.pycomp.StringIO()
Packit 6f3914
        with tests.support.wiretap_logs('dnf', logging.INFO, stdout):
Packit 6f3914
            self.base.install('librita')
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertEmpty(installed)
Packit 6f3914
        self.assertEmpty(removed)
Packit 6f3914
        self.assertIn(
Packit 6f3914
            'Package librita-1-1.x86_64 is already installed.',
Packit 6f3914
            stdout.getvalue())
Packit 6f3914
Packit 6f3914
    def test_install_installonly(self):
Packit 6f3914
        """Test that installonly packages are installed, not upgraded."""
Packit 6f3914
        self.base.conf.installonlypkgs += ['hole']
Packit 6f3914
        self.base.install('hole-1-2')
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertGreaterEqual(
Packit 6f3914
            installed,
Packit 6f3914
            set(self.base.sack.query().available()._nevra('hole-1-2.x86_64')))
Packit 6f3914
        self.assertEmpty(removed)
Packit 6f3914
Packit 6f3914
    def test_install_multilib(self):
Packit 6f3914
        """Test that a pkg for only one architecture are installed."""
Packit 6f3914
        cnt = self.base.install("lotus")
Packit 6f3914
        self.assertEqual(cnt, 1)
Packit 6f3914
Packit 6f3914
        new_package, = dnf.subject.Subject('lotus-3-17.x86_64').get_best_query(self.base.sack)
Packit 6f3914
        new_set = self.installed + [new_package]
Packit 6f3914
        self.assertResult(self.base, new_set)
Packit 6f3914
Packit 6f3914
    def test_install_name_choice(self):
Packit 6f3914
        """Test that the matching pkg that can be installed is installed."""
Packit 6f3914
        # Don't install the SRPM.
Packit 6f3914
        self.base.sack.add_excludes(
Packit 6f3914
            dnf.subject.Subject('pepper.src').get_best_query(self.base.sack))
Packit 6f3914
Packit 6f3914
        stdout = dnf.pycomp.StringIO()
Packit 6f3914
        with tests.support.wiretap_logs('dnf', logging.INFO, stdout):
Packit 6f3914
            self.base.install('pepper')
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertEmpty(installed | removed)
Packit 6f3914
        self.assertIn(
Packit 6f3914
            'Package pepper-20-0.x86_64 is already installed.',
Packit 6f3914
            stdout.getvalue())
Packit 6f3914
Packit 6f3914
    def test_install_nonexistent(self):
Packit 6f3914
        """Test that the exception is raised if no package matches."""
Packit 6f3914
        with self.assertRaises(dnf.exceptions.MarkingError) as context:
Packit 6f3914
            self.base.install('not-available')
Packit 6f3914
        self.assertEqual(context.exception.pkg_spec, 'not-available')
Packit 6f3914
        installed_pkgs = self.base.sack.query().installed().run()
Packit 6f3914
        self.assertResult(self.base, installed_pkgs)
Packit 6f3914
Packit 6f3914
    def test_install_provide(self):
Packit 6f3914
        """Test that the pkg to be installed can be specified by provide."""
Packit 6f3914
        self.base.install("henry(the_horse)")
Packit 6f3914
        self.assertGreater(self.base._goal.req_length(), 0)
Packit 6f3914
        trampoline = self.base.sack.query().available().filter(
Packit 6f3914
            name="trampoline")
Packit 6f3914
        new_set = self.installed + trampoline.run()
Packit 6f3914
        self.assertResult(self.base, new_set)
Packit 6f3914
Packit 6f3914
    def test_install_reponame(self):
Packit 6f3914
        """Test whether packages are filtered by the reponame."""
Packit 6f3914
        result = itertools.chain(
Packit 6f3914
            self.base.sack.query().installed(),
Packit 6f3914
            dnf.subject.Subject('lotus-3-16.x86_64')
Packit 6f3914
            .get_best_query(self.base.sack))
Packit 6f3914
Packit 6f3914
        self.base.install('lotus', reponame='main')
Packit 6f3914
        self.assertResult(self.base, result)
Packit 6f3914
Packit 6f3914
        assert dnf.subject.Subject('lotus-3-17.x86_64').get_best_query(self.base.sack), \
Packit 6f3914
            ('the base must contain packages a package in another repo '
Packit 6f3914
             'which matches the pattern but is preferred, otherwise the '
Packit 6f3914
             'test makes no sense')
Packit 6f3914
Packit 6f3914
    def test_install_unavailable(self):
Packit 6f3914
        """Test that nothing changes if an unavailable package matches."""
Packit 6f3914
        stdout = dnf.pycomp.StringIO()
Packit 6f3914
        with tests.support.wiretap_logs('dnf', logging.INFO, stdout):
Packit 6f3914
            cnt = self.base.install('hole')
Packit 6f3914
        self.assertEqual(cnt, 1)
Packit 6f3914
        installed_pkgs = self.base.sack.query().installed().run()
Packit 6f3914
        self.assertResult(self.base, installed_pkgs)
Packit 6f3914
        self.assertIn(
Packit 6f3914
            'Package hole-1-1.x86_64 is already installed.',
Packit 6f3914
            stdout.getvalue())
Packit 6f3914
Packit 6f3914
    def test_install_upgrade(self):
Packit 6f3914
        """Test that the pkg to be installed can be an upgrade."""
Packit 6f3914
        self.base.install('hole-1-2')
Packit 6f3914
        installed, removed = self.installed_removed(self.base)
Packit 6f3914
        self.assertGreaterEqual(
Packit 6f3914
            installed,
Packit 6f3914
            set(self.base.sack.query().available()._nevra('hole-1-2.x86_64')))
Packit 6f3914
        self.assertGreaterEqual(
Packit 6f3914
            removed,
Packit 6f3914
            set(self.base.sack.query().installed().filter(name='hole')))
Packit 6f3914
Packit 6f3914
Packit 6f3914
class BestTrueTest(tests.support.ResultTestCase):
Packit 6f3914
Packit 6f3914
    """Tests for best=True.
Packit 6f3914
Packit 6f3914
    The test fixture consists of a dnf.Base instance that:
Packit 6f3914
Packit 6f3914
    - has conf.best == True
Packit 6f3914
    - contains a package "pepper-20-2" (The package cannot be installed.)
Packit 6f3914
Packit 6f3914
    """
Packit 6f3914
Packit 6f3914
    REPOS = ['broken_deps']
Packit 6f3914
Packit 6f3914
    def setUp(self):
Packit 6f3914
        super(BestTrueTest, self).setUp()
Packit 6f3914
        self.base.conf.best = True
Packit 6f3914
Packit 6f3914
    def test_install_name_choice(self):
Packit 6f3914
        """Test that the latest version of the matching pkg is installed."""
Packit 6f3914
        with tests.support.mock.patch('logging.Logger.warning'):
Packit 6f3914
            self.base.install('pepper')
Packit 6f3914
        with self.assertRaises(dnf.exceptions.DepsolveError):
Packit 6f3914
            self.base.resolve()