blob: 0570ec566689bab267630f091d07084b9a5f7542 [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 Parkdda8f692020-11-09 18:38:48 +090018 "testing"
Jiyong Park65b62242020-11-25 12:44:59 +090019
20 "github.com/google/blueprint"
Jooyung Han8707cd72021-07-23 02:49:46 +090021 "github.com/google/blueprint/proptools"
Jiyong Parkdda8f692020-11-09 18:38:48 +090022)
23
24// Module to be packaged
25type componentTestModule struct {
26 ModuleBase
27 props struct {
Jiyong Park1d4907e2024-05-15 02:09:42 +090028 Deps []string
29 Skip_install *bool
Jiyong Parkdda8f692020-11-09 18:38:48 +090030 }
31}
32
Jiyong Parkd630bdd2020-11-25 11:47:24 +090033// dep tag used in this test. All dependencies are considered as installable.
34type installDepTag struct {
35 blueprint.BaseDependencyTag
36 InstallAlwaysNeededDependencyTag
37}
38
Jiyong Parkdda8f692020-11-09 18:38:48 +090039func componentTestModuleFactory() Module {
40 m := &componentTestModule{}
41 m.AddProperties(&m.props)
42 InitAndroidArchModule(m, HostAndDeviceSupported, MultilibBoth)
43 return m
44}
45
46func (m *componentTestModule) DepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd630bdd2020-11-25 11:47:24 +090047 ctx.AddDependency(ctx.Module(), installDepTag{}, m.props.Deps...)
Jiyong Parkdda8f692020-11-09 18:38:48 +090048}
49
50func (m *componentTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +000051 builtFile := PathForModuleOut(ctx, m.Name())
Jiyong Parkdda8f692020-11-09 18:38:48 +090052 dir := ctx.Target().Arch.ArchType.Multilib
53 installDir := PathForModuleInstall(ctx, dir)
Jooyung Han8707cd72021-07-23 02:49:46 +090054 if proptools.Bool(m.props.Skip_install) {
55 m.SkipInstall()
56 }
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +000057 ctx.InstallFile(installDir, m.Name(), builtFile)
Jiyong Parkdda8f692020-11-09 18:38:48 +090058}
59
60// Module that itself is a package
61type packageTestModule struct {
62 ModuleBase
63 PackagingBase
Jooyung Han092ef812021-03-10 15:40:34 +090064 properties struct {
65 Install_deps []string `android:`
66 }
Jiyong Parkdda8f692020-11-09 18:38:48 +090067 entries []string
68}
69
Jiyong Park3ea9b652024-05-15 23:01:54 +090070func packageTestModuleFactory(multiTarget bool, depsCollectFirstTargetOnly bool) Module {
Jiyong Parkdda8f692020-11-09 18:38:48 +090071 module := &packageTestModule{}
72 InitPackageModule(module)
Jiyong Park3ea9b652024-05-15 23:01:54 +090073 module.DepsCollectFirstTargetOnly = depsCollectFirstTargetOnly
74 if multiTarget {
75 InitAndroidMultiTargetsArchModule(module, DeviceSupported, MultilibCommon)
76 } else {
77 InitAndroidArchModule(module, DeviceSupported, MultilibBoth)
78 }
Jooyung Han092ef812021-03-10 15:40:34 +090079 module.AddProperties(&module.properties)
Jiyong Park2136d152021-02-01 23:24:56 +090080 return module
81}
82
Jooyung Han092ef812021-03-10 15:40:34 +090083type packagingDepTag struct {
84 blueprint.BaseDependencyTag
85 PackagingItemAlwaysDepTag
86}
87
Jiyong Parkdda8f692020-11-09 18:38:48 +090088func (m *packageTestModule) DepsMutator(ctx BottomUpMutatorContext) {
Jooyung Han092ef812021-03-10 15:40:34 +090089 m.AddDeps(ctx, packagingDepTag{})
90 ctx.AddDependency(ctx.Module(), installDepTag{}, m.properties.Install_deps...)
Jiyong Parkdda8f692020-11-09 18:38:48 +090091}
92
93func (m *packageTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Paul Duffin4076a752021-02-02 10:59:54 +000094 zipFile := PathForModuleOut(ctx, "myzip.zip")
Jooyung Hana8834282022-03-25 11:40:12 +090095 m.entries = m.CopyDepsToZip(ctx, m.GatherPackagingSpecs(ctx), zipFile)
Jiyong Parkdda8f692020-11-09 18:38:48 +090096}
97
Jiyong Park105e11c2024-05-17 14:58:24 +090098type testConfig struct {
Jiyong Park3ea9b652024-05-15 23:01:54 +090099 multiTarget bool
100 depsCollectFirstTargetOnly bool
Jiyong Park105e11c2024-05-17 14:58:24 +0900101 debuggable bool
Jiyong Park3ea9b652024-05-15 23:01:54 +0900102}
103
Jiyong Park105e11c2024-05-17 14:58:24 +0900104func runPackagingTest(t *testing.T, config testConfig, bp string, expected []string) {
Jiyong Parkdda8f692020-11-09 18:38:48 +0900105 t.Helper()
106
Jiyong Park2136d152021-02-01 23:24:56 +0900107 var archVariant string
Jiyong Park3ea9b652024-05-15 23:01:54 +0900108 if config.multiTarget {
Jiyong Park2136d152021-02-01 23:24:56 +0900109 archVariant = "android_common"
Jiyong Park2136d152021-02-01 23:24:56 +0900110 } else {
111 archVariant = "android_arm64_armv8-a"
Jiyong Park3ea9b652024-05-15 23:01:54 +0900112 }
113
114 moduleFactory := func() Module {
115 return packageTestModuleFactory(config.multiTarget, config.depsCollectFirstTargetOnly)
Jiyong Park2136d152021-02-01 23:24:56 +0900116 }
Jiyong Parkdda8f692020-11-09 18:38:48 +0900117
Paul Duffin30ac3e72021-03-20 00:36:14 +0000118 result := GroupFixturePreparers(
Paul Duffinc3bdd312021-03-17 00:06:49 +0000119 PrepareForTestWithArchMutator,
120 FixtureRegisterWithContext(func(ctx RegistrationContext) {
121 ctx.RegisterModuleType("component", componentTestModuleFactory)
122 ctx.RegisterModuleType("package_module", moduleFactory)
123 }),
Jiyong Park105e11c2024-05-17 14:58:24 +0900124 FixtureModifyProductVariables(func(variables FixtureProductVariables) {
125 variables.Debuggable = proptools.BoolPtr(config.debuggable)
126 }),
Paul Duffinc3bdd312021-03-17 00:06:49 +0000127 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000128 ).RunTest(t)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900129
Paul Duffinc3bdd312021-03-17 00:06:49 +0000130 p := result.Module("package", archVariant).(*packageTestModule)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900131 actual := p.entries
132 actual = SortedUniqueStrings(actual)
133 expected = SortedUniqueStrings(expected)
Paul Duffinc3bdd312021-03-17 00:06:49 +0000134 AssertDeepEquals(t, "package entries", expected, actual)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900135}
136
Jiyong Park2136d152021-02-01 23:24:56 +0900137func TestPackagingBaseMultiTarget(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900138 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900139 multiTarget: true,
140 depsCollectFirstTargetOnly: false,
141 }
142 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900143 `
144 component {
145 name: "foo",
146 }
147
148 package_module {
149 name: "package",
150 deps: ["foo"],
151 }
152 `, []string{"lib64/foo"})
153
Jiyong Park3ea9b652024-05-15 23:01:54 +0900154 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900155 `
156 component {
157 name: "foo",
158 deps: ["bar"],
159 }
160
161 component {
162 name: "bar",
163 }
164
165 package_module {
166 name: "package",
167 deps: ["foo"],
168 }
169 `, []string{"lib64/foo", "lib64/bar"})
170
Jiyong Park3ea9b652024-05-15 23:01:54 +0900171 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900172 `
173 component {
174 name: "foo",
175 deps: ["bar"],
176 }
177
178 component {
179 name: "bar",
180 }
181
182 package_module {
183 name: "package",
184 deps: ["foo"],
185 compile_multilib: "both",
186 }
187 `, []string{"lib32/foo", "lib32/bar", "lib64/foo", "lib64/bar"})
188
Jiyong Park3ea9b652024-05-15 23:01:54 +0900189 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900190 `
191 component {
192 name: "foo",
193 }
194
195 component {
196 name: "bar",
197 compile_multilib: "32",
198 }
199
200 package_module {
201 name: "package",
202 deps: ["foo"],
203 multilib: {
204 lib32: {
205 deps: ["bar"],
206 },
207 },
208 compile_multilib: "both",
209 }
210 `, []string{"lib32/foo", "lib32/bar", "lib64/foo"})
211
Jiyong Park3ea9b652024-05-15 23:01:54 +0900212 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900213 `
214 component {
215 name: "foo",
216 }
217
218 component {
219 name: "bar",
220 }
221
222 package_module {
223 name: "package",
224 deps: ["foo"],
225 multilib: {
226 first: {
227 deps: ["bar"],
228 },
229 },
230 compile_multilib: "both",
231 }
232 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
Jiyong Park2136d152021-02-01 23:24:56 +0900233
Jiyong Park3ea9b652024-05-15 23:01:54 +0900234 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900235 `
236 component {
237 name: "foo",
238 }
239
240 component {
241 name: "bar",
242 }
243
244 component {
245 name: "baz",
246 }
247
248 package_module {
249 name: "package",
250 deps: ["foo"],
251 arch: {
252 arm64: {
253 deps: ["bar"],
254 },
255 x86_64: {
256 deps: ["baz"],
257 },
258 },
259 compile_multilib: "both",
260 }
261 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
262}
263
264func TestPackagingBaseSingleTarget(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900265 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900266 multiTarget: false,
267 depsCollectFirstTargetOnly: false,
268 }
269 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900270 `
271 component {
272 name: "foo",
273 }
274
275 package_module {
276 name: "package",
277 deps: ["foo"],
278 }
279 `, []string{"lib64/foo"})
280
Jiyong Park3ea9b652024-05-15 23:01:54 +0900281 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900282 `
283 component {
284 name: "foo",
285 deps: ["bar"],
286 }
287
288 component {
289 name: "bar",
290 }
291
292 package_module {
293 name: "package",
294 deps: ["foo"],
295 }
296 `, []string{"lib64/foo", "lib64/bar"})
297
Jiyong Park3ea9b652024-05-15 23:01:54 +0900298 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900299 `
300 component {
301 name: "foo",
302 }
303
304 component {
305 name: "bar",
306 compile_multilib: "32",
307 }
308
309 package_module {
310 name: "package",
311 deps: ["foo"],
312 multilib: {
313 lib32: {
314 deps: ["bar"],
315 },
316 },
317 }
318 `, []string{"lib64/foo"})
319
Jiyong Park3ea9b652024-05-15 23:01:54 +0900320 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900321 `
322 component {
323 name: "foo",
324 }
325
326 component {
327 name: "bar",
328 }
329
330 package_module {
331 name: "package",
332 deps: ["foo"],
333 multilib: {
334 lib64: {
335 deps: ["bar"],
336 },
337 },
338 }
339 `, []string{"lib64/foo", "lib64/bar"})
340
Jiyong Park3ea9b652024-05-15 23:01:54 +0900341 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900342 `
343 component {
344 name: "foo",
345 }
346
347 component {
348 name: "bar",
349 }
350
351 component {
352 name: "baz",
353 }
354
355 package_module {
356 name: "package",
357 deps: ["foo"],
358 arch: {
359 arm64: {
360 deps: ["bar"],
361 },
362 x86_64: {
363 deps: ["baz"],
364 },
365 },
366 }
367 `, []string{"lib64/foo", "lib64/bar"})
Jooyung Han092ef812021-03-10 15:40:34 +0900368
Jiyong Park3ea9b652024-05-15 23:01:54 +0900369 runPackagingTest(t, config,
Jooyung Han092ef812021-03-10 15:40:34 +0900370 `
371 component {
372 name: "foo",
373 }
374
375 component {
376 name: "bar",
377 }
378
379 package_module {
380 name: "package",
381 deps: ["foo"],
382 install_deps: ["bar"],
383 }
384 `, []string{"lib64/foo"})
Jiyong Parkdda8f692020-11-09 18:38:48 +0900385}
Jooyung Han8707cd72021-07-23 02:49:46 +0900386
387func TestPackagingWithSkipInstallDeps(t *testing.T) {
388 // package -[dep]-> foo -[dep]-> bar -[dep]-> baz
Colin Crossbd3a16b2023-04-25 11:30:51 -0700389 // Packaging should continue transitively through modules that are not installed.
Jiyong Park105e11c2024-05-17 14:58:24 +0900390 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900391 multiTarget: false,
392 depsCollectFirstTargetOnly: false,
393 }
394 runPackagingTest(t, config,
Jooyung Han8707cd72021-07-23 02:49:46 +0900395 `
396 component {
397 name: "foo",
398 deps: ["bar"],
399 }
400
401 component {
402 name: "bar",
403 deps: ["baz"],
404 skip_install: true,
405 }
406
407 component {
408 name: "baz",
409 }
410
411 package_module {
412 name: "package",
413 deps: ["foo"],
414 }
Colin Crossbd3a16b2023-04-25 11:30:51 -0700415 `, []string{"lib64/foo", "lib64/bar", "lib64/baz"})
Jooyung Han8707cd72021-07-23 02:49:46 +0900416}
Jiyong Park3ea9b652024-05-15 23:01:54 +0900417
418func TestPackagingWithDepsCollectFirstTargetOnly(t *testing.T) {
Jiyong Park105e11c2024-05-17 14:58:24 +0900419 config := testConfig{
Jiyong Park3ea9b652024-05-15 23:01:54 +0900420 multiTarget: true,
421 depsCollectFirstTargetOnly: true,
422 }
423 runPackagingTest(t, config,
424 `
425 component {
426 name: "foo",
427 }
428
429 package_module {
430 name: "package",
431 deps: ["foo"],
432 }
433 `, []string{"lib64/foo"})
434
435 runPackagingTest(t, config,
436 `
437 component {
438 name: "foo",
439 deps: ["bar"],
440 }
441
442 component {
443 name: "bar",
444 }
445
446 package_module {
447 name: "package",
448 deps: ["foo"],
449 }
450 `, []string{"lib64/foo", "lib64/bar"})
451
452 runPackagingTest(t, config,
453 `
454 component {
455 name: "foo",
456 deps: ["bar"],
457 }
458
459 component {
460 name: "bar",
461 }
462
463 package_module {
464 name: "package",
465 deps: ["foo"],
466 compile_multilib: "both",
467 }
468 `, []string{"lib64/foo", "lib64/bar"})
469
470 runPackagingTest(t, config,
471 `
472 component {
473 name: "foo",
474 }
475
476 component {
477 name: "bar",
478 compile_multilib: "32",
479 }
480
481 package_module {
482 name: "package",
483 deps: ["foo"],
484 multilib: {
485 lib32: {
486 deps: ["bar"],
487 },
488 },
489 compile_multilib: "both",
490 }
491 `, []string{"lib32/bar", "lib64/foo"})
492
493 runPackagingTest(t, config,
494 `
495 component {
496 name: "foo",
497 }
498
499 component {
500 name: "bar",
501 }
502
503 package_module {
504 name: "package",
505 deps: ["foo"],
506 multilib: {
507 both: {
508 deps: ["bar"],
509 },
510 },
511 compile_multilib: "both",
512 }
513 `, []string{"lib64/foo", "lib32/bar", "lib64/bar"})
514
515 runPackagingTest(t, config,
516 `
517 component {
518 name: "foo",
519 }
520
521 component {
522 name: "bar",
523 }
524
525 component {
526 name: "baz",
527 }
528
529 package_module {
530 name: "package",
531 deps: ["foo"],
532 arch: {
533 arm64: {
534 deps: ["bar"],
535 },
536 x86_64: {
537 deps: ["baz"],
538 },
539 },
540 compile_multilib: "both",
541 }
542 `, []string{"lib64/foo", "lib64/bar"})
543}
Jiyong Park105e11c2024-05-17 14:58:24 +0900544
545func TestDebuggableDeps(t *testing.T) {
546 bp := `
547 component {
548 name: "foo",
549 }
550
551 component {
552 name: "bar",
553 deps: ["baz"],
554 }
555
556 component {
557 name: "baz",
558 }
559
560 package_module {
561 name: "package",
562 deps: ["foo"] + select(product_variable("debuggable"), {
563 true: ["bar"],
564 default: [],
565 }),
566 }`
567 testcases := []struct {
568 debuggable bool
569 expected []string
570 }{
571 {
572 debuggable: true,
573 expected: []string{"lib64/foo", "lib64/bar", "lib64/baz"},
574 },
575 {
576 debuggable: false,
577 expected: []string{"lib64/foo"},
578 },
579 }
580 for _, tc := range testcases {
581 config := testConfig{
582 debuggable: tc.debuggable,
583 }
584 runPackagingTest(t, config, bp, tc.expected)
585 }
586}