]> Cypherpunks repositories - gostls13.git/commitdiff
internal/singleflight: deflake test
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Jun 2015 15:32:02 +0000 (08:32 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Jun 2015 22:55:59 +0000 (22:55 +0000)
Fixes #11475

Change-Id: Ibaedbb732bb1b9f062bd5af7b866ec4758c724a7
Reviewed-on: https://go-review.googlesource.com/11770
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>

src/internal/singleflight/singleflight_test.go

index 30ba7f7ab4519baf8ffae03403535285fca6471c..890ab62e0336a11e5c19a2d4b06334e46398cf69 100644 (file)
@@ -42,11 +42,13 @@ func TestDoErr(t *testing.T) {
 
 func TestDoDupSuppress(t *testing.T) {
        var g Group
-       c := make(chan string)
+       c := make(chan string, 1)
        var calls int32
        fn := func() (interface{}, error) {
                atomic.AddInt32(&calls, 1)
-               return <-c, nil
+               v := <-c
+               c <- v // pump; make available for any future calls
+               return v, nil
        }
 
        const n = 10
@@ -54,20 +56,21 @@ func TestDoDupSuppress(t *testing.T) {
        for i := 0; i < n; i++ {
                wg.Add(1)
                go func() {
+                       defer wg.Done()
                        v, err, _ := g.Do("key", fn)
                        if err != nil {
                                t.Errorf("Do error: %v", err)
+                               return
                        }
-                       if v.(string) != "bar" {
-                               t.Errorf("got %q; want %q", v, "bar")
+                       if s, _ := v.(string); s != "bar" {
+                               t.Errorf("Do = %T %v; want %q", v, v, "bar")
                        }
-                       wg.Done()
                }()
        }
-       time.Sleep(100 * time.Millisecond) // let goroutines above block
+       time.Sleep(10 * time.Millisecond) // let some goroutines above block in Do
        c <- "bar"
        wg.Wait()
-       if got := atomic.LoadInt32(&calls); got != 1 {
-               t.Errorf("number of calls = %d; want 1", got)
+       if got := atomic.LoadInt32(&calls); got <= 0 || got >= n {
+               t.Errorf("number of calls = %d; want over 0 and less than n", got)
        }
 }