// 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)
		}
	}

}
