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