blob: 90a44372d46385f0a213c6be3ab0c32e3a02e1cd [file] [log] [blame]
#!/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.
import unittest
import sys
from pathlib import Path
sys.path.insert(0, Path(__file__).parent)
from gn_labels import split_gn_label, qualify_gn_target_name, GnLabelQualifier
class GnLabelsTest(unittest.TestCase):
def test_split_gn_label(self):
_INVALID_CASES = [
# Does not start with //
"foo/bar",
# Extra junk after toolchain suffix
"//foo(//toolchain)extrajunk",
# No closing paren for toolchain suffix
"//foo(//toolchain",
# Missing open paren
"//foo//toolchain"
# Malformed content inside paren
"//foo(toolchain//)",
]
for label in _INVALID_CASES:
with self.assertRaises(AssertionError):
split_gn_label(label)
_TEST_CASES = {
"//foo": ("//foo", ""),
"//:foo": ("//:foo", ""),
"//foo/bar": ("//foo/bar", ""),
"//foo/bar:bar": ("//foo/bar:bar", ""),
"//foo(//toolchain)": ("//foo", "//toolchain"),
"//foo(//build/toolchain/fuchsia:y64)": (
"//foo",
"//build/toolchain/fuchsia:y64",
),
}
for label, target_toolchain in _TEST_CASES.items():
self.assertEqual(
target_toolchain,
split_gn_label(label),
f"When splitting [{label}]",
)
def test_qualify_gn_target_name(self):
_INVALID_CASES = [
# Does not start with //
"foo/bar",
]
for label in _INVALID_CASES:
with self.assertRaises(AssertionError):
qualify_gn_target_name(label)
_TEST_CASES = {
"//foo": "//foo:foo",
"//foo:foo": "//foo:foo",
"//:foo": "//:foo",
"//foo/bar": "//foo/bar:bar",
}
for label, expected in _TEST_CASES.items():
self.assertEqual(
expected,
qualify_gn_target_name(label),
f"When qualifying [{label}]",
)
def test_GnLabelQualifier_qualify_toolchain(self):
qualifier = GnLabelQualifier("y64", "aRm64")
_TOOLCHAIN_TEST_CASES = {
"//toolchain": "//toolchain:toolchain",
"//toolchain:name": "//toolchain:name",
"//toolchain/name": "//toolchain/name:name",
"host": "//build/toolchain:host_y64",
"default": "//build/toolchain/fuchsia:aRm64",
"fuchsia": "//build/toolchain/fuchsia:aRm64",
"fidl": "//build/fidl:fidling",
"toolchain": "ERROR",
}
for toolchain, expected in _TOOLCHAIN_TEST_CASES.items():
msg = f"When qualifying {toolchain}"
if expected == "ERROR":
with self.assertRaises(AssertionError, msg=msg):
qualifier.qualify_toolchain(toolchain)
else:
self.assertEqual(
expected, qualifier.qualify_toolchain(toolchain), msg=msg
)
def test_GnLabelQualifier_qualify_label(self):
qualifier = GnLabelQualifier("y64", "aRm64")
_LABEL_TEST_CASES = {
"//foo": "//foo:foo",
"//foo(default)": "//foo:foo",
"//foo(//build/toolchain/fuchsia:aRm64)": "//foo:foo",
"//foo(host)": "//foo:foo(//build/toolchain:host_y64)",
"//foo(//build/toolchain/fuchsia:y64)": "//foo:foo(//build/toolchain/fuchsia:y64)",
"//foo(fidl)": "//foo:foo(//build/fidl:fidling)",
"//foo/bar": "//foo/bar:bar",
"//foo/bar:zoo": "//foo/bar:zoo",
"//foo/bar(default)": "//foo/bar:bar",
"//foo/bar:zoo(default)": "//foo/bar:zoo",
"//foo/bar(fuchsia)": "//foo/bar:bar",
"//foo/bar:zoo(fuchsia)": "//foo/bar:zoo",
"//foo/bar(//build/toolchain/fuchsia:aRm64)": "//foo/bar:bar",
"//foo/bar:zoo(//build/toolchain/fuchsia:aRm64)": "//foo/bar:zoo",
"//foo/bar(//build/toolchain/fuchsia:y64)": "//foo/bar:bar(//build/toolchain/fuchsia:y64)",
"//foo/bar:zoo(//build/toolchain/fuchsia:y64)": "//foo/bar:zoo(//build/toolchain/fuchsia:y64)",
}
for label, expected in _LABEL_TEST_CASES.items():
msg = f"When qualifying {label}"
if expected == "ERROR":
with self.assertRaises(AssertionError, msg=msg):
qualifier.qualify_label(label)
else:
self.assertEqual(
expected, qualifier.qualify_label(label), msg=msg
)
def test_GnLabelQualifier_label_to_build_args(self):
qualifier = GnLabelQualifier("y64", "aRm64")
qualifier.set_ninja_path_to_gn_label(lambda x: f"NINJA_PATH<{x}>")
_TEST_CASES = {
"//foo": ["//foo"],
"//foo:foo": ["//foo"],
"//foo:bar": ["//foo:bar"],
"//foo(//build/toolchain:host_y64)": ["--host", "//foo"],
"//foo:foo(//build/toolchain/fuchsia:aRm64)": ["//foo"],
"//foo/bar:bar(//build/toolchain/fuchsia:riscv64)": [
"--toolchain=//build/toolchain/fuchsia:riscv64",
"//foo/bar",
],
"//foo/bar:bar(//build/fidl:fidling)": ["--fidl", "//foo/bar"],
"foo": ["ERROR"],
}
for label, expected in _TEST_CASES.items():
msg = f"When parsing {label}"
if expected == ["ERROR"]:
with self.assertRaises(AssertionError, msg=msg):
qualifier.label_to_build_args(label)
else:
self.assertListEqual(
expected, qualifier.label_to_build_args(label), msg=msg
)
def test_GnLabelQualifier_build_args_to_labels(self):
qualifier = GnLabelQualifier("y64", "aRm64")
qualifier.set_ninja_path_to_gn_label(lambda x: f"NINJA_PATH<{x}>")
_TEST_CASES = [
(
["//foo"],
["//foo:foo"],
),
(
["//foo(host)"],
["//foo:foo(//build/toolchain:host_y64)"],
),
(
["--host", "//foo"],
["//foo:foo(//build/toolchain:host_y64)"],
),
(
[
"//foo",
"--host",
"//foo:bar",
"--toolchain=fidl",
"//fidl:zoo",
],
[
"//foo:foo",
"//foo:bar(//build/toolchain:host_y64)",
"//fidl:zoo(//build/fidl:fidling)",
],
),
(
["--toolchain=host", "//foo"],
["//foo:foo(//build/toolchain:host_y64)"],
),
(
["//foo", "--unknown"],
["ERROR"],
),
(
["//foo", "host_x64/foo"],
["//foo:foo", "NINJA_PATH<host_x64/foo>"],
),
]
for labels, expected_labels in _TEST_CASES:
msg = f"When parsing {labels}"
if expected_labels == ["ERROR"]:
with self.assertRaises(AssertionError, msg=msg):
qualifier.build_args_to_labels(labels)
else:
self.assertListEqual(
expected_labels,
qualifier.build_args_to_labels(labels),
msg=msg,
)
if __name__ == "__main__":
unittest.main()