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