blob: 57965a1d6eda3516f7a9541bfd076e27fc0d5e8b [file] [log] [blame]
"""Test rules for `current_*_files` targets"""
def _current_toolchain_files_test_impl(ctx):
runfiles_files = []
if ctx.attr.kind == "files":
manifest = ctx.actions.declare_file("{}.files.manifest".format(
ctx.label.name,
))
ctx.actions.write(
output = manifest,
content = "\n".join([file.short_path for file in ctx.files.tool]),
)
runfiles_files.append(manifest)
runfiles_files.extend(ctx.files.tool)
input = manifest
elif ctx.attr.kind == "executable":
tool_files = ctx.files.tool
if len(tool_files) != 1:
fail("Unexpected number of files provided by tool for {}: {}".format(
ctx.label,
tool_files,
))
input = tool_files[0]
runfiles_files.append(input)
else:
fail("Unexpected kind: {}".format(ctx.attr.kind))
extension = ".{}".format(ctx.executable._test_runner.extension) if ctx.executable._test_runner.extension else ""
test_runner = ctx.actions.declare_file("{}{}".format(ctx.label.name, extension))
ctx.actions.symlink(
output = test_runner,
target_file = ctx.executable._test_runner,
)
runfiles = ctx.runfiles(files = runfiles_files)
runfiles = runfiles.merge(ctx.attr._test_runner[DefaultInfo].default_runfiles)
runfiles = runfiles.merge(ctx.attr.tool[DefaultInfo].default_runfiles)
return [
DefaultInfo(
runfiles = runfiles,
executable = test_runner,
),
testing.TestEnvironment({
"CURRENT_TOOLCHAIN_FILES_TEST_INPUT": input.short_path,
"CURRENT_TOOLCHAIN_FILES_TEST_KIND": ctx.attr.kind,
"CURRENT_TOOLCHAIN_FILES_TEST_PATTERN": ctx.attr.pattern,
}),
]
current_toolchain_files_test = rule(
doc = "Test that `current_*_toolchain` tools consumable (executables are executable and filegroups contain expected sources)",
implementation = _current_toolchain_files_test_impl,
attrs = {
"kind": attr.string(
doc = "The kind of the component.",
values = ["executable", "files"],
mandatory = True,
),
"pattern": attr.string(
doc = (
"A pattern used to confirm either executables produce an expected " +
"value or lists of files contain expected contents."
),
mandatory = True,
),
"tool": attr.label(
doc = "The current toolchain component.",
allow_files = True,
mandatory = True,
),
"_test_runner": attr.label(
doc = "A shared test runner for validating targets.",
cfg = "exec",
allow_files = True,
executable = True,
default = Label("//test/current_toolchain_files:current_toolchain_files_test_runner.sh"),
),
},
test = True,
)