| # -*- 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. |
| """ |
| |
| 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( |
| 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 |