xref: /aosp_15_r20/build/bazel/rules/java/sdk_transition_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(":sdk_transition.bzl", "sdk_transition")
16*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
17*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
18*7594170eSAndroid Build Coastguard Worker
19*7594170eSAndroid Build Coastguard WorkerSdkConfig = provider(
20*7594170eSAndroid Build Coastguard Worker    "Info about the config settings of the leaf dependency (in a linear dependency chain only)",
21*7594170eSAndroid Build Coastguard Worker    fields = {
22*7594170eSAndroid Build Coastguard Worker        "java_version": "the value of the //build/bazel/rules/java:version setting.",
23*7594170eSAndroid Build Coastguard Worker        "host_java_version": "the value of the //build/bazel/rules/java:host_version setting.",
24*7594170eSAndroid Build Coastguard Worker        "sdk_kind": "the value of the //build/bazel/rules/java/sdk:kind setting.",
25*7594170eSAndroid Build Coastguard Worker        "api_level": "the value of the //build/bazel/rules/java/sdk:api_level setting.",
26*7594170eSAndroid Build Coastguard Worker    },
27*7594170eSAndroid Build Coastguard Worker)
28*7594170eSAndroid Build Coastguard Worker
29*7594170eSAndroid Build Coastguard Workerdef _sdk_transition_tester_impl(ctx):
30*7594170eSAndroid Build Coastguard Worker    if ctx.attr.exports and len(ctx.attr.exports) > 0 and SdkConfig in ctx.attr.exports[0]:
31*7594170eSAndroid Build Coastguard Worker        return ctx.attr.exports[0][SdkConfig]
32*7594170eSAndroid Build Coastguard Worker    return SdkConfig(
33*7594170eSAndroid Build Coastguard Worker        java_version = ctx.attr._java_version_config_setting[BuildSettingInfo].value,
34*7594170eSAndroid Build Coastguard Worker        host_java_version = ctx.attr._host_java_version_config_setting[BuildSettingInfo].value,
35*7594170eSAndroid Build Coastguard Worker        sdk_kind = ctx.attr._sdk_kind_config_setting[BuildSettingInfo].value,
36*7594170eSAndroid Build Coastguard Worker        api_level = ctx.attr._api_level_config_setting[BuildSettingInfo].value,
37*7594170eSAndroid Build Coastguard Worker    )
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Workersdk_transition_tester = rule(
40*7594170eSAndroid Build Coastguard Worker    implementation = _sdk_transition_tester_impl,
41*7594170eSAndroid Build Coastguard Worker    attrs = {
42*7594170eSAndroid Build Coastguard Worker        "exports": attr.label(
43*7594170eSAndroid Build Coastguard Worker            cfg = sdk_transition,
44*7594170eSAndroid Build Coastguard Worker            providers = [SdkConfig],
45*7594170eSAndroid Build Coastguard Worker        ),
46*7594170eSAndroid Build Coastguard Worker        "java_version": attr.string(),
47*7594170eSAndroid Build Coastguard Worker        "sdk_version": attr.string(),
48*7594170eSAndroid Build Coastguard Worker        "_java_version_config_setting": attr.label(
49*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/rules/java:version",
50*7594170eSAndroid Build Coastguard Worker        ),
51*7594170eSAndroid Build Coastguard Worker        "_host_java_version_config_setting": attr.label(
52*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/rules/java:host_version",
53*7594170eSAndroid Build Coastguard Worker        ),
54*7594170eSAndroid Build Coastguard Worker        "_sdk_kind_config_setting": attr.label(
55*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/rules/java/sdk:kind",
56*7594170eSAndroid Build Coastguard Worker        ),
57*7594170eSAndroid Build Coastguard Worker        "_api_level_config_setting": attr.label(
58*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/rules/java/sdk:api_level",
59*7594170eSAndroid Build Coastguard Worker        ),
60*7594170eSAndroid Build Coastguard Worker        "_allowlist_function_transition": attr.label(
61*7594170eSAndroid Build Coastguard Worker            default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
62*7594170eSAndroid Build Coastguard Worker        ),
63*7594170eSAndroid Build Coastguard Worker    },
64*7594170eSAndroid Build Coastguard Worker)
65*7594170eSAndroid Build Coastguard Worker
66*7594170eSAndroid Build Coastguard Workerdef _sdk_transition_host_test_impl(ctx):
67*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
68*7594170eSAndroid Build Coastguard Worker    actual_config = analysistest.target_under_test(env)[SdkConfig]
69*7594170eSAndroid Build Coastguard Worker    asserts.equals(
70*7594170eSAndroid Build Coastguard Worker        env,
71*7594170eSAndroid Build Coastguard Worker        ctx.attr.expected_host_java_version,
72*7594170eSAndroid Build Coastguard Worker        actual_config.host_java_version,
73*7594170eSAndroid Build Coastguard Worker        "mismatching host_java_version",
74*7594170eSAndroid Build Coastguard Worker    )
75*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
76*7594170eSAndroid Build Coastguard Worker
77*7594170eSAndroid Build Coastguard Workerdef _sdk_transition_device_test_impl(ctx):
78*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
79*7594170eSAndroid Build Coastguard Worker    actual_config = analysistest.target_under_test(env)[SdkConfig]
80*7594170eSAndroid Build Coastguard Worker    asserts.equals(
81*7594170eSAndroid Build Coastguard Worker        env,
82*7594170eSAndroid Build Coastguard Worker        ctx.attr.expected_java_version,
83*7594170eSAndroid Build Coastguard Worker        actual_config.java_version,
84*7594170eSAndroid Build Coastguard Worker        "mismatching java_version",
85*7594170eSAndroid Build Coastguard Worker    )
86*7594170eSAndroid Build Coastguard Worker    asserts.equals(
87*7594170eSAndroid Build Coastguard Worker        env,
88*7594170eSAndroid Build Coastguard Worker        ctx.attr.expected_sdk_kind,
89*7594170eSAndroid Build Coastguard Worker        actual_config.sdk_kind,
90*7594170eSAndroid Build Coastguard Worker        "mismatching sdk_kind",
91*7594170eSAndroid Build Coastguard Worker    )
92*7594170eSAndroid Build Coastguard Worker    asserts.equals(
93*7594170eSAndroid Build Coastguard Worker        env,
94*7594170eSAndroid Build Coastguard Worker        ctx.attr.expected_api_level,
95*7594170eSAndroid Build Coastguard Worker        actual_config.api_level,
96*7594170eSAndroid Build Coastguard Worker        "mismatching api_level",
97*7594170eSAndroid Build Coastguard Worker    )
98*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
99*7594170eSAndroid Build Coastguard Worker
100*7594170eSAndroid Build Coastguard Workersdk_transition_host_test = analysistest.make(
101*7594170eSAndroid Build Coastguard Worker    impl = _sdk_transition_host_test_impl,
102*7594170eSAndroid Build Coastguard Worker    attrs = {
103*7594170eSAndroid Build Coastguard Worker        "expected_host_java_version": attr.string(),
104*7594170eSAndroid Build Coastguard Worker    },
105*7594170eSAndroid Build Coastguard Worker    config_settings = {
106*7594170eSAndroid Build Coastguard Worker        "//command_line_option:platforms": "@//build/bazel/tests/products:aosp_arm64_for_testing_linux_x86_64",
107*7594170eSAndroid Build Coastguard Worker        "//command_line_option:host_platform": "@//build/bazel/tests/products:aosp_arm64_for_testing_linux_x86_64",
108*7594170eSAndroid Build Coastguard Worker    },
109*7594170eSAndroid Build Coastguard Worker)
110*7594170eSAndroid Build Coastguard Worker
111*7594170eSAndroid Build Coastguard Workersdk_transition_device_test = analysistest.make(
112*7594170eSAndroid Build Coastguard Worker    impl = _sdk_transition_device_test_impl,
113*7594170eSAndroid Build Coastguard Worker    attrs = {
114*7594170eSAndroid Build Coastguard Worker        "expected_java_version": attr.string(),
115*7594170eSAndroid Build Coastguard Worker        "expected_sdk_kind": attr.string(),
116*7594170eSAndroid Build Coastguard Worker        "expected_api_level": attr.int(),
117*7594170eSAndroid Build Coastguard Worker    },
118*7594170eSAndroid Build Coastguard Worker    config_settings = {
119*7594170eSAndroid Build Coastguard Worker        "//command_line_option:platforms": "@//build/bazel/tests/products:aosp_arm64_for_testing",
120*7594170eSAndroid Build Coastguard Worker        "//command_line_option:host_platform": "@//build/bazel/tests/products:aosp_arm64_for_testing_linux_x86_64",
121*7594170eSAndroid Build Coastguard Worker    },
122*7594170eSAndroid Build Coastguard Worker)
123*7594170eSAndroid Build Coastguard Worker
124*7594170eSAndroid Build Coastguard Workerdef set_up_targets_under_test(name, java_version, sdk_version):
125*7594170eSAndroid Build Coastguard Worker    sdk_transition_tester(
126*7594170eSAndroid Build Coastguard Worker        name = name + "_parent",
127*7594170eSAndroid Build Coastguard Worker        java_version = java_version,
128*7594170eSAndroid Build Coastguard Worker        sdk_version = sdk_version,
129*7594170eSAndroid Build Coastguard Worker        exports = name + "_child",
130*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
131*7594170eSAndroid Build Coastguard Worker    )
132*7594170eSAndroid Build Coastguard Worker    sdk_transition_tester(
133*7594170eSAndroid Build Coastguard Worker        name = name + "_child",
134*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
135*7594170eSAndroid Build Coastguard Worker    )
136*7594170eSAndroid Build Coastguard Worker
137*7594170eSAndroid Build Coastguard Workerdef test_host_sdk_transition(
138*7594170eSAndroid Build Coastguard Worker        name,
139*7594170eSAndroid Build Coastguard Worker        java_version,
140*7594170eSAndroid Build Coastguard Worker        expected_host_java_version):
141*7594170eSAndroid Build Coastguard Worker    set_up_targets_under_test(name, java_version, sdk_version = None)
142*7594170eSAndroid Build Coastguard Worker    sdk_transition_host_test(
143*7594170eSAndroid Build Coastguard Worker        name = name,
144*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_parent",
145*7594170eSAndroid Build Coastguard Worker        expected_host_java_version = expected_host_java_version,
146*7594170eSAndroid Build Coastguard Worker    )
147*7594170eSAndroid Build Coastguard Worker    return name
148*7594170eSAndroid Build Coastguard Worker
149*7594170eSAndroid Build Coastguard Workerdef test_device_sdk_transition(
150*7594170eSAndroid Build Coastguard Worker        name,
151*7594170eSAndroid Build Coastguard Worker        java_version,
152*7594170eSAndroid Build Coastguard Worker        sdk_version,
153*7594170eSAndroid Build Coastguard Worker        expected_java_version,
154*7594170eSAndroid Build Coastguard Worker        expected_sdk_kind,
155*7594170eSAndroid Build Coastguard Worker        expected_api_level):
156*7594170eSAndroid Build Coastguard Worker    set_up_targets_under_test(name, java_version, sdk_version)
157*7594170eSAndroid Build Coastguard Worker    sdk_transition_device_test(
158*7594170eSAndroid Build Coastguard Worker        name = name,
159*7594170eSAndroid Build Coastguard Worker        target_under_test = name + "_parent",
160*7594170eSAndroid Build Coastguard Worker        expected_java_version = expected_java_version,
161*7594170eSAndroid Build Coastguard Worker        expected_sdk_kind = expected_sdk_kind,
162*7594170eSAndroid Build Coastguard Worker        expected_api_level = expected_api_level,
163*7594170eSAndroid Build Coastguard Worker    )
164*7594170eSAndroid Build Coastguard Worker    return name
165*7594170eSAndroid Build Coastguard Worker
166*7594170eSAndroid Build Coastguard Workerdef sdk_transition_test_suite(name):
167*7594170eSAndroid Build Coastguard Worker    native.test_suite(
168*7594170eSAndroid Build Coastguard Worker        name = name,
169*7594170eSAndroid Build Coastguard Worker        tests = [
170*7594170eSAndroid Build Coastguard Worker            test_host_sdk_transition("test_host_sdk_transition", java_version = "8", expected_host_java_version = "8"),
171*7594170eSAndroid Build Coastguard Worker            test_device_sdk_transition("test_device_sdk_transition", java_version = "9", sdk_version = "32", expected_java_version = "9", expected_sdk_kind = "public", expected_api_level = 32),
172*7594170eSAndroid Build Coastguard Worker        ],
173*7594170eSAndroid Build Coastguard Worker    )
174