2020-11-26 01:06:39 +01:00
|
|
|
// Copyright 2020 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 (
|
|
|
|
"android/soong/android"
|
2021-08-26 14:37:59 +02:00
|
|
|
"fmt"
|
2021-01-26 15:18:53 +01:00
|
|
|
"strings"
|
2020-11-26 01:06:39 +01:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestGenerateSoongModuleTargets(t *testing.T) {
|
|
|
|
testCases := []struct {
|
2021-06-03 19:43:01 +02:00
|
|
|
description string
|
2020-11-26 01:06:39 +01:00
|
|
|
bp string
|
|
|
|
expectedBazelTarget string
|
|
|
|
}{
|
|
|
|
{
|
2021-06-03 19:43:01 +02:00
|
|
|
description: "only name",
|
2021-04-08 16:40:57 +02:00
|
|
|
bp: `custom { name: "foo" }
|
2021-06-03 19:43:01 +02:00
|
|
|
`,
|
2020-11-26 01:06:39 +01:00
|
|
|
expectedBazelTarget: `soong_module(
|
|
|
|
name = "foo",
|
2021-01-25 10:36:04 +01:00
|
|
|
soong_module_name = "foo",
|
|
|
|
soong_module_type = "custom",
|
|
|
|
soong_module_variant = "",
|
|
|
|
soong_module_deps = [
|
2020-11-26 01:06:39 +01:00
|
|
|
],
|
2021-06-03 19:43:01 +02:00
|
|
|
bool_prop = False,
|
2020-11-26 01:06:39 +01:00
|
|
|
)`,
|
|
|
|
},
|
|
|
|
{
|
2021-06-03 19:43:01 +02:00
|
|
|
description: "handles bool",
|
2020-11-26 01:06:39 +01:00
|
|
|
bp: `custom {
|
2021-06-03 19:43:01 +02:00
|
|
|
name: "foo",
|
|
|
|
bool_prop: true,
|
2020-11-26 01:06:39 +01:00
|
|
|
}
|
2021-06-03 19:43:01 +02:00
|
|
|
`,
|
2020-11-26 01:06:39 +01:00
|
|
|
expectedBazelTarget: `soong_module(
|
|
|
|
name = "foo",
|
2021-01-25 10:36:04 +01:00
|
|
|
soong_module_name = "foo",
|
|
|
|
soong_module_type = "custom",
|
|
|
|
soong_module_variant = "",
|
|
|
|
soong_module_deps = [
|
2020-11-26 01:06:39 +01:00
|
|
|
],
|
2021-06-03 19:43:01 +02:00
|
|
|
bool_prop = True,
|
2020-11-26 01:06:39 +01:00
|
|
|
)`,
|
|
|
|
},
|
|
|
|
{
|
2021-06-03 19:43:01 +02:00
|
|
|
description: "string escaping",
|
2020-11-26 01:06:39 +01:00
|
|
|
bp: `custom {
|
2021-06-03 19:43:01 +02:00
|
|
|
name: "foo",
|
|
|
|
owner: "a_string_with\"quotes\"_and_\\backslashes\\\\",
|
2020-11-26 01:06:39 +01:00
|
|
|
}
|
2021-06-03 19:43:01 +02:00
|
|
|
`,
|
2020-11-26 01:06:39 +01:00
|
|
|
expectedBazelTarget: `soong_module(
|
|
|
|
name = "foo",
|
2021-01-25 10:36:04 +01:00
|
|
|
soong_module_name = "foo",
|
|
|
|
soong_module_type = "custom",
|
|
|
|
soong_module_variant = "",
|
|
|
|
soong_module_deps = [
|
2020-11-26 01:06:39 +01:00
|
|
|
],
|
2021-06-03 19:43:01 +02:00
|
|
|
bool_prop = False,
|
2020-11-26 01:06:39 +01:00
|
|
|
owner = "a_string_with\"quotes\"_and_\\backslashes\\\\",
|
|
|
|
)`,
|
|
|
|
},
|
|
|
|
{
|
2021-06-03 19:43:01 +02:00
|
|
|
description: "single item string list",
|
2020-11-26 01:06:39 +01:00
|
|
|
bp: `custom {
|
2021-06-03 19:43:01 +02:00
|
|
|
name: "foo",
|
|
|
|
required: ["bar"],
|
2020-11-26 01:06:39 +01:00
|
|
|
}
|
2021-06-03 19:43:01 +02:00
|
|
|
`,
|
2020-11-26 01:06:39 +01:00
|
|
|
expectedBazelTarget: `soong_module(
|
|
|
|
name = "foo",
|
2021-01-25 10:36:04 +01:00
|
|
|
soong_module_name = "foo",
|
|
|
|
soong_module_type = "custom",
|
|
|
|
soong_module_variant = "",
|
|
|
|
soong_module_deps = [
|
2020-11-26 01:06:39 +01:00
|
|
|
],
|
2021-06-03 19:43:01 +02:00
|
|
|
bool_prop = False,
|
2021-04-08 16:40:57 +02:00
|
|
|
required = ["bar"],
|
2020-11-26 01:06:39 +01:00
|
|
|
)`,
|
|
|
|
},
|
|
|
|
{
|
2021-06-03 19:43:01 +02:00
|
|
|
description: "list of strings",
|
2020-11-26 01:06:39 +01:00
|
|
|
bp: `custom {
|
2021-06-03 19:43:01 +02:00
|
|
|
name: "foo",
|
|
|
|
target_required: ["qux", "bazqux"],
|
2020-11-26 01:06:39 +01:00
|
|
|
}
|
2021-06-03 19:43:01 +02:00
|
|
|
`,
|
2020-11-26 01:06:39 +01:00
|
|
|
expectedBazelTarget: `soong_module(
|
|
|
|
name = "foo",
|
2021-01-25 10:36:04 +01:00
|
|
|
soong_module_name = "foo",
|
|
|
|
soong_module_type = "custom",
|
|
|
|
soong_module_variant = "",
|
|
|
|
soong_module_deps = [
|
2020-11-26 01:06:39 +01:00
|
|
|
],
|
2021-06-03 19:43:01 +02:00
|
|
|
bool_prop = False,
|
2020-11-26 01:06:39 +01:00
|
|
|
target_required = [
|
|
|
|
"qux",
|
|
|
|
"bazqux",
|
|
|
|
],
|
|
|
|
)`,
|
|
|
|
},
|
|
|
|
{
|
2021-06-03 19:43:01 +02:00
|
|
|
description: "dist/dists",
|
2020-11-26 01:06:39 +01:00
|
|
|
bp: `custom {
|
2021-06-03 19:43:01 +02:00
|
|
|
name: "foo",
|
|
|
|
dist: {
|
|
|
|
targets: ["goal_foo"],
|
|
|
|
tag: ".foo",
|
|
|
|
},
|
|
|
|
dists: [{
|
|
|
|
targets: ["goal_bar"],
|
|
|
|
tag: ".bar",
|
|
|
|
}],
|
2020-11-26 01:06:39 +01:00
|
|
|
}
|
2021-06-03 19:43:01 +02:00
|
|
|
`,
|
2020-11-26 01:06:39 +01:00
|
|
|
expectedBazelTarget: `soong_module(
|
|
|
|
name = "foo",
|
2021-01-25 10:36:04 +01:00
|
|
|
soong_module_name = "foo",
|
|
|
|
soong_module_type = "custom",
|
|
|
|
soong_module_variant = "",
|
|
|
|
soong_module_deps = [
|
2020-11-26 01:06:39 +01:00
|
|
|
],
|
2021-06-03 19:43:01 +02:00
|
|
|
bool_prop = False,
|
2020-11-26 01:06:39 +01:00
|
|
|
dist = {
|
|
|
|
"tag": ".foo",
|
2021-04-08 16:40:57 +02:00
|
|
|
"targets": ["goal_foo"],
|
2020-11-26 01:06:39 +01:00
|
|
|
},
|
2021-04-08 16:40:57 +02:00
|
|
|
dists = [{
|
|
|
|
"tag": ".bar",
|
|
|
|
"targets": ["goal_bar"],
|
|
|
|
}],
|
2020-11-26 01:06:39 +01:00
|
|
|
)`,
|
|
|
|
},
|
|
|
|
{
|
2021-06-03 19:43:01 +02:00
|
|
|
description: "put it together",
|
2020-11-26 01:06:39 +01:00
|
|
|
bp: `custom {
|
2021-06-03 19:43:01 +02:00
|
|
|
name: "foo",
|
|
|
|
required: ["bar"],
|
|
|
|
target_required: ["qux", "bazqux"],
|
|
|
|
bool_prop: true,
|
|
|
|
owner: "custom_owner",
|
|
|
|
dists: [
|
|
|
|
{
|
|
|
|
tag: ".tag",
|
|
|
|
targets: ["my_goal"],
|
|
|
|
},
|
|
|
|
],
|
2020-11-26 01:06:39 +01:00
|
|
|
}
|
2021-06-03 19:43:01 +02:00
|
|
|
`,
|
2020-11-26 01:06:39 +01:00
|
|
|
expectedBazelTarget: `soong_module(
|
|
|
|
name = "foo",
|
2021-01-25 10:36:04 +01:00
|
|
|
soong_module_name = "foo",
|
|
|
|
soong_module_type = "custom",
|
|
|
|
soong_module_variant = "",
|
|
|
|
soong_module_deps = [
|
2020-11-26 01:06:39 +01:00
|
|
|
],
|
2021-06-03 19:43:01 +02:00
|
|
|
bool_prop = True,
|
2021-04-08 16:40:57 +02:00
|
|
|
dists = [{
|
|
|
|
"tag": ".tag",
|
|
|
|
"targets": ["my_goal"],
|
|
|
|
}],
|
2020-11-26 01:06:39 +01:00
|
|
|
owner = "custom_owner",
|
2021-04-08 16:40:57 +02:00
|
|
|
required = ["bar"],
|
2020-11-26 01:06:39 +01:00
|
|
|
target_required = [
|
|
|
|
"qux",
|
|
|
|
"bazqux",
|
|
|
|
],
|
|
|
|
)`,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
dir := "."
|
|
|
|
for _, testCase := range testCases {
|
2021-06-03 19:43:01 +02:00
|
|
|
t.Run(testCase.description, func(t *testing.T) {
|
|
|
|
config := android.TestConfig(buildDir, nil, testCase.bp, nil)
|
|
|
|
ctx := android.NewTestContext(config)
|
2021-02-19 06:48:40 +01:00
|
|
|
|
2021-06-03 19:43:01 +02:00
|
|
|
ctx.RegisterModuleType("custom", customModuleFactory)
|
|
|
|
ctx.Register()
|
2020-11-26 01:06:39 +01:00
|
|
|
|
2021-06-03 19:43:01 +02:00
|
|
|
_, errs := ctx.ParseFileList(dir, []string{"Android.bp"})
|
|
|
|
android.FailIfErrored(t, errs)
|
|
|
|
_, errs = ctx.PrepareBuildActions(config)
|
|
|
|
android.FailIfErrored(t, errs)
|
2020-11-26 01:06:39 +01:00
|
|
|
|
2021-06-03 19:43:01 +02:00
|
|
|
codegenCtx := NewCodegenContext(config, *ctx.Context, QueryView)
|
2021-08-26 14:37:59 +02:00
|
|
|
bazelTargets, err := generateBazelTargetsForDir(codegenCtx, dir)
|
|
|
|
android.FailIfErrored(t, err)
|
2021-06-03 19:43:01 +02:00
|
|
|
if actualCount, expectedCount := len(bazelTargets), 1; actualCount != expectedCount {
|
|
|
|
t.Fatalf("Expected %d bazel target, got %d", expectedCount, actualCount)
|
|
|
|
}
|
2020-11-26 01:06:39 +01:00
|
|
|
|
2021-06-03 19:43:01 +02:00
|
|
|
actualBazelTarget := bazelTargets[0]
|
|
|
|
if actualBazelTarget.content != testCase.expectedBazelTarget {
|
|
|
|
t.Errorf(
|
|
|
|
"Expected generated Bazel target to be '%s', got '%s'",
|
|
|
|
testCase.expectedBazelTarget,
|
|
|
|
actualBazelTarget.content,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
})
|
2020-12-14 14:25:34 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGenerateBazelTargetModules(t *testing.T) {
|
2021-09-02 13:44:42 +02:00
|
|
|
testCases := []bp2buildTestCase{
|
2020-12-14 14:25:34 +01:00
|
|
|
{
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `custom {
|
2020-12-14 14:25:34 +01:00
|
|
|
name: "foo",
|
|
|
|
string_list_prop: ["a", "b"],
|
|
|
|
string_prop: "a",
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2020-12-14 14:25:34 +01:00
|
|
|
}`,
|
2021-04-22 00:15:34 +02:00
|
|
|
expectedBazelTargets: []string{`custom(
|
2020-12-14 14:25:34 +01:00
|
|
|
name = "foo",
|
|
|
|
string_list_prop = [
|
|
|
|
"a",
|
|
|
|
"b",
|
|
|
|
],
|
|
|
|
string_prop = "a",
|
2021-03-30 15:08:36 +02:00
|
|
|
)`,
|
2021-04-22 00:15:34 +02:00
|
|
|
},
|
2021-03-30 15:08:36 +02:00
|
|
|
},
|
|
|
|
{
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `custom {
|
2021-03-30 15:08:36 +02:00
|
|
|
name: "control_characters",
|
|
|
|
string_list_prop: ["\t", "\n"],
|
|
|
|
string_prop: "a\t\n\r",
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
2021-04-22 00:15:34 +02:00
|
|
|
expectedBazelTargets: []string{`custom(
|
2021-03-30 15:08:36 +02:00
|
|
|
name = "control_characters",
|
|
|
|
string_list_prop = [
|
|
|
|
"\t",
|
|
|
|
"\n",
|
|
|
|
],
|
|
|
|
string_prop = "a\t\n\r",
|
2020-12-14 14:25:34 +01:00
|
|
|
)`,
|
2021-04-22 00:15:34 +02:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `custom {
|
2021-04-22 00:15:34 +02:00
|
|
|
name: "has_dep",
|
|
|
|
arch_paths: [":dep"],
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}
|
|
|
|
|
|
|
|
custom {
|
|
|
|
name: "dep",
|
|
|
|
arch_paths: ["abc"],
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`custom(
|
|
|
|
name = "dep",
|
|
|
|
arch_paths = ["abc"],
|
|
|
|
)`,
|
|
|
|
`custom(
|
|
|
|
name = "has_dep",
|
|
|
|
arch_paths = [":dep"],
|
|
|
|
)`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `custom {
|
2021-04-22 00:15:34 +02:00
|
|
|
name: "arch_paths",
|
|
|
|
arch: {
|
|
|
|
x86: {
|
|
|
|
arch_paths: ["abc"],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`custom(
|
|
|
|
name = "arch_paths",
|
|
|
|
arch_paths = select({
|
|
|
|
"//build/bazel/platforms/arch:x86": ["abc"],
|
|
|
|
"//conditions:default": [],
|
|
|
|
}),
|
|
|
|
)`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `custom {
|
2021-04-22 00:15:34 +02:00
|
|
|
name: "has_dep",
|
|
|
|
arch: {
|
|
|
|
x86: {
|
|
|
|
arch_paths: [":dep"],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}
|
|
|
|
|
|
|
|
custom {
|
|
|
|
name: "dep",
|
|
|
|
arch_paths: ["abc"],
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`custom(
|
|
|
|
name = "dep",
|
|
|
|
arch_paths = ["abc"],
|
|
|
|
)`,
|
|
|
|
`custom(
|
|
|
|
name = "has_dep",
|
|
|
|
arch_paths = select({
|
|
|
|
"//build/bazel/platforms/arch:x86": [":dep"],
|
|
|
|
"//conditions:default": [],
|
|
|
|
}),
|
2021-09-14 17:17:21 +02:00
|
|
|
)`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
blueprint: `custom {
|
|
|
|
name: "embedded_props",
|
|
|
|
embedded_prop: "abc",
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`custom(
|
|
|
|
name = "embedded_props",
|
|
|
|
embedded_attr = "abc",
|
|
|
|
)`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
blueprint: `custom {
|
|
|
|
name: "ptr_to_embedded_props",
|
|
|
|
other_embedded_prop: "abc",
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`custom(
|
|
|
|
name = "ptr_to_embedded_props",
|
|
|
|
other_embedded_attr = "abc",
|
2021-04-22 00:15:34 +02:00
|
|
|
)`,
|
|
|
|
},
|
2020-12-14 14:25:34 +01:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
dir := "."
|
|
|
|
for _, testCase := range testCases {
|
2021-09-02 13:44:42 +02:00
|
|
|
config := android.TestConfig(buildDir, nil, testCase.blueprint, nil)
|
2020-12-14 14:25:34 +01:00
|
|
|
ctx := android.NewTestContext(config)
|
2021-02-19 06:48:40 +01:00
|
|
|
|
2021-08-04 21:17:02 +02:00
|
|
|
registerCustomModuleForBp2buildConversion(ctx)
|
2020-12-14 14:25:34 +01:00
|
|
|
|
|
|
|
_, errs := ctx.ParseFileList(dir, []string{"Android.bp"})
|
2021-09-02 13:44:42 +02:00
|
|
|
if errored(t, testCase, errs) {
|
2021-01-26 15:18:53 +01:00
|
|
|
continue
|
|
|
|
}
|
2020-12-14 14:25:34 +01:00
|
|
|
_, errs = ctx.ResolveDependencies(config)
|
2021-09-02 13:44:42 +02:00
|
|
|
if errored(t, testCase, errs) {
|
2021-01-26 15:18:53 +01:00
|
|
|
continue
|
|
|
|
}
|
2020-12-14 14:25:34 +01:00
|
|
|
|
2021-02-19 06:48:40 +01:00
|
|
|
codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build)
|
2021-08-26 14:37:59 +02:00
|
|
|
bazelTargets, err := generateBazelTargetsForDir(codegenCtx, dir)
|
|
|
|
android.FailIfErrored(t, err)
|
2021-02-19 06:48:40 +01:00
|
|
|
|
2021-04-22 00:15:34 +02:00
|
|
|
if actualCount, expectedCount := len(bazelTargets), len(testCase.expectedBazelTargets); actualCount != expectedCount {
|
2021-01-26 15:18:53 +01:00
|
|
|
t.Errorf("Expected %d bazel target, got %d", expectedCount, actualCount)
|
|
|
|
} else {
|
2021-04-22 00:15:34 +02:00
|
|
|
for i, expectedBazelTarget := range testCase.expectedBazelTargets {
|
|
|
|
actualBazelTarget := bazelTargets[i]
|
|
|
|
if actualBazelTarget.content != expectedBazelTarget {
|
|
|
|
t.Errorf(
|
|
|
|
"Expected generated Bazel target to be '%s', got '%s'",
|
|
|
|
expectedBazelTarget,
|
|
|
|
actualBazelTarget.content,
|
|
|
|
)
|
|
|
|
}
|
2021-01-26 15:18:53 +01:00
|
|
|
}
|
2020-11-26 01:06:39 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-01-21 09:20:18 +01:00
|
|
|
|
2021-01-27 03:58:43 +01:00
|
|
|
func TestLoadStatements(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
bazelTargets BazelTargets
|
|
|
|
expectedLoadStatements string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
bazelTargets: BazelTargets{
|
|
|
|
BazelTarget{
|
|
|
|
name: "foo",
|
|
|
|
ruleClass: "cc_library",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:cc.bzl",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedLoadStatements: `load("//build/bazel/rules:cc.bzl", "cc_library")`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
bazelTargets: BazelTargets{
|
|
|
|
BazelTarget{
|
|
|
|
name: "foo",
|
|
|
|
ruleClass: "cc_library",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:cc.bzl",
|
|
|
|
},
|
|
|
|
BazelTarget{
|
|
|
|
name: "bar",
|
|
|
|
ruleClass: "cc_library",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:cc.bzl",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedLoadStatements: `load("//build/bazel/rules:cc.bzl", "cc_library")`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
bazelTargets: BazelTargets{
|
|
|
|
BazelTarget{
|
|
|
|
name: "foo",
|
|
|
|
ruleClass: "cc_library",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:cc.bzl",
|
|
|
|
},
|
|
|
|
BazelTarget{
|
|
|
|
name: "bar",
|
|
|
|
ruleClass: "cc_binary",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:cc.bzl",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedLoadStatements: `load("//build/bazel/rules:cc.bzl", "cc_binary", "cc_library")`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
bazelTargets: BazelTargets{
|
|
|
|
BazelTarget{
|
|
|
|
name: "foo",
|
|
|
|
ruleClass: "cc_library",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:cc.bzl",
|
|
|
|
},
|
|
|
|
BazelTarget{
|
|
|
|
name: "bar",
|
|
|
|
ruleClass: "cc_binary",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:cc.bzl",
|
|
|
|
},
|
|
|
|
BazelTarget{
|
|
|
|
name: "baz",
|
|
|
|
ruleClass: "java_binary",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:java.bzl",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedLoadStatements: `load("//build/bazel/rules:cc.bzl", "cc_binary", "cc_library")
|
|
|
|
load("//build/bazel/rules:java.bzl", "java_binary")`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
bazelTargets: BazelTargets{
|
|
|
|
BazelTarget{
|
|
|
|
name: "foo",
|
|
|
|
ruleClass: "cc_binary",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:cc.bzl",
|
|
|
|
},
|
|
|
|
BazelTarget{
|
|
|
|
name: "bar",
|
|
|
|
ruleClass: "java_binary",
|
|
|
|
bzlLoadLocation: "//build/bazel/rules:java.bzl",
|
|
|
|
},
|
|
|
|
BazelTarget{
|
|
|
|
name: "baz",
|
|
|
|
ruleClass: "genrule",
|
|
|
|
// Note: no bzlLoadLocation for native rules
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedLoadStatements: `load("//build/bazel/rules:cc.bzl", "cc_binary")
|
|
|
|
load("//build/bazel/rules:java.bzl", "java_binary")`,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, testCase := range testCases {
|
|
|
|
actual := testCase.bazelTargets.LoadStatements()
|
|
|
|
expected := testCase.expectedLoadStatements
|
|
|
|
if actual != expected {
|
|
|
|
t.Fatalf("Expected load statements to be %s, got %s", expected, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGenerateBazelTargetModules_OneToMany_LoadedFromStarlark(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
bp string
|
|
|
|
expectedBazelTarget string
|
|
|
|
expectedBazelTargetCount int
|
|
|
|
expectedLoadStatements string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
bp: `custom {
|
|
|
|
name: "bar",
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2021-01-27 03:58:43 +01:00
|
|
|
}`,
|
|
|
|
expectedBazelTarget: `my_library(
|
|
|
|
name = "bar",
|
|
|
|
)
|
|
|
|
|
|
|
|
proto_library(
|
|
|
|
name = "bar_proto_library_deps",
|
2021-08-11 06:17:36 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
my_proto_library(
|
|
|
|
name = "bar_my_proto_library_deps",
|
2021-01-27 03:58:43 +01:00
|
|
|
)`,
|
|
|
|
expectedBazelTargetCount: 3,
|
|
|
|
expectedLoadStatements: `load("//build/bazel/rules:proto.bzl", "my_proto_library", "proto_library")
|
|
|
|
load("//build/bazel/rules:rules.bzl", "my_library")`,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
dir := "."
|
|
|
|
for _, testCase := range testCases {
|
|
|
|
config := android.TestConfig(buildDir, nil, testCase.bp, nil)
|
|
|
|
ctx := android.NewTestContext(config)
|
|
|
|
ctx.RegisterModuleType("custom", customModuleFactory)
|
2021-03-10 08:05:59 +01:00
|
|
|
ctx.RegisterBp2BuildMutator("custom", customBp2BuildMutatorFromStarlark)
|
2021-01-27 03:58:43 +01:00
|
|
|
ctx.RegisterForBazelConversion()
|
|
|
|
|
|
|
|
_, errs := ctx.ParseFileList(dir, []string{"Android.bp"})
|
|
|
|
android.FailIfErrored(t, errs)
|
|
|
|
_, errs = ctx.ResolveDependencies(config)
|
|
|
|
android.FailIfErrored(t, errs)
|
|
|
|
|
2021-02-19 06:48:40 +01:00
|
|
|
codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build)
|
2021-08-26 14:37:59 +02:00
|
|
|
bazelTargets, err := generateBazelTargetsForDir(codegenCtx, dir)
|
|
|
|
android.FailIfErrored(t, err)
|
2021-01-27 03:58:43 +01:00
|
|
|
if actualCount := len(bazelTargets); actualCount != testCase.expectedBazelTargetCount {
|
|
|
|
t.Fatalf("Expected %d bazel target, got %d", testCase.expectedBazelTargetCount, actualCount)
|
|
|
|
}
|
|
|
|
|
|
|
|
actualBazelTargets := bazelTargets.String()
|
|
|
|
if actualBazelTargets != testCase.expectedBazelTarget {
|
|
|
|
t.Errorf(
|
|
|
|
"Expected generated Bazel target to be '%s', got '%s'",
|
|
|
|
testCase.expectedBazelTarget,
|
|
|
|
actualBazelTargets,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
actualLoadStatements := bazelTargets.LoadStatements()
|
|
|
|
if actualLoadStatements != testCase.expectedLoadStatements {
|
|
|
|
t.Errorf(
|
|
|
|
"Expected generated load statements to be '%s', got '%s'",
|
|
|
|
testCase.expectedLoadStatements,
|
|
|
|
actualLoadStatements,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-21 09:20:18 +01:00
|
|
|
func TestModuleTypeBp2Build(t *testing.T) {
|
2021-09-02 13:44:42 +02:00
|
|
|
testCases := []bp2buildTestCase{
|
2021-02-16 21:00:05 +01:00
|
|
|
{
|
|
|
|
description: "filegroup with does not specify srcs",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-02-16 21:00:05 +01:00
|
|
|
name: "fg_foo",
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{
|
|
|
|
`filegroup(
|
|
|
|
name = "fg_foo",
|
|
|
|
)`,
|
|
|
|
},
|
|
|
|
},
|
2021-01-21 09:20:18 +01:00
|
|
|
{
|
2021-01-27 03:57:27 +01:00
|
|
|
description: "filegroup with no srcs",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-01-26 15:18:53 +01:00
|
|
|
name: "fg_foo",
|
|
|
|
srcs: [],
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2021-01-21 09:20:18 +01:00
|
|
|
}`,
|
2021-01-26 15:18:53 +01:00
|
|
|
expectedBazelTargets: []string{
|
|
|
|
`filegroup(
|
|
|
|
name = "fg_foo",
|
2021-01-21 09:20:18 +01:00
|
|
|
)`,
|
2021-01-26 15:18:53 +01:00
|
|
|
},
|
2021-01-21 09:20:18 +01:00
|
|
|
},
|
|
|
|
{
|
2021-01-27 03:57:27 +01:00
|
|
|
description: "filegroup with srcs",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-01-26 15:18:53 +01:00
|
|
|
name: "fg_foo",
|
|
|
|
srcs: ["a", "b"],
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2021-01-21 09:20:18 +01:00
|
|
|
}`,
|
2021-01-26 15:18:53 +01:00
|
|
|
expectedBazelTargets: []string{`filegroup(
|
|
|
|
name = "fg_foo",
|
2021-01-21 09:20:18 +01:00
|
|
|
srcs = [
|
|
|
|
"a",
|
|
|
|
"b",
|
|
|
|
],
|
2020-12-14 15:09:52 +01:00
|
|
|
)`,
|
2021-01-26 15:18:53 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "filegroup with excludes srcs",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-01-26 15:18:53 +01:00
|
|
|
name: "fg_foo",
|
|
|
|
srcs: ["a", "b"],
|
|
|
|
exclude_srcs: ["a"],
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2021-01-26 15:18:53 +01:00
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`filegroup(
|
|
|
|
name = "fg_foo",
|
2021-04-08 16:40:57 +02:00
|
|
|
srcs = ["b"],
|
2021-01-26 15:18:53 +01:00
|
|
|
)`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "filegroup with glob",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-01-26 15:18:53 +01:00
|
|
|
name: "foo",
|
|
|
|
srcs: ["**/*.txt"],
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2021-01-26 15:18:53 +01:00
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`filegroup(
|
|
|
|
name = "foo",
|
|
|
|
srcs = [
|
|
|
|
"other/a.txt",
|
|
|
|
"other/b.txt",
|
|
|
|
"other/subdir/a.txt",
|
|
|
|
],
|
|
|
|
)`,
|
|
|
|
},
|
2021-09-02 13:44:42 +02:00
|
|
|
filesystem: map[string]string{
|
2021-01-26 15:18:53 +01:00
|
|
|
"other/a.txt": "",
|
|
|
|
"other/b.txt": "",
|
|
|
|
"other/subdir/a.txt": "",
|
|
|
|
"other/file": "",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "filegroup with glob in subdir",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-01-26 15:18:53 +01:00
|
|
|
name: "foo",
|
|
|
|
srcs: ["a.txt"],
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2021-01-26 15:18:53 +01:00
|
|
|
}`,
|
|
|
|
dir: "other",
|
|
|
|
expectedBazelTargets: []string{`filegroup(
|
|
|
|
name = "fg_foo",
|
|
|
|
srcs = [
|
|
|
|
"a.txt",
|
|
|
|
"b.txt",
|
|
|
|
"subdir/a.txt",
|
|
|
|
],
|
|
|
|
)`,
|
|
|
|
},
|
2021-09-02 13:44:42 +02:00
|
|
|
filesystem: map[string]string{
|
2021-01-26 15:18:53 +01:00
|
|
|
"other/Android.bp": `filegroup {
|
|
|
|
name: "fg_foo",
|
|
|
|
srcs: ["**/*.txt"],
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2021-01-26 15:18:53 +01:00
|
|
|
}`,
|
|
|
|
"other/a.txt": "",
|
|
|
|
"other/b.txt": "",
|
|
|
|
"other/subdir/a.txt": "",
|
|
|
|
"other/file": "",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "depends_on_other_dir_module",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-01-26 15:18:53 +01:00
|
|
|
name: "foobar",
|
|
|
|
srcs: [
|
2021-04-08 16:40:57 +02:00
|
|
|
":foo",
|
2021-01-26 15:18:53 +01:00
|
|
|
"c",
|
|
|
|
],
|
2021-02-05 09:03:24 +01:00
|
|
|
bazel_module: { bp2build_available: true },
|
2021-01-26 15:18:53 +01:00
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`filegroup(
|
|
|
|
name = "foobar",
|
|
|
|
srcs = [
|
|
|
|
"//other:foo",
|
|
|
|
"c",
|
|
|
|
],
|
|
|
|
)`,
|
|
|
|
},
|
2021-09-02 13:44:42 +02:00
|
|
|
filesystem: map[string]string{
|
2021-01-26 15:18:53 +01:00
|
|
|
"other/Android.bp": `filegroup {
|
|
|
|
name: "foo",
|
|
|
|
srcs: ["a", "b"],
|
2021-08-26 14:37:59 +02:00
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "depends_on_other_unconverted_module_error",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
|
|
|
unconvertedDepsMode: errorModulesUnconvertedDeps,
|
|
|
|
blueprint: `filegroup {
|
|
|
|
name: "foobar",
|
|
|
|
srcs: [
|
|
|
|
":foo",
|
|
|
|
"c",
|
|
|
|
],
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedErr: fmt.Errorf(`"foobar" depends on unconverted modules: foo`),
|
|
|
|
filesystem: map[string]string{
|
|
|
|
"other/Android.bp": `filegroup {
|
|
|
|
name: "foo",
|
|
|
|
srcs: ["a", "b"],
|
2021-01-26 15:18:53 +01:00
|
|
|
}`,
|
|
|
|
},
|
2020-12-14 15:09:52 +01:00
|
|
|
},
|
2021-01-21 09:20:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, testCase := range testCases {
|
2021-08-26 14:37:59 +02:00
|
|
|
t.Run(testCase.description, func(t *testing.T) {
|
|
|
|
runBp2BuildTestCase(t, func(ctx android.RegistrationContext) {}, testCase)
|
|
|
|
})
|
2021-01-26 15:18:53 +01:00
|
|
|
}
|
|
|
|
}
|
2021-01-21 09:20:18 +01:00
|
|
|
|
2021-02-01 06:23:25 +01:00
|
|
|
type bp2buildMutator = func(android.TopDownMutatorContext)
|
|
|
|
|
2021-03-10 08:05:59 +01:00
|
|
|
func TestAllowlistingBp2buildTargetsExplicitly(t *testing.T) {
|
2021-02-05 09:03:24 +01:00
|
|
|
testCases := []struct {
|
|
|
|
moduleTypeUnderTest string
|
|
|
|
moduleTypeUnderTestFactory android.ModuleFactory
|
|
|
|
moduleTypeUnderTestBp2BuildMutator bp2buildMutator
|
|
|
|
bp string
|
|
|
|
expectedCount int
|
|
|
|
description string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
description: "explicitly unavailable",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
|
|
|
bp: `filegroup {
|
|
|
|
name: "foo",
|
|
|
|
srcs: ["a", "b"],
|
|
|
|
bazel_module: { bp2build_available: false },
|
|
|
|
}`,
|
|
|
|
expectedCount: 0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "implicitly unavailable",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
|
|
|
bp: `filegroup {
|
|
|
|
name: "foo",
|
|
|
|
srcs: ["a", "b"],
|
|
|
|
}`,
|
|
|
|
expectedCount: 0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "explicitly available",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
|
|
|
bp: `filegroup {
|
|
|
|
name: "foo",
|
|
|
|
srcs: ["a", "b"],
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedCount: 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "generates more than 1 target if needed",
|
|
|
|
moduleTypeUnderTest: "custom",
|
|
|
|
moduleTypeUnderTestFactory: customModuleFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: customBp2BuildMutatorFromStarlark,
|
|
|
|
bp: `custom {
|
|
|
|
name: "foo",
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedCount: 3,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
dir := "."
|
|
|
|
for _, testCase := range testCases {
|
2021-08-11 06:17:36 +02:00
|
|
|
t.Run(testCase.description, func(t *testing.T) {
|
|
|
|
config := android.TestConfig(buildDir, nil, testCase.bp, nil)
|
|
|
|
ctx := android.NewTestContext(config)
|
|
|
|
ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory)
|
|
|
|
ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
|
|
|
|
ctx.RegisterForBazelConversion()
|
2021-02-05 09:03:24 +01:00
|
|
|
|
2021-08-11 06:17:36 +02:00
|
|
|
_, errs := ctx.ParseFileList(dir, []string{"Android.bp"})
|
|
|
|
android.FailIfErrored(t, errs)
|
|
|
|
_, errs = ctx.ResolveDependencies(config)
|
|
|
|
android.FailIfErrored(t, errs)
|
2021-02-05 09:03:24 +01:00
|
|
|
|
2021-08-11 06:17:36 +02:00
|
|
|
codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build)
|
2021-08-26 14:37:59 +02:00
|
|
|
bazelTargets, err := generateBazelTargetsForDir(codegenCtx, dir)
|
|
|
|
android.FailIfErrored(t, err)
|
2021-08-11 06:17:36 +02:00
|
|
|
if actualCount := len(bazelTargets); actualCount != testCase.expectedCount {
|
|
|
|
t.Fatalf("%s: Expected %d bazel target, got %d", testCase.description, testCase.expectedCount, actualCount)
|
|
|
|
}
|
|
|
|
})
|
2021-02-05 09:03:24 +01:00
|
|
|
}
|
|
|
|
}
|
2021-02-17 19:22:03 +01:00
|
|
|
|
2021-03-10 08:05:59 +01:00
|
|
|
func TestAllowlistingBp2buildTargetsWithConfig(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
moduleTypeUnderTest string
|
|
|
|
moduleTypeUnderTestFactory android.ModuleFactory
|
|
|
|
moduleTypeUnderTestBp2BuildMutator bp2buildMutator
|
|
|
|
expectedCount map[string]int
|
|
|
|
description string
|
|
|
|
bp2buildConfig android.Bp2BuildConfig
|
|
|
|
checkDir string
|
|
|
|
fs map[string]string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
description: "test bp2build config package and subpackages config",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
|
|
|
expectedCount: map[string]int{
|
|
|
|
"migrated": 1,
|
|
|
|
"migrated/but_not_really": 0,
|
|
|
|
"migrated/but_not_really/but_really": 1,
|
|
|
|
"not_migrated": 0,
|
|
|
|
"also_not_migrated": 0,
|
|
|
|
},
|
|
|
|
bp2buildConfig: android.Bp2BuildConfig{
|
|
|
|
"migrated": android.Bp2BuildDefaultTrueRecursively,
|
|
|
|
"migrated/but_not_really": android.Bp2BuildDefaultFalse,
|
|
|
|
"not_migrated": android.Bp2BuildDefaultFalse,
|
|
|
|
},
|
|
|
|
fs: map[string]string{
|
|
|
|
"migrated/Android.bp": `filegroup { name: "a" }`,
|
|
|
|
"migrated/but_not_really/Android.bp": `filegroup { name: "b" }`,
|
|
|
|
"migrated/but_not_really/but_really/Android.bp": `filegroup { name: "c" }`,
|
|
|
|
"not_migrated/Android.bp": `filegroup { name: "d" }`,
|
|
|
|
"also_not_migrated/Android.bp": `filegroup { name: "e" }`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "test bp2build config opt-in and opt-out",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
|
|
|
expectedCount: map[string]int{
|
|
|
|
"package-opt-in": 2,
|
|
|
|
"package-opt-in/subpackage": 0,
|
|
|
|
"package-opt-out": 1,
|
|
|
|
"package-opt-out/subpackage": 0,
|
|
|
|
},
|
|
|
|
bp2buildConfig: android.Bp2BuildConfig{
|
|
|
|
"package-opt-in": android.Bp2BuildDefaultFalse,
|
|
|
|
"package-opt-out": android.Bp2BuildDefaultTrueRecursively,
|
|
|
|
},
|
|
|
|
fs: map[string]string{
|
|
|
|
"package-opt-in/Android.bp": `
|
|
|
|
filegroup { name: "opt-in-a" }
|
|
|
|
filegroup { name: "opt-in-b", bazel_module: { bp2build_available: true } }
|
|
|
|
filegroup { name: "opt-in-c", bazel_module: { bp2build_available: true } }
|
|
|
|
`,
|
|
|
|
|
|
|
|
"package-opt-in/subpackage/Android.bp": `
|
|
|
|
filegroup { name: "opt-in-d" } // parent package not configured to DefaultTrueRecursively
|
|
|
|
`,
|
|
|
|
|
|
|
|
"package-opt-out/Android.bp": `
|
|
|
|
filegroup { name: "opt-out-a" }
|
|
|
|
filegroup { name: "opt-out-b", bazel_module: { bp2build_available: false } }
|
|
|
|
filegroup { name: "opt-out-c", bazel_module: { bp2build_available: false } }
|
|
|
|
`,
|
|
|
|
|
|
|
|
"package-opt-out/subpackage/Android.bp": `
|
|
|
|
filegroup { name: "opt-out-g", bazel_module: { bp2build_available: false } }
|
|
|
|
filegroup { name: "opt-out-h", bazel_module: { bp2build_available: false } }
|
|
|
|
`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
dir := "."
|
|
|
|
for _, testCase := range testCases {
|
|
|
|
fs := make(map[string][]byte)
|
|
|
|
toParse := []string{
|
|
|
|
"Android.bp",
|
|
|
|
}
|
|
|
|
for f, content := range testCase.fs {
|
|
|
|
if strings.HasSuffix(f, "Android.bp") {
|
|
|
|
toParse = append(toParse, f)
|
|
|
|
}
|
|
|
|
fs[f] = []byte(content)
|
|
|
|
}
|
|
|
|
config := android.TestConfig(buildDir, nil, "", fs)
|
|
|
|
ctx := android.NewTestContext(config)
|
|
|
|
ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory)
|
|
|
|
ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
|
|
|
|
ctx.RegisterBp2BuildConfig(testCase.bp2buildConfig)
|
|
|
|
ctx.RegisterForBazelConversion()
|
|
|
|
|
|
|
|
_, errs := ctx.ParseFileList(dir, toParse)
|
|
|
|
android.FailIfErrored(t, errs)
|
|
|
|
_, errs = ctx.ResolveDependencies(config)
|
|
|
|
android.FailIfErrored(t, errs)
|
|
|
|
|
|
|
|
codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build)
|
|
|
|
|
|
|
|
// For each directory, test that the expected number of generated targets is correct.
|
|
|
|
for dir, expectedCount := range testCase.expectedCount {
|
2021-08-26 14:37:59 +02:00
|
|
|
bazelTargets, err := generateBazelTargetsForDir(codegenCtx, dir)
|
|
|
|
android.FailIfErrored(t, err)
|
2021-03-10 08:05:59 +01:00
|
|
|
if actualCount := len(bazelTargets); actualCount != expectedCount {
|
|
|
|
t.Fatalf(
|
|
|
|
"%s: Expected %d bazel target for %s package, got %d",
|
|
|
|
testCase.description,
|
|
|
|
expectedCount,
|
|
|
|
dir,
|
|
|
|
actualCount)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-17 19:22:03 +01:00
|
|
|
func TestCombineBuildFilesBp2buildTargets(t *testing.T) {
|
2021-09-02 13:44:42 +02:00
|
|
|
testCases := []bp2buildTestCase{
|
2021-02-17 19:22:03 +01:00
|
|
|
{
|
|
|
|
description: "filegroup bazel_module.label",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-02-17 19:22:03 +01:00
|
|
|
name: "fg_foo",
|
|
|
|
bazel_module: { label: "//other:fg_foo" },
|
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{
|
|
|
|
`// BUILD file`,
|
|
|
|
},
|
2021-09-02 13:44:42 +02:00
|
|
|
filesystem: map[string]string{
|
2021-02-17 19:22:03 +01:00
|
|
|
"other/BUILD.bazel": `// BUILD file`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "multiple bazel_module.label same BUILD",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-06-17 07:43:19 +02:00
|
|
|
name: "fg_foo",
|
|
|
|
bazel_module: { label: "//other:fg_foo" },
|
|
|
|
}
|
2021-02-17 19:22:03 +01:00
|
|
|
|
2021-06-17 07:43:19 +02:00
|
|
|
filegroup {
|
|
|
|
name: "foo",
|
|
|
|
bazel_module: { label: "//other:foo" },
|
|
|
|
}`,
|
2021-02-17 19:22:03 +01:00
|
|
|
expectedBazelTargets: []string{
|
|
|
|
`// BUILD file`,
|
|
|
|
},
|
2021-09-02 13:44:42 +02:00
|
|
|
filesystem: map[string]string{
|
2021-02-17 19:22:03 +01:00
|
|
|
"other/BUILD.bazel": `// BUILD file`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
2021-06-17 07:43:19 +02:00
|
|
|
description: "filegroup bazel_module.label and bp2build in subdir",
|
2021-02-17 19:22:03 +01:00
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-06-17 07:43:19 +02:00
|
|
|
dir: "other",
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: ``,
|
|
|
|
filesystem: map[string]string{
|
2021-06-17 07:43:19 +02:00
|
|
|
"other/Android.bp": `filegroup {
|
|
|
|
name: "fg_foo",
|
|
|
|
bazel_module: {
|
|
|
|
bp2build_available: true,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
filegroup {
|
|
|
|
name: "fg_bar",
|
|
|
|
bazel_module: {
|
|
|
|
label: "//other:fg_bar"
|
|
|
|
},
|
|
|
|
}`,
|
|
|
|
"other/BUILD.bazel": `// definition for fg_bar`,
|
|
|
|
},
|
2021-02-17 19:22:03 +01:00
|
|
|
expectedBazelTargets: []string{
|
|
|
|
`filegroup(
|
|
|
|
name = "fg_foo",
|
2021-06-17 07:43:19 +02:00
|
|
|
)`, `// definition for fg_bar`,
|
2021-02-17 19:22:03 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "filegroup bazel_module.label and filegroup bp2build",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-06-17 07:43:19 +02:00
|
|
|
name: "fg_foo",
|
|
|
|
bazel_module: {
|
|
|
|
label: "//other:fg_foo",
|
|
|
|
},
|
|
|
|
}
|
2021-02-17 19:22:03 +01:00
|
|
|
|
2021-06-17 07:43:19 +02:00
|
|
|
filegroup {
|
|
|
|
name: "fg_bar",
|
|
|
|
bazel_module: {
|
|
|
|
bp2build_available: true,
|
|
|
|
},
|
|
|
|
}`,
|
2021-02-17 19:22:03 +01:00
|
|
|
expectedBazelTargets: []string{
|
|
|
|
`filegroup(
|
|
|
|
name = "fg_bar",
|
|
|
|
)`,
|
|
|
|
`// BUILD file`,
|
|
|
|
},
|
2021-09-02 13:44:42 +02:00
|
|
|
filesystem: map[string]string{
|
2021-02-17 19:22:03 +01:00
|
|
|
"other/BUILD.bazel": `// BUILD file`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
dir := "."
|
|
|
|
for _, testCase := range testCases {
|
2021-05-25 07:16:48 +02:00
|
|
|
t.Run(testCase.description, func(t *testing.T) {
|
|
|
|
fs := make(map[string][]byte)
|
|
|
|
toParse := []string{
|
|
|
|
"Android.bp",
|
2021-02-17 19:22:03 +01:00
|
|
|
}
|
2021-09-02 13:44:42 +02:00
|
|
|
for f, content := range testCase.filesystem {
|
2021-05-25 07:16:48 +02:00
|
|
|
if strings.HasSuffix(f, "Android.bp") {
|
|
|
|
toParse = append(toParse, f)
|
|
|
|
}
|
|
|
|
fs[f] = []byte(content)
|
|
|
|
}
|
2021-09-02 13:44:42 +02:00
|
|
|
config := android.TestConfig(buildDir, nil, testCase.blueprint, fs)
|
2021-05-25 07:16:48 +02:00
|
|
|
ctx := android.NewTestContext(config)
|
|
|
|
ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory)
|
|
|
|
ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
|
|
|
|
ctx.RegisterForBazelConversion()
|
2021-04-27 11:47:02 +02:00
|
|
|
|
2021-05-25 07:16:48 +02:00
|
|
|
_, errs := ctx.ParseFileList(dir, toParse)
|
2021-09-02 13:44:42 +02:00
|
|
|
if errored(t, testCase, errs) {
|
2021-05-25 07:16:48 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
_, errs = ctx.ResolveDependencies(config)
|
2021-09-02 13:44:42 +02:00
|
|
|
if errored(t, testCase, errs) {
|
2021-05-25 07:16:48 +02:00
|
|
|
return
|
|
|
|
}
|
2021-04-27 11:47:02 +02:00
|
|
|
|
2021-05-25 07:16:48 +02:00
|
|
|
checkDir := dir
|
|
|
|
if testCase.dir != "" {
|
|
|
|
checkDir = testCase.dir
|
|
|
|
}
|
2021-08-26 14:37:59 +02:00
|
|
|
codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build)
|
|
|
|
bazelTargets, err := generateBazelTargetsForDir(codegenCtx, checkDir)
|
|
|
|
android.FailIfErrored(t, err)
|
2021-05-25 07:16:48 +02:00
|
|
|
bazelTargets.sort()
|
|
|
|
actualCount := len(bazelTargets)
|
|
|
|
expectedCount := len(testCase.expectedBazelTargets)
|
|
|
|
if actualCount != expectedCount {
|
|
|
|
t.Errorf("Expected %d bazel target, got %d\n%s", expectedCount, actualCount, bazelTargets)
|
|
|
|
}
|
|
|
|
if !strings.Contains(bazelTargets.String(), "Section: Handcrafted targets. ") {
|
|
|
|
t.Errorf("Expected string representation of bazelTargets to contain handcrafted section header.")
|
|
|
|
}
|
2021-04-27 11:47:02 +02:00
|
|
|
for i, target := range bazelTargets {
|
2021-05-25 07:16:48 +02:00
|
|
|
actualContent := target.content
|
|
|
|
expectedContent := testCase.expectedBazelTargets[i]
|
|
|
|
if expectedContent != actualContent {
|
2021-04-27 11:47:02 +02:00
|
|
|
t.Errorf(
|
2021-05-25 07:16:48 +02:00
|
|
|
"Expected generated Bazel target to be '%s', got '%s'",
|
|
|
|
expectedContent,
|
|
|
|
actualContent,
|
2021-04-27 11:47:02 +02:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
2021-05-25 07:16:48 +02:00
|
|
|
})
|
2021-04-27 11:47:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGlobExcludeSrcs(t *testing.T) {
|
2021-09-02 13:44:42 +02:00
|
|
|
testCases := []bp2buildTestCase{
|
2021-04-27 11:47:02 +02:00
|
|
|
{
|
|
|
|
description: "filegroup top level exclude_srcs",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: `filegroup {
|
2021-04-27 11:47:02 +02:00
|
|
|
name: "fg_foo",
|
|
|
|
srcs: ["**/*.txt"],
|
|
|
|
exclude_srcs: ["c.txt"],
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}`,
|
|
|
|
expectedBazelTargets: []string{`filegroup(
|
|
|
|
name = "fg_foo",
|
|
|
|
srcs = [
|
|
|
|
"a.txt",
|
|
|
|
"b.txt",
|
2021-05-21 14:37:59 +02:00
|
|
|
"//dir:e.txt",
|
|
|
|
"//dir:f.txt",
|
2021-04-27 11:47:02 +02:00
|
|
|
],
|
|
|
|
)`,
|
|
|
|
},
|
2021-09-02 13:44:42 +02:00
|
|
|
filesystem: map[string]string{
|
2021-04-27 11:47:02 +02:00
|
|
|
"a.txt": "",
|
|
|
|
"b.txt": "",
|
|
|
|
"c.txt": "",
|
|
|
|
"dir/Android.bp": "",
|
|
|
|
"dir/e.txt": "",
|
|
|
|
"dir/f.txt": "",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description: "filegroup in subdir exclude_srcs",
|
|
|
|
moduleTypeUnderTest: "filegroup",
|
|
|
|
moduleTypeUnderTestFactory: android.FileGroupFactory,
|
|
|
|
moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
|
2021-09-02 13:44:42 +02:00
|
|
|
blueprint: "",
|
2021-04-27 11:47:02 +02:00
|
|
|
dir: "dir",
|
2021-09-02 13:44:42 +02:00
|
|
|
filesystem: map[string]string{
|
2021-04-27 11:47:02 +02:00
|
|
|
"dir/Android.bp": `filegroup {
|
|
|
|
name: "fg_foo",
|
|
|
|
srcs: ["**/*.txt"],
|
|
|
|
exclude_srcs: ["b.txt"],
|
|
|
|
bazel_module: { bp2build_available: true },
|
|
|
|
}
|
|
|
|
`,
|
|
|
|
"dir/a.txt": "",
|
|
|
|
"dir/b.txt": "",
|
|
|
|
"dir/subdir/Android.bp": "",
|
|
|
|
"dir/subdir/e.txt": "",
|
|
|
|
"dir/subdir/f.txt": "",
|
|
|
|
},
|
|
|
|
expectedBazelTargets: []string{`filegroup(
|
|
|
|
name = "fg_foo",
|
|
|
|
srcs = [
|
2021-05-21 14:37:59 +02:00
|
|
|
"a.txt",
|
2021-04-27 11:47:02 +02:00
|
|
|
"//dir/subdir:e.txt",
|
|
|
|
"//dir/subdir:f.txt",
|
|
|
|
],
|
|
|
|
)`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
dir := "."
|
|
|
|
for _, testCase := range testCases {
|
|
|
|
fs := make(map[string][]byte)
|
|
|
|
toParse := []string{
|
|
|
|
"Android.bp",
|
|
|
|
}
|
2021-09-02 13:44:42 +02:00
|
|
|
for f, content := range testCase.filesystem {
|
2021-04-27 11:47:02 +02:00
|
|
|
if strings.HasSuffix(f, "Android.bp") {
|
|
|
|
toParse = append(toParse, f)
|
|
|
|
}
|
|
|
|
fs[f] = []byte(content)
|
|
|
|
}
|
2021-09-02 13:44:42 +02:00
|
|
|
config := android.TestConfig(buildDir, nil, testCase.blueprint, fs)
|
2021-04-27 11:47:02 +02:00
|
|
|
ctx := android.NewTestContext(config)
|
|
|
|
ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory)
|
|
|
|
ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
|
2021-02-17 19:22:03 +01:00
|
|
|
ctx.RegisterForBazelConversion()
|
|
|
|
|
|
|
|
_, errs := ctx.ParseFileList(dir, toParse)
|
2021-09-02 13:44:42 +02:00
|
|
|
if errored(t, testCase, errs) {
|
2021-02-17 19:22:03 +01:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
_, errs = ctx.ResolveDependencies(config)
|
2021-09-02 13:44:42 +02:00
|
|
|
if errored(t, testCase, errs) {
|
2021-02-17 19:22:03 +01:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
checkDir := dir
|
|
|
|
if testCase.dir != "" {
|
|
|
|
checkDir = testCase.dir
|
|
|
|
}
|
2021-08-26 14:37:59 +02:00
|
|
|
codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build)
|
|
|
|
bazelTargets, err := generateBazelTargetsForDir(codegenCtx, checkDir)
|
|
|
|
android.FailIfErrored(t, err)
|
2021-02-17 19:22:03 +01:00
|
|
|
if actualCount, expectedCount := len(bazelTargets), len(testCase.expectedBazelTargets); actualCount != expectedCount {
|
|
|
|
t.Errorf("%s: Expected %d bazel target, got %d\n%s", testCase.description, expectedCount, actualCount, bazelTargets)
|
|
|
|
} else {
|
|
|
|
for i, target := range bazelTargets {
|
|
|
|
if w, g := testCase.expectedBazelTargets[i], target.content; w != g {
|
|
|
|
t.Errorf(
|
|
|
|
"%s: Expected generated Bazel target to be '%s', got '%s'",
|
|
|
|
testCase.description,
|
|
|
|
w,
|
|
|
|
g,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|