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