]> Cypherpunks repositories - gostls13.git/commitdiff
time: make TestAfterQueuing retry 3 times before declaring failure.
authorAndrew Gerrand <adg@golang.org>
Wed, 30 Mar 2011 00:40:00 +0000 (11:40 +1100)
committerAndrew Gerrand <adg@golang.org>
Wed, 30 Mar 2011 00:40:00 +0000 (11:40 +1100)
I'm in two minds as to whether this should be a function of gotest.
Tests that can flake out like this should be rare enough that we
needn't add more mechanism.

R=r
CC=golang-dev
https://golang.org/cl/4335042

src/pkg/time/sleep_test.go

index 8bf599c3e1a96d3dc5a893331692b10efa0a43a7..25e79f9fbc440f2712e68b217aaa96644d654f7a 100644 (file)
@@ -5,6 +5,7 @@
 package time_test
 
 import (
+       "fmt"
        "os"
        "syscall"
        "testing"
@@ -132,6 +133,21 @@ func TestAfterStop(t *testing.T) {
        }
 }
 
+func TestAfterQueuing(t *testing.T) {
+       // This test flakes out on some systems,
+       // so we'll try it a few times before declaring it a failure.
+       const attempts = 3
+       err := os.NewError("!=nil")
+       for i := 0; i < attempts && err != nil; i++ {
+               if err = testAfterQueuing(t); err != nil {
+                       t.Logf("attempt %v failed: %v", i, err)
+               }
+       }
+       if err != nil {
+               t.Fatal(err)
+       }
+}
+
 var slots = []int{5, 3, 6, 6, 6, 1, 1, 2, 7, 9, 4, 8, 0}
 
 type afterResult struct {
@@ -143,7 +159,7 @@ func await(slot int, result chan<- afterResult, ac <-chan int64) {
        result <- afterResult{slot, <-ac}
 }
 
-func TestAfterQueuing(t *testing.T) {
+func testAfterQueuing(t *testing.T) os.Error {
        const (
                Delta = 100 * 1e6
        )
@@ -160,13 +176,14 @@ func TestAfterQueuing(t *testing.T) {
        for _, slot := range slots {
                r := <-result
                if r.slot != slot {
-                       t.Fatalf("after queue got slot %d, expected %d", r.slot, slot)
+                       return fmt.Errorf("after queue got slot %d, expected %d", r.slot, slot)
                }
                ns := r.t - t0
                target := int64(slot * Delta)
                slop := int64(Delta) / 4
                if ns < target-slop || ns > target+slop {
-                       t.Fatalf("after queue slot %d arrived at %g, expected [%g,%g]", slot, float64(ns), float64(target-slop), float64(target+slop))
+                       return fmt.Errorf("after queue slot %d arrived at %g, expected [%g,%g]", slot, float64(ns), float64(target-slop), float64(target+slop))
                }
        }
+       return nil
 }