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  }