From: Russ Cox Date: Wed, 22 Jan 2014 21:34:02 +0000 (-0500) Subject: testing: fix SkipNow and FailNow to avoid panic(nil) check X-Git-Tag: go1.3beta1~889 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=91fbf6f159a099a273e6880a5fe40351d61270b6;p=gostls13.git testing: fix SkipNow and FailNow to avoid panic(nil) check Sorry, too many windows in which to run all.bash. Fixes build. TBR=r CC=golang-codereviews https://golang.org/cl/55790043 --- diff --git a/src/pkg/testing/testing.go b/src/pkg/testing/testing.go index a0b55f4a57..826d8e0120 100644 --- a/src/pkg/testing/testing.go +++ b/src/pkg/testing/testing.go @@ -143,10 +143,11 @@ var ( // common holds the elements common between T and B and // captures common methods such as Errorf. type common struct { - mu sync.RWMutex // guards output and failed - output []byte // Output generated by test or benchmark. - failed bool // Test or benchmark has failed. - skipped bool // Test of benchmark has been skipped. + mu sync.RWMutex // guards output and failed + output []byte // Output generated by test or benchmark. + failed bool // Test or benchmark has failed. + skipped bool // Test of benchmark has been skipped. + finished bool start time.Time // Time test or benchmark started duration time.Duration @@ -275,6 +276,7 @@ func (c *common) FailNow() { // it would run on a test failure. Because we send on c.signal during // a top-of-stack deferred function now, we know that the send // only happens after any other stacked defers have completed. + c.finished = true runtime.Goexit() } @@ -338,6 +340,7 @@ func (c *common) Skipf(format string, args ...interface{}) { // those other goroutines. func (c *common) SkipNow() { c.skip() + c.finished = true runtime.Goexit() } @@ -376,13 +379,12 @@ func tRunner(t *T, test *InternalTest) { // returned normally or because a test failure triggered // a call to runtime.Goexit, record the duration and send // a signal saying that the test is done. - var finished bool defer func() { t.duration = time.Now().Sub(t.start) // If the test panicked, print any test output before dying. err := recover() - if !finished && err == nil { - err = fmt.Errorf("test executed panic(nil)") + if !t.finished && err == nil { + err = fmt.Errorf("test executed panic(nil) or runtime.Goexit") } if err != nil { t.Fail() @@ -394,7 +396,7 @@ func tRunner(t *T, test *InternalTest) { t.start = time.Now() test.F(t) - finished = true + t.finished = true } // An internal function but exported because it is cross-package; part of the implementation