| # Regression test for https://go.dev/issue/51461 and https://go.dev/issue/51483. |
| # |
| # When built with -trimpath, runtime.GOROOT() returned the bogus string "go" |
| # if GOROOT was not set explicitly in the environment. |
| # It should instead return the empty string, since we know that we don't |
| # have a valid path to return. |
| |
| [trimpath] env GOROOT= |
| [trimpath] ! go env GOROOT |
| [trimpath] stderr '^go: cannot find GOROOT directory: ''go'' binary is trimmed and GOROOT is not set$' |
| [trimpath] env GOROOT=$TESTGO_GOROOT |
| |
| [short] stop |
| |
| # With GOROOT still set, '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). |
| |
| 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 . |
| |
| env GOROOT= |
| |
| exec ./example.exe |
| stdout '^GOROOT '$TESTGO_GOROOT'$' |
| stdout '^runtime '$TESTGO_GOROOT${/}src${/}runtime'$' |
| |
| ! 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 |
| |
| ! 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' |
| |
| ! go test -trimpath -v . |
| stdout '^GOROOT $' |
| stdout 'cannot find package "runtime" in any of:\n\t\(\$GOROOT not set\)\n\t'$WORK${/}gopath${/}src${/}runtime' \(from \$GOPATH\)$' |
| |
| env GOFLAGS=-trimpath |
| go generate . |
| stdout '^GOROOT '$TESTGO_GOROOT'$' |
| stdout '^runtime '$TESTGO_GOROOT${/}src${/}runtime'$' |
| |
| -- go.mod -- |
| module example |
| |
| go 1.19 |
| -- main.go -- |
| package main |
| |
| //go:generate go run . |
| |
| import ( |
| "fmt" |
| "go/build" |
| "os" |
| "runtime" |
| ) |
| |
| func main() { |
| fmt.Println("GOROOT", runtime.GOROOT()) |
| |
| p, err := build.Default.Import("runtime", "", build.FindOnly) |
| if err != nil { |
| fmt.Fprintln(os.Stderr, err) |
| os.Exit(1) |
| } |
| fmt.Println("runtime", p.Dir) |
| } |
| -- main_test.go -- |
| package main |
| |
| import "testing" |
| |
| func TestMain(*testing.M) { |
| main() |
| } |