From 801f6e6367e923ce320276adb279b5f0b1ec9bef Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Thu, 20 Sep 2012 23:29:29 +0400 Subject: [PATCH] sync: add Once test with panic Tests behavior of Once when initialization function panics. R=golang-dev, r CC=golang-dev https://golang.org/cl/6554047 --- src/pkg/sync/once_test.go | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/pkg/sync/once_test.go b/src/pkg/sync/once_test.go index 37075af171b..183069a1a23 100644 --- a/src/pkg/sync/once_test.go +++ b/src/pkg/sync/once_test.go @@ -17,8 +17,11 @@ func (o *one) Increment() { *o++ } -func run(once *Once, o *one, c chan bool) { +func run(t *testing.T, once *Once, o *one, c chan bool) { once.Do(func() { o.Increment() }) + if v := *o; v != 1 { + t.Errorf("once failed inside run: %d is not 1", v) + } c <- true } @@ -28,16 +31,36 @@ func TestOnce(t *testing.T) { c := make(chan bool) const N = 10 for i := 0; i < N; i++ { - go run(once, o, c) + go run(t, once, o, c) } for i := 0; i < N; i++ { <-c } if *o != 1 { - t.Errorf("once failed: %d is not 1", *o) + t.Errorf("once failed outside run: %d is not 1", *o) } } +func TestOncePanic(t *testing.T) { + once := new(Once) + for i := 0; i < 2; i++ { + func() { + defer func() { + if recover() == nil { + t.Fatalf("Once.Do() has not panic'ed") + } + }() + once.Do(func() { + panic("failed") + }) + }() + } + once.Do(func() {}) + once.Do(func() { + t.Fatalf("Once called twice") + }) +} + func BenchmarkOnce(b *testing.B) { const CallsPerSched = 1000 procs := runtime.GOMAXPROCS(-1)