google-nomulus/java/com/google/testing/builddefs/GenTestRules.bzl
jianglai 7fbe8a064c Replace PACKAGE_NAME with package_name() in bzl files.
LSC document:
  https://docs.google.com/document/d/19GK3_SjUZeLxiML50Hz41p6hzajKgQHW51p9M2FK3SM/edit

PACKAGE_NAME was introduced in Blaze 10 years ago. Although it looks like a constant, its value depends on which BUILD file calls it. It is also magic: you can use it inside a macro; but not in top level of a .bzl file; and not inside a custom rule. In other words, it can be used exactly in the same places as glob or the native rules. For this reason, we want to replace the “constant” with a proper function to be consistent with glob and others.

This change will bring more consistency. It will simplify the code in Blaze (remove support for “dynamic values”), the spec, and the documentation.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=189919019
2018-04-02 16:18:55 -04:00

107 lines
3.3 KiB
Python

# Copyright 2017 The Nomulus 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.
"""
def GenTestRules(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=[],
args=[],
visibility=None,
shard_count=1):
for test in _get_test_names(test_files):
if test in exclude_tests:
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(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)
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