ut: cli - watch_tasks with KeyboardInterrupt
change display_tasklist_status() to _display_tasklist_status()
display_task_results() to _display_task_results()
This commit is contained in:
parent
2da05e9e59
commit
cab2b2ee69
2 changed files with 150 additions and 93 deletions
9
cli/koji
9
cli/koji
|
|
@ -394,7 +394,7 @@ class TaskWatcher(object):
|
|||
else:
|
||||
return koji.TASK_STATES[info['state']].lower()
|
||||
|
||||
def display_tasklist_status(tasks):
|
||||
def _display_tasklist_status(tasks):
|
||||
free = 0
|
||||
open = 0
|
||||
failed = 0
|
||||
|
|
@ -411,7 +411,7 @@ def display_tasklist_status(tasks):
|
|||
free += 1
|
||||
print " %d free %d open %d done %d failed" % (free, open, done, failed)
|
||||
|
||||
def display_task_results(tasks):
|
||||
def _display_task_results(tasks):
|
||||
for task in [task for task in tasks.values() if task.level == 0]:
|
||||
state = task.info['state']
|
||||
task_label = task.str()
|
||||
|
|
@ -448,7 +448,7 @@ def watch_tasks(session,tasklist,quiet=False):
|
|||
if changed:
|
||||
# task is done and state just changed
|
||||
if not quiet:
|
||||
display_tasklist_status(tasks)
|
||||
_display_tasklist_status(tasks)
|
||||
if not task.is_success():
|
||||
rv = 1
|
||||
for child in session.getTaskChildren(task_id):
|
||||
|
|
@ -462,7 +462,7 @@ def watch_tasks(session,tasklist,quiet=False):
|
|||
if all_done:
|
||||
if not quiet:
|
||||
print
|
||||
display_task_results(tasks)
|
||||
_display_task_results(tasks)
|
||||
break
|
||||
|
||||
sys.stdout.flush()
|
||||
|
|
@ -476,6 +476,7 @@ def watch_tasks(session,tasklist,quiet=False):
|
|||
"""Tasks still running. You can continue to watch with the '%s watch-task' command.
|
||||
Running Tasks:
|
||||
%s""" % (progname, '\n'.join(tlist))
|
||||
sys.stdout.flush()
|
||||
rv = 1
|
||||
return rv
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
import unittest
|
||||
|
||||
import os
|
||||
import sys
|
||||
import StringIO as stringio
|
||||
|
||||
import mock
|
||||
|
|
@ -38,12 +40,10 @@ class TestWatchTasks(unittest.TestCase):
|
|||
|
||||
@mock.patch('sys.stdout', new_callable=stringio.StringIO)
|
||||
@mock.patch('koji_cli.TaskWatcher')
|
||||
@mock.patch('koji_cli.display_tasklist_status')
|
||||
@mock.patch('koji_cli.display_task_results')
|
||||
@mock.patch('koji_cli._display_tasklist_status')
|
||||
@mock.patch('koji_cli._display_task_results')
|
||||
def test_watch_tasks(self, dtrMock, dtsMock, twClzMock, stdout):
|
||||
self.options.poll_interval = 0
|
||||
global options
|
||||
option = self.options
|
||||
manager = mock.MagicMock()
|
||||
manager.attach_mock(twClzMock, 'TaskWatcherMock')
|
||||
manager.attach_mock(dtrMock, 'display_task_results_mock')
|
||||
|
|
@ -82,92 +82,148 @@ class TestWatchTasks(unittest.TestCase):
|
|||
actual, "Watching tasks (this may be safely interrupted)...\n\n")
|
||||
self.assertEqual(rv, 1)
|
||||
self.assertEqual(manager.mock_calls,
|
||||
[call.TaskWatcherMock(0, self.session, quiet=False),
|
||||
call.TaskWatcherMock(1, self.session, quiet=False),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.TaskWatcherMock(11, self.session, 1, quiet=False),
|
||||
call.tw11.update(),
|
||||
call.TaskWatcherMock(12, self.session, 1, quiet=False),
|
||||
call.tw12.update(),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.tw1.is_success(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw11.update(),
|
||||
call.tw11.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw11.is_success(),
|
||||
call.sessionMock.getTaskChildren(11),
|
||||
call.tw12.update(),
|
||||
call.tw12.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw12.is_success(),
|
||||
call.sessionMock.getTaskChildren(12),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw11.update(),
|
||||
call.tw11.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw11.is_success(),
|
||||
call.sessionMock.getTaskChildren(11),
|
||||
call.tw12.update(),
|
||||
call.tw12.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw12.is_success(),
|
||||
call.sessionMock.getTaskChildren(12),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw1.is_success(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw11.update(),
|
||||
call.tw11.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw11.is_success(),
|
||||
call.sessionMock.getTaskChildren(11),
|
||||
call.tw12.update(),
|
||||
call.tw12.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw12.is_success(),
|
||||
call.sessionMock.getTaskChildren(12),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw1.is_success(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw2.is_success(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw11.update(),
|
||||
call.tw11.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw11.is_success(),
|
||||
call.sessionMock.getTaskChildren(11),
|
||||
call.tw12.update(),
|
||||
call.tw12.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw12.is_success(),
|
||||
call.sessionMock.getTaskChildren(12),
|
||||
call.display_task_results_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12})
|
||||
])
|
||||
[call.TaskWatcherMock(0, self.session, quiet=False),
|
||||
call.TaskWatcherMock(1, self.session, quiet=False),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.TaskWatcherMock(11, self.session, 1, quiet=False),
|
||||
call.tw11.update(),
|
||||
call.TaskWatcherMock(12, self.session, 1, quiet=False),
|
||||
call.tw12.update(),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.tw1.is_success(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw11.update(),
|
||||
call.tw11.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw11.is_success(),
|
||||
call.sessionMock.getTaskChildren(11),
|
||||
call.tw12.update(),
|
||||
call.tw12.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw12.is_success(),
|
||||
call.sessionMock.getTaskChildren(12),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw11.update(),
|
||||
call.tw11.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw11.is_success(),
|
||||
call.sessionMock.getTaskChildren(11),
|
||||
call.tw12.update(),
|
||||
call.tw12.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw12.is_success(),
|
||||
call.sessionMock.getTaskChildren(12),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw1.is_success(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw11.update(),
|
||||
call.tw11.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw11.is_success(),
|
||||
call.sessionMock.getTaskChildren(11),
|
||||
call.tw12.update(),
|
||||
call.tw12.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw12.is_success(),
|
||||
call.sessionMock.getTaskChildren(12),
|
||||
call.tw1.update(),
|
||||
call.tw1.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw1.is_success(),
|
||||
call.sessionMock.getTaskChildren(0),
|
||||
call.tw2.update(),
|
||||
call.tw2.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw2.is_success(),
|
||||
call.sessionMock.getTaskChildren(1),
|
||||
call.tw11.update(),
|
||||
call.tw11.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw11.is_success(),
|
||||
call.sessionMock.getTaskChildren(11),
|
||||
call.tw12.update(),
|
||||
call.tw12.is_done(),
|
||||
call.display_tasklist_status_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12}),
|
||||
call.tw12.is_success(),
|
||||
call.sessionMock.getTaskChildren(12),
|
||||
call.display_task_results_mock({0: tw1, 1: tw2, 11: manager.tw11, 12: manager.tw12})
|
||||
])
|
||||
|
||||
@mock.patch('sys.stdout', new_callable=stringio.StringIO)
|
||||
@mock.patch('koji_cli.TaskWatcher')
|
||||
@mock.patch('koji_cli._display_tasklist_status')
|
||||
@mock.patch('koji_cli._display_task_results')
|
||||
def test_watch_tasks_with_keyboardinterrupt(
|
||||
self, dtrMock, dtsMock, twClzMock, stdout):
|
||||
"""Raise KeyboardInterrupt inner watch_tasks.
|
||||
Raising it by SIGNAL might be better"""
|
||||
self.options.poll_interval = 0
|
||||
manager = mock.MagicMock()
|
||||
manager.attach_mock(twClzMock, 'TaskWatcherMock')
|
||||
manager.attach_mock(dtrMock, 'display_task_results_mock')
|
||||
manager.attach_mock(dtsMock, 'display_tasklist_status_mock')
|
||||
tw1 = manager.tw1
|
||||
tw1.level = 0
|
||||
tw1.is_done.side_effect = [False, KeyboardInterrupt, False]
|
||||
tw1.update.side_effect = [False, False]
|
||||
tw1.is_success.return_value = False
|
||||
tw1.str.return_value = 'tw1'
|
||||
tw1.display_state.return_value = 'tw1.display_state'
|
||||
tw2 = manager.tw2
|
||||
tw2.level = 0
|
||||
tw2.is_done.side_effect = [False, False, False, False, True]
|
||||
tw2.update.side_effect = [True, False, False, True, True]
|
||||
tw2.is_success.return_value = False
|
||||
tw2.str.return_value = 'tw2'
|
||||
tw2.display_state.return_value = 'tw2.display_state'
|
||||
self.session.getTaskChildren.side_effect = lambda p: [
|
||||
{'id': 11}, {'id': 12}] if (0 == p) else []
|
||||
manager.attach_mock(self.session, 'sessionMock')
|
||||
|
||||
def side_effect(*args, **kwargs):
|
||||
rt = None
|
||||
if args[0] not in range(2):
|
||||
rt = mock.MagicMock()
|
||||
rt.level = args[2]
|
||||
rt.is_done.return_value = True
|
||||
rt.update.return_value = True
|
||||
rt.is_success.return_value = True
|
||||
manager.attach_mock(rt, 'tw' + str(args[0]))
|
||||
else:
|
||||
rt = {0: tw1, 1: tw2}.get(args[0])
|
||||
return rt
|
||||
|
||||
twClzMock.side_effect = side_effect
|
||||
|
||||
cli.watch_tasks(self.session, range(2), quiet=False)
|
||||
|
||||
actual = stdout.getvalue()
|
||||
self.assertMultiLineEqual(
|
||||
actual, """Watching tasks (this may be safely interrupted)...
|
||||
Tasks still running. You can continue to watch with the '%s watch-task' command.
|
||||
Running Tasks:
|
||||
tw1: tw1.display_state
|
||||
tw2: tw2.display_state
|
||||
""" % (os.path.basename(sys.argv[0]) or 'koji') )
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue