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("//build/bazel/rules/common:sdk_version.bzl", "sdk_version") 17*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:api.bzl", "api") 18*7594170eSAndroid Build Coastguard Worker 19*7594170eSAndroid Build Coastguard Worker# Warning: this is a *lot* of boilerplate to test just one function. 20*7594170eSAndroid Build Coastguard Worker# Scroll down to sdk_version_test_suite for the actual test cases. 21*7594170eSAndroid Build Coastguard Worker 22*7594170eSAndroid Build Coastguard WorkerSdkSpec = provider() 23*7594170eSAndroid Build Coastguard Worker 24*7594170eSAndroid Build Coastguard Workerdef _sdk_spec_from_tester_impl(ctx): 25*7594170eSAndroid Build Coastguard Worker sdk_spec = sdk_version.sdk_spec_from(ctx.attr.sdk_version) 26*7594170eSAndroid Build Coastguard Worker return [SdkSpec(kind = sdk_spec.kind, api_level = sdk_spec.api_level)] 27*7594170eSAndroid Build Coastguard Worker 28*7594170eSAndroid Build Coastguard Workersdk_spec_from_tester = rule( 29*7594170eSAndroid Build Coastguard Worker implementation = _sdk_spec_from_tester_impl, 30*7594170eSAndroid Build Coastguard Worker attrs = { 31*7594170eSAndroid Build Coastguard Worker "sdk_version": attr.string(), 32*7594170eSAndroid Build Coastguard Worker }, 33*7594170eSAndroid Build Coastguard Worker) 34*7594170eSAndroid Build Coastguard Worker 35*7594170eSAndroid Build Coastguard Workerdef _sdk_spec_from_failure_test_impl(ctx): 36*7594170eSAndroid Build Coastguard Worker env = analysistest.begin(ctx) 37*7594170eSAndroid Build Coastguard Worker asserts.expect_failure(env, ctx.attr.expected_failure_message) 38*7594170eSAndroid Build Coastguard Worker return analysistest.end(env) 39*7594170eSAndroid Build Coastguard Worker 40*7594170eSAndroid Build Coastguard Workersdk_spec_from_failure_test = analysistest.make( 41*7594170eSAndroid Build Coastguard Worker impl = _sdk_spec_from_failure_test_impl, 42*7594170eSAndroid Build Coastguard Worker expect_failure = True, 43*7594170eSAndroid Build Coastguard Worker attrs = {"expected_failure_message": attr.string()}, 44*7594170eSAndroid Build Coastguard Worker) 45*7594170eSAndroid Build Coastguard Worker 46*7594170eSAndroid Build Coastguard Workerdef test_sdk_spec_from_failure(name, sdk_version, expected_failure_message = ""): 47*7594170eSAndroid Build Coastguard Worker sdk_spec_from_tester( 48*7594170eSAndroid Build Coastguard Worker name = name + "_target", 49*7594170eSAndroid Build Coastguard Worker sdk_version = sdk_version, 50*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 51*7594170eSAndroid Build Coastguard Worker ) 52*7594170eSAndroid Build Coastguard Worker sdk_spec_from_failure_test( 53*7594170eSAndroid Build Coastguard Worker name = name, 54*7594170eSAndroid Build Coastguard Worker target_under_test = name + "_target", 55*7594170eSAndroid Build Coastguard Worker expected_failure_message = expected_failure_message, 56*7594170eSAndroid Build Coastguard Worker ) 57*7594170eSAndroid Build Coastguard Worker return name 58*7594170eSAndroid Build Coastguard Worker 59*7594170eSAndroid Build Coastguard Workerdef _sdk_spec_from_output_test_impl(ctx): 60*7594170eSAndroid Build Coastguard Worker env = analysistest.begin(ctx) 61*7594170eSAndroid Build Coastguard Worker actual_sdk_spec = analysistest.target_under_test(env)[SdkSpec] 62*7594170eSAndroid Build Coastguard Worker actual_kind = actual_sdk_spec.kind 63*7594170eSAndroid Build Coastguard Worker asserts.equals( 64*7594170eSAndroid Build Coastguard Worker env, 65*7594170eSAndroid Build Coastguard Worker ctx.attr.expected_kind, 66*7594170eSAndroid Build Coastguard Worker actual_kind, 67*7594170eSAndroid Build Coastguard Worker "Expected kind %s, but got %s for sdk version %s" % ( 68*7594170eSAndroid Build Coastguard Worker ctx.attr.expected_kind, 69*7594170eSAndroid Build Coastguard Worker actual_kind, 70*7594170eSAndroid Build Coastguard Worker ctx.attr.actual_sdk_version, 71*7594170eSAndroid Build Coastguard Worker ), 72*7594170eSAndroid Build Coastguard Worker ) 73*7594170eSAndroid Build Coastguard Worker 74*7594170eSAndroid Build Coastguard Worker actual_api_level = actual_sdk_spec.api_level 75*7594170eSAndroid Build Coastguard Worker asserts.equals( 76*7594170eSAndroid Build Coastguard Worker env, 77*7594170eSAndroid Build Coastguard Worker ctx.attr.expected_api_level, 78*7594170eSAndroid Build Coastguard Worker actual_api_level, 79*7594170eSAndroid Build Coastguard Worker "Expected api_level %s, but got %s for sdk version %s" % ( 80*7594170eSAndroid Build Coastguard Worker ctx.attr.expected_api_level, 81*7594170eSAndroid Build Coastguard Worker actual_api_level, 82*7594170eSAndroid Build Coastguard Worker ctx.attr.actual_sdk_version, 83*7594170eSAndroid Build Coastguard Worker ), 84*7594170eSAndroid Build Coastguard Worker ) 85*7594170eSAndroid Build Coastguard Worker return analysistest.end(env) 86*7594170eSAndroid Build Coastguard Worker 87*7594170eSAndroid Build Coastguard Workersdk_spec_from_output_test = analysistest.make( 88*7594170eSAndroid Build Coastguard Worker impl = _sdk_spec_from_output_test_impl, 89*7594170eSAndroid Build Coastguard Worker attrs = { 90*7594170eSAndroid Build Coastguard Worker "actual_sdk_version": attr.string(), 91*7594170eSAndroid Build Coastguard Worker "expected_kind": attr.string(), 92*7594170eSAndroid Build Coastguard Worker "expected_api_level": attr.int(), 93*7594170eSAndroid Build Coastguard Worker }, 94*7594170eSAndroid Build Coastguard Worker) 95*7594170eSAndroid Build Coastguard Worker 96*7594170eSAndroid Build Coastguard Workerdef test_sdk_spec_from_success(name, sdk_version, expected_kind, expected_api_level): 97*7594170eSAndroid Build Coastguard Worker sdk_spec_from_tester( 98*7594170eSAndroid Build Coastguard Worker name = name + "_target", 99*7594170eSAndroid Build Coastguard Worker sdk_version = sdk_version, 100*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 101*7594170eSAndroid Build Coastguard Worker ) 102*7594170eSAndroid Build Coastguard Worker sdk_spec_from_output_test( 103*7594170eSAndroid Build Coastguard Worker name = name, 104*7594170eSAndroid Build Coastguard Worker target_under_test = name + "_target", 105*7594170eSAndroid Build Coastguard Worker actual_sdk_version = sdk_version, 106*7594170eSAndroid Build Coastguard Worker expected_kind = expected_kind, 107*7594170eSAndroid Build Coastguard Worker expected_api_level = expected_api_level, 108*7594170eSAndroid Build Coastguard Worker ) 109*7594170eSAndroid Build Coastguard Worker return name 110*7594170eSAndroid Build Coastguard Worker 111*7594170eSAndroid Build Coastguard Workerdef sdk_version_test_suite(name): 112*7594170eSAndroid Build Coastguard Worker # sdk version expected to fail to parse. 113*7594170eSAndroid Build Coastguard Worker failing_sdk_versions = [ 114*7594170eSAndroid Build Coastguard Worker "malformed_malformed", 115*7594170eSAndroid Build Coastguard Worker "malformed", 116*7594170eSAndroid Build Coastguard Worker "", 117*7594170eSAndroid Build Coastguard Worker "core_platform", 118*7594170eSAndroid Build Coastguard Worker ] 119*7594170eSAndroid Build Coastguard Worker failure_tests = [ 120*7594170eSAndroid Build Coastguard Worker test_sdk_spec_from_failure( 121*7594170eSAndroid Build Coastguard Worker name = sdk_version + "_failure_test", 122*7594170eSAndroid Build Coastguard Worker sdk_version = sdk_version, 123*7594170eSAndroid Build Coastguard Worker ) 124*7594170eSAndroid Build Coastguard Worker for sdk_version in failing_sdk_versions 125*7594170eSAndroid Build Coastguard Worker ] 126*7594170eSAndroid Build Coastguard Worker 127*7594170eSAndroid Build Coastguard Worker # Map of sdk_version to expected kind and api_level 128*7594170eSAndroid Build Coastguard Worker sdk_version_to_kind_and_api_level = { 129*7594170eSAndroid Build Coastguard Worker "current": ("public", api.FUTURE_API_LEVEL), 130*7594170eSAndroid Build Coastguard Worker "core_current": ("core", api.FUTURE_API_LEVEL), 131*7594170eSAndroid Build Coastguard Worker "Tiramisu": ("public", 33), 132*7594170eSAndroid Build Coastguard Worker "33": ("public", 33), 133*7594170eSAndroid Build Coastguard Worker "public_33": ("public", 33), 134*7594170eSAndroid Build Coastguard Worker "none": ("none", api.NONE_API_LEVEL), 135*7594170eSAndroid Build Coastguard Worker "system_Tiramisu": ("system", 33), 136*7594170eSAndroid Build Coastguard Worker "system_32": ("system", 32), 137*7594170eSAndroid Build Coastguard Worker } 138*7594170eSAndroid Build Coastguard Worker success_tests = [ 139*7594170eSAndroid Build Coastguard Worker test_sdk_spec_from_success( 140*7594170eSAndroid Build Coastguard Worker name = sdk_version + "_success_test", 141*7594170eSAndroid Build Coastguard Worker sdk_version = sdk_version, 142*7594170eSAndroid Build Coastguard Worker expected_kind = sdk_version_to_kind_and_api_level[sdk_version][0], 143*7594170eSAndroid Build Coastguard Worker expected_api_level = sdk_version_to_kind_and_api_level[sdk_version][1], 144*7594170eSAndroid Build Coastguard Worker ) 145*7594170eSAndroid Build Coastguard Worker for sdk_version in sdk_version_to_kind_and_api_level.keys() 146*7594170eSAndroid Build Coastguard Worker ] 147*7594170eSAndroid Build Coastguard Worker native.test_suite( 148*7594170eSAndroid Build Coastguard Worker name = name, 149*7594170eSAndroid Build Coastguard Worker tests = failure_tests + success_tests, 150*7594170eSAndroid Build Coastguard Worker ) 151