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