blob: 0f7bb39a141a9c81b2ece0db480dded1ad0d6a67 [file] [log] [blame]
Jiyong Parkdda8f692020-11-09 18:38:48 +09001// Copyright 2020 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 android
16
17import (
Jiyong Parke6043782024-05-20 16:17:39 +090018 "strings"
Jiyong Parkdda8f692020-11-09 18:38:48 +090019 "testing"
Jiyong Park65b62242020-11-25 12:44:59 +090020
21 "github.com/google/blueprint"
Jooyung Han8707cd72021-07-23 02:49:46 +090022 "github.com/google/blueprint/proptools"
Jiyong Parkdda8f692020-11-09 18:38:48 +090023)
24
25// Module to be packaged
26type componentTestModule struct {
27 ModuleBase
28 props struct {
Jiyong Park1d4907e2024-05-15 02:09:42 +090029 Deps []string
30 Skip_install *bool
Jiyong Parka574d532024-08-28 18:06:43 +090031 Overrides []string
Jiyong Parkdda8f692020-11-09 18:38:48 +090032 }
33}
34
Jiyong Parkd630bdd2020-11-25 11:47:24 +090035// dep tag used in this test. All dependencies are considered as installable.
36type installDepTag struct {
37 blueprint.BaseDependencyTag
38 InstallAlwaysNeededDependencyTag
39}
40
Jiyong Parkdda8f692020-11-09 18:38:48 +090041func componentTestModuleFactory() Module {
42 m := &componentTestModule{}
43 m.AddProperties(&m.props)
44 InitAndroidArchModule(m, HostAndDeviceSupported, MultilibBoth)
45 return m
46}
47
48func (m *componentTestModule) DepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd630bdd2020-11-25 11:47:24 +090049 ctx.AddDependency(ctx.Module(), installDepTag{}, m.props.Deps...)
Jiyong Parkdda8f692020-11-09 18:38:48 +090050}
51
52func (m *componentTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +000053 builtFile := PathForModuleOut(ctx, m.Name())
Jiyong Parkdda8f692020-11-09 18:38:48 +090054 dir := ctx.Target().Arch.ArchType.Multilib
55 installDir := PathForModuleInstall(ctx, dir)
Jooyung Han8707cd72021-07-23 02:49:46 +090056 if proptools.Bool(m.props.Skip_install) {
57 m.SkipInstall()
58 }
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +000059 ctx.InstallFile(installDir, m.Name(), builtFile)
Jiyong Parkdda8f692020-11-09 18:38:48 +090060}
61
62// Module that itself is a package
63type packageTestModule struct {
64 ModuleBase
65 PackagingBase
Jooyung Han092ef812021-03-10 15:40:34 +090066 properties struct {
67 Install_deps []string `android:`
68 }
Jiyong Parkdda8f692020-11-09 18:38:48 +090069 entries []string
70}
71
Jiyong Park3ea9b652024-05-15 23:01:54 +090072func packageTestModuleFactory(multiTarget bool, depsCollectFirstTargetOnly bool) Module {
Jiyong Parkdda8f692020-11-09 18:38:48 +090073 module := &packageTestModule{}
74 InitPackageModule(module)
Jiyong Park3ea9b652024-05-15 23:01:54 +090075 module.DepsCollectFirstTargetOnly = depsCollectFirstTargetOnly
76 if multiTarget {
77 InitAndroidMultiTargetsArchModule(module, DeviceSupported, MultilibCommon)
78 } else {
79 InitAndroidArchModule(module, DeviceSupported, MultilibBoth)
80 }
Jooyung Han092ef812021-03-10 15:40:34 +090081 module.AddProperties(&module.properties)
Jiyong Park2136d152021-02-01 23:24:56 +090082 return module
83}
84
Jooyung Han092ef812021-03-10 15:40:34 +090085type packagingDepTag struct {
86 blueprint.BaseDependencyTag
87 PackagingItemAlwaysDepTag
88}
89
Jiyong Parkdda8f692020-11-09 18:38:48 +090090func (m *packageTestModule) DepsMutator(ctx BottomUpMutatorContext) {
Jooyung Han092ef812021-03-10 15:40:34 +090091 m.AddDeps(ctx, packagingDepTag{})
92 ctx.AddDependency(ctx.Module(), installDepTag{}, m.properties.Install_deps...)
Jiyong Parkdda8f692020-11-09 18:38:48 +090093}
94
95func (m *packageTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Paul Duffin4076a752021-02-02 10:59:54 +000096 zipFile := PathForModuleOut(ctx, "myzip.zip")
Jooyung Hana8834282022-03-25 11:40:12 +090097 m.entries = m.CopyDepsToZip(ctx, m.GatherPackagingSpecs(ctx), zipFile)
Jiyong Parkdda8f692020-11-09 18:38:48 +090098}
99
Jiyong Park105e11c2024-05-17 14:58:24 +0900100type testConfig struct {
Jiyong Park3ea9b652024-05-15 23:01:54 +0900101 multiTarget bool
102 depsCollectFirstTargetOnly bool
Jiyong Park105e11c2024-05-17 14:58:24 +0900103 debuggable bool
Jiyong Park3ea9b652024-05-15 23:01:54 +0900104}
105
Jiyong Park105e11c2024-05-17 14:58:24 +0900106func runPackagingTest(t *testing.T, config testConfig, bp string, expected []string) {
Jiyong Parkdda8f692020-11-09 18:38:48 +0900107 t.Helper()
108
Jiyong Park2136d152021-02-01 23:24:56 +0900109 var archVariant string
Jiyong Park3ea9b652024-05-15 23:01:54 +0900110 if config.multiTarget {
Jiyong Park2136d152021-02-01 23:24:56 +0900111 archVariant = "android_common"
Jiyong Park2136d152021-02-01 23:24:56 +0900112 } else {
113 archVariant = "android_arm64_armv8-a"
Jiyong Park3ea9b652024-05-15 23:01:54 +0900114 }
115
116 moduleFactory := func() Module {
117 return packageTestModuleFactory(config.multiTarget, config.depsCollectFirstTargetOnly)
Jiyong Park2136d152021-02-01 23:24:56 +0900118 }
Jiyong Parkdda8f692020-11-09 18:38:48 +0900119
Paul Duffin30ac3e72021-03-20 00:36:14 +0000120 result := GroupFixturePreparers(
Paul Duffinc3bdd312021-03-17 00:06:49 +0000121 PrepareForTestWithArchMutator,
122 FixtureRegisterWithContext(func(ctx RegistrationContext) {
123 ctx.RegisterModuleType("component", componentTestModuleFactory)
124 ctx.RegisterModuleType("package_module", moduleFactory)
125 }),
Jiyong Park105e11c2024-05-17 14:58:24 +0900126 FixtureModifyProductVariables(func(variables FixtureProductVariables) {
127 variables.Debuggable = proptools.BoolPtr(config.debuggable)
128 }),
Paul Duffinc3bdd312021-03-17 00:06:49 +0000129 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000130 ).RunTest(t)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900131
Paul Duffinc3bdd312021-03-17 00:06:49 +0000132 p := result.Module("package", archVariant).(*packageTestModule)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900133 actual := p.entries
134 actual = SortedUniqueStrings(actual)
135 expected = SortedUniqueStrings(expected)
Paul Duffinc3bdd312021-03-17 00:06:49 +0000136 AssertDeepEquals(t, "package entries", expected, actual)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900137}
138
Jiyong Park2136d152021-02-01 23:24:56 +0900139func TestPackagingBaseMultiTarget(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900140 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900141 multiTarget: true,
142 depsCollectFirstTargetOnly: false,
143 }
144 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900145 `
146 component {
147 name: "foo",
148 }
149
150 package_module {
151 name: "package",
152 deps: ["foo"],
153 }
154 `, []string{"lib64/foo"})
155
Jiyong Park3ea9b652024-05-15 23:01:54 +0900156 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900157 `
158 component {
159 name: "foo",
160 deps: ["bar"],
161 }
162
163 component {
164 name: "bar",
165 }
166
167 package_module {
168 name: "package",
169 deps: ["foo"],
170 }
171 `, []string{"lib64/foo", "lib64/bar"})
172
Jiyong Park3ea9b652024-05-15 23:01:54 +0900173 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900174 `
175 component {
176 name: "foo",
177 deps: ["bar"],
178 }
179
180 component {
181 name: "bar",
182 }
183
184 package_module {
185 name: "package",
186 deps: ["foo"],
187 compile_multilib: "both",
188 }
189 `, []string{"lib32/foo", "lib32/bar", "lib64/foo", "lib64/bar"})
190
Jiyong Park3ea9b652024-05-15 23:01:54 +0900191 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900192 `
193 component {
194 name: "foo",
195 }
196
197 component {
198 name: "bar",
199 compile_multilib: "32",
200 }
201
202 package_module {
203 name: "package",
204 deps: ["foo"],
205 multilib: {
206 lib32: {
207 deps: ["bar"],
208 },
209 },
210 compile_multilib: "both",
211 }
212 `, []string{"lib32/foo", "lib32/bar", "lib64/foo"})
213
Jiyong Park3ea9b652024-05-15 23:01:54 +0900214 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900215 `
216 component {
217 name: "foo",
218 }
219
220 component {
221 name: "bar",
222 }
223
224 package_module {
225 name: "package",
226 deps: ["foo"],
227 multilib: {
228 first: {
229 deps: ["bar"],
230 },
231 },
232 compile_multilib: "both",
233 }
234 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
Jiyong Park2136d152021-02-01 23:24:56 +0900235
Jiyong Park3ea9b652024-05-15 23:01:54 +0900236 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900237 `
238 component {
239 name: "foo",
240 }
241
242 component {
243 name: "bar",
244 }
245
246 component {
247 name: "baz",
248 }
249
250 package_module {
251 name: "package",
252 deps: ["foo"],
253 arch: {
254 arm64: {
255 deps: ["bar"],
256 },
257 x86_64: {
258 deps: ["baz"],
259 },
260 },
261 compile_multilib: "both",
262 }
263 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
264}
265
266func TestPackagingBaseSingleTarget(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900267 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900268 multiTarget: false,
269 depsCollectFirstTargetOnly: false,
270 }
271 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900272 `
273 component {
274 name: "foo",
275 }
276
277 package_module {
278 name: "package",
279 deps: ["foo"],
280 }
281 `, []string{"lib64/foo"})
282
Jiyong Park3ea9b652024-05-15 23:01:54 +0900283 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900284 `
285 component {
286 name: "foo",
287 deps: ["bar"],
288 }
289
290 component {
291 name: "bar",
292 }
293
294 package_module {
295 name: "package",
296 deps: ["foo"],
297 }
298 `, []string{"lib64/foo", "lib64/bar"})
299
Jiyong Park3ea9b652024-05-15 23:01:54 +0900300 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900301 `
302 component {
303 name: "foo",
304 }
305
306 component {
307 name: "bar",
308 compile_multilib: "32",
309 }
310
311 package_module {
312 name: "package",
313 deps: ["foo"],
314 multilib: {
315 lib32: {
316 deps: ["bar"],
317 },
318 },
319 }
320 `, []string{"lib64/foo"})
321
Jiyong Park3ea9b652024-05-15 23:01:54 +0900322 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900323 `
324 component {
325 name: "foo",
326 }
327
328 component {
329 name: "bar",
330 }
331
332 package_module {
333 name: "package",
334 deps: ["foo"],
335 multilib: {
336 lib64: {
337 deps: ["bar"],
338 },
339 },
340 }
341 `, []string{"lib64/foo", "lib64/bar"})
342
Jiyong Park3ea9b652024-05-15 23:01:54 +0900343 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900344 `
345 component {
346 name: "foo",
347 }
348
349 component {
350 name: "bar",
351 }
352
353 component {
354 name: "baz",
355 }
356
357 package_module {
358 name: "package",
359 deps: ["foo"],
360 arch: {
361 arm64: {
362 deps: ["bar"],
363 },
364 x86_64: {
365 deps: ["baz"],
366 },
367 },
368 }
369 `, []string{"lib64/foo", "lib64/bar"})
Jooyung Han092ef812021-03-10 15:40:34 +0900370
Jiyong Park3ea9b652024-05-15 23:01:54 +0900371 runPackagingTest(t, config,
Jooyung Han092ef812021-03-10 15:40:34 +0900372 `
373 component {
374 name: "foo",
375 }
376
377 component {
378 name: "bar",
379 }
380
381 package_module {
382 name: "package",
383 deps: ["foo"],
384 install_deps: ["bar"],
385 }
386 `, []string{"lib64/foo"})
Jiyong Parkdda8f692020-11-09 18:38:48 +0900387}
Jooyung Han8707cd72021-07-23 02:49:46 +0900388
389func TestPackagingWithSkipInstallDeps(t *testing.T) {
390 // package -[dep]-> foo -[dep]-> bar -[dep]-> baz
Colin Crossbd3a16b2023-04-25 11:30:51 -0700391 // Packaging should continue transitively through modules that are not installed.
Jiyong Park105e11c2024-05-17 14:58:24 +0900392 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900393 multiTarget: false,
394 depsCollectFirstTargetOnly: false,
395 }
396 runPackagingTest(t, config,
Jooyung Han8707cd72021-07-23 02:49:46 +0900397 `
398 component {
399 name: "foo",
400 deps: ["bar"],
401 }
402
403 component {
404 name: "bar",
405 deps: ["baz"],
406 skip_install: true,
407 }
408
409 component {
410 name: "baz",
411 }
412
413 package_module {
414 name: "package",
415 deps: ["foo"],
416 }
Colin Crossbd3a16b2023-04-25 11:30:51 -0700417 `, []string{"lib64/foo", "lib64/bar", "lib64/baz"})
Jooyung Han8707cd72021-07-23 02:49:46 +0900418}
Jiyong Park3ea9b652024-05-15 23:01:54 +0900419
420func TestPackagingWithDepsCollectFirstTargetOnly(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900421 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900422 multiTarget: true,
423 depsCollectFirstTargetOnly: true,
424 }
425 runPackagingTest(t, config,
426 `
427 component {
428 name: "foo",
429 }
430
431 package_module {
432 name: "package",
433 deps: ["foo"],
434 }
435 `, []string{"lib64/foo"})
436
437 runPackagingTest(t, config,
438 `
439 component {
440 name: "foo",
441 deps: ["bar"],
442 }
443
444 component {
445 name: "bar",
446 }
447
448 package_module {
449 name: "package",
450 deps: ["foo"],
451 }
452 `, []string{"lib64/foo", "lib64/bar"})
453
454 runPackagingTest(t, config,
455 `
456 component {
457 name: "foo",
458 deps: ["bar"],
459 }
460
461 component {
462 name: "bar",
463 }
464
465 package_module {
466 name: "package",
467 deps: ["foo"],
468 compile_multilib: "both",
469 }
470 `, []string{"lib64/foo", "lib64/bar"})
471
472 runPackagingTest(t, config,
473 `
474 component {
475 name: "foo",
476 }
477
478 component {
479 name: "bar",
480 compile_multilib: "32",
481 }
482
483 package_module {
484 name: "package",
485 deps: ["foo"],
486 multilib: {
487 lib32: {
488 deps: ["bar"],
489 },
490 },
491 compile_multilib: "both",
492 }
493 `, []string{"lib32/bar", "lib64/foo"})
494
495 runPackagingTest(t, config,
496 `
497 component {
498 name: "foo",
499 }
500
501 component {
502 name: "bar",
503 }
504
505 package_module {
506 name: "package",
507 deps: ["foo"],
508 multilib: {
509 both: {
510 deps: ["bar"],
511 },
512 },
513 compile_multilib: "both",
514 }
515 `, []string{"lib64/foo", "lib32/bar", "lib64/bar"})
516
517 runPackagingTest(t, config,
518 `
519 component {
520 name: "foo",
521 }
522
523 component {
524 name: "bar",
525 }
526
527 component {
528 name: "baz",
529 }
530
531 package_module {
532 name: "package",
533 deps: ["foo"],
534 arch: {
535 arm64: {
536 deps: ["bar"],
537 },
538 x86_64: {
539 deps: ["baz"],
540 },
541 },
542 compile_multilib: "both",
543 }
544 `, []string{"lib64/foo", "lib64/bar"})
545}
Jiyong Park105e11c2024-05-17 14:58:24 +0900546
547func TestDebuggableDeps(t *testing.T) {
548 bp := `
549 component {
550 name: "foo",
551 }
552
553 component {
554 name: "bar",
555 deps: ["baz"],
556 }
557
558 component {
559 name: "baz",
560 }
561
562 package_module {
563 name: "package",
564 deps: ["foo"] + select(product_variable("debuggable"), {
565 true: ["bar"],
566 default: [],
567 }),
568 }`
569 testcases := []struct {
570 debuggable bool
571 expected []string
572 }{
573 {
574 debuggable: true,
575 expected: []string{"lib64/foo", "lib64/bar", "lib64/baz"},
576 },
577 {
578 debuggable: false,
579 expected: []string{"lib64/foo"},
580 },
581 }
582 for _, tc := range testcases {
583 config := testConfig{
584 debuggable: tc.debuggable,
585 }
586 runPackagingTest(t, config, bp, tc.expected)
587 }
588}
Jiyong Parke6043782024-05-20 16:17:39 +0900589
590func TestPrefer32Deps(t *testing.T) {
591 bpTemplate := `
592 component {
593 name: "foo",
594 compile_multilib: "both", // not needed but for clarity
595 }
596
597 component {
598 name: "foo_32only",
599 compile_multilib: "prefer32",
600 }
601
602 component {
603 name: "foo_64only",
604 compile_multilib: "64",
605 }
606
607 package_module {
608 name: "package",
609 compile_multilib: "%COMPILE_MULTILIB%",
610 multilib: {
611 prefer32: {
612 deps: %DEPS%,
613 },
614 },
615 }
616 `
617
618 testcases := []struct {
619 compileMultilib string
620 deps []string
621 expected []string
622 }{
623 {
624 compileMultilib: "first",
625 deps: []string{"foo", "foo_64only"},
626 expected: []string{"lib64/foo", "lib64/foo_64only"},
627 },
628 {
629 compileMultilib: "64",
630 deps: []string{"foo", "foo_64only"},
631 expected: []string{"lib64/foo", "lib64/foo_64only"},
632 },
633 {
634 compileMultilib: "32",
635 deps: []string{"foo", "foo_32only"},
636 expected: []string{"lib32/foo", "lib32/foo_32only"},
637 },
638 {
639 compileMultilib: "both",
640 deps: []string{"foo", "foo_32only", "foo_64only"},
641 expected: []string{"lib32/foo", "lib32/foo_32only", "lib64/foo_64only"},
642 },
643 }
644 for _, tc := range testcases {
645 config := testConfig{
646 multiTarget: true,
647 depsCollectFirstTargetOnly: true,
648 }
649 bp := strings.Replace(bpTemplate, "%COMPILE_MULTILIB%", tc.compileMultilib, -1)
650 bp = strings.Replace(bp, "%DEPS%", `["`+strings.Join(tc.deps, `", "`)+`"]`, -1)
Jiyong Parke6043782024-05-20 16:17:39 +0900651 runPackagingTest(t, config, bp, tc.expected)
652 }
653}
Jiyong Parka574d532024-08-28 18:06:43 +0900654
655func TestOverrides(t *testing.T) {
656 bpTemplate := `
657 component {
658 name: "foo",
659 deps: ["bar"],
660 }
661
662 component {
663 name: "bar",
664 }
665
666 component {
667 name: "bar_override",
668 overrides: ["bar"],
669 }
670
671 component {
672 name: "baz",
673 deps: ["bar_override"],
674 }
675
676 package_module {
677 name: "package",
678 deps: %DEPS%,
679 }
680 `
681 testcases := []struct {
682 deps []string
683 expected []string
684 }{
685 {
686 deps: []string{"foo"},
687 expected: []string{"lib64/foo", "lib64/bar"},
688 },
689 {
690 deps: []string{"foo", "bar_override"},
691 expected: []string{"lib64/foo", "lib64/bar_override"},
692 },
693 {
694 deps: []string{"foo", "bar", "bar_override"},
695 expected: []string{"lib64/foo", "lib64/bar_override"},
696 },
697 {
698 deps: []string{"bar", "bar_override"},
699 expected: []string{"lib64/bar_override"},
700 },
701 {
702 deps: []string{"foo", "baz"},
703 expected: []string{"lib64/foo", "lib64/baz", "lib64/bar_override"},
704 },
705 }
706 for _, tc := range testcases {
707 config := testConfig{
708 multiTarget: true,
709 depsCollectFirstTargetOnly: false,
710 }
711 bp := strings.Replace(bpTemplate, "%DEPS%", `["`+strings.Join(tc.deps, `", "`)+`"]`, -1)
712 runPackagingTest(t, config, bp, tc.expected)
713 }
714}