blob: 2784650327d44d690715e811e297b91eb1d9d36b [file] [log] [blame] [edit]
"""Tests for the bot_setup module."""
import os
import shutil
import subprocess
import tempfile
import unittest
from catatester.devicemap import bot_setup
try:
from unittest import mock
except ImportError:
import mock
_STARTUP_SCRIPTS_PATH = 'startup_scripts'
class BotSetupTest(unittest.TestCase):
"""Tests for the methods in bot_setup module."""
def setUp(self):
self._swarm_bots_home = tempfile.mkdtemp()
self.addCleanup(self.cleanUp)
self.addCleanup(mock.patch.stopall)
self._mock_subprocess_call = mock.patch(
'subprocess.call', autospec=True, spec_set=True).start()
self._mock_copy_file = mock.patch(
'shutil.copy', autospec=True, spec_set=True).start()
self._mock_create_file = mock.patch(
'catatester.devicemap.bot_setup._CreateFile',
autospec=True, spec_set=True).start()
self._mock_update_file_mode = mock.patch(
'catatester.devicemap.bot_setup._UpdateFilePermissions',
autospec=True, spec_set=True).start()
def cleanUp(self):
shutil.rmtree(self._swarm_bots_home)
def testSetupBotsCreatesNewDirCopiesFileAndStartsService(self):
"""Validates setup_bot method can successfully start bot service."""
self._mock_subprocess_call.side_effect = [0, 1, 0]
bot_num = 2
bot_setup.SetupBot(
bot_num=bot_num,
user='mock_user',
group='mock_group',
swarm_bots_home=self._swarm_bots_home,
swarm_bot_prefix='mock_swarm_bot_prefix',
swarm_zip_path='mock_swarm_zip_path',
gsutil_dir='mock_gsutil_dir',
gsutil_boto='mock_gsutil_boto',
fragglerock_key='mock_fragglerock_key',
eurtest_binaries='mock_eurtest_binaries',
venv='mock_venv',
devicemap_dir='mock_devicemap_dir',
depot_tools_dir='mock_depot_tools'
)
self.assertEqual(
1, len(os.listdir(self._swarm_bots_home)), 'Bot directory not created.')
self.assertTrue(
os.path.isdir(os.path.join(self._swarm_bots_home, str(bot_num))),
'Bot directory not created.')
expected_systemd_file_path = (
'/etc/systemd/system/mock_swarm_bot_prefix%s.service' % bot_num)
expected_sh_path = (
os.path.join(
self._swarm_bots_home, _STARTUP_SCRIPTS_PATH,
'mock_swarm_bot_prefix%s_startup.sh' % bot_num))
self._mock_create_file.assert_has_calls([
mock.call(
file_path=expected_sh_path, content=mock.ANY,
owner='mock_user', group='mock_group', mode=508),
mock.call(
file_path=expected_systemd_file_path, content=mock.ANY,
owner='root', group='root', mode=420)
])
self._mock_subprocess_call.assert_has_calls([
mock.call(['systemctl', 'daemon-reload']),
mock.call([
'systemctl', 'is-active', '--quiet',
'mock_swarm_bot_prefix%s' % bot_num
]),
mock.call([
'systemctl', 'start', 'mock_swarm_bot_prefix%s' % bot_num])
])
self._mock_update_file_mode.assert_has_calls([
mock.call(mock.ANY, 'mock_user', 'mock_group', 508),
mock.call('mock_swarm_zip_path', 'mock_user', 'mock_group', 508)
])
def testBotServiceNotRestartedIfItsRunning(self):
"""Validates setup_bot doesn't restart an already running bot service."""
self._mock_subprocess_call.side_effect = [0, 0]
bot_setup.SetupBot(
bot_num=1,
user='mock_user',
group='mock_group',
swarm_bots_home=self._swarm_bots_home,
swarm_bot_prefix='mock_swarm_bot_prefix',
swarm_zip_path='mock_swarm_zip_path',
gsutil_dir='mock_gsutil_dir',
gsutil_boto='mock_gsutil_boto',
fragglerock_key='mock_fragglerock_key',
eurtest_binaries='mock_eurtest_binaries',
venv='mock_venv',
devicemap_dir='mock_devicemap_dir',
depot_tools_dir='mock_depot_tools')
self._mock_subprocess_call.assert_called_with([
'systemctl', 'is-active', '--quiet', 'mock_swarm_bot_prefix1'])
if __name__ == '__main__':
unittest.main()