import sh
import unittest
from unittest.mock import MagicMock
from steps import gsutil_setup


class TestGsutilSetup(unittest.TestCase):
    def setUp(self):
        self.init_step_mock()

        self.step.use_cache = True
        self.step.create_sstate_cache_dir = MagicMock()
        self.step.create_sources_dir = MagicMock()
        self.step.fetch_sstate_cache = MagicMock()
        self.step.fetch_sources = MagicMock()
        self.step.chown_sstate_cache = MagicMock()

        self.step.run_script()

    def init_step_mock(self):
        self.step = gsutil_setup.GsutilSetup()
        self.step.firmware_machine = "machine0"
        self.step.gcs_bucket = "a-bucket"

    def test_create_sstate_cache_dir(self):
        """Tests that sstate_cache_dir method is called"""
        self.step.create_sstate_cache_dir.assert_called_with()

    def test_create_sources_dir(self):
        """Tests that create_sources method is called"""
        self.step.create_sources_dir.assert_called_with()

    def test_fetch_sstate_cache(self):
        """Tests that fetch_sstate_cache method is called"""
        self.step.fetch_sstate_cache.assert_called_with()

    def test_fetch_sources(self):
        """Tests that fetch_sources method is called"""
        self.step.fetch_sources.assert_called_with()

    def test_disable_sstate_cache(self):
        """Tests the program state when use_cache=False"""
        self.init_step_mock()

        self.step.use_cache = False
        self.step.create_sstate_cache_dir = MagicMock()
        self.step.create_sources_dir = MagicMock()
        self.step.fetch_sstate_cache = MagicMock()
        self.step.fetch_sources = MagicMock()
        self.step.chown_sstate_cache = MagicMock()

        self.step.run_script()

        self.step.create_sstate_cache_dir.assert_not_called()
        self.step.create_sources_dir.assert_called_with()
        self.step.fetch_sstate_cache.assert_not_called()
        self.step.fetch_sources.assert_called_with()
        self.step.chown_sstate_cache.assert_not_called()

    def test_mkdir(self):
        """Tests the call order of the mkdir calls"""
        self.init_step_mock()
        self.step.fetch_sstate_cache = MagicMock()
        self.step.fetch_sources = MagicMock()
        self.step.chown_sstate_cache = MagicMock()
        self.step.use_cache = True
        sh.mkdir = MagicMock()

        self.step.run_script()

        actual_calls = sh.mkdir.call_args_list
        expected_calls = [(("-p", "build/machine0/sstate-cache"),),
                    (("-p", "build/sources"),),]

        self.assertEqual(actual_calls, expected_calls)

    def test_gsutil(self):
        """Tests the order in which gsutil is called, and their arguments"""
        self.init_step_mock()
        self.step.use_cache = True
        self.step.create_sstate_cache_dir = MagicMock()
        self.step.create_sources_dir = MagicMock()
        self.step.gsutil = MagicMock()
        self.step.chown_sstate_cache = MagicMock()

        self.step.run_script()

        actual_calls = self.step.gsutil.call_args_list
        expected_calls = [(("rsync", "gs://a-bucket/cache-unzip/machine0",
                    "build/machine0/sstate-cache"),),
                    (("rsync", "gs://a-bucket/sources", "build/sources"),)]

        self.assertEqual(actual_calls, expected_calls)

    def test_chown(self):
        """Tests that sh.chown is called with the right arguments when use_cache=True"""
        self.init_step_mock()
        self.step.use_cache = True
        self.step.create_sstate_cache_dir = MagicMock()
        self.step.create_sources_dir = MagicMock()
        self.step.fetch_sstate_cache = MagicMock()
        self.step.fetch_sources = MagicMock()
        sh.chown = MagicMock()

        self.step.run_script()

        sh.chown("-R", "build", "build/machine0/sstate-cache")

        self.step.chown_sstate_cache = MagicMock()

        self.step.run_script()

        self.step.chown_sstate_cache.assert_called_with()
