blob: b0f3fd19aa2fea44ba0554491fe14df5fe47bb58 [file] [log] [blame]
package main
import (
"fmt"
"io"
"os"
"path/filepath"
"strings"
"testing"
)
func TestBzlmodOverride(t *testing.T) {
tests := []struct {
name string
give string
want string
}{
{
name: "simple no override",
give: `load("@bazel_gazelle//:deps.bzl", "go_repository")
go_repository(
name = "com_github_apache_thrift",
build_file_generation = "auto",
build_file_proto_mode = "default",
importpath = "github.com/apache/thrift",
sum = "h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo=",
version = "v0.17.0",
)`,
want: "",
},
{
name: "simple override",
give: `load("@bazel_gazelle//:deps.bzl", "go_repository")
go_repository(
name = "com_github_apache_thrift",
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "on",
build_file_proto_mode = "disable",
importpath = "github.com/apache/thrift",
sum = "h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo=",
version = "v0.17.0",
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.gazelle_override(
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "on",
directives = ["gazelle:proto disable"],
path = "github.com/apache/thrift",
)`,
},
{
name: "module override and gazelle",
give: `load("@bazel_gazelle//:deps.bzl", "go_repository")
go_repository(
name = "com_github_bazelbuild_bazel_watcher",
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "off", # keep
build_file_proto_mode = "disable",
importpath = "github.com/bazelbuild/bazel-watcher",
patch_args = ["-p1"],
patches = [
# Remove it after they release this PR https://github.com/bazelbuild/bazel-watcher/pull/627
"//patches:com_github_bazelbuild_bazel_watcher-go-embed.patch",
],
sum = "h1:EfJzkMxJuNBGMVdEvkhiW7pAMwhaegbmAMaFCjLjyTw=",
version = "v0.23.7",
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.gazelle_override(
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "off",
directives = ["gazelle:proto disable"],
path = "github.com/bazelbuild/bazel-watcher",
)
go_deps.module_override(
patch_strip = 1,
patches = [
# Remove it after they release this PR https://github.com/bazelbuild/bazel-watcher/pull/627
"//patches:com_github_bazelbuild_bazel_watcher-go-embed.patch",
],
path = "github.com/bazelbuild/bazel-watcher",
)`,
},
{
name: "directives and proto args",
give: `go_repository(
name = "com_github_clickhouse_clickhouse_go_v2",
build_directives = [
"gazelle:resolve go github.com/ClickHouse/clickhouse-go/v2/external @com_github_clickhouse_clickhouse_go_v2//external",
],
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "on",
build_file_proto_mode = "disable",
importpath = "github.com/ClickHouse/clickhouse-go/v2",
sum = "h1:Nbl/NZwoM6LGJm7smNBgvtdr/rxjlIssSW3eG/Nmb9E=",
version = "v2.0.12",
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.gazelle_override(
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "on",
directives = [
"gazelle:resolve go github.com/ClickHouse/clickhouse-go/v2/external @com_github_clickhouse_clickhouse_go_v2//external",
"gazelle:proto disable",
],
path = "github.com/ClickHouse/clickhouse-go/v2",
)`,
},
{
name: "archive overrides",
give: `go_repository(
name = "org_golang_x_tools_cmd_goimports",
build_extra_args = [
"-go_prefix=golang.org/x/tools",
"-exclude=**/testdata",
],
build_file_generation = "on",
build_file_proto_mode = "disable",
importpath = "golang.org/x/tools/cmd/goimports",
patch_args = ["-p1"],
strip_prefix = "golang.org/x/tools@v0.0.0-20200512131952-2bc93b1c0c88",
sha256 = "4a6497e0bf1f19c8089dd02e7ba1351ba787f434d62971ff14fb627e57914939",
patches = [
"//patches:org_golang_x_tools_cmd_goimports.patch",
],
urls = [
"https://goproxy.uberinternal.com/golang.org/x/tools/@v/v0.0.0-20200512131952-2bc93b1c0c88.zip",
],
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.archive_override(
patch_strip = 1,
patches = [
"//patches:org_golang_x_tools_cmd_goimports.patch",
],
path = "golang.org/x/tools/cmd/goimports",
sha256 = "4a6497e0bf1f19c8089dd02e7ba1351ba787f434d62971ff14fb627e57914939",
strip_prefix = "golang.org/x/tools@v0.0.0-20200512131952-2bc93b1c0c88",
urls = [
"https://goproxy.uberinternal.com/golang.org/x/tools/@v/v0.0.0-20200512131952-2bc93b1c0c88.zip",
],
)
go_deps.gazelle_override(
build_extra_args = [
"-go_prefix=golang.org/x/tools",
"-exclude=**/testdata",
],
build_file_generation = "on",
directives = ["gazelle:proto disable"],
path = "golang.org/x/tools/cmd/goimports",
)`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
w := t.TempDir()
testWorkspace := filepath.Join(w, "WORKSPACE")
if err := os.WriteFile(testWorkspace, []byte(removeTabsAndTrimLines(tt.give)), 0644); err != nil {
t.Errorf("error writing test workspace file: %v", err)
}
args := &mainArgs{
workspace: testWorkspace,
outputFile: filepath.Join(w, "output.bzl"),
defaultBuildFileGeneration: "auto",
defaultBuildFileProtoMode: "default",
}
if err := run(*args, io.Discard); err != nil {
t.Errorf("run() error = %v, want no error", err)
}
if tt.want == "" {
return
}
content, err := os.ReadFile(args.outputFile)
if err != nil {
t.Errorf("error reading output file: %v", err)
}
if !isEqualContent(string(content), tt.want) {
fmt.Fprintf(os.Stderr, "output = %v, want %v", string(content), tt.want)
t.Errorf("output = %v, want %v", string(content), tt.want)
}
})
}
}
func TestBzlmodOverrideNewDefaults(t *testing.T) {
tests := []struct {
name string
give string
want string
}{
{
name: "simple no override",
give: `load("@bazel_gazelle//:deps.bzl", "go_repository")
go_repository(
name = "com_github_apache_thrift",
build_file_generation = "on",
build_file_proto_mode = "disable",
importpath = "github.com/apache/thrift",
sum = "h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo=",
version = "v0.17.0",
)`,
want: "",
},
{
name: "simple override",
give: `load("@bazel_gazelle//:deps.bzl", "go_repository")
go_repository(
name = "com_github_apache_thrift",
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "on",
build_file_proto_mode = "disable_global",
importpath = "github.com/apache/thrift",
sum = "h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo=",
version = "v0.17.0",
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.gazelle_override(
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "on",
directives = ["gazelle:proto disable_global"],
path = "github.com/apache/thrift",
)`,
},
{
name: "module override and gazelle",
give: `load("@bazel_gazelle//:deps.bzl", "go_repository")
go_repository(
name = "com_github_bazelbuild_bazel_watcher",
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "off", # keep
build_file_proto_mode = "disable",
importpath = "github.com/bazelbuild/bazel-watcher",
patch_args = ["-p1"],
patches = [
# Remove it after they release this PR https://github.com/bazelbuild/bazel-watcher/pull/627
"//patches:com_github_bazelbuild_bazel_watcher-go-embed.patch",
],
sum = "h1:EfJzkMxJuNBGMVdEvkhiW7pAMwhaegbmAMaFCjLjyTw=",
version = "v0.23.7",
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.gazelle_override(
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "off",
directives = ["gazelle:proto disable"],
path = "github.com/bazelbuild/bazel-watcher",
)
go_deps.module_override(
patch_strip = 1,
patches = [
# Remove it after they release this PR https://github.com/bazelbuild/bazel-watcher/pull/627
"//patches:com_github_bazelbuild_bazel_watcher-go-embed.patch",
],
path = "github.com/bazelbuild/bazel-watcher",
)`,
},
{
name: "directives and proto args",
give: `go_repository(
name = "com_github_clickhouse_clickhouse_go_v2",
build_directives = [
"gazelle:resolve go github.com/ClickHouse/clickhouse-go/v2/external @com_github_clickhouse_clickhouse_go_v2//external",
],
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "auto",
build_file_proto_mode = "disable",
importpath = "github.com/ClickHouse/clickhouse-go/v2",
sum = "h1:Nbl/NZwoM6LGJm7smNBgvtdr/rxjlIssSW3eG/Nmb9E=",
version = "v2.0.12",
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.gazelle_override(
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "auto",
directives = [
"gazelle:resolve go github.com/ClickHouse/clickhouse-go/v2/external @com_github_clickhouse_clickhouse_go_v2//external",
"gazelle:proto disable",
],
path = "github.com/ClickHouse/clickhouse-go/v2",
)`,
},
{
name: "archive overrides",
give: `go_repository(
name = "org_golang_x_tools_cmd_goimports",
build_extra_args = [
"-go_prefix=golang.org/x/tools",
"-exclude=**/testdata",
],
build_file_generation = "on",
build_file_proto_mode = "disable",
importpath = "golang.org/x/tools/cmd/goimports",
patch_args = ["-p1"],
strip_prefix = "golang.org/x/tools@v0.0.0-20200512131952-2bc93b1c0c88",
sha256 = "4a6497e0bf1f19c8089dd02e7ba1351ba787f434d62971ff14fb627e57914939",
patches = [
"//patches:org_golang_x_tools_cmd_goimports.patch",
],
urls = [
"https://goproxy.uberinternal.com/golang.org/x/tools/@v/v0.0.0-20200512131952-2bc93b1c0c88.zip",
],
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.archive_override(
patch_strip = 1,
patches = [
"//patches:org_golang_x_tools_cmd_goimports.patch",
],
path = "golang.org/x/tools/cmd/goimports",
sha256 = "4a6497e0bf1f19c8089dd02e7ba1351ba787f434d62971ff14fb627e57914939",
strip_prefix = "golang.org/x/tools@v0.0.0-20200512131952-2bc93b1c0c88",
urls = [
"https://goproxy.uberinternal.com/golang.org/x/tools/@v/v0.0.0-20200512131952-2bc93b1c0c88.zip",
],
)
go_deps.gazelle_override(
build_extra_args = [
"-go_prefix=golang.org/x/tools",
"-exclude=**/testdata",
],
build_file_generation = "on",
directives = ["gazelle:proto disable"],
path = "golang.org/x/tools/cmd/goimports",
)`,
},
{
name: "removed duplicate proto mode",
give: `go_repository(
name = "org_golang_x_xerrors",
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "on",
build_directives = [
"gazelle:proto disable",
],
importpath = "golang.org/x/xerrors",
patch_args = ["-p1"],
patches = [
# exposes go_tool_library
"//patches:org_golang_x_xerrors_tool.patch",
],
sum = "h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=",
version = "v0.0.0-20220907171357-04be3eba64a2",
)`,
want: `go_deps = use_extension("//:extensions.bzl", "go_deps")
go_deps.gazelle_override(
build_extra_args = ["-go_naming_convention_external=go_default_library"],
build_file_generation = "on",
directives = [
"gazelle:proto disable",
],
path = "golang.org/x/xerrors",
)
go_deps.module_override(
patch_strip = 1,
patches = [
# exposes go_tool_library
"//patches:org_golang_x_xerrors_tool.patch",
],
path = "golang.org/x/xerrors",
)`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
w := t.TempDir()
testWorkspace := filepath.Join(w, "WORKSPACE")
if err := os.WriteFile(testWorkspace, []byte(removeTabsAndTrimLines(tt.give)), 0644); err != nil {
t.Errorf("error writing test workspace file: %v", err)
}
args := &mainArgs{
workspace: testWorkspace,
outputFile: filepath.Join(w, "output.bzl"),
defaultBuildFileGeneration: "on",
defaultBuildFileProtoMode: "disable",
}
if err := run(*args, io.Discard); err != nil {
t.Errorf("run() error = %v, want no error", err)
}
if tt.want == "" {
return
}
content, err := os.ReadFile(args.outputFile)
if err != nil {
t.Errorf("error reading output file: %v", err)
}
if !isEqualContent(string(content), tt.want) {
fmt.Fprintf(os.Stderr, "output = %v, want %v", string(content), tt.want)
t.Errorf("output = %v, want %v", string(content), tt.want)
}
})
}
}
func isEqualContent(str1, str2 string) bool {
cleanStr1 := removeTabsAndTrimLines(str1)
cleanStr2 := removeTabsAndTrimLines(str2)
return cleanStr1 == cleanStr2
}
// removeTabsAndTrimLines removes tabs, trims leading and trailing spaces on each line,
// and trims leading and trailing newlines from the entire string.
func removeTabsAndTrimLines(str string) string {
lines := strings.Split(str, "\n")
for i, line := range lines {
lines[i] = strings.TrimSpace(strings.ReplaceAll(line, "\t", ""))
}
return strings.TrimSpace(strings.Join(lines, "\n"))
}