xref: /aosp_15_r20/external/wayland-protocols/wayland_protocol_codegen_test.go (revision 6c119a463dd5c45dd05bbe67429293292dde15ee)
1*6c119a46SAndroid Build Coastguard Worker// Copyright 2023 The Android Open Source Project
2*6c119a46SAndroid Build Coastguard Worker//
3*6c119a46SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6c119a46SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6c119a46SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6c119a46SAndroid Build Coastguard Worker//
7*6c119a46SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*6c119a46SAndroid Build Coastguard Worker//
9*6c119a46SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6c119a46SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6c119a46SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6c119a46SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6c119a46SAndroid Build Coastguard Worker// limitations under the License.
14*6c119a46SAndroid Build Coastguard Worker
15*6c119a46SAndroid Build Coastguard Workerpackage soong_wayland_protocol_codegen
16*6c119a46SAndroid Build Coastguard Worker
17*6c119a46SAndroid Build Coastguard Workerimport (
18*6c119a46SAndroid Build Coastguard Worker	"os"
19*6c119a46SAndroid Build Coastguard Worker	"regexp"
20*6c119a46SAndroid Build Coastguard Worker	"testing"
21*6c119a46SAndroid Build Coastguard Worker
22*6c119a46SAndroid Build Coastguard Worker	"android/soong/android"
23*6c119a46SAndroid Build Coastguard Worker)
24*6c119a46SAndroid Build Coastguard Worker
25*6c119a46SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) {
26*6c119a46SAndroid Build Coastguard Worker	os.Exit(m.Run())
27*6c119a46SAndroid Build Coastguard Worker}
28*6c119a46SAndroid Build Coastguard Worker
29*6c119a46SAndroid Build Coastguard Workervar prepareForCodeGenTest = android.GroupFixturePreparers(
30*6c119a46SAndroid Build Coastguard Worker	android.PrepareForTestWithArchMutator,
31*6c119a46SAndroid Build Coastguard Worker	android.PrepareForTestWithDefaults,
32*6c119a46SAndroid Build Coastguard Worker	android.PrepareForTestWithFilegroup,
33*6c119a46SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
34*6c119a46SAndroid Build Coastguard Worker		android.FixtureRegisterWithContext(registerCodeGenBuildComponents),
35*6c119a46SAndroid Build Coastguard Worker	),
36*6c119a46SAndroid Build Coastguard Worker	android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
37*6c119a46SAndroid Build Coastguard Worker		android.RegisterPrebuiltMutators(ctx)
38*6c119a46SAndroid Build Coastguard Worker		ctx.RegisterModuleType("fake_android_host_tool", fakeAndroidHostToolFactory)
39*6c119a46SAndroid Build Coastguard Worker	}),
40*6c119a46SAndroid Build Coastguard Worker	android.FixtureMergeMockFs(android.MockFS{
41*6c119a46SAndroid Build Coastguard Worker		"android_host_tool": nil,
42*6c119a46SAndroid Build Coastguard Worker		"tool_src_file":     nil,
43*6c119a46SAndroid Build Coastguard Worker		"tool_src_file_1":   nil,
44*6c119a46SAndroid Build Coastguard Worker		"tool_src_file_2":   nil,
45*6c119a46SAndroid Build Coastguard Worker		"src_file":          nil,
46*6c119a46SAndroid Build Coastguard Worker		"src_file_1":        nil,
47*6c119a46SAndroid Build Coastguard Worker		"src_file_2":        nil,
48*6c119a46SAndroid Build Coastguard Worker	}),
49*6c119a46SAndroid Build Coastguard Worker)
50*6c119a46SAndroid Build Coastguard Worker
51*6c119a46SAndroid Build Coastguard Workerfunc testCodeGenBp() string {
52*6c119a46SAndroid Build Coastguard Worker	return `
53*6c119a46SAndroid Build Coastguard Worker		fake_android_host_tool {
54*6c119a46SAndroid Build Coastguard Worker			name: "host_tool",
55*6c119a46SAndroid Build Coastguard Worker		}
56*6c119a46SAndroid Build Coastguard Worker
57*6c119a46SAndroid Build Coastguard Worker		filegroup {
58*6c119a46SAndroid Build Coastguard Worker			name: "tool_single_source_file_filegroup",
59*6c119a46SAndroid Build Coastguard Worker			srcs: [
60*6c119a46SAndroid Build Coastguard Worker				"tool_src_file",
61*6c119a46SAndroid Build Coastguard Worker			],
62*6c119a46SAndroid Build Coastguard Worker		}
63*6c119a46SAndroid Build Coastguard Worker
64*6c119a46SAndroid Build Coastguard Worker		filegroup {
65*6c119a46SAndroid Build Coastguard Worker			name: "tool_multi_source_files_filegroup",
66*6c119a46SAndroid Build Coastguard Worker			srcs: [
67*6c119a46SAndroid Build Coastguard Worker				"tool_src_file_1",
68*6c119a46SAndroid Build Coastguard Worker				"tool_src_file_2",
69*6c119a46SAndroid Build Coastguard Worker			],
70*6c119a46SAndroid Build Coastguard Worker		}
71*6c119a46SAndroid Build Coastguard Worker
72*6c119a46SAndroid Build Coastguard Worker		filegroup {
73*6c119a46SAndroid Build Coastguard Worker			name: "single_source_filegroup",
74*6c119a46SAndroid Build Coastguard Worker			srcs: [
75*6c119a46SAndroid Build Coastguard Worker				"src_file",
76*6c119a46SAndroid Build Coastguard Worker			],
77*6c119a46SAndroid Build Coastguard Worker		}
78*6c119a46SAndroid Build Coastguard Worker
79*6c119a46SAndroid Build Coastguard Worker		filegroup {
80*6c119a46SAndroid Build Coastguard Worker			name: "multi_source_filegroup",
81*6c119a46SAndroid Build Coastguard Worker			srcs: [
82*6c119a46SAndroid Build Coastguard Worker				"src_file_1",
83*6c119a46SAndroid Build Coastguard Worker				"src_file_2",
84*6c119a46SAndroid Build Coastguard Worker			],
85*6c119a46SAndroid Build Coastguard Worker		}
86*6c119a46SAndroid Build Coastguard Worker
87*6c119a46SAndroid Build Coastguard Worker		filegroup {
88*6c119a46SAndroid Build Coastguard Worker			name: "empty_filegroup",
89*6c119a46SAndroid Build Coastguard Worker		}
90*6c119a46SAndroid Build Coastguard Worker	`
91*6c119a46SAndroid Build Coastguard Worker}
92*6c119a46SAndroid Build Coastguard Worker
93*6c119a46SAndroid Build Coastguard Workerfunc TestWaylandCodeGen(t *testing.T) {
94*6c119a46SAndroid Build Coastguard Worker	testcases := []struct {
95*6c119a46SAndroid Build Coastguard Worker		name string
96*6c119a46SAndroid Build Coastguard Worker		prop string
97*6c119a46SAndroid Build Coastguard Worker
98*6c119a46SAndroid Build Coastguard Worker		err   string
99*6c119a46SAndroid Build Coastguard Worker		cmds  []string
100*6c119a46SAndroid Build Coastguard Worker		files []string
101*6c119a46SAndroid Build Coastguard Worker	}{
102*6c119a46SAndroid Build Coastguard Worker		{
103*6c119a46SAndroid Build Coastguard Worker			name: "single_source_with_host_tool",
104*6c119a46SAndroid Build Coastguard Worker			prop: `
105*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
106*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file"],
107*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
108*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
109*6c119a46SAndroid Build Coastguard Worker			`,
110*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
111*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'",
112*6c119a46SAndroid Build Coastguard Worker			},
113*6c119a46SAndroid Build Coastguard Worker			files: []string{
114*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix",
115*6c119a46SAndroid Build Coastguard Worker			},
116*6c119a46SAndroid Build Coastguard Worker		},
117*6c119a46SAndroid Build Coastguard Worker		{
118*6c119a46SAndroid Build Coastguard Worker			name: "multi_source_with_host_tool",
119*6c119a46SAndroid Build Coastguard Worker			prop: `
120*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
121*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file_1", "src_file_2"],
122*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
123*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
124*6c119a46SAndroid Build Coastguard Worker			`,
125*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
126*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file_1 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_1_suffix' && bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file_2 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_2_suffix'",
127*6c119a46SAndroid Build Coastguard Worker			},
128*6c119a46SAndroid Build Coastguard Worker			files: []string{
129*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_1_suffix",
130*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_2_suffix",
131*6c119a46SAndroid Build Coastguard Worker			},
132*6c119a46SAndroid Build Coastguard Worker		},
133*6c119a46SAndroid Build Coastguard Worker		{
134*6c119a46SAndroid Build Coastguard Worker			name: "single_source_filegroup_with_host_tool",
135*6c119a46SAndroid Build Coastguard Worker			prop: `
136*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
137*6c119a46SAndroid Build Coastguard Worker				srcs: [":single_source_filegroup"],
138*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
139*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
140*6c119a46SAndroid Build Coastguard Worker			`,
141*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
142*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'",
143*6c119a46SAndroid Build Coastguard Worker			},
144*6c119a46SAndroid Build Coastguard Worker			files: []string{
145*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix",
146*6c119a46SAndroid Build Coastguard Worker			},
147*6c119a46SAndroid Build Coastguard Worker		},
148*6c119a46SAndroid Build Coastguard Worker		{
149*6c119a46SAndroid Build Coastguard Worker			name: "multi_source_filegroup_with_host_tool",
150*6c119a46SAndroid Build Coastguard Worker			prop: `
151*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
152*6c119a46SAndroid Build Coastguard Worker				srcs: [":multi_source_filegroup"],
153*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
154*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
155*6c119a46SAndroid Build Coastguard Worker			`,
156*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
157*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file_1 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_1_suffix' && bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file_2 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_2_suffix'",
158*6c119a46SAndroid Build Coastguard Worker			},
159*6c119a46SAndroid Build Coastguard Worker			files: []string{
160*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_1_suffix",
161*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_2_suffix",
162*6c119a46SAndroid Build Coastguard Worker			},
163*6c119a46SAndroid Build Coastguard Worker		},
164*6c119a46SAndroid Build Coastguard Worker		{
165*6c119a46SAndroid Build Coastguard Worker			name: "single_source_with_single_tool_file",
166*6c119a46SAndroid Build Coastguard Worker			prop: `
167*6c119a46SAndroid Build Coastguard Worker				tool_files: ["tool_src_file"],
168*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file"],
169*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
170*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location tool_src_file) gen < $(in) > $(out)",
171*6c119a46SAndroid Build Coastguard Worker			`,
172*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
173*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'",
174*6c119a46SAndroid Build Coastguard Worker			},
175*6c119a46SAndroid Build Coastguard Worker			files: []string{
176*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix",
177*6c119a46SAndroid Build Coastguard Worker			},
178*6c119a46SAndroid Build Coastguard Worker		},
179*6c119a46SAndroid Build Coastguard Worker		{
180*6c119a46SAndroid Build Coastguard Worker			name: "multi_source_with_single_tool_file",
181*6c119a46SAndroid Build Coastguard Worker			prop: `
182*6c119a46SAndroid Build Coastguard Worker				tool_files: ["tool_src_file"],
183*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file_1", "src_file_2"],
184*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
185*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location tool_src_file) gen < $(in) > $(out)",
186*6c119a46SAndroid Build Coastguard Worker			`,
187*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
188*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file_1 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_1_suffix' && bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file_2 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_2_suffix'",
189*6c119a46SAndroid Build Coastguard Worker			},
190*6c119a46SAndroid Build Coastguard Worker			files: []string{
191*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_1_suffix",
192*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_2_suffix",
193*6c119a46SAndroid Build Coastguard Worker			},
194*6c119a46SAndroid Build Coastguard Worker		},
195*6c119a46SAndroid Build Coastguard Worker		{
196*6c119a46SAndroid Build Coastguard Worker			name: "single_source_filegroup_with_single_tool_file",
197*6c119a46SAndroid Build Coastguard Worker			prop: `
198*6c119a46SAndroid Build Coastguard Worker				tool_files: ["tool_src_file"],
199*6c119a46SAndroid Build Coastguard Worker				srcs: [":single_source_filegroup"],
200*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
201*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location tool_src_file) gen < $(in) > $(out)",
202*6c119a46SAndroid Build Coastguard Worker			`,
203*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
204*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'",
205*6c119a46SAndroid Build Coastguard Worker			},
206*6c119a46SAndroid Build Coastguard Worker			files: []string{
207*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix",
208*6c119a46SAndroid Build Coastguard Worker			},
209*6c119a46SAndroid Build Coastguard Worker		},
210*6c119a46SAndroid Build Coastguard Worker		{
211*6c119a46SAndroid Build Coastguard Worker			name: "multi_source_filegroup_with_single_tool_file",
212*6c119a46SAndroid Build Coastguard Worker			prop: `
213*6c119a46SAndroid Build Coastguard Worker				tool_files: ["tool_src_file"],
214*6c119a46SAndroid Build Coastguard Worker				srcs: [":multi_source_filegroup"],
215*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
216*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location tool_src_file) gen < $(in) > $(out)",
217*6c119a46SAndroid Build Coastguard Worker			`,
218*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
219*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file_1 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_1_suffix' && bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file_2 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_2_suffix'",
220*6c119a46SAndroid Build Coastguard Worker			},
221*6c119a46SAndroid Build Coastguard Worker			files: []string{
222*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_1_suffix",
223*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_2_suffix",
224*6c119a46SAndroid Build Coastguard Worker			},
225*6c119a46SAndroid Build Coastguard Worker		},
226*6c119a46SAndroid Build Coastguard Worker		{
227*6c119a46SAndroid Build Coastguard Worker			name: "multiple_tool_files",
228*6c119a46SAndroid Build Coastguard Worker			prop: `
229*6c119a46SAndroid Build Coastguard Worker				tool_files: ["tool_src_file_1", "tool_src_file_2"],
230*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file"],
231*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
232*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location tool_src_file_1) $(location tool_src_file_2) gen < $(in) > $(out)",
233*6c119a46SAndroid Build Coastguard Worker			`,
234*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
235*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file_1 __SBOX_SANDBOX_DIR__/tools/src/tool_src_file_2 gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'",
236*6c119a46SAndroid Build Coastguard Worker			},
237*6c119a46SAndroid Build Coastguard Worker			files: []string{
238*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix",
239*6c119a46SAndroid Build Coastguard Worker			},
240*6c119a46SAndroid Build Coastguard Worker		},
241*6c119a46SAndroid Build Coastguard Worker		{
242*6c119a46SAndroid Build Coastguard Worker			name: "output_template_explicit_base_only",
243*6c119a46SAndroid Build Coastguard Worker			prop: `
244*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
245*6c119a46SAndroid Build Coastguard Worker				srcs: ["txt/a/file.txt"],
246*6c119a46SAndroid Build Coastguard Worker				output: "$(in:base)",
247*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
248*6c119a46SAndroid Build Coastguard Worker			`,
249*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
250*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < txt/a/file.txt > __SBOX_SANDBOX_DIR__/out/file'",
251*6c119a46SAndroid Build Coastguard Worker			},
252*6c119a46SAndroid Build Coastguard Worker			files: []string{
253*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/file",
254*6c119a46SAndroid Build Coastguard Worker			},
255*6c119a46SAndroid Build Coastguard Worker		},
256*6c119a46SAndroid Build Coastguard Worker		{
257*6c119a46SAndroid Build Coastguard Worker			name: "output_template_explicit_base_and_ext",
258*6c119a46SAndroid Build Coastguard Worker			prop: `
259*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
260*6c119a46SAndroid Build Coastguard Worker				srcs: ["txt/a/file.txt"],
261*6c119a46SAndroid Build Coastguard Worker				output: "$(in:base.ext)",
262*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
263*6c119a46SAndroid Build Coastguard Worker			`,
264*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
265*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < txt/a/file.txt > __SBOX_SANDBOX_DIR__/out/file.txt'",
266*6c119a46SAndroid Build Coastguard Worker			},
267*6c119a46SAndroid Build Coastguard Worker			files: []string{
268*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/file.txt",
269*6c119a46SAndroid Build Coastguard Worker			},
270*6c119a46SAndroid Build Coastguard Worker		},
271*6c119a46SAndroid Build Coastguard Worker		{
272*6c119a46SAndroid Build Coastguard Worker			name: "output_template_explicit_path_and_base",
273*6c119a46SAndroid Build Coastguard Worker			prop: `
274*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
275*6c119a46SAndroid Build Coastguard Worker				srcs: ["txt/a/file.txt"],
276*6c119a46SAndroid Build Coastguard Worker				output: "$(in:path/base)",
277*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
278*6c119a46SAndroid Build Coastguard Worker			`,
279*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
280*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < txt/a/file.txt > __SBOX_SANDBOX_DIR__/out/txt/a/file'",
281*6c119a46SAndroid Build Coastguard Worker			},
282*6c119a46SAndroid Build Coastguard Worker			files: []string{
283*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/txt/a/file",
284*6c119a46SAndroid Build Coastguard Worker			},
285*6c119a46SAndroid Build Coastguard Worker		},
286*6c119a46SAndroid Build Coastguard Worker		{
287*6c119a46SAndroid Build Coastguard Worker			name: "output_template_explicit_path_and_base_and_ext",
288*6c119a46SAndroid Build Coastguard Worker			prop: `
289*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
290*6c119a46SAndroid Build Coastguard Worker				srcs: ["txt/a/file.txt"],
291*6c119a46SAndroid Build Coastguard Worker				output: "$(in:path/base.ext)",
292*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
293*6c119a46SAndroid Build Coastguard Worker			`,
294*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
295*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < txt/a/file.txt > __SBOX_SANDBOX_DIR__/out/txt/a/file.txt'",
296*6c119a46SAndroid Build Coastguard Worker			},
297*6c119a46SAndroid Build Coastguard Worker			files: []string{
298*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/txt/a/file.txt",
299*6c119a46SAndroid Build Coastguard Worker			},
300*6c119a46SAndroid Build Coastguard Worker		},
301*6c119a46SAndroid Build Coastguard Worker		{
302*6c119a46SAndroid Build Coastguard Worker			name: "single_source_file_does_not_need_distinct_outputs",
303*6c119a46SAndroid Build Coastguard Worker			prop: `
304*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
305*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file"],
306*6c119a46SAndroid Build Coastguard Worker				output: "output",
307*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
308*6c119a46SAndroid Build Coastguard Worker			`,
309*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
310*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file > __SBOX_SANDBOX_DIR__/out/output'",
311*6c119a46SAndroid Build Coastguard Worker			},
312*6c119a46SAndroid Build Coastguard Worker			files: []string{
313*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/output",
314*6c119a46SAndroid Build Coastguard Worker			},
315*6c119a46SAndroid Build Coastguard Worker		},
316*6c119a46SAndroid Build Coastguard Worker		{
317*6c119a46SAndroid Build Coastguard Worker			name: "legacy_prefix_suffix",
318*6c119a46SAndroid Build Coastguard Worker			prop: `
319*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
320*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file"],
321*6c119a46SAndroid Build Coastguard Worker				prefix: "legacy_prefix_",
322*6c119a46SAndroid Build Coastguard Worker				suffix: "_legacy_suffix",
323*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
324*6c119a46SAndroid Build Coastguard Worker			`,
325*6c119a46SAndroid Build Coastguard Worker			cmds: []string{
326*6c119a46SAndroid Build Coastguard Worker				"bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file > __SBOX_SANDBOX_DIR__/out/legacy_prefix_src_file_legacy_suffix'",
327*6c119a46SAndroid Build Coastguard Worker			},
328*6c119a46SAndroid Build Coastguard Worker			files: []string{
329*6c119a46SAndroid Build Coastguard Worker				"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/legacy_prefix_src_file_legacy_suffix",
330*6c119a46SAndroid Build Coastguard Worker			},
331*6c119a46SAndroid Build Coastguard Worker		},
332*6c119a46SAndroid Build Coastguard Worker		{
333*6c119a46SAndroid Build Coastguard Worker			name: "error_if_no_sources",
334*6c119a46SAndroid Build Coastguard Worker			prop: `
335*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
336*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
337*6c119a46SAndroid Build Coastguard Worker			`,
338*6c119a46SAndroid Build Coastguard Worker			err: "must have at least one source file",
339*6c119a46SAndroid Build Coastguard Worker		},
340*6c119a46SAndroid Build Coastguard Worker		{
341*6c119a46SAndroid Build Coastguard Worker			name: "error_if_no_filegroup_sources",
342*6c119a46SAndroid Build Coastguard Worker			prop: `
343*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
344*6c119a46SAndroid Build Coastguard Worker				srcs: [":empty_filegroup"],
345*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location host_tool) gen < $(in) > $(out)",
346*6c119a46SAndroid Build Coastguard Worker			`,
347*6c119a46SAndroid Build Coastguard Worker			err: "must have at least one source file",
348*6c119a46SAndroid Build Coastguard Worker		},
349*6c119a46SAndroid Build Coastguard Worker		{
350*6c119a46SAndroid Build Coastguard Worker			name: "error_if_in_outputs_are_not_distinct",
351*6c119a46SAndroid Build Coastguard Worker			prop: `
352*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
353*6c119a46SAndroid Build Coastguard Worker				tool_files: ["tool_src_file"],
354*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file_1", "src_file_2"],
355*6c119a46SAndroid Build Coastguard Worker				output: "not_unique",
356*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location)"
357*6c119a46SAndroid Build Coastguard Worker			`,
358*6c119a46SAndroid Build Coastguard Worker			err: "Android.bp:39:2: module \"codegen\": generation conflict: both 'src_file_1' and 'src_file_2' generate 'not_unique'",
359*6c119a46SAndroid Build Coastguard Worker		},
360*6c119a46SAndroid Build Coastguard Worker		{
361*6c119a46SAndroid Build Coastguard Worker			name: "error_if_output_expansion_fails",
362*6c119a46SAndroid Build Coastguard Worker			prop: `
363*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
364*6c119a46SAndroid Build Coastguard Worker				tool_files: ["tool_src_file"],
365*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file"],
366*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(bad)_suffix",
367*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location)"
368*6c119a46SAndroid Build Coastguard Worker			`,
369*6c119a46SAndroid Build Coastguard Worker			err: "Android.bp:45:11: module \"codegen\": output: unknown variable '$(bad)'",
370*6c119a46SAndroid Build Coastguard Worker		},
371*6c119a46SAndroid Build Coastguard Worker		{
372*6c119a46SAndroid Build Coastguard Worker			name: "error_if_cmd_expansion_fails",
373*6c119a46SAndroid Build Coastguard Worker			prop: `
374*6c119a46SAndroid Build Coastguard Worker				tools: ["host_tool"],
375*6c119a46SAndroid Build Coastguard Worker				tool_files: ["tool_src_file"],
376*6c119a46SAndroid Build Coastguard Worker				srcs: ["src_file"],
377*6c119a46SAndroid Build Coastguard Worker				output: "prefix_$(in)_suffix",
378*6c119a46SAndroid Build Coastguard Worker				cmd: "$(location bad_name)"
379*6c119a46SAndroid Build Coastguard Worker			`,
380*6c119a46SAndroid Build Coastguard Worker			err: "Android.bp:46:8: module \"codegen\": cmd: unknown location label \"bad_name\"",
381*6c119a46SAndroid Build Coastguard Worker		},
382*6c119a46SAndroid Build Coastguard Worker	}
383*6c119a46SAndroid Build Coastguard Worker
384*6c119a46SAndroid Build Coastguard Worker	for _, test := range testcases {
385*6c119a46SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
386*6c119a46SAndroid Build Coastguard Worker			bp := "wayland_protocol_codegen {\n"
387*6c119a46SAndroid Build Coastguard Worker			bp += `name: "codegen",` + "\n"
388*6c119a46SAndroid Build Coastguard Worker			bp += test.prop
389*6c119a46SAndroid Build Coastguard Worker			bp += "}\n"
390*6c119a46SAndroid Build Coastguard Worker
391*6c119a46SAndroid Build Coastguard Worker			var expectedErrors []string
392*6c119a46SAndroid Build Coastguard Worker			if test.err != "" {
393*6c119a46SAndroid Build Coastguard Worker				expectedErrors = append(expectedErrors, regexp.QuoteMeta(test.err))
394*6c119a46SAndroid Build Coastguard Worker			}
395*6c119a46SAndroid Build Coastguard Worker
396*6c119a46SAndroid Build Coastguard Worker			result := prepareForCodeGenTest.
397*6c119a46SAndroid Build Coastguard Worker				ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(expectedErrors)).
398*6c119a46SAndroid Build Coastguard Worker				RunTestWithBp(t, testCodeGenBp()+bp)
399*6c119a46SAndroid Build Coastguard Worker
400*6c119a46SAndroid Build Coastguard Worker			if expectedErrors != nil {
401*6c119a46SAndroid Build Coastguard Worker				return
402*6c119a46SAndroid Build Coastguard Worker			}
403*6c119a46SAndroid Build Coastguard Worker
404*6c119a46SAndroid Build Coastguard Worker			gen := result.Module("codegen", "").(*Module)
405*6c119a46SAndroid Build Coastguard Worker			android.AssertDeepEquals(t, "cmd", test.cmds, gen.rawCommands)
406*6c119a46SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "files", test.files, gen.outputFiles)
407*6c119a46SAndroid Build Coastguard Worker		})
408*6c119a46SAndroid Build Coastguard Worker	}
409*6c119a46SAndroid Build Coastguard Worker}
410*6c119a46SAndroid Build Coastguard Worker
411*6c119a46SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) {
412*6c119a46SAndroid Build Coastguard Worker	bp := `
413*6c119a46SAndroid Build Coastguard Worker		wayland_protocol_codegen_defaults {
414*6c119a46SAndroid Build Coastguard Worker			name: "gen_defaults1",
415*6c119a46SAndroid Build Coastguard Worker			cmd: "cp $(in) $(out)",
416*6c119a46SAndroid Build Coastguard Worker			output: "$(in).h",
417*6c119a46SAndroid Build Coastguard Worker		}
418*6c119a46SAndroid Build Coastguard Worker
419*6c119a46SAndroid Build Coastguard Worker		wayland_protocol_codegen_defaults {
420*6c119a46SAndroid Build Coastguard Worker			name: "gen_defaults2",
421*6c119a46SAndroid Build Coastguard Worker			srcs: ["in1"],
422*6c119a46SAndroid Build Coastguard Worker		}
423*6c119a46SAndroid Build Coastguard Worker
424*6c119a46SAndroid Build Coastguard Worker		wayland_protocol_codegen {
425*6c119a46SAndroid Build Coastguard Worker			name: "codegen",
426*6c119a46SAndroid Build Coastguard Worker			defaults: ["gen_defaults1", "gen_defaults2"],
427*6c119a46SAndroid Build Coastguard Worker		}
428*6c119a46SAndroid Build Coastguard Worker		`
429*6c119a46SAndroid Build Coastguard Worker
430*6c119a46SAndroid Build Coastguard Worker	result := prepareForCodeGenTest.RunTestWithBp(t, testCodeGenBp()+bp)
431*6c119a46SAndroid Build Coastguard Worker
432*6c119a46SAndroid Build Coastguard Worker	gen := result.Module("codegen", "").(*Module)
433*6c119a46SAndroid Build Coastguard Worker
434*6c119a46SAndroid Build Coastguard Worker	expectedCmd := "bash -c cp in1 __SBOX_SANDBOX_DIR__/out/in1.h"
435*6c119a46SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "cmd", expectedCmd, gen.rawCommands[0])
436*6c119a46SAndroid Build Coastguard Worker
437*6c119a46SAndroid Build Coastguard Worker	expectedSrcs := []string{"in1"}
438*6c119a46SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "srcs", expectedSrcs, gen.properties.Srcs)
439*6c119a46SAndroid Build Coastguard Worker
440*6c119a46SAndroid Build Coastguard Worker	expectedFiles := []string{"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/in1.h"}
441*6c119a46SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "files", expectedFiles, gen.outputFiles)
442*6c119a46SAndroid Build Coastguard Worker}
443*6c119a46SAndroid Build Coastguard Worker
444*6c119a46SAndroid Build Coastguard Workertype fakeAndroidHostTool struct {
445*6c119a46SAndroid Build Coastguard Worker	android.ModuleBase
446*6c119a46SAndroid Build Coastguard Worker	outputFile android.Path
447*6c119a46SAndroid Build Coastguard Worker}
448*6c119a46SAndroid Build Coastguard Worker
449*6c119a46SAndroid Build Coastguard Workerfunc fakeAndroidHostToolFactory() android.Module {
450*6c119a46SAndroid Build Coastguard Worker	module := &fakeAndroidHostTool{}
451*6c119a46SAndroid Build Coastguard Worker	android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst)
452*6c119a46SAndroid Build Coastguard Worker	return module
453*6c119a46SAndroid Build Coastguard Worker}
454*6c119a46SAndroid Build Coastguard Worker
455*6c119a46SAndroid Build Coastguard Workerfunc (t *fakeAndroidHostTool) GenerateAndroidBuildActions(ctx android.ModuleContext) {
456*6c119a46SAndroid Build Coastguard Worker	t.outputFile = android.PathForTesting("out", ctx.ModuleName())
457*6c119a46SAndroid Build Coastguard Worker}
458*6c119a46SAndroid Build Coastguard Worker
459*6c119a46SAndroid Build Coastguard Workerfunc (t *fakeAndroidHostTool) HostToolPath() android.OptionalPath {
460*6c119a46SAndroid Build Coastguard Worker	return android.OptionalPathForPath(t.outputFile)
461*6c119a46SAndroid Build Coastguard Worker}
462*6c119a46SAndroid Build Coastguard Worker
463*6c119a46SAndroid Build Coastguard Workervar _ android.HostToolProvider = (*fakeAndroidHostTool)(nil)
464