110 lines
4.1 KiB
Python
110 lines
4.1 KiB
Python
from unittest import mock
|
|
import xmlrpc.client
|
|
import unittest
|
|
|
|
import koji
|
|
import kojihub
|
|
|
|
|
|
QP = kojihub.QueryProcessor
|
|
|
|
|
|
class TestTaskWaitResults(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
self.context = mock.patch('kojihub.kojihub.context').start()
|
|
self.host_id = 99
|
|
self.context.session.getHostId.return_value = self.host_id
|
|
self.host_exports = kojihub.Host(self.host_id)
|
|
self.host_exports.taskUnwait = mock.MagicMock()
|
|
self.Task = mock.patch('kojihub.kojihub.Task', side_effect=self.getTask).start()
|
|
self.tasks = {}
|
|
self.queries = []
|
|
self.execute = mock.MagicMock()
|
|
self.QueryProcessor = mock.patch('kojihub.kojihub.QueryProcessor',
|
|
side_effect=self.get_query).start()
|
|
|
|
def tearDown(self):
|
|
mock.patch.stopall()
|
|
|
|
def getTask(self, task_id):
|
|
if task_id in self.tasks:
|
|
return self.tasks[task_id]
|
|
task = mock.MagicMock()
|
|
task.id = task_id
|
|
self.tasks[task_id] = task
|
|
return task
|
|
|
|
def get_query(self, *args, **kwargs):
|
|
query = QP(*args, **kwargs)
|
|
query.execute = self.execute
|
|
self.queries.append(query)
|
|
return query
|
|
|
|
def test_basic(self):
|
|
parent = 1
|
|
task_ids = [5, 6, 7]
|
|
for t in task_ids:
|
|
task = self.getTask(t)
|
|
task.getResult.return_value = "OK"
|
|
task.isCanceled.return_value = False
|
|
results = self.host_exports.taskWaitResults(parent, task_ids)
|
|
expect = [[t, "OK"] for t in task_ids]
|
|
self.assertEqual(results, expect)
|
|
self.assertEqual(self.queries, [])
|
|
self.host_exports.taskUnwait.assert_called_with(parent)
|
|
|
|
def test_error(self):
|
|
"""Ensure that errors is propagated when they should be"""
|
|
parent = 1
|
|
task_ids = [5, 6, 7]
|
|
for t in task_ids:
|
|
task = self.getTask(t)
|
|
task.getResult.return_value = "OK"
|
|
task.isCanceled.return_value = False
|
|
self.tasks[6].getResult.side_effect = xmlrpc.client.Fault(1, "error")
|
|
with self.assertRaises(xmlrpc.client.Fault):
|
|
results = self.host_exports.taskWaitResults(parent, task_ids)
|
|
self.assertEqual(results, [])
|
|
self.tasks[6].getResult.side_effect = koji.GenericError('problem')
|
|
with self.assertRaises(koji.GenericError):
|
|
results = self.host_exports.taskWaitResults(parent, task_ids)
|
|
self.assertEqual(results, [])
|
|
self.assertEqual(self.queries, [])
|
|
|
|
def test_canfail_canceled(self):
|
|
"""Canceled canfail tasks should not raise exceptions"""
|
|
parent = 1
|
|
task_ids = [5, 6, 7]
|
|
canfail = [7]
|
|
for t in task_ids:
|
|
task = self.getTask(t)
|
|
task.getResult.return_value = "OK"
|
|
task.isCanceled.return_value = False
|
|
self.tasks[7].getResult.side_effect = koji.GenericError('canceled')
|
|
self.tasks[7].isCanceled.return_value = True
|
|
results = self.host_exports.taskWaitResults(parent, task_ids, canfail=canfail)
|
|
expect_f = {'faultCode': koji.GenericError.faultCode,
|
|
'faultString': 'canceled'}
|
|
expect = [[5, "OK"], [6, "OK"], [7, expect_f]]
|
|
self.assertEqual(results, expect)
|
|
self.host_exports.taskUnwait.assert_called_with(parent)
|
|
self.assertEqual(self.queries, [])
|
|
|
|
def test_all_tasks(self):
|
|
"""Canceled canfail tasks should not raise exceptions"""
|
|
parent = 1
|
|
task_ids = [5, 6, 7]
|
|
self.execute.return_value = [[t] for t in task_ids]
|
|
for t in task_ids:
|
|
task = self.getTask(t)
|
|
task.getResult.return_value = "OK"
|
|
task.isCanceled.return_value = False
|
|
results = self.host_exports.taskWaitResults(parent, None)
|
|
expect = [[t, "OK"] for t in task_ids]
|
|
self.assertEqual(results, expect)
|
|
self.host_exports.taskUnwait.assert_called_with(parent)
|
|
self.assertEqual(len(self.queries), 1)
|
|
query = self.queries[0]
|
|
self.assertEqual(query.tables, ['task'])
|
|
self.assertEqual(query.columns, ['id'])
|