blob: 4e3d5f8daeb2c619f88a6284e49aaf37adf19a25 [file] [log] [blame]
# -*- 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