xref: /aosp_15_r20/build/soong/android/prebuilt_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 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	"testing"
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuilts(t *testing.T) {
24*333d2b36SAndroid Build Coastguard Worker	buildOS := TestArchConfig(t.TempDir(), nil, "", nil).BuildOS
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Worker	var prebuiltsTests = []struct {
27*333d2b36SAndroid Build Coastguard Worker		name      string
28*333d2b36SAndroid Build Coastguard Worker		replaceBp bool // modules is added to default bp boilerplate if false.
29*333d2b36SAndroid Build Coastguard Worker		modules   string
30*333d2b36SAndroid Build Coastguard Worker		prebuilt  []OsType
31*333d2b36SAndroid Build Coastguard Worker		preparer  FixturePreparer
32*333d2b36SAndroid Build Coastguard Worker	}{
33*333d2b36SAndroid Build Coastguard Worker		{
34*333d2b36SAndroid Build Coastguard Worker			name: "no prebuilt",
35*333d2b36SAndroid Build Coastguard Worker			modules: `
36*333d2b36SAndroid Build Coastguard Worker				source {
37*333d2b36SAndroid Build Coastguard Worker					name: "bar",
38*333d2b36SAndroid Build Coastguard Worker				}`,
39*333d2b36SAndroid Build Coastguard Worker			prebuilt: nil,
40*333d2b36SAndroid Build Coastguard Worker		},
41*333d2b36SAndroid Build Coastguard Worker		{
42*333d2b36SAndroid Build Coastguard Worker			name: "no source prebuilt not preferred",
43*333d2b36SAndroid Build Coastguard Worker			modules: `
44*333d2b36SAndroid Build Coastguard Worker				prebuilt {
45*333d2b36SAndroid Build Coastguard Worker					name: "bar",
46*333d2b36SAndroid Build Coastguard Worker					prefer: false,
47*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
48*333d2b36SAndroid Build Coastguard Worker				}`,
49*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android, buildOS},
50*333d2b36SAndroid Build Coastguard Worker		},
51*333d2b36SAndroid Build Coastguard Worker		{
52*333d2b36SAndroid Build Coastguard Worker			name: "no source prebuilt preferred",
53*333d2b36SAndroid Build Coastguard Worker			modules: `
54*333d2b36SAndroid Build Coastguard Worker				prebuilt {
55*333d2b36SAndroid Build Coastguard Worker					name: "bar",
56*333d2b36SAndroid Build Coastguard Worker					prefer: true,
57*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
58*333d2b36SAndroid Build Coastguard Worker				}`,
59*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android, buildOS},
60*333d2b36SAndroid Build Coastguard Worker		},
61*333d2b36SAndroid Build Coastguard Worker		{
62*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt not preferred",
63*333d2b36SAndroid Build Coastguard Worker			modules: `
64*333d2b36SAndroid Build Coastguard Worker				source {
65*333d2b36SAndroid Build Coastguard Worker					name: "bar",
66*333d2b36SAndroid Build Coastguard Worker				}
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker				prebuilt {
69*333d2b36SAndroid Build Coastguard Worker					name: "bar",
70*333d2b36SAndroid Build Coastguard Worker					prefer: false,
71*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
72*333d2b36SAndroid Build Coastguard Worker				}`,
73*333d2b36SAndroid Build Coastguard Worker			prebuilt: nil,
74*333d2b36SAndroid Build Coastguard Worker		},
75*333d2b36SAndroid Build Coastguard Worker		{
76*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt preferred",
77*333d2b36SAndroid Build Coastguard Worker			modules: `
78*333d2b36SAndroid Build Coastguard Worker				source {
79*333d2b36SAndroid Build Coastguard Worker					name: "bar",
80*333d2b36SAndroid Build Coastguard Worker				}
81*333d2b36SAndroid Build Coastguard Worker
82*333d2b36SAndroid Build Coastguard Worker				prebuilt {
83*333d2b36SAndroid Build Coastguard Worker					name: "bar",
84*333d2b36SAndroid Build Coastguard Worker					prefer: true,
85*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
86*333d2b36SAndroid Build Coastguard Worker				}`,
87*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android, buildOS},
88*333d2b36SAndroid Build Coastguard Worker		},
89*333d2b36SAndroid Build Coastguard Worker		{
90*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt no file not preferred",
91*333d2b36SAndroid Build Coastguard Worker			modules: `
92*333d2b36SAndroid Build Coastguard Worker				source {
93*333d2b36SAndroid Build Coastguard Worker					name: "bar",
94*333d2b36SAndroid Build Coastguard Worker				}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker				prebuilt {
97*333d2b36SAndroid Build Coastguard Worker					name: "bar",
98*333d2b36SAndroid Build Coastguard Worker					prefer: false,
99*333d2b36SAndroid Build Coastguard Worker				}`,
100*333d2b36SAndroid Build Coastguard Worker			prebuilt: nil,
101*333d2b36SAndroid Build Coastguard Worker		},
102*333d2b36SAndroid Build Coastguard Worker		{
103*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt no file preferred",
104*333d2b36SAndroid Build Coastguard Worker			modules: `
105*333d2b36SAndroid Build Coastguard Worker				source {
106*333d2b36SAndroid Build Coastguard Worker					name: "bar",
107*333d2b36SAndroid Build Coastguard Worker				}
108*333d2b36SAndroid Build Coastguard Worker
109*333d2b36SAndroid Build Coastguard Worker				prebuilt {
110*333d2b36SAndroid Build Coastguard Worker					name: "bar",
111*333d2b36SAndroid Build Coastguard Worker					prefer: true,
112*333d2b36SAndroid Build Coastguard Worker				}`,
113*333d2b36SAndroid Build Coastguard Worker			prebuilt: nil,
114*333d2b36SAndroid Build Coastguard Worker		},
115*333d2b36SAndroid Build Coastguard Worker		{
116*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt file from filegroup preferred",
117*333d2b36SAndroid Build Coastguard Worker			modules: `
118*333d2b36SAndroid Build Coastguard Worker				filegroup {
119*333d2b36SAndroid Build Coastguard Worker					name: "fg",
120*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
121*333d2b36SAndroid Build Coastguard Worker				}
122*333d2b36SAndroid Build Coastguard Worker				prebuilt {
123*333d2b36SAndroid Build Coastguard Worker					name: "bar",
124*333d2b36SAndroid Build Coastguard Worker					prefer: true,
125*333d2b36SAndroid Build Coastguard Worker					srcs: [":fg"],
126*333d2b36SAndroid Build Coastguard Worker				}`,
127*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android, buildOS},
128*333d2b36SAndroid Build Coastguard Worker		},
129*333d2b36SAndroid Build Coastguard Worker		{
130*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt module for device only",
131*333d2b36SAndroid Build Coastguard Worker			modules: `
132*333d2b36SAndroid Build Coastguard Worker				source {
133*333d2b36SAndroid Build Coastguard Worker					name: "bar",
134*333d2b36SAndroid Build Coastguard Worker				}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker				prebuilt {
137*333d2b36SAndroid Build Coastguard Worker					name: "bar",
138*333d2b36SAndroid Build Coastguard Worker					host_supported: false,
139*333d2b36SAndroid Build Coastguard Worker					prefer: true,
140*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
141*333d2b36SAndroid Build Coastguard Worker				}`,
142*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android},
143*333d2b36SAndroid Build Coastguard Worker		},
144*333d2b36SAndroid Build Coastguard Worker		{
145*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt file for host only",
146*333d2b36SAndroid Build Coastguard Worker			modules: `
147*333d2b36SAndroid Build Coastguard Worker				source {
148*333d2b36SAndroid Build Coastguard Worker					name: "bar",
149*333d2b36SAndroid Build Coastguard Worker				}
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker				prebuilt {
152*333d2b36SAndroid Build Coastguard Worker					name: "bar",
153*333d2b36SAndroid Build Coastguard Worker					prefer: true,
154*333d2b36SAndroid Build Coastguard Worker					target: {
155*333d2b36SAndroid Build Coastguard Worker						host: {
156*333d2b36SAndroid Build Coastguard Worker							srcs: ["prebuilt_file"],
157*333d2b36SAndroid Build Coastguard Worker						},
158*333d2b36SAndroid Build Coastguard Worker					},
159*333d2b36SAndroid Build Coastguard Worker				}`,
160*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{buildOS},
161*333d2b36SAndroid Build Coastguard Worker		},
162*333d2b36SAndroid Build Coastguard Worker		{
163*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt override not preferred",
164*333d2b36SAndroid Build Coastguard Worker			modules: `
165*333d2b36SAndroid Build Coastguard Worker				source {
166*333d2b36SAndroid Build Coastguard Worker					name: "baz",
167*333d2b36SAndroid Build Coastguard Worker				}
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker				override_source {
170*333d2b36SAndroid Build Coastguard Worker					name: "bar",
171*333d2b36SAndroid Build Coastguard Worker					base: "baz",
172*333d2b36SAndroid Build Coastguard Worker				}
173*333d2b36SAndroid Build Coastguard Worker
174*333d2b36SAndroid Build Coastguard Worker				prebuilt {
175*333d2b36SAndroid Build Coastguard Worker					name: "bar",
176*333d2b36SAndroid Build Coastguard Worker					prefer: false,
177*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
178*333d2b36SAndroid Build Coastguard Worker				}`,
179*333d2b36SAndroid Build Coastguard Worker			prebuilt: nil,
180*333d2b36SAndroid Build Coastguard Worker		},
181*333d2b36SAndroid Build Coastguard Worker		{
182*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt override preferred",
183*333d2b36SAndroid Build Coastguard Worker			modules: `
184*333d2b36SAndroid Build Coastguard Worker				source {
185*333d2b36SAndroid Build Coastguard Worker					name: "baz",
186*333d2b36SAndroid Build Coastguard Worker				}
187*333d2b36SAndroid Build Coastguard Worker
188*333d2b36SAndroid Build Coastguard Worker				override_source {
189*333d2b36SAndroid Build Coastguard Worker					name: "bar",
190*333d2b36SAndroid Build Coastguard Worker					base: "baz",
191*333d2b36SAndroid Build Coastguard Worker				}
192*333d2b36SAndroid Build Coastguard Worker
193*333d2b36SAndroid Build Coastguard Worker				prebuilt {
194*333d2b36SAndroid Build Coastguard Worker					name: "bar",
195*333d2b36SAndroid Build Coastguard Worker					prefer: true,
196*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
197*333d2b36SAndroid Build Coastguard Worker				}`,
198*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android, buildOS},
199*333d2b36SAndroid Build Coastguard Worker		},
200*333d2b36SAndroid Build Coastguard Worker		{
201*333d2b36SAndroid Build Coastguard Worker			name:      "prebuilt including default-disabled OS",
202*333d2b36SAndroid Build Coastguard Worker			replaceBp: true,
203*333d2b36SAndroid Build Coastguard Worker			modules: `
204*333d2b36SAndroid Build Coastguard Worker				source {
205*333d2b36SAndroid Build Coastguard Worker					name: "foo",
206*333d2b36SAndroid Build Coastguard Worker					deps: [":bar"],
207*333d2b36SAndroid Build Coastguard Worker					target: {
208*333d2b36SAndroid Build Coastguard Worker						windows: {
209*333d2b36SAndroid Build Coastguard Worker							enabled: true,
210*333d2b36SAndroid Build Coastguard Worker						},
211*333d2b36SAndroid Build Coastguard Worker					},
212*333d2b36SAndroid Build Coastguard Worker				}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Worker				source {
215*333d2b36SAndroid Build Coastguard Worker					name: "bar",
216*333d2b36SAndroid Build Coastguard Worker					target: {
217*333d2b36SAndroid Build Coastguard Worker						windows: {
218*333d2b36SAndroid Build Coastguard Worker							enabled: true,
219*333d2b36SAndroid Build Coastguard Worker						},
220*333d2b36SAndroid Build Coastguard Worker					},
221*333d2b36SAndroid Build Coastguard Worker				}
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Worker				prebuilt {
224*333d2b36SAndroid Build Coastguard Worker					name: "bar",
225*333d2b36SAndroid Build Coastguard Worker					prefer: true,
226*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
227*333d2b36SAndroid Build Coastguard Worker					target: {
228*333d2b36SAndroid Build Coastguard Worker						windows: {
229*333d2b36SAndroid Build Coastguard Worker							enabled: true,
230*333d2b36SAndroid Build Coastguard Worker						},
231*333d2b36SAndroid Build Coastguard Worker					},
232*333d2b36SAndroid Build Coastguard Worker				}`,
233*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android, buildOS, Windows},
234*333d2b36SAndroid Build Coastguard Worker		},
235*333d2b36SAndroid Build Coastguard Worker		{
236*333d2b36SAndroid Build Coastguard Worker			name:      "fall back to source for default-disabled OS",
237*333d2b36SAndroid Build Coastguard Worker			replaceBp: true,
238*333d2b36SAndroid Build Coastguard Worker			modules: `
239*333d2b36SAndroid Build Coastguard Worker				source {
240*333d2b36SAndroid Build Coastguard Worker					name: "foo",
241*333d2b36SAndroid Build Coastguard Worker					deps: [":bar"],
242*333d2b36SAndroid Build Coastguard Worker					target: {
243*333d2b36SAndroid Build Coastguard Worker						windows: {
244*333d2b36SAndroid Build Coastguard Worker							enabled: true,
245*333d2b36SAndroid Build Coastguard Worker						},
246*333d2b36SAndroid Build Coastguard Worker					},
247*333d2b36SAndroid Build Coastguard Worker				}
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Worker				source {
250*333d2b36SAndroid Build Coastguard Worker					name: "bar",
251*333d2b36SAndroid Build Coastguard Worker					target: {
252*333d2b36SAndroid Build Coastguard Worker						windows: {
253*333d2b36SAndroid Build Coastguard Worker							enabled: true,
254*333d2b36SAndroid Build Coastguard Worker						},
255*333d2b36SAndroid Build Coastguard Worker					},
256*333d2b36SAndroid Build Coastguard Worker				}
257*333d2b36SAndroid Build Coastguard Worker
258*333d2b36SAndroid Build Coastguard Worker				prebuilt {
259*333d2b36SAndroid Build Coastguard Worker					name: "bar",
260*333d2b36SAndroid Build Coastguard Worker					prefer: true,
261*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
262*333d2b36SAndroid Build Coastguard Worker				}`,
263*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android, buildOS},
264*333d2b36SAndroid Build Coastguard Worker		},
265*333d2b36SAndroid Build Coastguard Worker		{
266*333d2b36SAndroid Build Coastguard Worker			name:      "prebuilt properties customizable",
267*333d2b36SAndroid Build Coastguard Worker			replaceBp: true,
268*333d2b36SAndroid Build Coastguard Worker			modules: `
269*333d2b36SAndroid Build Coastguard Worker				source {
270*333d2b36SAndroid Build Coastguard Worker					name: "foo",
271*333d2b36SAndroid Build Coastguard Worker					deps: [":bar"],
272*333d2b36SAndroid Build Coastguard Worker				}
273*333d2b36SAndroid Build Coastguard Worker
274*333d2b36SAndroid Build Coastguard Worker				soong_config_module_type {
275*333d2b36SAndroid Build Coastguard Worker					name: "prebuilt_with_config",
276*333d2b36SAndroid Build Coastguard Worker					module_type: "prebuilt",
277*333d2b36SAndroid Build Coastguard Worker					config_namespace: "any_namespace",
278*333d2b36SAndroid Build Coastguard Worker					bool_variables: ["bool_var"],
279*333d2b36SAndroid Build Coastguard Worker					properties: ["prefer"],
280*333d2b36SAndroid Build Coastguard Worker				}
281*333d2b36SAndroid Build Coastguard Worker
282*333d2b36SAndroid Build Coastguard Worker				prebuilt_with_config {
283*333d2b36SAndroid Build Coastguard Worker					name: "bar",
284*333d2b36SAndroid Build Coastguard Worker					prefer: true,
285*333d2b36SAndroid Build Coastguard Worker					srcs: ["prebuilt_file"],
286*333d2b36SAndroid Build Coastguard Worker					soong_config_variables: {
287*333d2b36SAndroid Build Coastguard Worker						bool_var: {
288*333d2b36SAndroid Build Coastguard Worker							prefer: false,
289*333d2b36SAndroid Build Coastguard Worker							conditions_default: {
290*333d2b36SAndroid Build Coastguard Worker								prefer: true,
291*333d2b36SAndroid Build Coastguard Worker							},
292*333d2b36SAndroid Build Coastguard Worker						},
293*333d2b36SAndroid Build Coastguard Worker					},
294*333d2b36SAndroid Build Coastguard Worker				}`,
295*333d2b36SAndroid Build Coastguard Worker			prebuilt: []OsType{Android, buildOS},
296*333d2b36SAndroid Build Coastguard Worker		},
297*333d2b36SAndroid Build Coastguard Worker	}
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker	fs := MockFS{
300*333d2b36SAndroid Build Coastguard Worker		"prebuilt_file": nil,
301*333d2b36SAndroid Build Coastguard Worker		"source_file":   nil,
302*333d2b36SAndroid Build Coastguard Worker	}
303*333d2b36SAndroid Build Coastguard Worker
304*333d2b36SAndroid Build Coastguard Worker	for _, test := range prebuiltsTests {
305*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
306*333d2b36SAndroid Build Coastguard Worker			bp := test.modules
307*333d2b36SAndroid Build Coastguard Worker			if !test.replaceBp {
308*333d2b36SAndroid Build Coastguard Worker				bp = bp + `
309*333d2b36SAndroid Build Coastguard Worker					source {
310*333d2b36SAndroid Build Coastguard Worker						name: "foo",
311*333d2b36SAndroid Build Coastguard Worker						deps: [":bar"],
312*333d2b36SAndroid Build Coastguard Worker					}`
313*333d2b36SAndroid Build Coastguard Worker			}
314*333d2b36SAndroid Build Coastguard Worker
315*333d2b36SAndroid Build Coastguard Worker			// Add windows to the target list to test the logic when a variant is
316*333d2b36SAndroid Build Coastguard Worker			// disabled by default.
317*333d2b36SAndroid Build Coastguard Worker			if !Windows.DefaultDisabled {
318*333d2b36SAndroid Build Coastguard Worker				t.Errorf("windows is assumed to be disabled by default")
319*333d2b36SAndroid Build Coastguard Worker			}
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Worker			result := GroupFixturePreparers(
322*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithArchMutator,
323*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithPrebuilts,
324*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithOverrides,
325*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithFilegroup,
326*333d2b36SAndroid Build Coastguard Worker				// Add a Windows target to the configuration.
327*333d2b36SAndroid Build Coastguard Worker				FixtureModifyConfig(func(config Config) {
328*333d2b36SAndroid Build Coastguard Worker					config.Targets[Windows] = []Target{
329*333d2b36SAndroid Build Coastguard Worker						{Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
330*333d2b36SAndroid Build Coastguard Worker					}
331*333d2b36SAndroid Build Coastguard Worker				}),
332*333d2b36SAndroid Build Coastguard Worker				fs.AddToFixture(),
333*333d2b36SAndroid Build Coastguard Worker				FixtureRegisterWithContext(registerTestPrebuiltModules),
334*333d2b36SAndroid Build Coastguard Worker				OptionalFixturePreparer(test.preparer),
335*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, bp)
336*333d2b36SAndroid Build Coastguard Worker
337*333d2b36SAndroid Build Coastguard Worker			for _, variant := range result.ModuleVariantsForTests("foo") {
338*333d2b36SAndroid Build Coastguard Worker				foo := result.ModuleForTests("foo", variant)
339*333d2b36SAndroid Build Coastguard Worker				t.Run(foo.Module().Target().Os.String(), func(t *testing.T) {
340*333d2b36SAndroid Build Coastguard Worker					var dependsOnSourceModule, dependsOnPrebuiltModule bool
341*333d2b36SAndroid Build Coastguard Worker					result.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
342*333d2b36SAndroid Build Coastguard Worker						if _, ok := m.(*sourceModule); ok {
343*333d2b36SAndroid Build Coastguard Worker							dependsOnSourceModule = true
344*333d2b36SAndroid Build Coastguard Worker						}
345*333d2b36SAndroid Build Coastguard Worker						if p, ok := m.(*prebuiltModule); ok {
346*333d2b36SAndroid Build Coastguard Worker							dependsOnPrebuiltModule = true
347*333d2b36SAndroid Build Coastguard Worker							if !p.Prebuilt().properties.UsePrebuilt {
348*333d2b36SAndroid Build Coastguard Worker								t.Errorf("dependency on prebuilt module not marked used")
349*333d2b36SAndroid Build Coastguard Worker							}
350*333d2b36SAndroid Build Coastguard Worker						}
351*333d2b36SAndroid Build Coastguard Worker					})
352*333d2b36SAndroid Build Coastguard Worker
353*333d2b36SAndroid Build Coastguard Worker					moduleIsDisabled := !foo.Module().Enabled(PanickingConfigAndErrorContext(result.TestContext))
354*333d2b36SAndroid Build Coastguard Worker					deps := foo.Module().(*sourceModule).deps
355*333d2b36SAndroid Build Coastguard Worker					if moduleIsDisabled {
356*333d2b36SAndroid Build Coastguard Worker						if len(deps) > 0 {
357*333d2b36SAndroid Build Coastguard Worker							t.Errorf("disabled module got deps: %v", deps)
358*333d2b36SAndroid Build Coastguard Worker						}
359*333d2b36SAndroid Build Coastguard Worker					} else {
360*333d2b36SAndroid Build Coastguard Worker						if len(deps) != 1 {
361*333d2b36SAndroid Build Coastguard Worker							t.Errorf("deps does not have single path, but is %v", deps)
362*333d2b36SAndroid Build Coastguard Worker						}
363*333d2b36SAndroid Build Coastguard Worker					}
364*333d2b36SAndroid Build Coastguard Worker
365*333d2b36SAndroid Build Coastguard Worker					var usingSourceFile, usingPrebuiltFile bool
366*333d2b36SAndroid Build Coastguard Worker					if len(deps) > 0 && deps[0].String() == "source_file" {
367*333d2b36SAndroid Build Coastguard Worker						usingSourceFile = true
368*333d2b36SAndroid Build Coastguard Worker					}
369*333d2b36SAndroid Build Coastguard Worker					if len(deps) > 0 && deps[0].String() == "prebuilt_file" {
370*333d2b36SAndroid Build Coastguard Worker						usingPrebuiltFile = true
371*333d2b36SAndroid Build Coastguard Worker					}
372*333d2b36SAndroid Build Coastguard Worker
373*333d2b36SAndroid Build Coastguard Worker					prebuilt := false
374*333d2b36SAndroid Build Coastguard Worker					for _, os := range test.prebuilt {
375*333d2b36SAndroid Build Coastguard Worker						if os == foo.Module().Target().Os {
376*333d2b36SAndroid Build Coastguard Worker							prebuilt = true
377*333d2b36SAndroid Build Coastguard Worker						}
378*333d2b36SAndroid Build Coastguard Worker					}
379*333d2b36SAndroid Build Coastguard Worker
380*333d2b36SAndroid Build Coastguard Worker					if prebuilt {
381*333d2b36SAndroid Build Coastguard Worker						if moduleIsDisabled {
382*333d2b36SAndroid Build Coastguard Worker							t.Errorf("dependent module for prebuilt is disabled")
383*333d2b36SAndroid Build Coastguard Worker						}
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Worker						if !dependsOnPrebuiltModule {
386*333d2b36SAndroid Build Coastguard Worker							t.Errorf("doesn't depend on prebuilt module")
387*333d2b36SAndroid Build Coastguard Worker						}
388*333d2b36SAndroid Build Coastguard Worker						if !usingPrebuiltFile {
389*333d2b36SAndroid Build Coastguard Worker							t.Errorf("doesn't use prebuilt_file")
390*333d2b36SAndroid Build Coastguard Worker						}
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Worker						if dependsOnSourceModule {
393*333d2b36SAndroid Build Coastguard Worker							t.Errorf("depends on source module")
394*333d2b36SAndroid Build Coastguard Worker						}
395*333d2b36SAndroid Build Coastguard Worker						if usingSourceFile {
396*333d2b36SAndroid Build Coastguard Worker							t.Errorf("using source_file")
397*333d2b36SAndroid Build Coastguard Worker						}
398*333d2b36SAndroid Build Coastguard Worker					} else if !moduleIsDisabled {
399*333d2b36SAndroid Build Coastguard Worker						if dependsOnPrebuiltModule {
400*333d2b36SAndroid Build Coastguard Worker							t.Errorf("depends on prebuilt module")
401*333d2b36SAndroid Build Coastguard Worker						}
402*333d2b36SAndroid Build Coastguard Worker						if usingPrebuiltFile {
403*333d2b36SAndroid Build Coastguard Worker							t.Errorf("using prebuilt_file")
404*333d2b36SAndroid Build Coastguard Worker						}
405*333d2b36SAndroid Build Coastguard Worker
406*333d2b36SAndroid Build Coastguard Worker						if !dependsOnSourceModule {
407*333d2b36SAndroid Build Coastguard Worker							t.Errorf("doesn't depend on source module")
408*333d2b36SAndroid Build Coastguard Worker						}
409*333d2b36SAndroid Build Coastguard Worker						if !usingSourceFile {
410*333d2b36SAndroid Build Coastguard Worker							t.Errorf("doesn't use source_file")
411*333d2b36SAndroid Build Coastguard Worker						}
412*333d2b36SAndroid Build Coastguard Worker					}
413*333d2b36SAndroid Build Coastguard Worker				})
414*333d2b36SAndroid Build Coastguard Worker			}
415*333d2b36SAndroid Build Coastguard Worker		})
416*333d2b36SAndroid Build Coastguard Worker	}
417*333d2b36SAndroid Build Coastguard Worker}
418*333d2b36SAndroid Build Coastguard Worker
419*333d2b36SAndroid Build Coastguard Workerfunc testPrebuiltErrorWithFixture(t *testing.T, expectedError, bp string, fixture FixturePreparer) {
420*333d2b36SAndroid Build Coastguard Worker	t.Helper()
421*333d2b36SAndroid Build Coastguard Worker	fs := MockFS{
422*333d2b36SAndroid Build Coastguard Worker		"prebuilt_file": nil,
423*333d2b36SAndroid Build Coastguard Worker	}
424*333d2b36SAndroid Build Coastguard Worker	GroupFixturePreparers(
425*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithArchMutator,
426*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithPrebuilts,
427*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithOverrides,
428*333d2b36SAndroid Build Coastguard Worker		fs.AddToFixture(),
429*333d2b36SAndroid Build Coastguard Worker		FixtureRegisterWithContext(registerTestPrebuiltModules),
430*333d2b36SAndroid Build Coastguard Worker		OptionalFixturePreparer(fixture),
431*333d2b36SAndroid Build Coastguard Worker	).
432*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(FixtureExpectsAtLeastOneErrorMatchingPattern(expectedError)).
433*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
434*333d2b36SAndroid Build Coastguard Worker
435*333d2b36SAndroid Build Coastguard Worker}
436*333d2b36SAndroid Build Coastguard Worker
437*333d2b36SAndroid Build Coastguard Workerfunc testPrebuiltError(t *testing.T, expectedError, bp string) {
438*333d2b36SAndroid Build Coastguard Worker	testPrebuiltErrorWithFixture(t, expectedError, bp, nil)
439*333d2b36SAndroid Build Coastguard Worker}
440*333d2b36SAndroid Build Coastguard Worker
441*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltShouldNotChangePartition(t *testing.T) {
442*333d2b36SAndroid Build Coastguard Worker	testPrebuiltError(t, `partition is different`, `
443*333d2b36SAndroid Build Coastguard Worker		source {
444*333d2b36SAndroid Build Coastguard Worker			name: "foo",
445*333d2b36SAndroid Build Coastguard Worker			vendor: true,
446*333d2b36SAndroid Build Coastguard Worker		}
447*333d2b36SAndroid Build Coastguard Worker		prebuilt {
448*333d2b36SAndroid Build Coastguard Worker			name: "foo",
449*333d2b36SAndroid Build Coastguard Worker			prefer: true,
450*333d2b36SAndroid Build Coastguard Worker			srcs: ["prebuilt_file"],
451*333d2b36SAndroid Build Coastguard Worker		}`)
452*333d2b36SAndroid Build Coastguard Worker}
453*333d2b36SAndroid Build Coastguard Worker
454*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltShouldNotChangePartition_WithOverride(t *testing.T) {
455*333d2b36SAndroid Build Coastguard Worker	testPrebuiltError(t, `partition is different`, `
456*333d2b36SAndroid Build Coastguard Worker		source {
457*333d2b36SAndroid Build Coastguard Worker			name: "foo",
458*333d2b36SAndroid Build Coastguard Worker			vendor: true,
459*333d2b36SAndroid Build Coastguard Worker		}
460*333d2b36SAndroid Build Coastguard Worker		override_source {
461*333d2b36SAndroid Build Coastguard Worker			name: "bar",
462*333d2b36SAndroid Build Coastguard Worker			base: "foo",
463*333d2b36SAndroid Build Coastguard Worker		}
464*333d2b36SAndroid Build Coastguard Worker		prebuilt {
465*333d2b36SAndroid Build Coastguard Worker			name: "bar",
466*333d2b36SAndroid Build Coastguard Worker			prefer: true,
467*333d2b36SAndroid Build Coastguard Worker			srcs: ["prebuilt_file"],
468*333d2b36SAndroid Build Coastguard Worker		}`)
469*333d2b36SAndroid Build Coastguard Worker}
470*333d2b36SAndroid Build Coastguard Worker
471*333d2b36SAndroid Build Coastguard Workerfunc registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
472*333d2b36SAndroid Build Coastguard Worker	registerTestPrebuiltModules(ctx)
473*333d2b36SAndroid Build Coastguard Worker
474*333d2b36SAndroid Build Coastguard Worker	RegisterPrebuiltMutators(ctx)
475*333d2b36SAndroid Build Coastguard Worker	ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
476*333d2b36SAndroid Build Coastguard Worker}
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithFakePrebuiltModules = FixtureRegisterWithContext(registerTestPrebuiltModules)
479*333d2b36SAndroid Build Coastguard Worker
480*333d2b36SAndroid Build Coastguard Workerfunc registerTestPrebuiltModules(ctx RegistrationContext) {
481*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
482*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("source", newSourceModule)
483*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("override_source", newOverrideSourceModule)
484*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("soong_config_module_type", SoongConfigModuleTypeFactory)
485*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("soong_config_string_variable", SoongConfigStringVariableDummyFactory)
486*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("soong_config_bool_variable", SoongConfigBoolVariableDummyFactory)
487*333d2b36SAndroid Build Coastguard Worker	RegisterApexContributionsBuildComponents(ctx)
488*333d2b36SAndroid Build Coastguard Worker}
489*333d2b36SAndroid Build Coastguard Worker
490*333d2b36SAndroid Build Coastguard Workertype prebuiltModule struct {
491*333d2b36SAndroid Build Coastguard Worker	ModuleBase
492*333d2b36SAndroid Build Coastguard Worker	prebuilt   Prebuilt
493*333d2b36SAndroid Build Coastguard Worker	properties struct {
494*333d2b36SAndroid Build Coastguard Worker		Srcs []string `android:"path,arch_variant"`
495*333d2b36SAndroid Build Coastguard Worker	}
496*333d2b36SAndroid Build Coastguard Worker}
497*333d2b36SAndroid Build Coastguard Worker
498*333d2b36SAndroid Build Coastguard Workerfunc newPrebuiltModule() Module {
499*333d2b36SAndroid Build Coastguard Worker	m := &prebuiltModule{}
500*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
501*333d2b36SAndroid Build Coastguard Worker	InitPrebuiltModule(m, &m.properties.Srcs)
502*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
503*333d2b36SAndroid Build Coastguard Worker	return m
504*333d2b36SAndroid Build Coastguard Worker}
505*333d2b36SAndroid Build Coastguard Worker
506*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltModule) Name() string {
507*333d2b36SAndroid Build Coastguard Worker	return p.prebuilt.Name(p.ModuleBase.Name())
508*333d2b36SAndroid Build Coastguard Worker}
509*333d2b36SAndroid Build Coastguard Worker
510*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
511*333d2b36SAndroid Build Coastguard Worker	if len(p.properties.Srcs) >= 1 {
512*333d2b36SAndroid Build Coastguard Worker		src := p.prebuilt.SingleSourcePath(ctx)
513*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(Paths{src}, "")
514*333d2b36SAndroid Build Coastguard Worker	}
515*333d2b36SAndroid Build Coastguard Worker}
516*333d2b36SAndroid Build Coastguard Worker
517*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltModule) Prebuilt() *Prebuilt {
518*333d2b36SAndroid Build Coastguard Worker	return &p.prebuilt
519*333d2b36SAndroid Build Coastguard Worker}
520*333d2b36SAndroid Build Coastguard Worker
521*333d2b36SAndroid Build Coastguard Workertype sourceModuleProperties struct {
522*333d2b36SAndroid Build Coastguard Worker	Deps []string `android:"path,arch_variant"`
523*333d2b36SAndroid Build Coastguard Worker}
524*333d2b36SAndroid Build Coastguard Worker
525*333d2b36SAndroid Build Coastguard Workertype sourceModule struct {
526*333d2b36SAndroid Build Coastguard Worker	ModuleBase
527*333d2b36SAndroid Build Coastguard Worker	OverridableModuleBase
528*333d2b36SAndroid Build Coastguard Worker
529*333d2b36SAndroid Build Coastguard Worker	properties                                     sourceModuleProperties
530*333d2b36SAndroid Build Coastguard Worker	dependsOnSourceModule, dependsOnPrebuiltModule bool
531*333d2b36SAndroid Build Coastguard Worker	deps                                           Paths
532*333d2b36SAndroid Build Coastguard Worker	src                                            Path
533*333d2b36SAndroid Build Coastguard Worker}
534*333d2b36SAndroid Build Coastguard Worker
535*333d2b36SAndroid Build Coastguard Workerfunc newSourceModule() Module {
536*333d2b36SAndroid Build Coastguard Worker	m := &sourceModule{}
537*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
538*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
539*333d2b36SAndroid Build Coastguard Worker	InitOverridableModule(m, nil)
540*333d2b36SAndroid Build Coastguard Worker	return m
541*333d2b36SAndroid Build Coastguard Worker}
542*333d2b36SAndroid Build Coastguard Worker
543*333d2b36SAndroid Build Coastguard Workerfunc (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
544*333d2b36SAndroid Build Coastguard Worker	// s.properties.Deps are annotated with android:path, so they are
545*333d2b36SAndroid Build Coastguard Worker	// automatically added to the dependency by pathDeps mutator
546*333d2b36SAndroid Build Coastguard Worker}
547*333d2b36SAndroid Build Coastguard Worker
548*333d2b36SAndroid Build Coastguard Workerfunc (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
549*333d2b36SAndroid Build Coastguard Worker	s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
550*333d2b36SAndroid Build Coastguard Worker	s.src = PathForModuleSrc(ctx, "source_file")
551*333d2b36SAndroid Build Coastguard Worker}
552*333d2b36SAndroid Build Coastguard Worker
553*333d2b36SAndroid Build Coastguard Workerfunc (s *sourceModule) Srcs() Paths {
554*333d2b36SAndroid Build Coastguard Worker	return Paths{s.src}
555*333d2b36SAndroid Build Coastguard Worker}
556*333d2b36SAndroid Build Coastguard Worker
557*333d2b36SAndroid Build Coastguard Workertype overrideSourceModule struct {
558*333d2b36SAndroid Build Coastguard Worker	ModuleBase
559*333d2b36SAndroid Build Coastguard Worker	OverrideModuleBase
560*333d2b36SAndroid Build Coastguard Worker}
561*333d2b36SAndroid Build Coastguard Worker
562*333d2b36SAndroid Build Coastguard Workerfunc (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
563*333d2b36SAndroid Build Coastguard Worker}
564*333d2b36SAndroid Build Coastguard Worker
565*333d2b36SAndroid Build Coastguard Workerfunc newOverrideSourceModule() Module {
566*333d2b36SAndroid Build Coastguard Worker	m := &overrideSourceModule{}
567*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&sourceModuleProperties{})
568*333d2b36SAndroid Build Coastguard Worker
569*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
570*333d2b36SAndroid Build Coastguard Worker	InitOverrideModule(m)
571*333d2b36SAndroid Build Coastguard Worker	return m
572*333d2b36SAndroid Build Coastguard Worker}
573*333d2b36SAndroid Build Coastguard Worker
574*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltErrorCannotListBothSourceAndPrebuiltInContributions(t *testing.T) {
575*333d2b36SAndroid Build Coastguard Worker	selectMainlineModuleContritbutions := GroupFixturePreparers(
576*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_apex_contributions"),
577*333d2b36SAndroid Build Coastguard Worker	)
578*333d2b36SAndroid Build Coastguard Worker	testPrebuiltErrorWithFixture(t, `Found duplicate variations of the same module in apex_contributions: foo and prebuilt_foo. Please remove one of these`, `
579*333d2b36SAndroid Build Coastguard Worker		source {
580*333d2b36SAndroid Build Coastguard Worker			name: "foo",
581*333d2b36SAndroid Build Coastguard Worker		}
582*333d2b36SAndroid Build Coastguard Worker		prebuilt {
583*333d2b36SAndroid Build Coastguard Worker			name: "foo",
584*333d2b36SAndroid Build Coastguard Worker			srcs: ["prebuilt_file"],
585*333d2b36SAndroid Build Coastguard Worker		}
586*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
587*333d2b36SAndroid Build Coastguard Worker			name: "my_apex_contributions",
588*333d2b36SAndroid Build Coastguard Worker			api_domain: "my_mainline_module",
589*333d2b36SAndroid Build Coastguard Worker			contents: [
590*333d2b36SAndroid Build Coastguard Worker			  "foo",
591*333d2b36SAndroid Build Coastguard Worker			  "prebuilt_foo",
592*333d2b36SAndroid Build Coastguard Worker			],
593*333d2b36SAndroid Build Coastguard Worker		}
594*333d2b36SAndroid Build Coastguard Worker		all_apex_contributions {
595*333d2b36SAndroid Build Coastguard Worker			name: "all_apex_contributions",
596*333d2b36SAndroid Build Coastguard Worker		}
597*333d2b36SAndroid Build Coastguard Worker		`, selectMainlineModuleContritbutions)
598*333d2b36SAndroid Build Coastguard Worker}
599