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