github.com/DerekStrickland/consul@v1.4.5/testutil/retry/retry_test.go (about) 1 package retry 2 3 import ( 4 "testing" 5 "time" 6 ) 7 8 // delta defines the time band a test run should complete in. 9 var delta = 25 * time.Millisecond 10 11 func TestRetryer(t *testing.T) { 12 tests := []struct { 13 desc string 14 r Retryer 15 }{ 16 {"counter", &Counter{Count: 3, Wait: 100 * time.Millisecond}}, 17 {"timer", &Timer{Timeout: 200 * time.Millisecond, Wait: 100 * time.Millisecond}}, 18 } 19 20 for _, tt := range tests { 21 t.Run(tt.desc, func(t *testing.T) { 22 var iters, fails int 23 fail := func() { fails++ } 24 start := time.Now() 25 for tt.r.NextOr(fail) { 26 iters++ 27 } 28 dur := time.Since(start) 29 if got, want := iters, 3; got != want { 30 t.Fatalf("got %d retries want %d", got, want) 31 } 32 if got, want := fails, 1; got != want { 33 t.Fatalf("got %d FailNow calls want %d", got, want) 34 } 35 // since the first iteration happens immediately 36 // the retryer waits only twice for three iterations. 37 // order of events: (true, (wait) true, (wait) true, false) 38 if got, want := dur, 200*time.Millisecond; got < (want-delta) || got > (want+delta) { 39 t.Fatalf("loop took %v want %v (+/- %v)", got, want, delta) 40 } 41 }) 42 } 43 }