bp2build: support genrule $(location) and $(locations)

Soong genrules support $(location) and $(locations) cmd variable
shortcuts without labels. The shortcut is for the location of the first
tool module from the concatenation of the tools and tool_files
properties.

Bazel doesn't support this shortcut, so the bp2build mapping needs to
support it.

Documentation:
https://cs.android.com/android/platform/superproject/+/master:build/soong/genrule/genrule.go;l=95-96;drc=316e07c593ab66599c74725cf482dedbb32b2875
Code: https://cs.android.com/android/platform/superproject/+/master:build/soong/genrule/genrule.go;l=236-246;drc=316e07c593ab66599c74725cf482dedbb32b2875

Test: build_conversion_test.go
Test: TH

Change-Id: I8aa98ae460af3a3fbb0a7835572518680dc7ade1
diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go
index be32530..367e13f 100644
--- a/bp2build/build_conversion_test.go
+++ b/bp2build/build_conversion_test.go
@@ -274,8 +274,10 @@
 		moduleTypeUnderTestFactory android.ModuleFactory
 		bp                         string
 		expectedBazelTarget        string
+		description                string
 	}{
 		{
+			description:                "filegroup with no srcs",
 			moduleTypeUnderTest:        "filegroup",
 			moduleTypeUnderTestFactory: android.FileGroupFactory,
 			bp: `filegroup {
@@ -289,6 +291,7 @@
 )`,
 		},
 		{
+			description:                "filegroup with srcs",
 			moduleTypeUnderTest:        "filegroup",
 			moduleTypeUnderTestFactory: android.FileGroupFactory,
 			bp: `filegroup {
@@ -304,18 +307,19 @@
 )`,
 		},
 		{
+			description:                "genrule with command line variable replacements",
 			moduleTypeUnderTest:        "genrule",
 			moduleTypeUnderTestFactory: genrule.GenRuleFactory,
 			bp: `genrule {
     name: "foo",
     out: ["foo.out"],
     srcs: ["foo.in"],
-    tool_files: [":foo.tool"],
-    cmd: "$(location :foo.tool) arg $(in) $(out)",
+    tools: [":foo.tool"],
+    cmd: "$(location :foo.tool) --genDir=$(genDir) arg $(in) $(out)",
 }`,
 			expectedBazelTarget: `genrule(
     name = "foo",
-    cmd = "$(location :foo.tool) arg $(SRCS) $(OUTS)",
+    cmd = "$(location :foo.tool) --genDir=$(GENDIR) arg $(SRCS) $(OUTS)",
     outs = [
         "foo.out",
     ],
@@ -328,18 +332,44 @@
 )`,
 		},
 		{
+			description:                "genrule using $(locations :label)",
 			moduleTypeUnderTest:        "genrule",
 			moduleTypeUnderTestFactory: genrule.GenRuleFactory,
 			bp: `genrule {
     name: "foo",
     out: ["foo.out"],
     srcs: ["foo.in"],
-    tools: [":foo.tool"],
-    cmd: "$(location :foo.tool) --out-dir=$(genDir) $(in)",
+    tools: [":foo.tools"],
+    cmd: "$(locations :foo.tools) -s $(out) $(in)",
 }`,
 			expectedBazelTarget: `genrule(
     name = "foo",
-    cmd = "$(location :foo.tool) --out-dir=$(GENDIR) $(SRCS)",
+    cmd = "$(locations :foo.tools) -s $(OUTS) $(SRCS)",
+    outs = [
+        "foo.out",
+    ],
+    srcs = [
+        "foo.in",
+    ],
+    tools = [
+        ":foo.tools",
+    ],
+)`,
+		},
+		{
+			description:                "genrule using $(location) label should substitute first tool label automatically",
+			moduleTypeUnderTest:        "genrule",
+			moduleTypeUnderTestFactory: genrule.GenRuleFactory,
+			bp: `genrule {
+    name: "foo",
+    out: ["foo.out"],
+    srcs: ["foo.in"],
+    tool_files: [":foo.tool", ":other.tool"],
+    cmd: "$(location) -s $(out) $(in)",
+}`,
+			expectedBazelTarget: `genrule(
+    name = "foo",
+    cmd = "$(location :foo.tool) -s $(OUTS) $(SRCS)",
     outs = [
         "foo.out",
     ],
@@ -348,6 +378,54 @@
     ],
     tools = [
         ":foo.tool",
+        ":other.tool",
+    ],
+)`,
+		},
+		{
+			description:                "genrule using $(locations) label should substitute first tool label automatically",
+			moduleTypeUnderTest:        "genrule",
+			moduleTypeUnderTestFactory: genrule.GenRuleFactory,
+			bp: `genrule {
+    name: "foo",
+    out: ["foo.out"],
+    srcs: ["foo.in"],
+    tools: [":foo.tool", ":other.tool"],
+    cmd: "$(locations) -s $(out) $(in)",
+}`,
+			expectedBazelTarget: `genrule(
+    name = "foo",
+    cmd = "$(locations :foo.tool) -s $(OUTS) $(SRCS)",
+    outs = [
+        "foo.out",
+    ],
+    srcs = [
+        "foo.in",
+    ],
+    tools = [
+        ":foo.tool",
+        ":other.tool",
+    ],
+)`,
+		},
+		{
+			description:                "genrule without tools or tool_files can convert successfully",
+			moduleTypeUnderTest:        "genrule",
+			moduleTypeUnderTestFactory: genrule.GenRuleFactory,
+			bp: `genrule {
+    name: "foo",
+    out: ["foo.out"],
+    srcs: ["foo.in"],
+    cmd: "cp $(in) $(out)",
+}`,
+			expectedBazelTarget: `genrule(
+    name = "foo",
+    cmd = "cp $(SRCS) $(OUTS)",
+    outs = [
+        "foo.out",
+    ],
+    srcs = [
+        "foo.in",
     ],
 )`,
 		},
@@ -367,13 +445,14 @@
 
 		bazelTargets := GenerateSoongModuleTargets(ctx.Context.Context, Bp2Build)[dir]
 		if actualCount, expectedCount := len(bazelTargets), 1; actualCount != expectedCount {
-			t.Fatalf("Expected %d bazel target, got %d", expectedCount, actualCount)
+			t.Fatalf("%s: Expected %d bazel target, got %d", testCase.description, expectedCount, actualCount)
 		}
 
 		actualBazelTarget := bazelTargets[0]
 		if actualBazelTarget.content != testCase.expectedBazelTarget {
 			t.Errorf(
-				"Expected generated Bazel target to be '%s', got '%s'",
+				"%s: Expected generated Bazel target to be '%s', got '%s'",
+				testCase.description,
 				testCase.expectedBazelTarget,
 				actualBazelTarget.content,
 			)