xref: /aosp_15_r20/build/soong/android/arch_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage android
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"reflect"
19*333d2b36SAndroid Build Coastguard Worker	"runtime"
20*333d2b36SAndroid Build Coastguard Worker	"testing"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workertype Named struct {
26*333d2b36SAndroid Build Coastguard Worker	A *string `android:"arch_variant"`
27*333d2b36SAndroid Build Coastguard Worker	B *string
28*333d2b36SAndroid Build Coastguard Worker}
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workertype NamedAllFiltered struct {
31*333d2b36SAndroid Build Coastguard Worker	A *string
32*333d2b36SAndroid Build Coastguard Worker}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workertype NamedNoneFiltered struct {
35*333d2b36SAndroid Build Coastguard Worker	A *string `android:"arch_variant"`
36*333d2b36SAndroid Build Coastguard Worker}
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Workerfunc TestFilterArchStruct(t *testing.T) {
39*333d2b36SAndroid Build Coastguard Worker	tests := []struct {
40*333d2b36SAndroid Build Coastguard Worker		name     string
41*333d2b36SAndroid Build Coastguard Worker		in       interface{}
42*333d2b36SAndroid Build Coastguard Worker		out      interface{}
43*333d2b36SAndroid Build Coastguard Worker		filtered bool
44*333d2b36SAndroid Build Coastguard Worker	}{
45*333d2b36SAndroid Build Coastguard Worker		// Property tests
46*333d2b36SAndroid Build Coastguard Worker		{
47*333d2b36SAndroid Build Coastguard Worker			name: "basic",
48*333d2b36SAndroid Build Coastguard Worker			in: &struct {
49*333d2b36SAndroid Build Coastguard Worker				A *string `android:"arch_variant"`
50*333d2b36SAndroid Build Coastguard Worker				B *string
51*333d2b36SAndroid Build Coastguard Worker			}{},
52*333d2b36SAndroid Build Coastguard Worker			out: &struct {
53*333d2b36SAndroid Build Coastguard Worker				A *string
54*333d2b36SAndroid Build Coastguard Worker			}{},
55*333d2b36SAndroid Build Coastguard Worker			filtered: true,
56*333d2b36SAndroid Build Coastguard Worker		},
57*333d2b36SAndroid Build Coastguard Worker		{
58*333d2b36SAndroid Build Coastguard Worker			name: "tags",
59*333d2b36SAndroid Build Coastguard Worker			in: &struct {
60*333d2b36SAndroid Build Coastguard Worker				A *string `android:"arch_variant"`
61*333d2b36SAndroid Build Coastguard Worker				B *string `android:"arch_variant,path"`
62*333d2b36SAndroid Build Coastguard Worker				C *string `android:"arch_variant,path,variant_prepend"`
63*333d2b36SAndroid Build Coastguard Worker				D *string `android:"path,variant_prepend,arch_variant"`
64*333d2b36SAndroid Build Coastguard Worker				E *string `android:"path"`
65*333d2b36SAndroid Build Coastguard Worker				F *string
66*333d2b36SAndroid Build Coastguard Worker			}{},
67*333d2b36SAndroid Build Coastguard Worker			out: &struct {
68*333d2b36SAndroid Build Coastguard Worker				A *string
69*333d2b36SAndroid Build Coastguard Worker				B *string
70*333d2b36SAndroid Build Coastguard Worker				C *string
71*333d2b36SAndroid Build Coastguard Worker				D *string
72*333d2b36SAndroid Build Coastguard Worker			}{},
73*333d2b36SAndroid Build Coastguard Worker			filtered: true,
74*333d2b36SAndroid Build Coastguard Worker		},
75*333d2b36SAndroid Build Coastguard Worker		{
76*333d2b36SAndroid Build Coastguard Worker			name: "all filtered",
77*333d2b36SAndroid Build Coastguard Worker			in: &struct {
78*333d2b36SAndroid Build Coastguard Worker				A *string
79*333d2b36SAndroid Build Coastguard Worker			}{},
80*333d2b36SAndroid Build Coastguard Worker			out:      nil,
81*333d2b36SAndroid Build Coastguard Worker			filtered: true,
82*333d2b36SAndroid Build Coastguard Worker		},
83*333d2b36SAndroid Build Coastguard Worker		{
84*333d2b36SAndroid Build Coastguard Worker			name: "none filtered",
85*333d2b36SAndroid Build Coastguard Worker			in: &struct {
86*333d2b36SAndroid Build Coastguard Worker				A *string `android:"arch_variant"`
87*333d2b36SAndroid Build Coastguard Worker			}{},
88*333d2b36SAndroid Build Coastguard Worker			out: &struct {
89*333d2b36SAndroid Build Coastguard Worker				A *string `android:"arch_variant"`
90*333d2b36SAndroid Build Coastguard Worker			}{},
91*333d2b36SAndroid Build Coastguard Worker			filtered: false,
92*333d2b36SAndroid Build Coastguard Worker		},
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker		// Sub-struct tests
95*333d2b36SAndroid Build Coastguard Worker		{
96*333d2b36SAndroid Build Coastguard Worker			name: "substruct",
97*333d2b36SAndroid Build Coastguard Worker			in: &struct {
98*333d2b36SAndroid Build Coastguard Worker				A struct {
99*333d2b36SAndroid Build Coastguard Worker					A *string `android:"arch_variant"`
100*333d2b36SAndroid Build Coastguard Worker					B *string
101*333d2b36SAndroid Build Coastguard Worker				} `android:"arch_variant"`
102*333d2b36SAndroid Build Coastguard Worker			}{},
103*333d2b36SAndroid Build Coastguard Worker			out: &struct {
104*333d2b36SAndroid Build Coastguard Worker				A struct {
105*333d2b36SAndroid Build Coastguard Worker					A *string
106*333d2b36SAndroid Build Coastguard Worker				}
107*333d2b36SAndroid Build Coastguard Worker			}{},
108*333d2b36SAndroid Build Coastguard Worker			filtered: true,
109*333d2b36SAndroid Build Coastguard Worker		},
110*333d2b36SAndroid Build Coastguard Worker		{
111*333d2b36SAndroid Build Coastguard Worker			name: "substruct all filtered",
112*333d2b36SAndroid Build Coastguard Worker			in: &struct {
113*333d2b36SAndroid Build Coastguard Worker				A struct {
114*333d2b36SAndroid Build Coastguard Worker					A *string
115*333d2b36SAndroid Build Coastguard Worker				} `android:"arch_variant"`
116*333d2b36SAndroid Build Coastguard Worker			}{},
117*333d2b36SAndroid Build Coastguard Worker			out:      nil,
118*333d2b36SAndroid Build Coastguard Worker			filtered: true,
119*333d2b36SAndroid Build Coastguard Worker		},
120*333d2b36SAndroid Build Coastguard Worker		{
121*333d2b36SAndroid Build Coastguard Worker			name: "substruct none filtered",
122*333d2b36SAndroid Build Coastguard Worker			in: &struct {
123*333d2b36SAndroid Build Coastguard Worker				A struct {
124*333d2b36SAndroid Build Coastguard Worker					A *string `android:"arch_variant"`
125*333d2b36SAndroid Build Coastguard Worker				} `android:"arch_variant"`
126*333d2b36SAndroid Build Coastguard Worker			}{},
127*333d2b36SAndroid Build Coastguard Worker			out: &struct {
128*333d2b36SAndroid Build Coastguard Worker				A struct {
129*333d2b36SAndroid Build Coastguard Worker					A *string `android:"arch_variant"`
130*333d2b36SAndroid Build Coastguard Worker				} `android:"arch_variant"`
131*333d2b36SAndroid Build Coastguard Worker			}{},
132*333d2b36SAndroid Build Coastguard Worker			filtered: false,
133*333d2b36SAndroid Build Coastguard Worker		},
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker		// Named sub-struct tests
136*333d2b36SAndroid Build Coastguard Worker		{
137*333d2b36SAndroid Build Coastguard Worker			name: "named substruct",
138*333d2b36SAndroid Build Coastguard Worker			in: &struct {
139*333d2b36SAndroid Build Coastguard Worker				A Named `android:"arch_variant"`
140*333d2b36SAndroid Build Coastguard Worker			}{},
141*333d2b36SAndroid Build Coastguard Worker			out: &struct {
142*333d2b36SAndroid Build Coastguard Worker				A struct {
143*333d2b36SAndroid Build Coastguard Worker					A *string
144*333d2b36SAndroid Build Coastguard Worker				}
145*333d2b36SAndroid Build Coastguard Worker			}{},
146*333d2b36SAndroid Build Coastguard Worker			filtered: true,
147*333d2b36SAndroid Build Coastguard Worker		},
148*333d2b36SAndroid Build Coastguard Worker		{
149*333d2b36SAndroid Build Coastguard Worker			name: "substruct all filtered",
150*333d2b36SAndroid Build Coastguard Worker			in: &struct {
151*333d2b36SAndroid Build Coastguard Worker				A NamedAllFiltered `android:"arch_variant"`
152*333d2b36SAndroid Build Coastguard Worker			}{},
153*333d2b36SAndroid Build Coastguard Worker			out:      nil,
154*333d2b36SAndroid Build Coastguard Worker			filtered: true,
155*333d2b36SAndroid Build Coastguard Worker		},
156*333d2b36SAndroid Build Coastguard Worker		{
157*333d2b36SAndroid Build Coastguard Worker			name: "substruct none filtered",
158*333d2b36SAndroid Build Coastguard Worker			in: &struct {
159*333d2b36SAndroid Build Coastguard Worker				A NamedNoneFiltered `android:"arch_variant"`
160*333d2b36SAndroid Build Coastguard Worker			}{},
161*333d2b36SAndroid Build Coastguard Worker			out: &struct {
162*333d2b36SAndroid Build Coastguard Worker				A NamedNoneFiltered `android:"arch_variant"`
163*333d2b36SAndroid Build Coastguard Worker			}{},
164*333d2b36SAndroid Build Coastguard Worker			filtered: false,
165*333d2b36SAndroid Build Coastguard Worker		},
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker		// Pointer to sub-struct tests
168*333d2b36SAndroid Build Coastguard Worker		{
169*333d2b36SAndroid Build Coastguard Worker			name: "pointer substruct",
170*333d2b36SAndroid Build Coastguard Worker			in: &struct {
171*333d2b36SAndroid Build Coastguard Worker				A *struct {
172*333d2b36SAndroid Build Coastguard Worker					A *string `android:"arch_variant"`
173*333d2b36SAndroid Build Coastguard Worker					B *string
174*333d2b36SAndroid Build Coastguard Worker				} `android:"arch_variant"`
175*333d2b36SAndroid Build Coastguard Worker			}{},
176*333d2b36SAndroid Build Coastguard Worker			out: &struct {
177*333d2b36SAndroid Build Coastguard Worker				A *struct {
178*333d2b36SAndroid Build Coastguard Worker					A *string
179*333d2b36SAndroid Build Coastguard Worker				}
180*333d2b36SAndroid Build Coastguard Worker			}{},
181*333d2b36SAndroid Build Coastguard Worker			filtered: true,
182*333d2b36SAndroid Build Coastguard Worker		},
183*333d2b36SAndroid Build Coastguard Worker		{
184*333d2b36SAndroid Build Coastguard Worker			name: "pointer substruct all filtered",
185*333d2b36SAndroid Build Coastguard Worker			in: &struct {
186*333d2b36SAndroid Build Coastguard Worker				A *struct {
187*333d2b36SAndroid Build Coastguard Worker					A *string
188*333d2b36SAndroid Build Coastguard Worker				} `android:"arch_variant"`
189*333d2b36SAndroid Build Coastguard Worker			}{},
190*333d2b36SAndroid Build Coastguard Worker			out:      nil,
191*333d2b36SAndroid Build Coastguard Worker			filtered: true,
192*333d2b36SAndroid Build Coastguard Worker		},
193*333d2b36SAndroid Build Coastguard Worker		{
194*333d2b36SAndroid Build Coastguard Worker			name: "pointer substruct none filtered",
195*333d2b36SAndroid Build Coastguard Worker			in: &struct {
196*333d2b36SAndroid Build Coastguard Worker				A *struct {
197*333d2b36SAndroid Build Coastguard Worker					A *string `android:"arch_variant"`
198*333d2b36SAndroid Build Coastguard Worker				} `android:"arch_variant"`
199*333d2b36SAndroid Build Coastguard Worker			}{},
200*333d2b36SAndroid Build Coastguard Worker			out: &struct {
201*333d2b36SAndroid Build Coastguard Worker				A *struct {
202*333d2b36SAndroid Build Coastguard Worker					A *string `android:"arch_variant"`
203*333d2b36SAndroid Build Coastguard Worker				} `android:"arch_variant"`
204*333d2b36SAndroid Build Coastguard Worker			}{},
205*333d2b36SAndroid Build Coastguard Worker			filtered: false,
206*333d2b36SAndroid Build Coastguard Worker		},
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Worker		// Pointer to named sub-struct tests
209*333d2b36SAndroid Build Coastguard Worker		{
210*333d2b36SAndroid Build Coastguard Worker			name: "pointer named substruct",
211*333d2b36SAndroid Build Coastguard Worker			in: &struct {
212*333d2b36SAndroid Build Coastguard Worker				A *Named `android:"arch_variant"`
213*333d2b36SAndroid Build Coastguard Worker			}{},
214*333d2b36SAndroid Build Coastguard Worker			out: &struct {
215*333d2b36SAndroid Build Coastguard Worker				A *struct {
216*333d2b36SAndroid Build Coastguard Worker					A *string
217*333d2b36SAndroid Build Coastguard Worker				}
218*333d2b36SAndroid Build Coastguard Worker			}{},
219*333d2b36SAndroid Build Coastguard Worker			filtered: true,
220*333d2b36SAndroid Build Coastguard Worker		},
221*333d2b36SAndroid Build Coastguard Worker		{
222*333d2b36SAndroid Build Coastguard Worker			name: "pointer substruct all filtered",
223*333d2b36SAndroid Build Coastguard Worker			in: &struct {
224*333d2b36SAndroid Build Coastguard Worker				A *NamedAllFiltered `android:"arch_variant"`
225*333d2b36SAndroid Build Coastguard Worker			}{},
226*333d2b36SAndroid Build Coastguard Worker			out:      nil,
227*333d2b36SAndroid Build Coastguard Worker			filtered: true,
228*333d2b36SAndroid Build Coastguard Worker		},
229*333d2b36SAndroid Build Coastguard Worker		{
230*333d2b36SAndroid Build Coastguard Worker			name: "pointer substruct none filtered",
231*333d2b36SAndroid Build Coastguard Worker			in: &struct {
232*333d2b36SAndroid Build Coastguard Worker				A *NamedNoneFiltered `android:"arch_variant"`
233*333d2b36SAndroid Build Coastguard Worker			}{},
234*333d2b36SAndroid Build Coastguard Worker			out: &struct {
235*333d2b36SAndroid Build Coastguard Worker				A *NamedNoneFiltered `android:"arch_variant"`
236*333d2b36SAndroid Build Coastguard Worker			}{},
237*333d2b36SAndroid Build Coastguard Worker			filtered: false,
238*333d2b36SAndroid Build Coastguard Worker		},
239*333d2b36SAndroid Build Coastguard Worker	}
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker	for _, test := range tests {
242*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
243*333d2b36SAndroid Build Coastguard Worker			out, filtered := proptools.FilterPropertyStruct(reflect.TypeOf(test.in), filterArchStruct)
244*333d2b36SAndroid Build Coastguard Worker			if filtered != test.filtered {
245*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected filtered %v, got %v", test.filtered, filtered)
246*333d2b36SAndroid Build Coastguard Worker			}
247*333d2b36SAndroid Build Coastguard Worker			expected := reflect.TypeOf(test.out)
248*333d2b36SAndroid Build Coastguard Worker			if out != expected {
249*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected type %v, got %v", expected, out)
250*333d2b36SAndroid Build Coastguard Worker			}
251*333d2b36SAndroid Build Coastguard Worker		})
252*333d2b36SAndroid Build Coastguard Worker	}
253*333d2b36SAndroid Build Coastguard Worker}
254*333d2b36SAndroid Build Coastguard Worker
255*333d2b36SAndroid Build Coastguard Workertype archTestModule struct {
256*333d2b36SAndroid Build Coastguard Worker	ModuleBase
257*333d2b36SAndroid Build Coastguard Worker	props struct {
258*333d2b36SAndroid Build Coastguard Worker		Deps []string
259*333d2b36SAndroid Build Coastguard Worker	}
260*333d2b36SAndroid Build Coastguard Worker}
261*333d2b36SAndroid Build Coastguard Worker
262*333d2b36SAndroid Build Coastguard Workerfunc (m *archTestMultiTargetsModule) GenerateAndroidBuildActions(ctx ModuleContext) {
263*333d2b36SAndroid Build Coastguard Worker}
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Workerfunc (m *archTestMultiTargetsModule) DepsMutator(ctx BottomUpMutatorContext) {
266*333d2b36SAndroid Build Coastguard Worker	ctx.AddDependency(ctx.Module(), nil, m.props.Deps...)
267*333d2b36SAndroid Build Coastguard Worker}
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Workerfunc archTestMultiTargetsModuleFactory() Module {
270*333d2b36SAndroid Build Coastguard Worker	m := &archTestMultiTargetsModule{}
271*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.props)
272*333d2b36SAndroid Build Coastguard Worker	InitAndroidMultiTargetsArchModule(m, HostAndDeviceSupported, MultilibCommon)
273*333d2b36SAndroid Build Coastguard Worker	return m
274*333d2b36SAndroid Build Coastguard Worker}
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Workertype archTestMultiTargetsModule struct {
277*333d2b36SAndroid Build Coastguard Worker	ModuleBase
278*333d2b36SAndroid Build Coastguard Worker	props struct {
279*333d2b36SAndroid Build Coastguard Worker		Deps []string
280*333d2b36SAndroid Build Coastguard Worker	}
281*333d2b36SAndroid Build Coastguard Worker}
282*333d2b36SAndroid Build Coastguard Worker
283*333d2b36SAndroid Build Coastguard Workerfunc (m *archTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
284*333d2b36SAndroid Build Coastguard Worker}
285*333d2b36SAndroid Build Coastguard Worker
286*333d2b36SAndroid Build Coastguard Workerfunc (m *archTestModule) DepsMutator(ctx BottomUpMutatorContext) {
287*333d2b36SAndroid Build Coastguard Worker	ctx.AddDependency(ctx.Module(), nil, m.props.Deps...)
288*333d2b36SAndroid Build Coastguard Worker}
289*333d2b36SAndroid Build Coastguard Worker
290*333d2b36SAndroid Build Coastguard Workerfunc archTestModuleFactory() Module {
291*333d2b36SAndroid Build Coastguard Worker	m := &archTestModule{}
292*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.props)
293*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, HostAndDeviceSupported, MultilibBoth)
294*333d2b36SAndroid Build Coastguard Worker	return m
295*333d2b36SAndroid Build Coastguard Worker}
296*333d2b36SAndroid Build Coastguard Worker
297*333d2b36SAndroid Build Coastguard Workervar prepareForArchTest = GroupFixturePreparers(
298*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithArchMutator,
299*333d2b36SAndroid Build Coastguard Worker	FixtureRegisterWithContext(func(ctx RegistrationContext) {
300*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("module", archTestModuleFactory)
301*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("multi_targets_module", archTestMultiTargetsModuleFactory)
302*333d2b36SAndroid Build Coastguard Worker	}),
303*333d2b36SAndroid Build Coastguard Worker)
304*333d2b36SAndroid Build Coastguard Worker
305*333d2b36SAndroid Build Coastguard Workerfunc TestArchMutator(t *testing.T) {
306*333d2b36SAndroid Build Coastguard Worker	var buildOSVariants []string
307*333d2b36SAndroid Build Coastguard Worker	var buildOS64Variants []string
308*333d2b36SAndroid Build Coastguard Worker	var buildOS32Variants []string
309*333d2b36SAndroid Build Coastguard Worker	var buildOSCommonVariant string
310*333d2b36SAndroid Build Coastguard Worker
311*333d2b36SAndroid Build Coastguard Worker	switch runtime.GOOS {
312*333d2b36SAndroid Build Coastguard Worker	case "linux":
313*333d2b36SAndroid Build Coastguard Worker		buildOSVariants = []string{"linux_glibc_x86_64", "linux_glibc_x86"}
314*333d2b36SAndroid Build Coastguard Worker		buildOS64Variants = []string{"linux_glibc_x86_64"}
315*333d2b36SAndroid Build Coastguard Worker		buildOS32Variants = []string{"linux_glibc_x86"}
316*333d2b36SAndroid Build Coastguard Worker		buildOSCommonVariant = "linux_glibc_common"
317*333d2b36SAndroid Build Coastguard Worker	case "darwin":
318*333d2b36SAndroid Build Coastguard Worker		buildOSVariants = []string{"darwin_x86_64"}
319*333d2b36SAndroid Build Coastguard Worker		buildOS64Variants = []string{"darwin_x86_64"}
320*333d2b36SAndroid Build Coastguard Worker		buildOS32Variants = nil
321*333d2b36SAndroid Build Coastguard Worker		buildOSCommonVariant = "darwin_common"
322*333d2b36SAndroid Build Coastguard Worker	}
323*333d2b36SAndroid Build Coastguard Worker
324*333d2b36SAndroid Build Coastguard Worker	bp := `
325*333d2b36SAndroid Build Coastguard Worker		module {
326*333d2b36SAndroid Build Coastguard Worker			name: "foo",
327*333d2b36SAndroid Build Coastguard Worker		}
328*333d2b36SAndroid Build Coastguard Worker
329*333d2b36SAndroid Build Coastguard Worker		module {
330*333d2b36SAndroid Build Coastguard Worker			name: "bar",
331*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
332*333d2b36SAndroid Build Coastguard Worker		}
333*333d2b36SAndroid Build Coastguard Worker
334*333d2b36SAndroid Build Coastguard Worker		module {
335*333d2b36SAndroid Build Coastguard Worker			name: "nohostcross",
336*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
337*333d2b36SAndroid Build Coastguard Worker			host_cross_supported: false,
338*333d2b36SAndroid Build Coastguard Worker		}
339*333d2b36SAndroid Build Coastguard Worker
340*333d2b36SAndroid Build Coastguard Worker		module {
341*333d2b36SAndroid Build Coastguard Worker			name: "baz",
342*333d2b36SAndroid Build Coastguard Worker			device_supported: false,
343*333d2b36SAndroid Build Coastguard Worker		}
344*333d2b36SAndroid Build Coastguard Worker
345*333d2b36SAndroid Build Coastguard Worker		module {
346*333d2b36SAndroid Build Coastguard Worker			name: "qux",
347*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
348*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "32",
349*333d2b36SAndroid Build Coastguard Worker		}
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Worker		module {
352*333d2b36SAndroid Build Coastguard Worker			name: "first",
353*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
354*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "first",
355*333d2b36SAndroid Build Coastguard Worker		}
356*333d2b36SAndroid Build Coastguard Worker
357*333d2b36SAndroid Build Coastguard Worker		multi_targets_module {
358*333d2b36SAndroid Build Coastguard Worker			name: "multi_targets",
359*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
360*333d2b36SAndroid Build Coastguard Worker		}
361*333d2b36SAndroid Build Coastguard Worker	`
362*333d2b36SAndroid Build Coastguard Worker
363*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
364*333d2b36SAndroid Build Coastguard Worker		name                string
365*333d2b36SAndroid Build Coastguard Worker		preparer            FixturePreparer
366*333d2b36SAndroid Build Coastguard Worker		fooVariants         []string
367*333d2b36SAndroid Build Coastguard Worker		barVariants         []string
368*333d2b36SAndroid Build Coastguard Worker		noHostCrossVariants []string
369*333d2b36SAndroid Build Coastguard Worker		bazVariants         []string
370*333d2b36SAndroid Build Coastguard Worker		quxVariants         []string
371*333d2b36SAndroid Build Coastguard Worker		firstVariants       []string
372*333d2b36SAndroid Build Coastguard Worker
373*333d2b36SAndroid Build Coastguard Worker		multiTargetVariants    []string
374*333d2b36SAndroid Build Coastguard Worker		multiTargetVariantsMap map[string][]string
375*333d2b36SAndroid Build Coastguard Worker
376*333d2b36SAndroid Build Coastguard Worker		goOS string
377*333d2b36SAndroid Build Coastguard Worker	}{
378*333d2b36SAndroid Build Coastguard Worker		{
379*333d2b36SAndroid Build Coastguard Worker			name:                "normal",
380*333d2b36SAndroid Build Coastguard Worker			preparer:            nil,
381*333d2b36SAndroid Build Coastguard Worker			fooVariants:         []string{"android_arm64_armv8-a", "android_arm_armv7-a-neon"},
382*333d2b36SAndroid Build Coastguard Worker			barVariants:         append(buildOSVariants, "android_arm64_armv8-a", "android_arm_armv7-a-neon"),
383*333d2b36SAndroid Build Coastguard Worker			noHostCrossVariants: append(buildOSVariants, "android_arm64_armv8-a", "android_arm_armv7-a-neon"),
384*333d2b36SAndroid Build Coastguard Worker			bazVariants:         nil,
385*333d2b36SAndroid Build Coastguard Worker			quxVariants:         append(buildOS32Variants, "android_arm_armv7-a-neon"),
386*333d2b36SAndroid Build Coastguard Worker			firstVariants:       append(buildOS64Variants, "android_arm64_armv8-a"),
387*333d2b36SAndroid Build Coastguard Worker			multiTargetVariants: []string{buildOSCommonVariant, "android_common"},
388*333d2b36SAndroid Build Coastguard Worker			multiTargetVariantsMap: map[string][]string{
389*333d2b36SAndroid Build Coastguard Worker				buildOSCommonVariant: buildOS64Variants,
390*333d2b36SAndroid Build Coastguard Worker				"android_common":     {"android_arm64_armv8-a"},
391*333d2b36SAndroid Build Coastguard Worker			}},
392*333d2b36SAndroid Build Coastguard Worker		{
393*333d2b36SAndroid Build Coastguard Worker			name: "host-only",
394*333d2b36SAndroid Build Coastguard Worker			preparer: FixtureModifyConfig(func(config Config) {
395*333d2b36SAndroid Build Coastguard Worker				config.BuildOSTarget = Target{}
396*333d2b36SAndroid Build Coastguard Worker				config.BuildOSCommonTarget = Target{}
397*333d2b36SAndroid Build Coastguard Worker				config.Targets[Android] = nil
398*333d2b36SAndroid Build Coastguard Worker			}),
399*333d2b36SAndroid Build Coastguard Worker			fooVariants:         nil,
400*333d2b36SAndroid Build Coastguard Worker			barVariants:         buildOSVariants,
401*333d2b36SAndroid Build Coastguard Worker			noHostCrossVariants: buildOSVariants,
402*333d2b36SAndroid Build Coastguard Worker			bazVariants:         nil,
403*333d2b36SAndroid Build Coastguard Worker			quxVariants:         buildOS32Variants,
404*333d2b36SAndroid Build Coastguard Worker			firstVariants:       buildOS64Variants,
405*333d2b36SAndroid Build Coastguard Worker			multiTargetVariants: []string{buildOSCommonVariant},
406*333d2b36SAndroid Build Coastguard Worker			multiTargetVariantsMap: map[string][]string{
407*333d2b36SAndroid Build Coastguard Worker				buildOSCommonVariant: buildOS64Variants,
408*333d2b36SAndroid Build Coastguard Worker			},
409*333d2b36SAndroid Build Coastguard Worker		},
410*333d2b36SAndroid Build Coastguard Worker		{
411*333d2b36SAndroid Build Coastguard Worker			name: "same arch host and host cross",
412*333d2b36SAndroid Build Coastguard Worker			preparer: FixtureModifyConfig(func(config Config) {
413*333d2b36SAndroid Build Coastguard Worker				ModifyTestConfigForMusl(config)
414*333d2b36SAndroid Build Coastguard Worker				modifyTestConfigForMuslArm64HostCross(config)
415*333d2b36SAndroid Build Coastguard Worker			}),
416*333d2b36SAndroid Build Coastguard Worker			fooVariants:         []string{"android_arm64_armv8-a", "android_arm_armv7-a-neon"},
417*333d2b36SAndroid Build Coastguard Worker			barVariants:         []string{"linux_musl_x86_64", "linux_musl_arm64", "linux_musl_x86", "android_arm64_armv8-a", "android_arm_armv7-a-neon"},
418*333d2b36SAndroid Build Coastguard Worker			noHostCrossVariants: []string{"linux_musl_x86_64", "linux_musl_x86", "android_arm64_armv8-a", "android_arm_armv7-a-neon"},
419*333d2b36SAndroid Build Coastguard Worker			bazVariants:         nil,
420*333d2b36SAndroid Build Coastguard Worker			quxVariants:         []string{"linux_musl_x86", "android_arm_armv7-a-neon"},
421*333d2b36SAndroid Build Coastguard Worker			firstVariants:       []string{"linux_musl_x86_64", "linux_musl_arm64", "android_arm64_armv8-a"},
422*333d2b36SAndroid Build Coastguard Worker			multiTargetVariants: []string{"linux_musl_common", "android_common"},
423*333d2b36SAndroid Build Coastguard Worker			multiTargetVariantsMap: map[string][]string{
424*333d2b36SAndroid Build Coastguard Worker				"linux_musl_common": {"linux_musl_x86_64"},
425*333d2b36SAndroid Build Coastguard Worker				"android_common":    {"android_arm64_armv8-a"},
426*333d2b36SAndroid Build Coastguard Worker			},
427*333d2b36SAndroid Build Coastguard Worker			goOS: "linux",
428*333d2b36SAndroid Build Coastguard Worker		},
429*333d2b36SAndroid Build Coastguard Worker	}
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Worker	enabledVariants := func(ctx *TestContext, name string) []string {
432*333d2b36SAndroid Build Coastguard Worker		var ret []string
433*333d2b36SAndroid Build Coastguard Worker		variants := ctx.ModuleVariantsForTests(name)
434*333d2b36SAndroid Build Coastguard Worker		for _, variant := range variants {
435*333d2b36SAndroid Build Coastguard Worker			m := ctx.ModuleForTests(name, variant)
436*333d2b36SAndroid Build Coastguard Worker			if m.Module().Enabled(PanickingConfigAndErrorContext(ctx)) {
437*333d2b36SAndroid Build Coastguard Worker				ret = append(ret, variant)
438*333d2b36SAndroid Build Coastguard Worker			}
439*333d2b36SAndroid Build Coastguard Worker		}
440*333d2b36SAndroid Build Coastguard Worker		return ret
441*333d2b36SAndroid Build Coastguard Worker	}
442*333d2b36SAndroid Build Coastguard Worker
443*333d2b36SAndroid Build Coastguard Worker	moduleMultiTargets := func(ctx *TestContext, name string, variant string) []string {
444*333d2b36SAndroid Build Coastguard Worker		var ret []string
445*333d2b36SAndroid Build Coastguard Worker		targets := ctx.ModuleForTests(name, variant).Module().MultiTargets()
446*333d2b36SAndroid Build Coastguard Worker		for _, t := range targets {
447*333d2b36SAndroid Build Coastguard Worker			ret = append(ret, t.String())
448*333d2b36SAndroid Build Coastguard Worker		}
449*333d2b36SAndroid Build Coastguard Worker		return ret
450*333d2b36SAndroid Build Coastguard Worker	}
451*333d2b36SAndroid Build Coastguard Worker
452*333d2b36SAndroid Build Coastguard Worker	for _, tt := range testCases {
453*333d2b36SAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
454*333d2b36SAndroid Build Coastguard Worker			if tt.goOS != "" && tt.goOS != runtime.GOOS {
455*333d2b36SAndroid Build Coastguard Worker				t.Skipf("requries runtime.GOOS %s", tt.goOS)
456*333d2b36SAndroid Build Coastguard Worker			}
457*333d2b36SAndroid Build Coastguard Worker
458*333d2b36SAndroid Build Coastguard Worker			result := GroupFixturePreparers(
459*333d2b36SAndroid Build Coastguard Worker				prepareForArchTest,
460*333d2b36SAndroid Build Coastguard Worker				// Test specific preparer
461*333d2b36SAndroid Build Coastguard Worker				OptionalFixturePreparer(tt.preparer),
462*333d2b36SAndroid Build Coastguard Worker				FixtureWithRootAndroidBp(bp),
463*333d2b36SAndroid Build Coastguard Worker			).RunTest(t)
464*333d2b36SAndroid Build Coastguard Worker			ctx := result.TestContext
465*333d2b36SAndroid Build Coastguard Worker
466*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "foo"), tt.fooVariants; !reflect.DeepEqual(w, g) {
467*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want foo variants:\n%q\ngot:\n%q\n", w, g)
468*333d2b36SAndroid Build Coastguard Worker			}
469*333d2b36SAndroid Build Coastguard Worker
470*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "bar"), tt.barVariants; !reflect.DeepEqual(w, g) {
471*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want bar variants:\n%q\ngot:\n%q\n", w, g)
472*333d2b36SAndroid Build Coastguard Worker			}
473*333d2b36SAndroid Build Coastguard Worker
474*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "nohostcross"), tt.noHostCrossVariants; !reflect.DeepEqual(w, g) {
475*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want nohostcross variants:\n%q\ngot:\n%q\n", w, g)
476*333d2b36SAndroid Build Coastguard Worker			}
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "baz"), tt.bazVariants; !reflect.DeepEqual(w, g) {
479*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want baz variants:\n%q\ngot:\n%q\n", w, g)
480*333d2b36SAndroid Build Coastguard Worker			}
481*333d2b36SAndroid Build Coastguard Worker
482*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "qux"), tt.quxVariants; !reflect.DeepEqual(w, g) {
483*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want qux variants:\n%q\ngot:\n%q\n", w, g)
484*333d2b36SAndroid Build Coastguard Worker			}
485*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "first"), tt.firstVariants; !reflect.DeepEqual(w, g) {
486*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want first variants:\n%q\ngot:\n%q\n", w, g)
487*333d2b36SAndroid Build Coastguard Worker			}
488*333d2b36SAndroid Build Coastguard Worker
489*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "multi_targets"), tt.multiTargetVariants; !reflect.DeepEqual(w, g) {
490*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("want multi_target variants:\n%q\ngot:\n%q\n", w, g)
491*333d2b36SAndroid Build Coastguard Worker			}
492*333d2b36SAndroid Build Coastguard Worker
493*333d2b36SAndroid Build Coastguard Worker			for _, variant := range tt.multiTargetVariants {
494*333d2b36SAndroid Build Coastguard Worker				targets := moduleMultiTargets(ctx, "multi_targets", variant)
495*333d2b36SAndroid Build Coastguard Worker				if g, w := targets, tt.multiTargetVariantsMap[variant]; !reflect.DeepEqual(w, g) {
496*333d2b36SAndroid Build Coastguard Worker					t.Errorf("want ctx.MultiTarget() for %q:\n%q\ngot:\n%q\n", variant, w, g)
497*333d2b36SAndroid Build Coastguard Worker				}
498*333d2b36SAndroid Build Coastguard Worker			}
499*333d2b36SAndroid Build Coastguard Worker		})
500*333d2b36SAndroid Build Coastguard Worker	}
501*333d2b36SAndroid Build Coastguard Worker}
502*333d2b36SAndroid Build Coastguard Worker
503*333d2b36SAndroid Build Coastguard Workerfunc TestArchMutatorNativeBridge(t *testing.T) {
504*333d2b36SAndroid Build Coastguard Worker	bp := `
505*333d2b36SAndroid Build Coastguard Worker		// This module is only enabled for x86.
506*333d2b36SAndroid Build Coastguard Worker		module {
507*333d2b36SAndroid Build Coastguard Worker			name: "foo",
508*333d2b36SAndroid Build Coastguard Worker		}
509*333d2b36SAndroid Build Coastguard Worker
510*333d2b36SAndroid Build Coastguard Worker		// This module is enabled for x86 and arm (via native bridge).
511*333d2b36SAndroid Build Coastguard Worker		module {
512*333d2b36SAndroid Build Coastguard Worker			name: "bar",
513*333d2b36SAndroid Build Coastguard Worker			native_bridge_supported: true,
514*333d2b36SAndroid Build Coastguard Worker		}
515*333d2b36SAndroid Build Coastguard Worker
516*333d2b36SAndroid Build Coastguard Worker		// This module is enabled for arm (native_bridge) only.
517*333d2b36SAndroid Build Coastguard Worker		module {
518*333d2b36SAndroid Build Coastguard Worker			name: "baz",
519*333d2b36SAndroid Build Coastguard Worker			native_bridge_supported: true,
520*333d2b36SAndroid Build Coastguard Worker			enabled: false,
521*333d2b36SAndroid Build Coastguard Worker			target: {
522*333d2b36SAndroid Build Coastguard Worker				native_bridge: {
523*333d2b36SAndroid Build Coastguard Worker					enabled: true,
524*333d2b36SAndroid Build Coastguard Worker				}
525*333d2b36SAndroid Build Coastguard Worker			}
526*333d2b36SAndroid Build Coastguard Worker		}
527*333d2b36SAndroid Build Coastguard Worker	`
528*333d2b36SAndroid Build Coastguard Worker
529*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
530*333d2b36SAndroid Build Coastguard Worker		name        string
531*333d2b36SAndroid Build Coastguard Worker		preparer    FixturePreparer
532*333d2b36SAndroid Build Coastguard Worker		fooVariants []string
533*333d2b36SAndroid Build Coastguard Worker		barVariants []string
534*333d2b36SAndroid Build Coastguard Worker		bazVariants []string
535*333d2b36SAndroid Build Coastguard Worker	}{
536*333d2b36SAndroid Build Coastguard Worker		{
537*333d2b36SAndroid Build Coastguard Worker			name:        "normal",
538*333d2b36SAndroid Build Coastguard Worker			preparer:    nil,
539*333d2b36SAndroid Build Coastguard Worker			fooVariants: []string{"android_x86_64_silvermont", "android_x86_silvermont"},
540*333d2b36SAndroid Build Coastguard Worker			barVariants: []string{"android_x86_64_silvermont", "android_native_bridge_arm64_armv8-a", "android_x86_silvermont", "android_native_bridge_arm_armv7-a-neon"},
541*333d2b36SAndroid Build Coastguard Worker			bazVariants: []string{"android_native_bridge_arm64_armv8-a", "android_native_bridge_arm_armv7-a-neon"},
542*333d2b36SAndroid Build Coastguard Worker		},
543*333d2b36SAndroid Build Coastguard Worker	}
544*333d2b36SAndroid Build Coastguard Worker
545*333d2b36SAndroid Build Coastguard Worker	enabledVariants := func(ctx *TestContext, name string) []string {
546*333d2b36SAndroid Build Coastguard Worker		var ret []string
547*333d2b36SAndroid Build Coastguard Worker		variants := ctx.ModuleVariantsForTests(name)
548*333d2b36SAndroid Build Coastguard Worker		for _, variant := range variants {
549*333d2b36SAndroid Build Coastguard Worker			m := ctx.ModuleForTests(name, variant)
550*333d2b36SAndroid Build Coastguard Worker			if m.Module().Enabled(PanickingConfigAndErrorContext(ctx)) {
551*333d2b36SAndroid Build Coastguard Worker				ret = append(ret, variant)
552*333d2b36SAndroid Build Coastguard Worker			}
553*333d2b36SAndroid Build Coastguard Worker		}
554*333d2b36SAndroid Build Coastguard Worker		return ret
555*333d2b36SAndroid Build Coastguard Worker	}
556*333d2b36SAndroid Build Coastguard Worker
557*333d2b36SAndroid Build Coastguard Worker	for _, tt := range testCases {
558*333d2b36SAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
559*333d2b36SAndroid Build Coastguard Worker			result := GroupFixturePreparers(
560*333d2b36SAndroid Build Coastguard Worker				prepareForArchTest,
561*333d2b36SAndroid Build Coastguard Worker				// Test specific preparer
562*333d2b36SAndroid Build Coastguard Worker				OptionalFixturePreparer(tt.preparer),
563*333d2b36SAndroid Build Coastguard Worker				PrepareForNativeBridgeEnabled,
564*333d2b36SAndroid Build Coastguard Worker				FixtureWithRootAndroidBp(bp),
565*333d2b36SAndroid Build Coastguard Worker			).RunTest(t)
566*333d2b36SAndroid Build Coastguard Worker
567*333d2b36SAndroid Build Coastguard Worker			ctx := result.TestContext
568*333d2b36SAndroid Build Coastguard Worker
569*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "foo"), tt.fooVariants; !reflect.DeepEqual(w, g) {
570*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want foo variants:\n%q\ngot:\n%q\n", w, g)
571*333d2b36SAndroid Build Coastguard Worker			}
572*333d2b36SAndroid Build Coastguard Worker
573*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "bar"), tt.barVariants; !reflect.DeepEqual(w, g) {
574*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want bar variants:\n%q\ngot:\n%q\n", w, g)
575*333d2b36SAndroid Build Coastguard Worker			}
576*333d2b36SAndroid Build Coastguard Worker
577*333d2b36SAndroid Build Coastguard Worker			if g, w := enabledVariants(ctx, "baz"), tt.bazVariants; !reflect.DeepEqual(w, g) {
578*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want qux variants:\n%q\ngot:\n%q\n", w, g)
579*333d2b36SAndroid Build Coastguard Worker			}
580*333d2b36SAndroid Build Coastguard Worker		})
581*333d2b36SAndroid Build Coastguard Worker	}
582*333d2b36SAndroid Build Coastguard Worker}
583*333d2b36SAndroid Build Coastguard Worker
584*333d2b36SAndroid Build Coastguard Workertype testArchPropertiesModule struct {
585*333d2b36SAndroid Build Coastguard Worker	ModuleBase
586*333d2b36SAndroid Build Coastguard Worker	properties struct {
587*333d2b36SAndroid Build Coastguard Worker		A []string `android:"arch_variant"`
588*333d2b36SAndroid Build Coastguard Worker	}
589*333d2b36SAndroid Build Coastguard Worker}
590*333d2b36SAndroid Build Coastguard Worker
591*333d2b36SAndroid Build Coastguard Workerfunc (testArchPropertiesModule) GenerateAndroidBuildActions(ctx ModuleContext) {}
592*333d2b36SAndroid Build Coastguard Worker
593*333d2b36SAndroid Build Coastguard Worker// Module property "a" does not have "variant_prepend" tag.
594*333d2b36SAndroid Build Coastguard Worker// Expected variant property orders are based on this fact.
595*333d2b36SAndroid Build Coastguard Workerfunc TestArchProperties(t *testing.T) {
596*333d2b36SAndroid Build Coastguard Worker	bp := `
597*333d2b36SAndroid Build Coastguard Worker		module {
598*333d2b36SAndroid Build Coastguard Worker			name: "foo",
599*333d2b36SAndroid Build Coastguard Worker			a: ["root"],
600*333d2b36SAndroid Build Coastguard Worker			arch: {
601*333d2b36SAndroid Build Coastguard Worker				arm: {
602*333d2b36SAndroid Build Coastguard Worker					a:  ["arm"],
603*333d2b36SAndroid Build Coastguard Worker				},
604*333d2b36SAndroid Build Coastguard Worker				arm64: {
605*333d2b36SAndroid Build Coastguard Worker					a:  ["arm64"],
606*333d2b36SAndroid Build Coastguard Worker				},
607*333d2b36SAndroid Build Coastguard Worker				riscv64: { a: ["riscv64"] },
608*333d2b36SAndroid Build Coastguard Worker				x86: { a:  ["x86"] },
609*333d2b36SAndroid Build Coastguard Worker				x86_64: { a:  ["x86_64"] },
610*333d2b36SAndroid Build Coastguard Worker			},
611*333d2b36SAndroid Build Coastguard Worker			multilib: {
612*333d2b36SAndroid Build Coastguard Worker				lib32: { a:  ["lib32"] },
613*333d2b36SAndroid Build Coastguard Worker				lib64: { a:  ["lib64"] },
614*333d2b36SAndroid Build Coastguard Worker			},
615*333d2b36SAndroid Build Coastguard Worker			target: {
616*333d2b36SAndroid Build Coastguard Worker				bionic: { a:  ["bionic"] },
617*333d2b36SAndroid Build Coastguard Worker				host: { a: ["host"] },
618*333d2b36SAndroid Build Coastguard Worker				android: { a:  ["android"] },
619*333d2b36SAndroid Build Coastguard Worker				glibc: { a:  ["glibc"] },
620*333d2b36SAndroid Build Coastguard Worker				musl: { a:  ["musl"] },
621*333d2b36SAndroid Build Coastguard Worker				linux_bionic: { a:  ["linux_bionic"] },
622*333d2b36SAndroid Build Coastguard Worker				linux: { a:  ["linux"] },
623*333d2b36SAndroid Build Coastguard Worker				host_linux: { a: ["host_linux"] },
624*333d2b36SAndroid Build Coastguard Worker				linux_glibc: { a:  ["linux_glibc"] },
625*333d2b36SAndroid Build Coastguard Worker				linux_musl: { a:  ["linux_musl"] },
626*333d2b36SAndroid Build Coastguard Worker				windows: { a:  ["windows"], enabled: true },
627*333d2b36SAndroid Build Coastguard Worker				darwin: { a:  ["darwin"] },
628*333d2b36SAndroid Build Coastguard Worker				not_windows: { a:  ["not_windows"] },
629*333d2b36SAndroid Build Coastguard Worker				android32: { a:  ["android32"] },
630*333d2b36SAndroid Build Coastguard Worker				android64: { a:  ["android64"] },
631*333d2b36SAndroid Build Coastguard Worker				android_arm: { a:  ["android_arm"] },
632*333d2b36SAndroid Build Coastguard Worker				android_arm64: { a:  ["android_arm64"] },
633*333d2b36SAndroid Build Coastguard Worker				linux_x86: { a:  ["linux_x86"] },
634*333d2b36SAndroid Build Coastguard Worker				linux_x86_64: { a:  ["linux_x86_64"] },
635*333d2b36SAndroid Build Coastguard Worker				linux_glibc_x86: { a:  ["linux_glibc_x86"] },
636*333d2b36SAndroid Build Coastguard Worker				linux_glibc_x86_64: { a:  ["linux_glibc_x86_64"] },
637*333d2b36SAndroid Build Coastguard Worker				linux_musl_x86: { a:  ["linux_musl_x86"] },
638*333d2b36SAndroid Build Coastguard Worker				linux_musl_x86_64: { a:  ["linux_musl_x86_64"] },
639*333d2b36SAndroid Build Coastguard Worker				darwin_x86_64: { a:  ["darwin_x86_64"] },
640*333d2b36SAndroid Build Coastguard Worker				windows_x86: { a:  ["windows_x86"] },
641*333d2b36SAndroid Build Coastguard Worker				windows_x86_64: { a:  ["windows_x86_64"] },
642*333d2b36SAndroid Build Coastguard Worker			},
643*333d2b36SAndroid Build Coastguard Worker		}
644*333d2b36SAndroid Build Coastguard Worker	`
645*333d2b36SAndroid Build Coastguard Worker
646*333d2b36SAndroid Build Coastguard Worker	type result struct {
647*333d2b36SAndroid Build Coastguard Worker		module   string
648*333d2b36SAndroid Build Coastguard Worker		variant  string
649*333d2b36SAndroid Build Coastguard Worker		property []string
650*333d2b36SAndroid Build Coastguard Worker	}
651*333d2b36SAndroid Build Coastguard Worker
652*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
653*333d2b36SAndroid Build Coastguard Worker		name     string
654*333d2b36SAndroid Build Coastguard Worker		goOS     string
655*333d2b36SAndroid Build Coastguard Worker		preparer FixturePreparer
656*333d2b36SAndroid Build Coastguard Worker		results  []result
657*333d2b36SAndroid Build Coastguard Worker	}{
658*333d2b36SAndroid Build Coastguard Worker		{
659*333d2b36SAndroid Build Coastguard Worker			name: "default",
660*333d2b36SAndroid Build Coastguard Worker			results: []result{
661*333d2b36SAndroid Build Coastguard Worker				{
662*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
663*333d2b36SAndroid Build Coastguard Worker					variant:  "android_arm64_armv8-a",
664*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "linux", "bionic", "android", "android64", "arm64", "lib64", "android_arm64"},
665*333d2b36SAndroid Build Coastguard Worker				},
666*333d2b36SAndroid Build Coastguard Worker				{
667*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
668*333d2b36SAndroid Build Coastguard Worker					variant:  "android_arm_armv7-a-neon",
669*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "linux", "bionic", "android", "android64", "arm", "lib32", "android_arm"},
670*333d2b36SAndroid Build Coastguard Worker				},
671*333d2b36SAndroid Build Coastguard Worker			},
672*333d2b36SAndroid Build Coastguard Worker		},
673*333d2b36SAndroid Build Coastguard Worker		{
674*333d2b36SAndroid Build Coastguard Worker			name: "linux",
675*333d2b36SAndroid Build Coastguard Worker			goOS: "linux",
676*333d2b36SAndroid Build Coastguard Worker			results: []result{
677*333d2b36SAndroid Build Coastguard Worker				{
678*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
679*333d2b36SAndroid Build Coastguard Worker					variant:  "linux_glibc_x86_64",
680*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "host", "linux", "host_linux", "glibc", "linux_glibc", "not_windows", "x86_64", "lib64", "linux_x86_64", "linux_glibc_x86_64"},
681*333d2b36SAndroid Build Coastguard Worker				},
682*333d2b36SAndroid Build Coastguard Worker				{
683*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
684*333d2b36SAndroid Build Coastguard Worker					variant:  "linux_glibc_x86",
685*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "host", "linux", "host_linux", "glibc", "linux_glibc", "not_windows", "x86", "lib32", "linux_x86", "linux_glibc_x86"},
686*333d2b36SAndroid Build Coastguard Worker				},
687*333d2b36SAndroid Build Coastguard Worker			},
688*333d2b36SAndroid Build Coastguard Worker		},
689*333d2b36SAndroid Build Coastguard Worker		{
690*333d2b36SAndroid Build Coastguard Worker			name: "windows",
691*333d2b36SAndroid Build Coastguard Worker			goOS: "linux",
692*333d2b36SAndroid Build Coastguard Worker			preparer: FixtureModifyConfig(func(config Config) {
693*333d2b36SAndroid Build Coastguard Worker				config.Targets[Windows] = []Target{
694*333d2b36SAndroid Build Coastguard Worker					{Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
695*333d2b36SAndroid Build Coastguard Worker					{Windows, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", true},
696*333d2b36SAndroid Build Coastguard Worker				}
697*333d2b36SAndroid Build Coastguard Worker			}),
698*333d2b36SAndroid Build Coastguard Worker			results: []result{
699*333d2b36SAndroid Build Coastguard Worker				{
700*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
701*333d2b36SAndroid Build Coastguard Worker					variant:  "windows_x86_64",
702*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "host", "windows", "x86_64", "lib64", "windows_x86_64"},
703*333d2b36SAndroid Build Coastguard Worker				},
704*333d2b36SAndroid Build Coastguard Worker				{
705*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
706*333d2b36SAndroid Build Coastguard Worker					variant:  "windows_x86",
707*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "host", "windows", "x86", "lib32", "windows_x86"},
708*333d2b36SAndroid Build Coastguard Worker				},
709*333d2b36SAndroid Build Coastguard Worker			},
710*333d2b36SAndroid Build Coastguard Worker		},
711*333d2b36SAndroid Build Coastguard Worker		{
712*333d2b36SAndroid Build Coastguard Worker			name:     "linux_musl",
713*333d2b36SAndroid Build Coastguard Worker			goOS:     "linux",
714*333d2b36SAndroid Build Coastguard Worker			preparer: FixtureModifyConfig(ModifyTestConfigForMusl),
715*333d2b36SAndroid Build Coastguard Worker			results: []result{
716*333d2b36SAndroid Build Coastguard Worker				{
717*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
718*333d2b36SAndroid Build Coastguard Worker					variant:  "linux_musl_x86_64",
719*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "host", "linux", "host_linux", "musl", "linux_musl", "not_windows", "x86_64", "lib64", "linux_x86_64", "linux_musl_x86_64"},
720*333d2b36SAndroid Build Coastguard Worker				},
721*333d2b36SAndroid Build Coastguard Worker				{
722*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
723*333d2b36SAndroid Build Coastguard Worker					variant:  "linux_musl_x86",
724*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "host", "linux", "host_linux", "musl", "linux_musl", "not_windows", "x86", "lib32", "linux_x86", "linux_musl_x86"},
725*333d2b36SAndroid Build Coastguard Worker				},
726*333d2b36SAndroid Build Coastguard Worker			},
727*333d2b36SAndroid Build Coastguard Worker		},
728*333d2b36SAndroid Build Coastguard Worker		{
729*333d2b36SAndroid Build Coastguard Worker			name: "darwin",
730*333d2b36SAndroid Build Coastguard Worker			goOS: "darwin",
731*333d2b36SAndroid Build Coastguard Worker			results: []result{
732*333d2b36SAndroid Build Coastguard Worker				{
733*333d2b36SAndroid Build Coastguard Worker					module:   "foo",
734*333d2b36SAndroid Build Coastguard Worker					variant:  "darwin_x86_64",
735*333d2b36SAndroid Build Coastguard Worker					property: []string{"root", "host", "darwin", "not_windows", "x86_64", "lib64", "darwin_x86_64"},
736*333d2b36SAndroid Build Coastguard Worker				},
737*333d2b36SAndroid Build Coastguard Worker			},
738*333d2b36SAndroid Build Coastguard Worker		},
739*333d2b36SAndroid Build Coastguard Worker	}
740*333d2b36SAndroid Build Coastguard Worker
741*333d2b36SAndroid Build Coastguard Worker	for _, tt := range testCases {
742*333d2b36SAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
743*333d2b36SAndroid Build Coastguard Worker			if tt.goOS != "" && tt.goOS != runtime.GOOS {
744*333d2b36SAndroid Build Coastguard Worker				t.Skipf("test requires runtime.GOOS==%s, got %s", tt.goOS, runtime.GOOS)
745*333d2b36SAndroid Build Coastguard Worker			}
746*333d2b36SAndroid Build Coastguard Worker			result := GroupFixturePreparers(
747*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithArchMutator,
748*333d2b36SAndroid Build Coastguard Worker				OptionalFixturePreparer(tt.preparer),
749*333d2b36SAndroid Build Coastguard Worker				FixtureRegisterWithContext(func(ctx RegistrationContext) {
750*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("module", func() Module {
751*333d2b36SAndroid Build Coastguard Worker						module := &testArchPropertiesModule{}
752*333d2b36SAndroid Build Coastguard Worker						module.AddProperties(&module.properties)
753*333d2b36SAndroid Build Coastguard Worker						InitAndroidArchModule(module, HostAndDeviceDefault, MultilibBoth)
754*333d2b36SAndroid Build Coastguard Worker						return module
755*333d2b36SAndroid Build Coastguard Worker					})
756*333d2b36SAndroid Build Coastguard Worker				}),
757*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, bp)
758*333d2b36SAndroid Build Coastguard Worker
759*333d2b36SAndroid Build Coastguard Worker			for _, want := range tt.results {
760*333d2b36SAndroid Build Coastguard Worker				t.Run(want.module+"_"+want.variant, func(t *testing.T) {
761*333d2b36SAndroid Build Coastguard Worker					got := result.ModuleForTests(want.module, want.variant).Module().(*testArchPropertiesModule).properties.A
762*333d2b36SAndroid Build Coastguard Worker					AssertArrayString(t, "arch mutator property", want.property, got)
763*333d2b36SAndroid Build Coastguard Worker				})
764*333d2b36SAndroid Build Coastguard Worker			}
765*333d2b36SAndroid Build Coastguard Worker		})
766*333d2b36SAndroid Build Coastguard Worker	}
767*333d2b36SAndroid Build Coastguard Worker}
768