"""Generated unittests to verify that a binary is built for the expected architecture."""

load("//build_defs:internal_shell.bzl", "inline_sh_test")

def _arch_test_impl(
        name,
        platform,
        file_platform,
        bazel_binaries = [],
        system_binaries = [],
        **kwargs):
    """Bazel rule to verify that a Bazel or system binary is built for the aarch64 architecture.

    Args:
      name: the name of the test.
      platform: a diagnostic name for this architecture.
      file_platform: the expected output of `file`.
      bazel_binaries: a set of binary targets to inspect.
      system_binaries: a set of paths to system executables to inspect.
      **kwargs: other keyword arguments that are passed to the test.
    """

    inline_sh_test(
        name = name,
        tools = bazel_binaries,
        cmd = """
          for binary in "%s"; do
            (file -L $$binary | grep -q "%s") \
                || (echo "Test binary is not an %s binary: "; file -L $$binary; exit 1)
          done
        """ % (
            " ".join(["$(rootpaths %s)" % b for b in bazel_binaries] + system_binaries),
            file_platform,
            platform,
        ),
        target_compatible_with = select({
            "//build_defs:" + platform: [],
            "//conditions:default": ["@platforms//:incompatible"],
        }),
        **kwargs
    )

def aarch64_test(**kwargs):
    _arch_test_impl(
        platform = "aarch64",
        file_platform = "ELF 64-bit LSB.* ARM aarch64",
        **kwargs
    )

def x86_64_test(**kwargs):
    _arch_test_impl(
        platform = "x86_64",
        file_platform = "ELF 64-bit LSB.*, ARM x86_64",
        **kwargs
    )