unplugged-system/build/bazel/rules/common/sdk_version_test.bzl

151 lines
4.8 KiB
Python

# Copyright (C) 2023 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
load("//build/bazel/rules/common:sdk_version.bzl", "sdk_version")
load("//build/bazel/rules/common:api.bzl", "api")
# Warning: this is a *lot* of boilerplate to test just one function.
# Scroll down to sdk_version_test_suite for the actual test cases.
SdkSpec = provider()
def _sdk_spec_from_tester_impl(ctx):
sdk_spec = sdk_version.sdk_spec_from(ctx.attr.sdk_version)
return [SdkSpec(kind = sdk_spec.kind, api_level = sdk_spec.api_level)]
sdk_spec_from_tester = rule(
implementation = _sdk_spec_from_tester_impl,
attrs = {
"sdk_version": attr.string(),
},
)
def _sdk_spec_from_failure_test_impl(ctx):
env = analysistest.begin(ctx)
asserts.expect_failure(env, ctx.attr.expected_failure_message)
return analysistest.end(env)
sdk_spec_from_failure_test = analysistest.make(
impl = _sdk_spec_from_failure_test_impl,
expect_failure = True,
attrs = {"expected_failure_message": attr.string()},
)
def test_sdk_spec_from_failure(name, sdk_version, expected_failure_message = ""):
sdk_spec_from_tester(
name = name + "_target",
sdk_version = sdk_version,
tags = ["manual"],
)
sdk_spec_from_failure_test(
name = name,
target_under_test = name + "_target",
expected_failure_message = expected_failure_message,
)
return name
def _sdk_spec_from_output_test_impl(ctx):
env = analysistest.begin(ctx)
actual_sdk_spec = analysistest.target_under_test(env)[SdkSpec]
actual_kind = actual_sdk_spec.kind
asserts.equals(
env,
ctx.attr.expected_kind,
actual_kind,
"Expected kind %s, but got %s for sdk version %s" % (
ctx.attr.expected_kind,
actual_kind,
ctx.attr.actual_sdk_version,
),
)
actual_api_level = actual_sdk_spec.api_level
asserts.equals(
env,
ctx.attr.expected_api_level,
actual_api_level,
"Expected api_level %s, but got %s for sdk version %s" % (
ctx.attr.expected_api_level,
actual_api_level,
ctx.attr.actual_sdk_version,
),
)
return analysistest.end(env)
sdk_spec_from_output_test = analysistest.make(
impl = _sdk_spec_from_output_test_impl,
attrs = {
"actual_sdk_version": attr.string(),
"expected_kind": attr.string(),
"expected_api_level": attr.int(),
},
)
def test_sdk_spec_from_success(name, sdk_version, expected_kind, expected_api_level):
sdk_spec_from_tester(
name = name + "_target",
sdk_version = sdk_version,
tags = ["manual"],
)
sdk_spec_from_output_test(
name = name,
target_under_test = name + "_target",
actual_sdk_version = sdk_version,
expected_kind = expected_kind,
expected_api_level = expected_api_level,
)
return name
def sdk_version_test_suite(name):
# sdk version expected to fail to parse.
failing_sdk_versions = [
"malformed_malformed",
"malformed",
"",
"core_platform",
]
failure_tests = [
test_sdk_spec_from_failure(
name = sdk_version + "_failure_test",
sdk_version = sdk_version,
)
for sdk_version in failing_sdk_versions
]
# Map of sdk_version to expected kind and api_level
sdk_version_to_kind_and_api_level = {
"current": ("public", api.FUTURE_API_LEVEL),
"core_current": ("core", api.FUTURE_API_LEVEL),
"Tiramisu": ("public", 33),
"33": ("public", 33),
"public_33": ("public", 33),
"none": ("none", api.NONE_API_LEVEL),
"system_Tiramisu": ("system", 33),
"system_32": ("system", 32),
}
success_tests = [
test_sdk_spec_from_success(
name = sdk_version + "_success_test",
sdk_version = sdk_version,
expected_kind = sdk_version_to_kind_and_api_level[sdk_version][0],
expected_api_level = sdk_version_to_kind_and_api_level[sdk_version][1],
)
for sdk_version in sdk_version_to_kind_and_api_level.keys()
]
native.test_suite(
name = name,
tests = failure_tests + success_tests,
)