1// +build go1.7
2
3package protocol
4
5import (
6	"net/http"
7	"net/url"
8	"testing"
9
10	"github.com/aws/aws-sdk-go/aws"
11	"github.com/aws/aws-sdk-go/aws/request"
12)
13
14func TestHostPrefixBuilder(t *testing.T) {
15	cases := map[string]struct {
16		URLHost  string
17		ReqHost  string
18		Prefix   string
19		LabelsFn func() map[string]string
20		Disabled bool
21
22		ExpectURLHost string
23		ExpectReqHost string
24	}{
25		"no labels": {
26			URLHost:       "service.region.amazonaws.com",
27			Prefix:        "data-",
28			ExpectURLHost: "data-service.region.amazonaws.com",
29		},
30		"with labels": {
31			URLHost: "service.region.amazonaws.com",
32			Prefix:  "{first}-{second}.",
33			LabelsFn: func() map[string]string {
34				return map[string]string{
35					"first":  "abc",
36					"second": "123",
37				}
38			},
39			ExpectURLHost: "abc-123.service.region.amazonaws.com",
40		},
41		"with host prefix disabled": {
42			Disabled: true,
43			URLHost:  "service.region.amazonaws.com",
44			Prefix:   "{first}-{second}.",
45			LabelsFn: func() map[string]string {
46				return map[string]string{
47					"first":  "abc",
48					"second": "123",
49				}
50			},
51			ExpectURLHost: "service.region.amazonaws.com",
52		},
53		"with duplicate labels": {
54			URLHost: "service.region.amazonaws.com",
55			Prefix:  "{first}-{second}-{first}.",
56			LabelsFn: func() map[string]string {
57				return map[string]string{
58					"first":  "abc",
59					"second": "123",
60				}
61			},
62			ExpectURLHost: "abc-123-abc.service.region.amazonaws.com",
63		},
64		"with unbracketed labels": {
65			URLHost: "service.region.amazonaws.com",
66			Prefix:  "first-{second}.",
67			LabelsFn: func() map[string]string {
68				return map[string]string{
69					"first":  "abc",
70					"second": "123",
71				}
72			},
73			ExpectURLHost: "first-123.service.region.amazonaws.com",
74		},
75		"with req host": {
76			URLHost:       "service.region.amazonaws.com:1234",
77			ReqHost:       "service.region.amazonaws.com",
78			Prefix:        "data-",
79			ExpectURLHost: "data-service.region.amazonaws.com:1234",
80			ExpectReqHost: "data-service.region.amazonaws.com",
81		},
82	}
83
84	for name, c := range cases {
85		t.Run(name, func(t *testing.T) {
86			builder := HostPrefixBuilder{
87				Prefix: c.Prefix, LabelsFn: c.LabelsFn,
88			}
89			req := &request.Request{
90				Config: aws.Config{
91					DisableEndpointHostPrefix: aws.Bool(c.Disabled),
92				},
93				HTTPRequest: &http.Request{
94					Host: c.ReqHost,
95					URL: &url.URL{
96						Host: c.URLHost,
97					},
98				},
99			}
100
101			builder.Build(req)
102			if e, a := c.ExpectURLHost, req.HTTPRequest.URL.Host; e != a {
103				t.Errorf("expect URL host %v, got %v", e, a)
104			}
105			if e, a := c.ExpectReqHost, req.HTTPRequest.Host; e != a {
106				t.Errorf("expect request host %v, got %v", e, a)
107			}
108		})
109	}
110}
111