From 9670e81c2e776b4781bc4cecddf45052ebf0afe6 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 5 Mar 2019 08:51:44 -0500 Subject: [PATCH] all: add -mod=vendor to GOFLAGS in tests that execute 'go' commands within std or cmd Updates #30228 Updates #30240 Updates #30241 Change-Id: Idc311ba77e99909318b5b86f8ef82d4878f73e47 Reviewed-on: https://go-review.googlesource.com/c/go/+/165378 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/addr2line/addr2line_test.go | 2 ++ src/cmd/compile/internal/gc/scope_test.go | 2 ++ src/cmd/cover/cover_test.go | 2 ++ src/cmd/go/go_test.go | 4 ++- src/cmd/internal/obj/x86/obj6_test.go | 2 ++ src/cmd/link/internal/ld/ld_test.go | 2 ++ src/cmd/link/link_test.go | 2 ++ src/cmd/nm/nm_test.go | 2 ++ src/cmd/objdump/objdump_test.go | 2 ++ src/cmd/vet/all/main.go | 1 + src/cmd/vet/vet_test.go | 2 ++ src/crypto/x509/x509_test.go | 2 ++ src/debug/gosym/pclntab_test.go | 2 ++ src/go/importer/importer_test.go | 2 ++ .../internal/srcimporter/srcimporter_test.go | 18 +------------ src/internal/testenv/testenv.go | 26 +++++++++++++++++++ src/runtime/crash_test.go | 2 ++ src/runtime/pprof/proto_test.go | 2 ++ 18 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/cmd/addr2line/addr2line_test.go b/src/cmd/addr2line/addr2line_test.go index 22bf1379bb..183a22f8f3 100644 --- a/src/cmd/addr2line/addr2line_test.go +++ b/src/cmd/addr2line/addr2line_test.go @@ -115,3 +115,5 @@ func TestAddr2Line(t *testing.T) { testAddr2Line(t, exepath, syms[symName]) testAddr2Line(t, exepath, "0x"+syms[symName]) } + +func init() { testenv.SetModVendor() } diff --git a/src/cmd/compile/internal/gc/scope_test.go b/src/cmd/compile/internal/gc/scope_test.go index e327dc02af..e4861c686c 100644 --- a/src/cmd/compile/internal/gc/scope_test.go +++ b/src/cmd/compile/internal/gc/scope_test.go @@ -202,6 +202,8 @@ var testfile = []testline{ const detailOutput = false +func init() { testenv.SetModVendor() } + // Compiles testfile checks that the description of lexical blocks emitted // by the linker in debug_info, for each function in the main package, // corresponds to what we expect it to be. diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index f002442b63..d7e6ca99b7 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -77,6 +77,8 @@ var debug = flag.Bool("debug", false, "keep rewritten files for debugging") // We use TestMain to set up a temporary directory and remove it when // the tests are done. func TestMain(m *testing.M) { + testenv.SetModVendor() + dir, err := ioutil.TempDir("", "gotestcover") if err != nil { fmt.Fprintln(os.Stderr, err) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index dfada6c806..9ba52e609e 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -212,7 +212,9 @@ func TestMain(m *testing.M) { return } - out, err := exec.Command(gotool, args...).CombinedOutput() + buildCmd := exec.Command(gotool, args...) + buildCmd.Env = append(os.Environ(), "GOFLAGS=-mod=vendor") + out, err := buildCmd.CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "building testgo failed: %v\n%s", err, out) os.Exit(2) diff --git a/src/cmd/internal/obj/x86/obj6_test.go b/src/cmd/internal/obj/x86/obj6_test.go index c5399744f2..2b1a729c8f 100644 --- a/src/cmd/internal/obj/x86/obj6_test.go +++ b/src/cmd/internal/obj/x86/obj6_test.go @@ -134,6 +134,8 @@ func parseOutput(t *testing.T, td *ParsedTestData, asmout []byte) { } } +func init() { testenv.SetModVendor() } + func TestDynlink(t *testing.T) { testenv.MustHaveGoBuild(t) diff --git a/src/cmd/link/internal/ld/ld_test.go b/src/cmd/link/internal/ld/ld_test.go index 0816429316..219b2a63ca 100644 --- a/src/cmd/link/internal/ld/ld_test.go +++ b/src/cmd/link/internal/ld/ld_test.go @@ -13,6 +13,8 @@ import ( "testing" ) +func init() { testenv.SetModVendor() } + func TestUndefinedRelocErrors(t *testing.T) { t.Parallel() testenv.MustHaveGoBuild(t) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 5200c3a6f0..5043a778ca 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -38,6 +38,8 @@ func TestLargeSymName(t *testing.T) { _ = AuthorPaidByTheColumnInch } +func init() { testenv.SetModVendor() } + func TestIssue21703(t *testing.T) { t.Parallel() diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go index 8176ddd7f4..82f4235510 100644 --- a/src/cmd/nm/nm_test.go +++ b/src/cmd/nm/nm_test.go @@ -30,6 +30,8 @@ func testMain(m *testing.M) int { return 0 } + testenv.SetModVendor() + tmpDir, err := ioutil.TempDir("", "TestNM") if err != nil { fmt.Println("TempDir failed:", err) diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go index a2ca329609..7c874e853b 100644 --- a/src/cmd/objdump/objdump_test.go +++ b/src/cmd/objdump/objdump_test.go @@ -24,6 +24,8 @@ func TestMain(m *testing.M) { if !testenv.HasGoBuild() { return } + testenv.SetModVendor() + var exitcode int if err := buildObjdump(); err == nil { exitcode = m.Run() diff --git a/src/cmd/vet/all/main.go b/src/cmd/vet/all/main.go index 2500c690bf..8cc4140e6e 100644 --- a/src/cmd/vet/all/main.go +++ b/src/cmd/vet/all/main.go @@ -44,6 +44,7 @@ func main() { log.SetPrefix("vet/all: ") log.SetFlags(0) + testenv.SetModVendor() var err error cmdGoPath, err = testenv.GoTool() if err != nil { diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go index 5d8139d977..62c28fb9a2 100644 --- a/src/cmd/vet/vet_test.go +++ b/src/cmd/vet/vet_test.go @@ -32,6 +32,8 @@ func TestMain(m *testing.M) { } func testMain(m *testing.M) int { + testenv.SetModVendor() + dir, err := ioutil.TempDir("", "vet_test") if err != nil { fmt.Fprintln(os.Stderr, err) diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index f5851f1f11..fbcdb7b58e 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -1146,6 +1146,8 @@ func TestParsePEMCRL(t *testing.T) { // Can't check the signature here without a package cycle. } +func init() { testenv.SetModVendor() } + func TestImports(t *testing.T) { testenv.MustHaveGoRun(t) diff --git a/src/debug/gosym/pclntab_test.go b/src/debug/gosym/pclntab_test.go index d21f0e24a8..c67fb66f0d 100644 --- a/src/debug/gosym/pclntab_test.go +++ b/src/debug/gosym/pclntab_test.go @@ -21,6 +21,8 @@ var ( pclinetestBinary string ) +func init() { testenv.SetModVendor() } + func dotest(t *testing.T) { testenv.MustHaveGoBuild(t) // For now, only works on amd64 platforms. diff --git a/src/go/importer/importer_test.go b/src/go/importer/importer_test.go index ff6e12c0da..2887ec6ea5 100644 --- a/src/go/importer/importer_test.go +++ b/src/go/importer/importer_test.go @@ -16,6 +16,8 @@ import ( "testing" ) +func init() { testenv.SetModVendor() } + func TestForCompiler(t *testing.T) { testenv.MustHaveGoBuild(t) diff --git a/src/go/internal/srcimporter/srcimporter_test.go b/src/go/internal/srcimporter/srcimporter_test.go index f8e1c323b3..06472447a6 100644 --- a/src/go/internal/srcimporter/srcimporter_test.go +++ b/src/go/internal/srcimporter/srcimporter_test.go @@ -10,7 +10,6 @@ import ( "go/types" "internal/testenv" "io/ioutil" - "os" "path" "path/filepath" "runtime" @@ -19,22 +18,7 @@ import ( "time" ) -func TestMain(m *testing.M) { - // Add -mod=vendor to GOFLAGS to ensure that we don't fetch modules while importing std or cmd. - // - // TODO(golang.org/issue/30240): If we load go.mod files from vendor/ - // automatically, this will probably no longer be necessary. - var goflags []string - for _, f := range strings.Fields(os.Getenv("GOFLAGS")) { - if !strings.HasPrefix(f, "-mod=") && !strings.HasPrefix(f, "--mod=") { - goflags = append(goflags, f) - } - } - goflags = append(goflags, "-mod=vendor") - os.Setenv("GOFLAGS", strings.Join(goflags, " ")) - - os.Exit(m.Run()) -} +func init() { testenv.SetModVendor() } const maxTime = 2 * time.Second diff --git a/src/internal/testenv/testenv.go b/src/internal/testenv/testenv.go index 8f69fe0da5..72e4d803cb 100644 --- a/src/internal/testenv/testenv.go +++ b/src/internal/testenv/testenv.go @@ -19,6 +19,7 @@ import ( "runtime" "strconv" "strings" + "sync" "testing" ) @@ -77,6 +78,31 @@ func MustHaveGoRun(t testing.TB) { } } +var modVendorOnce sync.Once + +// SetModVendor adds the "-mod=vendor" flag to the GOFLAGS environment variable. +// This allows tests whose working directories are within the cmd and std +// modules to run ``go'' commands without accessing the network to load +// dependencies modules. +// +// SetModVendor must be called before any test may read the GOFLAGS environment +// variable. +// +// TODO(golang.org/issue/30240): If we load go.mod files from vendor/ +// automatically, this will probably no longer be necessary. +func SetModVendor() { + modVendorOnce.Do(func() { + var goflags []string + for _, f := range strings.Fields(os.Getenv("GOFLAGS")) { + if !strings.HasPrefix(f, "-mod=") && !strings.HasPrefix(f, "--mod=") { + goflags = append(goflags, f) + } + } + goflags = append(goflags, "-mod=vendor") + os.Setenv("GOFLAGS", strings.Join(goflags, " ")) + }) +} + // GoToolPath reports the path to the Go tool. // It is a convenience wrapper around GoTool. // If the tool is unavailable GoToolPath calls t.Skip. diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go index 03ebf022a6..3a27b269a1 100644 --- a/src/runtime/crash_test.go +++ b/src/runtime/crash_test.go @@ -25,6 +25,8 @@ import ( var toRemove []string func TestMain(m *testing.M) { + testenv.SetModVendor() + status := m.Run() for _, file := range toRemove { os.RemoveAll(file) diff --git a/src/runtime/pprof/proto_test.go b/src/runtime/pprof/proto_test.go index 4452d51231..a276d81c49 100644 --- a/src/runtime/pprof/proto_test.go +++ b/src/runtime/pprof/proto_test.go @@ -301,6 +301,8 @@ func TestProcSelfMaps(t *testing.T) { }) } +func init() { testenv.SetModVendor() } + // TestMapping checkes the mapping section of CPU profiles // has the HasFunctions field set correctly. If all PCs included // in the samples are successfully symbolized, the corresponding