| # Copyright (C) 2023 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. |
| |
| load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") |
| load(":library.bzl", "java_library") |
| |
| ActionArgsInfo = provider( |
| fields = { |
| "argv_map": "A dict with compile action arguments keyed by the target label", |
| }, |
| ) |
| |
| def _library_compile_actions_aspect_impl(target, ctx): |
| argv_map = {} |
| if ctx.rule.kind == "java_library_sdk_transition": |
| if len(ctx.rule.attr.exports) > 1: |
| fail("multiple exports is not supported.") |
| for export in ctx.rule.attr.exports: |
| label_name = export.label.name |
| action = export[ActionArgsInfo].argv_map.get(label_name, None) |
| if action: |
| argv_map[target.label.name] = action |
| else: |
| argv = [] |
| for action in target.actions: |
| if action.mnemonic == "Javac": |
| argv.extend(action.argv) |
| argv_map[target.label.name] = argv |
| |
| return ActionArgsInfo( |
| argv_map = argv_map, |
| ) |
| |
| library_compile_actions_aspect = aspect( |
| implementation = _library_compile_actions_aspect_impl, |
| attr_aspects = ["exports"], |
| ) |
| |
| def _compile_test_impl(ctx): |
| env = analysistest.begin(ctx) |
| if len(ctx.attr.args_to_check) == 0: |
| return analysistest.end(env) |
| target = analysistest.target_under_test(env) |
| argv = target[ActionArgsInfo].argv_map[target.label.name] |
| expected_args = ctx.attr.args_to_check |
| first_arg = expected_args[0] |
| for (i, arg) in enumerate(argv): |
| if arg == first_arg: |
| asserts.true(env, len(argv) >= i + len(expected_args), "expected enough at least %d args based on # of expected args (%d), got %d" % (i + len(expected_args), len(expected_args), len(argv))) |
| asserts.equals(env, expected_args, argv[i:i + len(expected_args)]) |
| break |
| return analysistest.end(env) |
| |
| java_library_compile_test = analysistest.make( |
| _compile_test_impl, |
| attrs = { |
| "args_to_check": attr.string_list(), |
| }, |
| extra_target_under_test_aspects = [library_compile_actions_aspect], |
| ) |
| |
| def _host_java_library_has_correct_java_version(): |
| basename = "host_java_library_has_correct_java_version" |
| test_name = basename + "_test" |
| |
| java_library( |
| name = basename, |
| srcs = ["foo.java"], |
| sdk_version = "21", |
| java_version = "1.7", |
| tags = ["manual"], |
| ) |
| |
| java_library_compile_test( |
| name = test_name, |
| target_under_test = basename, |
| args_to_check = [ |
| "-source", |
| "7", |
| "-target", |
| "7", |
| ], |
| ) |
| |
| return test_name |
| |
| def java_library_test_suite(name): |
| native.test_suite( |
| name = name, |
| tests = [ |
| _host_java_library_has_correct_java_version(), |
| ], |
| ) |