import sh
import unittest
from unittest.mock import MagicMock
from steps import metadata_setup
import inspect

class TestMetadataSetup(unittest.TestCase):
    def setUp(self):
        self.step = metadata_setup.MetadataSetup()
        self.step.append_sources_mirror_urls = MagicMock()
        self.step.omit_crashdump = MagicMock()
        self.step.replace_downstream_url = MagicMock()
        self.step.run_script()

    def init_step(self):
        self.step.firmware_machine = "machine0"
        self.step.metadata_obmc_repo = "repo0"
        self.step.metadata_repo = "repo1"
        self.step.build_script_dir = "path/to/volume"
        self.step.main_repo_name = "repo3"

    def test_append_sources_mirror_urls(self):
        """Tests that run_script calls append_sources_mirror_urls"""
        self.step.append_sources_mirror_urls.assert_called_with()

    def test_omit_crashdump(self):
        """Tests that run_script calls omit_crashdump"""
        self.step.omit_crashdump.assert_called_with()

    def test_replace_downstream_url(self):
        """Tests that run_script calls replace_downstream_url"""
        self.step.replace_downstream_url.assert_called_with()

    def test_sh_sh(self):
        """Tests sh.sh executes the the right commands in the right order"""
        self.step = metadata_setup.MetadataSetup()
        self.init_step()
        sh.sh = MagicMock()
        self.step.run_script()

        actual_calls = sh.sh.call_args_list

        call0 = inspect.cleandoc(
            f"""
            cat << EOT >> build/{self.step.firmware_machine}/conf/local.conf
            INHERIT += "own-mirrors"
            CONNECTIVITY_CHECK_URIS = ""
            BB_NO_NETWORK = "0"
            # Allow fetching external mirrors
            BB_ALLOWED_NETWORKS = ""
            BB_GENERATE_MIRROR_TARBALLS = "1"
            SOURCE_MIRROR_URL = "file://{self.step.build_script_dir}/{self.step.main_repo_name}/build/sources"
            BB_NUMBER_THREADS = "16"
            EOT
            """)

        call1 = inspect.cleandoc(
            f"""
            # Omit crashdump and at-scale-debug.
            # They are tested in the gBMC version of presubmit.
            cat << EOT >> {self.step.metadata_obmc_repo}/{self.step.metadata_repo}/recipes-phosphor/images/obmc-phosphor-image.bbappend
            OBMC_IMAGE_EXTRA_INSTALL:remove:{self.step.firmware_machine} = " at-scale-debug"
            OBMC_IMAGE_EXTRA_INSTALL:remove:{self.step.firmware_machine} = " crashdump"
            EOT
            """)

        call2 =     "find meta* -type f -exec sed -i \
                    's/\.git\.corp\.google/\.googlesource/;\s/protocol=sso/protocol=https/' {} \;"

        expected_calls = [(("-c", call0),), (("-c", call1),), (("-c", call2),)]

        self.assertEqual(actual_calls, expected_calls)
