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 "testing" 19 20 "android/soong/aconfig/codegen" 21 "android/soong/android" 22 "android/soong/cc" 23 "android/soong/genrule" 24 "android/soong/java" 25 "android/soong/rust" 26 27 "github.com/google/blueprint/proptools" 28) 29 30var withAconfigValidationError = android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 31 variables.AconfigContainerValidation = "error" 32 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID") 33}) 34 35func TestValidationAcrossContainersExportedPass(t *testing.T) { 36 t.Parallel() 37 testCases := []struct { 38 name string 39 bp string 40 }{ 41 { 42 name: "Java lib passes for exported containers cross", 43 bp: apex_default_bp + ` 44 apex { 45 name: "myapex", 46 manifest: ":myapex.manifest", 47 androidManifest: ":myapex.androidmanifest", 48 key: "myapex.key", 49 java_libs: [ 50 "my_java_library_foo", 51 ], 52 updatable: false, 53 } 54 java_library { 55 name: "my_java_library_foo", 56 srcs: ["foo/bar/MyClass.java"], 57 sdk_version: "none", 58 system_modules: "none", 59 static_libs: ["my_java_aconfig_library_foo"], 60 apex_available: [ 61 "myapex", 62 ], 63 compile_dex: true, 64 } 65 aconfig_declarations { 66 name: "my_aconfig_declarations_foo", 67 package: "com.example.package", 68 container: "otherapex", 69 srcs: ["foo.aconfig"], 70 exportable: true, 71 } 72 java_aconfig_library { 73 name: "my_java_aconfig_library_foo", 74 aconfig_declarations: "my_aconfig_declarations_foo", 75 mode: "exported", 76 apex_available: [ 77 "myapex", 78 ], 79 sdk_version: "none", 80 system_modules: "none", 81 }`, 82 }, 83 { 84 name: "Android app passes for exported containers cross", 85 bp: apex_default_bp + ` 86 apex { 87 name: "myapex", 88 manifest: ":myapex.manifest", 89 androidManifest: ":myapex.androidmanifest", 90 key: "myapex.key", 91 apps: [ 92 "my_android_app_foo", 93 ], 94 updatable: false, 95 } 96 android_app { 97 name: "my_android_app_foo", 98 srcs: ["foo/MyClass.java"], 99 sdk_version: "none", 100 system_modules: "none", 101 stl: "none", 102 static_libs: ["my_java_library_bar"], 103 apex_available: [ "myapex" ], 104 } 105 java_library { 106 name: "my_java_library_bar", 107 srcs: ["foo/bar/MyClass.java"], 108 sdk_version: "none", 109 system_modules: "none", 110 static_libs: ["my_java_aconfig_library_bar"], 111 apex_available: [ 112 "myapex", 113 ], 114 } 115 aconfig_declarations { 116 name: "my_aconfig_declarations_bar", 117 package: "com.example.package", 118 container: "otherapex", 119 srcs: ["bar.aconfig"], 120 exportable: true, 121 } 122 java_aconfig_library { 123 name: "my_java_aconfig_library_bar", 124 aconfig_declarations: "my_aconfig_declarations_bar", 125 mode: "exported", 126 apex_available: [ 127 "myapex", 128 ], 129 sdk_version: "none", 130 system_modules: "none", 131 }`, 132 }, 133 { 134 name: "Cc lib passes for exported containers cross", 135 bp: apex_default_bp + ` 136 apex { 137 name: "myapex", 138 manifest: ":myapex.manifest", 139 androidManifest: ":myapex.androidmanifest", 140 key: "myapex.key", 141 native_shared_libs: [ 142 "my_cc_library_bar", 143 ], 144 binaries: [ 145 "my_cc_binary_baz", 146 ], 147 updatable: false, 148 } 149 cc_library { 150 name: "my_cc_library_bar", 151 srcs: ["foo/bar/MyClass.cc"], 152 static_libs: [ 153 "my_cc_aconfig_library_bar", 154 "my_cc_aconfig_library_baz", 155 ], 156 apex_available: [ 157 "myapex", 158 ], 159 } 160 cc_binary { 161 name: "my_cc_binary_baz", 162 srcs: ["foo/bar/MyClass.cc"], 163 static_libs: ["my_cc_aconfig_library_baz"], 164 apex_available: [ 165 "myapex", 166 ], 167 } 168 cc_library { 169 name: "server_configurable_flags", 170 srcs: ["server_configurable_flags.cc"], 171 } 172 cc_library { 173 name: "libbase", 174 srcs: ["libbase.cc"], 175 apex_available: [ 176 "myapex", 177 ], 178 } 179 cc_library { 180 name: "libaconfig_storage_read_api_cc", 181 srcs: ["libaconfig_storage_read_api_cc.cc"], 182 } 183 aconfig_declarations { 184 name: "my_aconfig_declarations_bar", 185 package: "com.example.package", 186 container: "otherapex", 187 srcs: ["bar.aconfig"], 188 exportable: true, 189 } 190 cc_aconfig_library { 191 name: "my_cc_aconfig_library_bar", 192 aconfig_declarations: "my_aconfig_declarations_bar", 193 apex_available: [ 194 "myapex", 195 ], 196 mode: "exported", 197 } 198 aconfig_declarations { 199 name: "my_aconfig_declarations_baz", 200 package: "com.example.package", 201 container: "otherapex", 202 srcs: ["baz.aconfig"], 203 exportable: true, 204 } 205 cc_aconfig_library { 206 name: "my_cc_aconfig_library_baz", 207 aconfig_declarations: "my_aconfig_declarations_baz", 208 apex_available: [ 209 "myapex", 210 ], 211 mode: "exported", 212 }`, 213 }, 214 { 215 name: "Rust lib passes for exported containers cross", 216 bp: apex_default_bp + ` 217 apex { 218 name: "myapex", 219 manifest: ":myapex.manifest", 220 androidManifest: ":myapex.androidmanifest", 221 key: "myapex.key", 222 native_shared_libs: ["libmy_rust_library"], 223 binaries: ["my_rust_binary"], 224 updatable: false, 225 } 226 rust_library { 227 name: "libflags_rust", // test mock 228 crate_name: "flags_rust", 229 srcs: ["lib.rs"], 230 apex_available: ["myapex"], 231 } 232 rust_library { 233 name: "liblazy_static", // test mock 234 crate_name: "lazy_static", 235 srcs: ["src/lib.rs"], 236 apex_available: ["myapex"], 237 } 238 rust_library { 239 name: "libaconfig_storage_read_api", // test mock 240 crate_name: "aconfig_storage_read_api", 241 srcs: ["src/lib.rs"], 242 apex_available: ["myapex"], 243 } 244 rust_library { 245 name: "liblogger", // test mock 246 crate_name: "logger", 247 srcs: ["src/lib.rs"], 248 apex_available: ["myapex"], 249 } 250 rust_library { 251 name: "liblog_rust", // test mock 252 crate_name: "log_rust", 253 srcs: ["src/lib.rs"], 254 apex_available: ["myapex"], 255 } 256 rust_ffi_shared { 257 name: "libmy_rust_library", 258 srcs: ["src/lib.rs"], 259 rustlibs: ["libmy_rust_aconfig_library_foo"], 260 crate_name: "my_rust_library", 261 apex_available: ["myapex"], 262 } 263 rust_binary { 264 name: "my_rust_binary", 265 srcs: ["foo/bar/MyClass.rs"], 266 rustlibs: ["libmy_rust_aconfig_library_bar"], 267 apex_available: ["myapex"], 268 } 269 aconfig_declarations { 270 name: "my_aconfig_declarations_foo", 271 package: "com.example.package", 272 container: "otherapex", 273 srcs: ["foo.aconfig"], 274 } 275 aconfig_declarations { 276 name: "my_aconfig_declarations_bar", 277 package: "com.example.package", 278 container: "otherapex", 279 srcs: ["bar.aconfig"], 280 } 281 rust_aconfig_library { 282 name: "libmy_rust_aconfig_library_foo", 283 aconfig_declarations: "my_aconfig_declarations_foo", 284 crate_name: "my_rust_aconfig_library_foo", 285 apex_available: ["myapex"], 286 mode: "exported", 287 } 288 rust_aconfig_library { 289 name: "libmy_rust_aconfig_library_bar", 290 aconfig_declarations: "my_aconfig_declarations_bar", 291 crate_name: "my_rust_aconfig_library_bar", 292 apex_available: ["myapex"], 293 mode: "exported", 294 }`, 295 }, 296 } 297 for _, test := range testCases { 298 t.Run(test.name, func(t *testing.T) { 299 t.Parallel() 300 android.GroupFixturePreparers( 301 java.PrepareForTestWithJavaDefaultModules, 302 cc.PrepareForTestWithCcBuildComponents, 303 rust.PrepareForTestWithRustDefaultModules, 304 codegen.PrepareForTestWithAconfigBuildComponents, 305 PrepareForTestWithApexBuildComponents, 306 prepareForTestWithMyapex, 307 withAconfigValidationError, 308 ). 309 RunTestWithBp(t, test.bp) 310 }) 311 } 312} 313 314func TestValidationAcrossContainersNotExportedFail(t *testing.T) { 315 t.Parallel() 316 testCases := []struct { 317 name string 318 expectedError string 319 bp string 320 }{ 321 { 322 name: "Java lib fails for non-exported containers cross", 323 bp: apex_default_bp + ` 324 apex { 325 name: "myapex", 326 manifest: ":myapex.manifest", 327 androidManifest: ":myapex.androidmanifest", 328 key: "myapex.key", 329 java_libs: [ 330 "my_java_library_foo", 331 ], 332 updatable: false, 333 } 334 java_library { 335 name: "my_java_library_foo", 336 srcs: ["foo/bar/MyClass.java"], 337 sdk_version: "none", 338 system_modules: "none", 339 static_libs: ["my_java_aconfig_library_foo"], 340 apex_available: [ 341 "myapex", 342 ], 343 compile_dex: true, 344 } 345 aconfig_declarations { 346 name: "my_aconfig_declarations_foo", 347 package: "com.example.package", 348 container: "otherapex", 349 srcs: ["foo.aconfig"], 350 } 351 java_aconfig_library { 352 name: "my_java_aconfig_library_foo", 353 aconfig_declarations: "my_aconfig_declarations_foo", 354 apex_available: [ 355 "myapex", 356 ], 357 sdk_version: "none", 358 system_modules: "none", 359 }`, 360 expectedError: `.*my_java_library_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`, 361 }, 362 { 363 name: "Android app fails for non-exported containers cross", 364 bp: apex_default_bp + ` 365 apex { 366 name: "myapex", 367 manifest: ":myapex.manifest", 368 androidManifest: ":myapex.androidmanifest", 369 key: "myapex.key", 370 apps: [ 371 "my_android_app_foo", 372 ], 373 updatable: false, 374 } 375 android_app { 376 name: "my_android_app_foo", 377 srcs: ["foo/MyClass.java"], 378 sdk_version: "none", 379 system_modules: "none", 380 stl: "none", 381 static_libs: ["my_java_library_foo"], 382 apex_available: [ "myapex" ], 383 } 384 java_library { 385 name: "my_java_library_foo", 386 srcs: ["foo/bar/MyClass.java"], 387 sdk_version: "none", 388 system_modules: "none", 389 static_libs: ["my_java_aconfig_library_foo"], 390 apex_available: [ 391 "myapex", 392 ], 393 } 394 aconfig_declarations { 395 name: "my_aconfig_declarations_foo", 396 package: "com.example.package", 397 container: "otherapex", 398 srcs: ["bar.aconfig"], 399 } 400 java_aconfig_library { 401 name: "my_java_aconfig_library_foo", 402 aconfig_declarations: "my_aconfig_declarations_foo", 403 apex_available: [ 404 "myapex", 405 ], 406 sdk_version: "none", 407 system_modules: "none", 408 }`, 409 expectedError: `.*my_android_app_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`, 410 }, 411 { 412 name: "Cc lib fails for non-exported containers cross", 413 bp: apex_default_bp + ` 414 apex { 415 name: "myapex", 416 manifest: ":myapex.manifest", 417 androidManifest: ":myapex.androidmanifest", 418 key: "myapex.key", 419 native_shared_libs: [ 420 "my_cc_library_foo", 421 ], 422 updatable: false, 423 } 424 cc_library { 425 name: "my_cc_library_foo", 426 srcs: ["foo/bar/MyClass.cc"], 427 shared_libs: [ 428 "my_cc_aconfig_library_foo", 429 ], 430 apex_available: [ 431 "myapex", 432 ], 433 } 434 cc_library { 435 name: "server_configurable_flags", 436 srcs: ["server_configurable_flags.cc"], 437 } 438 cc_library { 439 name: "libbase", 440 srcs: ["libbase.cc"], 441 apex_available: [ 442 "myapex", 443 ], 444 } 445 cc_library { 446 name: "libaconfig_storage_read_api_cc", 447 srcs: ["libaconfig_storage_read_api_cc.cc"], 448 } 449 aconfig_declarations { 450 name: "my_aconfig_declarations_foo", 451 package: "com.example.package", 452 container: "otherapex", 453 srcs: ["foo.aconfig"], 454 } 455 cc_aconfig_library { 456 name: "my_cc_aconfig_library_foo", 457 aconfig_declarations: "my_aconfig_declarations_foo", 458 apex_available: [ 459 "myapex", 460 ], 461 }`, 462 expectedError: `.*my_cc_library_foo/myapex depends on my_cc_aconfig_library_foo/otherapex/production across containers`, 463 }, 464 { 465 name: "Cc binary fails for non-exported containers cross", 466 bp: apex_default_bp + ` 467 apex { 468 name: "myapex", 469 manifest: ":myapex.manifest", 470 androidManifest: ":myapex.androidmanifest", 471 key: "myapex.key", 472 binaries: [ 473 "my_cc_binary_foo", 474 ], 475 updatable: false, 476 } 477 cc_library { 478 name: "my_cc_library_foo", 479 srcs: ["foo/bar/MyClass.cc"], 480 static_libs: [ 481 "my_cc_aconfig_library_foo", 482 ], 483 apex_available: [ 484 "myapex", 485 ], 486 } 487 cc_binary { 488 name: "my_cc_binary_foo", 489 srcs: ["foo/bar/MyClass.cc"], 490 static_libs: ["my_cc_library_foo"], 491 apex_available: [ 492 "myapex", 493 ], 494 } 495 cc_library { 496 name: "server_configurable_flags", 497 srcs: ["server_configurable_flags.cc"], 498 } 499 cc_library { 500 name: "libbase", 501 srcs: ["libbase.cc"], 502 apex_available: [ 503 "myapex", 504 ], 505 } 506 cc_library { 507 name: "libaconfig_storage_read_api_cc", 508 srcs: ["libaconfig_storage_read_api_cc.cc"], 509 } 510 aconfig_declarations { 511 name: "my_aconfig_declarations_foo", 512 package: "com.example.package", 513 container: "otherapex", 514 srcs: ["foo.aconfig"], 515 } 516 cc_aconfig_library { 517 name: "my_cc_aconfig_library_foo", 518 aconfig_declarations: "my_aconfig_declarations_foo", 519 apex_available: [ 520 "myapex", 521 ], 522 }`, 523 expectedError: `.*my_cc_binary_foo/myapex depends on my_cc_aconfig_library_foo/otherapex/production across containers`, 524 }, 525 { 526 name: "Rust lib fails for non-exported containers cross", 527 bp: apex_default_bp + ` 528 apex { 529 name: "myapex", 530 manifest: ":myapex.manifest", 531 androidManifest: ":myapex.androidmanifest", 532 key: "myapex.key", 533 native_shared_libs: ["libmy_rust_library"], 534 updatable: false, 535 } 536 rust_library { 537 name: "libflags_rust", // test mock 538 crate_name: "flags_rust", 539 srcs: ["lib.rs"], 540 apex_available: ["myapex"], 541 } 542 rust_library { 543 name: "liblazy_static", // test mock 544 crate_name: "lazy_static", 545 srcs: ["src/lib.rs"], 546 apex_available: ["myapex"], 547 } 548 rust_library { 549 name: "libaconfig_storage_read_api", // test mock 550 crate_name: "aconfig_storage_read_api", 551 srcs: ["src/lib.rs"], 552 apex_available: ["myapex"], 553 } 554 rust_library { 555 name: "liblogger", // test mock 556 crate_name: "logger", 557 srcs: ["src/lib.rs"], 558 apex_available: ["myapex"], 559 } 560 rust_library { 561 name: "liblog_rust", // test mock 562 crate_name: "log_rust", 563 srcs: ["src/lib.rs"], 564 apex_available: ["myapex"], 565 } 566 rust_ffi_shared { 567 name: "libmy_rust_library", 568 srcs: ["src/lib.rs"], 569 rustlibs: ["libmy_rust_aconfig_library_foo"], 570 crate_name: "my_rust_library", 571 apex_available: ["myapex"], 572 } 573 aconfig_declarations { 574 name: "my_aconfig_declarations_foo", 575 package: "com.example.package", 576 container: "otherapex", 577 srcs: ["foo.aconfig"], 578 } 579 rust_aconfig_library { 580 name: "libmy_rust_aconfig_library_foo", 581 aconfig_declarations: "my_aconfig_declarations_foo", 582 crate_name: "my_rust_aconfig_library_foo", 583 apex_available: ["myapex"], 584 }`, 585 expectedError: `.*libmy_rust_aconfig_library_foo/myapex depends on libmy_rust_aconfig_library_foo/otherapex/production across containers`, 586 }, 587 { 588 name: "Rust binary fails for non-exported containers cross", 589 bp: apex_default_bp + ` 590 apex { 591 name: "myapex", 592 manifest: ":myapex.manifest", 593 androidManifest: ":myapex.androidmanifest", 594 key: "myapex.key", 595 binaries: ["my_rust_binary"], 596 updatable: false, 597 } 598 rust_library { 599 name: "libflags_rust", // test mock 600 crate_name: "flags_rust", 601 srcs: ["lib.rs"], 602 apex_available: ["myapex"], 603 } 604 rust_library { 605 name: "liblazy_static", // test mock 606 crate_name: "lazy_static", 607 srcs: ["src/lib.rs"], 608 apex_available: ["myapex"], 609 } 610 rust_library { 611 name: "libaconfig_storage_read_api", // test mock 612 crate_name: "aconfig_storage_read_api", 613 srcs: ["src/lib.rs"], 614 apex_available: ["myapex"], 615 } 616 rust_library { 617 name: "liblogger", // test mock 618 crate_name: "logger", 619 srcs: ["src/lib.rs"], 620 apex_available: ["myapex"], 621 } 622 rust_library { 623 name: "liblog_rust", // test mock 624 crate_name: "log_rust", 625 srcs: ["src/lib.rs"], 626 apex_available: ["myapex"], 627 } 628 rust_binary { 629 name: "my_rust_binary", 630 srcs: ["foo/bar/MyClass.rs"], 631 rustlibs: ["libmy_rust_aconfig_library_bar"], 632 apex_available: ["myapex"], 633 } 634 aconfig_declarations { 635 name: "my_aconfig_declarations_bar", 636 package: "com.example.package", 637 container: "otherapex", 638 srcs: ["bar.aconfig"], 639 } 640 rust_aconfig_library { 641 name: "libmy_rust_aconfig_library_bar", 642 aconfig_declarations: "my_aconfig_declarations_bar", 643 crate_name: "my_rust_aconfig_library_bar", 644 apex_available: ["myapex"], 645 }`, 646 expectedError: `.*libmy_rust_aconfig_library_bar/myapex depends on libmy_rust_aconfig_library_bar/otherapex/production across containers`, 647 }, 648 { 649 name: "Aconfig validation propagate along sourceOrOutputDependencyTag", 650 bp: apex_default_bp + ` 651 apex { 652 name: "myapex", 653 manifest: ":myapex.manifest", 654 androidManifest: ":myapex.androidmanifest", 655 key: "myapex.key", 656 apps: [ 657 "my_android_app_foo", 658 ], 659 updatable: false, 660 } 661 android_app { 662 name: "my_android_app_foo", 663 srcs: ["foo/MyClass.java"], 664 sdk_version: "none", 665 system_modules: "none", 666 stl: "none", 667 static_libs: ["my_java_library_foo"], 668 apex_available: [ "myapex" ], 669 } 670 java_library { 671 name: "my_java_library_foo", 672 srcs: [":my_genrule_foo"], 673 sdk_version: "none", 674 system_modules: "none", 675 apex_available: [ 676 "myapex", 677 ], 678 } 679 aconfig_declarations_group { 680 name: "my_aconfig_declarations_group_foo", 681 java_aconfig_libraries: [ 682 "my_java_aconfig_library_foo", 683 ], 684 } 685 filegroup { 686 name: "my_filegroup_foo_srcjars", 687 device_common_srcs: [ 688 ":my_aconfig_declarations_group_foo{.srcjars}", 689 ], 690 } 691 genrule { 692 name: "my_genrule_foo", 693 srcs: [":my_filegroup_foo_srcjars"], 694 cmd: "cp $(in) $(out)", 695 out: ["my_genrule_foo.srcjar"], 696 } 697 aconfig_declarations { 698 name: "my_aconfig_declarations_foo", 699 package: "com.example.package", 700 container: "otherapex", 701 srcs: ["bar.aconfig"], 702 } 703 java_aconfig_library { 704 name: "my_java_aconfig_library_foo", 705 aconfig_declarations: "my_aconfig_declarations_foo", 706 apex_available: [ 707 "myapex", 708 ], 709 sdk_version: "none", 710 system_modules: "none", 711 }`, 712 expectedError: `.*my_android_app_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`, 713 }, 714 } 715 for _, test := range testCases { 716 t.Run(test.name, func(t *testing.T) { 717 t.Parallel() 718 errorHandler := android.FixtureExpectsNoErrors 719 if test.expectedError != "" { 720 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError) 721 } 722 android.GroupFixturePreparers( 723 java.PrepareForTestWithJavaDefaultModules, 724 cc.PrepareForTestWithCcBuildComponents, 725 rust.PrepareForTestWithRustDefaultModules, 726 codegen.PrepareForTestWithAconfigBuildComponents, 727 genrule.PrepareForIntegrationTestWithGenrule, 728 PrepareForTestWithApexBuildComponents, 729 prepareForTestWithMyapex, 730 withAconfigValidationError, 731 ). 732 ExtendWithErrorHandler(errorHandler). 733 RunTestWithBp(t, test.bp) 734 }) 735 } 736} 737 738func TestValidationNotPropagateAcrossShared(t *testing.T) { 739 t.Parallel() 740 testCases := []struct { 741 name string 742 bp string 743 }{ 744 { 745 name: "Java shared lib not propagate aconfig validation", 746 bp: apex_default_bp + ` 747 apex { 748 name: "myapex", 749 manifest: ":myapex.manifest", 750 androidManifest: ":myapex.androidmanifest", 751 key: "myapex.key", 752 java_libs: [ 753 "my_java_library_bar", 754 ], 755 updatable: false, 756 } 757 java_library { 758 name: "my_java_library_bar", 759 srcs: ["foo/bar/MyClass.java"], 760 sdk_version: "none", 761 system_modules: "none", 762 libs: ["my_java_library_foo"], 763 apex_available: [ 764 "myapex", 765 ], 766 compile_dex: true, 767 } 768 java_library { 769 name: "my_java_library_foo", 770 srcs: ["foo/bar/MyClass.java"], 771 sdk_version: "none", 772 system_modules: "none", 773 static_libs: ["my_java_aconfig_library_foo"], 774 apex_available: [ 775 "myapex", 776 ], 777 } 778 aconfig_declarations { 779 name: "my_aconfig_declarations_foo", 780 package: "com.example.package", 781 container: "otherapex", 782 srcs: ["foo.aconfig"], 783 } 784 java_aconfig_library { 785 name: "my_java_aconfig_library_foo", 786 aconfig_declarations: "my_aconfig_declarations_foo", 787 apex_available: [ 788 "myapex", 789 ], 790 sdk_version: "none", 791 system_modules: "none", 792 }`, 793 }, 794 } 795 for _, test := range testCases { 796 t.Run(test.name, func(t *testing.T) { 797 t.Parallel() 798 android.GroupFixturePreparers( 799 java.PrepareForTestWithJavaDefaultModules, 800 cc.PrepareForTestWithCcBuildComponents, 801 rust.PrepareForTestWithRustDefaultModules, 802 codegen.PrepareForTestWithAconfigBuildComponents, 803 PrepareForTestWithApexBuildComponents, 804 prepareForTestWithMyapex, 805 withAconfigValidationError, 806 ). 807 RunTestWithBp(t, test.bp) 808 }) 809 } 810} 811