1package csm 2 3import ( 4 "net/http" 5 "testing" 6 7 "github.com/aws/aws-sdk-go/aws" 8 "github.com/aws/aws-sdk-go/aws/client" 9 "github.com/aws/aws-sdk-go/aws/client/metadata" 10 "github.com/aws/aws-sdk-go/aws/credentials" 11 "github.com/aws/aws-sdk-go/aws/defaults" 12 "github.com/aws/aws-sdk-go/aws/request" 13) 14 15func TestMaxRetriesExceeded(t *testing.T) { 16 md := metadata.ClientInfo{ 17 Endpoint: "http://127.0.0.1", 18 } 19 20 cfg := aws.Config{ 21 Region: aws.String("foo"), 22 Credentials: credentials.NewStaticCredentials("", "", ""), 23 } 24 25 op := &request.Operation{} 26 cases := []struct { 27 name string 28 httpStatusCode int 29 expectedMaxRetriesValue int 30 expectedMetrics int 31 }{ 32 { 33 name: "max retry reached", 34 httpStatusCode: http.StatusBadGateway, 35 expectedMaxRetriesValue: 1, 36 }, 37 { 38 name: "status ok", 39 httpStatusCode: http.StatusOK, 40 expectedMaxRetriesValue: 0, 41 }, 42 } 43 44 for _, c := range cases { 45 r := request.New(cfg, md, defaults.Handlers(), client.DefaultRetryer{NumMaxRetries: 2}, op, nil, nil) 46 reporter := newReporter("", "") 47 r.Handlers.Send.Clear() 48 reporter.InjectHandlers(&r.Handlers) 49 50 r.Handlers.Send.PushBack(func(r *request.Request) { 51 r.HTTPResponse = &http.Response{ 52 StatusCode: c.httpStatusCode, 53 } 54 }) 55 r.Send() 56 57 for { 58 m := <-reporter.metricsCh.ch 59 60 if *m.Type != "ApiCall" { 61 // ignore non-ApiCall metrics since MaxRetriesExceeded is only on ApiCall events 62 continue 63 } 64 65 if val := *m.MaxRetriesExceeded; val != c.expectedMaxRetriesValue { 66 t.Errorf("%s: expected %d, but received %d", c.name, c.expectedMaxRetriesValue, val) 67 } 68 69 break 70 } 71 } 72} 73