blob: 19b46fefd24fe2346adecd7746b19f63d4abfad1 [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 Parkdda8f692020-11-09 18:38:48 +090031 }
32}
33
Jiyong Parkd630bdd2020-11-25 11:47:24 +090034// dep tag used in this test. All dependencies are considered as installable.
35type installDepTag struct {
36 blueprint.BaseDependencyTag
37 InstallAlwaysNeededDependencyTag
38}
39
Jiyong Parkdda8f692020-11-09 18:38:48 +090040func componentTestModuleFactory() Module {
41 m := &componentTestModule{}
42 m.AddProperties(&m.props)
43 InitAndroidArchModule(m, HostAndDeviceSupported, MultilibBoth)
44 return m
45}
46
47func (m *componentTestModule) DepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd630bdd2020-11-25 11:47:24 +090048 ctx.AddDependency(ctx.Module(), installDepTag{}, m.props.Deps...)
Jiyong Parkdda8f692020-11-09 18:38:48 +090049}
50
51func (m *componentTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +000052 builtFile := PathForModuleOut(ctx, m.Name())
Jiyong Parkdda8f692020-11-09 18:38:48 +090053 dir := ctx.Target().Arch.ArchType.Multilib
54 installDir := PathForModuleInstall(ctx, dir)
Jooyung Han8707cd72021-07-23 02:49:46 +090055 if proptools.Bool(m.props.Skip_install) {
56 m.SkipInstall()
57 }
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +000058 ctx.InstallFile(installDir, m.Name(), builtFile)
Jiyong Parkdda8f692020-11-09 18:38:48 +090059}
60
61// Module that itself is a package
62type packageTestModule struct {
63 ModuleBase
64 PackagingBase
Jooyung Han092ef812021-03-10 15:40:34 +090065 properties struct {
66 Install_deps []string `android:`
67 }
Jiyong Parkdda8f692020-11-09 18:38:48 +090068 entries []string
69}
70
Jiyong Park3ea9b652024-05-15 23:01:54 +090071func packageTestModuleFactory(multiTarget bool, depsCollectFirstTargetOnly bool) Module {
Jiyong Parkdda8f692020-11-09 18:38:48 +090072 module := &packageTestModule{}
73 InitPackageModule(module)
Jiyong Park3ea9b652024-05-15 23:01:54 +090074 module.DepsCollectFirstTargetOnly = depsCollectFirstTargetOnly
75 if multiTarget {
76 InitAndroidMultiTargetsArchModule(module, DeviceSupported, MultilibCommon)
77 } else {
78 InitAndroidArchModule(module, DeviceSupported, MultilibBoth)
79 }
Jooyung Han092ef812021-03-10 15:40:34 +090080 module.AddProperties(&module.properties)
Jiyong Park2136d152021-02-01 23:24:56 +090081 return module
82}
83
Jooyung Han092ef812021-03-10 15:40:34 +090084type packagingDepTag struct {
85 blueprint.BaseDependencyTag
86 PackagingItemAlwaysDepTag
87}
88
Jiyong Parkdda8f692020-11-09 18:38:48 +090089func (m *packageTestModule) DepsMutator(ctx BottomUpMutatorContext) {
Jooyung Han092ef812021-03-10 15:40:34 +090090 m.AddDeps(ctx, packagingDepTag{})
91 ctx.AddDependency(ctx.Module(), installDepTag{}, m.properties.Install_deps...)
Jiyong Parkdda8f692020-11-09 18:38:48 +090092}
93
94func (m *packageTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Paul Duffin4076a752021-02-02 10:59:54 +000095 zipFile := PathForModuleOut(ctx, "myzip.zip")
Jooyung Hana8834282022-03-25 11:40:12 +090096 m.entries = m.CopyDepsToZip(ctx, m.GatherPackagingSpecs(ctx), zipFile)
Jiyong Parkdda8f692020-11-09 18:38:48 +090097}
98
Jiyong Park105e11c2024-05-17 14:58:24 +090099type testConfig struct {
Jiyong Park3ea9b652024-05-15 23:01:54 +0900100 multiTarget bool
101 depsCollectFirstTargetOnly bool
Jiyong Park105e11c2024-05-17 14:58:24 +0900102 debuggable bool
Jiyong Park3ea9b652024-05-15 23:01:54 +0900103}
104
Jiyong Park105e11c2024-05-17 14:58:24 +0900105func runPackagingTest(t *testing.T, config testConfig, bp string, expected []string) {
Jiyong Parkdda8f692020-11-09 18:38:48 +0900106 t.Helper()
107
Jiyong Park2136d152021-02-01 23:24:56 +0900108 var archVariant string
Jiyong Park3ea9b652024-05-15 23:01:54 +0900109 if config.multiTarget {
Jiyong Park2136d152021-02-01 23:24:56 +0900110 archVariant = "android_common"
Jiyong Park2136d152021-02-01 23:24:56 +0900111 } else {
112 archVariant = "android_arm64_armv8-a"
Jiyong Park3ea9b652024-05-15 23:01:54 +0900113 }
114
115 moduleFactory := func() Module {
116 return packageTestModuleFactory(config.multiTarget, config.depsCollectFirstTargetOnly)
Jiyong Park2136d152021-02-01 23:24:56 +0900117 }
Jiyong Parkdda8f692020-11-09 18:38:48 +0900118
Paul Duffin30ac3e72021-03-20 00:36:14 +0000119 result := GroupFixturePreparers(
Paul Duffinc3bdd312021-03-17 00:06:49 +0000120 PrepareForTestWithArchMutator,
121 FixtureRegisterWithContext(func(ctx RegistrationContext) {
122 ctx.RegisterModuleType("component", componentTestModuleFactory)
123 ctx.RegisterModuleType("package_module", moduleFactory)
124 }),
Jiyong Park105e11c2024-05-17 14:58:24 +0900125 FixtureModifyProductVariables(func(variables FixtureProductVariables) {
126 variables.Debuggable = proptools.BoolPtr(config.debuggable)
127 }),
Paul Duffinc3bdd312021-03-17 00:06:49 +0000128 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000129 ).RunTest(t)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900130
Paul Duffinc3bdd312021-03-17 00:06:49 +0000131 p := result.Module("package", archVariant).(*packageTestModule)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900132 actual := p.entries
133 actual = SortedUniqueStrings(actual)
134 expected = SortedUniqueStrings(expected)
Paul Duffinc3bdd312021-03-17 00:06:49 +0000135 AssertDeepEquals(t, "package entries", expected, actual)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900136}
137
Jiyong Park2136d152021-02-01 23:24:56 +0900138func TestPackagingBaseMultiTarget(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900139 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900140 multiTarget: true,
141 depsCollectFirstTargetOnly: false,
142 }
143 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900144 `
145 component {
146 name: "foo",
147 }
148
149 package_module {
150 name: "package",
151 deps: ["foo"],
152 }
153 `, []string{"lib64/foo"})
154
Jiyong Park3ea9b652024-05-15 23:01:54 +0900155 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900156 `
157 component {
158 name: "foo",
159 deps: ["bar"],
160 }
161
162 component {
163 name: "bar",
164 }
165
166 package_module {
167 name: "package",
168 deps: ["foo"],
169 }
170 `, []string{"lib64/foo", "lib64/bar"})
171
Jiyong Park3ea9b652024-05-15 23:01:54 +0900172 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900173 `
174 component {
175 name: "foo",
176 deps: ["bar"],
177 }
178
179 component {
180 name: "bar",
181 }
182
183 package_module {
184 name: "package",
185 deps: ["foo"],
186 compile_multilib: "both",
187 }
188 `, []string{"lib32/foo", "lib32/bar", "lib64/foo", "lib64/bar"})
189
Jiyong Park3ea9b652024-05-15 23:01:54 +0900190 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900191 `
192 component {
193 name: "foo",
194 }
195
196 component {
197 name: "bar",
198 compile_multilib: "32",
199 }
200
201 package_module {
202 name: "package",
203 deps: ["foo"],
204 multilib: {
205 lib32: {
206 deps: ["bar"],
207 },
208 },
209 compile_multilib: "both",
210 }
211 `, []string{"lib32/foo", "lib32/bar", "lib64/foo"})
212
Jiyong Park3ea9b652024-05-15 23:01:54 +0900213 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900214 `
215 component {
216 name: "foo",
217 }
218
219 component {
220 name: "bar",
221 }
222
223 package_module {
224 name: "package",
225 deps: ["foo"],
226 multilib: {
227 first: {
228 deps: ["bar"],
229 },
230 },
231 compile_multilib: "both",
232 }
233 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
Jiyong Park2136d152021-02-01 23:24:56 +0900234
Jiyong Park3ea9b652024-05-15 23:01:54 +0900235 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900236 `
237 component {
238 name: "foo",
239 }
240
241 component {
242 name: "bar",
243 }
244
245 component {
246 name: "baz",
247 }
248
249 package_module {
250 name: "package",
251 deps: ["foo"],
252 arch: {
253 arm64: {
254 deps: ["bar"],
255 },
256 x86_64: {
257 deps: ["baz"],
258 },
259 },
260 compile_multilib: "both",
261 }
262 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
263}
264
265func TestPackagingBaseSingleTarget(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900266 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900267 multiTarget: false,
268 depsCollectFirstTargetOnly: false,
269 }
270 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900271 `
272 component {
273 name: "foo",
274 }
275
276 package_module {
277 name: "package",
278 deps: ["foo"],
279 }
280 `, []string{"lib64/foo"})
281
Jiyong Park3ea9b652024-05-15 23:01:54 +0900282 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900283 `
284 component {
285 name: "foo",
286 deps: ["bar"],
287 }
288
289 component {
290 name: "bar",
291 }
292
293 package_module {
294 name: "package",
295 deps: ["foo"],
296 }
297 `, []string{"lib64/foo", "lib64/bar"})
298
Jiyong Park3ea9b652024-05-15 23:01:54 +0900299 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900300 `
301 component {
302 name: "foo",
303 }
304
305 component {
306 name: "bar",
307 compile_multilib: "32",
308 }
309
310 package_module {
311 name: "package",
312 deps: ["foo"],
313 multilib: {
314 lib32: {
315 deps: ["bar"],
316 },
317 },
318 }
319 `, []string{"lib64/foo"})
320
Jiyong Park3ea9b652024-05-15 23:01:54 +0900321 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900322 `
323 component {
324 name: "foo",
325 }
326
327 component {
328 name: "bar",
329 }
330
331 package_module {
332 name: "package",
333 deps: ["foo"],
334 multilib: {
335 lib64: {
336 deps: ["bar"],
337 },
338 },
339 }
340 `, []string{"lib64/foo", "lib64/bar"})
341
Jiyong Park3ea9b652024-05-15 23:01:54 +0900342 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900343 `
344 component {
345 name: "foo",
346 }
347
348 component {
349 name: "bar",
350 }
351
352 component {
353 name: "baz",
354 }
355
356 package_module {
357 name: "package",
358 deps: ["foo"],
359 arch: {
360 arm64: {
361 deps: ["bar"],
362 },
363 x86_64: {
364 deps: ["baz"],
365 },
366 },
367 }
368 `, []string{"lib64/foo", "lib64/bar"})
Jooyung Han092ef812021-03-10 15:40:34 +0900369
Jiyong Park3ea9b652024-05-15 23:01:54 +0900370 runPackagingTest(t, config,
Jooyung Han092ef812021-03-10 15:40:34 +0900371 `
372 component {
373 name: "foo",
374 }
375
376 component {
377 name: "bar",
378 }
379
380 package_module {
381 name: "package",
382 deps: ["foo"],
383 install_deps: ["bar"],
384 }
385 `, []string{"lib64/foo"})
Jiyong Parkdda8f692020-11-09 18:38:48 +0900386}
Jooyung Han8707cd72021-07-23 02:49:46 +0900387
388func TestPackagingWithSkipInstallDeps(t *testing.T) {
389 // package -[dep]-> foo -[dep]-> bar -[dep]-> baz
Colin Crossbd3a16b2023-04-25 11:30:51 -0700390 // Packaging should continue transitively through modules that are not installed.
Jiyong Park105e11c2024-05-17 14:58:24 +0900391 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900392 multiTarget: false,
393 depsCollectFirstTargetOnly: false,
394 }
395 runPackagingTest(t, config,
Jooyung Han8707cd72021-07-23 02:49:46 +0900396 `
397 component {
398 name: "foo",
399 deps: ["bar"],
400 }
401
402 component {
403 name: "bar",
404 deps: ["baz"],
405 skip_install: true,
406 }
407
408 component {
409 name: "baz",
410 }
411
412 package_module {
413 name: "package",
414 deps: ["foo"],
415 }
Colin Crossbd3a16b2023-04-25 11:30:51 -0700416 `, []string{"lib64/foo", "lib64/bar", "lib64/baz"})
Jooyung Han8707cd72021-07-23 02:49:46 +0900417}
Jiyong Park3ea9b652024-05-15 23:01:54 +0900418
419func TestPackagingWithDepsCollectFirstTargetOnly(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900420 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900421 multiTarget: true,
422 depsCollectFirstTargetOnly: true,
423 }
424 runPackagingTest(t, config,
425 `
426 component {
427 name: "foo",
428 }
429
430 package_module {
431 name: "package",
432 deps: ["foo"],
433 }
434 `, []string{"lib64/foo"})
435
436 runPackagingTest(t, config,
437 `
438 component {
439 name: "foo",
440 deps: ["bar"],
441 }
442
443 component {
444 name: "bar",
445 }
446
447 package_module {
448 name: "package",
449 deps: ["foo"],
450 }
451 `, []string{"lib64/foo", "lib64/bar"})
452
453 runPackagingTest(t, config,
454 `
455 component {
456 name: "foo",
457 deps: ["bar"],
458 }
459
460 component {
461 name: "bar",
462 }
463
464 package_module {
465 name: "package",
466 deps: ["foo"],
467 compile_multilib: "both",
468 }
469 `, []string{"lib64/foo", "lib64/bar"})
470
471 runPackagingTest(t, config,
472 `
473 component {
474 name: "foo",
475 }
476
477 component {
478 name: "bar",
479 compile_multilib: "32",
480 }
481
482 package_module {
483 name: "package",
484 deps: ["foo"],
485 multilib: {
486 lib32: {
487 deps: ["bar"],
488 },
489 },
490 compile_multilib: "both",
491 }
492 `, []string{"lib32/bar", "lib64/foo"})
493
494 runPackagingTest(t, config,
495 `
496 component {
497 name: "foo",
498 }
499
500 component {
501 name: "bar",
502 }
503
504 package_module {
505 name: "package",
506 deps: ["foo"],
507 multilib: {
508 both: {
509 deps: ["bar"],
510 },
511 },
512 compile_multilib: "both",
513 }
514 `, []string{"lib64/foo", "lib32/bar", "lib64/bar"})
515
516 runPackagingTest(t, config,
517 `
518 component {
519 name: "foo",
520 }
521
522 component {
523 name: "bar",
524 }
525
526 component {
527 name: "baz",
528 }
529
530 package_module {
531 name: "package",
532 deps: ["foo"],
533 arch: {
534 arm64: {
535 deps: ["bar"],
536 },
537 x86_64: {
538 deps: ["baz"],
539 },
540 },
541 compile_multilib: "both",
542 }
543 `, []string{"lib64/foo", "lib64/bar"})
544}
Jiyong Park105e11c2024-05-17 14:58:24 +0900545
546func TestDebuggableDeps(t *testing.T) {
547 bp := `
548 component {
549 name: "foo",
550 }
551
552 component {
553 name: "bar",
554 deps: ["baz"],
555 }
556
557 component {
558 name: "baz",
559 }
560
561 package_module {
562 name: "package",
563 deps: ["foo"] + select(product_variable("debuggable"), {
564 true: ["bar"],
565 default: [],
566 }),
567 }`
568 testcases := []struct {
569 debuggable bool
570 expected []string
571 }{
572 {
573 debuggable: true,
574 expected: []string{"lib64/foo", "lib64/bar", "lib64/baz"},
575 },
576 {
577 debuggable: false,
578 expected: []string{"lib64/foo"},
579 },
580 }
581 for _, tc := range testcases {
582 config := testConfig{
583 debuggable: tc.debuggable,
584 }
585 runPackagingTest(t, config, bp, tc.expected)
586 }
587}
Jiyong Parke6043782024-05-20 16:17:39 +0900588
589func TestPrefer32Deps(t *testing.T) {
590 bpTemplate := `
591 component {
592 name: "foo",
593 compile_multilib: "both", // not needed but for clarity
594 }
595
596 component {
597 name: "foo_32only",
598 compile_multilib: "prefer32",
599 }
600
601 component {
602 name: "foo_64only",
603 compile_multilib: "64",
604 }
605
606 package_module {
607 name: "package",
608 compile_multilib: "%COMPILE_MULTILIB%",
609 multilib: {
610 prefer32: {
611 deps: %DEPS%,
612 },
613 },
614 }
615 `
616
617 testcases := []struct {
618 compileMultilib string
619 deps []string
620 expected []string
621 }{
622 {
623 compileMultilib: "first",
624 deps: []string{"foo", "foo_64only"},
625 expected: []string{"lib64/foo", "lib64/foo_64only"},
626 },
627 {
628 compileMultilib: "64",
629 deps: []string{"foo", "foo_64only"},
630 expected: []string{"lib64/foo", "lib64/foo_64only"},
631 },
632 {
633 compileMultilib: "32",
634 deps: []string{"foo", "foo_32only"},
635 expected: []string{"lib32/foo", "lib32/foo_32only"},
636 },
637 {
638 compileMultilib: "both",
639 deps: []string{"foo", "foo_32only", "foo_64only"},
640 expected: []string{"lib32/foo", "lib32/foo_32only", "lib64/foo_64only"},
641 },
642 }
643 for _, tc := range testcases {
644 config := testConfig{
645 multiTarget: true,
646 depsCollectFirstTargetOnly: true,
647 }
648 bp := strings.Replace(bpTemplate, "%COMPILE_MULTILIB%", tc.compileMultilib, -1)
649 bp = strings.Replace(bp, "%DEPS%", `["`+strings.Join(tc.deps, `", "`)+`"]`, -1)
Jiyong Parke6043782024-05-20 16:17:39 +0900650 runPackagingTest(t, config, bp, tc.expected)
651 }
652}