aboutsummaryrefslogtreecommitdiff
path: root/src/pkg
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-01-22 16:34:02 -0500
committerRuss Cox <rsc@golang.org>2014-01-22 16:34:02 -0500
commit91fbf6f159a099a273e6880a5fe40351d61270b6 (patch)
tree8247175bd3e051e075eb393fc213096c5e592b60 /src/pkg
parent52125738f3ca6f30364eebf0f4d673f73a71c248 (diff)
downloadgo-91fbf6f159a099a273e6880a5fe40351d61270b6.tar.xz
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
Diffstat (limited to 'src/pkg')
-rw-r--r--src/pkg/testing/testing.go18
1 files changed, 10 insertions, 8 deletions
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