# -*- mode:python; -*-
#
# Copyright 2016 The Bazel Authors. All rights reserved.
#
# 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.

"""Generate java test rules from given test_files.
Instead of having to create one test rule per test in the BUILD file, this rule
provides a handy way to create a bunch of test rules for the specified test
files.
"""

load("//tools/build/bazel:deps_files.bzl", "deps_files")

def testIsExcluded(exclude_tests, test):
    for excluded_test in exclude_tests:
        normalized_excluded_test = excluded_test.replace(".", "/")
        if test.endswith(normalized_excluded_test):
            return True
    return False

def generate_test_rules(
        name,
        test_files,
        deps,
        exclude_tests = [],
        default_test_size = "small",
        small_tests = [],
        medium_tests = [],
        large_tests = [],
        enormous_tests = [],
        resources = [],
        flaky_tests = [],
        tags = [],
        prefix = "",
        jvm_flags = ["-XX:MaxPermSize=128m"],
        args = [],
        visibility = None,
        shard_count = 1):
    for test in _get_test_names(test_files):
        if testIsExcluded(exclude_tests, test):
            continue
        test_size = default_test_size
        if test in small_tests:
            test_size = "small"
        if test in medium_tests:
            test_size = "medium"
        if test in large_tests:
            test_size = "large"
        if test in enormous_tests:
            test_size = "enormous"
        flaky = 0
        if (test in flaky_tests) or ("flaky" in tags):
            flaky = 1
        java_class = _package_from_path(
            native.package_name() + "/" + _strip_right(test, ".java"),
        )
        package = java_class[:java_class.rfind(".")]

        native.java_test(
            data = ["@jacoco_agent_runtime//jar"],
            name = prefix + test,
            runtime_deps = deps,
            resources = resources,
            size = test_size,
            #jvm_flags = jvm_flags,
            args = args,
            flaky = flaky,
            tags = tags,
            test_class = java_class,
            visibility = visibility,
            shard_count = shard_count,
            jvm_flags = jvm_flags,
        )

        jacoco_agent = "$(location @jacoco_agent_runtime//jar)"
        native.java_test(
            data = ["@jacoco_agent_runtime//jar"],
            name = prefix + test + "-coverage",
            runtime_deps = deps,
            resources = resources,
            size = "large",
            #jvm_flags = jvm_flags,
            args = args,
            flaky = flaky,
            tags = tags,
            test_class = java_class,
            visibility = visibility,
            shard_count = shard_count,
            jvm_flags = jvm_flags + ["-javaagent:" + jacoco_agent + "=destfile=/tmp/jacoco.exec"],
        )
    deps_files(name = name + "-deps", deps = deps)

def _get_test_names(test_files):
    test_names = []
    for test_file in test_files:
        if not test_file.endswith("Test.java"):
            continue
        test_names += [test_file[:-5]]
    return test_names

def _package_from_path(package_path, src_impls = None):
    src_impls = src_impls or ["javatests/", "java/"]
    for src_impl in src_impls:
        if not src_impl.endswith("/"):
            src_impl += "/"
        index = _index_of_end(package_path, src_impl)
        if index >= 0:
            package_path = package_path[index:]
            break
    return package_path.replace("/", ".")

def _strip_right(str, suffix):
    """Returns str without the suffix if it ends with suffix."""
    if str.endswith(suffix):
        return str[0:len(str) - len(suffix)]
    else:
        return str

def _index_of_end(str, part):
    """If part is in str, return the index of the first character after part.
    Return -1 if part is not in str."""
    index = str.find(part)
    if index >= 0:
        return index + len(part)
    return -1
