blob: 57c901032bbcea9b4e7d4759d2f4040bb79295fe [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 {
Ivan Lozanoc7eafa72024-07-16 17:55:33 +0000335 name: "nohostcross",
336 host_supported: true,
337 host_cross_supported: false,
338 }
339
340 module {
Colin Cross158eeb72019-10-16 13:06:07 -0700341 name: "baz",
342 device_supported: false,
343 }
344
345 module {
346 name: "qux",
347 host_supported: true,
348 compile_multilib: "32",
349 }
Colin Crossc0f0eb82022-07-19 14:41:11 -0700350
351 module {
352 name: "first",
353 host_supported: true,
354 compile_multilib: "first",
355 }
356
357 multi_targets_module {
358 name: "multi_targets",
359 host_supported: true,
360 }
Colin Cross158eeb72019-10-16 13:06:07 -0700361 `
362
Colin Cross158eeb72019-10-16 13:06:07 -0700363 testCases := []struct {
Ivan Lozanoc7eafa72024-07-16 17:55:33 +0000364 name string
365 preparer FixturePreparer
366 fooVariants []string
367 barVariants []string
368 noHostCrossVariants []string
369 bazVariants []string
370 quxVariants []string
371 firstVariants []string
Colin Crossc0f0eb82022-07-19 14:41:11 -0700372
373 multiTargetVariants []string
374 multiTargetVariantsMap map[string][]string
375
376 goOS string
Colin Cross158eeb72019-10-16 13:06:07 -0700377 }{
378 {
Colin Crossc0f0eb82022-07-19 14:41:11 -0700379 name: "normal",
380 preparer: nil,
381 fooVariants: []string{"android_arm64_armv8-a", "android_arm_armv7-a-neon"},
382 barVariants: append(buildOSVariants, "android_arm64_armv8-a", "android_arm_armv7-a-neon"),
Ivan Lozanoc7eafa72024-07-16 17:55:33 +0000383 noHostCrossVariants: append(buildOSVariants, "android_arm64_armv8-a", "android_arm_armv7-a-neon"),
Colin Crossc0f0eb82022-07-19 14:41:11 -0700384 bazVariants: nil,
385 quxVariants: append(buildOS32Variants, "android_arm_armv7-a-neon"),
386 firstVariants: append(buildOS64Variants, "android_arm64_armv8-a"),
387 multiTargetVariants: []string{buildOSCommonVariant, "android_common"},
388 multiTargetVariantsMap: map[string][]string{
389 buildOSCommonVariant: buildOS64Variants,
390 "android_common": {"android_arm64_armv8-a"},
391 }},
Colin Cross158eeb72019-10-16 13:06:07 -0700392 {
393 name: "host-only",
Paul Duffin738a6d52021-03-16 19:10:48 +0000394 preparer: FixtureModifyConfig(func(config Config) {
Colin Cross158eeb72019-10-16 13:06:07 -0700395 config.BuildOSTarget = Target{}
396 config.BuildOSCommonTarget = Target{}
397 config.Targets[Android] = nil
Paul Duffin738a6d52021-03-16 19:10:48 +0000398 }),
Colin Crossc0f0eb82022-07-19 14:41:11 -0700399 fooVariants: nil,
400 barVariants: buildOSVariants,
Ivan Lozanoc7eafa72024-07-16 17:55:33 +0000401 noHostCrossVariants: buildOSVariants,
Colin Crossc0f0eb82022-07-19 14:41:11 -0700402 bazVariants: nil,
403 quxVariants: buildOS32Variants,
404 firstVariants: buildOS64Variants,
405 multiTargetVariants: []string{buildOSCommonVariant},
406 multiTargetVariantsMap: map[string][]string{
407 buildOSCommonVariant: buildOS64Variants,
408 },
409 },
410 {
411 name: "same arch host and host cross",
412 preparer: FixtureModifyConfig(func(config Config) {
Colin Cross5dc62c92023-02-15 12:20:19 -0800413 ModifyTestConfigForMusl(config)
Colin Crossc0f0eb82022-07-19 14:41:11 -0700414 modifyTestConfigForMuslArm64HostCross(config)
415 }),
416 fooVariants: []string{"android_arm64_armv8-a", "android_arm_armv7-a-neon"},
417 barVariants: []string{"linux_musl_x86_64", "linux_musl_arm64", "linux_musl_x86", "android_arm64_armv8-a", "android_arm_armv7-a-neon"},
Ivan Lozanoc7eafa72024-07-16 17:55:33 +0000418 noHostCrossVariants: []string{"linux_musl_x86_64", "linux_musl_x86", "android_arm64_armv8-a", "android_arm_armv7-a-neon"},
Colin Crossc0f0eb82022-07-19 14:41:11 -0700419 bazVariants: nil,
420 quxVariants: []string{"linux_musl_x86", "android_arm_armv7-a-neon"},
421 firstVariants: []string{"linux_musl_x86_64", "linux_musl_arm64", "android_arm64_armv8-a"},
422 multiTargetVariants: []string{"linux_musl_common", "android_common"},
423 multiTargetVariantsMap: map[string][]string{
424 "linux_musl_common": {"linux_musl_x86_64"},
425 "android_common": {"android_arm64_armv8-a"},
426 },
427 goOS: "linux",
Colin Cross158eeb72019-10-16 13:06:07 -0700428 },
429 }
430
431 enabledVariants := func(ctx *TestContext, name string) []string {
432 var ret []string
433 variants := ctx.ModuleVariantsForTests(name)
434 for _, variant := range variants {
435 m := ctx.ModuleForTests(name, variant)
Cole Fausta963b942024-04-11 17:43:00 -0700436 if m.Module().Enabled(PanickingConfigAndErrorContext(ctx)) {
Colin Cross158eeb72019-10-16 13:06:07 -0700437 ret = append(ret, variant)
438 }
439 }
440 return ret
441 }
442
Colin Crossc0f0eb82022-07-19 14:41:11 -0700443 moduleMultiTargets := func(ctx *TestContext, name string, variant string) []string {
444 var ret []string
445 targets := ctx.ModuleForTests(name, variant).Module().MultiTargets()
446 for _, t := range targets {
447 ret = append(ret, t.String())
448 }
449 return ret
450 }
451
Colin Cross158eeb72019-10-16 13:06:07 -0700452 for _, tt := range testCases {
453 t.Run(tt.name, func(t *testing.T) {
Colin Cross8bbc3d52024-09-11 15:33:54 -0700454 if tt.goOS != "" && tt.goOS != runtime.GOOS {
Colin Crossc0f0eb82022-07-19 14:41:11 -0700455 t.Skipf("requries runtime.GOOS %s", tt.goOS)
456 }
457
Paul Duffin30ac3e72021-03-20 00:36:14 +0000458 result := GroupFixturePreparers(
Paul Duffin738a6d52021-03-16 19:10:48 +0000459 prepareForArchTest,
460 // Test specific preparer
461 OptionalFixturePreparer(tt.preparer),
462 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000463 ).RunTest(t)
Paul Duffin738a6d52021-03-16 19:10:48 +0000464 ctx := result.TestContext
Colin Cross158eeb72019-10-16 13:06:07 -0700465
466 if g, w := enabledVariants(ctx, "foo"), tt.fooVariants; !reflect.DeepEqual(w, g) {
467 t.Errorf("want foo variants:\n%q\ngot:\n%q\n", w, g)
468 }
469
470 if g, w := enabledVariants(ctx, "bar"), tt.barVariants; !reflect.DeepEqual(w, g) {
471 t.Errorf("want bar variants:\n%q\ngot:\n%q\n", w, g)
472 }
473
Ivan Lozanoc7eafa72024-07-16 17:55:33 +0000474 if g, w := enabledVariants(ctx, "nohostcross"), tt.noHostCrossVariants; !reflect.DeepEqual(w, g) {
475 t.Errorf("want nohostcross variants:\n%q\ngot:\n%q\n", w, g)
476 }
477
Colin Cross158eeb72019-10-16 13:06:07 -0700478 if g, w := enabledVariants(ctx, "baz"), tt.bazVariants; !reflect.DeepEqual(w, g) {
479 t.Errorf("want baz variants:\n%q\ngot:\n%q\n", w, g)
480 }
481
482 if g, w := enabledVariants(ctx, "qux"), tt.quxVariants; !reflect.DeepEqual(w, g) {
483 t.Errorf("want qux variants:\n%q\ngot:\n%q\n", w, g)
484 }
Colin Crossc0f0eb82022-07-19 14:41:11 -0700485 if g, w := enabledVariants(ctx, "first"), tt.firstVariants; !reflect.DeepEqual(w, g) {
486 t.Errorf("want first variants:\n%q\ngot:\n%q\n", w, g)
487 }
488
489 if g, w := enabledVariants(ctx, "multi_targets"), tt.multiTargetVariants; !reflect.DeepEqual(w, g) {
490 t.Fatalf("want multi_target variants:\n%q\ngot:\n%q\n", w, g)
491 }
492
493 for _, variant := range tt.multiTargetVariants {
494 targets := moduleMultiTargets(ctx, "multi_targets", variant)
495 if g, w := targets, tt.multiTargetVariantsMap[variant]; !reflect.DeepEqual(w, g) {
496 t.Errorf("want ctx.MultiTarget() for %q:\n%q\ngot:\n%q\n", variant, w, g)
497 }
498 }
Colin Cross158eeb72019-10-16 13:06:07 -0700499 })
500 }
501}
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200502
503func TestArchMutatorNativeBridge(t *testing.T) {
504 bp := `
505 // This module is only enabled for x86.
506 module {
507 name: "foo",
508 }
509
510 // This module is enabled for x86 and arm (via native bridge).
511 module {
512 name: "bar",
513 native_bridge_supported: true,
514 }
515
516 // This module is enabled for arm (native_bridge) only.
517 module {
518 name: "baz",
519 native_bridge_supported: true,
520 enabled: false,
521 target: {
522 native_bridge: {
523 enabled: true,
524 }
525 }
526 }
527 `
528
529 testCases := []struct {
530 name string
Paul Duffin738a6d52021-03-16 19:10:48 +0000531 preparer FixturePreparer
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200532 fooVariants []string
533 barVariants []string
534 bazVariants []string
535 }{
536 {
537 name: "normal",
Paul Duffin738a6d52021-03-16 19:10:48 +0000538 preparer: nil,
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200539 fooVariants: []string{"android_x86_64_silvermont", "android_x86_silvermont"},
540 barVariants: []string{"android_x86_64_silvermont", "android_native_bridge_arm64_armv8-a", "android_x86_silvermont", "android_native_bridge_arm_armv7-a-neon"},
541 bazVariants: []string{"android_native_bridge_arm64_armv8-a", "android_native_bridge_arm_armv7-a-neon"},
542 },
543 }
544
545 enabledVariants := func(ctx *TestContext, name string) []string {
546 var ret []string
547 variants := ctx.ModuleVariantsForTests(name)
548 for _, variant := range variants {
549 m := ctx.ModuleForTests(name, variant)
Cole Fausta963b942024-04-11 17:43:00 -0700550 if m.Module().Enabled(PanickingConfigAndErrorContext(ctx)) {
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200551 ret = append(ret, variant)
552 }
553 }
554 return ret
555 }
556
557 for _, tt := range testCases {
558 t.Run(tt.name, func(t *testing.T) {
Paul Duffin30ac3e72021-03-20 00:36:14 +0000559 result := GroupFixturePreparers(
Paul Duffin738a6d52021-03-16 19:10:48 +0000560 prepareForArchTest,
561 // Test specific preparer
562 OptionalFixturePreparer(tt.preparer),
563 // Prepare for native bridge test
564 FixtureModifyConfig(func(config Config) {
565 config.Targets[Android] = []Target{
566 {Android, Arch{ArchType: X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled, "", "", false},
567 {Android, Arch{ArchType: X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled, "", "", false},
568 {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridgeEnabled, "x86_64", "arm64", false},
569 {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridgeEnabled, "x86", "arm", false},
570 }
571 }),
572 FixtureWithRootAndroidBp(bp),
Paul Duffin30ac3e72021-03-20 00:36:14 +0000573 ).RunTest(t)
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200574
Paul Duffin738a6d52021-03-16 19:10:48 +0000575 ctx := result.TestContext
Victor Khimenkoc26fcf42020-05-07 22:16:33 +0200576
577 if g, w := enabledVariants(ctx, "foo"), tt.fooVariants; !reflect.DeepEqual(w, g) {
578 t.Errorf("want foo variants:\n%q\ngot:\n%q\n", w, g)
579 }
580
581 if g, w := enabledVariants(ctx, "bar"), tt.barVariants; !reflect.DeepEqual(w, g) {
582 t.Errorf("want bar variants:\n%q\ngot:\n%q\n", w, g)
583 }
584
585 if g, w := enabledVariants(ctx, "baz"), tt.bazVariants; !reflect.DeepEqual(w, g) {
586 t.Errorf("want qux variants:\n%q\ngot:\n%q\n", w, g)
587 }
588 })
589 }
590}
Colin Cross4e879902021-07-23 00:18:41 +0000591
592type testArchPropertiesModule struct {
593 ModuleBase
594 properties struct {
595 A []string `android:"arch_variant"`
596 }
597}
598
599func (testArchPropertiesModule) GenerateAndroidBuildActions(ctx ModuleContext) {}
600
Zi Wang0f828442022-12-28 11:18:11 -0800601// Module property "a" does not have "variant_prepend" tag.
602// Expected variant property orders are based on this fact.
Colin Cross4e879902021-07-23 00:18:41 +0000603func TestArchProperties(t *testing.T) {
604 bp := `
605 module {
606 name: "foo",
607 a: ["root"],
608 arch: {
609 arm: {
610 a: ["arm"],
Colin Cross4e879902021-07-23 00:18:41 +0000611 },
612 arm64: {
613 a: ["arm64"],
Colin Cross4e879902021-07-23 00:18:41 +0000614 },
Colin Crossf05b0d32022-07-14 18:10:34 -0700615 riscv64: { a: ["riscv64"] },
Colin Cross4e879902021-07-23 00:18:41 +0000616 x86: { a: ["x86"] },
617 x86_64: { a: ["x86_64"] },
618 },
619 multilib: {
620 lib32: { a: ["lib32"] },
621 lib64: { a: ["lib64"] },
622 },
623 target: {
624 bionic: { a: ["bionic"] },
625 host: { a: ["host"] },
626 android: { a: ["android"] },
Colin Cross528d67e2021-07-23 22:23:07 +0000627 glibc: { a: ["glibc"] },
628 musl: { a: ["musl"] },
Colin Cross4e879902021-07-23 00:18:41 +0000629 linux_bionic: { a: ["linux_bionic"] },
630 linux: { a: ["linux"] },
Colin Crossa98d36d2022-03-07 14:39:49 -0800631 host_linux: { a: ["host_linux"] },
Colin Cross4e879902021-07-23 00:18:41 +0000632 linux_glibc: { a: ["linux_glibc"] },
Colin Cross528d67e2021-07-23 22:23:07 +0000633 linux_musl: { a: ["linux_musl"] },
Colin Cross4e879902021-07-23 00:18:41 +0000634 windows: { a: ["windows"], enabled: true },
635 darwin: { a: ["darwin"] },
636 not_windows: { a: ["not_windows"] },
637 android32: { a: ["android32"] },
638 android64: { a: ["android64"] },
639 android_arm: { a: ["android_arm"] },
640 android_arm64: { a: ["android_arm64"] },
641 linux_x86: { a: ["linux_x86"] },
642 linux_x86_64: { a: ["linux_x86_64"] },
643 linux_glibc_x86: { a: ["linux_glibc_x86"] },
644 linux_glibc_x86_64: { a: ["linux_glibc_x86_64"] },
Colin Cross528d67e2021-07-23 22:23:07 +0000645 linux_musl_x86: { a: ["linux_musl_x86"] },
646 linux_musl_x86_64: { a: ["linux_musl_x86_64"] },
Colin Cross4e879902021-07-23 00:18:41 +0000647 darwin_x86_64: { a: ["darwin_x86_64"] },
648 windows_x86: { a: ["windows_x86"] },
649 windows_x86_64: { a: ["windows_x86_64"] },
650 },
651 }
652 `
653
654 type result struct {
655 module string
656 variant string
657 property []string
658 }
659
660 testCases := []struct {
661 name string
662 goOS string
663 preparer FixturePreparer
664 results []result
665 }{
666 {
667 name: "default",
668 results: []result{
669 {
670 module: "foo",
671 variant: "android_arm64_armv8-a",
Liz Kammere8303bd2022-02-16 09:02:48 -0500672 property: []string{"root", "linux", "bionic", "android", "android64", "arm64", "lib64", "android_arm64"},
Colin Cross4e879902021-07-23 00:18:41 +0000673 },
674 {
675 module: "foo",
676 variant: "android_arm_armv7-a-neon",
Liz Kammere8303bd2022-02-16 09:02:48 -0500677 property: []string{"root", "linux", "bionic", "android", "android64", "arm", "lib32", "android_arm"},
Colin Cross4e879902021-07-23 00:18:41 +0000678 },
679 },
680 },
681 {
682 name: "linux",
683 goOS: "linux",
684 results: []result{
685 {
686 module: "foo",
687 variant: "linux_glibc_x86_64",
Colin Crossa98d36d2022-03-07 14:39:49 -0800688 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 +0000689 },
690 {
691 module: "foo",
692 variant: "linux_glibc_x86",
Colin Crossa98d36d2022-03-07 14:39:49 -0800693 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 +0000694 },
695 },
696 },
697 {
698 name: "windows",
699 goOS: "linux",
700 preparer: FixtureModifyConfig(func(config Config) {
701 config.Targets[Windows] = []Target{
702 {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
703 {Windows, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", true},
704 }
705 }),
706 results: []result{
707 {
708 module: "foo",
709 variant: "windows_x86_64",
710 property: []string{"root", "host", "windows", "x86_64", "lib64", "windows_x86_64"},
711 },
712 {
713 module: "foo",
714 variant: "windows_x86",
715 property: []string{"root", "host", "windows", "x86", "lib32", "windows_x86"},
716 },
717 },
718 },
719 {
Colin Cross528d67e2021-07-23 22:23:07 +0000720 name: "linux_musl",
721 goOS: "linux",
Colin Cross5dc62c92023-02-15 12:20:19 -0800722 preparer: FixtureModifyConfig(ModifyTestConfigForMusl),
Colin Cross528d67e2021-07-23 22:23:07 +0000723 results: []result{
724 {
725 module: "foo",
726 variant: "linux_musl_x86_64",
Colin Crosse91ea2a2022-03-29 20:46:35 -0700727 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 +0000728 },
729 {
730 module: "foo",
731 variant: "linux_musl_x86",
Colin Crosse91ea2a2022-03-29 20:46:35 -0700732 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 +0000733 },
734 },
735 },
736 {
Colin Cross4e879902021-07-23 00:18:41 +0000737 name: "darwin",
738 goOS: "darwin",
739 results: []result{
740 {
741 module: "foo",
742 variant: "darwin_x86_64",
743 property: []string{"root", "host", "darwin", "not_windows", "x86_64", "lib64", "darwin_x86_64"},
744 },
745 },
746 },
747 }
748
749 for _, tt := range testCases {
750 t.Run(tt.name, func(t *testing.T) {
751 if tt.goOS != "" && tt.goOS != runtime.GOOS {
752 t.Skipf("test requires runtime.GOOS==%s, got %s", tt.goOS, runtime.GOOS)
753 }
754 result := GroupFixturePreparers(
755 PrepareForTestWithArchMutator,
756 OptionalFixturePreparer(tt.preparer),
757 FixtureRegisterWithContext(func(ctx RegistrationContext) {
758 ctx.RegisterModuleType("module", func() Module {
759 module := &testArchPropertiesModule{}
760 module.AddProperties(&module.properties)
761 InitAndroidArchModule(module, HostAndDeviceDefault, MultilibBoth)
762 return module
763 })
764 }),
765 ).RunTestWithBp(t, bp)
766
767 for _, want := range tt.results {
768 t.Run(want.module+"_"+want.variant, func(t *testing.T) {
769 got := result.ModuleForTests(want.module, want.variant).Module().(*testArchPropertiesModule).properties.A
770 AssertArrayString(t, "arch mutator property", want.property, got)
771 })
772 }
773 })
774 }
775}