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 }