From: Russ Cox Date: Wed, 12 Jun 2013 12:42:05 +0000 (-0400) Subject: cmd/go: diagnose invalid coverage runs X-Git-Tag: go1.2rc2~1266 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7ea75a5f188ff23fee5130199e89408c52ee59d1;p=gostls13.git cmd/go: diagnose invalid coverage runs # bufio coverage analysis cannot handle package (bufio_test imports testing imports bufio) # bytes coverage analysis cannot handle package (bytes_test imports encoding/base64 imports bytes) # crypto/cipher coverage analysis cannot handle package (cipher_test imports crypto/aes imports crypto/cipher) # debug/dwarf coverage analysis cannot handle package (dwarf_test imports debug/elf imports debug/dwarf) # errors coverage analysis cannot handle package (errors_test imports fmt imports errors) # flag coverage analysis cannot handle package (flag_test imports testing imports flag) # fmt coverage analysis cannot handle package (fmt_test imports testing imports fmt) # go/ast coverage analysis cannot handle package (ast_test imports go/format imports go/ast) # image coverage analysis cannot handle package (image_test imports image/gif imports image) # io coverage analysis cannot handle package (io_test imports bytes imports io) # math coverage analysis cannot handle package (math_test imports fmt imports math) # net/http coverage analysis cannot handle package (http_test imports net/http/httptest imports net/http) # os coverage analysis cannot handle package (os_test imports flag imports os) # path/filepath coverage analysis cannot handle package (filepath_test imports io/ioutil imports path/filepath) # reflect coverage analysis cannot handle package (reflect_test imports flag imports reflect) # runtime coverage analysis cannot handle package (runtime_test imports fmt imports runtime) # runtime/pprof coverage analysis cannot handle package (pprof_test imports testing imports runtime/pprof) # sort coverage analysis cannot handle package (sort_test imports testing imports sort) # strconv coverage analysis cannot handle package (strconv_test imports fmt imports strconv) # strings coverage analysis cannot handle package (strings_test imports testing imports strings) # sync coverage analysis cannot handle package (sync_test imports fmt imports sync) # sync/atomic coverage analysis cannot handle package (atomic_test imports testing imports sync/atomic) # syscall coverage analysis cannot handle package (syscall_test imports flag imports syscall) # text/tabwriter coverage analysis cannot handle package (tabwriter_test imports testing imports text/tabwriter) # time coverage analysis cannot handle package (time_test imports encoding/gob imports time) # unicode coverage analysis cannot handle package (unicode_test imports testing imports unicode) # unicode/utf8 coverage analysis cannot handle package (utf8_test imports bytes imports unicode/utf8) R=r CC=golang-dev https://golang.org/cl/10216043 --- diff --git a/src/cmd/go/test.go b/src/cmd/go/test.go index 8a115f3153..703ca7476b 100644 --- a/src/cmd/go/test.go +++ b/src/cmd/go/test.go @@ -435,6 +435,15 @@ func runTest(cmd *Command, args []string) { b.do(root) } +func contains(x []string, s string) bool { + for _, t := range x { + if t == s { + return true + } + } + return false +} + func (b *builder) test(p *Package) (buildAction, runAction, printAction *action, err error) { if len(p.TestGoFiles)+len(p.XTestGoFiles) == 0 { build := &action{p: p} @@ -468,6 +477,19 @@ func (b *builder) test(p *Package) (buildAction, runAction, printAction *action, return nil, nil, nil, p1.Error } ximports = append(ximports, p1) + + // In coverage mode, we rewrite the package p's sources. + // All code that imports p must be rebuilt with the updated + // copy, or else coverage will at the least be incomplete + // (and sometimes we get link errors due to the mismatch as well). + // The external test itself imports package p, of course, but + // we make sure that sees the new p. Any other code in the test + // - that is, any code imported by the external test that in turn + // imports p - needs to be rebuilt too. For now, just report + // that coverage is unavailable. + if testCover != "" && contains(p1.Deps, p.ImportPath) { + return nil, nil, nil, fmt.Errorf("coverage analysis cannot handle package (%s_test imports %s imports %s)", p.Name, path, p.ImportPath) + } } stk.pop()