| // Copyright 2021 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package bp2build |
| |
| import ( |
| "testing" |
| |
| "android/soong/android" |
| "android/soong/cc" |
| "android/soong/genrule" |
| ) |
| |
| var otherCcGenruleBp = map[string]string{ |
| "other/Android.bp": `cc_genrule { |
| name: "foo.tool", |
| out: ["foo_tool.out"], |
| srcs: ["foo_tool.in"], |
| cmd: "cp $(in) $(out)", |
| } |
| cc_genrule { |
| name: "other.tool", |
| out: ["other_tool.out"], |
| srcs: ["other_tool.in"], |
| cmd: "cp $(in) $(out)", |
| }`, |
| } |
| |
| func runCcGenruleTestCase(t *testing.T, tc bp2buildTestCase) { |
| t.Helper() |
| runBp2BuildTestCase(t, func(ctx android.RegistrationContext) {}, tc) |
| } |
| |
| func TestCliVariableReplacement(t *testing.T) { |
| runCcGenruleTestCase(t, bp2buildTestCase{ |
| description: "cc_genrule with command line variable replacements", |
| moduleTypeUnderTest: "cc_genrule", |
| moduleTypeUnderTestFactory: cc.GenRuleFactory, |
| moduleTypeUnderTestBp2BuildMutator: genrule.CcGenruleBp2Build, |
| blueprint: `cc_genrule { |
| name: "foo.tool", |
| out: ["foo_tool.out"], |
| srcs: ["foo_tool.in"], |
| cmd: "cp $(in) $(out)", |
| bazel_module: { bp2build_available: true }, |
| } |
| |
| cc_genrule { |
| name: "foo", |
| out: ["foo.out"], |
| srcs: ["foo.in"], |
| tools: [":foo.tool"], |
| cmd: "$(location :foo.tool) --genDir=$(genDir) arg $(in) $(out)", |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{ |
| `genrule( |
| name = "foo", |
| cmd = "$(location :foo.tool) --genDir=$(RULEDIR) arg $(SRCS) $(OUTS)", |
| outs = ["foo.out"], |
| srcs = ["foo.in"], |
| tools = [":foo.tool"], |
| )`, |
| `genrule( |
| name = "foo.tool", |
| cmd = "cp $(SRCS) $(OUTS)", |
| outs = ["foo_tool.out"], |
| srcs = ["foo_tool.in"], |
| )`, |
| }, |
| }) |
| } |
| |
| func TestUsingLocationsLabel(t *testing.T) { |
| runCcGenruleTestCase(t, bp2buildTestCase{ |
| description: "cc_genrule using $(locations :label)", |
| moduleTypeUnderTest: "cc_genrule", |
| moduleTypeUnderTestFactory: cc.GenRuleFactory, |
| moduleTypeUnderTestBp2BuildMutator: genrule.CcGenruleBp2Build, |
| blueprint: `cc_genrule { |
| name: "foo.tools", |
| out: ["foo_tool.out", "foo_tool2.out"], |
| srcs: ["foo_tool.in"], |
| cmd: "cp $(in) $(out)", |
| bazel_module: { bp2build_available: true }, |
| } |
| |
| cc_genrule { |
| name: "foo", |
| out: ["foo.out"], |
| srcs: ["foo.in"], |
| tools: [":foo.tools"], |
| cmd: "$(locations :foo.tools) -s $(out) $(in)", |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{`genrule( |
| name = "foo", |
| cmd = "$(locations :foo.tools) -s $(OUTS) $(SRCS)", |
| outs = ["foo.out"], |
| srcs = ["foo.in"], |
| tools = [":foo.tools"], |
| )`, |
| `genrule( |
| name = "foo.tools", |
| cmd = "cp $(SRCS) $(OUTS)", |
| outs = [ |
| "foo_tool.out", |
| "foo_tool2.out", |
| ], |
| srcs = ["foo_tool.in"], |
| )`, |
| }, |
| }) |
| } |
| |
| func TestUsingLocationsAbsoluteLabel(t *testing.T) { |
| runCcGenruleTestCase(t, bp2buildTestCase{ |
| description: "cc_genrule using $(locations //absolute:label)", |
| moduleTypeUnderTest: "cc_genrule", |
| moduleTypeUnderTestFactory: cc.GenRuleFactory, |
| moduleTypeUnderTestBp2BuildMutator: genrule.CcGenruleBp2Build, |
| blueprint: `cc_genrule { |
| name: "foo", |
| out: ["foo.out"], |
| srcs: ["foo.in"], |
| tool_files: [":foo.tool"], |
| cmd: "$(locations :foo.tool) -s $(out) $(in)", |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{`genrule( |
| name = "foo", |
| cmd = "$(locations //other:foo.tool) -s $(OUTS) $(SRCS)", |
| outs = ["foo.out"], |
| srcs = ["foo.in"], |
| tools = ["//other:foo.tool"], |
| )`, |
| }, |
| filesystem: otherCcGenruleBp, |
| }) |
| } |
| |
| func TestSrcsUsingAbsoluteLabel(t *testing.T) { |
| runCcGenruleTestCase(t, bp2buildTestCase{ |
| description: "cc_genrule srcs using $(locations //absolute:label)", |
| moduleTypeUnderTest: "cc_genrule", |
| moduleTypeUnderTestFactory: cc.GenRuleFactory, |
| moduleTypeUnderTestBp2BuildMutator: genrule.CcGenruleBp2Build, |
| blueprint: `cc_genrule { |
| name: "foo", |
| out: ["foo.out"], |
| srcs: [":other.tool"], |
| tool_files: [":foo.tool"], |
| cmd: "$(locations :foo.tool) -s $(out) $(location :other.tool)", |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{`genrule( |
| name = "foo", |
| cmd = "$(locations //other:foo.tool) -s $(OUTS) $(location //other:other.tool)", |
| outs = ["foo.out"], |
| srcs = ["//other:other.tool"], |
| tools = ["//other:foo.tool"], |
| )`, |
| }, |
| filesystem: otherCcGenruleBp, |
| }) |
| } |
| |
| func TestLocationsLabelUsesFirstToolFile(t *testing.T) { |
| runCcGenruleTestCase(t, bp2buildTestCase{ |
| description: "cc_genrule using $(location) label should substitute first tool label automatically", |
| moduleTypeUnderTest: "cc_genrule", |
| moduleTypeUnderTestFactory: cc.GenRuleFactory, |
| moduleTypeUnderTestBp2BuildMutator: genrule.CcGenruleBp2Build, |
| blueprint: `cc_genrule { |
| name: "foo", |
| out: ["foo.out"], |
| srcs: ["foo.in"], |
| tool_files: [":foo.tool", ":other.tool"], |
| cmd: "$(location) -s $(out) $(in)", |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{`genrule( |
| name = "foo", |
| cmd = "$(location //other:foo.tool) -s $(OUTS) $(SRCS)", |
| outs = ["foo.out"], |
| srcs = ["foo.in"], |
| tools = [ |
| "//other:foo.tool", |
| "//other:other.tool", |
| ], |
| )`, |
| }, |
| filesystem: otherCcGenruleBp, |
| }) |
| } |
| |
| func TestLocationsLabelUsesFirstTool(t *testing.T) { |
| runCcGenruleTestCase(t, bp2buildTestCase{ |
| description: "cc_genrule using $(locations) label should substitute first tool label automatically", |
| moduleTypeUnderTest: "cc_genrule", |
| moduleTypeUnderTestFactory: cc.GenRuleFactory, |
| moduleTypeUnderTestBp2BuildMutator: genrule.CcGenruleBp2Build, |
| blueprint: `cc_genrule { |
| name: "foo", |
| out: ["foo.out"], |
| srcs: ["foo.in"], |
| tools: [":foo.tool", ":other.tool"], |
| cmd: "$(locations) -s $(out) $(in)", |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{`genrule( |
| name = "foo", |
| cmd = "$(locations //other:foo.tool) -s $(OUTS) $(SRCS)", |
| outs = ["foo.out"], |
| srcs = ["foo.in"], |
| tools = [ |
| "//other:foo.tool", |
| "//other:other.tool", |
| ], |
| )`, |
| }, |
| filesystem: otherCcGenruleBp, |
| }) |
| } |
| |
| func TestWithoutToolsOrToolFiles(t *testing.T) { |
| runCcGenruleTestCase(t, bp2buildTestCase{ |
| description: "cc_genrule without tools or tool_files can convert successfully", |
| moduleTypeUnderTest: "cc_genrule", |
| moduleTypeUnderTestFactory: cc.GenRuleFactory, |
| moduleTypeUnderTestBp2BuildMutator: genrule.CcGenruleBp2Build, |
| blueprint: `cc_genrule { |
| name: "foo", |
| out: ["foo.out"], |
| srcs: ["foo.in"], |
| cmd: "cp $(in) $(out)", |
| bazel_module: { bp2build_available: true }, |
| }`, |
| expectedBazelTargets: []string{`genrule( |
| name = "foo", |
| cmd = "cp $(SRCS) $(OUTS)", |
| outs = ["foo.out"], |
| srcs = ["foo.in"], |
| )`, |
| }, |
| }) |
| } |