time: deflake TestTicker
Take the opportunity of deflaking to make it take less time to run.
Updates #35537
Change-Id: I91ca8094fbe18fbfcd34dfda98da1592c9c82943
Reviewed-on: https://go-review.googlesource.com/c/go/+/207403
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/src/time/tick_test.go b/src/time/tick_test.go
index dd17aab..92fb2f9 100644
--- a/src/time/tick_test.go
+++ b/src/time/tick_test.go
@@ -5,34 +5,63 @@
package time_test
import (
+ "fmt"
"testing"
. "time"
)
func TestTicker(t *testing.T) {
- const Count = 10
- Delta := 100 * Millisecond
- ticker := NewTicker(Delta)
- t0 := Now()
- for i := 0; i < Count; i++ {
- <-ticker.C
+ // We want to test that a ticker takes as much time as expected.
+ // Since we don't want the test to run for too long, we don't
+ // want to use lengthy times. This makes the test inherently flaky.
+ // So only report an error if it fails five times in a row.
+
+ const count = 10
+ delta := 20 * Millisecond
+
+ var errs []string
+ logErrs := func() {
+ for _, e := range errs {
+ t.Log(e)
+ }
}
- ticker.Stop()
- t1 := Now()
- dt := t1.Sub(t0)
- target := Delta * Count
- slop := target * 2 / 10
- if dt < target-slop || (!testing.Short() && dt > target+slop) {
- t.Fatalf("%d %s ticks took %s, expected [%s,%s]", Count, Delta, dt, target-slop, target+slop)
+
+ for i := 0; i < 5; i++ {
+ ticker := NewTicker(delta)
+ t0 := Now()
+ for i := 0; i < count; i++ {
+ <-ticker.C
+ }
+ ticker.Stop()
+ t1 := Now()
+ dt := t1.Sub(t0)
+ target := delta * count
+ slop := target * 2 / 10
+ if dt < target-slop || dt > target+slop {
+ errs = append(errs, fmt.Sprintf("%d %s ticks took %s, expected [%s,%s]", count, delta, dt, target-slop, target+slop))
+ continue
+ }
+ // Now test that the ticker stopped.
+ Sleep(2 * delta)
+ select {
+ case <-ticker.C:
+ errs = append(errs, "Ticker did not shut down")
+ continue
+ default:
+ // ok
+ }
+
+ // Test passed, so all done.
+ if len(errs) > 0 {
+ t.Logf("saw %d errors, ignoring to avoid flakiness", len(errs))
+ logErrs()
+ }
+
+ return
}
- // Now test that the ticker stopped
- Sleep(2 * Delta)
- select {
- case <-ticker.C:
- t.Fatal("Ticker did not shut down")
- default:
- // ok
- }
+
+ t.Errorf("saw %d errors", len(errs))
+ logErrs()
}
// Issue 21874