debian-koji/tests/test_builder/test_newRepo.py
2025-03-07 22:03:57 +01:00

165 lines
6.2 KiB
Python

from __future__ import absolute_import
try:
from unittest import mock
except ImportError:
import mock
import os
import shutil
import tempfile
import unittest
import koji
import koji.tasks
from .loadkojid import kojid
class TestChooseTaskarch(unittest.TestCase):
def setUp(self):
self.tempdir = tempfile.mkdtemp()
self.session = mock.MagicMock()
self.options = mock.MagicMock()
self.options.copy_old_repodata = False
self.options.createrepo_update = True
self.topdir = self.tempdir + '/topdir'
self.options.topdir = self.topdir
self.pathinfo = koji.PathInfo(self.topdir)
mock.patch('koji.pathinfo', new=self.pathinfo).start()
# set up task handler
task_id = 99
method = 'newRepo'
params = ['TAG']
self.handler = kojid.NewRepoTask(task_id, method, params, self.session,
self.options, self.tempdir + '/work')
# mock some more things
self.wait = mock.MagicMock()
self.handler.wait = self.wait
self.session.getExternalRepoList.return_value = []
def tearDown(self):
mock.patch.stopall()
shutil.rmtree(self.tempdir)
def test_basic(self):
self.session.getTag.return_value = {'id': 'TAGID', 'name': 'TAG'}
self.session.host.repoInit.return_value = ['REPOID', 'EVENTID']
os.makedirs(self.topdir + '/repos/TAG/REPOID')
arches = ['x86_64', 'aarch64']
for arch in arches:
os.makedirs('%s/repos/TAG/REPOID/%s' % (self.topdir, arch))
# touch pkglist
with open('%s/repos/TAG/REPOID/%s/pkglist' % (self.topdir, arch), 'wt') as fo:
fo.write('fake-1.2.3-1.rpm\n')
result = self.handler.run()
self.assertEqual(result, ('REPOID', 'EVENTID'))
self.assertEqual(len(self.session.host.subtask.mock_calls), 2) # once per arch
def test_no_dir_access(self):
self.session.getTag.return_value = {'id': 'TAGID', 'name': 'TAG'}
self.session.host.repoInit.return_value = ['REPOID', 'EVENTID']
# we don't make the repos dir
with self.assertRaises(koji.tasks.RefuseTask):
result = self.handler.run()
self.session.host.repoInit.assert_not_called()
def test_oldrepo_no_update(self):
taginfo = {'id': 'TAGID', 'name': 'TAG'}
self.options.createrepo_update = False
result = self.handler.get_old_repo(taginfo)
self.assertEqual(result, (None, None))
self.session.getRepo.assert_not_called()
def test_oldrepo_simple(self):
taginfo = {'id': 'TAGID', 'name': 'TAG'}
repo = {'id': 'OLDREPOID', 'tag_id': 'TAGID'}
self.session.getRepo.return_value = repo
result = self.handler.get_old_repo(taginfo)
self.assertEqual(result, (repo, self.topdir + '/repos/TAG/OLDREPOID'))
self.session.getRepo.assert_called_once_with('TAGID')
self.session.getFullInheritance.assert_not_called()
def test_oldrepo_hint(self):
taginfo = {'id': 'TAGID', 'name': 'TAG', 'extra': {'repo.oldrepo_hint': 'OTHERTAG'}}
taginfo2 = {'id': 'TAGID2', 'name': 'OTHERTAG'}
repo = {'id': 'OLDREPOID', 'tag_id': 'TAGID2'}
self.session.getRepo.side_effect = [None, repo]
self.session.getTag.return_value = taginfo2
result = self.handler.get_old_repo(taginfo)
self.assertEqual(result, (repo, self.topdir + '/repos/OTHERTAG/OLDREPOID'))
expected_calls = [
mock.call('TAGID'),
mock.call('TAGID2'),
]
self.assertEqual(self.session.getRepo.mock_calls, expected_calls)
self.session.getFullInheritance.assert_not_called()
def test_oldrepo_bad_hint(self):
taginfo = {'id': 'TAGID', 'name': 'TAG',
'extra': {'repo.oldrepo_hint': ['BADTAG', 'OTHERTAG']}}
taginfo2 = {'id': 'TAGID2', 'name': 'OTHERTAG'}
repo = {'id': 'OLDREPOID', 'tag_id': 'TAGID2'}
self.session.getRepo.side_effect = [None, repo]
self.session.getTag.side_effect = [None, taginfo2]
result = self.handler.get_old_repo(taginfo)
self.assertEqual(result, (repo, self.topdir + '/repos/OTHERTAG/OLDREPOID'))
expected_calls = [
mock.call('TAGID'),
mock.call('TAGID2'),
]
self.assertEqual(self.session.getRepo.mock_calls, expected_calls)
expected_calls = [
mock.call('BADTAG', strict=False),
mock.call('OTHERTAG', strict=False),
]
self.assertEqual(self.session.getTag.mock_calls, expected_calls)
self.session.getFullInheritance.assert_not_called()
def test_oldrepo_inherit(self):
taginfo = {'id': 'TAGID', 'name': 'TAG', 'extra': {}}
taginfo2 = {'id': 'PARENTID', 'name': 'PARENTTAG'}
repo = {'id': 'OLDREPOID', 'tag_id': 'PARENTID'}
self.session.getRepo.side_effect = [None, repo]
self.session.getFullInheritance.return_value = [{'parent_id': 'PARENTID', 'currdepth': 1}]
self.session.getTag.return_value = taginfo2
result = self.handler.get_old_repo(taginfo)
self.assertEqual(result, (repo, self.topdir + '/repos/PARENTTAG/OLDREPOID'))
expected_calls = [
mock.call('TAGID'),
mock.call('PARENTID'),
]
self.assertEqual(self.session.getRepo.mock_calls, expected_calls)
self.session.getFullInheritance.assert_called_once()
def test_oldrepo_no_match(self):
taginfo = {'id': 'TAGID', 'name': 'TAG', 'extra': {'repo.oldrepo_hint': 'OTHERTAG'}}
taginfo2 = {'id': 'TAGID2', 'name': 'OTHERTAG'}
self.session.getRepo.return_value = None
self.session.getFullInheritance.return_value = [{'parent_id': 'PARENTID', 'currdepth': 1}]
self.session.getTag.return_value = taginfo2
result = self.handler.get_old_repo(taginfo)
self.assertEqual(result, (None, None))
expected_calls = [
mock.call('TAGID'),
mock.call('TAGID2'),
mock.call('PARENTID'),
]
self.assertEqual(self.session.getRepo.mock_calls, expected_calls)
self.session.getFullInheritance.assert_called_once()
# the end