# This file demonstrates the effect of lazy loading on the selected # versions of test dependencies. # The package import graph used in this test looks like: # # m ---- a # \ | # \ a_test ---- b # \ | # x b_test # | \ # x_test -------------- c # # And the module dependency graph looks like: # # m -- a.1 -- b.1 -- c.2 # \ # x.1 ------------ c.1 # Control case: in Go 1.15, the version of c imported by 'go test x' is the # version required by module b, even though b_test is not relevant to the main # module. (The main module imports a, and a_test imports b, but all of the # packages and tests in the main module can be built without b.) go list -m c stdout '^c v0.2.0 ' [!short] go test -v x [!short] stdout ' c v0.2.0$' # With lazy loading, the go.mod requirements are the same, # but the irrelevant dependency on c v0.2.0 should be pruned out, # leaving only the relevant dependency on c v0.1.0. go mod edit -go=1.17 go list -m c stdout '^c v0.1.0' [!short] go test -v x [!short] stdout ' c v0.1.0$' -- m.go -- package m import ( _ "a" _ "x" ) -- go.mod -- module m go 1.15 require ( a v0.1.0 x v0.1.0 ) replace ( a v0.1.0 => ./a1 b v0.1.0 => ./b1 c v0.1.0 => ./c1 c v0.2.0 => ./c2 x v0.1.0 => ./x1 ) -- a1/go.mod -- module a go 1.17 require b v0.1.0 -- a1/a.go -- package a -- a1/a_test.go -- package a_test import _ "b" -- b1/go.mod -- module b go 1.17 require c v0.2.0 -- b1/b.go -- package b -- b1/b_test.go -- package b_test import ( "c" "testing" ) func TestCVersion(t *testing.T) { t.Log(c.Version) } -- c1/go.mod -- module c go 1.17 -- c1/c.go -- package c const Version = "v0.1.0" -- c2/go.mod -- module c go 1.17 -- c2/c.go -- package c const Version = "v0.2.0" -- x1/go.mod -- module x go 1.17 require c v0.1.0 -- x1/x.go -- package x -- x1/x_test.go -- package x_test import ( "c" "testing" ) func TestCVersion(t *testing.T) { t.Log("c", c.Version) }