// 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 modfetch

import (
	"archive/zip"
	"internal/testenv"
	"io"
	"io/ioutil"
	"log"
	"os"
	"reflect"
	"strings"
	"testing"
	"time"

	"cmd/go/internal/modfetch/codehost"
)

func TestMain(m *testing.M) {
	os.Exit(testMain(m))
}

func testMain(m *testing.M) int {
	dir, err := ioutil.TempDir("", "gitrepo-test-")
	if err != nil {
		log.Fatal(err)
	}
	defer os.RemoveAll(dir)

	codehost.WorkRoot = dir
	return m.Run()
}

var codeRepoTests = []struct {
	path     string
	lookerr  string
	mpath    string
	rev      string
	err      string
	version  string
	name     string
	short    string
	time     time.Time
	gomod    string
	gomoderr string
	zip      []string
	ziperr   string
}{
	{
		path:    "github.com/rsc/vgotest1",
		rev:     "v0.0.0",
		version: "v0.0.0",
		name:    "80d85c5d4d17598a0e9055e7c175a32b415d6128",
		short:   "80d85c5d4d17",
		time:    time.Date(2018, 2, 19, 23, 10, 6, 0, time.UTC),
		zip: []string{
			"LICENSE",
			"README.md",
			"pkg/p.go",
		},
	},
	{
		path:    "github.com/rsc/vgotest1",
		rev:     "v1.0.0",
		version: "v1.0.0",
		name:    "80d85c5d4d17598a0e9055e7c175a32b415d6128",
		short:   "80d85c5d4d17",
		time:    time.Date(2018, 2, 19, 23, 10, 6, 0, time.UTC),
		zip: []string{
			"LICENSE",
			"README.md",
			"pkg/p.go",
		},
	},
	{
		path:    "github.com/rsc/vgotest1/v2",
		rev:     "v2.0.0",
		version: "v2.0.0",
		name:    "80d85c5d4d17598a0e9055e7c175a32b415d6128",
		short:   "80d85c5d4d17",
		time:    time.Date(2018, 2, 19, 23, 10, 6, 0, time.UTC),
		ziperr:  "missing or invalid go.mod",
	},
	{
		path:    "github.com/rsc/vgotest1",
		rev:     "80d85c5",
		version: "v0.0.0-20180219231006-80d85c5d4d17",
		name:    "80d85c5d4d17598a0e9055e7c175a32b415d6128",
		short:   "80d85c5d4d17",
		time:    time.Date(2018, 2, 19, 23, 10, 6, 0, time.UTC),
		zip: []string{
			"LICENSE",
			"README.md",
			"pkg/p.go",
		},
	},
	{
		path:    "github.com/rsc/vgotest1",
		rev:     "mytag",
		version: "v0.0.0-20180219231006-80d85c5d4d17",
		name:    "80d85c5d4d17598a0e9055e7c175a32b415d6128",
		short:   "80d85c5d4d17",
		time:    time.Date(2018, 2, 19, 23, 10, 6, 0, time.UTC),
		zip: []string{
			"LICENSE",
			"README.md",
			"pkg/p.go",
		},
	},
	{
		path:     "github.com/rsc/vgotest1/v2",
		rev:      "80d85c5",
		version:  "v2.0.0-20180219231006-80d85c5d4d17",
		name:     "80d85c5d4d17598a0e9055e7c175a32b415d6128",
		short:    "80d85c5d4d17",
		time:     time.Date(2018, 2, 19, 23, 10, 6, 0, time.UTC),
		gomoderr: "missing or invalid go.mod",
		ziperr:   "missing or invalid go.mod",
	},
	{
		path:    "github.com/rsc/vgotest1/v54321",
		rev:     "80d85c5",
		version: "v54321.0.0-20180219231006-80d85c5d4d17",
		name:    "80d85c5d4d17598a0e9055e7c175a32b415d6128",
		short:   "80d85c5d4d17",
		time:    time.Date(2018, 2, 19, 23, 10, 6, 0, time.UTC),
		ziperr:  "missing or invalid go.mod",
	},
	{
		path: "github.com/rsc/vgotest1/submod",
		rev:  "v1.0.0",
		err:  "unknown revision submod/v1.0.0",
	},
	{
		path: "github.com/rsc/vgotest1/submod",
		rev:  "v1.0.3",
		err:  "unknown revision submod/v1.0.3",
	},
	{
		path:    "github.com/rsc/vgotest1/submod",
		rev:     "v1.0.4",
		version: "v1.0.4",
		name:    "8afe2b2efed96e0880ecd2a69b98a53b8c2738b6",
		short:   "8afe2b2efed9",
		time:    time.Date(2018, 2, 19, 23, 12, 7, 0, time.UTC),
		gomod:   "module \"github.com/vgotest1/submod\" // submod/go.mod\n",
		zip: []string{
			"go.mod",
			"pkg/p.go",
			"LICENSE",
		},
	},
	{
		path:    "github.com/rsc/vgotest1",
		rev:     "v1.1.0",
		version: "v1.1.0",
		name:    "b769f2de407a4db81af9c5de0a06016d60d2ea09",
		short:   "b769f2de407a",
		time:    time.Date(2018, 2, 19, 23, 13, 36, 0, time.UTC),
		gomod:   "module \"github.com/rsc/vgotest1\" // root go.mod\nrequire \"github.com/rsc/vgotest1/submod\" v1.0.5\n",
		zip: []string{
			"LICENSE",
			"README.md",
			"go.mod",
			"pkg/p.go",
		},
	},
	{
		path:    "github.com/rsc/vgotest1/v2",
		rev:     "v2.0.1",
		version: "v2.0.1",
		name:    "ea65f87c8f52c15ea68f3bdd9925ef17e20d91e9",
		short:   "ea65f87c8f52",
		time:    time.Date(2018, 2, 19, 23, 14, 23, 0, time.UTC),
		gomod:   "module \"github.com/rsc/vgotest1/v2\" // root go.mod\n",
	},
	{
		path:     "github.com/rsc/vgotest1/v2",
		rev:      "v2.0.3",
		version:  "v2.0.3",
		name:     "f18795870fb14388a21ef3ebc1d75911c8694f31",
		short:    "f18795870fb1",
		time:     time.Date(2018, 2, 19, 23, 16, 4, 0, time.UTC),
		gomoderr: "v2/go.mod has non-.../v2 module path",
	},
	{
		path:     "github.com/rsc/vgotest1/v2",
		rev:      "v2.0.4",
		version:  "v2.0.4",
		name:     "1f863feb76bc7029b78b21c5375644838962f88d",
		short:    "1f863feb76bc",
		time:     time.Date(2018, 2, 20, 0, 3, 38, 0, time.UTC),
		gomoderr: "both go.mod and v2/go.mod claim .../v2 module",
	},
	{
		path:    "github.com/rsc/vgotest1/v2",
		rev:     "v2.0.5",
		version: "v2.0.5",
		name:    "2f615117ce481c8efef46e0cc0b4b4dccfac8fea",
		short:   "2f615117ce48",
		time:    time.Date(2018, 2, 20, 0, 3, 59, 0, time.UTC),
		gomod:   "module \"github.com/rsc/vgotest1/v2\" // v2/go.mod\n",
	},
	{
		// redirect to github
		path:    "rsc.io/quote",
		rev:     "v1.0.0",
		version: "v1.0.0",
		name:    "f488df80bcdbd3e5bafdc24ad7d1e79e83edd7e6",
		short:   "f488df80bcdb",
		time:    time.Date(2018, 2, 14, 0, 45, 20, 0, time.UTC),
		gomod:   "module \"rsc.io/quote\"\n",
	},
	{
		// redirect to static hosting proxy
		path:    "swtch.com/testmod",
		rev:     "v1.0.0",
		version: "v1.0.0",
		name:    "v1.0.0",
		short:   "v1.0.0",
		time:    time.Date(1972, 7, 18, 12, 34, 56, 0, time.UTC),
		gomod:   "module \"swtch.com/testmod\"\n",
	},
	{
		// redirect to googlesource
		path:    "golang.org/x/text",
		rev:     "4e4a3210bb",
		version: "v0.0.0-20180208041248-4e4a3210bb54",
		name:    "4e4a3210bb54bb31f6ab2cdca2edcc0b50c420c1",
		short:   "4e4a3210bb54",
		time:    time.Date(2018, 2, 8, 4, 12, 48, 0, time.UTC),
	},
	{
		path:    "github.com/pkg/errors",
		rev:     "v0.8.0",
		version: "v0.8.0",
		name:    "645ef00459ed84a119197bfb8d8205042c6df63d",
		short:   "645ef00459ed",
		time:    time.Date(2016, 9, 29, 1, 48, 1, 0, time.UTC),
	},
	{
		// package in subdirectory - custom domain
		path:    "golang.org/x/net/context",
		lookerr: "module root is \"golang.org/x/net\"",
	},
	{
		// package in subdirectory - github
		path:     "github.com/rsc/quote/buggy",
		rev:      "c4d4236f",
		version:  "v0.0.0-20180214154420-c4d4236f9242",
		name:     "c4d4236f92427c64bfbcf1cc3f8142ab18f30b22",
		short:    "c4d4236f9242",
		time:     time.Date(2018, 2, 14, 15, 44, 20, 0, time.UTC),
		gomoderr: "missing go.mod",
	},
	{
		path:    "gopkg.in/yaml.v2",
		rev:     "d670f940",
		version: "v2.0.0-20180109114331-d670f9405373",
		name:    "d670f9405373e636a5a2765eea47fac0c9bc91a4",
		short:   "d670f9405373",
		time:    time.Date(2018, 1, 9, 11, 43, 31, 0, time.UTC),
		gomod:   "//vgo 0.0.4\n\nmodule gopkg.in/yaml.v2\n",
	},
	{
		path:    "gopkg.in/check.v1",
		rev:     "20d25e280405",
		version: "v1.0.0-20161208181325-20d25e280405",
		name:    "20d25e2804050c1cd24a7eea1e7a6447dd0e74ec",
		short:   "20d25e280405",
		time:    time.Date(2016, 12, 8, 18, 13, 25, 0, time.UTC),
		gomod:   "//vgo 0.0.4\n\nmodule gopkg.in/check.v1\n",
	},
	{
		path:    "gopkg.in/yaml.v2",
		rev:     "v2",
		version: "v2.0.0-20180328195020-5420a8b6744d",
		name:    "5420a8b6744d3b0345ab293f6fcba19c978f1183",
		short:   "5420a8b6744d",
		time:    time.Date(2018, 3, 28, 19, 50, 20, 0, time.UTC),
		gomod:   "module \"gopkg.in/yaml.v2\"\n\nrequire (\n\t\"gopkg.in/check.v1\" v0.0.0-20161208181325-20d25e280405\n)\n",
	},
	{
		path:    "vcs-test.golang.org/go/mod/gitrepo1",
		rev:     "master",
		version: "v0.0.0-20180417194322-ede458df7cd0",
		name:    "ede458df7cd0fdca520df19a33158086a8a68e81",
		short:   "ede458df7cd0",
		time:    time.Date(2018, 4, 17, 19, 43, 22, 0, time.UTC),
		gomod:   "//vgo 0.0.4\n\nmodule vcs-test.golang.org/go/mod/gitrepo1\n",
	},
	{
		path:    "gopkg.in/natefinch/lumberjack.v2",
		rev:     "latest",
		version: "v2.0.0-20170531160350-a96e63847dc3",
		name:    "a96e63847dc3c67d17befa69c303767e2f84e54f",
		short:   "a96e63847dc3",
		time:    time.Date(2017, 5, 31, 16, 3, 50, 0, time.UTC),
		gomod:   "//vgo 0.0.4\n\nmodule gopkg.in/natefinch/lumberjack.v2\n",
	},
	{
		path: "gopkg.in/natefinch/lumberjack.v2",
		// This repo has a v2.1 tag.
		// We only allow semver references to tags that are fully qualified, as in v2.1.0.
		// Because we can't record v2.1.0 (the actual tag is v2.1), we record a pseudo-version
		// instead, same as if the tag were any other non-version-looking string.
		// We use a v2 pseudo-version here because of the .v2 in the path, not because
		// of the v2 in the rev.
		rev:     "v2.1", // non-canonical semantic version turns into pseudo-version
		version: "v2.0.0-20170531160350-a96e63847dc3",
		name:    "a96e63847dc3c67d17befa69c303767e2f84e54f",
		short:   "a96e63847dc3",
		time:    time.Date(2017, 5, 31, 16, 3, 50, 0, time.UTC),
		gomod:   "//vgo 0.0.4\n\nmodule gopkg.in/natefinch/lumberjack.v2\n",
	},
}

func TestCodeRepo(t *testing.T) {
	testenv.MustHaveExternalNetwork(t)

	tmpdir, err := ioutil.TempDir("", "vgo-modfetch-test-")
	if err != nil {
		t.Fatal(err)
	}
	defer os.RemoveAll(tmpdir)
	for _, tt := range codeRepoTests {
		t.Run(strings.Replace(tt.path, "/", "_", -1)+"/"+tt.rev, func(t *testing.T) {
			repo, err := Lookup(tt.path)
			if err != nil {
				if tt.lookerr != "" {
					if err.Error() == tt.lookerr {
						return
					}
					t.Errorf("Lookup(%q): %v, want error %q", tt.path, err, tt.lookerr)
				}
				t.Fatalf("Lookup(%q): %v", tt.path, err)
			}
			if tt.mpath == "" {
				tt.mpath = tt.path
			}
			if mpath := repo.ModulePath(); mpath != tt.mpath {
				t.Errorf("repo.ModulePath() = %q, want %q", mpath, tt.mpath)
			}
			info, err := repo.Stat(tt.rev)
			if err != nil {
				if tt.err != "" {
					if !strings.Contains(err.Error(), tt.err) {
						t.Fatalf("repoStat(%q): %v, wanted %q", tt.rev, err, tt.err)
					}
					return
				}
				t.Fatalf("repo.Stat(%q): %v", tt.rev, err)
			}
			if tt.err != "" {
				t.Errorf("repo.Stat(%q): success, wanted error", tt.rev)
			}
			if info.Version != tt.version {
				t.Errorf("info.Version = %q, want %q", info.Version, tt.version)
			}
			if info.Name != tt.name {
				t.Errorf("info.Name = %q, want %q", info.Name, tt.name)
			}
			if info.Short != tt.short {
				t.Errorf("info.Short = %q, want %q", info.Short, tt.short)
			}
			if !info.Time.Equal(tt.time) {
				t.Errorf("info.Time = %v, want %v", info.Time, tt.time)
			}
			if tt.gomod != "" || tt.gomoderr != "" {
				data, err := repo.GoMod(tt.version)
				if err != nil && tt.gomoderr == "" {
					t.Errorf("repo.GoMod(%q): %v", tt.version, err)
				} else if err != nil && tt.gomoderr != "" {
					if err.Error() != tt.gomoderr {
						t.Errorf("repo.GoMod(%q): %v, want %q", tt.version, err, tt.gomoderr)
					}
				} else if tt.gomoderr != "" {
					t.Errorf("repo.GoMod(%q) = %q, want error %q", tt.version, data, tt.gomoderr)
				} else if string(data) != tt.gomod {
					t.Errorf("repo.GoMod(%q) = %q, want %q", tt.version, data, tt.gomod)
				}
			}
			if tt.zip != nil || tt.ziperr != "" {
				zipfile, err := repo.Zip(tt.version, tmpdir)
				if err != nil {
					if tt.ziperr != "" {
						if err.Error() == tt.ziperr {
							return
						}
						t.Fatalf("repo.Zip(%q): %v, want error %q", tt.version, err, tt.ziperr)
					}
					t.Fatalf("repo.Zip(%q): %v", tt.version, err)
				}
				if tt.ziperr != "" {
					t.Errorf("repo.Zip(%q): success, want error %q", tt.version, tt.ziperr)
				}
				prefix := tt.path + "@" + tt.version + "/"
				z, err := zip.OpenReader(zipfile)
				if err != nil {
					t.Fatalf("open zip %s: %v", zipfile, err)
				}
				var names []string
				for _, file := range z.File {
					if !strings.HasPrefix(file.Name, prefix) {
						t.Errorf("zip entry %v does not start with prefix %v", file.Name, prefix)
						continue
					}
					names = append(names, file.Name[len(prefix):])
				}
				z.Close()
				if !reflect.DeepEqual(names, tt.zip) {
					t.Fatalf("zip = %v\nwant %v\n", names, tt.zip)
				}
			}
		})
	}
}

var importTests = []struct {
	path  string
	mpath string
	err   string
}{
	{
		path:  "golang.org/x/net/context",
		mpath: "golang.org/x/net",
	},
	{
		path:  "github.com/rsc/quote/buggy",
		mpath: "github.com/rsc/quote",
	},
	{
		path:  "golang.org/x/net",
		mpath: "golang.org/x/net",
	},
	{
		path:  "github.com/rsc/quote",
		mpath: "github.com/rsc/quote",
	},
	{
		path: "golang.org/x/foo/bar",
		err:  "unknown module golang.org/x/foo/bar: no go-import tags",
	},
}

func TestImport(t *testing.T) {
	testenv.MustHaveExternalNetwork(t)

	for _, tt := range importTests {
		t.Run(strings.Replace(tt.path, "/", "_", -1), func(t *testing.T) {
			repo, info, err := Import(tt.path, nil)
			if err != nil {
				if tt.err != "" {
					if err.Error() == tt.err {
						return
					}
					t.Errorf("Import(%q): %v, want error %q", tt.path, err, tt.err)
				}
				t.Fatalf("Lookup(%q): %v", tt.path, err)
			}
			if mpath := repo.ModulePath(); mpath != tt.mpath {
				t.Errorf("repo.ModulePath() = %q (%v), want %q", mpath, info.Version, tt.mpath)
			}
		})
	}
}

var codeRepoVersionsTests = []struct {
	path     string
	prefix   string
	versions []string
}{
	// TODO: Why do we allow a prefix here at all?
	{
		path:     "github.com/rsc/vgotest1",
		versions: []string{"v0.0.0", "v0.0.1", "v1.0.0", "v1.0.1", "v1.0.2", "v1.0.3", "v1.1.0"},
	},
	{
		path:     "github.com/rsc/vgotest1",
		prefix:   "v1.0",
		versions: []string{"v1.0.0", "v1.0.1", "v1.0.2", "v1.0.3"},
	},
	{
		path:     "github.com/rsc/vgotest1/v2",
		versions: []string{"v2.0.0", "v2.0.1", "v2.0.2", "v2.0.3", "v2.0.4", "v2.0.5", "v2.0.6"},
	},
	{
		path:     "swtch.com/testmod",
		versions: []string{"v1.0.0", "v1.1.1"},
	},
	{
		path:     "gopkg.in/russross/blackfriday.v2",
		versions: []string{"v2.0.0"},
	},
	{
		path:     "gopkg.in/natefinch/lumberjack.v2",
		versions: nil,
	},
}

func TestCodeRepoVersions(t *testing.T) {
	testenv.MustHaveExternalNetwork(t)

	tmpdir, err := ioutil.TempDir("", "vgo-modfetch-test-")
	if err != nil {
		t.Fatal(err)
	}
	defer os.RemoveAll(tmpdir)
	for _, tt := range codeRepoVersionsTests {
		t.Run(strings.Replace(tt.path, "/", "_", -1), func(t *testing.T) {
			repo, err := Lookup(tt.path)
			if err != nil {
				t.Fatalf("Lookup(%q): %v", tt.path, err)
			}
			list, err := repo.Versions(tt.prefix)
			if err != nil {
				t.Fatalf("Versions(%q): %v", tt.prefix, err)
			}
			if !reflect.DeepEqual(list, tt.versions) {
				t.Fatalf("Versions(%q):\nhave %v\nwant %v", tt.prefix, list, tt.versions)
			}
		})
	}
}

var latestTests = []struct {
	path    string
	version string
	err     string
}{
	{
		path: "github.com/rsc/empty",
		err:  "no commits",
	},
	{
		path:    "github.com/rsc/vgotest1",
		version: "v0.0.0-20180219223237-a08abb797a67",
	},
	{
		path:    "swtch.com/testmod",
		version: "v1.1.1",
	},
}

func TestLatest(t *testing.T) {
	testenv.MustHaveExternalNetwork(t)

	tmpdir, err := ioutil.TempDir("", "vgo-modfetch-test-")
	if err != nil {
		t.Fatal(err)
	}
	defer os.RemoveAll(tmpdir)
	for _, tt := range latestTests {
		name := strings.Replace(tt.path, "/", "_", -1)
		t.Run(name, func(t *testing.T) {
			repo, err := Lookup(tt.path)
			if err != nil {
				t.Fatalf("Lookup(%q): %v", tt.path, err)
			}
			info, err := repo.Latest()
			if err != nil {
				if tt.err != "" {
					if err.Error() == tt.err {
						return
					}
					t.Fatalf("Latest(): %v, want %q", err, tt.err)
				}
				t.Fatalf("Latest(): %v", err)
			}
			if info.Version != tt.version {
				t.Fatalf("Latest() = %v, want %v", info.Version, tt.version)
			}
		})
	}
}

// fixedTagsRepo is a fake codehost.Repo that returns a fixed list of tags
type fixedTagsRepo struct {
	tags []string
}

func (ch *fixedTagsRepo) Tags(string) ([]string, error)                  { return ch.tags, nil }
func (ch *fixedTagsRepo) Latest() (*codehost.RevInfo, error)             { panic("not impl") }
func (ch *fixedTagsRepo) ReadFile(string, string, int64) ([]byte, error) { panic("not impl") }
func (ch *fixedTagsRepo) ReadZip(string, string, int64) (io.ReadCloser, string, error) {
	panic("not impl")
}
func (ch *fixedTagsRepo) Stat(string) (*codehost.RevInfo, error) { panic("not impl") }

func TestNonCanonicalSemver(t *testing.T) {
	root := "golang.org/x/issue24476"
	ch := &fixedTagsRepo{
		tags: []string{
			"", "huh?", "1.0.1",
			// what about "version 1 dot dogcow"?
			"v1.🐕.🐄",
			"v1", "v0.1",
			// and one normal one that should pass through
			"v1.0.1",
		},
	}

	cr, err := newCodeRepo(ch, root, root)
	if err != nil {
		t.Fatal(err)
	}

	v, err := cr.Versions("")
	if err != nil {
		t.Fatal(err)
	}
	if len(v) != 1 || v[0] != "v1.0.1" {
		t.Fatal("unexpected versions returned:", v)
	}
}
