env TESTGO_VERSION=go1.21 env TESTGO_VERSION_SWITCH=switch # First, test 'go mod download' outside of a module. # # There is no go.mod file into which we can record the selected toolchain, # so unfortunately these version switches won't be as reproducible as other # go commands, but that's still preferable to failing entirely or downloading # a module zip that we don't understand. # GOTOOLCHAIN=auto should run the newer toolchain env GOTOOLCHAIN=auto go mod download rsc.io/needgo121@latest rsc.io/needgo122@latest rsc.io/needgo123@latest rsc.io/needall@latest stderr '^go: rsc.io/needall@v0.0.1 requires go >= 1.23; switching to go1.23.9$' ! stderr '\(running' # GOTOOLCHAIN=min+auto should run the newer toolchain env GOTOOLCHAIN=go1.21+auto go mod download rsc.io/needgo121@latest rsc.io/needgo122@latest rsc.io/needgo123@latest rsc.io/needall@latest stderr '^go: rsc.io/needall@v0.0.1 requires go >= 1.23; switching to go1.23.9$' ! stderr '\(running' # GOTOOLCHAIN=go1.21 should NOT run the newer toolchain env GOTOOLCHAIN=go1.21 ! go mod download rsc.io/needgo121@latest rsc.io/needgo122@latest rsc.io/needgo123@latest rsc.io/needall@latest ! stderr switching stderr 'rsc.io/needgo122@v0.0.1 requires go >= 1.22' stderr 'rsc.io/needgo123@v0.0.1 requires go >= 1.23' stderr 'rsc.io/needall@v0.0.1 requires go >= 1.23' stderr 'requires go >= 1.23' ! stderr 'requires go >= 1.21' # that's us! # JSON output should be emitted exactly once, # and non-JSON output should go to stderr instead of stdout. env GOTOOLCHAIN=auto go mod download -json rsc.io/needgo121@latest rsc.io/needgo122@latest rsc.io/needgo123@latest rsc.io/needall@latest stderr '^go: rsc.io/needall@v0.0.1 requires go >= 1.23; switching to go1.23.9$' ! stderr '\(running' stdout -count=1 '"Path": "rsc.io/needgo121",' stdout -count=1 '"Path": "rsc.io/needgo122",' stdout -count=1 '"Path": "rsc.io/needgo123",' stdout -count=1 '"Path": "rsc.io/needall",' # GOTOOLCHAIN=go1.21 should write the errors in the JSON Error fields, not to stderr. env GOTOOLCHAIN=go1.21 ! go mod download -json rsc.io/needgo121@latest rsc.io/needgo122@latest rsc.io/needgo123@latest rsc.io/needall@latest ! stderr switching stdout -count=1 '"Error": "rsc.io/needgo122@v0.0.1 requires go .*= 1.22 \(running go 1.21; GOTOOLCHAIN=go1.21\)"' stdout -count=1 '"Error": "rsc.io/needgo123@v0.0.1 requires go .*= 1.23 \(running go 1.21; GOTOOLCHAIN=go1.21\)"' stdout -count=1 '"Error": "rsc.io/needall@v0.0.1 requires go .*= 1.23 \(running go 1.21; GOTOOLCHAIN=go1.21\)"' ! stdout '"Error": "rsc.io/needgo121' # We can handle this one. ! stderr . # Within a module, 'go mod download' of explicit versions should upgrade if # needed to perform the download, but should not change the main module's # toolchain version (because the downloaded modules are still not required by # the main module). cd example cp go.mod go.mod.orig env GOTOOLCHAIN=auto go mod download rsc.io/needgo121@latest rsc.io/needgo122@latest rsc.io/needgo123@latest rsc.io/needall@latest stderr '^go: rsc.io/needall@v0.0.1 requires go >= 1.23; switching to go1.23.9$' ! stderr '\(running' cmp go.mod go.mod.orig # However, 'go mod download' without arguments should fix up the # 'go' and 'toolchain' lines to be consistent with the existing # requirements in the module graph. go mod edit -require=rsc.io/needall@v0.0.1 cp go.mod go.mod.121 # If an upgrade is needed, GOTOOLCHAIN=go1.21 should cause # the command to fail without changing go.mod. env GOTOOLCHAIN=go1.21 ! go mod download stderr 'rsc.io/needall@v0.0.1 requires go >= 1.23' ! stderr switching cmp go.mod go.mod.121 # If an upgrade is needed, GOTOOLCHAIN=auto should perform # the upgrade and record the resulting toolchain version. env GOTOOLCHAIN=auto go mod download stderr '^go: module rsc.io/needall@v0.0.1 requires go >= 1.23; switching to go1.23.9$' cmp go.mod go.mod.final -- example/go.mod -- module example go 1.21 -- example/go.mod.final -- module example go 1.23 toolchain go1.23.9 require rsc.io/needall v0.0.1