func TestCallbackPanic(t *testing.T) { // Make sure panic during callback unwinds properly. if runtime.LockedOSThread() { t.Fatal("locked OS thread on entry to TestCallbackPanic") } defer func() { s := recover() if s == nil { t.Fatal("did not panic") } if s.(string) != "callback panic" { t.Fatal("wrong panic:", s) } if runtime.LockedOSThread() { t.Fatal("locked OS thread on exit from TestCallbackPanic") } }() nestedCall(t, func() { panic("callback panic") }) panic("nestedCall returned") }
func TestCallbackPanicLocked(t *testing.T) { runtime.LockOSThread() defer runtime.UnlockOSThread() if !runtime.LockedOSThread() { t.Fatal("runtime.LockOSThread didn't") } defer func() { s := recover() if s == nil { t.Fatal("did not panic") } if s.(string) != "callback panic" { t.Fatal("wrong panic:", s) } if !runtime.LockedOSThread() { t.Fatal("lost lock on OS thread after panic") } }() nestedCall(t, func() { panic("callback panic") }) panic("nestedCall returned") }