#!/usr/bin/env fuchsia-vendored-python
# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit-tests for remote_services_utils.py functions."""

import os
import sys
import tempfile
import unittest
from pathlib import Path

# Import regenerator.py as a module.
_SCRIPT_DIR = os.path.dirname(__file__)
sys.path.insert(0, _SCRIPT_DIR)
import remote_services_utils


class RemoteServicesUtilsTest(unittest.TestCase):
    def setUp(self):
        self._td = tempfile.TemporaryDirectory()
        self._dir = Path(self._td.name)
        self.source_dir = self._dir / "source"
        self.source_dir.mkdir()

        self.cfg_file1 = (
            self.source_dir / remote_services_utils.RBE_CONFIG_FILES[0]
        )
        self.cfg_file2 = (
            self.source_dir / remote_services_utils.RBE_CONFIG_FILES[1]
        )

        self.cfg_file1.parent.mkdir(parents=True)
        self.cfg_file1.write_text(
            "\n" + "# foo=bar\n"  # empty line  # comment line should be ignored
            "instance=projects/test_project_name/instances/test_instance_name\n"
        )

        self.cfg_file2.parent.mkdir(exist_ok=True)
        self.cfg_file2.write_text(
            "platform=container-image=docker://gcr.io/test_project/debian11,something_else\n"
        )

    def tearDown(self):
        self._td.cleanup()

    def test_generate_rbe_config(self):
        config_dict, input_files = remote_services_utils.generate_rbe_config(
            self.source_dir
        )
        self.assertDictEqual(
            config_dict,
            {
                "instance": "projects/test_project_name/instances/test_instance_name",
                "platform": "container-image=docker://gcr.io/test_project/debian11,something_else",
            },
        )
        self.assertSetEqual(input_files, set([self.cfg_file1, self.cfg_file2]))

    def test_generate_rbe_template_substitutions(self):
        _TEST_CASES = [
            {
                "name": "simple_project",
                "config_dict": {
                    "instance": "projects/test_project1/instances/1",
                    "platform": "foo=bar,container-image=docker://something/else,zoo=qux",
                },
                "remote_download_outputs": "all",
                "expected": {
                    "remote_download_outputs": "all",
                    "remote_instance_name": "projects/test_project1/instances/1",
                    "rbe_project": "test_project1",
                    "container_image": "docker://something/else",
                },
            },
        ]
        for test_case in _TEST_CASES:
            msg = f'For {test_case["name"]} case'
            result = remote_services_utils.generate_rbe_template_substitutions(
                test_case["config_dict"], test_case["remote_download_outputs"]
            )
            self.assertDictEqual(result, test_case["expected"], msg=msg)

    def test_generate_remote_services_bazelrc(self):
        output_file = self._dir / "remote_services.bazelrc"

        template_file = (
            self.source_dir / remote_services_utils.RBE_TEMPLATE_FILE
        )
        template_file.parent.mkdir(parents=True)
        template_file.write_text(
            r"""# AUTO-GENERATED
my_download_outputs={remote_download_outputs}
my_remote_instance_name={remote_instance_name}
my_rbe_project={rbe_project}
my_container_image={container_image}
"""
        )

        input_files = remote_services_utils.generate_remote_services_bazelrc(
            fuchsia_dir=self.source_dir,
            output_path=output_file,
            download_outputs="find-me",
        )

        self.assertEqual(
            output_file.read_text(),
            """# AUTO-GENERATED
my_download_outputs=find-me
my_remote_instance_name=projects/test_project_name/instances/test_instance_name
my_rbe_project=test_project_name
my_container_image=docker://gcr.io/test_project/debian11
""",
        )

        self.assertSetEqual(
            input_files, {template_file, self.cfg_file1, self.cfg_file2}
        )


if __name__ == "__main__":
    unittest.main()
