xref: /aosp_15_r20/build/bazel/rules/java/library_test.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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