mirror of
https://github.com/golang/go
synced 2024-11-05 14:46:11 -07:00
5bcca83a78
In all cases, use a Logf field to configure debug logging. Non-nil means that logging is enabled through the given function. Fixes accidental debug spam from goimports, which had a separate Debug flag that was supposed to guard logging, but wasn't used when creating the gocommand.Invocation. Change-Id: I448fa282111db556ac2e49801268d0affc19ae30 Reviewed-on: https://go-review.googlesource.com/c/tools/+/221557 Run-TryBot: Heschi Kreinick <heschi@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Daniel Martí <mvdan@mvdan.cc> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
176 lines
4.5 KiB
Go
176 lines
4.5 KiB
Go
// Copyright 2018 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package gopathwalk
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"reflect"
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
func TestShouldTraverse(t *testing.T) {
|
|
switch runtime.GOOS {
|
|
case "windows", "plan9":
|
|
t.Skipf("skipping symlink-requiring test on %s", runtime.GOOS)
|
|
}
|
|
|
|
dir, err := ioutil.TempDir("", "goimports-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(dir)
|
|
|
|
// Note: mapToDir prepends "src" to each element, since
|
|
// mapToDir was made for creating GOPATHs.
|
|
if err := mapToDir(dir, map[string]string{
|
|
"foo/foo2/file.txt": "",
|
|
"foo/foo2/link-to-src": "LINK:../../",
|
|
"foo/foo2/link-to-src-foo": "LINK:../../foo",
|
|
"foo/foo2/link-to-dot": "LINK:.",
|
|
"bar/bar2/file.txt": "",
|
|
"bar/bar2/link-to-src-foo": "LINK:../../foo",
|
|
|
|
"a/b/c": "LINK:../../a/d",
|
|
"a/d/e": "LINK:../../a/b",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
tests := []struct {
|
|
dir string
|
|
file string
|
|
want bool
|
|
}{
|
|
{
|
|
dir: "src/foo/foo2",
|
|
file: "link-to-src-foo",
|
|
want: false, // loop
|
|
},
|
|
{
|
|
dir: "src/foo/foo2",
|
|
file: "link-to-src",
|
|
want: false, // loop
|
|
},
|
|
{
|
|
dir: "src/foo/foo2",
|
|
file: "link-to-dot",
|
|
want: false, // loop
|
|
},
|
|
{
|
|
dir: "src/bar/bar2",
|
|
file: "link-to-src-foo",
|
|
want: true, // not a loop
|
|
},
|
|
{
|
|
dir: "src/a/b/c",
|
|
file: "e",
|
|
want: false, // loop: "e" is the same as "b".
|
|
},
|
|
}
|
|
for i, tt := range tests {
|
|
fi, err := os.Stat(filepath.Join(dir, tt.dir, tt.file))
|
|
if err != nil {
|
|
t.Errorf("%d. Stat = %v", i, err)
|
|
continue
|
|
}
|
|
var w walker
|
|
got := w.shouldTraverse(filepath.Join(dir, tt.dir), fi)
|
|
if got != tt.want {
|
|
t.Errorf("%d. shouldTraverse(%q, %q) = %v; want %v", i, tt.dir, tt.file, got, tt.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestSkip tests that various goimports rules are followed in non-modules mode.
|
|
func TestSkip(t *testing.T) {
|
|
dir, err := ioutil.TempDir("", "goimports-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(dir)
|
|
|
|
if err := mapToDir(dir, map[string]string{
|
|
"ignoreme/f.go": "package ignoreme", // ignored by .goimportsignore
|
|
"node_modules/f.go": "package nodemodules;", // ignored by hardcoded node_modules filter
|
|
"v/f.go": "package v;", // ignored by hardcoded vgo cache rule
|
|
"mod/f.go": "package mod;", // ignored by hardcoded vgo cache rule
|
|
"shouldfind/f.go": "package shouldfind;", // not ignored
|
|
|
|
".goimportsignore": "ignoreme\n",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var found []string
|
|
var mu sync.Mutex
|
|
walkDir(Root{filepath.Join(dir, "src"), RootGOPATH},
|
|
func(root Root, dir string) {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
found = append(found, dir[len(root.Path)+1:])
|
|
}, func(root Root, dir string) bool {
|
|
return false
|
|
}, Options{ModulesEnabled: false, Logf: log.Printf})
|
|
if want := []string{"shouldfind"}; !reflect.DeepEqual(found, want) {
|
|
t.Errorf("expected to find only %v, got %v", want, found)
|
|
}
|
|
}
|
|
|
|
// TestSkipFunction tests that scan successfully skips directories from user callback.
|
|
func TestSkipFunction(t *testing.T) {
|
|
dir, err := ioutil.TempDir("", "goimports-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(dir)
|
|
|
|
if err := mapToDir(dir, map[string]string{
|
|
"ignoreme/f.go": "package ignoreme", // ignored by skip
|
|
"ignoreme/subignore/f.go": "package subignore", // also ignored by skip
|
|
"shouldfind/f.go": "package shouldfind;", // not ignored
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var found []string
|
|
var mu sync.Mutex
|
|
walkDir(Root{filepath.Join(dir, "src"), RootGOPATH},
|
|
func(root Root, dir string) {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
found = append(found, dir[len(root.Path)+1:])
|
|
}, func(root Root, dir string) bool {
|
|
return strings.HasSuffix(dir, "ignoreme")
|
|
},
|
|
Options{ModulesEnabled: false})
|
|
if want := []string{"shouldfind"}; !reflect.DeepEqual(found, want) {
|
|
t.Errorf("expected to find only %v, got %v", want, found)
|
|
}
|
|
}
|
|
|
|
func mapToDir(destDir string, files map[string]string) error {
|
|
for path, contents := range files {
|
|
file := filepath.Join(destDir, "src", path)
|
|
if err := os.MkdirAll(filepath.Dir(file), 0755); err != nil {
|
|
return err
|
|
}
|
|
var err error
|
|
if strings.HasPrefix(contents, "LINK:") {
|
|
err = os.Symlink(strings.TrimPrefix(contents, "LINK:"), file)
|
|
} else {
|
|
err = ioutil.WriteFile(file, []byte(contents), 0644)
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|