blob: 349088136c40ac9b8d0cb65986aeb1541824b04c [file] [log] [blame]
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -04001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package bp2build
16
17import (
Yu Liud6201012022-10-17 12:29:15 -070018 "fmt"
19 "testing"
20
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040021 "android/soong/android"
Sam Delmericocd1b80f2022-01-11 21:55:46 +000022 "android/soong/cc"
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040023 "android/soong/genrule"
Sam Delmericocd1b80f2022-01-11 21:55:46 +000024 "android/soong/java"
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040025)
26
Liz Kammer78cfdaa2021-11-08 12:56:31 -050027func registerGenruleModuleTypes(ctx android.RegistrationContext) {
28 ctx.RegisterModuleType("genrule_defaults", func() android.Module { return genrule.DefaultsFactory() })
29}
30
Sam Delmerico3177a6e2022-06-21 19:28:33 +000031func runGenruleTestCase(t *testing.T, tc Bp2buildTestCase) {
Liz Kammer78cfdaa2021-11-08 12:56:31 -050032 t.Helper()
Sam Delmerico3177a6e2022-06-21 19:28:33 +000033 (&tc).ModuleTypeUnderTest = "genrule"
34 (&tc).ModuleTypeUnderTestFactory = genrule.GenRuleFactory
35 RunBp2BuildTestCase(t, registerGenruleModuleTypes, tc)
Liz Kammer78cfdaa2021-11-08 12:56:31 -050036}
37
Sam Delmericocd1b80f2022-01-11 21:55:46 +000038func otherGenruleBp(genruleTarget string) map[string]string {
39 return map[string]string{
40 "other/Android.bp": fmt.Sprintf(`%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040041 name: "foo.tool",
42 out: ["foo_tool.out"],
43 srcs: ["foo_tool.in"],
44 cmd: "cp $(in) $(out)",
45}
Sam Delmericocd1b80f2022-01-11 21:55:46 +000046%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040047 name: "other.tool",
48 out: ["other_tool.out"],
49 srcs: ["other_tool.in"],
50 cmd: "cp $(in) $(out)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000051}`, genruleTarget, genruleTarget),
52 }
53}
54
55func TestGenruleCliVariableReplacement(t *testing.T) {
56 testCases := []struct {
57 moduleType string
58 factory android.ModuleFactory
59 genDir string
Liz Kammerdfeb1202022-05-13 17:20:20 -040060 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +000061 }{
62 {
63 moduleType: "genrule",
64 factory: genrule.GenRuleFactory,
Vinh Tranf19b6582022-09-21 17:01:49 -040065 genDir: "$(RULEDIR)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000066 },
67 {
68 moduleType: "cc_genrule",
69 factory: cc.GenRuleFactory,
70 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040071 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000072 },
73 {
74 moduleType: "java_genrule",
75 factory: java.GenRuleFactory,
76 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040077 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000078 },
79 {
80 moduleType: "java_genrule_host",
81 factory: java.GenRuleFactoryHost,
82 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040083 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000084 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040085 }
86
Sam Delmericocd1b80f2022-01-11 21:55:46 +000087 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040088 name: "foo.tool",
89 out: ["foo_tool.out"],
90 srcs: ["foo_tool.in"],
91 cmd: "cp $(in) $(out)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000092 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040093}
94
Sam Delmericocd1b80f2022-01-11 21:55:46 +000095%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040096 name: "foo",
97 out: ["foo.out"],
98 srcs: ["foo.in"],
99 tools: [":foo.tool"],
100 cmd: "$(location :foo.tool) --genDir=$(genDir) arg $(in) $(out)",
101 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000102}`
103
104 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000105 moduleAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000106 "cmd": fmt.Sprintf(`"$(location :foo.tool) --genDir=%s arg $(SRCS) $(OUTS)"`, tc.genDir),
107 "outs": `["foo.out"]`,
108 "srcs": `["foo.in"]`,
109 "tools": `[":foo.tool"]`,
110 }
111
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000112 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400113 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000114 }
115
116 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000117 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
118 Bp2buildTestCase{
119 ModuleTypeUnderTest: tc.moduleType,
120 ModuleTypeUnderTestFactory: tc.factory,
121 Blueprint: fmt.Sprintf(bp, tc.moduleType, tc.moduleType),
122 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000123 })
124 })
125 }
126}
127
128func TestGenruleLocationsLabel(t *testing.T) {
129 testCases := []struct {
130 moduleType string
131 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400132 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000133 }{
134 {
135 moduleType: "genrule",
136 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400137 },
138 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000139 moduleType: "cc_genrule",
140 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400141 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000142 },
143 {
144 moduleType: "java_genrule",
145 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400146 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000147 },
148 {
149 moduleType: "java_genrule_host",
150 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400151 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000152 },
153 }
154
155 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400156 name: "foo.tools",
157 out: ["foo_tool.out", "foo_tool2.out"],
158 srcs: ["foo_tool.in"],
159 cmd: "cp $(in) $(out)",
160 bazel_module: { bp2build_available: true },
161}
162
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000163%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400164 name: "foo",
165 out: ["foo.out"],
166 srcs: ["foo.in"],
167 tools: [":foo.tools"],
168 cmd: "$(locations :foo.tools) -s $(out) $(in)",
169 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000170}`
171
Sam Delmerico75539d62022-01-31 14:37:29 +0000172 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000173 fooAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000174 "cmd": `"$(locations :foo.tools) -s $(OUTS) $(SRCS)"`,
175 "outs": `["foo.out"]`,
176 "srcs": `["foo.in"]`,
177 "tools": `[":foo.tools"]`,
178 }
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000179 fooToolsAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000180 "cmd": `"cp $(SRCS) $(OUTS)"`,
181 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400182 "foo_tool.out",
183 "foo_tool2.out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500184 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000185 "srcs": `["foo_tool.in"]`,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000186 }
187
Sam Delmerico75539d62022-01-31 14:37:29 +0000188 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400189 makeBazelTargetHostOrDevice("genrule", "foo", fooAttrs, tc.hod),
190 makeBazelTargetHostOrDevice("genrule", "foo.tools", fooToolsAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000191 }
192
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000193 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000194 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
195 Bp2buildTestCase{
196 ModuleTypeUnderTest: tc.moduleType,
197 ModuleTypeUnderTestFactory: tc.factory,
198 Blueprint: fmt.Sprintf(bp, tc.moduleType, tc.moduleType),
199 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000200 })
201 })
202 }
203}
204
205func TestGenruleLocationsAbsoluteLabel(t *testing.T) {
206 testCases := []struct {
207 moduleType string
208 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400209 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000210 }{
211 {
212 moduleType: "genrule",
213 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400214 },
215 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000216 moduleType: "cc_genrule",
217 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400218 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000219 },
220 {
221 moduleType: "java_genrule",
222 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400223 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000224 },
225 {
226 moduleType: "java_genrule_host",
227 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400228 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000229 },
230 }
231
232 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400233 name: "foo",
234 out: ["foo.out"],
235 srcs: ["foo.in"],
236 tool_files: [":foo.tool"],
237 cmd: "$(locations :foo.tool) -s $(out) $(in)",
238 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000239}`
240
Sam Delmerico75539d62022-01-31 14:37:29 +0000241 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000242 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000243 "cmd": `"$(locations //other:foo.tool) -s $(OUTS) $(SRCS)"`,
244 "outs": `["foo.out"]`,
245 "srcs": `["foo.in"]`,
246 "tools": `["//other:foo.tool"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000247 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000248
Sam Delmerico75539d62022-01-31 14:37:29 +0000249 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400250 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000251 }
252
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000253 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000254 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
255 Bp2buildTestCase{
256 ModuleTypeUnderTest: tc.moduleType,
257 ModuleTypeUnderTestFactory: tc.factory,
258 Blueprint: fmt.Sprintf(bp, tc.moduleType),
259 ExpectedBazelTargets: expectedBazelTargets,
260 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000261 })
262 })
263 }
264}
265
266func TestGenruleSrcsLocationsAbsoluteLabel(t *testing.T) {
267 testCases := []struct {
268 moduleType string
269 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400270 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000271 }{
272 {
273 moduleType: "genrule",
274 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400275 },
276 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000277 moduleType: "cc_genrule",
278 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400279 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000280 },
281 {
282 moduleType: "java_genrule",
283 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400284 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000285 },
286 {
287 moduleType: "java_genrule_host",
288 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400289 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000290 },
291 }
292
293 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400294 name: "foo",
295 out: ["foo.out"],
296 srcs: [":other.tool"],
297 tool_files: [":foo.tool"],
298 cmd: "$(locations :foo.tool) -s $(out) $(location :other.tool)",
299 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000300}`
301
Sam Delmerico75539d62022-01-31 14:37:29 +0000302 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000303 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000304 "cmd": `"$(locations //other:foo.tool) -s $(OUTS) $(location //other:other.tool)"`,
305 "outs": `["foo.out"]`,
306 "srcs": `["//other:other.tool"]`,
307 "tools": `["//other:foo.tool"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000308 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000309
Sam Delmerico75539d62022-01-31 14:37:29 +0000310 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400311 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000312 }
313
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000314 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000315 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
316 Bp2buildTestCase{
317 ModuleTypeUnderTest: tc.moduleType,
318 ModuleTypeUnderTestFactory: tc.factory,
319 Blueprint: fmt.Sprintf(bp, tc.moduleType),
320 ExpectedBazelTargets: expectedBazelTargets,
321 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000322 })
323 })
324 }
325}
326
327func TestGenruleLocationLabelShouldSubstituteFirstToolLabel(t *testing.T) {
328 testCases := []struct {
329 moduleType string
330 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400331 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000332 }{
333 {
334 moduleType: "genrule",
335 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400336 },
337 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000338 moduleType: "cc_genrule",
339 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400340 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000341 },
342 {
343 moduleType: "java_genrule",
344 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400345 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000346 },
347 {
348 moduleType: "java_genrule_host",
349 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400350 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000351 },
352 }
353
354 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400355 name: "foo",
356 out: ["foo.out"],
357 srcs: ["foo.in"],
358 tool_files: [":foo.tool", ":other.tool"],
359 cmd: "$(location) -s $(out) $(in)",
360 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000361}`
362
Sam Delmerico75539d62022-01-31 14:37:29 +0000363 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000364 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000365 "cmd": `"$(location //other:foo.tool) -s $(OUTS) $(SRCS)"`,
366 "outs": `["foo.out"]`,
367 "srcs": `["foo.in"]`,
368 "tools": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400369 "//other:foo.tool",
370 "//other:other.tool",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500371 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000372 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000373
Sam Delmerico75539d62022-01-31 14:37:29 +0000374 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400375 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000376 }
377
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000378 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000379 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
380 Bp2buildTestCase{
381 ModuleTypeUnderTest: tc.moduleType,
382 ModuleTypeUnderTestFactory: tc.factory,
383 Blueprint: fmt.Sprintf(bp, tc.moduleType),
384 ExpectedBazelTargets: expectedBazelTargets,
385 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000386 })
387 })
388 }
389}
390
391func TestGenruleLocationsLabelShouldSubstituteFirstToolLabel(t *testing.T) {
392 testCases := []struct {
393 moduleType string
394 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400395 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000396 }{
397 {
398 moduleType: "genrule",
399 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400400 },
401 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000402 moduleType: "cc_genrule",
403 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400404 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000405 },
406 {
407 moduleType: "java_genrule",
408 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400409 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000410 },
411 {
412 moduleType: "java_genrule_host",
413 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400414 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000415 },
416 }
417
418 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400419 name: "foo",
420 out: ["foo.out"],
421 srcs: ["foo.in"],
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000422 tool_files: [":foo.tool", ":other.tool"],
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400423 cmd: "$(locations) -s $(out) $(in)",
424 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000425}`
426
Sam Delmerico75539d62022-01-31 14:37:29 +0000427 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000428 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000429 "cmd": `"$(locations //other:foo.tool) -s $(OUTS) $(SRCS)"`,
430 "outs": `["foo.out"]`,
431 "srcs": `["foo.in"]`,
432 "tools": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400433 "//other:foo.tool",
434 "//other:other.tool",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500435 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000436 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000437
Sam Delmerico75539d62022-01-31 14:37:29 +0000438 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400439 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000440 }
441
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000442 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000443 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
444 Bp2buildTestCase{
445 ModuleTypeUnderTest: tc.moduleType,
446 ModuleTypeUnderTestFactory: tc.factory,
447 Blueprint: fmt.Sprintf(bp, tc.moduleType),
448 ExpectedBazelTargets: expectedBazelTargets,
449 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000450 })
451 })
452 }
453}
454
455func TestGenruleWithoutToolsOrToolFiles(t *testing.T) {
456 testCases := []struct {
457 moduleType string
458 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400459 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000460 }{
461 {
462 moduleType: "genrule",
463 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400464 },
465 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000466 moduleType: "cc_genrule",
467 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400468 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000469 },
470 {
471 moduleType: "java_genrule",
472 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400473 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000474 },
475 {
476 moduleType: "java_genrule_host",
477 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400478 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000479 },
480 }
481
482 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400483 name: "foo",
484 out: ["foo.out"],
485 srcs: ["foo.in"],
486 cmd: "cp $(in) $(out)",
487 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000488}`
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400489
Sam Delmerico75539d62022-01-31 14:37:29 +0000490 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000491 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000492 "cmd": `"cp $(SRCS) $(OUTS)"`,
493 "outs": `["foo.out"]`,
494 "srcs": `["foo.in"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000495 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000496
Sam Delmerico75539d62022-01-31 14:37:29 +0000497 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400498 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000499 }
500
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000501 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000502 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
503 Bp2buildTestCase{
504 ModuleTypeUnderTest: tc.moduleType,
505 ModuleTypeUnderTestFactory: tc.factory,
506 Blueprint: fmt.Sprintf(bp, tc.moduleType),
507 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000508 })
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500509 })
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400510 }
511}
512
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000513func TestGenruleBp2BuildInlinesDefaults(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000514 testCases := []Bp2buildTestCase{
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400515 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000516 Description: "genrule applies properties from a genrule_defaults dependency if not specified",
517 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400518 name: "gen_defaults",
519 cmd: "do-something $(in) $(out)",
520}
521genrule {
522 name: "gen",
523 out: ["out"],
524 srcs: ["in1"],
525 defaults: ["gen_defaults"],
526 bazel_module: { bp2build_available: true },
527}
528`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000529 ExpectedBazelTargets: []string{
530 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500531 "cmd": `"do-something $(SRCS) $(OUTS)"`,
532 "outs": `["out"]`,
533 "srcs": `["in1"]`,
534 }),
535 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400536 },
537 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000538 Description: "genrule does merges properties from a genrule_defaults dependency, latest-first",
539 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400540 name: "gen_defaults",
541 out: ["out-from-defaults"],
542 srcs: ["in-from-defaults"],
543 cmd: "cmd-from-defaults",
544}
545genrule {
546 name: "gen",
547 out: ["out"],
548 srcs: ["in1"],
549 defaults: ["gen_defaults"],
550 cmd: "do-something $(in) $(out)",
551 bazel_module: { bp2build_available: true },
552}
553`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000554 ExpectedBazelTargets: []string{
555 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500556 "cmd": `"do-something $(SRCS) $(OUTS)"`,
557 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400558 "out-from-defaults",
559 "out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500560 ]`,
561 "srcs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400562 "in-from-defaults",
563 "in1",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500564 ]`,
565 }),
566 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400567 },
568 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000569 Description: "genrule applies properties from list of genrule_defaults",
570 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400571 name: "gen_defaults1",
572 cmd: "cp $(in) $(out)",
573}
574
575genrule_defaults {
576 name: "gen_defaults2",
577 srcs: ["in1"],
578}
579
580genrule {
581 name: "gen",
582 out: ["out"],
583 defaults: ["gen_defaults1", "gen_defaults2"],
584 bazel_module: { bp2build_available: true },
585}
586`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000587 ExpectedBazelTargets: []string{
588 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500589 "cmd": `"cp $(SRCS) $(OUTS)"`,
590 "outs": `["out"]`,
591 "srcs": `["in1"]`,
592 }),
593 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400594 },
595 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000596 Description: "genrule applies properties from genrule_defaults transitively",
597 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400598 name: "gen_defaults1",
599 defaults: ["gen_defaults2"],
600 cmd: "cmd1 $(in) $(out)", // overrides gen_defaults2's cmd property value.
601}
602
603genrule_defaults {
604 name: "gen_defaults2",
605 defaults: ["gen_defaults3"],
606 cmd: "cmd2 $(in) $(out)",
607 out: ["out-from-2"],
608 srcs: ["in1"],
609}
610
611genrule_defaults {
612 name: "gen_defaults3",
613 out: ["out-from-3"],
614 srcs: ["srcs-from-3"],
615}
616
617genrule {
618 name: "gen",
619 out: ["out"],
620 defaults: ["gen_defaults1"],
621 bazel_module: { bp2build_available: true },
622}
623`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000624 ExpectedBazelTargets: []string{
625 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500626 "cmd": `"cmd1 $(SRCS) $(OUTS)"`,
627 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400628 "out-from-3",
629 "out-from-2",
630 "out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500631 ]`,
632 "srcs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400633 "srcs-from-3",
634 "in1",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500635 ]`,
636 }),
637 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400638 },
639 }
640
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400641 for _, testCase := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000642 t.Run(testCase.Description, func(t *testing.T) {
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500643 runGenruleTestCase(t, testCase)
644 })
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400645 }
646}
Yu Liud6201012022-10-17 12:29:15 -0700647
648func TestCcGenruleArchAndExcludeSrcs(t *testing.T) {
649 name := "cc_genrule with arch"
650 bp := `
651 cc_genrule {
652 name: "foo",
653 srcs: [
654 "foo1.in",
655 "foo2.in",
656 ],
657 exclude_srcs: ["foo2.in"],
658 arch: {
659 arm: {
660 srcs: [
661 "foo1_arch.in",
662 "foo2_arch.in",
663 ],
664 exclude_srcs: ["foo2_arch.in"],
665 },
666 },
667 cmd: "cat $(in) > $(out)",
668 bazel_module: { bp2build_available: true },
669 }`
670
671 expectedBazelAttrs := AttrNameToString{
672 "srcs": `["foo1.in"] + select({
673 "//build/bazel/platforms/arch:arm": ["foo1_arch.in"],
674 "//conditions:default": [],
675 })`,
676 "cmd": `"cat $(SRCS) > $(OUTS)"`,
677 "target_compatible_with": `["//build/bazel/platforms/os:android"]`,
678 }
679
680 expectedBazelTargets := []string{
681 MakeBazelTargetNoRestrictions("genrule", "foo", expectedBazelAttrs),
682 }
683
684 t.Run(name, func(t *testing.T) {
685 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
686 Bp2buildTestCase{
687 ModuleTypeUnderTest: "cc_genrule",
688 ModuleTypeUnderTestFactory: cc.GenRuleFactory,
689 Blueprint: bp,
690 ExpectedBazelTargets: expectedBazelTargets,
691 })
692 })
693}