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