| """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() |