| |
@@ -0,0 +1,202 @@
|
| |
+ import shutil
|
| |
+ import tempfile
|
| |
+ import unittest
|
| |
+
|
| |
+ import mock
|
| |
+ from plugins.builder import taskrepos
|
| |
+
|
| |
+ import koji
|
| |
+
|
| |
+
|
| |
+ class TestTaskReposTask(unittest.TestCase):
|
| |
+
|
| |
+ def setUp(self):
|
| |
+ self.maxDiff = None
|
| |
+ self.session = mock.MagicMock()
|
| |
+ self.options = mock.MagicMock()
|
| |
+ koji.ensuredir = mock.MagicMock()
|
| |
+ self.workdir = tempfile.mkdtemp()
|
| |
+ self.task = taskrepos.TaskReposTask(
|
| |
+ 123, 'taskrepos', {}, self.session, self.options, self.workdir)
|
| |
+ self.os_symlink = mock.patch('os.symlink').start()
|
| |
+ self.os_makedir = mock.patch('os.makedirs').start()
|
| |
+
|
| |
+ def tearDown(self):
|
| |
+ shutil.rmtree(self.workdir)
|
| |
+ mock.patch.stopall()
|
| |
+
|
| |
+ def test_build_arches(self):
|
| |
+ rpms = [['rpm1', 'arch1'], ['rpm2', 'arch2'], ['rpm3', 'arch1']]
|
| |
+ rv = self.task.build_arches(rpms)
|
| |
+ self.assertEqual(rv, {'arch1', 'arch2'})
|
| |
+
|
| |
+ @mock.patch("builtins.open", new_callable=mock.mock_open, read_data="data")
|
| |
+ def test_create_repo(self, builtins_open):
|
| |
+ taskinfo = [{'parent': 2, 'id': 5, 'arch': 'arch1'},
|
| |
+ {'parent': 2, 'id': 6, 'arch': 'arch2'}]
|
| |
+ self.session.getTaskResult.side_effect = [{'srpms': ['tasks/5/5/repo_-1.1-11.src.rpm'],
|
| |
+ 'rpms': ['tasks/5/5/rpm-1.1-11.arch1.rpm',
|
| |
+ 'tasks/5/5/rpm-1.2-11.arch1.rpm']},
|
| |
+ {'srpms': ['tasks/6/6/repo-1.1-11.src.rpm'],
|
| |
+ 'rpms': ['tasks/6/6/rpm-1.1-11.arch2.rpm',
|
| |
+ 'tasks/6/6/rpm-1.2-11.arch2.rpm']}]
|
| |
+ self.task.build_arches = mock.MagicMock()
|
| |
+ self.task.build_arches.side_effect = [['arch1', 'arch2'], ['arch1', 'arch2']]
|
| |
+ self.task.gen_repodata = mock.MagicMock()
|
| |
+ self.task.gen_repodata.return_value = None
|
| |
+ self.task.merge_arch_repo = mock.MagicMock()
|
| |
+ self.task.merge_arch_repo.return_value = None
|
| |
+ rv = self.task.create_repos(taskinfo)
|
| |
+ self.assertEqual(rv,
|
| |
+ (f'{self.workdir}/repo/1.1/11', 'official/repo/1.1/11', 'repo-1.1-11'))
|
| |
+
|
| |
+ @mock.patch("builtins.open", new_callable=mock.mock_open, read_data="data")
|
| |
+ def test_create_pkg_list(self, builtins_open):
|
| |
+ rpms = [['rpm1', 'arch1'], ['rpm2', 'arch2'], ['rpm3', 'arch1']]
|
| |
+ rv = self.task.create_pkg_list(rpms, 'path/to/repodir')
|
| |
+ self.assertEqual(rv, ['path/to/repodir/arch1', 'path/to/repodir/arch2'])
|
| |
+
|
| |
+ @mock.patch("builtins.open", new_callable=mock.mock_open, read_data="data")
|
| |
+ def test_write_repo_file_non_scratch_noarch(self, builtins_open):
|
| |
+ taskinfo = {'request': [{}, 'build-trg-test'], 'id': 1, 'arch': 'arch1'}
|
| |
+ buildarch_subtasks = [{'parent': 2, 'id': 5, 'arch': 'arch1', 'label': 'noarch'},
|
| |
+ {'parent': 2, 'id': 6, 'arch': 'arch2', 'label': 'noarch'}]
|
| |
+ repodir = 'path/to/repodir/'
|
| |
+ nvr = 'rpm-1.1-11'
|
| |
+ self.options.topurl = 'https://topurl.com'
|
| |
+ rv = self.task.write_repo_file(taskinfo, buildarch_subtasks, repodir, nvr)
|
| |
+ self.assertEqual(rv, 'https://topurl.com/repos-tasks/tasks/123/123/noarch/')
|
| |
+
|
| |
+ @mock.patch("builtins.open", new_callable=mock.mock_open, read_data="data")
|
| |
+ def test_write_repo_file_scratch_basearch(self, builtins_open):
|
| |
+ taskinfo = {'request': [{'scratch': True}, 'build-trg-test', 'giturl'],
|
| |
+ 'id': 1, 'arch': 'arch1'}
|
| |
+ buildarch_subtasks = [{'parent': 2, 'id': 5, 'arch': 'arch1', 'label': 'arch1'},
|
| |
+ {'parent': 2, 'id': 6, 'arch': 'arch1', 'label': 'arch1'}]
|
| |
+ repodir = 'path/to/repodir/'
|
| |
+ nvr = 'rpm-1.1-11'
|
| |
+ self.options.topurl = 'https://topurl.com'
|
| |
+ rv = self.task.write_repo_file(taskinfo, buildarch_subtasks, repodir, nvr)
|
| |
+ self.assertEqual(rv, 'https://topurl.com/repos-tasks/tasks/123/123/$basearch/')
|
| |
+
|
| |
+ @mock.patch('subprocess.run')
|
| |
+ def test_gen_repodata(self, subprocess_run):
|
| |
+ mock_stdout = mock.MagicMock()
|
| |
+ mock_stdout.configure_mock(
|
| |
+ **{
|
| |
+ "stdout.decode.return_value": '{"A": 3}'
|
| |
+ }
|
| |
+ )
|
| |
+ subprocess_run.return_value = mock_stdout
|
| |
+ self.task.gen_repodata('path/to/repodir/arch')
|
| |
+
|
| |
+ @mock.patch('subprocess.run')
|
| |
+ @mock.patch("os.listdir", return_value=['rpm-1.1-11.arch1.rpm', 'rpm-1.2-11.arch1.rpm'])
|
| |
+ def test_merge_arch_repo_without_srcdir(self, subprocess_run, listdir):
|
| |
+ arch = 'arch1'
|
| |
+ repodir = 'path/to/repodir/'
|
| |
+ srcdir = 'path/to/srcdir/'
|
| |
+ mock_stdout = mock.MagicMock()
|
| |
+ mock_stdout.configure_mock(
|
| |
+ **{
|
| |
+ "stdout.decode.return_value": '{"A": 3}'
|
| |
+ }
|
| |
+ )
|
| |
+ subprocess_run.return_value = mock_stdout
|
| |
+ self.task.merge_arch_repo(arch, repodir, srcdir)
|
| |
+
|
| |
+ def test_handler_invalid_task_id(self):
|
| |
+ taskrepos.read_config.return_value = {}
|
| |
+ self.session.host.assertPolicy = mock.MagicMock()
|
| |
+ self.session.host.assertPolicy.return_value = True
|
| |
+ self.session.getTaskInfo.return_value = None
|
| |
+ with self.assertRaises(koji.GenericError) as ex:
|
| |
+ self.task.handler(111, True)
|
| |
+ self.assertEqual(str(ex.exception), "Invalid task ID: 111")
|
| |
+
|
| |
+ def test_handler_not_build_task(self):
|
| |
+ taskrepos.read_config.return_value = {}
|
| |
+ self.session.host.assertPolicy = mock.MagicMock()
|
| |
+ self.session.host.assertPolicy.return_value = True
|
| |
+ self.session.getTaskInfo.return_value = {
|
| |
+ 'request': [{}, 'build-trg-test'], 'id': 111, 'arch': 'arch1', 'owner': 'testuser',
|
| |
+ 'method': 'buildArch', 'state': 2}
|
| |
+ with self.assertRaises(koji.GenericError) as ex:
|
| |
+ self.task.handler(111, True)
|
| |
+ self.assertEqual(str(ex.exception), "111 is not a build task")
|
| |
+
|
| |
+ def test_handler_not_closed_task(self):
|
| |
+ taskrepos.read_config.return_value = {}
|
| |
+ self.session.host.assertPolicy = mock.MagicMock()
|
| |
+ self.session.host.assertPolicy.return_value = True
|
| |
+ self.session.getTaskInfo.return_value = {
|
| |
+ 'request': [{}, 'build-trg-test'], 'id': 111, 'arch': 'arch1', 'owner': 'testuser',
|
| |
+ 'method': 'build', 'state': 1}
|
| |
+ with self.assertRaises(koji.GenericError) as ex:
|
| |
+ self.task.handler(111, True)
|
| |
+ self.assertEqual(str(ex.exception), "task 111 has not completed successfully")
|
| |
+
|
| |
+ def test_handler_valid(self):
|
| |
+ taskrepos.read_config.return_value = {}
|
| |
+ self.session.host.assertPolicy = mock.MagicMock()
|
| |
+ self.session.host.assertPolicy.return_value = True
|
| |
+ self.session.getTaskInfo.return_value = {
|
| |
+ 'request': [{}, 'build-trg-test'], 'id': 111, 'arch': 'arch1', 'owner': 'testuser',
|
| |
+ 'method': 'build', 'state': 2}
|
| |
+ self.session.getTaskChildren.return_value = [
|
| |
+ {'id': 112, 'arch': 'arch1', 'owner': 'testuser', 'method': 'buildArch', 'state': 2},
|
| |
+ {'id': 113, 'arch': 'arch1', 'owner': 'testuser', 'method': 'tagBuild', 'state': 2}]
|
| |
+ self.task.create_repos = mock.MagicMock()
|
| |
+ self.task.create_repos.return_value = [
|
| |
+ 'tmp/dir//repo/1.1/11', 'official/repo/1.1/11', 'repo-1.1-11']
|
| |
+ self.task.write_repo_file = mock.MagicMock()
|
| |
+ self.task.write_repo_file.return_value = \
|
| |
+ 'https://topurl.com/repos-tasks/tasks/123/123/noarch/'
|
| |
+ self.task.upload_repo = mock.MagicMock()
|
| |
+ self.task.upload_repo.return_value = (['../../../dir/file'],
|
| |
+ [['path/to/repodir//../../../dir', 'file']],
|
| |
+ 'path/to/repodir/')
|
| |
+ self.session.host.taskRepoDone.return_value = (
|
| |
+ ['https://topurl.com/repos-tasks/tasks/123/123/upload_path_1/fn_1'],
|
| |
+ 'topdir/repos-tasks/tasks/123/123', None)
|
| |
+ rv = self.task.handler(111, True)
|
| |
+ self.assertEqual(rv, (['topdir/repos-tasks/tasks/123/123', ['../../../dir/file']]))
|
| |
+
|
| |
+ @mock.patch('os.path.islink')
|
| |
+ @mock.patch('os.walk')
|
| |
+ def test_upload_repo(self, os_walk, islink):
|
| |
+ repodir = 'path/to/repodir/'
|
| |
+ os_walk.return_value = (('dir', [], ['file']),)
|
| |
+ islink.return_value = False
|
| |
+ rv = self.task.upload_repo(repodir)
|
| |
+ self.assertEqual(rv, (['../../../dir/file'],
|
| |
+ [['path/to/repodir//../../../dir', 'file']],
|
| |
+ 'path/to/repodir/'))
|
| |
+
|
| |
+
|
| |
+ class TestTaskRepoNotifications(unittest.TestCase):
|
| |
+
|
| |
+ def setUp(self):
|
| |
+ self.maxDiff = None
|
| |
+ self.session = mock.MagicMock()
|
| |
+ self.options = mock.MagicMock()
|
| |
+ self.options.from_addr = 'notifuser@domain.com'
|
| |
+ self.task_notif = taskrepos.TaskRepoNotifications(
|
| |
+ 123, 'taskRepoNotifications', {}, self.session, self.options)
|
| |
+ self.SMTP = mock.patch('smtplib.SMTP').start()
|
| |
+
|
| |
+ def tearDown(self):
|
| |
+ mock.patch.stopall()
|
| |
+
|
| |
+ def test_notif(self):
|
| |
+ recipient = 'testuser@domain.com'
|
| |
+ server = mock.MagicMock()
|
| |
+ self.SMTP.return_value = server
|
| |
+ taskrepos.read_config.return_value = {'ticketlink': 'https://ticketlink.com',
|
| |
+ 'sourcecodelink': 'https://sourcecodelink.com',
|
| |
+ 'repo_lifetime': 14,
|
| |
+ 'email_template': 'email_template'}
|
| |
+ rv = self.task_notif.handler(recipient, {
|
| |
+ 'repo_urls': ['rpm-1.1-11.arch.rpm', 'rpm-1.2-11.arch.rpm', 'url/repo/repofile.repo'],
|
| |
+ 'nvr': 'rpm-1.2-11', 'old_repodir': None})
|
| |
+ self.assertEqual(rv, 'sent notification of taskrepo 123 to: %s' % recipient)
|
| |
Fixes: https://pagure.io/koji/issue/3871