]> Cypherpunks repositories - gostls13.git/commit
testing: fix defer race
authorRuss Cox <rsc@golang.org>
Thu, 12 Jan 2012 18:18:12 +0000 (10:18 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 12 Jan 2012 18:18:12 +0000 (10:18 -0800)
commit4953b87296f53c5e0c7c62a775f1c088d4212902
tree8fe6a42be2c35c3ed84acc988d08e8422464fbf6
parent725f084b1165f910e32cb40006c9d530d95ca938
testing: fix defer race

In a test that does

        func TestFoo(t *testing.T) {
                defer cleanup()
                t.Fatal("oops")
        }

it can be important that cleanup run as the test fails.
The old code did this in Fatal:

        t.signal <- t
        runtime.Goexit()

The runtime.Goexit would run the deferred cleanup
but the send on t.signal would cause the main test loop
to move on and possibly even exit the program before
the runtime.Goexit got a chance to run.

This CL changes tRunner (the top stack frame of a test
goroutine) to send on t.signal as part of a function
deferred by the top stack frame.  This delays the send
on t.signal until after runtime.Goexit has run functions
deferred by the test itself.

For the above TestFoo, this CL guarantees that cleanup
will run before the test binary exits.

This is particularly important when cleanup is doing
externally visible work, like removing temporary files
or unmounting file systems.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5532078
src/pkg/testing/benchmark.go
src/pkg/testing/testing.go