vitess.io/vitess@v0.16.2/go/vt/mysqlctl/s3backupstorage/retryer_test.go (about)

     1  package s3backupstorage
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/aws/awserr"
    10  	"github.com/aws/aws-sdk-go/aws/request"
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  type testRetryer struct{ retry bool }
    15  
    16  func (r *testRetryer) MaxRetries() int                               { return 5 }
    17  func (r *testRetryer) RetryRules(req *request.Request) time.Duration { return time.Second }
    18  func (r *testRetryer) ShouldRetry(req *request.Request) bool         { return r.retry }
    19  
    20  func TestShouldRetry(t *testing.T) {
    21  	tests := []struct {
    22  		name           string
    23  		r              *request.Request
    24  		fallbackPolicy bool
    25  		expected       bool
    26  	}{
    27  
    28  		{
    29  			name: "non retryable request",
    30  			r: &request.Request{
    31  				Retryable: aws.Bool(false),
    32  			},
    33  			fallbackPolicy: false,
    34  			expected:       false,
    35  		},
    36  		{
    37  			name: "retryable request",
    38  			r: &request.Request{
    39  				Retryable: aws.Bool(true),
    40  			},
    41  			fallbackPolicy: false,
    42  			expected:       true,
    43  		},
    44  		{
    45  			name: "non aws error",
    46  			r: &request.Request{
    47  				Retryable: nil,
    48  				Error:     errors.New("some error"),
    49  			},
    50  			fallbackPolicy: false,
    51  			expected:       false,
    52  		},
    53  		{
    54  			name: "closed connection error",
    55  			r: &request.Request{
    56  				Retryable: nil,
    57  				Error:     awserr.New("5xx", "use of closed network connection", nil),
    58  			},
    59  			fallbackPolicy: false,
    60  			expected:       true,
    61  		},
    62  		{
    63  			name: "closed connection error (non nil origError)",
    64  			r: &request.Request{
    65  				Retryable: nil,
    66  				Error:     awserr.New("5xx", "use of closed network connection", errors.New("some error")),
    67  			},
    68  			fallbackPolicy: false,
    69  			expected:       true,
    70  		},
    71  		{
    72  			name: "other aws error hits fallback policy",
    73  			r: &request.Request{
    74  				Retryable: nil,
    75  				Error:     awserr.New("code", "not a closed network connectionn", errors.New("some error")),
    76  			},
    77  			fallbackPolicy: true,
    78  			expected:       true,
    79  		},
    80  	}
    81  
    82  	for _, test := range tests {
    83  		t.Run(test.name, func(t *testing.T) {
    84  			retryer := &ClosedConnectionRetryer{&testRetryer{test.fallbackPolicy}}
    85  			msg := ""
    86  			if test.r.Error != nil {
    87  				if awsErr, ok := test.r.Error.(awserr.Error); ok {
    88  					msg = awsErr.Error()
    89  				}
    90  			}
    91  			assert.Equal(t, test.expected, retryer.ShouldRetry(test.r), msg)
    92  		})
    93  	}
    94  }