env GOTOOLCHAIN=auto env TESTGO_VERSION=go1.21.1 # Basic switch should work. env TESTGO_VERSION_SWITCH=switch go version stdout go1.21.99 # Toolchain target mismatch should be detected. env TESTGO_VERSION_SWITCH=mismatch ! go version stderr '^go: toolchain go1.21.1 invoked to provide go1.21.99$' # Toolchain loop should be detected. env TESTGO_VERSION_SWITCH=loop ! go version stderr -count=10 '^go: switching from go1.21.1 to go1.21.99 \[depth 9[0-9]\]$' stderr -count=1 '^go: switching from go1.21.1 to go1.21.99 \[depth 100\]$' stderr '^go: too many toolchain switches$' [short] skip # Internal env vars should not leak to go test or go run. env TESTGO_VERSION_SWITCH=switch go version stdout go1.21.99 go test stdout clean go run . stdout clean -- go.mod -- module m go 1.21.99 -- m_test.go -- package main import "testing" func TestEnv(t *testing.T) { // the check is in func init in m.go } -- m.go -- package main import "os" func init() { envs := []string{ "GOTOOLCHAIN_INTERNAL_SWITCH_COUNT", "GOTOOLCHAIN_INTERNAL_SWITCH_VERSION", } for _, e := range envs { if v := os.Getenv(e); v != "" { panic("$"+e+"="+v) } } os.Stdout.WriteString("clean\n") } func main() { }