]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: fix TestScript/build_trimpath_goroot when built with a mismatched GOROOT_FINAL
authorBryan C. Mills <bcmills@google.com>
Fri, 8 Apr 2022 19:23:14 +0000 (15:23 -0400)
committerBryan Mills <bcmills@google.com>
Tue, 12 Apr 2022 03:13:28 +0000 (03:13 +0000)
Fixes #52236.
Updates #51461.

Change-Id: Ie91e0256afd45e9bbd60fd8cdc696363027ab696
Reviewed-on: https://go-review.googlesource.com/c/go/+/399156
Run-TryBot: Bryan Mills <bcmills@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/go/go_test.go
src/cmd/go/script_test.go
src/cmd/go/testdata/script/README
src/cmd/go/testdata/script/build_trimpath_goroot.txt

index 426228a831f5ace48c3e79dad407f7024b41c91c..b17c77665011ed3ad8330c5becc2ac029b55168d 100644 (file)
@@ -78,6 +78,10 @@ func tooSlow(t *testing.T) {
 // (temp) directory.
 var testGOROOT string
 
+// testGOROOT_FINAL is the GOROOT_FINAL with which the test binary is assumed to
+// have been built.
+var testGOROOT_FINAL = os.Getenv("GOROOT_FINAL")
+
 var testGOCACHE string
 
 var testGo string
index 76c542f32a21c03212d69d938606623a83f36724..6254cf97c1c7ecbe983dc85b09f6de1776d3bf06 100644 (file)
@@ -175,7 +175,7 @@ func (ts *testScript) setup() {
                "GOPROXY=" + proxyURL,
                "GOPRIVATE=",
                "GOROOT=" + testGOROOT,
-               "GOROOT_FINAL=" + os.Getenv("GOROOT_FINAL"), // causes spurious rebuilds and breaks the "stale" built-in if not propagated
+               "GOROOT_FINAL=" + testGOROOT_FINAL, // causes spurious rebuilds and breaks the "stale" built-in if not propagated
                "GOTRACEBACK=system",
                "TESTGO_GOROOT=" + testGOROOT,
                "GOSUMDB=" + testSumDBVerifierKey,
@@ -385,6 +385,8 @@ Script:
                                                }
                                        }
                                }
+                       case "mismatched-goroot":
+                               ok = testGOROOT_FINAL != "" && testGOROOT_FINAL != testGOROOT
                        default:
                                if strings.HasPrefix(cond.tag, "exec:") {
                                        prog := cond.tag[len("exec:"):]
index 17b582d6627706c2409894609671f9ace9291ddd..85e575d56eed39d4aef1891b120fbdd07cb65d8e 100644 (file)
@@ -90,6 +90,8 @@ should only run when the condition is satisfied. The available conditions are:
    - [exec:prog] for whether prog is available for execution (found by exec.LookPath)
    - [GODEBUG:value] for whether value is one of the comma-separated entries in the GODEBUG variable
    - [buildmode:value] for whether -buildmode=value is supported
+   - [trimpath] for whether the 'go' binary was built with -trimpath
+   - [mismatched-goroot] for whether the test's GOROOT_FINAL does not match the real GOROOT
 
 A condition can be negated: [!short] means to run the rest of the line
 when testing.Short() is false. Multiple conditions may be given for a single
index 7b870ab739d38d124bd7c5f86866f73f6179198b..91e5107e589db546d073a95a309ae463dab74f6c 100644 (file)
@@ -8,24 +8,52 @@
 # TODO(#51483): when runtime.GOROOT() returns the empty string,
 # go/build should default to 'go env GOROOT' instead.
 
-env GOROOT=
 env GOROOT_FINAL=
 
+[trimpath] env GOROOT=
 [trimpath] ! go env GOROOT
 [trimpath] stderr '^go: cannot find GOROOT directory: ''go'' binary is trimmed and GOROOT is not set$'
-[trimpath] stop
+[trimpath] env GOROOT=$TESTGO_GOROOT
+
+[short] stop
 
+# With GOROOT still set but GOROOT_FINAL unset, 'go build' and 'go test -c'
+# should cause runtime.GOROOT() to report either the correct GOROOT
+# (without -trimpath) or no GOROOT at all (with -trimpath).
 
-[short] skip
+go build -o example.exe .
+go build -trimpath -o example-trimpath.exe .
+go test -c -o example.test.exe .
+go test -trimpath -c -o example.test-trimpath.exe .
 
-go run .
+env GOROOT=
+
+exec ./example.exe
 stdout '^GOROOT '$TESTGO_GOROOT'$'
 stdout '^runtime '$TESTGO_GOROOT${/}src${/}runtime'$'
 
-go test -v .
+! exec ./example-trimpath.exe
+stdout '^GOROOT $'
+stderr 'cannot find package "runtime" in any of:\n\t\(\$GOROOT not set\)\n\t'$WORK${/}gopath${/}src${/}runtime' \(from \$GOPATH\)\n\z'
+
+exec ./example.test.exe -test.v
 stdout '^GOROOT '$TESTGO_GOROOT'$'
 stdout '^runtime '$TESTGO_GOROOT${/}src${/}runtime'$'
 
+! exec ./example.test-trimpath.exe -test.v
+stdout '^GOROOT $'
+stderr 'cannot find package "runtime" in any of:\n\t\(\$GOROOT not set\)\n\t'$WORK${/}gopath${/}src${/}runtime' \(from \$GOPATH\)$'
+
+# If a correct GOROOT is baked in to the 'go' command itself, 'go run' and
+# 'go test' should not implicitly set GOROOT in the process environment
+# (because that could mask an unexpected production dependency on the GOROOT
+# environment variable), but 'go generate' should (because the generator may
+# reasonably expect to be able to locate the GOROOT for which it is generating
+# code).
+
+[trimpath] stop
+[mismatched-goroot] stop
+
 ! go run -trimpath .
 stdout '^GOROOT $'
 stderr 'cannot find package "runtime" in any of:\n\t\(\$GOROOT not set\)\n\t'$WORK${/}gopath${/}src${/}runtime' \(from \$GOPATH\)\nexit status 1\n\z'