Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/go: go 1.22.0: go test throws errors when processing folders not listed in coverpkg argument #65653

Open
sonic-martin opened this issue Feb 10, 2024 · 4 comments
Assignees
Labels
GoCommand cmd/go NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Milestone

Comments

@sonic-martin
Copy link

sonic-martin commented Feb 10, 2024

Go version

go version go1.22.0 linux/amd64, go version go1.22.0 darwin/amd64, go version go1.22.0 windows/amd64

Output of go env in your module/workspace:

GO111MODULE=''
GOARCH='amd64'
GOBIN='/home/martin/bin'
GOCACHE='/home/martin/.cache/go-build'
GOENV='/home/martin/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/mnt/c/dev/git/pkg/mod'
GONOPROXY='*.mycompany.com'
GONOSUMDB='*.mycompany.com'
GOOS='linux'
GOPATH='/mnt/c/dev/git'
GOPRIVATE='*.mycompany.com'
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/mnt/c/dev/git/pkg/mod/golang.org/toolchain@v0.0.1-go1.22.0.linux-amd64'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/mnt/c/dev/git/pkg/mod/golang.org/toolchain@v0.0.1-go1.22.0.linux-amd64/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.22.0'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/mnt/c/dev/git/golang-test-cover/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build2876750124=/tmp/go-build -gno-record-gcc-switches'

What did you do?

Have a main.go and a package internal with some functions.

See reproducer: https://github.com/sonic-martin/golang-test-cover

Run go test:

go test -v ./... -coverprofile=coverage.out -coverpkg=./internal/... -covermode count
go tool cover -html=coverage.out -o coverage.html
go tool cover -func=coverage.out

What did you see happen?

$ go test -v ./... -coverprofile=coverage.out -coverpkg=./internal/... -covermode count
example.com/m: open /tmp/go-build1123786392/b002/covmeta.f6e4431d5ec1fd71f02b3ce4e56eb691a86525173d917007425576a7d9db7c72: no such file or directory
=== RUN   TestHelloer
--- PASS: TestHelloer (0.00s)
PASS
coverage: 100.0% of statements in ./internal/...
ok      example.com/m/internal  0.003s  coverage: 100.0% of statements in ./internal/...
$ echo $?
1
$ go tool cover -html=coverage.out -o coverage.html
$ go tool cover -func=coverage.out
example.com/m/internal/helloer.go:3:    Helloer         100.0%
total:                                  (statements)    100.0%

coverage.out:

mode: count
example.com/m/internal/helloer.go:3.23,5.2 1 1

The both outputs of go tool cover are fine.

What did you expect to see?

Before go 1.22.0 it worked fine and no no such file or directory errors happend.

There are two workarounds:

(1) go test with -coverpkg equal to the folder/packages processed

go test -v ./... -coverprofile=coverage.out -coverpkg=./... -covermode count
        example.com/m           coverage: 0.0% of statements
=== RUN   TestHelloer
--- PASS: TestHelloer (0.00s)
PASS
coverage: 50.0% of statements in ./...
ok      example.com/m/internal  0.003s  coverage: 50.0% of statements in ./...

But changes semantic of the coverage result.

(2) go test with GOEXPERIMENT=nocoverageredesign

$ GOEXPERIMENT=nocoverageredesign go test -v ./... -coverprofile=coverage.out -coverpkg=./internal/... -covermode count
?       example.com/m   [no test files]
=== RUN   TestHelloer
--- PASS: TestHelloer (0.00s)
PASS
coverage: 100.0% of statements in ./internal/...
ok      example.com/m/internal  0.002s  coverage: 100.0% of statements in ./internal/...

See the discussion from Brian Candler, Aldemar F, Thomas McNulty and me in the mailing list:
https://groups.google.com/g/golang-nuts/c/PjAWIdSdQHc

@aldemarf
Copy link

Thanks for opening this issue, Martin.

@thanm thanm self-assigned this Feb 12, 2024
@thanm
Copy link
Contributor

thanm commented Feb 12, 2024

Thanks for the report. I will take a look.

@thanm thanm added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Feb 12, 2024
@bcmills bcmills added the GoCommand cmd/go label Feb 14, 2024
@bcmills bcmills added this to the Backlog milestone Feb 15, 2024
@shaxbee
Copy link

shaxbee commented Feb 21, 2024

Got bunch of CI pipelines broken after 1.22 upgrade with same covmeta.[hash]: no such file or directory error for packages with no tests.
Only setting GOEXPERIMENT=nocoverageredesign or reverting back to 1.21 is fixing it ATM.

Edit:
Setting GOEXPERIMENT=nocoverageredesign is disabling go build -covermode -coverpkg flags, effectively breaking build.

@zegerius
Copy link

Looks like this was introduced in 36e75f6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
GoCommand cmd/go NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Projects
None yet
Development

No branches or pull requests

6 participants