blob: 46c018a0a97540b824b891845dd487935550b3aa [file] [log] [blame]
Colin Crosscb988072019-01-24 14:58:11 -08001// Copyright 2019 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 (
18 "reflect"
Colin Cross158eeb72019-10-16 13:06:07 -070019 "runtime"
Colin Crosscb988072019-01-24 14:58:11 -080020 "testing"
Colin Cross74449102019-09-25 11:26:40 -070021
22 "github.com/google/blueprint/proptools"
Colin Crosscb988072019-01-24 14:58:11 -080023)
24
25type Named struct {
26 A *string `android:"arch_variant"`
27 B *string
28}
29
30type NamedAllFiltered struct {
31 A *string
32}
33
34type NamedNoneFiltered struct {
35 A *string `android:"arch_variant"`
36}
37
38func TestFilterArchStruct(t *testing.T) {
39 tests := []struct {
40 name string
41 in interface{}
42 out interface{}
43 filtered bool
44 }{
45 // Property tests
46 {
47 name: "basic",
48 in: &struct {
49 A *string `android:"arch_variant"`
50 B *string
51 }{},
52 out: &struct {
53 A *string
54 }{},
55 filtered: true,
56 },
57 {
Colin Crossb4fecbf2020-01-21 11:38:47 -080058 name: "tags",
59 in: &struct {
60 A *string `android:"arch_variant"`
61 B *string `android:"arch_variant,path"`
62 C *string `android:"arch_variant,path,variant_prepend"`
63 D *string `android:"path,variant_prepend,arch_variant"`
64 E *string `android:"path"`
65 F *string
66 }{},
67 out: &struct {
68 A *string
Liz Kammerff966b12022-07-29 10:49:16 -040069 B *string
70 C *string
71 D *string
Colin Crossb4fecbf2020-01-21 11:38:47 -080072 }{},
73 filtered: true,
74 },
75 {
Colin Crosscb988072019-01-24 14:58:11 -080076 name: "all filtered",
77 in: &struct {
78 A *string
79 }{},
80 out: nil,
81 filtered: true,
82 },
83 {
84 name: "none filtered",
85 in: &struct {
86 A *string `android:"arch_variant"`
87 }{},
88 out: &struct {
89 A *string `android:"arch_variant"`
90 }{},
91 filtered: false,
92 },
93
94 // Sub-struct tests
95 {
96 name: "substruct",
97 in: &struct {
98 A struct {
99 A *string `android:"arch_variant"`
100 B *string
101 } `android:"arch_variant"`
102 }{},
103 out: &struct {
104 A struct {
105 A *string
106 }
107 }{},
108 filtered: true,
109 },
110 {
111 name: "substruct all filtered",
112 in: &struct {
113 A struct {
114 A *string
115 } `android:"arch_variant"`
116 }{},
117 out: nil,
118 filtered: true,
119 },
120 {
121 name: "substruct none filtered",
122 in: &struct {
123 A struct {
124 A *string `android:"arch_variant"`
125 } `android:"arch_variant"`
126 }{},
127 out: &struct {
128 A struct {
129 A *string `android:"arch_variant"`
130 } `android:"arch_variant"`
131 }{},
132 filtered: false,
133 },
134
135 // Named sub-struct tests
136 {
137 name: "named substruct",
138 in: &struct {
139 A Named `android:"arch_variant"`
140 }{},
141 out: &struct {
142 A struct {
143 A *string
144 }
145 }{},
146 filtered: true,
147 },
148 {
149 name: "substruct all filtered",
150 in: &struct {
151 A NamedAllFiltered `android:"arch_variant"`
152 }{},
153 out: nil,
154 filtered: true,
155 },
156 {
157 name: "substruct none filtered",
158 in: &struct {
159 A NamedNoneFiltered `android:"arch_variant"`
160 }{},
161 out: &struct {
162 A NamedNoneFiltered `android:"arch_variant"`
163 }{},
164 filtered: false,
165 },
166
167 // Pointer to sub-struct tests
168 {
169 name: "pointer substruct",
170 in: &struct {
171 A *struct {
172 A *string `android:"arch_variant"`
173 B *string
174 } `android:"arch_variant"`
175 }{},
176 out: &struct {
177 A *struct {
178 A *string
179 }
180 }{},
181 filtered: true,
182 },
183 {
184 name: "pointer substruct all filtered",
185 in: &struct {
186 A *struct {
187 A *string
188 } `android:"arch_variant"`
189 }{},
190 out: nil,
191 filtered: true,
192 },
193 {
194 name: "pointer substruct none filtered",
195 in: &struct {
196 A *struct {
197 A *string `android:"arch_variant"`
198 } `android:"arch_variant"`
199 }{},
200 out: &struct {
201 A *struct {
202 A *string `android:"arch_variant"`
203 } `android:"arch_variant"`
204 }{},
205 filtered: false,
206 },
207
208 // Pointer to named sub-struct tests
209 {
210 name: "pointer named substruct",
211 in: &struct {
212 A *Named `android:"arch_variant"`
213 }{},
214 out: &struct {
215 A *struct {
216 A *string
217 }
218 }{},
219 filtered: true,
220 },
221 {
222 name: "pointer substruct all filtered",
223 in: &struct {
224 A *NamedAllFiltered `android:"arch_variant"`
225 }{},
226 out: nil,
227 filtered: true,
228 },
229 {
230 name: "pointer substruct none filtered",
231 in: &struct {
232 A *NamedNoneFiltered `android:"arch_variant"`
233 }{},
234 out: &struct {
235 A *NamedNoneFiltered `android:"arch_variant"`
236 }{},
237 filtered: false,
238 },
239 }
240
241 for _, test := range tests {
242 t.Run(test.name, func(t *testing.T) {
Colin Cross74449102019-09-25 11:26:40 -0700243 out, filtered := proptools.FilterPropertyStruct(reflect.TypeOf(test.in), filterArchStruct)
Colin Crosscb988072019-01-24 14:58:11 -0800244 if filtered != test.filtered {
245 t.Errorf("expected filtered %v, got %v", test.filtered, filtered)
246 }
247 expected := reflect.TypeOf(test.out)
248 if out != expected {
249 t.Errorf("expected type %v, got %v", expected, out)
250 }
251 })
252 }
253}
Colin Cross158eeb72019-10-16 13:06:07 -0700254
255type archTestModule struct {
256 ModuleBase
257 props struct {
258 Deps []string
259 }
260}
261
Colin Crossc0f0eb82022-07-19 14:41:11 -0700262func (m *archTestMultiTargetsModule) GenerateAndroidBuildActions(ctx ModuleContext) {
263}
264
265func (m *archTestMultiTargetsModule) DepsMutator(ctx BottomUpMutatorContext) {
266 ctx.AddDependency(ctx.Module(), nil, m.props.Deps...)
267}
268
269func archTestMultiTargetsModuleFactory() Module {
270 m := &archTestMultiTargetsModule{}
271 m.AddProperties(&m.props)
272 InitAndroidMultiTargetsArchModule(m, HostAndDeviceSupported, MultilibCommon)
273 return m
274}
275
276type archTestMultiTargetsModule struct {
277 ModuleBase
278 props struct {
279 Deps []string
280 }
281}
282
Colin Cross158eeb72019-10-16 13:06:07 -0700283func (m *archTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
284}
285
286func (m *archTestModule) DepsMutator(ctx BottomUpMutatorContext) {
287 ctx.AddDependency(ctx.Module(), nil, m.props.Deps...)
288}
289
290func archTestModuleFactory() Module {
291 m := &archTestModule{}
292 m.AddProperties(&m.props)
293 InitAndroidArchModule(m, HostAndDeviceSupported, MultilibBoth)
294 return m
295}
296
Paul Duffin738a6d52021-03-16 19:10:48 +0000297var prepareForArchTest = GroupFixturePreparers(
298 PrepareForTestWithArchMutator,
299 FixtureRegisterWithContext(func(ctx RegistrationContext) {
300 ctx.RegisterModuleType("module", archTestModuleFactory)
Colin Crossc0f0eb82022-07-19 14:41:11 -0700301 ctx.RegisterModuleType("multi_targets_module", archTestMultiTargetsModuleFactory)
Paul Duffin738a6d52021-03-16 19:10:48 +0000302 }),
303)
304
Colin Cross158eeb72019-10-16 13:06:07 -0700305func TestArchMutator(t *testing.T) {
306 var buildOSVariants []string
Colin Crossc0f0eb82022-07-19 14:41:11 -0700307 var buildOS64Variants []string
Colin Cross158eeb72019-10-16 13:06:07 -0700308 var buildOS32Variants []string
Colin Crossc0f0eb82022-07-19 14:41:11 -0700309 var buildOSCommonVariant string
310
Colin Cross158eeb72019-10-16 13:06:07 -0700311 switch runtime.GOOS {
312 case "linux":
313 buildOSVariants = []string{"linux_glibc_x86_64", "linux_glibc_x86"}
Colin Crossc0f0eb82022-07-19 14:41:11 -0700314 buildOS64Variants = []string{"linux_glibc_x86_64"}
Colin Cross158eeb72019-10-16 13:06:07 -0700315 buildOS32Variants = []string{"linux_glibc_x86"}
Colin Crossc0f0eb82022-07-19 14:41:11 -0700316 buildOSCommonVariant = "linux_glibc_common"
Colin Cross158eeb72019-10-16 13:06:07 -0700317 case "darwin":
318 buildOSVariants = []string{"darwin_x86_64"}
Colin Crossc0f0eb82022-07-19 14:41:11 -0700319 buildOS64Variants = []string{"darwin_x86_64"}
Colin Cross158eeb72019-10-16 13:06:07 -0700320 buildOS32Variants = nil
Colin Crossc0f0eb82022-07-19 14:41:11 -0700321 buildOSCommonVariant = "darwin_common"
Colin Cross158eeb72019-10-16 13:06:07 -0700322 }
323
324 bp := `
325 module {
326 name: "foo",
327 }
328
329 module {
330 name: "bar",
331 host_supported: true,
332 }
333
334 module {
335 name: "baz",
336 device_supported: false,
337 }
338
339 module {
340 name: "qux",
341 host_supported: true,
342 compile_multilib: "32",
343 }
Colin Crossc0f0eb82022-07-19 14:41:11 -0700344
345 module {
346 name: "first",
347 host_supported: true,
348 compile_multilib: "first",
349 }
350
351 multi_targets_module {
352 name: "multi_targets",
353 host_supported: true,
354 }
Colin Cross158eeb72019-10-16 13:06:07 -0700355 `
356
Colin Cross158eeb72019-10-16 13:06:07 -0700357 testCases := []struct {
Colin Crossc0f0eb82022-07-19 14:41:11 -0700358 name string
359 preparer FixturePreparer
360 fooVariants []string
361 barVariants []string
362 bazVariants []string
363 quxVariants []string
364 firstVariants []string
365
366 multiTargetVariants []string
367 multiTargetVariantsMap map[string][]string
368
369 goOS string
Colin Cross158eeb72019-10-16 13:06:07 -0700370 }{
371 {
Colin Crossc0f0eb82022-07-19 14:41:11 -0700372 name: "normal",
373 preparer: nil,
374 fooVariants: []string{"android_arm64_armv8-a", "android_arm_armv7-a-neon"},
375 barVariants: append(buildOSVariants, "android_arm64_armv8-a", "android_arm_armv7-a-neon"),
376 bazVariants: nil,
377 quxVariants: append(buildOS32Variants, "android_arm_armv7-a-neon"),
378 firstVariants: append(buildOS64Variants, "android_arm64_armv8-a"),
379 multiTargetVariants: []string{buildOSCommonVariant, "android_common"},
380 multiTargetVariantsMap: map[string][]string{
381 buildOSCommonVariant: buildOS64Variants,
382 "android_common": {"android_arm64_armv8-a"},
383 }},
Colin Cross158eeb72019-10-16 13:06:07 -0700384 {
385 name: "host-only",
Paul Duffin738a6d52021-03-16 19:10:48 +0000386 preparer: FixtureModifyConfig(func(config Config) {
Colin Cross158eeb72019-10-16 13:06:07 -0700387 config.BuildOSTarget = Target{}
388 config.BuildOSCommonTarget = Target{}
389 config.Targets[Android] = nil
Paul Duffin738a6d52021-03-16 19:10:48 +0000390 }),
Colin Crossc0f0eb82022-07-19 14:41:11 -0700391 fooVariants: nil,
392 barVariants: buildOSVariants,
393 bazVariants: nil,
394 quxVariants: buildOS32Variants,
395 firstVariants: buildOS64Variants,
396 multiTargetVariants: []string{buildOSCommonVariant},
397 multiTargetVariantsMap: map[string][]string{
398 buildOSCommonVariant: buildOS64Variants,
399 },
400 },
401 {
402 name: "same arch host and host cross",
403 preparer: FixtureModifyConfig(func(config Config) {
404 modifyTestConfigForMusl(config)
405 modifyTestConfigForMuslArm64HostCross(config)
406 }),
407 fooVariants: []string{"android_arm64_armv8-a", "android_arm_armv7-a-neon"},
408 barVariants: []string{"linux_musl_x86_64", "linux_musl_arm64", "linux_musl_x86", "android_arm64_armv8-a", "android_arm_armv7-a-neon"},
409 bazVariants: nil,
410 quxVariants: []string{"linux_musl_x86", "android_arm_armv7-a-neon"},
411 firstVariants: []string{"linux_musl_x86_64", "linux_musl_arm64", "android_arm64_armv8-a"},
412 multiTargetVariants: []string{"linux_musl_common", "android_common"},
413 multiTargetVariantsMap: map[string][]string{
414 "linux_musl_common": {"linux_musl_x86_64"},
415 "android_common": {"android_arm64_armv8-a"},
416 },
417 goOS: "linux",
Colin Cross158eeb72019-10-16 13:06:07 -0700418 },
419 }
420
421 enabledVariants := func(ctx *TestContext, name string) []string {
422 var ret []string
423 variants := ctx.ModuleVariantsForTests(name)
424 for _, variant := range variants {
425 m := ctx.ModuleForTests(name, variant)
426 if m.Module().Enabled() {
427 ret = append(ret, variant)
428 }
429 }
430 return ret
431 }
432
Colin Crossc0f0eb82022-07-19 14:41:11 -0700433 moduleMultiTargets := func(ctx *TestContext, name string, variant string) []string {
434 var ret []string
435 targets := ctx.ModuleForTests(name, variant).Module().MultiTargets()
436 for _, t := range targets {
437 ret = append(ret, t.String())
438 }
439 return ret
440 }
441
Colin Cross158eeb72019-10-16 13:06:07 -0700442 for _, tt := range testCases {
443 t.Run(tt.name, func(t *testing.T) {
Colin Crossc0f0eb82022-07-19 14:41:11 -0700444 if tt.goOS != runtime.GOOS {
445 t.Skipf("requries runtime.GOOS %s", tt.goOS)
446 }
447
Paul Duffin30ac3e72021-03-20 00:36:14 +0000448 result := GroupFixturePreparers(
Paul Duffin738a6d52021-03-16 19:10:48 +0000449 prepareForArchTest,
450 // Test specific preparer
451 OptionalFixturePreparer(tt.preparer),
452 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000453 ).RunTest(t)
Paul Duffin738a6d52021-03-16 19:10:48 +0000454 ctx := result.TestContext
Colin Cross158eeb72019-10-16 13:06:07 -0700455
456 if g, w := enabledVariants(ctx, "foo"), tt.fooVariants; !reflect.DeepEqual(w, g) {
457 t.Errorf("want foo variants:\n%q\ngot:\n%q\n", w, g)
458 }
459
460 if g, w := enabledVariants(ctx, "bar"), tt.barVariants; !reflect.DeepEqual(w, g) {
461 t.Errorf("want bar variants:\n%q\ngot:\n%q\n", w, g)
462 }
463
464 if g, w := enabledVariants(ctx, "baz"), tt.bazVariants; !reflect.DeepEqual(w, g) {
465 t.Errorf("want baz variants:\n%q\ngot:\n%q\n", w, g)
466 }
467
468 if g, w := enabledVariants(ctx, "qux"), tt.quxVariants; !reflect.DeepEqual(w, g) {
469 t.Errorf("want qux variants:\n%q\ngot:\n%q\n", w, g)
470 }
Colin Crossc0f0eb82022-07-19 14:41:11 -0700471 if g, w := enabledVariants(ctx, "first"), tt.firstVariants; !reflect.DeepEqual(w, g) {
472 t.Errorf("want first variants:\n%q\ngot:\n%q\n", w, g)
473 }
474
475 if g, w := enabledVariants(ctx, "multi_targets"), tt.multiTargetVariants; !reflect.DeepEqual(w, g) {
476 t.Fatalf("want multi_target variants:\n%q\ngot:\n%q\n", w, g)
477 }
478
479 for _, variant := range tt.multiTargetVariants {
480 targets := moduleMultiTargets(ctx, "multi_targets", variant)
481 if g, w := targets, tt.multiTargetVariantsMap[variant]; !reflect.DeepEqual(w, g) {
482 t.Errorf("want ctx.MultiTarget() for %q:\n%q\ngot:\n%q\n", variant, w, g)
483 }
484 }
Colin Cross158eeb72019-10-16 13:06:07 -0700485 })
486 }
487}
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200488
489func TestArchMutatorNativeBridge(t *testing.T) {
490 bp := `
491 // This module is only enabled for x86.
492 module {
493 name: "foo",
494 }
495
496 // This module is enabled for x86 and arm (via native bridge).
497 module {
498 name: "bar",
499 native_bridge_supported: true,
500 }
501
502 // This module is enabled for arm (native_bridge) only.
503 module {
504 name: "baz",
505 native_bridge_supported: true,
506 enabled: false,
507 target: {
508 native_bridge: {
509 enabled: true,
510 }
511 }
512 }
513 `
514
515 testCases := []struct {
516 name string
Paul Duffin738a6d52021-03-16 19:10:48 +0000517 preparer FixturePreparer
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200518 fooVariants []string
519 barVariants []string
520 bazVariants []string
521 }{
522 {
523 name: "normal",
Paul Duffin738a6d52021-03-16 19:10:48 +0000524 preparer: nil,
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200525 fooVariants: []string{"android_x86_64_silvermont", "android_x86_silvermont"},
526 barVariants: []string{"android_x86_64_silvermont", "android_native_bridge_arm64_armv8-a", "android_x86_silvermont", "android_native_bridge_arm_armv7-a-neon"},
527 bazVariants: []string{"android_native_bridge_arm64_armv8-a", "android_native_bridge_arm_armv7-a-neon"},
528 },
529 }
530
531 enabledVariants := func(ctx *TestContext, name string) []string {
532 var ret []string
533 variants := ctx.ModuleVariantsForTests(name)
534 for _, variant := range variants {
535 m := ctx.ModuleForTests(name, variant)
536 if m.Module().Enabled() {
537 ret = append(ret, variant)
538 }
539 }
540 return ret
541 }
542
543 for _, tt := range testCases {
544 t.Run(tt.name, func(t *testing.T) {
Paul Duffin30ac3e72021-03-20 00:36:14 +0000545 result := GroupFixturePreparers(
Paul Duffin738a6d52021-03-16 19:10:48 +0000546 prepareForArchTest,
547 // Test specific preparer
548 OptionalFixturePreparer(tt.preparer),
549 // Prepare for native bridge test
550 FixtureModifyConfig(func(config Config) {
551 config.Targets[Android] = []Target{
552 {Android, Arch{ArchType: X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled, "", "", false},
553 {Android, Arch{ArchType: X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled, "", "", false},
554 {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridgeEnabled, "x86_64", "arm64", false},
555 {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridgeEnabled, "x86", "arm", false},
556 }
557 }),
558 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000559 ).RunTest(t)
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200560
Paul Duffin738a6d52021-03-16 19:10:48 +0000561 ctx := result.TestContext
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200562
563 if g, w := enabledVariants(ctx, "foo"), tt.fooVariants; !reflect.DeepEqual(w, g) {
564 t.Errorf("want foo variants:\n%q\ngot:\n%q\n", w, g)
565 }
566
567 if g, w := enabledVariants(ctx, "bar"), tt.barVariants; !reflect.DeepEqual(w, g) {
568 t.Errorf("want bar variants:\n%q\ngot:\n%q\n", w, g)
569 }
570
571 if g, w := enabledVariants(ctx, "baz"), tt.bazVariants; !reflect.DeepEqual(w, g) {
572 t.Errorf("want qux variants:\n%q\ngot:\n%q\n", w, g)
573 }
574 })
575 }
576}
Colin Cross4e879902021-07-23 00:18:41 +0000577
578type testArchPropertiesModule struct {
579 ModuleBase
580 properties struct {
581 A []string `android:"arch_variant"`
582 }
583}
584
585func (testArchPropertiesModule) GenerateAndroidBuildActions(ctx ModuleContext) {}
586
587func TestArchProperties(t *testing.T) {
588 bp := `
589 module {
590 name: "foo",
591 a: ["root"],
592 arch: {
593 arm: {
594 a: ["arm"],
Colin Cross4e879902021-07-23 00:18:41 +0000595 },
596 arm64: {
597 a: ["arm64"],
Colin Cross4e879902021-07-23 00:18:41 +0000598 },
Colin Crossf05b0d32022-07-14 18:10:34 -0700599 riscv64: { a: ["riscv64"] },
Colin Cross4e879902021-07-23 00:18:41 +0000600 x86: { a: ["x86"] },
601 x86_64: { a: ["x86_64"] },
602 },
603 multilib: {
604 lib32: { a: ["lib32"] },
605 lib64: { a: ["lib64"] },
606 },
607 target: {
608 bionic: { a: ["bionic"] },
609 host: { a: ["host"] },
610 android: { a: ["android"] },
Colin Cross528d67e2021-07-23 22:23:07 +0000611 glibc: { a: ["glibc"] },
612 musl: { a: ["musl"] },
Colin Cross4e879902021-07-23 00:18:41 +0000613 linux_bionic: { a: ["linux_bionic"] },
614 linux: { a: ["linux"] },
Colin Crossa98d36d2022-03-07 14:39:49 -0800615 host_linux: { a: ["host_linux"] },
Colin Cross4e879902021-07-23 00:18:41 +0000616 linux_glibc: { a: ["linux_glibc"] },
Colin Cross528d67e2021-07-23 22:23:07 +0000617 linux_musl: { a: ["linux_musl"] },
Colin Cross4e879902021-07-23 00:18:41 +0000618 windows: { a: ["windows"], enabled: true },
619 darwin: { a: ["darwin"] },
620 not_windows: { a: ["not_windows"] },
621 android32: { a: ["android32"] },
622 android64: { a: ["android64"] },
623 android_arm: { a: ["android_arm"] },
624 android_arm64: { a: ["android_arm64"] },
625 linux_x86: { a: ["linux_x86"] },
626 linux_x86_64: { a: ["linux_x86_64"] },
627 linux_glibc_x86: { a: ["linux_glibc_x86"] },
628 linux_glibc_x86_64: { a: ["linux_glibc_x86_64"] },
Colin Cross528d67e2021-07-23 22:23:07 +0000629 linux_musl_x86: { a: ["linux_musl_x86"] },
630 linux_musl_x86_64: { a: ["linux_musl_x86_64"] },
Colin Cross4e879902021-07-23 00:18:41 +0000631 darwin_x86_64: { a: ["darwin_x86_64"] },
632 windows_x86: { a: ["windows_x86"] },
633 windows_x86_64: { a: ["windows_x86_64"] },
634 },
635 }
636 `
637
638 type result struct {
639 module string
640 variant string
641 property []string
642 }
643
644 testCases := []struct {
645 name string
646 goOS string
647 preparer FixturePreparer
648 results []result
649 }{
650 {
651 name: "default",
652 results: []result{
653 {
654 module: "foo",
655 variant: "android_arm64_armv8-a",
Liz Kammere8303bd2022-02-16 09:02:48 -0500656 property: []string{"root", "linux", "bionic", "android", "android64", "arm64", "lib64", "android_arm64"},
Colin Cross4e879902021-07-23 00:18:41 +0000657 },
658 {
659 module: "foo",
660 variant: "android_arm_armv7-a-neon",
Liz Kammere8303bd2022-02-16 09:02:48 -0500661 property: []string{"root", "linux", "bionic", "android", "android64", "arm", "lib32", "android_arm"},
Colin Cross4e879902021-07-23 00:18:41 +0000662 },
663 },
664 },
665 {
666 name: "linux",
667 goOS: "linux",
668 results: []result{
669 {
670 module: "foo",
671 variant: "linux_glibc_x86_64",
Colin Crossa98d36d2022-03-07 14:39:49 -0800672 property: []string{"root", "host", "linux", "host_linux", "glibc", "linux_glibc", "not_windows", "x86_64", "lib64", "linux_x86_64", "linux_glibc_x86_64"},
Colin Cross4e879902021-07-23 00:18:41 +0000673 },
674 {
675 module: "foo",
676 variant: "linux_glibc_x86",
Colin Crossa98d36d2022-03-07 14:39:49 -0800677 property: []string{"root", "host", "linux", "host_linux", "glibc", "linux_glibc", "not_windows", "x86", "lib32", "linux_x86", "linux_glibc_x86"},
Colin Cross4e879902021-07-23 00:18:41 +0000678 },
679 },
680 },
681 {
682 name: "windows",
683 goOS: "linux",
684 preparer: FixtureModifyConfig(func(config Config) {
685 config.Targets[Windows] = []Target{
686 {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
687 {Windows, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", true},
688 }
689 }),
690 results: []result{
691 {
692 module: "foo",
693 variant: "windows_x86_64",
694 property: []string{"root", "host", "windows", "x86_64", "lib64", "windows_x86_64"},
695 },
696 {
697 module: "foo",
698 variant: "windows_x86",
699 property: []string{"root", "host", "windows", "x86", "lib32", "windows_x86"},
700 },
701 },
702 },
703 {
Colin Cross528d67e2021-07-23 22:23:07 +0000704 name: "linux_musl",
705 goOS: "linux",
706 preparer: FixtureModifyConfig(modifyTestConfigForMusl),
707 results: []result{
708 {
709 module: "foo",
710 variant: "linux_musl_x86_64",
Colin Crosse91ea2a2022-03-29 20:46:35 -0700711 property: []string{"root", "host", "linux", "host_linux", "musl", "linux_musl", "not_windows", "x86_64", "lib64", "linux_x86_64", "linux_musl_x86_64"},
Colin Cross528d67e2021-07-23 22:23:07 +0000712 },
713 {
714 module: "foo",
715 variant: "linux_musl_x86",
Colin Crosse91ea2a2022-03-29 20:46:35 -0700716 property: []string{"root", "host", "linux", "host_linux", "musl", "linux_musl", "not_windows", "x86", "lib32", "linux_x86", "linux_musl_x86"},
Colin Cross528d67e2021-07-23 22:23:07 +0000717 },
718 },
719 },
720 {
Colin Cross4e879902021-07-23 00:18:41 +0000721 name: "darwin",
722 goOS: "darwin",
723 results: []result{
724 {
725 module: "foo",
726 variant: "darwin_x86_64",
727 property: []string{"root", "host", "darwin", "not_windows", "x86_64", "lib64", "darwin_x86_64"},
728 },
729 },
730 },
731 }
732
733 for _, tt := range testCases {
734 t.Run(tt.name, func(t *testing.T) {
735 if tt.goOS != "" && tt.goOS != runtime.GOOS {
736 t.Skipf("test requires runtime.GOOS==%s, got %s", tt.goOS, runtime.GOOS)
737 }
738 result := GroupFixturePreparers(
739 PrepareForTestWithArchMutator,
740 OptionalFixturePreparer(tt.preparer),
741 FixtureRegisterWithContext(func(ctx RegistrationContext) {
742 ctx.RegisterModuleType("module", func() Module {
743 module := &testArchPropertiesModule{}
744 module.AddProperties(&module.properties)
745 InitAndroidArchModule(module, HostAndDeviceDefault, MultilibBoth)
746 return module
747 })
748 }),
749 ).RunTestWithBp(t, bp)
750
751 for _, want := range tt.results {
752 t.Run(want.module+"_"+want.variant, func(t *testing.T) {
753 got := result.ModuleForTests(want.module, want.variant).Module().(*testArchPropertiesModule).properties.A
754 AssertArrayString(t, "arch mutator property", want.property, got)
755 })
756 }
757 })
758 }
759}