]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: derive TestExecutableGOROOT environment from tg.env instead of os.Environ()
authorBryan C. Mills <bcmills@google.com>
Mon, 4 Nov 2019 03:08:35 +0000 (22:08 -0500)
committerBryan C. Mills <bcmills@google.com>
Tue, 5 Nov 2019 16:31:48 +0000 (16:31 +0000)
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 <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/go_test.go
src/cmd/go/testdata/print_goroot.go

index a6bb8d69b04afd461549e500458341e5518a6e18..f646beff4796e140d5aa81dbfd78f89dfd420144 100644 (file)
@@ -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)
                }
index 547729106090d4deed7baaf53e16ab7a78604af7..91fbf7d8ec38cd6fd1c23dd7080f4a060420387b 100644 (file)
@@ -4,8 +4,11 @@
 
 package main
 
-import "runtime"
+import (
+       "fmt"
+       "runtime"
+)
 
 func main() {
-       println(runtime.GOROOT())
+       fmt.Println(runtime.GOROOT())
 }