| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| 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 |
| // file containing the encoded JSON for the struct to the "cover" |
| // tool when instrumenting the source files in a Go package. |
| type CoverPkgConfig struct { |
| // File into which cmd/cover should emit summary info |
| // when instrumentation is complete. |
| OutConfig string |
| |
| // Import path for the package being instrumented. |
| PkgPath string |
| |
| // Package name. |
| PkgName string |
| |
| // Instrumentation granularity: one of "perfunc" or "perblock" (default) |
| Granularity string |
| |
| // Module path for this package (empty if no go.mod in use) |
| ModulePath string |
| |
| // Local mode indicates we're doing a coverage build or test of a |
| // package selected via local import path, e.g. "./..." or |
| // "./foo/bar" as opposed to a non-relative import path. See the |
| // corresponding field in cmd/go's PackageInternal struct for more |
| // info. |
| Local bool |
| |
| // EmitMetaFile if non-empty is the path to which the cover tool should |
| // directly emit a coverage meta-data file for the package, if the |
| // package has any functions in it. The go command will pass in a value |
| // here if we've been asked to run "go test -cover" on a package that |
| // doesn't have any *_test.go files. |
| EmitMetaFile string |
| } |
| |
| // CoverFixupConfig contains annotations/notes generated by the |
| // cmd/cover tool (during instrumentation) to be passed on to the |
| // compiler when the instrumented code is compiled. The cmd/cover tool |
| // creates a struct of this type, JSON-encodes it, and emits the |
| // result to a file, which the Go command then passes to the compiler |
| // when the instrumented package is built. |
| type CoverFixupConfig struct { |
| // Name of the variable (created by cmd/cover) containing the |
| // encoded meta-data for the package. |
| MetaVar string |
| |
| // Length of the meta-data. |
| MetaLen int |
| |
| // Hash computed by cmd/cover of the meta-data. |
| MetaHash string |
| |
| // Instrumentation strategy. For now this is always set to |
| // "normal", but in the future we may add new values (for example, |
| // if panic paths are instrumented, or if the instrumenter |
| // eliminates redundant counters). |
| Strategy string |
| |
| // Prefix assigned to the names of counter variables generated |
| // during instrumentation by cmd/cover. |
| CounterPrefix string |
| |
| // Name chosen for the package ID variable generated during |
| // instrumentation. |
| PkgIdVar string |
| |
| // Counter mode (e.g. set/count/atomic) |
| CounterMode string |
| |
| // 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) |
| } |