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