Add checksum API

Fixes: https://pagure.io/koji/issue/3627
This commit is contained in:
Jana Cupova 2022-11-29 09:21:41 +01:00 committed by Tomas Kopecek
parent 530de712d8
commit 9bf31de75f
9 changed files with 501 additions and 2 deletions

View file

@ -0,0 +1,132 @@
import unittest
import mock
import six
import koji
import kojihub
QP = kojihub.QueryProcessor
def mock_open():
"""Return the right patch decorator for open"""
if six.PY2:
return mock.patch('__builtin__.open')
else:
return mock.patch('builtins.open')
class TestCreateRPMChecksum(unittest.TestCase):
def setUp(self):
self.maxDiff = None
self.QueryProcessor = mock.patch('kojihub.kojihub.QueryProcessor',
side_effect=self.getQuery).start()
self.queries = []
self.get_rpm = mock.patch('kojihub.kojihub.get_rpm').start()
self.get_build = mock.patch('kojihub.kojihub.get_build').start()
self. rpm_info = {'id': 123, 'name': 'test-rpm', 'external_repo_id': 0, 'version': '11',
'release': '222', 'arch': 'noarch', 'build_id': 222}
self.rpm_id = 123
self.sigkey = 'test-sigkey'
self.query_execute = mock.MagicMock()
self.single_value = mock.MagicMock()
self.path_signed = mock.patch('koji.pathinfo.signed').start()
self.path_build = mock.patch('koji.pathinfo.build').start()
self.context = mock.patch('kojihub.kojihub.context').start()
self.context.session.assertPerm = mock.MagicMock()
self.context.opts = {'RPMDefaultChecksums': 'md5 sha256'}
def tearDown(self):
mock.patch.stopall()
def getQuery(self, *args, **kwargs):
query = QP(*args, **kwargs)
query.execute = self.query_execute
query.singleValue = self.single_value
self.queries.append(query)
return query
def test_checksum_type_not_string(self):
checksum_types = 'type-1 type-2'
with self.assertRaises(koji.GenericError) as ex:
kojihub.create_rpm_checksum(self.rpm_id, self.sigkey, checksum_types=checksum_types)
self.assertEqual(f'Invalid type of checksum_types: {type(checksum_types)}',
str(ex.exception))
def test_checksum_type_bad_type(self):
checksum_types = ['md5', 'type-1']
with self.assertRaises(koji.GenericError) as ex:
kojihub.create_rpm_checksum(self.rpm_id, self.sigkey, checksum_types=checksum_types)
self.assertEqual("Checksum_type type-1 isn't supported", str(ex.exception))
def test_external_rpm(self):
ext_rpm_info = {'id': 123, 'name': 'test-rpm', 'external_repo_id': 125,
'external_repo_name': 'test-ext-rpm', 'version': '11',
'release': '222', 'arch': 'noarch'}
self.get_rpm.return_value = ext_rpm_info
nvra = "%(name)s-%(version)s-%(release)s.%(arch)s" % ext_rpm_info
with self.assertRaises(koji.GenericError) as ex:
kojihub.create_rpm_checksum(self.rpm_id, self.sigkey)
self.assertEqual(f'Not an internal rpm: {nvra} (from test-ext-rpm)', str(ex.exception))
def test_not_sigkey_related_to_rpm(self):
self.get_rpm.return_value = self.rpm_info
checksum_types = ['md5', 'sha256']
nvra = "%(name)s-%(version)s-%(release)s.%(arch)s" % self.rpm_info
expected_err = f'There is no rpm {nvra} signed with {self.sigkey}'
self.single_value.return_value = None
with self.assertRaises(koji.GenericError) as ex:
kojihub.create_rpm_checksum(self.rpm_id, self.sigkey, checksum_types=checksum_types)
self.assertEqual(expected_err % self.rpm_info, str(ex.exception))
self.assertEqual(len(self.queries), 1)
query = self.queries[0]
self.assertEqual(query.tables, ['rpmsigs'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses, ['rpm_id=%(rpm_id)i', 'sigkey=%(sigkey)s'])
def test_checksum_exists(self):
self.get_rpm.return_value = self.rpm_info
self.single_value.return_value = 'test-sighash'
self.query_execute.return_value = [{'checksum_type': 'md5'}, {'checksum_type': 'sha256'}]
result = kojihub.create_rpm_checksum(self.rpm_id, self.sigkey)
self.assertIsNone(result)
self.assertEqual(len(self.queries), 2)
query = self.queries[0]
self.assertEqual(query.tables, ['rpmsigs'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses, ['rpm_id=%(rpm_id)i', 'sigkey=%(sigkey)s'])
query = self.queries[1]
self.assertEqual(query.tables, ['rpm_checksum'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses,
["checksum_type IN %(checksum_types)s", "sigkey=%(sigkey)s"])
@mock_open()
def test_cannot_open_file(self, m_open):
self.get_rpm.return_value = self.rpm_info
self.get_build.return_value = {'build_id': 222}
self.single_value.return_value = 'test-sighash'
self.query_execute.return_value = [{'checksum_type': 'md5'}]
self.path_build.return_value = 'fakebuildpath'
self.path_signed.return_value = 'fakesignedpath'
m_open.side_effect = IOError()
with self.assertRaises(koji.GenericError) as ex:
kojihub.create_rpm_checksum(self.rpm_id, self.sigkey)
self.assertEqual("RPM path fakebuildpath/fakesignedpath cannot be open.",
str(ex.exception))
self.assertEqual(len(self.queries), 2)
query = self.queries[0]
self.assertEqual(query.tables, ['rpmsigs'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses, ['rpm_id=%(rpm_id)i', 'sigkey=%(sigkey)s'])
query = self.queries[1]
self.assertEqual(query.tables, ['rpm_checksum'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses,
["checksum_type IN %(checksum_types)s", "sigkey=%(sigkey)s"])

View file

@ -0,0 +1,34 @@
import unittest
import kojihub
class TestCreateRPMChecksumsOutput(unittest.TestCase):
def setUp(self):
self.maxDiff = None
self.exports = kojihub.RootExports()
def test_cacheonly_all_exists(self):
expected_result = {'sigkey1': {'md5': 'checksum-md5', 'sha256': 'checksum-sha256'},
'sigkey2': {'md5': 'checksum-md5', 'sha256': 'checksum-sha256'}}
query_result = [{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'sigkey1'},
{'checksum': 'checksum-sha256', 'checksum_type': 2, 'sigkey': 'sigkey1'},
{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'sigkey2'},
{'checksum': 'checksum-sha256', 'checksum_type': 2, 'sigkey': 'sigkey2'}]
checksum_types = {'sigkey1': {'md5', 'sha256'},
'sigkey2': {'md5', 'sha256'}
}
result = kojihub.create_rpm_checksums_output(query_result, checksum_types)
self.assertEqual(expected_result, result)
def test_cacheonly_some_exists(self):
expected_result = {'sigkey1': {'md5': 'checksum-md5', 'sha256': None},
'sigkey2': {'md5': None, 'sha256': 'checksum-sha256'}}
query_result = [{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'sigkey1'},
{'checksum': 'checksum-sha256', 'checksum_type': 2, 'sigkey': 'sigkey2'}]
checksum_types = {'sigkey1': {'md5', 'sha256'},
'sigkey2': {'md5', 'sha256'}
}
result = kojihub.create_rpm_checksums_output(query_result, checksum_types)
self.assertEqual(expected_result, result)

View file

@ -0,0 +1,167 @@
import unittest
import mock
import koji
import kojihub
QP = kojihub.QueryProcessor
class TestGetRpmChecksums(unittest.TestCase):
def setUp(self):
self.maxDiff = None
self.exports = kojihub.RootExports()
self.create_rpm_checksum_output = mock.patch(
'kojihub.kojihub.create_rpm_checksums_output').start()
self.write_signed_rpm = mock.patch('kojihub.kojihub.write_signed_rpm').start()
self.QueryProcessor = mock.patch('kojihub.kojihub.QueryProcessor',
side_effect=self.getQuery).start()
self.queries = []
self.query_execute = mock.MagicMock()
def tearDown(self):
mock.patch.stopall()
def getQuery(self, *args, **kwargs):
query = QP(*args, **kwargs)
query.execute = self.query_execute
self.queries.append(query)
return query
def test_rpm_id_not_str(self):
rpm_id = ['123']
with self.assertRaises(koji.GenericError) as ex:
self.exports.getRPMChecksums(rpm_id)
self.assertEqual('rpm_id must be an integer', str(ex.exception))
def test_checksum_types_not_list(self):
rpm_id = 123
checksum_types = 'type'
with self.assertRaises(koji.GenericError) as ex:
self.exports.getRPMChecksums(rpm_id, checksum_types=checksum_types)
self.assertEqual('checksum_type must be a list', str(ex.exception))
def test_checksum_types_wrong_type(self):
rpm_id = 123
checksum_types = ['md5', 'type']
with self.assertRaises(koji.GenericError) as ex:
self.exports.getRPMChecksums(rpm_id, checksum_types=checksum_types)
self.assertEqual("Checksum_type type isn't supported", str(ex.exception))
def test_all_checksum_exists(self):
rpm_id = 123
checksum_types = ['md5', 'sha256']
expected_result = {'sigkey1': {'md5': 'checksum-md5', 'sha256': 'checksum-sha256'}}
self.query_execute.side_effect = [
[{'sigkey': 'sigkey-1'}],
[{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'test-sigkey'},
{'checksum': 'checksum-sha256', 'checksum_type': 2, 'sigkey': 'test-sigkey'}]]
self.create_rpm_checksum_output.return_value = expected_result
result = self.exports.getRPMChecksums(rpm_id, checksum_types=checksum_types)
self.assertEqual(len(self.queries), 2)
query = self.queries[0]
self.assertEqual(query.tables, ['rpmsigs'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses, ['rpm_id=%(rpm_id)i'])
query = self.queries[1]
self.assertEqual(query.tables, ['rpm_checksum'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses,
['checksum_type IN %(checksum_type)s', 'rpm_id=%(rpm_id)i'])
self.assertEqual(expected_result, result)
def test_missing_checksum_not_sigkey(self):
rpm_id = 123
checksum_types = ['md5']
self.query_execute.side_effect = [[], []]
with self.assertRaises(koji.GenericError) as ex:
self.exports.getRPMChecksums(rpm_id, checksum_types=checksum_types)
self.assertEqual(f'No cached signature for rpm ID {rpm_id}.', str(ex.exception))
self.assertEqual(len(self.queries), 1)
query = self.queries[0]
self.assertEqual(query.tables, ['rpmsigs'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses, ['rpm_id=%(rpm_id)i'])
def test_missing_valid_checksum_generated(self):
rpm_id = 123
checksum_types = ['md5']
expected_result = {'sigkey1': {'md5': 'checksum-md5'}}
self.query_execute.side_effect = [
[{'sigkey': 'sigkey-1'}],
[],
[{'checksum': 'checksum-md5', 'checksum_type': 0}]]
self.write_signed_rpm.return_value = None
self.create_rpm_checksum_output.return_value = expected_result
result = self.exports.getRPMChecksums(rpm_id, checksum_types=checksum_types)
self.assertEqual(expected_result, result)
self.assertEqual(len(self.queries), 2)
query = self.queries[0]
self.assertEqual(query.tables, ['rpmsigs'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses, ['rpm_id=%(rpm_id)i'])
query = self.queries[1]
self.assertEqual(query.tables, ['rpm_checksum'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses,
['checksum_type IN %(checksum_type)s', 'rpm_id=%(rpm_id)i'])
def test_missing_valid_more_checksum_generated_and_exists(self):
rpm_id = 123
checksum_types = ['md5', 'sha256']
expected_result = {'sigkey1': {'md5': 'checksum-md5', 'sha256': 'checksum-sha256'}}
self.query_execute.side_effect = [
[{'sigkey': 'sigkey-1'}],
[{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'test-sigkey'}],
[{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'test-sigkey'},
{'checksum': 'checksum-sha256', 'checksum_type': 2, 'sigkey': 'test-sigkey'}]]
self.write_signed_rpm.return_value = None
self.create_rpm_checksum_output.return_value = expected_result
result = self.exports.getRPMChecksums(rpm_id, checksum_types=checksum_types)
self.assertEqual(expected_result, result)
self.assertEqual(len(self.queries), 2)
query = self.queries[0]
self.assertEqual(query.tables, ['rpmsigs'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses, ['rpm_id=%(rpm_id)i'])
query = self.queries[1]
self.assertEqual(query.tables, ['rpm_checksum'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses,
['checksum_type IN %(checksum_type)s', 'rpm_id=%(rpm_id)i'])
def test_missing_valid_more_checksum_generated_and_exists_more_sigkeys(self):
rpm_id = 123
checksum_types = ['md5', 'sha256']
expected_result = {'sigkey1': {'md5': 'checksum-md5', 'sha256': 'checksum-sha256'},
'sigkey2': {'md5': 'checksum-md5', 'sha256': 'checksum-sha256'}}
self.query_execute.side_effect = [
[{'sigkey': 'sigkey-1'}, {'sigkey': 'sigkey-2'}],
[{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'sigkey-1'},
{'checksum': 'checksum-sha256', 'checksum_type': 2, 'sigkey': 'sigkey-2'}],
[{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'sigkey-1'},
{'checksum': 'checksum-sha256', 'checksum_type': 2, 'sigkey': 'sigkey-1'},
{'checksum': 'checksum-md5', 'checksum_type': 0, 'sigkey': 'sigkey-2'},
{'checksum': 'checksum-sha256', 'checksum_type': 2, 'sigkey': 'sigkey-2'}]]
self.write_signed_rpm.return_value = None
self.create_rpm_checksum_output.return_value = expected_result
result = self.exports.getRPMChecksums(rpm_id, checksum_types=checksum_types)
self.assertEqual(expected_result, result)
self.assertEqual(len(self.queries), 2)
query = self.queries[0]
self.assertEqual(query.tables, ['rpmsigs'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses, ['rpm_id=%(rpm_id)i'])
query = self.queries[1]
self.assertEqual(query.tables, ['rpm_checksum'])
self.assertEqual(query.joins, None)
self.assertEqual(query.clauses,
['checksum_type IN %(checksum_type)s', 'rpm_id=%(rpm_id)i'])