diff options
Diffstat (limited to 'tests/core/nogo/deps/deps_test.go')
-rw-r--r-- | tests/core/nogo/deps/deps_test.go | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/tests/core/nogo/deps/deps_test.go b/tests/core/nogo/deps/deps_test.go new file mode 100644 index 00000000..f527effd --- /dev/null +++ b/tests/core/nogo/deps/deps_test.go @@ -0,0 +1,211 @@ +// Copyright 2019 The Bazel Authors. 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 deps_test + +import ( + "bytes" + "regexp" + "testing" + + "github.com/bazelbuild/rules_go/go/tools/bazel_testing" +) + +func TestMain(m *testing.M) { + bazel_testing.TestMain(m, bazel_testing.Args{ + Nogo: "@//:nogo", + Main: ` +-- BUILD.bazel -- +load("@io_bazel_rules_go//go:def.bzl", "go_library", "nogo") + +nogo( + name = "nogo", + deps = [ + ":a", + ":b", + ":c", + ], + visibility = ["//visibility:public"], +) + +go_library( + name = "a", + srcs = ["a.go"], + importpath = "a", + deps = [ + ":c", + "@org_golang_x_tools//go/analysis" + ], + visibility = ["//visibility:public"], +) + +go_library( + name = "b", + srcs = ["b.go"], + importpath = "b", + deps = [ + ":c", + "@org_golang_x_tools//go/analysis" + ], + visibility = ["//visibility:public"], +) + +go_library( + name = "c", + srcs = ["c.go"], + importpath = "c", + deps = [ + ":d", + "@org_golang_x_tools//go/analysis" + ], + visibility = ["//visibility:public"], +) + +go_library( + name = "d", + srcs = ["d.go"], + importpath = "d", + deps = ["@org_golang_x_tools//go/analysis"], + visibility = ["//visibility:public"], +) + +go_library( + name = "src", + srcs = ["src.go"], + importpath = "src", +) + +-- a.go -- +package a + +import ( + "c" + "go/token" + + "golang.org/x/tools/go/analysis" +) + +var Analyzer = &analysis.Analyzer{ + Name: "a", + Doc: "an analyzer that depends on c.Analyzer", + Run: run, + Requires: []*analysis.Analyzer{c.Analyzer}, +} + +func run(pass *analysis.Pass) (interface{}, error) { + pass.Reportf(token.NoPos, "a %s", pass.ResultOf[c.Analyzer]) + return nil, nil +} + +-- b.go -- +package b + +import ( + "c" + "go/token" + + "golang.org/x/tools/go/analysis" +) + +var Analyzer = &analysis.Analyzer{ + Name: "b", + Doc: "an analyzer that depends on c.Analyzer", + Run: run, + Requires: []*analysis.Analyzer{c.Analyzer}, +} + +func run(pass *analysis.Pass) (interface{}, error) { + pass.Reportf(token.NoPos, "b %s", pass.ResultOf[c.Analyzer]) + return nil, nil +} + +-- c.go -- +package c + +import ( + "d" + "fmt" + "go/token" + "reflect" + + "golang.org/x/tools/go/analysis" +) + +var Analyzer = &analysis.Analyzer{ + Name: "c", + Doc: "an analyzer that depends on d.Analyzer", + Run: run, + Requires: []*analysis.Analyzer{d.Analyzer}, + ResultType: reflect.TypeOf(""), +} + +func run(pass *analysis.Pass) (interface{}, error) { + pass.Reportf(token.NoPos, "only printed once") + return fmt.Sprintf("c %s", pass.ResultOf[d.Analyzer]), nil +} + +-- d.go -- +package d + +import ( + "go/token" + "reflect" + + "golang.org/x/tools/go/analysis" +) + +var Analyzer = &analysis.Analyzer{ + Name: "d", + Doc: "an analyzer that does not depend on other analyzers", + Run: run, + ResultType: reflect.TypeOf(""), +} + +func run(pass *analysis.Pass) (interface{}, error) { + pass.Reportf(token.NoPos, "this should not be printed") + return "d", nil +} + +-- src.go -- +package src + +func Foo() int { + return 1 +} + +`, + }) +} + +func Test(t *testing.T) { + cmd := bazel_testing.BazelCmd("build", "//:src") + stderr := &bytes.Buffer{} + cmd.Stderr = stderr + if err := cmd.Run(); err == nil { + t.Fatal("unexpected success") + } + + for _, pattern := range []string{ + "a c d", + "b c d", + "only printed once", + } { + if matched, _ := regexp.Match(pattern, stderr.Bytes()); !matched { + t.Errorf("output does not contain pattern: %s", pattern) + } + } + if bytes.Contains(stderr.Bytes(), []byte("this should not be printed")) { + t.Errorf("%q was printed", "this should not be printed") + } +} |