xref: /aosp_15_r20/build/bazel/rules/common/sdk_version_test.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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