Blame tests/support.py

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