1
0
mirror of https://github.com/golang/go synced 2024-11-12 09:50:21 -07:00

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
This commit is contained in:
Russ Cox 2014-01-22 16:34:02 -05:00
parent 52125738f3
commit 91fbf6f159

View File

@ -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