# Copyright {year}, The Android Open Source Project
#
# 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
#
#     http://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.

# WARNING: This BUILD file was generated by a tool.
# It should not be manually modified.
"""cc_test implementation for the Android environment."""

def _cc_test_impl(ctx):
    # Emit the launcher script.
    script = ctx.actions.declare_file("%s.sh" % ctx.label.name)
    ctx.actions.expand_template(
        template = ctx.file._template,
        output = script,
        substitutions = {{
            "{{module_name}}": ctx.label.name,
            "{{module_path}}": ctx.label.package,
            "{{tradefed_launcher_module_path}}": ctx.attr._tradefed_launcher.label.package,
            "{{tradefed_jars_module_path}}": ctx.attr._tradefed_jars.label.package,
            "{{adb_path}}": ctx.attr._adb.label.package,
            "{{launcher_path}}": "{{}}/{{}}".format(
                ctx.attr._launcher.label.package,
                ctx.attr._launcher.label.name,
            ),
        }},
        is_executable = True,
    )

    # Pass the deps on as runfiles as Tradefed will scan the resulting
    # directory for tests.
    runfiles = ctx.runfiles(
        files = ctx.files._launcher,
        transitive_files = depset(
            transitive = [
                depset(ctx.files.deps),
                depset(ctx.files._adb),
                depset(ctx.files._tradefed_launcher),
                depset(ctx.files._tradefed_script_help),
                depset(ctx.files._tradefed_jars),
            ],
        ),
    )

    return [DefaultInfo(executable = script, runfiles = runfiles)]

cc_test = rule(
    _cc_test_impl,
    attrs = {{
        "_adb": attr.label(
            default = Label("//packages/modules/adb"),
            allow_single_file = True,
        ),
        "_tradefed_launcher": attr.label(
            default = Label("//tools/tradefederation/core:atest_tradefed"),
            allow_single_file = True,
        ),
        "_tradefed_script_help": attr.label(
            default = Label("//tools/tradefederation/core:script_help"),
        ),
        "_tradefed_jars": attr.label(
            default = Label("//tools/tradefederation/core:tradefed_lib"),
        ),
        "_template": attr.label(
            default = Label(
                "//build/bazel/rules:tf_test_executable.sh.template",
            ),
            allow_single_file = True,
        ),
        "_launcher": attr.label(default = Label("//build/bazel/rules:cc_tf_test_launcher")),
        "deps": attr.label_list(allow_files = True),
    }},
    executable = True,
    test = True,
)
