# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Creates a test from the binary output of another rule.

The rule instantiation can pass additional arguments to the binary and provide
it with additional data files (as well as the standard bazel test classification
attributes). This allows compiling the binary once and not recompiling or
relinking it for each test rule. It also avoids a wrapper shell script, which
adds unnecessary shell dependencies and confuses some tooling about the type of
the binary.

Example usage:

run_binary_test(
    name = "my_test",
    args = ["--module_file=$(location :data_file)"],
    data = [":data_file"],
    test_binary = ":some_cc_binary",
)
"""

def _run_binary_test_impl(ctx):
    ctx.actions.symlink(
        target_file = ctx.executable.test_binary,
        output = ctx.outputs.executable,
        is_executable = True,
    )

    data_runfiles = ctx.runfiles(files = ctx.files.data)

    binary_runfiles = ctx.attr.test_binary[DefaultInfo].default_runfiles

    return [DefaultInfo(
        executable = ctx.outputs.executable,
        runfiles = data_runfiles.merge(binary_runfiles),
    )]

run_binary_test = rule(
    _run_binary_test_impl,
    attrs = {
        "test_binary": attr.label(
            mandatory = True,
            executable = True,
            cfg = "target",
        ),
        "data": attr.label_list(allow_empty = True, allow_files = True),
    },
    test = True,
)
