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