1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Worker 15*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") 16*7594170eSAndroid Build Coastguard Workerload(":library.bzl", "java_library") 17*7594170eSAndroid Build Coastguard Worker 18*7594170eSAndroid Build Coastguard WorkerActionArgsInfo = provider( 19*7594170eSAndroid Build Coastguard Worker fields = { 20*7594170eSAndroid Build Coastguard Worker "argv_map": "A dict with compile action arguments keyed by the target label", 21*7594170eSAndroid Build Coastguard Worker }, 22*7594170eSAndroid Build Coastguard Worker) 23*7594170eSAndroid Build Coastguard Worker 24*7594170eSAndroid Build Coastguard Workerdef _library_compile_actions_aspect_impl(target, ctx): 25*7594170eSAndroid Build Coastguard Worker argv_map = {} 26*7594170eSAndroid Build Coastguard Worker if ctx.rule.kind == "java_library_sdk_transition": 27*7594170eSAndroid Build Coastguard Worker if len(ctx.rule.attr.exports) > 1: 28*7594170eSAndroid Build Coastguard Worker fail("multiple exports is not supported.") 29*7594170eSAndroid Build Coastguard Worker for export in ctx.rule.attr.exports: 30*7594170eSAndroid Build Coastguard Worker label_name = export.label.name 31*7594170eSAndroid Build Coastguard Worker action = export[ActionArgsInfo].argv_map.get(label_name, None) 32*7594170eSAndroid Build Coastguard Worker if action: 33*7594170eSAndroid Build Coastguard Worker argv_map[target.label.name] = action 34*7594170eSAndroid Build Coastguard Worker else: 35*7594170eSAndroid Build Coastguard Worker argv = [] 36*7594170eSAndroid Build Coastguard Worker for action in target.actions: 37*7594170eSAndroid Build Coastguard Worker if action.mnemonic == "Javac": 38*7594170eSAndroid Build Coastguard Worker argv.extend(action.argv) 39*7594170eSAndroid Build Coastguard Worker argv_map[target.label.name] = argv 40*7594170eSAndroid Build Coastguard Worker 41*7594170eSAndroid Build Coastguard Worker return ActionArgsInfo( 42*7594170eSAndroid Build Coastguard Worker argv_map = argv_map, 43*7594170eSAndroid Build Coastguard Worker ) 44*7594170eSAndroid Build Coastguard Worker 45*7594170eSAndroid Build Coastguard Workerlibrary_compile_actions_aspect = aspect( 46*7594170eSAndroid Build Coastguard Worker implementation = _library_compile_actions_aspect_impl, 47*7594170eSAndroid Build Coastguard Worker attr_aspects = ["exports"], 48*7594170eSAndroid Build Coastguard Worker) 49*7594170eSAndroid Build Coastguard Worker 50*7594170eSAndroid Build Coastguard Workerdef _compile_test_impl(ctx): 51*7594170eSAndroid Build Coastguard Worker env = analysistest.begin(ctx) 52*7594170eSAndroid Build Coastguard Worker if len(ctx.attr.args_to_check) == 0: 53*7594170eSAndroid Build Coastguard Worker return analysistest.end(env) 54*7594170eSAndroid Build Coastguard Worker target = analysistest.target_under_test(env) 55*7594170eSAndroid Build Coastguard Worker argv = target[ActionArgsInfo].argv_map[target.label.name] 56*7594170eSAndroid Build Coastguard Worker expected_args = ctx.attr.args_to_check 57*7594170eSAndroid Build Coastguard Worker first_arg = expected_args[0] 58*7594170eSAndroid Build Coastguard Worker for (i, arg) in enumerate(argv): 59*7594170eSAndroid Build Coastguard Worker if arg == first_arg: 60*7594170eSAndroid Build Coastguard Worker 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))) 61*7594170eSAndroid Build Coastguard Worker asserts.equals(env, expected_args, argv[i:i + len(expected_args)]) 62*7594170eSAndroid Build Coastguard Worker break 63*7594170eSAndroid Build Coastguard Worker return analysistest.end(env) 64*7594170eSAndroid Build Coastguard Worker 65*7594170eSAndroid Build Coastguard Workerjava_library_compile_test = analysistest.make( 66*7594170eSAndroid Build Coastguard Worker _compile_test_impl, 67*7594170eSAndroid Build Coastguard Worker attrs = { 68*7594170eSAndroid Build Coastguard Worker "args_to_check": attr.string_list(), 69*7594170eSAndroid Build Coastguard Worker }, 70*7594170eSAndroid Build Coastguard Worker extra_target_under_test_aspects = [library_compile_actions_aspect], 71*7594170eSAndroid Build Coastguard Worker) 72*7594170eSAndroid Build Coastguard Worker 73*7594170eSAndroid Build Coastguard Workerdef _host_java_library_has_correct_java_version(): 74*7594170eSAndroid Build Coastguard Worker basename = "host_java_library_has_correct_java_version" 75*7594170eSAndroid Build Coastguard Worker test_name = basename + "_test" 76*7594170eSAndroid Build Coastguard Worker 77*7594170eSAndroid Build Coastguard Worker java_library( 78*7594170eSAndroid Build Coastguard Worker name = basename, 79*7594170eSAndroid Build Coastguard Worker srcs = ["foo.java"], 80*7594170eSAndroid Build Coastguard Worker sdk_version = "21", 81*7594170eSAndroid Build Coastguard Worker java_version = "1.7", 82*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 83*7594170eSAndroid Build Coastguard Worker ) 84*7594170eSAndroid Build Coastguard Worker 85*7594170eSAndroid Build Coastguard Worker java_library_compile_test( 86*7594170eSAndroid Build Coastguard Worker name = test_name, 87*7594170eSAndroid Build Coastguard Worker target_under_test = basename, 88*7594170eSAndroid Build Coastguard Worker args_to_check = [ 89*7594170eSAndroid Build Coastguard Worker "-source", 90*7594170eSAndroid Build Coastguard Worker "7", 91*7594170eSAndroid Build Coastguard Worker "-target", 92*7594170eSAndroid Build Coastguard Worker "7", 93*7594170eSAndroid Build Coastguard Worker ], 94*7594170eSAndroid Build Coastguard Worker ) 95*7594170eSAndroid Build Coastguard Worker 96*7594170eSAndroid Build Coastguard Worker return test_name 97*7594170eSAndroid Build Coastguard Worker 98*7594170eSAndroid Build Coastguard Workerdef java_library_test_suite(name): 99*7594170eSAndroid Build Coastguard Worker native.test_suite( 100*7594170eSAndroid Build Coastguard Worker name = name, 101*7594170eSAndroid Build Coastguard Worker tests = [ 102*7594170eSAndroid Build Coastguard Worker _host_java_library_has_correct_java_version(), 103*7594170eSAndroid Build Coastguard Worker ], 104*7594170eSAndroid Build Coastguard Worker ) 105