Blame tests/support.py

Packit 3a9065
# Copyright (C) 2014-2018  Red Hat, Inc.
Packit 3a9065
#
Packit 3a9065
# This copyrighted material is made available to anyone wishing to use,
Packit 3a9065
# modify, copy, or redistribute it subject to the terms and conditions of
Packit 3a9065
# the GNU General Public License v.2, or (at your option) any later version.
Packit 3a9065
# This program is distributed in the hope that it will be useful, but WITHOUT
Packit 3a9065
# ANY WARRANTY expressed or implied, including the implied warranties of
Packit 3a9065
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit 3a9065
# Public License for more details.  You should have received a copy of the
Packit 3a9065
# GNU General Public License along with this program; if not, write to the
Packit 3a9065
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 3a9065
# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the
Packit 3a9065
# source code or documentation are not subject to the GNU General Public
Packit 3a9065
# License and may only be used or replicated with the express permission of
Packit 3a9065
# Red Hat, Inc.
Packit 3a9065
#
Packit 3a9065
Packit 3a9065
from __future__ import absolute_import
Packit 3a9065
from __future__ import unicode_literals
Packit 3a9065
Packit 3a9065
import dnf
Packit 3a9065
import dnf.cli.option_parser
Packit 3a9065
import logging
Packit 3a9065
import sys
Packit 3a9065
import unittest
Packit 3a9065
Packit 3a9065
PY3 = False
Packit 3a9065
if sys.version_info.major >= 3:
Packit 3a9065
    PY3 = True
Packit 3a9065
Packit 3a9065
if PY3:
Packit 3a9065
    from unittest import mock
Packit 3a9065
else:
Packit 3a9065
    from . import mock
Packit 3a9065
Packit 3a9065
Packit 3a9065
def command_configure(cmd, args):
Packit 3a9065
    parser = dnf.cli.option_parser.OptionParser()
Packit 3a9065
    args = [cmd._basecmd] + args
Packit 3a9065
    parser.parse_main_args(args)
Packit 3a9065
    parser.parse_command_args(cmd, args)
Packit 3a9065
    return cmd.configure()
Packit 3a9065
Packit 3a9065
Packit 3a9065
def command_run(cmd, args):
Packit 3a9065
    command_configure(cmd, args)
Packit 3a9065
    return cmd.run()
Packit 3a9065
Packit 3a9065
Packit 3a9065
class BaseStub(object):
Packit 3a9065
    def __init__(self):
Packit 3a9065
        self.sack = dnf.sack.Sack()
Packit 3a9065
        self.repos = dnf.repodict.RepoDict()
Packit 3a9065
        self.conf = FakeConf()
Packit 3a9065
        self.output = dnf.cli.output.Output(self, self.conf)
Packit 3a9065
        self.output.progress = dnf.callback.NullDownloadProgress()
Packit 3a9065
Packit 3a9065
    def add_remote_rpms(self, path_list, progress=None):
Packit 3a9065
        self.sack.create_cmdline_repo()
Packit 3a9065
        pkgs = []
Packit 3a9065
        for path in path_list:
Packit 3a9065
            pkgs.append(self.sack.add_cmdline_package(path))
Packit 3a9065
        return pkgs
Packit 3a9065
Packit 3a9065
    def _add_repo_to_sack(self, repo):
Packit 3a9065
        raise dnf.exceptions.RepoError()
Packit 3a9065
Packit 3a9065
    def reset(self, sack=True, repos=True):
Packit 3a9065
        self.sack = dnf.sack.Sack()
Packit 3a9065
        self.repos = dnf.repodict.RepoDict()
Packit 3a9065
        self.conf = FakeConf()
Packit 3a9065
Packit 3a9065
    def fill_sack(self, load_system_repo=False, load_available_repos=False):
Packit 3a9065
        return
Packit 3a9065
Packit 3a9065
Packit 3a9065
class BaseCliStub(object):
Packit 3a9065
    """A class mocking `dnf.cli.cli.BaseCli`."""
Packit 3a9065
Packit 3a9065
    def __init__(self, available_pkgs=(), available_groups=()):
Packit 3a9065
        """Initialize the base."""
Packit 3a9065
        self._available_pkgs = set(available_pkgs)
Packit 3a9065
        self._available_groups = set(available_groups)
Packit 3a9065
        self.installed_groups = set()
Packit 3a9065
        self.installed_pkgs = set()
Packit 3a9065
        self.repos = dnf.repodict.RepoDict()
Packit 3a9065
        self.conf = dnf.conf.BaseConfig()
Packit 3a9065
Packit 3a9065
    def read_all_repos(self):
Packit 3a9065
        """Read repositories information."""
Packit 3a9065
        self.repos.add(dnf.repo.Repo(name='main'))
Packit 3a9065
Packit 3a9065
    def read_comps(self):
Packit 3a9065
        """Read groups information."""
Packit 3a9065
        if not self._available_groups:
Packit 3a9065
            raise dnf.exceptions.CompsError('no group available')
Packit 3a9065
Packit 3a9065
Packit 3a9065
class CliStub(object):
Packit 3a9065
    """A class mocking `dnf.cli.Cli`."""
Packit 3a9065
Packit 3a9065
    def __init__(self, base):
Packit 3a9065
        """Initialize the CLI."""
Packit 3a9065
        self.base = base
Packit 3a9065
        self.cli_commands = {}
Packit 3a9065
        self.demands = DemandsStub()
Packit 3a9065
        self.logger = logging.getLogger()
Packit 3a9065
        self.register_command(dnf.cli.commands.HelpCommand)
Packit 3a9065
Packit 3a9065
    def register_command(self, command):
Packit 3a9065
        """Register given *command*."""
Packit 3a9065
        self.cli_commands.update({alias: command for alias in command.aliases})
Packit 3a9065
Packit 3a9065
    def redirect_logger(self, stdout=None, stderr=None):
Packit 3a9065
        return
Packit 3a9065
Packit 3a9065
    def redirect_repo_progress(self, fo=sys.stderr):
Packit 3a9065
        return
Packit 3a9065
Packit 3a9065
Packit 3a9065
class DemandsStub(object):
Packit 3a9065
    pass
Packit 3a9065
Packit 3a9065
Packit 3a9065
class FakeConf(dnf.conf.Conf):
Packit 3a9065
    def __init__(self, **kwargs):
Packit 3a9065
        super(FakeConf, self).__init__()
Packit 3a9065
        self.substitutions['releasever'] = 'Fedora69'
Packit 3a9065
        for optname, val in [
Packit 3a9065
                ('assumeyes', None),
Packit 3a9065
                ('best', False),
Packit 3a9065
                ('cachedir', dnf.const.TMPDIR),
Packit 3a9065
                ('clean_requirements_on_remove', False),
Packit 3a9065
                ('color', 'never'),
Packit 3a9065
                ('color_update_installed', 'normal'),
Packit 3a9065
                ('color_update_remote', 'normal'),
Packit 3a9065
                ('color_list_available_downgrade', 'dim'),
Packit 3a9065
                ('color_list_available_install', 'normal'),
Packit 3a9065
                ('color_list_available_reinstall', 'bold'),
Packit 3a9065
                ('color_list_available_upgrade', 'bold'),
Packit 3a9065
                ('color_list_installed_extra', 'bold'),
Packit 3a9065
                ('color_list_installed_newer', 'bold'),
Packit 3a9065
                ('color_list_installed_older', 'bold'),
Packit 3a9065
                ('color_list_installed_reinstall', 'normal'),
Packit 3a9065
                ('color_update_local', 'bold'),
Packit 3a9065
                ('debug_solver', False),
Packit 3a9065
                ('debuglevel', 2),
Packit 3a9065
                ('defaultyes', False),
Packit 3a9065
                ('disable_excludes', []),
Packit 3a9065
                ('diskspacecheck', True),
Packit 3a9065
                ('exclude', []),
Packit 3a9065
                ('includepkgs', []),
Packit 3a9065
                ('install_weak_deps', True),
Packit 3a9065
                ('history_record', False),
Packit 3a9065
                ('installonly_limit', 0),
Packit 3a9065
                ('installonlypkgs', ['kernel']),
Packit 3a9065
                ('installroot', '/'),
Packit 3a9065
                ('ip_resolve', None),
Packit 3a9065
                ('multilib_policy', 'best'),
Packit 3a9065
                ('obsoletes', True),
Packit 3a9065
                ('persistdir', '/should-not-exist-bad-test/persist'),
Packit 3a9065
                ('protected_packages', ["dnf"]),
Packit 3a9065
                ('plugins', False),
Packit 3a9065
                ('showdupesfromrepos', False),
Packit 3a9065
                ('tsflags', []),
Packit 3a9065
                ('strict', True),
Packit 3a9065
                ] + list(kwargs.items()):
Packit 3a9065
            self._set_value(optname, val, dnf.conf.PRIO_DEFAULT)
Packit 3a9065
Packit 3a9065
    @property
Packit 3a9065
    def releasever(self):
Packit 3a9065
        return self.substitutions['releasever']
Packit 3a9065
Packit 3a9065
Packit 3a9065
class RepoStub(object):
Packit 3a9065
    """A class mocking `dnf.repo.Repo`"""
Packit 3a9065
Packit 3a9065
    enabled = True
Packit 3a9065
Packit 3a9065
    def __init__(self, id_):
Packit 3a9065
        """Initialize the repository."""
Packit 3a9065
        self.id = id_
Packit 3a9065
        self.priority = 99
Packit 3a9065
        self.cost = 1000
Packit 3a9065
Packit 3a9065
    def _valid(self):
Packit 3a9065
        """Return a message if the repository is not valid."""
Packit 3a9065
Packit 3a9065
    def enable(self):
Packit 3a9065
        """Enable the repo"""
Packit 3a9065
        self.enabled = True
Packit 3a9065
Packit 3a9065
    def disable(self):
Packit 3a9065
        """Disable the repo"""
Packit 3a9065
        self.enabled = False
Packit 3a9065
Packit 3a9065
    def _md_expire_cache(self):
Packit 3a9065
        """Mark cache expired"""
Packit 3a9065
Packit 3a9065
Packit 3a9065
class PkgStub:
Packit 3a9065
    def __init__(self, n, e, v, r, a, repo_id, src_name="", location="", repo=None,
Packit 3a9065
                 obsoletes=()):
Packit 3a9065
        """Mocking dnf.package.Package."""
Packit 3a9065
        self.name = n
Packit 3a9065
        self.version = v
Packit 3a9065
        self.release = r
Packit 3a9065
        self.arch = a
Packit 3a9065
        self.epoch = e
Packit 3a9065
        self.repoid = repo_id
Packit 3a9065
        self.reponame = repo_id
Packit 3a9065
        self.src_name = src_name
Packit 3a9065
        self.repo = repo
Packit 3a9065
        self.location = location
Packit 3a9065
        self.obsoletes = obsoletes
Packit 3a9065
Packit 3a9065
    def __str__(self):
Packit 3a9065
        return '%s : %s' % (self.fullname, self.reponame)
Packit 3a9065
Packit 3a9065
    def __lt__(self, other):
Packit 3a9065
        return self.fullname < other.fullname
Packit 3a9065
Packit 3a9065
    @property
Packit 3a9065
    def evr(self):
Packit 3a9065
        if self.epoch != '0':
Packit 3a9065
            return '%s:%s-%s' % (self.epoch, self.version, self.release)
Packit 3a9065
        else:
Packit 3a9065
            return '%s-%s' % (self.version, self.release)
Packit 3a9065
Packit 3a9065
    @property
Packit 3a9065
    def source_debug_name(self):
Packit 3a9065
        """
Packit 3a9065
        returns name of debuginfo package for source package of given package
Packit 3a9065
        e.g. krb5-libs -> krb5-debuginfo
Packit 3a9065
        """
Packit 3a9065
        return "{}-debuginfo".format(self.source_name)
Packit 3a9065
Packit 3a9065
    @property
Packit 3a9065
    def source_name(self):
Packit 3a9065
        """"
Packit 3a9065
        returns name of source package
Packit 3a9065
        e.g. krb5-libs -> krb5
Packit 3a9065
        """
Packit 3a9065
        if self.sourcerpm is not None:
Packit 3a9065
            # trim suffix first
Packit 3a9065
            srcname = dnf.util.rtrim(self.sourcerpm, ".src.rpm")
Packit 3a9065
            # source package filenames may not contain epoch, handle both cases
Packit 3a9065
            srcname = dnf.util.rtrim(srcname, "-{}".format(self.evr))
Packit 3a9065
            srcname = dnf.util.rtrim(srcname, "-{0.version}-{0.release}".format(self))
Packit 3a9065
        else:
Packit 3a9065
            srcname = None
Packit 3a9065
        return srcname
Packit 3a9065
Packit 3a9065
    @property
Packit 3a9065
    def sourcerpm(self):
Packit 3a9065
        name = self.src_name or self.name
Packit 3a9065
Packit 3a9065
        # special cases for debuginfo tests
Packit 3a9065
        if name == "kernel-PAE":
Packit 3a9065
            name = "kernel"
Packit 3a9065
        elif name == "krb5-libs":
Packit 3a9065
            name = "krb5"
Packit 3a9065
Packit 3a9065
        if self.arch != 'src':
Packit 3a9065
            return '%s-%s.src.rpm' % (name, self.evr)
Packit 3a9065
        else:
Packit 3a9065
            return '%s-%s.%s.rpm' % (name, self.evr, self.arch)
Packit 3a9065
Packit 3a9065
    @property
Packit 3a9065
    def fullname(self):
Packit 3a9065
        return '%s-%s.%s' % (self.name, self.evr, self.arch)
Packit 3a9065
Packit 3a9065
    def localPkg(self):
Packit 3a9065
        return '/tmp/dnf/%s-%s.%s.rpm' % (self.name, self.evr, self.arch)
Packit 3a9065
Packit 3a9065
    @property
Packit 3a9065
    def from_cmdline(self):
Packit 3a9065
        return True
Packit 3a9065
Packit 3a9065
    @property
Packit 3a9065
    def debug_name(self):
Packit 3a9065
        """
Packit 3a9065
        returns name of debuginfo package for given package
Packit 3a9065
        e.g. kernel-PAE -> kernel-PAE-debuginfo
Packit 3a9065
        """
Packit 3a9065
        return "{}-debuginfo".format(self.name)
Packit 3a9065
Packit 3a9065
Packit 3a9065
class TestCase(unittest.TestCase):
Packit 3a9065
    def assertEmpty(self, collection):
Packit 3a9065
        return self.assertEqual(len(collection), 0)
Packit 3a9065
Packit 3a9065
    if not PY3:
Packit 3a9065
        assertCountEqual = unittest.TestCase.assertItemsEqual