Commit d54c4ecc authored by Andrew Gerrand's avatar Andrew Gerrand

time: make TestAfterQueuing retry 3 times before declaring failure.

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
parent 57c6d36f
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package time_test package time_test
import ( import (
"fmt"
"os" "os"
"syscall" "syscall"
"testing" "testing"
...@@ -132,6 +133,21 @@ func TestAfterStop(t *testing.T) { ...@@ -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} var slots = []int{5, 3, 6, 6, 6, 1, 1, 2, 7, 9, 4, 8, 0}
type afterResult struct { type afterResult struct {
...@@ -143,7 +159,7 @@ func await(slot int, result chan<- afterResult, ac <-chan int64) { ...@@ -143,7 +159,7 @@ func await(slot int, result chan<- afterResult, ac <-chan int64) {
result <- afterResult{slot, <-ac} result <- afterResult{slot, <-ac}
} }
func TestAfterQueuing(t *testing.T) { func testAfterQueuing(t *testing.T) os.Error {
const ( const (
Delta = 100 * 1e6 Delta = 100 * 1e6
) )
...@@ -160,13 +176,14 @@ func TestAfterQueuing(t *testing.T) { ...@@ -160,13 +176,14 @@ func TestAfterQueuing(t *testing.T) {
for _, slot := range slots { for _, slot := range slots {
r := <-result r := <-result
if r.slot != slot { 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 ns := r.t - t0
target := int64(slot * Delta) target := int64(slot * Delta)
slop := int64(Delta) / 4 slop := int64(Delta) / 4
if ns < target-slop || ns > target+slop { 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
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment