blob: b71a920870a9bb7ffd2ad3668e10af24eb98991c [file] [log] [blame]
# This test illustrates the relationship between the 'all' pattern and
# the dependencies of the main module.
# The package import graph used in this test looks like:
#
# main --------- a --------- b
# | |
# | a_test ---- c
# | |
# | c_test ---- d
# |
# main_test ---- t --------- u
# |
# t_test ---- w
# |
# w_test ---- x
#
# main/testonly_test ---- q --------- r
# |
# q_test ---- s
#
# And the module dependency graph looks like:
#
# main --- a.1 ---- b.1
# \ \ \
# \ \ c.1 -- d.1
# \ \
# \ t.1 ---- u.1
# \ \
# \ w.1 -- x.1
# \
# q.1 ---- r.1
# \
# s.1
env PKGFMT='{{if .Module}}{{.ImportPath}}{{end}}'
env MODFMT='{{.Path}}'
# 'go list -deps' lists packages and tests in the main module,
# along with their transitive dependencies.
go list -f $PKGFMT -deps ./...
stdout -count=4 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/main$'
stdout '^example.com/main/testonly'
# 'go list -deps -test' lists transitive imports of tests and non-tests in the
# main module.
go list -f $PKGFMT -deps -test ./...
stdout -count=13 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/main$'
stdout '^example.com/main.test$'
stdout '^example.com/main \[example.com/main.test\]$'
stdout '^example.com/main_test \[example.com/main.test\]$'
stdout '^example.com/main/testonly$'
stdout '^example.com/main/testonly.test$'
stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/t$'
stdout '^example.com/u$'
# 'go list all' lists the fixpoint of iterating 'go list -deps -test' starting
# with the packages in the main module, then reducing to only the non-test
# variants of those packages.
go list -f $PKGFMT all
stdout -count=13 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/c$'
stdout '^example.com/d$'
stdout '^example.com/main$'
stdout '^example.com/main/testonly$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/s$'
stdout '^example.com/t$'
stdout '^example.com/u$'
stdout '^example.com/w$'
stdout '^example.com/x$'
# 'go list -test all' is equivalent to 'go list -test $(go list all)'
# and both should include tests for every package in 'all'.
go list -test -f $PKGFMT example.com/a example.com/b example.com/c example.com/d example.com/main example.com/main/testonly example.com/q example.com/r example.com/s example.com/t example.com/u example.com/w example.com/x
cp stdout list-test-explicit.txt
go list -test -f $PKGFMT all
cmp stdout list-test-explicit.txt
stdout -count=36 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/c$'
stdout '^example.com/d$'
stdout '^example.com/main$'
stdout '^example.com/main/testonly$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/s$'
stdout '^example.com/t$'
stdout '^example.com/u$'
stdout '^example.com/w$'
stdout '^example.com/x$'
stdout '^example.com/a.test$'
stdout '^example.com/a_test \[example.com/a.test\]$'
stdout '^example.com/b.test$'
stdout '^example.com/b_test \[example.com/b.test\]$'
stdout '^example.com/c.test$'
stdout '^example.com/c_test \[example.com/c.test\]$'
stdout '^example.com/main.test$'
stdout '^example.com/main \[example.com/main.test\]$'
stdout '^example.com/main_test \[example.com/main.test\]$'
stdout '^example.com/main/testonly.test$'
stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$'
stdout '^example.com/q.test$'
stdout '^example.com/q_test \[example.com/q.test\]$'
stdout '^example.com/r.test$'
stdout '^example.com/r_test \[example.com/r.test\]$'
stdout '^example.com/s.test$'
stdout '^example.com/s_test \[example.com/s.test\]$'
stdout '^example.com/t.test$'
stdout '^example.com/t_test \[example.com/t.test\]$'
stdout '^example.com/u.test$'
stdout '^example.com/u_test \[example.com/u.test\]$'
stdout '^example.com/w.test$'
stdout '^example.com/w_test \[example.com/w.test\]$'
# 'go list -m all' covers the packages in 'go list -test -deps all'.
go list -m -f $MODFMT all
stdout -count=12 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/c$'
stdout '^example.com/d$'
stdout '^example.com/main$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/s$'
stdout '^example.com/t$'
stdout '^example.com/u$'
stdout '^example.com/w$'
stdout '^example.com/x$'
# 'go mod vendor' copies in only the packages transitively imported by the main
# module, and omits their tests. As a result, the 'all' and '...' patterns
# report fewer packages when using '-mod=vendor'.
go mod vendor
go list -f $PKGFMT -mod=vendor all
stdout -count=8 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/main$'
stdout '^example.com/main/testonly$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/t$'
stdout '^example.com/u$'
go list -test -f $PKGFMT -mod=vendor all
stdout -count=13 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/main$'
stdout '^example.com/main/testonly$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/t$'
stdout '^example.com/u$'
stdout '^example.com/main.test$'
stdout '^example.com/main \[example.com/main.test\]$'
stdout '^example.com/main_test \[example.com/main.test\]$'
stdout '^example.com/main/testonly.test$'
stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$'
rm vendor
# Convert all modules to go 1.17 to enable lazy loading.
go mod edit -go=1.17 a/go.mod
go mod edit -go=1.17 b/go.mod
go mod edit -go=1.17 c/go.mod
go mod edit -go=1.17 d/go.mod
go mod edit -go=1.17 q/go.mod
go mod edit -go=1.17 r/go.mod
go mod edit -go=1.17 s/go.mod
go mod edit -go=1.17 t/go.mod
go mod edit -go=1.17 u/go.mod
go mod edit -go=1.17 w/go.mod
go mod edit -go=1.17 x/go.mod
go mod edit -go=1.17
cmp go.mod go.mod.beforetidy
go mod tidy
cmp go.mod go.mod.aftertidy
# With lazy loading, 'go list all' with neither -mod=vendor nor -test should
# match -mod=vendor without -test in 1.15.
go list -f $PKGFMT all
stdout -count=8 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/main$'
stdout '^example.com/main/testonly$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/t$'
stdout '^example.com/u$'
# 'go list -test all' should expand that to include the test variants of the
# packages in 'all', but not the dependencies of outside tests.
go list -test -f $PKGFMT all
stdout -count=25 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/main$'
stdout '^example.com/main/testonly$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/t$'
stdout '^example.com/u$'
stdout '^example.com/a.test$'
stdout '^example.com/a_test \[example.com/a.test\]$'
stdout '^example.com/b.test$'
stdout '^example.com/b_test \[example.com/b.test\]$'
stdout '^example.com/main.test$'
stdout '^example.com/main \[example.com/main.test\]$'
stdout '^example.com/main_test \[example.com/main.test\]$'
stdout '^example.com/main/testonly.test$'
stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$'
stdout '^example.com/q.test$'
stdout '^example.com/q_test \[example.com/q.test\]$'
stdout '^example.com/r.test$'
stdout '^example.com/r_test \[example.com/r.test\]$'
stdout '^example.com/t.test$'
stdout '^example.com/t_test \[example.com/t.test\]$'
stdout '^example.com/u.test$'
stdout '^example.com/u_test \[example.com/u.test\]$'
# 'go list -test -deps all' should include the dependencies of those tests,
# but not the tests of the dependencies of outside tests.
go list -test -deps -f $PKGFMT all
stdout -count=28 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/c$'
stdout '^example.com/main$'
stdout '^example.com/main/testonly$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/s$'
stdout '^example.com/t$'
stdout '^example.com/u$'
stdout '^example.com/w$'
stdout '^example.com/a.test$'
stdout '^example.com/a_test \[example.com/a.test\]$'
stdout '^example.com/b.test$'
stdout '^example.com/b_test \[example.com/b.test\]$'
stdout '^example.com/main.test$'
stdout '^example.com/main \[example.com/main.test\]$'
stdout '^example.com/main_test \[example.com/main.test\]$'
stdout '^example.com/main/testonly.test$'
stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$'
stdout '^example.com/q.test$'
stdout '^example.com/q_test \[example.com/q.test\]$'
stdout '^example.com/r.test$'
stdout '^example.com/r_test \[example.com/r.test\]$'
stdout '^example.com/t.test$'
stdout '^example.com/t_test \[example.com/t.test\]$'
stdout '^example.com/u.test$'
stdout '^example.com/u_test \[example.com/u.test\]$'
# 'go list -m all' should cover all of the modules providing packages in
# 'go list -test -deps all', but should exclude modules d and x,
# which are not relevant to the main module and are outside of the
# lazy-loading horizon.
go list -m -f $MODFMT all
stdout -count=10 '^.'
stdout '^example.com/a$'
stdout '^example.com/b$'
stdout '^example.com/c$'
! stdout '^example.com/d$'
stdout '^example.com/main$'
stdout '^example.com/q$'
stdout '^example.com/r$'
stdout '^example.com/s$'
stdout '^example.com/t$'
stdout '^example.com/u$'
stdout '^example.com/w$'
! stdout '^example.com/x$'
-- go.mod --
module example.com/main
// Note: this go.mod file initially specifies go 1.15,
// but includes some redundant roots so that it
// also already obeys the 1.17 lazy loading invariants.
go 1.15
require (
example.com/a v0.1.0
example.com/b v0.1.0 // indirect
example.com/q v0.1.0
example.com/r v0.1.0 // indirect
example.com/t v0.1.0
example.com/u v0.1.0 // indirect
)
replace (
example.com/a v0.1.0 => ./a
example.com/b v0.1.0 => ./b
example.com/c v0.1.0 => ./c
example.com/d v0.1.0 => ./d
example.com/q v0.1.0 => ./q
example.com/r v0.1.0 => ./r
example.com/s v0.1.0 => ./s
example.com/t v0.1.0 => ./t
example.com/u v0.1.0 => ./u
example.com/w v0.1.0 => ./w
example.com/x v0.1.0 => ./x
)
-- main.go --
package main
import _ "example.com/a"
func main() {}
-- main_test.go --
package main_test
import _ "example.com/t"
-- testonly/testonly_test.go --
package testonly_test
import _ "example.com/q"
-- a/go.mod --
module example.com/a
go 1.15
require (
example.com/b v0.1.0
example.com/c v0.1.0
)
-- a/a.go --
package a
import _ "example.com/b"
-- a/a_test.go --
package a_test
import _ "example.com/c"
-- b/go.mod --
module example.com/b
go 1.15
-- b/b.go --
package b
-- b/b_test.go --
package b_test
-- c/go.mod --
module example.com/c
go 1.15
require example.com/d v0.1.0
-- c/c.go --
package c
-- c/c_test.go --
package c_test
import _ "example.com/d"
-- d/go.mod --
module example.com/d
go 1.15
-- d/d.go --
package d
-- q/go.mod --
module example.com/q
go 1.15
require (
example.com/r v0.1.0
example.com/s v0.1.0
)
-- q/q.go --
package q
import _ "example.com/r"
-- q/q_test.go --
package q_test
import _ "example.com/s"
-- r/go.mod --
module example.com/r
go 1.15
-- r/r.go --
package r
-- r/r_test.go --
package r_test
-- s/go.mod --
module example.com/s
go 1.15
-- s/s.go --
package s
-- s/s_test.go --
package s_test
-- t/go.mod --
module example.com/t
go 1.15
require (
example.com/u v0.1.0
example.com/w v0.1.0
)
-- t/t.go --
package t
import _ "example.com/u"
-- t/t_test.go --
package t_test
import _ "example.com/w"
-- u/go.mod --
module example.com/u
go 1.15
-- u/u.go --
package u
-- u/u_test.go --
package u_test
-- w/go.mod --
module example.com/w
go 1.15
require example.com/x v0.1.0
-- w/w.go --
package w
-- w/w_test.go --
package w_test
import _ "example.com/x"
-- x/go.mod --
module example.com/x
go 1.15
-- x/x.go --
package x
-- go.mod.beforetidy --
module example.com/main
// Note: this go.mod file initially specifies go 1.15,
// but includes some redundant roots so that it
// also already obeys the 1.17 lazy loading invariants.
go 1.17
require (
example.com/a v0.1.0
example.com/b v0.1.0 // indirect
example.com/q v0.1.0
example.com/r v0.1.0 // indirect
example.com/t v0.1.0
example.com/u v0.1.0 // indirect
)
replace (
example.com/a v0.1.0 => ./a
example.com/b v0.1.0 => ./b
example.com/c v0.1.0 => ./c
example.com/d v0.1.0 => ./d
example.com/q v0.1.0 => ./q
example.com/r v0.1.0 => ./r
example.com/s v0.1.0 => ./s
example.com/t v0.1.0 => ./t
example.com/u v0.1.0 => ./u
example.com/w v0.1.0 => ./w
example.com/x v0.1.0 => ./x
)
-- go.mod.aftertidy --
module example.com/main
// Note: this go.mod file initially specifies go 1.15,
// but includes some redundant roots so that it
// also already obeys the 1.17 lazy loading invariants.
go 1.17
require (
example.com/a v0.1.0
example.com/q v0.1.0
example.com/t v0.1.0
)
require (
example.com/b v0.1.0 // indirect
example.com/r v0.1.0 // indirect
example.com/u v0.1.0 // indirect
)
replace (
example.com/a v0.1.0 => ./a
example.com/b v0.1.0 => ./b
example.com/c v0.1.0 => ./c
example.com/d v0.1.0 => ./d
example.com/q v0.1.0 => ./q
example.com/r v0.1.0 => ./r
example.com/s v0.1.0 => ./s
example.com/t v0.1.0 => ./t
example.com/u v0.1.0 => ./u
example.com/w v0.1.0 => ./w
example.com/x v0.1.0 => ./x
)