// 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 (
	"bytes"
	"strings"
	"testing"

	"cmd/go/internal/cfg"
	"cmd/go/internal/modconv"
	"cmd/go/internal/modfile"
	"cmd/go/internal/webtest"
)

func TestConvertLegacyConfig(t *testing.T) {
	webtest.LoadOnce("testdata/webtest.txt")
	webtest.Hook()
	defer webtest.Unhook()

	if testing.Verbose() {
		old := cfg.BuildX
		defer func() {
			cfg.BuildX = old
		}()
		cfg.BuildX = true
	}

	var tests = []struct {
		path  string
		vers  string
		gomod string
	}{
		{
			// Gopkg.lock parsing.
			"github.com/golang/dep", "v0.4.0",
			`module github.com/golang/dep

			require (
				github.com/Masterminds/semver v0.0.0-20170726230514-a93e51b5a57e
				github.com/Masterminds/vcs v1.11.1
				github.com/armon/go-radix v0.0.0-20160115234725-4239b77079c7
				github.com/boltdb/bolt v1.3.1
				github.com/go-yaml/yaml v0.0.0-20170407172122-cd8b52f8269e
				github.com/golang/protobuf v0.0.0-20170901042739-5afd06f9d81a
				github.com/jmank88/nuts v0.3.0
				github.com/nightlyone/lockfile v0.0.0-20170707060451-e83dc5e7bba0
				github.com/pelletier/go-toml v0.0.0-20171218135716-b8b5e7696574
				github.com/pkg/errors v0.8.0
				github.com/sdboyer/constext v0.0.0-20170321163424-836a14457353
				golang.org/x/net v0.0.0-20170828231752-66aacef3dd8a
				golang.org/x/sync v0.0.0-20170517211232-f52d1811a629
				golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea
			)`,
		},

		// TODO: https://github.com/docker/distribution uses vendor.conf

		{
			// Godeps.json parsing.
			// TODO: Should v2.0.0 work here too?
			"github.com/docker/distribution", "v0.0.0-20150410205453-85de3967aa93",
			`module github.com/docker/distribution

			require (
				github.com/AdRoll/goamz v0.0.0-20150130162828-d3664b76d905
				github.com/MSOpenTech/azure-sdk-for-go v0.0.0-20150323223030-d90753bcad2e
				github.com/Sirupsen/logrus v0.0.0-20150409230825-55eb11d21d2a
				github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd
				github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b
				github.com/bugsnag/panicwrap v0.0.0-20141110184334-e5f9854865b9
				github.com/codegangsta/cli v0.0.0-20150131031259-6086d7927ec3
				github.com/docker/docker v0.0.0-20150204013315-165ea5c158cf
				github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1
				github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7
				github.com/gorilla/context v0.0.0-20140604161150-14f550f51af5
				github.com/gorilla/handlers v0.0.0-20140825150757-0e84b7d810c1
				github.com/gorilla/mux v0.0.0-20140926153814-e444e69cbd2e
				github.com/jlhawn/go-crypto v0.0.0-20150401213827-cd738dde20f0
				github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43
				github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50
				github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f
				golang.org/x/net v0.0.0-20150202051010-1dfe7915deaf
				gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789
				gopkg.in/yaml.v2 v2.0.0-20150116202057-bef53efd0c76
			)`,
		},

		{
			// golang.org/issue/24585 - confusion about v2.0.0 tag in legacy non-v2 module
			"github.com/fishy/gcsbucket", "v0.0.0-20150410205453-618d60fe84e0",
			`module github.com/fishy/gcsbucket

			require (
				cloud.google.com/go v0.18.0
				github.com/fishy/fsdb v0.0.0-20180217030800-5527ded01371
				github.com/golang/protobuf v1.0.0
				github.com/googleapis/gax-go v0.0.0-20170915024731-317e0006254c
				golang.org/x/net v0.0.0-20180216171745-136a25c244d3
				golang.org/x/oauth2 v0.0.0-20180207181906-543e37812f10
				golang.org/x/text v0.0.0-20180208041248-4e4a3210bb54
				google.golang.org/api v0.0.0-20180217000815-c7a403bb5fe1
				google.golang.org/appengine v1.0.0
				google.golang.org/genproto v0.0.0-20180206005123-2b5a72b8730b
				google.golang.org/grpc v1.10.0
			)`,
		},
	}

	for _, tt := range tests {
		t.Run(strings.Replace(tt.path, "/", "_", -1)+"_"+tt.vers, func(t *testing.T) {
			f, err := modfile.Parse("golden", []byte(tt.gomod), nil)
			if err != nil {
				t.Fatal(err)
			}
			want, err := f.Format()
			if err != nil {
				t.Fatal(err)
			}
			repo, err := Lookup(tt.path)
			if err != nil {
				t.Fatal(err)
			}

			out, err := repo.GoMod(tt.vers)
			if err != nil {
				t.Fatal(err)
			}
			prefix := modconv.Prefix + "\n"
			if !bytes.HasPrefix(out, []byte(prefix)) {
				t.Fatalf("go.mod missing prefix %q:\n%s", prefix, out)
			}
			out = out[len(prefix):]
			if !bytes.Equal(out, want) {
				t.Fatalf("final go.mod:\n%s\n\nwant:\n%s", out, want)
			}
		})
	}
}
