|
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
|