From: Bryan C. Mills Date: Mon, 4 Nov 2019 03:08:35 +0000 (-0500) Subject: cmd/go: derive TestExecutableGOROOT environment from tg.env instead of os.Environ() X-Git-Tag: go1.14beta1~404 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=414c1d454e6d388443239209220fe0783d4dac71;p=gostls13.git cmd/go: derive TestExecutableGOROOT environment from tg.env instead of os.Environ() TestExecutableGOROOT, unlike most other tests in go_test.go, was running subcommands in a process with an environment derived directly from os.Environ(), rather than using tg.env on its testgoData object. Since tg.env is what sets GO111MODULE=off for GOPATH-mode tests, that caused TestExecutableGOROOT to unexpectedly run in module mode instead of GOPATH mode. If the user's environment included 'GOFLAGS=-mod=mod', that would cause the test to spuriously fail due to the inability to download modules to $HOME (which in this test binary is hard-coded to "/test-go-home-does-not-exist"). Updates #33848 Change-Id: I2f343008dd9e38cd76b9919eafd5a3181d0cbd6f Reviewed-on: https://go-review.googlesource.com/c/go/+/205064 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index a6bb8d69b0..f646beff47 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -4687,23 +4687,19 @@ func copyFile(src, dst string, perm os.FileMode) error { return err2 } +// TestExecutableGOROOT verifies that the cmd/go binary itself uses +// os.Executable (when available) to locate GOROOT. func TestExecutableGOROOT(t *testing.T) { skipIfGccgo(t, "gccgo has no GOROOT") - if runtime.GOOS == "openbsd" { - t.Skipf("test case does not work on %s, missing os.Executable", runtime.GOOS) - } - // Env with no GOROOT. - var env []string - for _, e := range os.Environ() { - if !strings.HasPrefix(e, "GOROOT=") { - env = append(env, e) - } - } + // Note: Must not call tg methods inside subtests: tg is attached to outer t. + tg := testgo(t) + tg.unsetenv("GOROOT") + defer tg.cleanup() check := func(t *testing.T, exe, want string) { cmd := exec.Command(exe, "env", "GOROOT") - cmd.Env = env + cmd.Env = tg.env out, err := cmd.CombinedOutput() if err != nil { t.Fatalf("%s env GOROOT: %v, %s", exe, err, out) @@ -4723,10 +4719,6 @@ func TestExecutableGOROOT(t *testing.T) { } } - // Note: Must not call tg methods inside subtests: tg is attached to outer t. - tg := testgo(t) - defer tg.cleanup() - tg.makeTempdir() tg.tempDir("new/bin") newGoTool := tg.path("new/bin/go" + exeSuffix) @@ -4773,8 +4765,9 @@ func TestExecutableGOROOT(t *testing.T) { } cmd := exec.Command(newGoTool, "run", "testdata/print_goroot.go") - cmd.Env = env - out, err := cmd.CombinedOutput() + cmd.Env = tg.env + cmd.Stderr = os.Stderr + out, err := cmd.Output() if err != nil { t.Fatalf("%s run testdata/print_goroot.go: %v, %s", newGoTool, err, out) } diff --git a/src/cmd/go/testdata/print_goroot.go b/src/cmd/go/testdata/print_goroot.go index 5477291060..91fbf7d8ec 100644 --- a/src/cmd/go/testdata/print_goroot.go +++ b/src/cmd/go/testdata/print_goroot.go @@ -4,8 +4,11 @@ package main -import "runtime" +import ( + "fmt" + "runtime" +) func main() { - println(runtime.GOROOT()) + fmt.Println(runtime.GOROOT()) }