blob: 11724e6b9f4f47fe09666a74476e51101c846e3b [file]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2026 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 bazel_repository_utils.py."""
import json
import sys
import tempfile
import unittest
from pathlib import Path
_SCRIPT_DIR = Path(__file__).parent
sys.path.insert(0, str(_SCRIPT_DIR))
from bazel_repository_utils import BazelRootRepoMapping
from build_utils import BazelLauncher, BazelPaths, MockCommandRunner
class BazelRootRepoMappingTest(unittest.TestCase):
def setUp(self) -> None:
self._td = tempfile.TemporaryDirectory()
self.tmp_dir = Path(self._td.name)
self.fuchsia_dir = self.tmp_dir / "fuchsia"
self.fuchsia_dir.mkdir()
(self.fuchsia_dir / ".jiri_manifest").write_text("")
self.build_dir = self.fuchsia_dir / "out" / "default"
self.build_dir.mkdir(parents=True)
BazelPaths.write_topdir_config_for_test(
self.fuchsia_dir, "gen/build/bazel"
)
self.bazel_paths = BazelPaths(self.fuchsia_dir, self.build_dir)
def tearDown(self) -> None:
self._td.cleanup()
def test_new_from_bazel_success(self) -> None:
mock_runner = MockCommandRunner()
sample_output = json.dumps(
{
"rules_fuchsia": "rules_fuchsia+",
"": "",
"main": "",
"zlib": "zlib+",
"fuchsia_sdk": "rules_fuchsia++fuchsia_sdk_ext+fuchsia_sdk",
}
)
mock_runner.push_result(returncode=0, stdout=sample_output)
launcher = BazelLauncher(launcher_script="bazel", runner=mock_runner)
repo_mapping = BazelRootRepoMapping.new_from_bazel(launcher)
expected = {
"rules_fuchsia": "rules_fuchsia+",
"zlib": "zlib+",
"fuchsia_sdk": "rules_fuchsia++fuchsia_sdk_ext+fuchsia_sdk",
}
self.assertEqual(repo_mapping.get_mapping(), expected)
self.assertEqual(
repo_mapping.get_canonical_name("rules_fuchsia"), "rules_fuchsia+"
)
self.assertIsNone(repo_mapping.get_canonical_name("non_existent"))
self.assertEqual(
repo_mapping.get_apparent_name("rules_fuchsia+"), "rules_fuchsia"
)
self.assertEqual(
repo_mapping.get_apparent_name(
"rules_fuchsia++fuchsia_sdk_ext+fuchsia_sdk"
),
"fuchsia_sdk",
)
self.assertIsNone(repo_mapping.get_apparent_name("non_existent+"))
self.assertIn("rules_fuchsia", repo_mapping)
self.assertNotIn("main", repo_mapping)
self.assertNotIn("", repo_mapping)
self.assertEqual(repo_mapping["zlib"], "zlib+")
self.assertEqual(len(repo_mapping), 3)
self.assertEqual(
list(iter(repo_mapping)), ["rules_fuchsia", "zlib", "fuchsia_sdk"]
)
def test_new_from_bazel_failure(self) -> None:
mock_runner = MockCommandRunner()
mock_runner.push_result(returncode=1, stderr="Bazel failed")
launcher = BazelLauncher(launcher_script="bazel", runner=mock_runner)
with self.assertRaises(RuntimeError):
BazelRootRepoMapping.new_from_bazel(launcher)
def test_new_from_bazel_invalid_json(self) -> None:
mock_runner = MockCommandRunner()
mock_runner.push_result(returncode=0, stdout="not valid json")
launcher = BazelLauncher(launcher_script="bazel", runner=mock_runner)
with self.assertRaises(RuntimeError):
BazelRootRepoMapping.new_from_bazel(launcher)
def test_save_and_load_from_disk(self) -> None:
mock_runner = MockCommandRunner()
sample_output = json.dumps(
{
"rules_fuchsia": "rules_fuchsia+",
"": "",
"main": "",
"zlib": "zlib+",
}
)
mock_runner.push_result(returncode=0, stdout=sample_output)
launcher = BazelLauncher(launcher_script="bazel", runner=mock_runner)
repo_mapping = BazelRootRepoMapping.new_from_bazel(launcher)
expected_path = (
self.build_dir / "regenerator_outputs" / "root_repo_mapping.json"
)
self.assertEqual(
BazelRootRepoMapping.get_cache_path(self.build_dir),
expected_path,
)
cache_path = repo_mapping.save_to_disk(self.build_dir)
self.assertEqual(cache_path, expected_path)
self.assertTrue(expected_path.exists())
# Load back from disk with new_from_build_dir
loaded_mapping = BazelRootRepoMapping.new_from_build_dir(self.build_dir)
self.assertEqual(
loaded_mapping.get_mapping(),
{"rules_fuchsia": "rules_fuchsia+", "zlib": "zlib+"},
)
def test_load_from_disk_missing(self) -> None:
with self.assertRaises(FileNotFoundError):
BazelRootRepoMapping.new_from_build_dir(self.build_dir)
if __name__ == "__main__":
unittest.main()