]> Cypherpunks repositories - gostls13.git/commitdiff
testing: fix SkipNow and FailNow to avoid panic(nil) check
authorRuss Cox <rsc@golang.org>
Wed, 22 Jan 2014 21:34:02 +0000 (16:34 -0500)
committerRuss Cox <rsc@golang.org>
Wed, 22 Jan 2014 21:34:02 +0000 (16:34 -0500)
Sorry, too many windows in which to run all.bash.
Fixes build.

TBR=r
CC=golang-codereviews
https://golang.org/cl/55790043

src/pkg/testing/testing.go

index a0b55f4a57e88b92db4ce6fed0be799504ab1f29..826d8e012063897c6b50a1ac464d99f43f788a0d 100644 (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