diff options
Diffstat (limited to 'gazelle/bzl/gazelle_test.go')
-rw-r--r-- | gazelle/bzl/gazelle_test.go | 143 |
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 +} |