cmd/go: improve handling of no-test packages for coverage

This patch improves the way the go command handles coverage testing
of packages that have functions but don't have any test files. Up to
this point if you ran "go test -cover" on such a package, you would
see:

  ?   	mymod/mypack	[no test files]

While "no test files" is true, it is also very unhelpful; if the
package contains functions, it would be better instead to capture the
fact that these functions are not executed when "go test -cover" is
run on the package.

With this patch, for the same no-test package "go test -cover" will
output:

	mymod/mypack	coverage: 0.0% of statements

The inclusion of such packages in coverage reporting also extends to
"-coverprofile" as well (we'll see entries for the "mypack" functions
in this case.

Note that if a package has no functions at all, then we'll still fall
back to reporting "no test files" in this case; it doesn't make sense
to report "0.0% statements covered" if there are no statements.

Updates #27261.
Updates #58770.
Updates #18909.
Fixes #24570.

Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest,gotip-windows-amd64-longtest
Change-Id: I8e916425f4f2beec65861df78265e93db5ce001a
Reviewed-on: https://go-review.googlesource.com/c/go/+/495447
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
This commit is contained in:
Than McIntosh 2023-05-09 15:40:41 -04:00
parent 1e69040920
commit d1cb5c0605
10 changed files with 276 additions and 28 deletions

View file

@ -4,6 +4,12 @@
package covcmd
import (
"crypto/sha256"
"fmt"
"internal/coverage"
)
// CoverPkgConfig is a bundle of information passed from the Go
// command to the cover command during "go build -cover" runs. The
// Go command creates and fills in a struct as below, then passes
@ -78,3 +84,14 @@ type CoverFixupConfig struct {
// Counter granularity (perblock or perfunc).
CounterGranularity string
}
// MetaFileForPackage returns the expected name of the meta-data file
// for the package whose import path is 'importPath' in cases where
// we're using meta-data generated by the cover tool, as opposed to a
// meta-data file created at runtime.
func MetaFileForPackage(importPath string) string {
var r [32]byte
sum := sha256.Sum256([]byte(importPath))
copy(r[:], sum[:])
return coverage.MetaFilePref + fmt.Sprintf(".%x", r)
}