github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/cmd/guru/unit_test.go (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "fmt" 9 "go/build" 10 "io/ioutil" 11 "os" 12 "path/filepath" 13 "runtime" 14 "strings" 15 "testing" 16 ) 17 18 // Unit tests for internal guru functions 19 20 func TestIssue17515(t *testing.T) { 21 // Tests handling of symlinks in function guessImportPath 22 // If we have Go code inside $HOME/go/src and create a symlink $HOME/src to it 23 // there are 4 possible cases that need to be tested: 24 // (1) absolute & absolute: GOPATH=$HOME/go/src file=$HOME/go/src/test/test.go 25 // (2) absolute & symlink: GOPATH=$HOME/go/src file=$HOME/src/test/test.go 26 // (3) symlink & symlink: GOPATH=$HOME/src file=$HOME/src/test/test.go 27 // (4) symlink & absolute: GOPATH=$HOME/src file= $HOME/go/src/test/test.go 28 29 // Create a temporary home directory under /tmp 30 home, err := ioutil.TempDir(os.TempDir(), "home") 31 if err != nil { 32 t.Errorf("Unable to create a temporary directory in %s", os.TempDir()) 33 } 34 35 defer os.RemoveAll(home) 36 37 // create filepath /tmp/home/go/src/test/test.go 38 if err = os.MkdirAll(home+"/go/src/test", 0755); err != nil { 39 t.Fatal(err) 40 } 41 42 var buildContext = build.Default 43 44 // Success test cases 45 type SuccessTest struct { 46 gopath, filename, wantSrcdir string 47 } 48 49 successTests := []SuccessTest{ 50 {home + "/go", home + "/go/src/test/test.go", filepath.FromSlash(home + "/go/src")}, 51 } 52 53 // Add symlink cases if not on Windows, Plan 9 54 if runtime.GOOS != "windows" && runtime.GOOS != "plan9" { 55 // symlink between /tmp/home/go/src and /tmp/home/src 56 if err := os.Symlink(home+"/go/src", home+"/src"); err != nil { 57 t.Fatal(err) 58 } 59 60 successTests = append(successTests, []SuccessTest{ 61 {home + "/go", home + "/src/test/test.go", filepath.FromSlash(home + "/go/src")}, 62 {home, home + "/go/src/test/test.go", filepath.FromSlash(home + "/src")}, 63 {home, home + "/src/test/test.go", filepath.FromSlash(home + "/src")}, 64 }...) 65 } 66 67 for _, test := range successTests { 68 buildContext.GOPATH = test.gopath 69 srcdir, importPath, err := guessImportPath(test.filename, &buildContext) 70 if srcdir != test.wantSrcdir || importPath != "test" || err != nil { 71 t.Errorf("guessImportPath(%q, %q) = %q, %q, %q; want %q, %q, %q", 72 test.filename, test.gopath, srcdir, importPath, err, test.wantSrcdir, "test", "nil") 73 } 74 } 75 // Function to format expected error message 76 errFormat := func(fpath string) string { 77 return fmt.Sprintf("can't evaluate symlinks of %s", fpath) 78 } 79 80 // Failure test cases 81 type FailTest struct { 82 gopath, filename, wantErr string 83 } 84 85 failTests := []FailTest{ 86 {home + "/go", home + "/go/src/fake/test.go", errFormat(filepath.FromSlash(home + "/go/src/fake"))}, 87 } 88 89 if runtime.GOOS != "windows" && runtime.GOOS != "plan9" { 90 failTests = append(failTests, []FailTest{ 91 {home + "/go", home + "/src/fake/test.go", errFormat(filepath.FromSlash(home + "/src/fake"))}, 92 {home, home + "/src/fake/test.go", errFormat(filepath.FromSlash(home + "/src/fake"))}, 93 {home, home + "/go/src/fake/test.go", errFormat(filepath.FromSlash(home + "/go/src/fake"))}, 94 }...) 95 } 96 97 for _, test := range failTests { 98 buildContext.GOPATH = test.gopath 99 srcdir, importPath, err := guessImportPath(test.filename, &buildContext) 100 if !strings.HasPrefix(fmt.Sprint(err), test.wantErr) { 101 t.Errorf("guessImportPath(%q, %q) = %q, %q, %q; want %q, %q, %q", 102 test.filename, test.gopath, srcdir, importPath, err, "", "", test.wantErr) 103 } 104 } 105 }