xref: /aosp_15_r20/build/bazel/rules/java/sdk_transition_test.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1# Copyright (C) 2023 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15load(":sdk_transition.bzl", "sdk_transition")
16load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
17load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
18
19SdkConfig = provider(
20    "Info about the config settings of the leaf dependency (in a linear dependency chain only)",
21    fields = {
22        "java_version": "the value of the //build/bazel/rules/java:version setting.",
23        "host_java_version": "the value of the //build/bazel/rules/java:host_version setting.",
24        "sdk_kind": "the value of the //build/bazel/rules/java/sdk:kind setting.",
25        "api_level": "the value of the //build/bazel/rules/java/sdk:api_level setting.",
26    },
27)
28
29def _sdk_transition_tester_impl(ctx):
30    if ctx.attr.exports and len(ctx.attr.exports) > 0 and SdkConfig in ctx.attr.exports[0]:
31        return ctx.attr.exports[0][SdkConfig]
32    return SdkConfig(
33        java_version = ctx.attr._java_version_config_setting[BuildSettingInfo].value,
34        host_java_version = ctx.attr._host_java_version_config_setting[BuildSettingInfo].value,
35        sdk_kind = ctx.attr._sdk_kind_config_setting[BuildSettingInfo].value,
36        api_level = ctx.attr._api_level_config_setting[BuildSettingInfo].value,
37    )
38
39sdk_transition_tester = rule(
40    implementation = _sdk_transition_tester_impl,
41    attrs = {
42        "exports": attr.label(
43            cfg = sdk_transition,
44            providers = [SdkConfig],
45        ),
46        "java_version": attr.string(),
47        "sdk_version": attr.string(),
48        "_java_version_config_setting": attr.label(
49            default = "//build/bazel/rules/java:version",
50        ),
51        "_host_java_version_config_setting": attr.label(
52            default = "//build/bazel/rules/java:host_version",
53        ),
54        "_sdk_kind_config_setting": attr.label(
55            default = "//build/bazel/rules/java/sdk:kind",
56        ),
57        "_api_level_config_setting": attr.label(
58            default = "//build/bazel/rules/java/sdk:api_level",
59        ),
60        "_allowlist_function_transition": attr.label(
61            default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
62        ),
63    },
64)
65
66def _sdk_transition_host_test_impl(ctx):
67    env = analysistest.begin(ctx)
68    actual_config = analysistest.target_under_test(env)[SdkConfig]
69    asserts.equals(
70        env,
71        ctx.attr.expected_host_java_version,
72        actual_config.host_java_version,
73        "mismatching host_java_version",
74    )
75    return analysistest.end(env)
76
77def _sdk_transition_device_test_impl(ctx):
78    env = analysistest.begin(ctx)
79    actual_config = analysistest.target_under_test(env)[SdkConfig]
80    asserts.equals(
81        env,
82        ctx.attr.expected_java_version,
83        actual_config.java_version,
84        "mismatching java_version",
85    )
86    asserts.equals(
87        env,
88        ctx.attr.expected_sdk_kind,
89        actual_config.sdk_kind,
90        "mismatching sdk_kind",
91    )
92    asserts.equals(
93        env,
94        ctx.attr.expected_api_level,
95        actual_config.api_level,
96        "mismatching api_level",
97    )
98    return analysistest.end(env)
99
100sdk_transition_host_test = analysistest.make(
101    impl = _sdk_transition_host_test_impl,
102    attrs = {
103        "expected_host_java_version": attr.string(),
104    },
105    config_settings = {
106        "//command_line_option:platforms": "@//build/bazel/tests/products:aosp_arm64_for_testing_linux_x86_64",
107        "//command_line_option:host_platform": "@//build/bazel/tests/products:aosp_arm64_for_testing_linux_x86_64",
108    },
109)
110
111sdk_transition_device_test = analysistest.make(
112    impl = _sdk_transition_device_test_impl,
113    attrs = {
114        "expected_java_version": attr.string(),
115        "expected_sdk_kind": attr.string(),
116        "expected_api_level": attr.int(),
117    },
118    config_settings = {
119        "//command_line_option:platforms": "@//build/bazel/tests/products:aosp_arm64_for_testing",
120        "//command_line_option:host_platform": "@//build/bazel/tests/products:aosp_arm64_for_testing_linux_x86_64",
121    },
122)
123
124def set_up_targets_under_test(name, java_version, sdk_version):
125    sdk_transition_tester(
126        name = name + "_parent",
127        java_version = java_version,
128        sdk_version = sdk_version,
129        exports = name + "_child",
130        tags = ["manual"],
131    )
132    sdk_transition_tester(
133        name = name + "_child",
134        tags = ["manual"],
135    )
136
137def test_host_sdk_transition(
138        name,
139        java_version,
140        expected_host_java_version):
141    set_up_targets_under_test(name, java_version, sdk_version = None)
142    sdk_transition_host_test(
143        name = name,
144        target_under_test = name + "_parent",
145        expected_host_java_version = expected_host_java_version,
146    )
147    return name
148
149def test_device_sdk_transition(
150        name,
151        java_version,
152        sdk_version,
153        expected_java_version,
154        expected_sdk_kind,
155        expected_api_level):
156    set_up_targets_under_test(name, java_version, sdk_version)
157    sdk_transition_device_test(
158        name = name,
159        target_under_test = name + "_parent",
160        expected_java_version = expected_java_version,
161        expected_sdk_kind = expected_sdk_kind,
162        expected_api_level = expected_api_level,
163    )
164    return name
165
166def sdk_transition_test_suite(name):
167    native.test_suite(
168        name = name,
169        tests = [
170            test_host_sdk_transition("test_host_sdk_transition", java_version = "8", expected_host_java_version = "8"),
171            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        ],
173    )
174