rpmlint/test/test_filter.py

178 lines
7.9 KiB
Python

from pathlib import Path
from rpmlint.config import Config
from rpmlint.filter import Filter
from Testing import get_tested_package, testpath
TEST_CONFIG_FILTERS = [testpath() / 'configs/testfilters.config']
TEST_RPMLINTRC = testpath() / 'configs/testing-rpmlintrc'
TEST3_RPMLINTRC = testpath() / 'configs/testing3-rpmlintrc'
TEST_PACKAGE = Path('binary', 'ngircd')
TEST_PACKAGE2 = Path('binary', 'tempfiled')
TEST_DESCRIPTIONS = [testpath() / 'configs/descriptions.config']
def test_filters_regexp():
"""
Load some filters and make sure we generate nice regexp
"""
cfg = Config(TEST_CONFIG_FILTERS)
assert len(cfg.configuration['Filters']) == 12
assert cfg.configuration['Filters'][0] == '.*invalid-buildhost.*'
def test_data_storing(tmpdir):
"""
Load some filters and make sure we generate nice regexp
"""
cfg = Config(TEST_CONFIG_FILTERS)
cfg.load_rpmlintrc(TEST_RPMLINTRC)
result = Filter(cfg)
pkg = get_tested_package(TEST_PACKAGE, tmpdir)
# this should be upgraded to error
result.add_info('I', pkg, 'suse-other-error', '')
assert len(result.results) == 1
assert result.printed_messages['I'] == 0
assert result.printed_messages['E'] == 1
# this should be downgraded
result.add_info('E', pkg, 'suse-dbus-unauthorized-service', '')
assert len(result.results) == 2
assert result.printed_messages['W'] == 1
assert result.printed_messages['E'] == 1
def test_data_storing_backward_compat(tmpdir):
"""
Make sure we can load some filters from rpmlintrc that
worked with rpmlint v1.
"""
cfg = Config(TEST_CONFIG_FILTERS)
cfg.load_rpmlintrc(TEST3_RPMLINTRC)
parsed_filters = cfg.rpmlintrc_filters
assert 'no-spaces-in-paren' in parsed_filters
assert 'has-spaces-in-paren' in parsed_filters
assert 'multiple-spaces-in-paren' in parsed_filters
assert 'doublequotes-instead-of-singlequotes' in parsed_filters
def test_description_storing(tmpdir):
"""
Test if we can store extra destcriptions and formatting is up par
"""
lorem_formated = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum.\n\n"""
cfg = Config(TEST_CONFIG_FILTERS)
result = Filter(cfg)
pkg = get_tested_package(TEST_PACKAGE, tmpdir)
assert len(result.results) == 0
result.add_info('E', pkg, 'suse-dbus-unauthorized-service', '')
# two options so we check the description is added only once
result.add_info('I', pkg, 'suse-other-error', '/usr/bin/1')
# nothing is populated
assert not result.get_description('suse-other-error')
# add descriptions
result.error_details.update({'suse-other-error': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'})
assert result.get_description('suse-other-error') == lorem_formated
def test_description_from_toml(tmpdir):
"""
Test if description loaded from toml shows up details
"""
cfg = Config(TEST_CONFIG_FILTERS)
result = Filter(cfg)
assert result.get_description('uncompressed-zip')
assert result.get_description('uncompressed-zip') == 'The zip file is not compressed.\n\n'
def test_description_from_conf(tmpdir):
"""
Test that descriptions strings are updated from configuration file.
Load [Descriptions] from TEST_DESCRIPTIONS config file and test that the
rpmlint error details are updated to the new values.
"""
cfg = Config(TEST_DESCRIPTIONS)
result = Filter(cfg)
assert result.get_description('no-binary', cfg)
assert result.get_description('no-binary', cfg) == \
'A new text for no-binary error.\n\n'
assert result.get_description('no-soname', cfg)
assert result.get_description('no-soname', cfg) == \
'A new text for no-soname error.\n\n'
# At this point, only basic descriptions from "descriptions" directory are
# loaded. "Dynamic" descriptions that are defined directly in the check
# file (e.g. see FHSCheck.py and its fhs_details_dict) are loaded later so
# we can't test it now. It's tested in test_lint.py.
assert not result.get_description('non-standard-dir-in-usr', cfg)
assert result.get_description('non-standard-dir-in-usr', cfg) != \
'A new text for non-standard-dir-in-usr error.\n\n'
assert not result.get_description('non-standard-dir-in-var', cfg)
assert result.get_description('non-standard-dir-in-var', cfg) != \
'A new text for non-standard-dir-in-var error.\n\n'
def test_output(tmpdir):
"""
Test the actual output of rpmlint on one file
"""
expected_output = """ngircd.x86_64: I: suse-other-error /usr/bin/1
ngircd.x86_64: I: suse-other-error /usr/bin/2
tempfiled.x86_64: E: suse-other-error /usr/bin/3
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum.
ngircd.x86_64: E: suse-dbus-unauthorized-service\n"""
cfg = Config(TEST_CONFIG_FILTERS)
result = Filter(cfg)
pkg = get_tested_package(TEST_PACKAGE, tmpdir)
pkg2 = get_tested_package(TEST_PACKAGE2, tmpdir)
# here we check if empty detail will not add whitespace
result.add_info('E', pkg, 'suse-dbus-unauthorized-service', '')
# two options so we check the description is added only once
result.add_info('I', pkg, 'suse-other-error', '/usr/bin/1')
result.add_info('I', pkg, 'suse-other-error', '/usr/bin/2')
result.add_info('E', pkg2, 'suse-other-error', '/usr/bin/3')
result.error_details.update({'suse-other-error': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'})
assert len(result.print_results(result.results).splitlines()) == 4
result.info = True
assert len(result.print_results(result.results).splitlines()) == 11
assert result.print_results(result.results) == expected_output
def test_filtered_output(tmpdir):
cfg = Config(TEST_CONFIG_FILTERS)
result = Filter(cfg)
pkg = get_tested_package(TEST_PACKAGE, tmpdir)
assert len(result.results) == 0
result.add_info('E', pkg, 'no-regex', '')
result.add_info('E', pkg, 'no-regex-with-leading-space', '')
result.add_info('E', pkg, 'bad-error', 'details of the error')
result.add_info('E', pkg, 'test-color-error', 'details of the error')
assert len(result.results) == 0
def test_blocked_filters(tmpdir):
key = 'fatal-error'
cfg = Config(TEST_CONFIG_FILTERS)
result = Filter(cfg)
pkg = get_tested_package(TEST_PACKAGE, tmpdir)
assert len(result.results) == 0
assert key in cfg.configuration['Filters']
result.add_info('E', pkg, key, '')
assert len(result.results) == 1