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
Showing
Please
register
or
sign in
to comment