1// Copyright 2024 Google Inc. All rights reserved. 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 15package apex 16 17import ( 18 "fmt" 19 "testing" 20 21 "android/soong/android" 22 "android/soong/java" 23) 24 25var checkContainerMatch = func(t *testing.T, name string, container string, expected bool, actual bool) { 26 errorMessage := fmt.Sprintf("module %s container %s value differ", name, container) 27 android.AssertBoolEquals(t, errorMessage, expected, actual) 28} 29 30func TestApexDepsContainers(t *testing.T) { 31 t.Parallel() 32 t.Skip("TODO(b/394955484): this probably has to be moved to a check by the apex") 33 result := android.GroupFixturePreparers( 34 prepareForApexTest, 35 java.PrepareForTestWithJavaSdkLibraryFiles, 36 java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"), 37 ).RunTestWithBp(t, ` 38 apex { 39 name: "myapex", 40 key: "myapex.key", 41 bootclasspath_fragments: [ 42 "mybootclasspathfragment", 43 ], 44 updatable: true, 45 min_sdk_version: "30", 46 } 47 apex_key { 48 name: "myapex.key", 49 public_key: "testkey.avbpubkey", 50 private_key: "testkey.pem", 51 } 52 bootclasspath_fragment { 53 name: "mybootclasspathfragment", 54 contents: [ 55 "mybootclasspathlib", 56 ], 57 apex_available: [ 58 "myapex", 59 ], 60 hidden_api: { 61 split_packages: ["*"], 62 }, 63 } 64 java_sdk_library { 65 name: "mybootclasspathlib", 66 srcs: [ 67 "mybootclasspathlib.java", 68 ], 69 apex_available: [ 70 "myapex", 71 ], 72 compile_dex: true, 73 static_libs: [ 74 "food", 75 "baz", 76 ], 77 libs: [ 78 "bar.stubs", 79 ], 80 min_sdk_version: "30", 81 sdk_version: "current", 82 } 83 java_library { 84 name: "food", 85 srcs:[ 86 "A.java", 87 ], 88 apex_available: [ 89 "myapex", 90 ], 91 min_sdk_version: "30", 92 sdk_version: "core_current", 93 } 94 java_sdk_library { 95 name: "bar", 96 srcs:[ 97 "A.java", 98 ], 99 min_sdk_version: "30", 100 sdk_version: "core_current", 101 } 102 java_library { 103 name: "baz", 104 srcs:[ 105 "A.java", 106 ], 107 apex_available: [ 108 "//apex_available:platform", 109 "myapex", 110 ], 111 min_sdk_version: "30", 112 sdk_version: "core_current", 113 } 114 `) 115 testcases := []struct { 116 moduleName string 117 variant string 118 isSystemContainer bool 119 isApexContainer bool 120 }{ 121 { 122 moduleName: "mybootclasspathlib", 123 variant: "android_common_myapex", 124 isSystemContainer: true, 125 isApexContainer: true, 126 }, 127 { 128 moduleName: "mybootclasspathlib.impl", 129 variant: "android_common_apex30", 130 isSystemContainer: true, 131 isApexContainer: true, 132 }, 133 { 134 moduleName: "mybootclasspathlib.stubs", 135 variant: "android_common", 136 isSystemContainer: true, 137 isApexContainer: false, 138 }, 139 { 140 moduleName: "food", 141 variant: "android_common_apex30", 142 isSystemContainer: true, 143 isApexContainer: true, 144 }, 145 { 146 moduleName: "bar", 147 variant: "android_common", 148 isSystemContainer: true, 149 isApexContainer: false, 150 }, 151 { 152 moduleName: "baz", 153 variant: "android_common_apex30", 154 isSystemContainer: true, 155 isApexContainer: true, 156 }, 157 } 158 159 for _, c := range testcases { 160 m := result.ModuleForTests(t, c.moduleName, c.variant) 161 containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider) 162 belongingContainers := containers.BelongingContainers() 163 checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers)) 164 checkContainerMatch(t, c.moduleName, "apex", c.isApexContainer, android.InList(android.ApexContainer, belongingContainers)) 165 } 166} 167 168func TestNonUpdatableApexDepsContainers(t *testing.T) { 169 t.Parallel() 170 t.Skip("TODO(b/394955484): this probably has to be moved to a check by the apex") 171 result := android.GroupFixturePreparers( 172 prepareForApexTest, 173 java.PrepareForTestWithJavaSdkLibraryFiles, 174 java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"), 175 ).RunTestWithBp(t, ` 176 apex { 177 name: "myapex", 178 key: "myapex.key", 179 bootclasspath_fragments: [ 180 "mybootclasspathfragment", 181 ], 182 updatable: false, 183 } 184 apex_key { 185 name: "myapex.key", 186 public_key: "testkey.avbpubkey", 187 private_key: "testkey.pem", 188 } 189 bootclasspath_fragment { 190 name: "mybootclasspathfragment", 191 contents: [ 192 "mybootclasspathlib", 193 ], 194 apex_available: [ 195 "myapex", 196 ], 197 hidden_api: { 198 split_packages: ["*"], 199 }, 200 } 201 java_sdk_library { 202 name: "mybootclasspathlib", 203 srcs: [ 204 "mybootclasspathlib.java", 205 ], 206 apex_available: [ 207 "myapex", 208 ], 209 compile_dex: true, 210 static_libs: [ 211 "food", 212 ], 213 libs: [ 214 "bar.stubs", 215 ], 216 sdk_version: "current", 217 } 218 java_library { 219 name: "food", 220 srcs:[ 221 "A.java", 222 ], 223 apex_available: [ 224 "myapex", 225 ], 226 sdk_version: "core_current", 227 } 228 java_sdk_library { 229 name: "bar", 230 srcs:[ 231 "A.java", 232 ], 233 sdk_version: "none", 234 system_modules: "none", 235 } 236 `) 237 testcases := []struct { 238 moduleName string 239 variant string 240 isSystemContainer bool 241 isApexContainer bool 242 }{ 243 { 244 moduleName: "mybootclasspathlib", 245 variant: "android_common_myapex", 246 isSystemContainer: true, 247 isApexContainer: true, 248 }, 249 { 250 moduleName: "mybootclasspathlib.impl", 251 variant: "android_common_apex10000", 252 isSystemContainer: true, 253 isApexContainer: true, 254 }, 255 { 256 moduleName: "mybootclasspathlib.stubs", 257 variant: "android_common", 258 isSystemContainer: true, 259 isApexContainer: false, 260 }, 261 { 262 moduleName: "food", 263 variant: "android_common_apex10000", 264 isSystemContainer: true, 265 isApexContainer: true, 266 }, 267 { 268 moduleName: "bar", 269 variant: "android_common", 270 isSystemContainer: true, 271 isApexContainer: false, 272 }, 273 } 274 275 for _, c := range testcases { 276 m := result.ModuleForTests(t, c.moduleName, c.variant) 277 containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider) 278 belongingContainers := containers.BelongingContainers() 279 checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers)) 280 checkContainerMatch(t, c.moduleName, "apex", c.isApexContainer, android.InList(android.ApexContainer, belongingContainers)) 281 } 282} 283 284func TestUpdatableAndNonUpdatableApexesIdenticalMinSdkVersion(t *testing.T) { 285 t.Parallel() 286 t.Skip("TODO(b/394955484): this probably has to be moved to a check by the apex") 287 result := android.GroupFixturePreparers( 288 prepareForApexTest, 289 java.PrepareForTestWithJavaSdkLibraryFiles, 290 android.FixtureMergeMockFs(android.MockFS{ 291 "system/sepolicy/apex/myapex_non_updatable-file_contexts": nil, 292 "system/sepolicy/apex/myapex_updatable-file_contexts": nil, 293 }), 294 ).RunTestWithBp(t, ` 295 apex { 296 name: "myapex_non_updatable", 297 key: "myapex_non_updatable.key", 298 java_libs: [ 299 "foo", 300 ], 301 updatable: false, 302 min_sdk_version: "30", 303 } 304 apex_key { 305 name: "myapex_non_updatable.key", 306 public_key: "testkey.avbpubkey", 307 private_key: "testkey.pem", 308 } 309 310 apex { 311 name: "myapex_updatable", 312 key: "myapex_updatable.key", 313 java_libs: [ 314 "foo", 315 ], 316 updatable: true, 317 min_sdk_version: "30", 318 } 319 apex_key { 320 name: "myapex_updatable.key", 321 public_key: "testkey.avbpubkey", 322 private_key: "testkey.pem", 323 } 324 325 java_library { 326 name: "foo", 327 srcs:[ 328 "A.java", 329 ], 330 apex_available: [ 331 "myapex_non_updatable", 332 "myapex_updatable", 333 ], 334 min_sdk_version: "30", 335 sdk_version: "current", 336 compile_dex: true, 337 } 338 `) 339 340 fooApexVariant := result.ModuleForTests(t, "foo", "android_common_apex30") 341 containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), fooApexVariant.Module(), android.ContainersInfoProvider) 342 belongingContainers := containers.BelongingContainers() 343 checkContainerMatch(t, "foo", "system", true, android.InList(android.SystemContainer, belongingContainers)) 344 checkContainerMatch(t, "foo", "apex", true, android.InList(android.ApexContainer, belongingContainers)) 345} 346