92 lines
3 KiB
Python
92 lines
3 KiB
Python
from __future__ import absolute_import
|
|
|
|
import os.path
|
|
import shutil
|
|
import signal
|
|
import tempfile
|
|
import time
|
|
import unittest
|
|
|
|
try:
|
|
from unittest import mock
|
|
except ImportError:
|
|
import mock
|
|
import pytest
|
|
|
|
import koji
|
|
|
|
from . import loadkojira
|
|
|
|
kojira = loadkojira.kojira
|
|
|
|
|
|
class MyError(Exception):
|
|
"""sentinel exception"""
|
|
pass
|
|
|
|
|
|
class MainTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
self.start_thread = mock.patch.object(kojira, 'start_thread').start()
|
|
self.repomgr = mock.MagicMock()
|
|
self.RepoManager = mock.patch.object(kojira, 'RepoManager', return_value=self.repomgr).start()
|
|
self.session = mock.MagicMock()
|
|
self.options = mock.MagicMock()
|
|
self.options.sleeptime = 1
|
|
self.workdir = tempfile.mkdtemp()
|
|
self.topdir = self.workdir + '/koji'
|
|
self.pathinfo = koji.PathInfo(self.topdir)
|
|
mock.patch.object(kojira, 'pathinfo', create=True, new=self.pathinfo).start()
|
|
self.logger = mock.patch.object(kojira, 'logger', create=True).start()
|
|
self.sleep = mock.patch('time.sleep').start()
|
|
self.signal = mock.patch('signal.signal').start()
|
|
|
|
def tearDown(self):
|
|
mock.patch.stopall()
|
|
shutil.rmtree(self.workdir)
|
|
|
|
def test_userkill1(self):
|
|
self.sleep.side_effect = [None] * 10 + [KeyboardInterrupt()]
|
|
with self.assertRaises(SystemExit) as ex:
|
|
kojira.main(self.options, self.session)
|
|
self.assertEqual(ex.exception.code, 0)
|
|
|
|
def test_terminal_errors(self):
|
|
for cls in KeyboardInterrupt, koji.AuthExpired, koji.AuthError, SystemExit:
|
|
err = cls()
|
|
self.sleep.side_effect = [None] * 10 + [Exception()]
|
|
self.repomgr.updateRepos.side_effect = [None] * 5 + [err]
|
|
with self.assertRaises(SystemExit):
|
|
kojira.main(self.options, self.session)
|
|
self.assertEqual(len(self.repomgr.pruneLocalRepos.mock_calls), 5)
|
|
self.repomgr.reset_mock()
|
|
|
|
def test_nonterminal_error(self):
|
|
err = MyError()
|
|
self.sleep.side_effect = [None] * 10 + [KeyboardInterrupt()]
|
|
self.repomgr.updateRepos.side_effect = [None] * 5 + [err] * 6
|
|
with self.assertRaises(SystemExit) as ex:
|
|
kojira.main(self.options, self.session)
|
|
self.assertEqual(ex.exception.code, 0)
|
|
self.assertEqual(len(self.repomgr.updateRepos.mock_calls), 11)
|
|
self.assertEqual(len(self.repomgr.pruneLocalRepos.mock_calls), 5)
|
|
self.repomgr.reset_mock()
|
|
|
|
def test_shutdown_handler(self):
|
|
self.signal.side_effect = [Exception('stop here')]
|
|
with self.assertRaises(Exception):
|
|
kojira.main(self.options, self.session)
|
|
|
|
# grab the handler
|
|
self.assertEqual(self.signal.mock_calls[0][1][0], signal.SIGTERM)
|
|
handler = self.signal.mock_calls[0][1][1]
|
|
|
|
self.signal.side_effect = None
|
|
|
|
# make sure the handler does what it should
|
|
with self.assertRaises(SystemExit):
|
|
handler()
|
|
|
|
|
|
# the end
|