]> Cypherpunks repositories - gostls13.git/commitdiff
sync: add Once test with panic
authorDmitriy Vyukov <dvyukov@google.com>
Thu, 20 Sep 2012 19:29:29 +0000 (23:29 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Thu, 20 Sep 2012 19:29:29 +0000 (23:29 +0400)
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

index 37075af171b5d14129b82ec14890e39cc875d99d..183069a1a234dd9a8643b4d37fab25fe2c0ff10b 100644 (file)
@@ -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,14 +31,34 @@ 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) {