add unit tests and drop obsolete ones

This commit is contained in:
Mike McLean 2024-03-06 15:28:53 -05:00 committed by Tomas Kopecek
parent 5c383b6175
commit 1d0d4f2683
2 changed files with 218 additions and 109 deletions

View file

@ -1,109 +0,0 @@
from __future__ import absolute_import
import mock
import unittest
import koji.daemon
import koji
class TestDelayTimes(unittest.TestCase):
def setUp(self):
self.options = mock.MagicMock()
self.session = mock.MagicMock()
self.tm = koji.daemon.TaskManager(self.options, self.session)
self.time = mock.patch('time.time').start()
def tearDown(self):
mock.patch.stopall()
def test_check_avail_delay(self):
self.options.task_avail_delay = 180 # same as default
# highest capacity, no skip entry
start = 10000
task = {'id': 100}
self.tm.skipped_tasks = {}
self.time.return_value = start
bin_avail = [10.0, 9.0, 8.0, 7.0]
our_avail = 10.1
chk = self.tm.checkAvailDelay(task, bin_avail, our_avail)
self.assertEqual(chk, False)
# not highest, no skip entry
our_avail = 9.0
self.tm.skipped_tasks = {}
chk = self.tm.checkAvailDelay(task, bin_avail, our_avail)
self.assertEqual(chk, True)
# last, but past full delay
self.tm.skipped_tasks = {task['id']: start}
our_avail = 7.0
self.options.task_avail_delay = 500
self.time.return_value = start + 500
chk = self.tm.checkAvailDelay(task, bin_avail, our_avail)
self.assertEqual(chk, False)
# last, but less than delay
self.tm.skipped_tasks = {task['id']: start}
our_avail = 7.0
self.time.return_value = start + 499
chk = self.tm.checkAvailDelay(task, bin_avail, our_avail)
self.assertEqual(chk, True)
# median, but less than scaled delay
self.tm.skipped_tasks = {task['id']: start}
bin_avail = [10.0, 9.0, 8.0, 7.0, 6.0]
our_avail = 8.0
# rank = 2/4 = 0.5, so adjusted delay is 250
self.time.return_value = start + 249
chk = self.tm.checkAvailDelay(task, bin_avail, our_avail)
self.assertEqual(chk, True)
# median, but past scaled delay
self.tm.skipped_tasks = {task['id']: start}
bin_avail = [10.0, 9.0, 8.0, 7.0, 6.0]
our_avail = 8.0
# rank = 3/4 = 0.75, so adjusted delay is 250
self.time.return_value = start + 476
chk = self.tm.checkAvailDelay(task, bin_avail, our_avail)
self.assertEqual(chk, False)
# only one in bin
self.tm.skipped_tasks = {}
bin_avail = [5.0]
our_avail = 5.0
self.time.return_value = start
chk = self.tm.checkAvailDelay(task, bin_avail, our_avail)
self.assertEqual(chk, False)
def test_clean_delay_times(self):
self.options.task_avail_delay = 180 # same as default
# test no skipped entries
start = 10000
self.time.return_value = start + 100
self.tm.skipped_tasks = {}
self.tm.cleanDelayTimes()
self.assertEqual(self.tm.skipped_tasks, {})
# test all skipped entries
self.time.return_value = start + 5000
skipped = {}
for i in range(25):
skipped[i] = start + i
# all older than 180 in age
self.tm.skipped_tasks = skipped
self.tm.cleanDelayTimes()
self.assertEqual(self.tm.skipped_tasks, {})
# test mixed entries
skipped = {100: start + 5000}
expected = skipped.copy()
for i in range(25):
skipped[i] = start + i
# all older than 180 in age
self.tm.skipped_tasks = skipped
self.tm.cleanDelayTimes()
self.assertEqual(self.tm.skipped_tasks, expected)

View file

@ -0,0 +1,218 @@
from __future__ import absolute_import
import mock
import unittest
import koji.daemon
import koji
class TestGetNextTask(unittest.TestCase):
def setUp(self):
self.options = mock.MagicMock()
self.session = mock.MagicMock()
self.tm = koji.daemon.TaskManager(self.options, self.session)
self.tm.readyForTask = mock.MagicMock()
self.tm.takeTask = mock.MagicMock()
self.time = mock.patch('time.time').start()
def tearDown(self):
mock.patch.stopall()
def test_not_ready(self):
self.tm.readyForTask.return_value = False
retval = self.tm.getNextTask()
self.assertEqual(retval, False)
self.session.host.getTasks.assert_not_called()
self.tm.takeTask.assert_not_called()
def test_no_tasks(self):
self.tm.host_id = host_id = 999
self.tm.readyForTask.return_value = True
self.session.host.getTasks.return_value = []
retval = self.tm.getNextTask()
self.assertEqual(retval, False)
self.session.host.getTasks.assert_called_once()
self.tm.takeTask.assert_not_called()
def test_one_good_task(self):
self.tm.host_id = host_id = 999
self.tm.readyForTask.return_value = True
self.tm.tasks = {3: 'already running'}
tasks = [
{'id': 1, 'state': koji.TASK_STATES['FREE'], 'host_id': None}, # bad state
{'id': 2, 'state': koji.TASK_STATES['ASSIGNED'], 'host_id': 666}, # wrong host
{'id': 3, 'state': koji.TASK_STATES['ASSIGNED'], 'host_id': host_id}, # already in tasks
{'id': 4, 'state': koji.TASK_STATES['ASSIGNED'], 'host_id': host_id}, # good
]
self.session.host.getTasks.return_value = tasks
retval = self.tm.getNextTask()
self.assertEqual(retval, True)
self.session.host.getTasks.assert_called_once()
self.tm.takeTask.assert_called_once_with(tasks[3])
class TestTakeTask(unittest.TestCase):
def setUp(self):
self.options = mock.MagicMock()
self.session = mock.MagicMock()
self.tm = koji.daemon.TaskManager(self.options, self.session)
self.tm.readyForTask = mock.MagicMock()
self.tm.runTask = mock.MagicMock()
self.tm.forkTask = mock.MagicMock()
self.time = mock.patch('time.time').start()
self.handler = mock.MagicMock()
self.tm.handlers = {'fake': mock.MagicMock(return_value=self.handler)}
def tearDown(self):
mock.patch.stopall()
def test_simple_fork(self):
task = {
'id': 4,
'state': koji.TASK_STATES['ASSIGNED'],
'method': 'fake',
}
self.handler.Foreground = False
self.session.host.openTask.return_value = task
self.tm.forkTask.return_value = ['PID', 'SESSION']
retval = self.tm.takeTask(task)
self.handler.setManager.assert_not_called()
self.tm.runTask.assert_not_called()
self.tm.forkTask.assert_called_once_with(self.handler)
self.assertEqual(self.tm.pids, {4: 'PID'})
self.assertEqual(self.tm.subsessions, {4: 'SESSION'})
self.assertEqual(retval, True)
def test_simple_foreground(self):
task = {
'id': 4,
'state': koji.TASK_STATES['ASSIGNED'],
'method': 'fake',
}
self.handler.Foreground = True
self.session.host.openTask.return_value = task
retval = self.tm.takeTask(task)
self.handler.setManager.assert_called_once_with(self.tm)
self.tm.runTask.assert_called_once_with(self.handler)
self.tm.forkTask.assert_not_called()
self.assertEqual(self.tm.pids, {})
self.assertEqual(self.tm.subsessions, {})
self.assertEqual(retval, True)
def test_refuse_no_handler(self):
task = {
'id': 4,
'state': koji.TASK_STATES['ASSIGNED'],
'method': 'missing',
}
retval = self.tm.takeTask(task)
self.assertEqual(retval, False)
self.session.host.refuseTask.assert_called_once()
self.session.getTaskInfo.assert_not_called()
self.session.host.openTask.assert_not_called()
self.tm.runTask.assert_not_called()
self.tm.forkTask.assert_not_called()
def test_skip_no_request(self):
task = {
'id': 4,
'state': koji.TASK_STATES['ASSIGNED'],
'method': 'fake',
}
self.session.getTaskInfo.return_value = {}
retval = self.tm.takeTask(task)
self.assertEqual(retval, False)
self.session.host.openTask.assert_not_called()
self.tm.runTask.assert_not_called()
self.tm.forkTask.assert_not_called()
def test_skip_bad_check(self):
task = {
'id': 4,
'state': koji.TASK_STATES['ASSIGNED'],
'method': 'fake',
}
self.handler.checkHost.side_effect = Exception('should refuse')
retval = self.tm.takeTask(task)
self.assertEqual(retval, False)
self.session.host.refuseTask.assert_called_once()
self.session.host.openTask.assert_not_called()
self.tm.runTask.assert_not_called()
self.tm.forkTask.assert_not_called()
def test_open_fails(self):
task = {
'id': 4,
'state': koji.TASK_STATES['ASSIGNED'],
'method': 'fake',
}
self.session.host.openTask.return_value = None
retval = self.tm.takeTask(task)
self.assertEqual(retval, False)
self.session.host.openTask.assert_called_once()
self.tm.runTask.assert_not_called()
self.tm.forkTask.assert_not_called()
def test_set_weight_fails(self):
task = {
'id': 4,
'state': koji.TASK_STATES['ASSIGNED'],
'method': 'fake',
'request': '...',
'host_id': 999,
}
self.session.host.openTask.return_value = task
self.session.host.setTaskWeight.side_effect = koji.ActionNotAllowed('should skip')
task2 = task.copy()
task2['host_id'] = 42
self.session.getTaskInfo.side_effect = [task, task2]
retval = self.tm.takeTask(task)
self.assertEqual(retval, False)
self.session.host.openTask.assert_called_once()
self.tm.runTask.assert_not_called()
self.tm.forkTask.assert_not_called()
def test_set_weight_fails_state(self):
self.tm.host_id = 999
task = {
'id': 4,
'state': koji.TASK_STATES['ASSIGNED'],
'method': 'fake',
'request': '...',
'host_id': self.tm.host_id,
}
self.session.host.openTask.return_value = task
self.session.host.setTaskWeight.side_effect = koji.ActionNotAllowed('should skip')
task2 = task.copy()
task2['state'] = koji.TASK_STATES['FREE']
self.session.getTaskInfo.side_effect = [task, task2]
retval = self.tm.takeTask(task)
self.assertEqual(retval, False)
self.session.host.openTask.assert_called_once()
self.tm.runTask.assert_not_called()
self.tm.forkTask.assert_not_called()