retry: added tests for retry loop

This commit is contained in:
Jarek Kowalski
2018-12-23 23:20:29 -08:00
parent 53b4a9abd2
commit 7d03d82cd1
2 changed files with 61 additions and 1 deletions

View File

@@ -10,7 +10,7 @@
var log = repologging.Logger("repo/retry")
const (
var (
maxAttempts = 10
retryInitialSleepAmount = 1 * time.Second
retryMaxSleepAmount = 32 * time.Second

View File

@@ -0,0 +1,60 @@
package retry
import (
"errors"
"fmt"
"reflect"
"testing"
"time"
)
var (
errRetriable = errors.New("retriable")
errNonRetriable = errors.New("non-retriable")
)
func isRetriable(e error) bool {
return e == errRetriable
}
func TestRetry(t *testing.T) {
retryInitialSleepAmount = 10 * time.Millisecond
retryMaxSleepAmount = 20 * time.Millisecond
maxAttempts = 3
cnt := 0
cases := []struct {
desc string
f func() (interface{}, error)
want interface{}
wantError error
}{
{"success-nil", func() (interface{}, error) { return nil, nil }, nil, nil},
{"success", func() (interface{}, error) { return 3, nil }, 3, nil},
{"retriable-succeeds", func() (interface{}, error) {
cnt++
if cnt < 2 {
return nil, errRetriable
}
return 4, nil
}, 4, nil},
{"retriable-never-succeeds", func() (interface{}, error) { return nil, errRetriable }, nil, fmt.Errorf("unable to complete retriable-never-succeeds despite 3 retries")},
}
for _, tc := range cases {
t.Run(tc.desc, func(t *testing.T) {
tc := tc
t.Parallel()
got, err := WithExponentialBackoff(tc.desc, tc.f, isRetriable)
if !reflect.DeepEqual(err, tc.wantError) {
t.Errorf("invalid error %q, wanted %q", err, tc.wantError)
}
if got != tc.want {
t.Errorf("invalid value %v, wanted %v", got, tc.want)
}
})
}
}