|  | // Copyright 2014 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 buildutil_test | 
|  |  | 
|  | import ( | 
|  | "go/build" | 
|  | "io/ioutil" | 
|  | "os" | 
|  | "path/filepath" | 
|  | "runtime" | 
|  | "strings" | 
|  | "testing" | 
|  |  | 
|  | "golang.org/x/tools/go/buildutil" | 
|  | "golang.org/x/tools/go/packages/packagestest" | 
|  | ) | 
|  |  | 
|  | func TestContainingPackage(t *testing.T) { | 
|  | if runtime.Compiler == "gccgo" { | 
|  | t.Skip("gccgo has no GOROOT") | 
|  | } | 
|  |  | 
|  | exported := packagestest.Export(t, packagestest.GOPATH, []packagestest.Module{ | 
|  | {Name: "golang.org/x/tools/go/buildutil", Files: packagestest.MustCopyFileTree(".")}}) | 
|  | defer exported.Cleanup() | 
|  |  | 
|  | goroot := runtime.GOROOT() | 
|  | var gopath string | 
|  | for _, env := range exported.Config.Env { | 
|  | if !strings.HasPrefix(env, "GOPATH=") { | 
|  | continue | 
|  | } | 
|  | gopath = strings.TrimPrefix(env, "GOPATH=") | 
|  | } | 
|  | if gopath == "" { | 
|  | t.Fatal("Failed to fish GOPATH out of env: ", exported.Config.Env) | 
|  | } | 
|  | buildutildir := filepath.Join(gopath, "golang.org", "x", "tools", "go", "buildutil") | 
|  |  | 
|  | type Test struct { | 
|  | gopath, filename, wantPkg string | 
|  | } | 
|  |  | 
|  | tests := []Test{ | 
|  | {gopath, goroot + "/src/fmt/print.go", "fmt"}, | 
|  | {gopath, goroot + "/src/encoding/json/foo.go", "encoding/json"}, | 
|  | {gopath, goroot + "/src/encoding/missing/foo.go", "(not found)"}, | 
|  | {gopath, gopath + "/src/golang.org/x/tools/go/buildutil/util_test.go", | 
|  | "golang.org/x/tools/go/buildutil"}, | 
|  | } | 
|  |  | 
|  | if runtime.GOOS != "windows" && runtime.GOOS != "plan9" { | 
|  | // Make a symlink to gopath for test | 
|  | tmp, err := ioutil.TempDir(os.TempDir(), "go") | 
|  | if err != nil { | 
|  | t.Errorf("Unable to create a temporary directory in %s", os.TempDir()) | 
|  | } | 
|  |  | 
|  | defer os.RemoveAll(tmp) | 
|  |  | 
|  | // symlink between $GOPATH/src and /tmp/go/src | 
|  | // in order to test all possible symlink cases | 
|  | if err := os.Symlink(gopath+"/src", tmp+"/src"); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | tests = append(tests, []Test{ | 
|  | {gopath, tmp + "/src/golang.org/x/tools/go/buildutil/util_test.go", "golang.org/x/tools/go/buildutil"}, | 
|  | {tmp, gopath + "/src/golang.org/x/tools/go/buildutil/util_test.go", "golang.org/x/tools/go/buildutil"}, | 
|  | {tmp, tmp + "/src/golang.org/x/tools/go/buildutil/util_test.go", "golang.org/x/tools/go/buildutil"}, | 
|  | }...) | 
|  | } | 
|  |  | 
|  | for _, test := range tests { | 
|  | var got string | 
|  | var buildContext = build.Default | 
|  | buildContext.GOPATH = test.gopath | 
|  | bp, err := buildutil.ContainingPackage(&buildContext, buildutildir, test.filename) | 
|  | if err != nil { | 
|  | got = "(not found)" | 
|  | } else { | 
|  | got = bp.ImportPath | 
|  | } | 
|  | if got != test.wantPkg { | 
|  | t.Errorf("ContainingPackage(%q) = %s, want %s", test.filename, got, test.wantPkg) | 
|  | } | 
|  | } | 
|  |  | 
|  | } |