60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
|
package retryer
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree"
|
||
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||
|
"github.com/aws/aws-sdk-go-v2/aws/retry"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
func TestRetryer(t *testing.T) {
|
||
|
ctx := context.Background()
|
||
|
|
||
|
retryer := retry.NewStandard(func(options *retry.StandardOptions) {
|
||
|
options.MaxAttempts = 3
|
||
|
options.Backoff = retry.BackoffDelayerFunc(func(int, error) (time.Duration, error) { return 0, nil })
|
||
|
options.Retryables = []retry.IsErrorRetryable{retry.IsErrorRetryableFunc(func(err error) aws.Ternary {
|
||
|
if errors.Is(err, tree.ErrNodeAccessDenied) {
|
||
|
return aws.TrueTernary
|
||
|
}
|
||
|
return aws.FalseTernary
|
||
|
})}
|
||
|
})
|
||
|
|
||
|
t.Run("no retryable", func(t *testing.T) {
|
||
|
count := 0
|
||
|
err := MakeWithRetry(ctx, func() error {
|
||
|
count++
|
||
|
if count == 1 {
|
||
|
return tree.ErrNodeNotFound
|
||
|
}
|
||
|
return tree.ErrNodeAccessDenied
|
||
|
}, retryer)
|
||
|
require.ErrorIs(t, err, tree.ErrNodeNotFound)
|
||
|
})
|
||
|
|
||
|
t.Run("retry", func(t *testing.T) {
|
||
|
count := 0
|
||
|
err := MakeWithRetry(ctx, func() error {
|
||
|
count++
|
||
|
if count < 3 {
|
||
|
return tree.ErrNodeAccessDenied
|
||
|
}
|
||
|
return nil
|
||
|
}, retryer)
|
||
|
require.NoError(t, err)
|
||
|
})
|
||
|
|
||
|
t.Run("retry exhausted", func(t *testing.T) {
|
||
|
err := MakeWithRetry(ctx, func() error {
|
||
|
return tree.ErrNodeAccessDenied
|
||
|
}, retryer)
|
||
|
require.ErrorIs(t, err, tree.ErrNodeAccessDenied)
|
||
|
})
|
||
|
}
|