f8d9fa9e80
This upgrades all of libgo other than the runtime package to the Go 1.4 release. In Go 1.4 much of the runtime was rewritten into Go. Merging that code will take more time and will not change the API, so I'm putting it off for now. There are a few runtime changes anyhow, to accomodate other packages that rely on minor modifications to the runtime support. The compiler changes slightly to add a one-bit flag to each type descriptor kind that is stored directly in an interface, which for gccgo is currently only pointer types. Another one-bit flag (gcprog) is reserved because it is used by the gc compiler, but gccgo does not currently use it. There is another error check in the compiler since I ran across it during testing. gotools/: * Makefile.am (go_cmd_go_files): Sort entries. Add generate.go. * Makefile.in: Rebuild. From-SVN: r219627
113 lines
2.9 KiB
Go
113 lines
2.9 KiB
Go
// Copyright 2013 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.
|
|
|
|
// Support for test coverage.
|
|
|
|
package testing
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"sync/atomic"
|
|
)
|
|
|
|
// CoverBlock records the coverage data for a single basic block.
|
|
// NOTE: This struct is internal to the testing infrastructure and may change.
|
|
// It is not covered (yet) by the Go 1 compatibility guidelines.
|
|
type CoverBlock struct {
|
|
Line0 uint32
|
|
Col0 uint16
|
|
Line1 uint32
|
|
Col1 uint16
|
|
Stmts uint16
|
|
}
|
|
|
|
var cover Cover
|
|
|
|
// Cover records information about test coverage checking.
|
|
// NOTE: This struct is internal to the testing infrastructure and may change.
|
|
// It is not covered (yet) by the Go 1 compatibility guidelines.
|
|
type Cover struct {
|
|
Mode string
|
|
Counters map[string][]uint32
|
|
Blocks map[string][]CoverBlock
|
|
CoveredPackages string
|
|
}
|
|
|
|
// Coverage reports the current code coverage as a fraction in the range [0, 1].
|
|
// If coverage is not enabled, Coverage returns 0.
|
|
//
|
|
// When running a large set of sequential test cases, checking Coverage after each one
|
|
// can be useful for identifying which test cases exercise new code paths.
|
|
// It is not a replacement for the reports generated by 'go test -cover' and
|
|
// 'go tool cover'.
|
|
func Coverage() float64 {
|
|
var n, d int64
|
|
for _, counters := range cover.Counters {
|
|
for i := range counters {
|
|
if atomic.LoadUint32(&counters[i]) > 0 {
|
|
n++
|
|
}
|
|
d++
|
|
}
|
|
}
|
|
if d == 0 {
|
|
return 0
|
|
}
|
|
return float64(n) / float64(d)
|
|
}
|
|
|
|
// RegisterCover records the coverage data accumulators for the tests.
|
|
// NOTE: This function is internal to the testing infrastructure and may change.
|
|
// It is not covered (yet) by the Go 1 compatibility guidelines.
|
|
func RegisterCover(c Cover) {
|
|
cover = c
|
|
}
|
|
|
|
// mustBeNil checks the error and, if present, reports it and exits.
|
|
func mustBeNil(err error) {
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "testing: %s\n", err)
|
|
os.Exit(2)
|
|
}
|
|
}
|
|
|
|
// coverReport reports the coverage percentage and writes a coverage profile if requested.
|
|
func coverReport() {
|
|
var f *os.File
|
|
var err error
|
|
if *coverProfile != "" {
|
|
f, err = os.Create(toOutputDir(*coverProfile))
|
|
mustBeNil(err)
|
|
fmt.Fprintf(f, "mode: %s\n", cover.Mode)
|
|
defer func() { mustBeNil(f.Close()) }()
|
|
}
|
|
|
|
var active, total int64
|
|
var count uint32
|
|
for name, counts := range cover.Counters {
|
|
blocks := cover.Blocks[name]
|
|
for i := range counts {
|
|
stmts := int64(blocks[i].Stmts)
|
|
total += stmts
|
|
count = atomic.LoadUint32(&counts[i]) // For -mode=atomic.
|
|
if count > 0 {
|
|
active += stmts
|
|
}
|
|
if f != nil {
|
|
_, err := fmt.Fprintf(f, "%s:%d.%d,%d.%d %d %d\n", name,
|
|
blocks[i].Line0, blocks[i].Col0,
|
|
blocks[i].Line1, blocks[i].Col1,
|
|
stmts,
|
|
count)
|
|
mustBeNil(err)
|
|
}
|
|
}
|
|
}
|
|
if total == 0 {
|
|
total = 1
|
|
}
|
|
fmt.Printf("coverage: %.1f%% of statements%s\n", 100*float64(active)/float64(total), cover.CoveredPackages)
|
|
}
|