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