blob: 5fe5aaa91bb887079384d37d8d9b4c6ea918d066 [file] [log] [blame]
// Copyright 2015 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.
// Tests for vendoring semantics.
package main_test
import (
"bytes"
"fmt"
"path/filepath"
"regexp"
"strings"
"testing"
)
func TestVendorImports(t *testing.T) {
tg := testgo(t)
defer tg.cleanup()
tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
tg.setenv("GO15VENDOREXPERIMENT", "1")
tg.run("list", "-f", "{{.ImportPath}} {{.Imports}}", "vend/...")
want := `
vend [vend/vendor/p r]
vend/hello [fmt vend/vendor/strings]
vend/subdir [vend/vendor/p r]
vend/vendor/p []
vend/vendor/q []
vend/vendor/strings []
vend/x [vend/x/vendor/p vend/vendor/q vend/x/vendor/r]
vend/x/vendor/p []
vend/x/vendor/p/p [notfound]
vend/x/vendor/r []
`
want = strings.Replace(want+"\t", "\n\t\t", "\n", -1)
want = strings.TrimPrefix(want, "\n")
have := tg.stdout.String()
if have != want {
t.Errorf("incorrect go list output:\n%s", diffSortedOutputs(have, want))
}
}
func TestVendorRun(t *testing.T) {
tg := testgo(t)
defer tg.cleanup()
tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
tg.setenv("GO15VENDOREXPERIMENT", "1")
tg.cd(filepath.Join(tg.pwd(), "testdata/src/vend/hello"))
tg.run("run", "hello.go")
tg.grepStdout("hello, world", "missing hello world output")
}
func TestVendorTest(t *testing.T) {
tg := testgo(t)
defer tg.cleanup()
tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
tg.setenv("GO15VENDOREXPERIMENT", "1")
tg.cd(filepath.Join(tg.pwd(), "testdata/src/vend/hello"))
tg.run("test", "-v")
tg.grepStdout("TestMsgInternal", "missing use in internal test")
tg.grepStdout("TestMsgExternal", "missing use in external test")
}
func TestVendorImportError(t *testing.T) {
tg := testgo(t)
defer tg.cleanup()
tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
tg.setenv("GO15VENDOREXPERIMENT", "1")
tg.runFail("build", "vend/x/vendor/p/p")
re := regexp.MustCompile(`cannot find package "notfound" in any of:
.*[\\/]testdata[\\/]src[\\/]vend[\\/]x[\\/]vendor[\\/]notfound \(vendor tree\)
.*[\\/]testdata[\\/]src[\\/]vend[\\/]vendor[\\/]notfound \(vendor tree\)
.*[\\/]src[\\/]notfound \(from \$GOROOT\)
.*[\\/]testdata[\\/]src[\\/]notfound \(from \$GOPATH\)`)
if !re.MatchString(tg.stderr.String()) {
t.Errorf("did not find expected search list in error text")
}
}
// diffSortedOutput prepares a diff of the already sorted outputs haveText and wantText.
// The diff shows common lines prefixed by a tab, lines present only in haveText
// prefixed by "unexpected: ", and lines present only in wantText prefixed by "missing: ".
func diffSortedOutputs(haveText, wantText string) string {
var diff bytes.Buffer
have := splitLines(haveText)
want := splitLines(wantText)
for len(have) > 0 || len(want) > 0 {
if len(want) == 0 || len(have) > 0 && have[0] < want[0] {
fmt.Fprintf(&diff, "unexpected: %s\n", have[0])
have = have[1:]
continue
}
if len(have) == 0 || len(want) > 0 && want[0] < have[0] {
fmt.Fprintf(&diff, "missing: %s\n", want[0])
want = want[1:]
continue
}
fmt.Fprintf(&diff, "\t%s\n", want[0])
want = want[1:]
have = have[1:]
}
return diff.String()
}
func splitLines(s string) []string {
x := strings.Split(s, "\n")
if x[len(x)-1] == "" {
x = x[:len(x)-1]
}
return x
}