xref: /aosp_15_r20/build/bazel/rules/common/api_test.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
2*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:api.bzl", "api_from_product")
3*7594170eSAndroid Build Coastguard Worker
4*7594170eSAndroid Build Coastguard Workerdef _is_preview_test_impl(ctx):
5*7594170eSAndroid Build Coastguard Worker    env = unittest.begin(ctx)
6*7594170eSAndroid Build Coastguard Worker    platform_sdk_variables = struct(
7*7594170eSAndroid Build Coastguard Worker        platform_version_active_codenames = ["UpsideDownCake"],
8*7594170eSAndroid Build Coastguard Worker    )
9*7594170eSAndroid Build Coastguard Worker    api = api_from_product(platform_sdk_variables)
10*7594170eSAndroid Build Coastguard Worker
11*7594170eSAndroid Build Coastguard Worker    # schema: version string to parse: is preview api
12*7594170eSAndroid Build Coastguard Worker    _LEVELS_UNDER_TEST = {
13*7594170eSAndroid Build Coastguard Worker        # numbers
14*7594170eSAndroid Build Coastguard Worker        "9": False,  # earliest released number
15*7594170eSAndroid Build Coastguard Worker        # codenames
16*7594170eSAndroid Build Coastguard Worker        "Tiramisu": False,
17*7594170eSAndroid Build Coastguard Worker        "UpsideDownCake": True,  # preview
18*7594170eSAndroid Build Coastguard Worker        "current": True,  # future (considered as preview)
19*7594170eSAndroid Build Coastguard Worker        "(no version)": True,
20*7594170eSAndroid Build Coastguard Worker        # preview numbers
21*7594170eSAndroid Build Coastguard Worker        "9000": True,  # preview
22*7594170eSAndroid Build Coastguard Worker        "10000": True,  # future (considered as preview)
23*7594170eSAndroid Build Coastguard Worker    }
24*7594170eSAndroid Build Coastguard Worker
25*7594170eSAndroid Build Coastguard Worker    for level, expected in _LEVELS_UNDER_TEST.items():
26*7594170eSAndroid Build Coastguard Worker        asserts.equals(env, expected, api.is_preview(level), "unexpected is_preview value for %s" % level)
27*7594170eSAndroid Build Coastguard Worker
28*7594170eSAndroid Build Coastguard Worker    return unittest.end(env)
29*7594170eSAndroid Build Coastguard Worker
30*7594170eSAndroid Build Coastguard Workeris_preview_test = unittest.make(_is_preview_test_impl)
31*7594170eSAndroid Build Coastguard Worker
32*7594170eSAndroid Build Coastguard Workerdef _default_app_target_sdk_string_test_impl(ctx):
33*7594170eSAndroid Build Coastguard Worker    env = unittest.begin(ctx)
34*7594170eSAndroid Build Coastguard Worker
35*7594170eSAndroid Build Coastguard Worker    asserts.equals(
36*7594170eSAndroid Build Coastguard Worker        env,
37*7594170eSAndroid Build Coastguard Worker        "33",
38*7594170eSAndroid Build Coastguard Worker        api_from_product(struct(
39*7594170eSAndroid Build Coastguard Worker            platform_sdk_final = True,
40*7594170eSAndroid Build Coastguard Worker            platform_sdk_version = 33,
41*7594170eSAndroid Build Coastguard Worker            platform_sdk_codename = "REL",
42*7594170eSAndroid Build Coastguard Worker            platform_version_active_codenames = [],
43*7594170eSAndroid Build Coastguard Worker        )).default_app_target_sdk_string(),
44*7594170eSAndroid Build Coastguard Worker        "unexpected default_app_target_sdk_string value with platform_sdk_final True and platform_sdk_version 33.",
45*7594170eSAndroid Build Coastguard Worker    )
46*7594170eSAndroid Build Coastguard Worker    asserts.equals(
47*7594170eSAndroid Build Coastguard Worker        env,
48*7594170eSAndroid Build Coastguard Worker        "VanillaIceCream",
49*7594170eSAndroid Build Coastguard Worker        api_from_product(struct(
50*7594170eSAndroid Build Coastguard Worker            platform_sdk_final = False,
51*7594170eSAndroid Build Coastguard Worker            platform_sdk_version = 33,
52*7594170eSAndroid Build Coastguard Worker            platform_sdk_codename = "VanillaIceCream",
53*7594170eSAndroid Build Coastguard Worker            platform_version_active_codenames = ["VanillaIceCream"],
54*7594170eSAndroid Build Coastguard Worker        )).default_app_target_sdk_string(),
55*7594170eSAndroid Build Coastguard Worker        "unexpected default_app_target_sdk_string value with platform_sdk_final False and platform_sdk_codename VanillaIceCream.",
56*7594170eSAndroid Build Coastguard Worker    )
57*7594170eSAndroid Build Coastguard Worker
58*7594170eSAndroid Build Coastguard Worker    return unittest.end(env)
59*7594170eSAndroid Build Coastguard Worker
60*7594170eSAndroid Build Coastguard Workerdefault_app_target_sdk_string_test = unittest.make(_default_app_target_sdk_string_test_impl)
61*7594170eSAndroid Build Coastguard Worker
62*7594170eSAndroid Build Coastguard Workerdef _effective_version_string_test_impl(ctx):
63*7594170eSAndroid Build Coastguard Worker    env = unittest.begin(ctx)
64*7594170eSAndroid Build Coastguard Worker
65*7594170eSAndroid Build Coastguard Worker    asserts.equals(
66*7594170eSAndroid Build Coastguard Worker        env,
67*7594170eSAndroid Build Coastguard Worker        "32",
68*7594170eSAndroid Build Coastguard Worker        api_from_product(struct(
69*7594170eSAndroid Build Coastguard Worker            platform_sdk_final = True,
70*7594170eSAndroid Build Coastguard Worker            platform_sdk_version = 33,
71*7594170eSAndroid Build Coastguard Worker            platform_sdk_codename = "REL",
72*7594170eSAndroid Build Coastguard Worker            platform_version_active_codenames = [],
73*7594170eSAndroid Build Coastguard Worker        )).effective_version_string("32"),
74*7594170eSAndroid Build Coastguard Worker        "unexpected effective version string when input version (32) is not preview",
75*7594170eSAndroid Build Coastguard Worker    )
76*7594170eSAndroid Build Coastguard Worker    asserts.equals(
77*7594170eSAndroid Build Coastguard Worker        env,
78*7594170eSAndroid Build Coastguard Worker        "33",
79*7594170eSAndroid Build Coastguard Worker        api_from_product(struct(
80*7594170eSAndroid Build Coastguard Worker            platform_sdk_final = True,
81*7594170eSAndroid Build Coastguard Worker            platform_sdk_version = 33,
82*7594170eSAndroid Build Coastguard Worker            platform_sdk_codename = "REL",
83*7594170eSAndroid Build Coastguard Worker            platform_version_active_codenames = [],
84*7594170eSAndroid Build Coastguard Worker        )).effective_version_string("current"),
85*7594170eSAndroid Build Coastguard Worker        "unexpected effective version string when input version (current) is preview and default_app_target_sdk (33) is not.",
86*7594170eSAndroid Build Coastguard Worker    )
87*7594170eSAndroid Build Coastguard Worker    asserts.equals(
88*7594170eSAndroid Build Coastguard Worker        env,
89*7594170eSAndroid Build Coastguard Worker        "VanillaIceCream",
90*7594170eSAndroid Build Coastguard Worker        api_from_product(struct(
91*7594170eSAndroid Build Coastguard Worker            platform_sdk_final = False,
92*7594170eSAndroid Build Coastguard Worker            platform_sdk_version = 33,
93*7594170eSAndroid Build Coastguard Worker            platform_sdk_codename = "UpsideDownCake",
94*7594170eSAndroid Build Coastguard Worker            platform_version_active_codenames = ["UpsideDownCake", "VanillaIceCream"],
95*7594170eSAndroid Build Coastguard Worker        )).effective_version_string("VanillaIceCream"),
96*7594170eSAndroid Build Coastguard Worker        "unexpected effective version string when both input version (VanillaIceCream) and default_app_target_sdk (UpsideDownCake) are preview.",
97*7594170eSAndroid Build Coastguard Worker    )
98*7594170eSAndroid Build Coastguard Worker    asserts.equals(
99*7594170eSAndroid Build Coastguard Worker        env,
100*7594170eSAndroid Build Coastguard Worker        "UpsideDownCake",
101*7594170eSAndroid Build Coastguard Worker        api_from_product(struct(
102*7594170eSAndroid Build Coastguard Worker            platform_sdk_final = False,
103*7594170eSAndroid Build Coastguard Worker            platform_sdk_version = 33,
104*7594170eSAndroid Build Coastguard Worker            platform_sdk_codename = "UpsideDownCake",
105*7594170eSAndroid Build Coastguard Worker            platform_version_active_codenames = ["UpsideDownCake", "VanillaIceCream"],
106*7594170eSAndroid Build Coastguard Worker        )).effective_version_string("current"),
107*7594170eSAndroid Build Coastguard Worker        "unexpected effective version string when both input version (current) and default_app_target_sdk (UpsideDownCake) are preview.",
108*7594170eSAndroid Build Coastguard Worker    )
109*7594170eSAndroid Build Coastguard Worker
110*7594170eSAndroid Build Coastguard Worker    return unittest.end(env)
111*7594170eSAndroid Build Coastguard Worker
112*7594170eSAndroid Build Coastguard Workereffective_version_string_test = unittest.make(_effective_version_string_test_impl)
113*7594170eSAndroid Build Coastguard Worker
114*7594170eSAndroid Build Coastguard Workerdef _api_levels_test_impl(ctx):
115*7594170eSAndroid Build Coastguard Worker    env = unittest.begin(ctx)
116*7594170eSAndroid Build Coastguard Worker    api = api_from_product(struct(
117*7594170eSAndroid Build Coastguard Worker        platform_sdk_final = False,
118*7594170eSAndroid Build Coastguard Worker        platform_sdk_version = 33,
119*7594170eSAndroid Build Coastguard Worker        platform_sdk_codename = "UpsideDownCake",
120*7594170eSAndroid Build Coastguard Worker        platform_version_active_codenames = ["UpsideDownCake"],
121*7594170eSAndroid Build Coastguard Worker    ))
122*7594170eSAndroid Build Coastguard Worker
123*7594170eSAndroid Build Coastguard Worker    # schema: version string to parse: expected api int
124*7594170eSAndroid Build Coastguard Worker    _LEVELS_UNDER_TEST = {
125*7594170eSAndroid Build Coastguard Worker        # numbers
126*7594170eSAndroid Build Coastguard Worker        "9": 9,  # earliest released number
127*7594170eSAndroid Build Coastguard Worker        "21": 21,
128*7594170eSAndroid Build Coastguard Worker        "30": 30,
129*7594170eSAndroid Build Coastguard Worker        "33": 33,
130*7594170eSAndroid Build Coastguard Worker        # unchecked non final api level (not finalized, not preview, not current)
131*7594170eSAndroid Build Coastguard Worker        "1234": 1234,
132*7594170eSAndroid Build Coastguard Worker        "8999": 8999,
133*7594170eSAndroid Build Coastguard Worker        "9999": 9999,
134*7594170eSAndroid Build Coastguard Worker        "10001": 10001,
135*7594170eSAndroid Build Coastguard Worker        # letters
136*7594170eSAndroid Build Coastguard Worker        "G": 9,  # earliest released letter
137*7594170eSAndroid Build Coastguard Worker        "J-MR1": 17,
138*7594170eSAndroid Build Coastguard Worker        "R": 30,
139*7594170eSAndroid Build Coastguard Worker        "S": 31,
140*7594170eSAndroid Build Coastguard Worker        "S-V2": 32,
141*7594170eSAndroid Build Coastguard Worker        # codenames
142*7594170eSAndroid Build Coastguard Worker        "Tiramisu": 33,
143*7594170eSAndroid Build Coastguard Worker        "UpsideDownCake": 9000,
144*7594170eSAndroid Build Coastguard Worker        "current": 10000,
145*7594170eSAndroid Build Coastguard Worker        "9000": 9000,
146*7594170eSAndroid Build Coastguard Worker        "10000": 10000,
147*7594170eSAndroid Build Coastguard Worker    }
148*7594170eSAndroid Build Coastguard Worker
149*7594170eSAndroid Build Coastguard Worker    for level, expected in _LEVELS_UNDER_TEST.items():
150*7594170eSAndroid Build Coastguard Worker        asserts.equals(env, expected, api.parse_api_level_from_version(level), "unexpected api level parsed for %s" % level)
151*7594170eSAndroid Build Coastguard Worker
152*7594170eSAndroid Build Coastguard Worker    return unittest.end(env)
153*7594170eSAndroid Build Coastguard Worker
154*7594170eSAndroid Build Coastguard Workerapi_levels_test = unittest.make(_api_levels_test_impl)
155*7594170eSAndroid Build Coastguard Worker
156*7594170eSAndroid Build Coastguard Workerdef _final_or_future_test_impl(ctx):
157*7594170eSAndroid Build Coastguard Worker    env = unittest.begin(ctx)
158*7594170eSAndroid Build Coastguard Worker    api = api_from_product(struct(
159*7594170eSAndroid Build Coastguard Worker        platform_sdk_final = False,
160*7594170eSAndroid Build Coastguard Worker        platform_sdk_version = 33,
161*7594170eSAndroid Build Coastguard Worker        platform_sdk_codename = "UpsideDownCake",
162*7594170eSAndroid Build Coastguard Worker        platform_version_active_codenames = ["UpsideDownCake"],
163*7594170eSAndroid Build Coastguard Worker    ))
164*7594170eSAndroid Build Coastguard Worker
165*7594170eSAndroid Build Coastguard Worker    # schema: version string to parse: expected api int
166*7594170eSAndroid Build Coastguard Worker    _LEVELS_UNDER_TEST = {
167*7594170eSAndroid Build Coastguard Worker        # finalized
168*7594170eSAndroid Build Coastguard Worker        "30": 30,
169*7594170eSAndroid Build Coastguard Worker        "33": 33,
170*7594170eSAndroid Build Coastguard Worker        "S": 31,
171*7594170eSAndroid Build Coastguard Worker        "S-V2": 32,
172*7594170eSAndroid Build Coastguard Worker        "Tiramisu": 33,
173*7594170eSAndroid Build Coastguard Worker        # not finalized
174*7594170eSAndroid Build Coastguard Worker        "UpsideDownCake": 10000,
175*7594170eSAndroid Build Coastguard Worker        "current": 10000,
176*7594170eSAndroid Build Coastguard Worker        "9000": 10000,
177*7594170eSAndroid Build Coastguard Worker        "10000": 10000,
178*7594170eSAndroid Build Coastguard Worker    }
179*7594170eSAndroid Build Coastguard Worker
180*7594170eSAndroid Build Coastguard Worker    for level, expected in _LEVELS_UNDER_TEST.items():
181*7594170eSAndroid Build Coastguard Worker        asserts.equals(
182*7594170eSAndroid Build Coastguard Worker            env,
183*7594170eSAndroid Build Coastguard Worker            expected,
184*7594170eSAndroid Build Coastguard Worker            api.final_or_future(api.parse_api_level_from_version(level)),
185*7594170eSAndroid Build Coastguard Worker            "unexpected final or future api for %s" % level,
186*7594170eSAndroid Build Coastguard Worker        )
187*7594170eSAndroid Build Coastguard Worker
188*7594170eSAndroid Build Coastguard Worker    return unittest.end(env)
189*7594170eSAndroid Build Coastguard Worker
190*7594170eSAndroid Build Coastguard Workerfinal_or_future_test = unittest.make(_final_or_future_test_impl)
191*7594170eSAndroid Build Coastguard Worker
192*7594170eSAndroid Build Coastguard Workerdef api_levels_test_suite(name):
193*7594170eSAndroid Build Coastguard Worker    tests = {
194*7594170eSAndroid Build Coastguard Worker        "api_levels": api_levels_test,
195*7594170eSAndroid Build Coastguard Worker        "final_or_future": final_or_future_test,
196*7594170eSAndroid Build Coastguard Worker        "is_preview": is_preview_test,
197*7594170eSAndroid Build Coastguard Worker        "default_app_target_sdk_string": default_app_target_sdk_string_test,
198*7594170eSAndroid Build Coastguard Worker        "effective_version_string": effective_version_string_test,
199*7594170eSAndroid Build Coastguard Worker    }
200*7594170eSAndroid Build Coastguard Worker
201*7594170eSAndroid Build Coastguard Worker    for test_name, test_function in tests.items():
202*7594170eSAndroid Build Coastguard Worker        test_function(name = name + "_" + test_name)
203*7594170eSAndroid Build Coastguard Worker
204*7594170eSAndroid Build Coastguard Worker    native.test_suite(
205*7594170eSAndroid Build Coastguard Worker        name = name,
206*7594170eSAndroid Build Coastguard Worker        tests = [name + "_" + test_name for test_name in tests.keys()],
207*7594170eSAndroid Build Coastguard Worker    )
208