# 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.
"""android_test implementation for the Android environment."""


def _android_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,
            "{{path_additions}}":
            ":".join([
                ctx.attr._adb.label.package,
                ctx.attr._aapt.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._aapt),
            depset(ctx.files._tradefed_launcher),
            depset(ctx.files._tradefed_script_help),
            depset(ctx.files._tradefed_jars),
        ], ),
    )

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


android_test = rule(
    _android_test_impl,
    attrs={{
        "_adb":
        attr.label(
            default=Label("//packages/modules/adb"),
            allow_single_file=True,
        ),
        "_aapt":
        attr.label(
            default=Label("//frameworks/base/tools/aapt"),
            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:atest_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:android_tf_test_launcher")),
        "deps":
        attr.label_list(allow_files=True),
    }},
    executable=True,
    test=True,
)
