2
0
Fork 0
mirror of https://github.com/bazelbuild/bazel-skylib synced 2024-11-30 10:41:18 +00:00
bazel-skylib/gazelle/bzl/gazelle_test.go
Ivo List bc97abb33e
Move bzl ext (#265)
* Move Gazelle extension to //gazelle/bzl and change package name

This fixes an issue with importing bazel-skylib into
google3. Currently, Glaze (internal Go build file generator) attempts
to generate a target (//gazelle:gazelle) that conflicts with one
that's already declared here.

I think the right solution is actually to move the package into a
subdirectory. In the future (bazelbuild/bazel-gazelle#5), Gazelle's Go
extension will generate target names similar to what Glaze does, so
the same conflict will happen in open source. I think it's also
logical to have a directory of packages in case more need to be added
in the future, and for the extension to have a package name matching
the language it works with.

This is an incompatible change, but the //gazelle directory isn't part
of a tagged release yet, so hopefully it won't break anyone.

* fix runfiles access in test

* Fix gazelle package names.

Co-authored-by: Jay Conrod <jayconrod@google.com>
2020-08-20 13:14:55 -04:00

144 lines
3.6 KiB
Go

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
}