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