blob: 160395ba9b4dbe3759fe4829948ace100fc8f7b5 [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 (
18 "android/soong/android"
Sam Delmericocd1b80f2022-01-11 21:55:46 +000019 "android/soong/cc"
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040020 "android/soong/genrule"
Sam Delmericocd1b80f2022-01-11 21:55:46 +000021 "android/soong/java"
22 "fmt"
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040023 "testing"
24)
25
Liz Kammer78cfdaa2021-11-08 12:56:31 -050026func registerGenruleModuleTypes(ctx android.RegistrationContext) {
27 ctx.RegisterModuleType("genrule_defaults", func() android.Module { return genrule.DefaultsFactory() })
28}
29
Sam Delmerico3177a6e2022-06-21 19:28:33 +000030func runGenruleTestCase(t *testing.T, tc Bp2buildTestCase) {
Liz Kammer78cfdaa2021-11-08 12:56:31 -050031 t.Helper()
Sam Delmerico3177a6e2022-06-21 19:28:33 +000032 (&tc).ModuleTypeUnderTest = "genrule"
33 (&tc).ModuleTypeUnderTestFactory = genrule.GenRuleFactory
34 RunBp2BuildTestCase(t, registerGenruleModuleTypes, tc)
Liz Kammer78cfdaa2021-11-08 12:56:31 -050035}
36
Sam Delmericocd1b80f2022-01-11 21:55:46 +000037func otherGenruleBp(genruleTarget string) map[string]string {
38 return map[string]string{
39 "other/Android.bp": fmt.Sprintf(`%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040040 name: "foo.tool",
41 out: ["foo_tool.out"],
42 srcs: ["foo_tool.in"],
43 cmd: "cp $(in) $(out)",
44}
Sam Delmericocd1b80f2022-01-11 21:55:46 +000045%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040046 name: "other.tool",
47 out: ["other_tool.out"],
48 srcs: ["other_tool.in"],
49 cmd: "cp $(in) $(out)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000050}`, genruleTarget, genruleTarget),
51 }
52}
53
54func TestGenruleCliVariableReplacement(t *testing.T) {
55 testCases := []struct {
56 moduleType string
57 factory android.ModuleFactory
58 genDir string
Liz Kammerdfeb1202022-05-13 17:20:20 -040059 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +000060 }{
61 {
62 moduleType: "genrule",
63 factory: genrule.GenRuleFactory,
Vinh Tranf19b6582022-09-21 17:01:49 -040064 genDir: "$(RULEDIR)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000065 },
66 {
67 moduleType: "cc_genrule",
68 factory: cc.GenRuleFactory,
69 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040070 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000071 },
72 {
73 moduleType: "java_genrule",
74 factory: java.GenRuleFactory,
75 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040076 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000077 },
78 {
79 moduleType: "java_genrule_host",
80 factory: java.GenRuleFactoryHost,
81 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040082 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000083 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040084 }
85
Sam Delmericocd1b80f2022-01-11 21:55:46 +000086 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040087 name: "foo.tool",
88 out: ["foo_tool.out"],
89 srcs: ["foo_tool.in"],
90 cmd: "cp $(in) $(out)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000091 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040092}
93
Sam Delmericocd1b80f2022-01-11 21:55:46 +000094%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040095 name: "foo",
96 out: ["foo.out"],
97 srcs: ["foo.in"],
98 tools: [":foo.tool"],
99 cmd: "$(location :foo.tool) --genDir=$(genDir) arg $(in) $(out)",
100 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000101}`
102
103 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000104 moduleAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000105 "cmd": fmt.Sprintf(`"$(location :foo.tool) --genDir=%s arg $(SRCS) $(OUTS)"`, tc.genDir),
106 "outs": `["foo.out"]`,
107 "srcs": `["foo.in"]`,
108 "tools": `[":foo.tool"]`,
109 }
110
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000111 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400112 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000113 }
114
115 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000116 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
117 Bp2buildTestCase{
118 ModuleTypeUnderTest: tc.moduleType,
119 ModuleTypeUnderTestFactory: tc.factory,
120 Blueprint: fmt.Sprintf(bp, tc.moduleType, tc.moduleType),
121 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000122 })
123 })
124 }
125}
126
127func TestGenruleLocationsLabel(t *testing.T) {
128 testCases := []struct {
129 moduleType string
130 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400131 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000132 }{
133 {
134 moduleType: "genrule",
135 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400136 },
137 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000138 moduleType: "cc_genrule",
139 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400140 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000141 },
142 {
143 moduleType: "java_genrule",
144 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400145 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000146 },
147 {
148 moduleType: "java_genrule_host",
149 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400150 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000151 },
152 }
153
154 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400155 name: "foo.tools",
156 out: ["foo_tool.out", "foo_tool2.out"],
157 srcs: ["foo_tool.in"],
158 cmd: "cp $(in) $(out)",
159 bazel_module: { bp2build_available: true },
160}
161
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000162%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400163 name: "foo",
164 out: ["foo.out"],
165 srcs: ["foo.in"],
166 tools: [":foo.tools"],
167 cmd: "$(locations :foo.tools) -s $(out) $(in)",
168 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000169}`
170
Sam Delmerico75539d62022-01-31 14:37:29 +0000171 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000172 fooAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000173 "cmd": `"$(locations :foo.tools) -s $(OUTS) $(SRCS)"`,
174 "outs": `["foo.out"]`,
175 "srcs": `["foo.in"]`,
176 "tools": `[":foo.tools"]`,
177 }
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000178 fooToolsAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000179 "cmd": `"cp $(SRCS) $(OUTS)"`,
180 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400181 "foo_tool.out",
182 "foo_tool2.out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500183 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000184 "srcs": `["foo_tool.in"]`,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000185 }
186
Sam Delmerico75539d62022-01-31 14:37:29 +0000187 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400188 makeBazelTargetHostOrDevice("genrule", "foo", fooAttrs, tc.hod),
189 makeBazelTargetHostOrDevice("genrule", "foo.tools", fooToolsAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000190 }
191
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000192 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000193 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
194 Bp2buildTestCase{
195 ModuleTypeUnderTest: tc.moduleType,
196 ModuleTypeUnderTestFactory: tc.factory,
197 Blueprint: fmt.Sprintf(bp, tc.moduleType, tc.moduleType),
198 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000199 })
200 })
201 }
202}
203
204func TestGenruleLocationsAbsoluteLabel(t *testing.T) {
205 testCases := []struct {
206 moduleType string
207 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400208 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000209 }{
210 {
211 moduleType: "genrule",
212 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400213 },
214 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000215 moduleType: "cc_genrule",
216 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400217 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000218 },
219 {
220 moduleType: "java_genrule",
221 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400222 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000223 },
224 {
225 moduleType: "java_genrule_host",
226 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400227 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000228 },
229 }
230
231 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400232 name: "foo",
233 out: ["foo.out"],
234 srcs: ["foo.in"],
235 tool_files: [":foo.tool"],
236 cmd: "$(locations :foo.tool) -s $(out) $(in)",
237 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000238}`
239
Sam Delmerico75539d62022-01-31 14:37:29 +0000240 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000241 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000242 "cmd": `"$(locations //other:foo.tool) -s $(OUTS) $(SRCS)"`,
243 "outs": `["foo.out"]`,
244 "srcs": `["foo.in"]`,
245 "tools": `["//other:foo.tool"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000246 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000247
Sam Delmerico75539d62022-01-31 14:37:29 +0000248 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400249 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000250 }
251
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000252 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000253 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
254 Bp2buildTestCase{
255 ModuleTypeUnderTest: tc.moduleType,
256 ModuleTypeUnderTestFactory: tc.factory,
257 Blueprint: fmt.Sprintf(bp, tc.moduleType),
258 ExpectedBazelTargets: expectedBazelTargets,
259 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000260 })
261 })
262 }
263}
264
265func TestGenruleSrcsLocationsAbsoluteLabel(t *testing.T) {
266 testCases := []struct {
267 moduleType string
268 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400269 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000270 }{
271 {
272 moduleType: "genrule",
273 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400274 },
275 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000276 moduleType: "cc_genrule",
277 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400278 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000279 },
280 {
281 moduleType: "java_genrule",
282 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400283 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000284 },
285 {
286 moduleType: "java_genrule_host",
287 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400288 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000289 },
290 }
291
292 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400293 name: "foo",
294 out: ["foo.out"],
295 srcs: [":other.tool"],
296 tool_files: [":foo.tool"],
297 cmd: "$(locations :foo.tool) -s $(out) $(location :other.tool)",
298 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000299}`
300
Sam Delmerico75539d62022-01-31 14:37:29 +0000301 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000302 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000303 "cmd": `"$(locations //other:foo.tool) -s $(OUTS) $(location //other:other.tool)"`,
304 "outs": `["foo.out"]`,
305 "srcs": `["//other:other.tool"]`,
306 "tools": `["//other:foo.tool"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000307 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000308
Sam Delmerico75539d62022-01-31 14:37:29 +0000309 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400310 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000311 }
312
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000313 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000314 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
315 Bp2buildTestCase{
316 ModuleTypeUnderTest: tc.moduleType,
317 ModuleTypeUnderTestFactory: tc.factory,
318 Blueprint: fmt.Sprintf(bp, tc.moduleType),
319 ExpectedBazelTargets: expectedBazelTargets,
320 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000321 })
322 })
323 }
324}
325
326func TestGenruleLocationLabelShouldSubstituteFirstToolLabel(t *testing.T) {
327 testCases := []struct {
328 moduleType string
329 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400330 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000331 }{
332 {
333 moduleType: "genrule",
334 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400335 },
336 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000337 moduleType: "cc_genrule",
338 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400339 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000340 },
341 {
342 moduleType: "java_genrule",
343 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400344 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000345 },
346 {
347 moduleType: "java_genrule_host",
348 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400349 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000350 },
351 }
352
353 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400354 name: "foo",
355 out: ["foo.out"],
356 srcs: ["foo.in"],
357 tool_files: [":foo.tool", ":other.tool"],
358 cmd: "$(location) -s $(out) $(in)",
359 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000360}`
361
Sam Delmerico75539d62022-01-31 14:37:29 +0000362 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000363 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000364 "cmd": `"$(location //other:foo.tool) -s $(OUTS) $(SRCS)"`,
365 "outs": `["foo.out"]`,
366 "srcs": `["foo.in"]`,
367 "tools": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400368 "//other:foo.tool",
369 "//other:other.tool",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500370 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000371 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000372
Sam Delmerico75539d62022-01-31 14:37:29 +0000373 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400374 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000375 }
376
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000377 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000378 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
379 Bp2buildTestCase{
380 ModuleTypeUnderTest: tc.moduleType,
381 ModuleTypeUnderTestFactory: tc.factory,
382 Blueprint: fmt.Sprintf(bp, tc.moduleType),
383 ExpectedBazelTargets: expectedBazelTargets,
384 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000385 })
386 })
387 }
388}
389
390func TestGenruleLocationsLabelShouldSubstituteFirstToolLabel(t *testing.T) {
391 testCases := []struct {
392 moduleType string
393 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400394 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000395 }{
396 {
397 moduleType: "genrule",
398 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400399 },
400 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000401 moduleType: "cc_genrule",
402 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400403 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000404 },
405 {
406 moduleType: "java_genrule",
407 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400408 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000409 },
410 {
411 moduleType: "java_genrule_host",
412 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400413 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000414 },
415 }
416
417 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400418 name: "foo",
419 out: ["foo.out"],
420 srcs: ["foo.in"],
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000421 tool_files: [":foo.tool", ":other.tool"],
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400422 cmd: "$(locations) -s $(out) $(in)",
423 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000424}`
425
Sam Delmerico75539d62022-01-31 14:37:29 +0000426 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000427 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000428 "cmd": `"$(locations //other:foo.tool) -s $(OUTS) $(SRCS)"`,
429 "outs": `["foo.out"]`,
430 "srcs": `["foo.in"]`,
431 "tools": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400432 "//other:foo.tool",
433 "//other:other.tool",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500434 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000435 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000436
Sam Delmerico75539d62022-01-31 14:37:29 +0000437 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400438 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000439 }
440
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000441 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000442 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
443 Bp2buildTestCase{
444 ModuleTypeUnderTest: tc.moduleType,
445 ModuleTypeUnderTestFactory: tc.factory,
446 Blueprint: fmt.Sprintf(bp, tc.moduleType),
447 ExpectedBazelTargets: expectedBazelTargets,
448 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000449 })
450 })
451 }
452}
453
454func TestGenruleWithoutToolsOrToolFiles(t *testing.T) {
455 testCases := []struct {
456 moduleType string
457 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400458 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000459 }{
460 {
461 moduleType: "genrule",
462 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400463 },
464 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000465 moduleType: "cc_genrule",
466 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400467 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000468 },
469 {
470 moduleType: "java_genrule",
471 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400472 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000473 },
474 {
475 moduleType: "java_genrule_host",
476 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400477 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000478 },
479 }
480
481 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400482 name: "foo",
483 out: ["foo.out"],
484 srcs: ["foo.in"],
485 cmd: "cp $(in) $(out)",
486 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000487}`
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400488
Sam Delmerico75539d62022-01-31 14:37:29 +0000489 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000490 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000491 "cmd": `"cp $(SRCS) $(OUTS)"`,
492 "outs": `["foo.out"]`,
493 "srcs": `["foo.in"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000494 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000495
Sam Delmerico75539d62022-01-31 14:37:29 +0000496 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400497 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000498 }
499
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000500 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000501 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
502 Bp2buildTestCase{
503 ModuleTypeUnderTest: tc.moduleType,
504 ModuleTypeUnderTestFactory: tc.factory,
505 Blueprint: fmt.Sprintf(bp, tc.moduleType),
506 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000507 })
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500508 })
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400509 }
510}
511
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000512func TestGenruleBp2BuildInlinesDefaults(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000513 testCases := []Bp2buildTestCase{
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400514 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000515 Description: "genrule applies properties from a genrule_defaults dependency if not specified",
516 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400517 name: "gen_defaults",
518 cmd: "do-something $(in) $(out)",
519}
520genrule {
521 name: "gen",
522 out: ["out"],
523 srcs: ["in1"],
524 defaults: ["gen_defaults"],
525 bazel_module: { bp2build_available: true },
526}
527`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000528 ExpectedBazelTargets: []string{
529 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500530 "cmd": `"do-something $(SRCS) $(OUTS)"`,
531 "outs": `["out"]`,
532 "srcs": `["in1"]`,
533 }),
534 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400535 },
536 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000537 Description: "genrule does merges properties from a genrule_defaults dependency, latest-first",
538 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400539 name: "gen_defaults",
540 out: ["out-from-defaults"],
541 srcs: ["in-from-defaults"],
542 cmd: "cmd-from-defaults",
543}
544genrule {
545 name: "gen",
546 out: ["out"],
547 srcs: ["in1"],
548 defaults: ["gen_defaults"],
549 cmd: "do-something $(in) $(out)",
550 bazel_module: { bp2build_available: true },
551}
552`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000553 ExpectedBazelTargets: []string{
554 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500555 "cmd": `"do-something $(SRCS) $(OUTS)"`,
556 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400557 "out-from-defaults",
558 "out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500559 ]`,
560 "srcs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400561 "in-from-defaults",
562 "in1",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500563 ]`,
564 }),
565 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400566 },
567 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000568 Description: "genrule applies properties from list of genrule_defaults",
569 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400570 name: "gen_defaults1",
571 cmd: "cp $(in) $(out)",
572}
573
574genrule_defaults {
575 name: "gen_defaults2",
576 srcs: ["in1"],
577}
578
579genrule {
580 name: "gen",
581 out: ["out"],
582 defaults: ["gen_defaults1", "gen_defaults2"],
583 bazel_module: { bp2build_available: true },
584}
585`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000586 ExpectedBazelTargets: []string{
587 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500588 "cmd": `"cp $(SRCS) $(OUTS)"`,
589 "outs": `["out"]`,
590 "srcs": `["in1"]`,
591 }),
592 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400593 },
594 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000595 Description: "genrule applies properties from genrule_defaults transitively",
596 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400597 name: "gen_defaults1",
598 defaults: ["gen_defaults2"],
599 cmd: "cmd1 $(in) $(out)", // overrides gen_defaults2's cmd property value.
600}
601
602genrule_defaults {
603 name: "gen_defaults2",
604 defaults: ["gen_defaults3"],
605 cmd: "cmd2 $(in) $(out)",
606 out: ["out-from-2"],
607 srcs: ["in1"],
608}
609
610genrule_defaults {
611 name: "gen_defaults3",
612 out: ["out-from-3"],
613 srcs: ["srcs-from-3"],
614}
615
616genrule {
617 name: "gen",
618 out: ["out"],
619 defaults: ["gen_defaults1"],
620 bazel_module: { bp2build_available: true },
621}
622`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000623 ExpectedBazelTargets: []string{
624 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500625 "cmd": `"cmd1 $(SRCS) $(OUTS)"`,
626 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400627 "out-from-3",
628 "out-from-2",
629 "out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500630 ]`,
631 "srcs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400632 "srcs-from-3",
633 "in1",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500634 ]`,
635 }),
636 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400637 },
638 }
639
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400640 for _, testCase := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000641 t.Run(testCase.Description, func(t *testing.T) {
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500642 runGenruleTestCase(t, testCase)
643 })
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400644 }
645}