From 3c106c240d7e82d6a3a0a0247812aeca5e3cf720 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Jun 05 2016 21:48:23 +0000 Subject: Test for import build and import rpm. --- diff --git a/tests/test_hub/test_import_build.py b/tests/test_hub/test_import_build.py new file mode 100644 index 0000000..b338757 --- /dev/null +++ b/tests/test_hub/test_import_build.py @@ -0,0 +1,265 @@ +import copy +import mock +import shutil +import tempfile +import unittest + +import koji +import kojihub + + +class TestImportRPM(unittest.TestCase): + def setUp(self): + self.tempdir = tempfile.mkdtemp() + self.filename = self.tempdir + "/name-version-release.arch.rpm" + # Touch a file + with open(self.filename, 'w'): + pass + self.src_filename = self.tempdir + "/name-version-release.src.rpm" + # Touch a file + with open(self.src_filename, 'w'): + pass + + self.rpm_header_retval = { + 'filename': 'name-version-release.arch.rpm', + 1000: 'name', + 1001: 'version', + 1002: 'release', + 1003: 'epoch', + 1006: 'buildtime', + 1022: 'arch', + 1044: 'name-version-release.arch', + 1106: 'sourcepackage', + 261: 'payload hash', + } + + def tearDown(self): + shutil.rmtree(self.tempdir) + + def test_nonexistant_rpm(self): + with self.assertRaises(koji.GenericError): + kojihub.import_rpm("this does not exist") + + @mock.patch('kojihub.get_build') + @mock.patch('koji.get_rpm_header') + def test_import_rpm_failed_build(self, get_rpm_header, get_build): + get_rpm_header.return_value = self.rpm_header_retval + get_build.return_value = { + 'state': koji.BUILD_STATES['FAILED'], + 'name': 'name', + 'version': 'version', + 'release': 'release', + } + with self.assertRaises(koji.GenericError): + kojihub.import_rpm(self.filename) + + @mock.patch('kojihub._dml') + @mock.patch('kojihub._singleValue') + @mock.patch('kojihub.get_build') + @mock.patch('koji.get_rpm_header') + def test_import_rpm_completed_build(self, get_rpm_header, get_build, + _singleValue, _dml): + get_rpm_header.return_value = self.rpm_header_retval + get_build.return_value = { + 'state': koji.BUILD_STATES['COMPLETE'], + 'name': 'name', + 'version': 'version', + 'release': 'release', + 'id': 12345, + } + _singleValue.return_value = 9876 + kojihub.import_rpm(self.filename) + fields = [ + 'build_id', + 'name', + 'arch', + 'buildtime', + 'payloadhash', + 'epoch', + 'version', + 'buildroot_id', + 'release', + 'external_repo_id', + 'id', + 'size', + ] + statement = 'INSERT INTO rpminfo (%s) VALUES (%s)' % ( + ", ".join(fields), + ", ".join(['%%(%s)s' % field for field in fields]) + ) + values = { + 'build_id': 12345, + 'name': 'name', + 'arch': 'arch', + 'buildtime': 'buildtime', + 'payloadhash': '7061796c6f61642068617368', + 'epoch': 'epoch', + 'version': 'version', + 'buildroot_id': None, + 'release': 'release', + 'external_repo_id': 0, + 'id': 9876, + 'size': 0, + } + _dml.assert_called_once_with(statement, values) + + @mock.patch('kojihub._dml') + @mock.patch('kojihub._singleValue') + @mock.patch('kojihub.get_build') + @mock.patch('koji.get_rpm_header') + def test_import_rpm_completed_source_build(self, get_rpm_header, get_build, + _singleValue, _dml): + retval = copy.copy(self.rpm_header_retval) + retval.update({ + 'filename': 'name-version-release.arch.rpm', + 1044: 'name-version-release.src', + 1022: 'src', + 1106: 1, + }) + get_rpm_header.return_value = retval + get_build.return_value = { + 'state': koji.BUILD_STATES['COMPLETE'], + 'name': 'name', + 'version': 'version', + 'release': 'release', + 'id': 12345, + } + _singleValue.return_value = 9876 + kojihub.import_rpm(self.src_filename) + fields = [ + 'build_id', + 'name', + 'arch', + 'buildtime', + 'payloadhash', + 'epoch', + 'version', + 'buildroot_id', + 'release', + 'external_repo_id', + 'id', + 'size', + ] + statement = 'INSERT INTO rpminfo (%s) VALUES (%s)' % ( + ", ".join(fields), + ", ".join(['%%(%s)s' % field for field in fields]) + ) + values = { + 'build_id': 12345, + 'name': 'name', + 'arch': 'src', + 'buildtime': 'buildtime', + 'payloadhash': '7061796c6f61642068617368', + 'epoch': 'epoch', + 'version': 'version', + 'buildroot_id': None, + 'release': 'release', + 'external_repo_id': 0, + 'id': 9876, + 'size': 0, + } + _dml.assert_called_once_with(statement, values) + + +class TestImportBuild(unittest.TestCase): + def setUp(self): + self.tempdir = tempfile.mkdtemp() + self.filename = self.tempdir + "/name-version-release.arch.rpm" + # Touch a file + with open(self.filename, 'w'): + pass + self.src_filename = self.tempdir + "/name-version-release.src.rpm" + # Touch a file + with open(self.src_filename, 'w'): + pass + + self.rpm_header_retval = { + 'filename': 'name-version-release.arch.rpm', + 1000: 'name', + 1001: 'version', + 1002: 'release', + 1003: 'epoch', + 1006: 'buildtime', + 1022: 'arch', + 1044: 'name-version-release.arch', + 1106: 'sourcepackage', + 261: 'payload hash', + } + + def tearDown(self): + shutil.rmtree(self.tempdir) + + @mock.patch('kojihub._dml') + @mock.patch('kojihub._singleValue') + @mock.patch('kojihub.get_build') + @mock.patch('kojihub.add_rpm_sig') + @mock.patch('koji.rip_rpm_sighdr') + @mock.patch('kojihub.import_rpm_file') + @mock.patch('kojihub.import_rpm') + @mock.patch('kojihub.QueryProcessor') + @mock.patch('kojihub.context') + @mock.patch('kojihub.new_package') + @mock.patch('koji.get_rpm_header') + @mock.patch('koji.pathinfo.work') + def test_import_build_completed_build(self, work, get_rpm_header, + new_package, context, query, + import_rpm, import_rpm_file, + rip_rpm_sighdr, add_rpm_sig, + get_build, _singleValue, _dml): + + rip_rpm_sighdr.return_value = (0, 0) + + processor = mock.MagicMock() + processor.executeOne.return_value = None + query.return_value = processor + + context.session.user_id = 99 + + work.return_value = '/' + + retval = copy.copy(self.rpm_header_retval) + retval.update({ + 'filename': 'name-version-release.arch.rpm', + 1044: 'name-version-release.src', + 1022: 'src', + 1106: 1, + }) + get_rpm_header.return_value = retval + + kojihub.import_build(self.src_filename, [self.filename]) + + fields = [ + 'task_id', + 'extra', + 'start_time', + 'epoch', + 'completion_time', + 'state', + 'version', + 'source', + 'volume_id', + 'owner', + 'release', + 'pkg_id', + 'id', + ] + statement = 'INSERT INTO build (%s) VALUES (%s)' % ( + ", ".join(fields), + ", ".join(['%%(%s)s' % field for field in fields]) + ) + values = { + 'task_id': None, + 'extra': None, + 'start_time': 'NOW', + 'epoch': 'epoch', + 'completion_time': 'NOW', + 'state': 1, + 'version': 'version', + 'source': None, + 'volume_id': 0, + 'owner': 99, + 'release': 'release', + 'pkg_id': mock.ANY, + 'id': mock.ANY, + } + _dml.assert_called_once_with(statement, values)