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) }) }