1// Copyright (C) 2021 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 15package apex 16 17import ( 18 "strings" 19 "testing" 20 21 "android/soong/android" 22 "android/soong/dexpreopt" 23 "android/soong/java" 24) 25 26var prepareForTestWithSystemserverclasspathFragment = android.GroupFixturePreparers( 27 java.PrepareForTestWithDexpreopt, 28 PrepareForTestWithApexBuildComponents, 29) 30 31func TestSystemserverclasspathFragmentContents(t *testing.T) { 32 t.Parallel() 33 result := android.GroupFixturePreparers( 34 prepareForTestWithSystemserverclasspathFragment, 35 prepareForTestWithMyapex, 36 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"), 37 ).RunTestWithBp(t, ` 38 apex { 39 name: "myapex", 40 key: "myapex.key", 41 systemserverclasspath_fragments: [ 42 "mysystemserverclasspathfragment", 43 ], 44 updatable: false, 45 } 46 47 apex_key { 48 name: "myapex.key", 49 public_key: "testkey.avbpubkey", 50 private_key: "testkey.pem", 51 } 52 53 java_library { 54 name: "foo", 55 srcs: ["b.java"], 56 installable: true, 57 apex_available: [ 58 "myapex", 59 ], 60 } 61 62 java_library { 63 name: "bar", 64 srcs: ["c.java"], 65 installable: true, 66 dex_preopt: { 67 profile: "bar-art-profile", 68 }, 69 apex_available: [ 70 "myapex", 71 ], 72 } 73 74 java_library { 75 name: "baz", 76 srcs: ["d.java"], 77 installable: true, 78 dex_preopt: { 79 profile_guided: true, // ignored 80 }, 81 apex_available: [ 82 "myapex", 83 ], 84 sdk_version: "core_current", 85 } 86 87 systemserverclasspath_fragment { 88 name: "mysystemserverclasspathfragment", 89 contents: [ 90 "foo", 91 "bar", 92 "baz", 93 ], 94 apex_available: [ 95 "myapex", 96 ], 97 } 98 `) 99 100 ctx := result.TestContext 101 102 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 103 "etc/classpaths/systemserverclasspath.pb", 104 "javalib/foo.jar", 105 "javalib/bar.jar", 106 "javalib/bar.jar.prof", 107 "javalib/baz.jar", 108 }) 109 110 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{ 111 `dex2oatd`, 112 `myapex.key`, 113 `mysystemserverclasspathfragment`, 114 }) 115 116 assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false) 117 assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true) 118 assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false) 119} 120 121func TestSystemserverclasspathFragmentNoGeneratedProto(t *testing.T) { 122 t.Parallel() 123 result := android.GroupFixturePreparers( 124 prepareForTestWithSystemserverclasspathFragment, 125 prepareForTestWithMyapex, 126 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"), 127 ).RunTestWithBp(t, ` 128 apex { 129 name: "myapex", 130 key: "myapex.key", 131 systemserverclasspath_fragments: [ 132 "mysystemserverclasspathfragment", 133 ], 134 updatable: false, 135 } 136 137 apex_key { 138 name: "myapex.key", 139 public_key: "testkey.avbpubkey", 140 private_key: "testkey.pem", 141 } 142 143 java_library { 144 name: "foo", 145 srcs: ["b.java"], 146 installable: true, 147 apex_available: [ 148 "myapex", 149 ], 150 } 151 152 systemserverclasspath_fragment { 153 name: "mysystemserverclasspathfragment", 154 generate_classpaths_proto: false, 155 contents: [ 156 "foo", 157 ], 158 apex_available: [ 159 "myapex", 160 ], 161 } 162 `) 163 164 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{ 165 "javalib/foo.jar", 166 }) 167 168 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{ 169 `dex2oatd`, 170 `myapex.key`, 171 `mysystemserverclasspathfragment`, 172 }) 173} 174 175func TestSystemServerClasspathFragmentWithContentNotInMake(t *testing.T) { 176 t.Parallel() 177 android.GroupFixturePreparers( 178 prepareForTestWithSystemserverclasspathFragment, 179 prepareForTestWithMyapex, 180 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"), 181 ). 182 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( 183 `in contents must also be declared in PRODUCT_APEX_SYSTEM_SERVER_JARS`)). 184 RunTestWithBp(t, ` 185 apex { 186 name: "myapex", 187 key: "myapex.key", 188 systemserverclasspath_fragments: [ 189 "mysystemserverclasspathfragment", 190 ], 191 updatable: false, 192 } 193 194 apex_key { 195 name: "myapex.key", 196 public_key: "testkey.avbpubkey", 197 private_key: "testkey.pem", 198 } 199 200 java_library { 201 name: "foo", 202 srcs: ["b.java"], 203 installable: true, 204 apex_available: ["myapex"], 205 } 206 207 java_library { 208 name: "bar", 209 srcs: ["b.java"], 210 installable: true, 211 apex_available: ["myapex"], 212 } 213 214 systemserverclasspath_fragment { 215 name: "mysystemserverclasspathfragment", 216 contents: [ 217 "foo", 218 "bar", 219 ], 220 apex_available: [ 221 "myapex", 222 ], 223 } 224 `) 225} 226 227func TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) { 228 t.Parallel() 229 result := android.GroupFixturePreparers( 230 prepareForTestWithSystemserverclasspathFragment, 231 prepareForTestWithMyapex, 232 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar"), 233 ).RunTestWithBp(t, ` 234 prebuilt_apex { 235 name: "myapex", 236 arch: { 237 arm64: { 238 src: "myapex-arm64.apex", 239 }, 240 arm: { 241 src: "myapex-arm.apex", 242 }, 243 }, 244 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 245 } 246 247 java_import { 248 name: "foo", 249 jars: ["foo.jar"], 250 apex_available: [ 251 "myapex", 252 ], 253 } 254 255 java_import { 256 name: "bar", 257 jars: ["bar.jar"], 258 dex_preopt: { 259 profile_guided: true, 260 }, 261 apex_available: [ 262 "myapex", 263 ], 264 } 265 266 prebuilt_systemserverclasspath_fragment { 267 name: "mysystemserverclasspathfragment", 268 prefer: true, 269 contents: [ 270 "foo", 271 "bar", 272 ], 273 apex_available: [ 274 "myapex", 275 ], 276 } 277 `) 278 279 ctx := result.TestContext 280 281 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{ 282 `all_apex_contributions`, 283 `dex2oatd`, 284 `prebuilt_mysystemserverclasspathfragment`, 285 }) 286 287 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{ 288 `all_apex_contributions`, 289 `prebuilt_bar`, 290 `prebuilt_foo`, 291 }) 292 293 ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{ 294 "javalib/foo.jar", 295 "javalib/bar.jar", 296 "javalib/bar.jar.prof", 297 }) 298 299 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false) 300 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true) 301} 302 303func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) { 304 t.Parallel() 305 result := android.GroupFixturePreparers( 306 prepareForTestWithSystemserverclasspathFragment, 307 prepareForTestWithMyapex, 308 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"), 309 ).RunTestWithBp(t, ` 310 apex { 311 name: "myapex", 312 key: "myapex.key", 313 systemserverclasspath_fragments: [ 314 "mysystemserverclasspathfragment", 315 ], 316 updatable: false, 317 } 318 319 apex_key { 320 name: "myapex.key", 321 public_key: "testkey.avbpubkey", 322 private_key: "testkey.pem", 323 } 324 325 java_library { 326 name: "foo", 327 srcs: ["b.java"], 328 installable: true, 329 apex_available: [ 330 "myapex", 331 ], 332 } 333 334 java_library { 335 name: "bar", 336 srcs: ["c.java"], 337 dex_preopt: { 338 profile: "bar-art-profile", 339 }, 340 installable: true, 341 apex_available: [ 342 "myapex", 343 ], 344 } 345 346 java_library { 347 name: "baz", 348 srcs: ["d.java"], 349 dex_preopt: { 350 profile_guided: true, // ignored 351 }, 352 installable: true, 353 apex_available: [ 354 "myapex", 355 ], 356 sdk_version: "core_current", 357 } 358 359 systemserverclasspath_fragment { 360 name: "mysystemserverclasspathfragment", 361 standalone_contents: [ 362 "foo", 363 "bar", 364 "baz", 365 ], 366 apex_available: [ 367 "myapex", 368 ], 369 } 370 `) 371 372 ctx := result.TestContext 373 374 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ 375 "etc/classpaths/systemserverclasspath.pb", 376 "javalib/foo.jar", 377 "javalib/bar.jar", 378 "javalib/bar.jar.prof", 379 "javalib/baz.jar", 380 }) 381 382 assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false) 383 assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true) 384 assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false) 385} 386 387func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) { 388 t.Parallel() 389 result := android.GroupFixturePreparers( 390 prepareForTestWithSystemserverclasspathFragment, 391 prepareForTestWithMyapex, 392 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar"), 393 ).RunTestWithBp(t, ` 394 prebuilt_apex { 395 name: "myapex", 396 arch: { 397 arm64: { 398 src: "myapex-arm64.apex", 399 }, 400 arm: { 401 src: "myapex-arm.apex", 402 }, 403 }, 404 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 405 } 406 407 java_import { 408 name: "foo", 409 jars: ["foo.jar"], 410 apex_available: [ 411 "myapex", 412 ], 413 } 414 415 java_import { 416 name: "bar", 417 jars: ["bar.jar"], 418 dex_preopt: { 419 profile_guided: true, 420 }, 421 apex_available: [ 422 "myapex", 423 ], 424 } 425 426 prebuilt_systemserverclasspath_fragment { 427 name: "mysystemserverclasspathfragment", 428 prefer: true, 429 standalone_contents: [ 430 "foo", 431 "bar", 432 ], 433 apex_available: [ 434 "myapex", 435 ], 436 } 437 `) 438 439 ctx := result.TestContext 440 441 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{ 442 `all_apex_contributions`, 443 `prebuilt_bar`, 444 `prebuilt_foo`, 445 }) 446 447 ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{ 448 "javalib/foo.jar", 449 "javalib/bar.jar", 450 "javalib/bar.jar.prof", 451 }) 452 453 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false) 454 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true) 455} 456 457func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) { 458 dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt") 459 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=") 460 if expected != actual { 461 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual) 462 } 463} 464 465func assertProfileGuidedPrebuilt(t *testing.T, ctx *android.TestContext, apexName string, moduleName string, expected bool) { 466 dexpreopt := ctx.ModuleForTests(apexName, "android_common_"+apexName).Rule("dexpreopt." + moduleName) 467 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=") 468 if expected != actual { 469 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual) 470 } 471} 472