aboutsummaryrefslogtreecommitdiff
path: root/gazelle/bzl/gazelle_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'gazelle/bzl/gazelle_test.go')
-rw-r--r--gazelle/bzl/gazelle_test.go143
1 files changed, 143 insertions, 0 deletions
diff --git a/gazelle/bzl/gazelle_test.go b/gazelle/bzl/gazelle_test.go
new file mode 100644
index 0000000..e4f59e8
--- /dev/null
+++ b/gazelle/bzl/gazelle_test.go
@@ -0,0 +1,143 @@
+package bzl
+
+/* Copyright 2020 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.
+*/
+
+import (
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "github.com/bazelbuild/bazel-gazelle/testtools"
+ "github.com/bazelbuild/rules_go/go/tools/bazel"
+)
+
+var gazellePath = findGazelle()
+
+const testDataPath = "gazelle/bzl/testdata/"
+
+// TestGazelleBinary runs a gazelle binary with starlib installed on each
+// directory in `testdata/*`. Please see `testdata/README.md` for more
+// information on each test.
+func TestGazelleBinary(t *testing.T) {
+ tests := map[string][]bazel.RunfileEntry{}
+
+ files, err := bazel.ListRunfiles()
+ if err != nil {
+ t.Fatalf("bazel.ListRunfiles() error: %v", err)
+ }
+ for _, f := range files {
+ if strings.HasPrefix(f.ShortPath, testDataPath) {
+ relativePath := strings.TrimPrefix(f.ShortPath, testDataPath)
+ parts := strings.SplitN(relativePath, "/", 2)
+ if len(parts) < 2 {
+ // This file is not a part of a testcase since it must be in a dir that
+ // is the test case and then have a path inside of that.
+ continue
+ }
+
+ tests[parts[0]] = append(tests[parts[0]], f)
+ }
+ }
+ if len(tests) == 0 {
+ t.Fatal("no tests found")
+ }
+
+ for testName, files := range tests {
+ testPath(t, testName, files)
+ }
+}
+
+func testPath(t *testing.T, name string, files []bazel.RunfileEntry) {
+ t.Run(name, func(t *testing.T) {
+ var inputs []testtools.FileSpec
+ var goldens []testtools.FileSpec
+
+ for _, f := range files {
+ path := f.Path
+ trim := testDataPath + name + "/"
+ shortPath := strings.TrimPrefix(f.ShortPath, trim)
+ info, err := os.Stat(path)
+ if err != nil {
+ t.Fatalf("os.Stat(%q) error: %v", path, err)
+ }
+
+ // Skip dirs.
+ if info.IsDir() {
+ continue
+ }
+
+ content, err := ioutil.ReadFile(path)
+ if err != nil {
+ t.Errorf("ioutil.ReadFile(%q) error: %v", path, err)
+ }
+
+ // Now trim the common prefix off.
+ if strings.HasSuffix(shortPath, ".in") {
+ inputs = append(inputs, testtools.FileSpec{
+ Path: strings.TrimSuffix(shortPath, ".in"),
+ Content: string(content),
+ })
+ } else if strings.HasSuffix(shortPath, ".out") {
+ goldens = append(goldens, testtools.FileSpec{
+ Path: strings.TrimSuffix(shortPath, ".out"),
+ Content: string(content),
+ })
+ } else {
+ inputs = append(inputs, testtools.FileSpec{
+ Path: shortPath,
+ Content: string(content),
+ })
+ goldens = append(goldens, testtools.FileSpec{
+ Path: shortPath,
+ Content: string(content),
+ })
+ }
+ }
+
+ dir, cleanup := testtools.CreateFiles(t, inputs)
+ defer cleanup()
+
+ cmd := exec.Command(gazellePath, "-build_file_name=BUILD")
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.Dir = dir
+ if err := cmd.Run(); err != nil {
+ t.Fatal(err)
+ }
+
+ testtools.CheckFiles(t, dir, goldens)
+ if t.Failed() {
+ filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ t.Logf("%q exists", path)
+ return nil
+ })
+ }
+ })
+}
+
+func findGazelle() string {
+ gazellePath, ok := bazel.FindBinary("gazelle/bzl", "gazelle-skylib")
+ if !ok {
+ panic("could not find gazelle binary")
+ }
+ return gazellePath
+}