blob: c3fc1032b75027c2d72c412655f4454788a985da [file]
# 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.
import pathlib
import tempfile
import unittest
import path_normalizer
class MockBazelPaths:
def __init__(
self, fuchsia_dir: pathlib.Path, build_dir: pathlib.Path
) -> None:
self.fuchsia_dir = fuchsia_dir
self.ninja_build_dir = build_dir
self.top_dir = build_dir / "gen/build/bazel"
self.output_base = self.top_dir / "output_base"
self.workspace = self.top_dir / "workspace"
self.execroot = self.output_base / "execroot" / "_main"
self.launcher = self.top_dir / "bazel"
class PathNormalizerTest(unittest.TestCase):
def setUp(self) -> None:
self.temp_dir = tempfile.TemporaryDirectory()
self.fuchsia_dir = pathlib.Path(self.temp_dir.name) / "fuchsia"
self.build_dir = self.fuchsia_dir / "out" / "default"
self.fuchsia_dir.mkdir(parents=True)
self.build_dir.mkdir(parents=True)
self.gn_normalizer = path_normalizer.GnPathNormalizer(
self.fuchsia_dir, self.build_dir
)
mock_bazel_paths = MockBazelPaths(self.fuchsia_dir, self.build_dir)
self.bazel_normalizer = path_normalizer.BazelPathNormalizer(
mock_bazel_paths
)
def tearDown(self) -> None:
self.temp_dir.cleanup()
def test_gn_path_normalizer(self) -> None:
# Relative source root paths
self.assertEqual(
self.gn_normalizer.normalize_path("../../src/foo.cc"),
"{SOURCE_ROOT}/src/foo.cc",
)
self.assertEqual(
self.gn_normalizer.normalize_path("../.."),
"{SOURCE_ROOT}",
)
# Relative out root
self.assertEqual(
self.gn_normalizer.normalize_path(".."),
"{OUT_ROOT}",
)
self.assertEqual(
self.gn_normalizer.normalize_path("../obj/foo"),
"{OUT_ROOT}/obj/foo",
)
# Relative build dir / current dir
self.assertEqual(
self.gn_normalizer.normalize_path("."),
"{BUILD_DIR}",
)
self.assertEqual(
self.gn_normalizer.normalize_path("./obj/foo.o"),
"obj/foo.o",
)
# Absolute paths
self.assertEqual(
self.gn_normalizer.normalize_path(str(self.fuchsia_dir)),
"{SOURCE_ROOT}",
)
self.assertEqual(
self.gn_normalizer.normalize_path(
str(self.fuchsia_dir / "src/foo.cc")
),
"{SOURCE_ROOT}/src/foo.cc",
)
self.assertEqual(
self.gn_normalizer.normalize_path(str(self.build_dir)),
"{BUILD_DIR}",
)
self.assertEqual(
self.gn_normalizer.normalize_path(
str(self.build_dir / "obj/foo.o")
),
"obj/foo.o",
)
# Unresolved ../ should raise ValueError
with self.assertRaises(ValueError):
self.gn_normalizer.normalize_path("../../../outside/file.txt")
def test_bazel_path_normalizer(self) -> None:
# Relative paths in execroot
self.assertEqual(
self.bazel_normalizer.normalize_path("src/foo.cc"),
"{SOURCE_ROOT}/src/foo.cc",
)
self.assertEqual(
self.bazel_normalizer.normalize_path("./src/foo.cc"),
"{SOURCE_ROOT}/src/foo.cc",
)
self.assertEqual(
self.bazel_normalizer.normalize_path(
"bazel-out/k8-fastbuild/bin/foo"
),
"{BAZEL_OUT}/k8-fastbuild/bin/foo",
)
self.assertEqual(
self.bazel_normalizer.normalize_path(
"external/+rules_rust+rules_rust/foo.rs"
),
"{OUTPUT_BASE}/external/+rules_rust+rules_rust/foo.rs",
)
self.assertEqual(
self.bazel_normalizer.normalize_path(
"./external/fuchsia_sdk/include/foo.h"
),
"{OUTPUT_BASE}/external/fuchsia_sdk/include/foo.h",
)
self.assertEqual(
self.bazel_normalizer.normalize_path("."),
"{SOURCE_ROOT}",
)
# Absolute paths
self.assertEqual(
self.bazel_normalizer.normalize_path(
str(self.bazel_normalizer._execroot / "src/foo.cc")
),
"{SOURCE_ROOT}/src/foo.cc",
)
self.assertEqual(
self.bazel_normalizer.normalize_path(
str(self.fuchsia_dir / "src/foo.cc")
),
"{SOURCE_ROOT}/src/foo.cc",
)
self.assertEqual(
self.bazel_normalizer.normalize_path(
str(
self.bazel_normalizer._output_base
/ "external/foo_pkg/bar.cc"
)
),
"{OUTPUT_BASE}/external/foo_pkg/bar.cc",
)
# Unresolved ../ should raise ValueError
with self.assertRaises(ValueError):
self.bazel_normalizer.normalize_path("../unknown/repo/file.txt")
if __name__ == "__main__":
unittest.main()