Skip to content

Commit 7f748f7

Browse files
author
Craig Pastro
committed
Merge remote-tracking branch 'upstream/master' into do-with-data
2 parents deed8e1 + a9a7017 commit 7f748f7

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module github.com/avast/retry-go/v4
22

33
go 1.18
44

5-
require github.com/stretchr/testify v1.8.1
5+
require github.com/stretchr/testify v1.8.2
66

77
require (
88
github.com/davecgh/go-spew v1.1.1 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS
88
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
99
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
1010
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
11-
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
12-
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
11+
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
12+
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
1313
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
1414
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
1515
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

retry.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,15 @@ func DoWithData[T any](retryableFunc RetryableFuncWithData[T], opts ...Option) (
144144
return t, nil
145145
}
146146

147-
n++
148-
149147
if !IsRecoverable(err) {
150148
return emptyT, err
151149
}
152150

151+
if !config.retryIf(err) {
152+
return emptyT, err
153+
}
154+
155+
n++
153156
config.onRetry(n, err)
154157
select {
155158
case <-config.timer.After(delay(config, n, err)):
@@ -328,8 +331,13 @@ func Unrecoverable(err error) error {
328331

329332
// IsRecoverable checks if error is an instance of `unrecoverableError`
330333
func IsRecoverable(err error) bool {
334+
return !errors.Is(err, unrecoverableError{})
335+
}
336+
337+
// Adds support for errors.Is usage on unrecoverableError
338+
func (unrecoverableError) Is(err error) bool {
331339
_, isUnrecoverable := err.(unrecoverableError)
332-
return !isUnrecoverable
340+
return isUnrecoverable
333341
}
334342

335343
func unpackUnrecoverable(err error) error {

retry_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,29 @@ func TestRetryIf(t *testing.T) {
8585
assert.Len(t, err, 3)
8686
assert.Equal(t, expectedErrorFormat, err.Error(), "retry error format")
8787
assert.Equal(t, uint(2), retryCount, "right count of retry")
88+
}
89+
90+
func TestRetryIf_ZeroAttempts(t *testing.T) {
91+
var retryCount uint
92+
err := Do(
93+
func() error {
94+
if retryCount >= 2 {
95+
return errors.New("special")
96+
} else {
97+
return errors.New("test")
98+
}
99+
},
100+
OnRetry(func(n uint, err error) { retryCount++ }),
101+
RetryIf(func(err error) bool {
102+
return err.Error() != "special"
103+
}),
104+
Delay(time.Nanosecond),
105+
Attempts(0),
106+
)
107+
assert.Error(t, err)
88108

109+
assert.Equal(t, "special", err.Error(), "retry error format")
110+
assert.Equal(t, uint(2), retryCount, "right count of retry")
89111
}
90112

91113
func TestZeroAttemptsWithError(t *testing.T) {
@@ -516,3 +538,14 @@ func TestUnwrap(t *testing.T) {
516538
assert.Error(t, err)
517539
assert.Equal(t, testError, errors.Unwrap(err))
518540
}
541+
542+
func TestIsRecoverable(t *testing.T) {
543+
err := errors.New("err")
544+
assert.True(t, IsRecoverable(err))
545+
546+
err = Unrecoverable(err)
547+
assert.False(t, IsRecoverable(err))
548+
549+
err = fmt.Errorf("wrapping: %w", err)
550+
assert.False(t, IsRecoverable(err))
551+
}

0 commit comments

Comments
 (0)