test: Extend tag tests to check 'W: missing-dependency-on'

See https://github.com/rpm-software-management/rpmlint/pull/1152
This commit is contained in:
Daniel Garcia Moreno 2023-12-12 10:30:48 +01:00
parent cb507aa60a
commit 663c98adbd
3 changed files with 67 additions and 5 deletions

View File

@ -764,6 +764,29 @@ class InstalledPkg(Pkg):
return (0, 'fake: pgp md5 OK')
class FakeHeader(dict):
def sprintf(self, expr):
"""
Replaces expressions like %{} with actual package
"""
tagre = re.compile(r'%{([^}]*)}')
for tag in tagre.findall(expr):
expr = expr.replace(f'%{tag}', self[f'RPMTAG_{tag}'])
return expr
def __missing__(self, key):
try:
key = getattr(rpm, key)
except (TypeError, KeyError):
raise KeyError
if key not in self:
raise KeyError
return self[key]
# Class to provide an API to a 'fake' package, eg. for specfile-only checks
class FakePkg(AbstractPkg):
_autoheaders = [
@ -779,6 +802,7 @@ class FakePkg(AbstractPkg):
def __init__(self, name, is_source=False):
self.name = str(name)
self.filename = f'{name}.rpm'
self.arch = None
self.current_linenum = None
self.dirname = None
@ -789,7 +813,7 @@ class FakePkg(AbstractPkg):
self.ghost_files = {}
# header is a dictionary to mock rpm metadata
self.header = {}
self.header = FakeHeader()
for i in self._autoheaders:
# the header name wihtout the ending 's'
tagname = i[:-1].upper()
@ -898,7 +922,7 @@ class FakePkg(AbstractPkg):
tagname = k[:-1].upper()
for i in v:
name, flags, version = parse_deps(i)[0]
version = f'{version[1]}-{version[2]}'
version = f'{version[0]}:{version[1]}-{version[2]}'
self.header[getattr(rpm, f'RPMTAG_{tagname}NAME')].append(name)
self.header[getattr(rpm, f'RPMTAG_{tagname}FLAGS')].append(flags)
self.header[getattr(rpm, f'RPMTAG_{tagname}VERSION')].append(version)

View File

@ -62,8 +62,8 @@ def get_tested_spec_package(name):
return FakePkg(candidates[0])
def get_tested_mock_package(files=None, header=None):
mockPkg = FakePkg('mockPkg')
def get_tested_mock_package(files=None, header=None, name='mockPkg'):
mockPkg = FakePkg(name)
if files is not None:
if isinstance(files, dict):
# full path for test files

View File

@ -4,6 +4,7 @@ from rpmlint.filter import Filter
import rpmlint.spellcheck
from Testing import CONFIG, get_tested_package
from Testing import get_tested_mock_package
from Testing import HAS_ENGLISH_DICTIONARY, HAS_FRENCH_DICTIONARY
@ -12,7 +13,19 @@ def tagscheck():
CONFIG.info = True
output = Filter(CONFIG)
test = TagsCheck(CONFIG, output)
return output, test
yield output, test
@pytest.fixture
def output(tagscheck):
output, _test = tagscheck
yield output
@pytest.fixture
def test(tagscheck):
_output, test = tagscheck
yield test
@pytest.mark.parametrize('package', ['binary/unexpanded1'])
@ -439,3 +452,28 @@ def test_description_spelling_error(tmp_path, package, tagscheck):
test.check(get_tested_package(package, tmp_path))
out = output.print_results(output.results)
assert 'E: spelling-error' in out
@pytest.mark.parametrize('package', [
get_tested_package('binary/xrootd-devel', '/tmp/'),
get_tested_mock_package(
name='xrootd-devel',
files=[
'/usr/lib64/libXrdXml.so',
],
header={
'requires': [
'xrootd-libs(x86-64) = 1:5.6.3-2.fc39',
],
'ARCH': 'noarch',
'NAME': 'xrootd-devel',
'VERSION': '5.6.3',
'RELEASE': '2.fc39',
'EPOCH': 1,
},
),
])
def test_missing_dependency_on_with_epoch(package, output, test):
test.check(package)
out = output.print_results(output.results)
assert 'W: missing-dependency-on' not in out