blob: f99bb91cd37765516e0d774b105249929e398c05 [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 Park3ea9b652024-05-15 23:01:54 +090098type packageTestModuleConfig struct {
99 multiTarget bool
100 depsCollectFirstTargetOnly bool
101}
102
103func runPackagingTest(t *testing.T, config packageTestModuleConfig, bp string, expected []string) {
Jiyong Parkdda8f692020-11-09 18:38:48 +0900104 t.Helper()
105
Jiyong Park2136d152021-02-01 23:24:56 +0900106 var archVariant string
Jiyong Park3ea9b652024-05-15 23:01:54 +0900107 if config.multiTarget {
Jiyong Park2136d152021-02-01 23:24:56 +0900108 archVariant = "android_common"
Jiyong Park2136d152021-02-01 23:24:56 +0900109 } else {
110 archVariant = "android_arm64_armv8-a"
Jiyong Park3ea9b652024-05-15 23:01:54 +0900111 }
112
113 moduleFactory := func() Module {
114 return packageTestModuleFactory(config.multiTarget, config.depsCollectFirstTargetOnly)
Jiyong Park2136d152021-02-01 23:24:56 +0900115 }
Jiyong Parkdda8f692020-11-09 18:38:48 +0900116
Paul Duffin30ac3e72021-03-20 00:36:14 +0000117 result := GroupFixturePreparers(
Paul Duffinc3bdd312021-03-17 00:06:49 +0000118 PrepareForTestWithArchMutator,
119 FixtureRegisterWithContext(func(ctx RegistrationContext) {
120 ctx.RegisterModuleType("component", componentTestModuleFactory)
121 ctx.RegisterModuleType("package_module", moduleFactory)
122 }),
123 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000124 ).RunTest(t)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900125
Paul Duffinc3bdd312021-03-17 00:06:49 +0000126 p := result.Module("package", archVariant).(*packageTestModule)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900127 actual := p.entries
128 actual = SortedUniqueStrings(actual)
129 expected = SortedUniqueStrings(expected)
Paul Duffinc3bdd312021-03-17 00:06:49 +0000130 AssertDeepEquals(t, "package entries", expected, actual)
Jiyong Parkdda8f692020-11-09 18:38:48 +0900131}
132
Jiyong Park2136d152021-02-01 23:24:56 +0900133func TestPackagingBaseMultiTarget(t *testing.T) {
Jiyong Park3ea9b652024-05-15 23:01:54 +0900134 config := packageTestModuleConfig{
135 multiTarget: true,
136 depsCollectFirstTargetOnly: false,
137 }
138 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900139 `
140 component {
141 name: "foo",
142 }
143
144 package_module {
145 name: "package",
146 deps: ["foo"],
147 }
148 `, []string{"lib64/foo"})
149
Jiyong Park3ea9b652024-05-15 23:01:54 +0900150 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900151 `
152 component {
153 name: "foo",
154 deps: ["bar"],
155 }
156
157 component {
158 name: "bar",
159 }
160
161 package_module {
162 name: "package",
163 deps: ["foo"],
164 }
165 `, []string{"lib64/foo", "lib64/bar"})
166
Jiyong Park3ea9b652024-05-15 23:01:54 +0900167 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900168 `
169 component {
170 name: "foo",
171 deps: ["bar"],
172 }
173
174 component {
175 name: "bar",
176 }
177
178 package_module {
179 name: "package",
180 deps: ["foo"],
181 compile_multilib: "both",
182 }
183 `, []string{"lib32/foo", "lib32/bar", "lib64/foo", "lib64/bar"})
184
Jiyong Park3ea9b652024-05-15 23:01:54 +0900185 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900186 `
187 component {
188 name: "foo",
189 }
190
191 component {
192 name: "bar",
193 compile_multilib: "32",
194 }
195
196 package_module {
197 name: "package",
198 deps: ["foo"],
199 multilib: {
200 lib32: {
201 deps: ["bar"],
202 },
203 },
204 compile_multilib: "both",
205 }
206 `, []string{"lib32/foo", "lib32/bar", "lib64/foo"})
207
Jiyong Park3ea9b652024-05-15 23:01:54 +0900208 runPackagingTest(t, config,
Jiyong Parkdda8f692020-11-09 18:38:48 +0900209 `
210 component {
211 name: "foo",
212 }
213
214 component {
215 name: "bar",
216 }
217
218 package_module {
219 name: "package",
220 deps: ["foo"],
221 multilib: {
222 first: {
223 deps: ["bar"],
224 },
225 },
226 compile_multilib: "both",
227 }
228 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
Jiyong Park2136d152021-02-01 23:24:56 +0900229
Jiyong Park3ea9b652024-05-15 23:01:54 +0900230 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900231 `
232 component {
233 name: "foo",
234 }
235
236 component {
237 name: "bar",
238 }
239
240 component {
241 name: "baz",
242 }
243
244 package_module {
245 name: "package",
246 deps: ["foo"],
247 arch: {
248 arm64: {
249 deps: ["bar"],
250 },
251 x86_64: {
252 deps: ["baz"],
253 },
254 },
255 compile_multilib: "both",
256 }
257 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
258}
259
260func TestPackagingBaseSingleTarget(t *testing.T) {
Jiyong Park3ea9b652024-05-15 23:01:54 +0900261 config := packageTestModuleConfig{
262 multiTarget: false,
263 depsCollectFirstTargetOnly: false,
264 }
265 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900266 `
267 component {
268 name: "foo",
269 }
270
271 package_module {
272 name: "package",
273 deps: ["foo"],
274 }
275 `, []string{"lib64/foo"})
276
Jiyong Park3ea9b652024-05-15 23:01:54 +0900277 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900278 `
279 component {
280 name: "foo",
281 deps: ["bar"],
282 }
283
284 component {
285 name: "bar",
286 }
287
288 package_module {
289 name: "package",
290 deps: ["foo"],
291 }
292 `, []string{"lib64/foo", "lib64/bar"})
293
Jiyong Park3ea9b652024-05-15 23:01:54 +0900294 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900295 `
296 component {
297 name: "foo",
298 }
299
300 component {
301 name: "bar",
302 compile_multilib: "32",
303 }
304
305 package_module {
306 name: "package",
307 deps: ["foo"],
308 multilib: {
309 lib32: {
310 deps: ["bar"],
311 },
312 },
313 }
314 `, []string{"lib64/foo"})
315
Jiyong Park3ea9b652024-05-15 23:01:54 +0900316 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900317 `
318 component {
319 name: "foo",
320 }
321
322 component {
323 name: "bar",
324 }
325
326 package_module {
327 name: "package",
328 deps: ["foo"],
329 multilib: {
330 lib64: {
331 deps: ["bar"],
332 },
333 },
334 }
335 `, []string{"lib64/foo", "lib64/bar"})
336
Jiyong Park3ea9b652024-05-15 23:01:54 +0900337 runPackagingTest(t, config,
Jiyong Park2136d152021-02-01 23:24:56 +0900338 `
339 component {
340 name: "foo",
341 }
342
343 component {
344 name: "bar",
345 }
346
347 component {
348 name: "baz",
349 }
350
351 package_module {
352 name: "package",
353 deps: ["foo"],
354 arch: {
355 arm64: {
356 deps: ["bar"],
357 },
358 x86_64: {
359 deps: ["baz"],
360 },
361 },
362 }
363 `, []string{"lib64/foo", "lib64/bar"})
Jooyung Han092ef812021-03-10 15:40:34 +0900364
Jiyong Park3ea9b652024-05-15 23:01:54 +0900365 runPackagingTest(t, config,
Jooyung Han092ef812021-03-10 15:40:34 +0900366 `
367 component {
368 name: "foo",
369 }
370
371 component {
372 name: "bar",
373 }
374
375 package_module {
376 name: "package",
377 deps: ["foo"],
378 install_deps: ["bar"],
379 }
380 `, []string{"lib64/foo"})
Jiyong Parkdda8f692020-11-09 18:38:48 +0900381}
Jooyung Han8707cd72021-07-23 02:49:46 +0900382
383func TestPackagingWithSkipInstallDeps(t *testing.T) {
384 // package -[dep]-> foo -[dep]-> bar -[dep]-> baz
Colin Crossbd3a16b2023-04-25 11:30:51 -0700385 // Packaging should continue transitively through modules that are not installed.
Jiyong Park3ea9b652024-05-15 23:01:54 +0900386 config := packageTestModuleConfig{
387 multiTarget: false,
388 depsCollectFirstTargetOnly: false,
389 }
390 runPackagingTest(t, config,
Jooyung Han8707cd72021-07-23 02:49:46 +0900391 `
392 component {
393 name: "foo",
394 deps: ["bar"],
395 }
396
397 component {
398 name: "bar",
399 deps: ["baz"],
400 skip_install: true,
401 }
402
403 component {
404 name: "baz",
405 }
406
407 package_module {
408 name: "package",
409 deps: ["foo"],
410 }
Colin Crossbd3a16b2023-04-25 11:30:51 -0700411 `, []string{"lib64/foo", "lib64/bar", "lib64/baz"})
Jooyung Han8707cd72021-07-23 02:49:46 +0900412}
Jiyong Park3ea9b652024-05-15 23:01:54 +0900413
414func TestPackagingWithDepsCollectFirstTargetOnly(t *testing.T) {
415 config := packageTestModuleConfig{
416 multiTarget: true,
417 depsCollectFirstTargetOnly: true,
418 }
419 runPackagingTest(t, config,
420 `
421 component {
422 name: "foo",
423 }
424
425 package_module {
426 name: "package",
427 deps: ["foo"],
428 }
429 `, []string{"lib64/foo"})
430
431 runPackagingTest(t, config,
432 `
433 component {
434 name: "foo",
435 deps: ["bar"],
436 }
437
438 component {
439 name: "bar",
440 }
441
442 package_module {
443 name: "package",
444 deps: ["foo"],
445 }
446 `, []string{"lib64/foo", "lib64/bar"})
447
448 runPackagingTest(t, config,
449 `
450 component {
451 name: "foo",
452 deps: ["bar"],
453 }
454
455 component {
456 name: "bar",
457 }
458
459 package_module {
460 name: "package",
461 deps: ["foo"],
462 compile_multilib: "both",
463 }
464 `, []string{"lib64/foo", "lib64/bar"})
465
466 runPackagingTest(t, config,
467 `
468 component {
469 name: "foo",
470 }
471
472 component {
473 name: "bar",
474 compile_multilib: "32",
475 }
476
477 package_module {
478 name: "package",
479 deps: ["foo"],
480 multilib: {
481 lib32: {
482 deps: ["bar"],
483 },
484 },
485 compile_multilib: "both",
486 }
487 `, []string{"lib32/bar", "lib64/foo"})
488
489 runPackagingTest(t, config,
490 `
491 component {
492 name: "foo",
493 }
494
495 component {
496 name: "bar",
497 }
498
499 package_module {
500 name: "package",
501 deps: ["foo"],
502 multilib: {
503 both: {
504 deps: ["bar"],
505 },
506 },
507 compile_multilib: "both",
508 }
509 `, []string{"lib64/foo", "lib32/bar", "lib64/bar"})
510
511 runPackagingTest(t, config,
512 `
513 component {
514 name: "foo",
515 }
516
517 component {
518 name: "bar",
519 }
520
521 component {
522 name: "baz",
523 }
524
525 package_module {
526 name: "package",
527 deps: ["foo"],
528 arch: {
529 arm64: {
530 deps: ["bar"],
531 },
532 x86_64: {
533 deps: ["baz"],
534 },
535 },
536 compile_multilib: "both",
537 }
538 `, []string{"lib64/foo", "lib64/bar"})
539}