Skip to content

Commit fffe66c

Browse files
authored
Add test file for proxy.go (#489)
1 parent 34f64d7 commit fffe66c

File tree

1 file changed

+289
-0
lines changed

1 file changed

+289
-0
lines changed

strategy/sampling/proxy_test.go

Lines changed: 289 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
1+
package sampling
2+
3+
import (
4+
"net"
5+
"net/http"
6+
"net/http/httptest"
7+
"net/url"
8+
"testing"
9+
10+
"github.com/aws/aws-xray-sdk-go/daemoncfg"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
func createTestClient(t *testing.T, body []byte) *svcProxy {
16+
testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, _ *http.Request) {
17+
_, err := res.Write(body)
18+
require.NoError(t, err)
19+
}))
20+
t.Cleanup(testServer.Close)
21+
22+
u, err := url.Parse(testServer.URL)
23+
require.NoError(t, err)
24+
25+
udpAddr, _ := net.ResolveUDPAddr("udp", u.Host)
26+
tcpAddr, _ := net.ResolveTCPAddr("tcp", u.Host)
27+
28+
client, err := newProxy(&daemoncfg.DaemonEndpoints{
29+
UDPAddr: udpAddr,
30+
TCPAddr: tcpAddr,
31+
})
32+
33+
require.NoError(t, err)
34+
35+
return &client
36+
}
37+
38+
func TestGetSamplingRules(t *testing.T) {
39+
body := []byte(`{
40+
"NextToken": null,
41+
"SamplingRuleRecords": [
42+
{
43+
"CreatedAt": 0,
44+
"ModifiedAt": 1649517389,
45+
"SamplingRule": {
46+
"Attributes": {},
47+
"FixedRate": 0.5,
48+
"HTTPMethod": "*",
49+
"Host": "*",
50+
"Priority": 10000,
51+
"ReservoirSize": 60,
52+
"ResourceARN": "*",
53+
"RuleARN": "arn:aws:xray:us-west-1:xxxxxxx:sampling-rule/Default",
54+
"RuleName": "Default",
55+
"ServiceName": "*",
56+
"ServiceType": "*",
57+
"URLPath": "*",
58+
"Version": 1
59+
}
60+
},
61+
{
62+
"CreatedAt": 1637691613,
63+
"ModifiedAt": 1643748669,
64+
"SamplingRule": {
65+
"Attributes": {},
66+
"FixedRate": 0.09,
67+
"HTTPMethod": "GET",
68+
"Host": "*",
69+
"Priority": 1,
70+
"ReservoirSize": 3,
71+
"ResourceARN": "*",
72+
"RuleARN": "arn:aws:xray:us-west-1:xxxxxxx:sampling-rule/test-rule",
73+
"RuleName": "test-rule",
74+
"ServiceName": "test-rule",
75+
"ServiceType": "local",
76+
"URLPath": "/aws-sdk-call",
77+
"Version": 1
78+
}
79+
},
80+
{
81+
"CreatedAt": 1639446197,
82+
"ModifiedAt": 1639446197,
83+
"SamplingRule": {
84+
"Attributes": {},
85+
"FixedRate": 0.09,
86+
"HTTPMethod": "*",
87+
"Host": "*",
88+
"Priority": 100,
89+
"ReservoirSize": 100,
90+
"ResourceARN": "*",
91+
"RuleARN": "arn:aws:xray:us-west-1:xxxxxxx:sampling-rule/test-rule-1",
92+
"RuleName": "test-rule-1",
93+
"ServiceName": "*",
94+
"ServiceType": "*",
95+
"URLPath": "*",
96+
"Version": 1
97+
}
98+
}
99+
]
100+
}`)
101+
client := createTestClient(t, body)
102+
103+
samplingRules, err := (*client).GetSamplingRules()
104+
require.NoError(t, err)
105+
106+
assert.Equal(t, *samplingRules[0].SamplingRule.RuleName, "Default")
107+
assert.Equal(t, *samplingRules[0].SamplingRule.ServiceType, "*")
108+
assert.Equal(t, *samplingRules[0].SamplingRule.Host, "*")
109+
assert.Equal(t, *samplingRules[0].SamplingRule.URLPath, "*")
110+
assert.Equal(t, *samplingRules[0].SamplingRule.ReservoirSize, int64(60))
111+
assert.Equal(t, *samplingRules[0].SamplingRule.FixedRate, 0.5)
112+
113+
assert.Equal(t, *samplingRules[1].SamplingRule.RuleName, "test-rule")
114+
assert.Equal(t, *samplingRules[1].SamplingRule.ServiceType, "local")
115+
assert.Equal(t, *samplingRules[1].SamplingRule.Host, "*")
116+
assert.Equal(t, *samplingRules[1].SamplingRule.URLPath, "/aws-sdk-call")
117+
assert.Equal(t, *samplingRules[1].SamplingRule.ReservoirSize, int64(3))
118+
assert.Equal(t, *samplingRules[1].SamplingRule.FixedRate, 0.09)
119+
120+
assert.Equal(t, *samplingRules[2].SamplingRule.RuleName, "test-rule-1")
121+
assert.Equal(t, *samplingRules[2].SamplingRule.ServiceType, "*")
122+
assert.Equal(t, *samplingRules[2].SamplingRule.Host, "*")
123+
assert.Equal(t, *samplingRules[2].SamplingRule.URLPath, "*")
124+
assert.Equal(t, *samplingRules[2].SamplingRule.ReservoirSize, int64(100))
125+
assert.Equal(t, *samplingRules[2].SamplingRule.FixedRate, 0.09)
126+
}
127+
128+
func TestGetSamplingRulesWithMissingValues(t *testing.T) {
129+
body := []byte(`{
130+
"NextToken": null,
131+
"SamplingRuleRecords": [
132+
{
133+
"CreatedAt": 0,
134+
"ModifiedAt": 1639517389,
135+
"SamplingRule": {
136+
"Attributes": {},
137+
"FixedRate": 0.5,
138+
"HTTPMethod": "*",
139+
"Host": "*",
140+
"ResourceARN": "*",
141+
"RuleARN": "arn:aws:xray:us-west-1:xxxxxxx:sampling-rule/Default",
142+
"RuleName": "Default",
143+
"ServiceName": "*",
144+
"ServiceType": "*",
145+
"URLPath": "*",
146+
"Version": 1
147+
}
148+
}
149+
]
150+
}`)
151+
152+
client := createTestClient(t, body)
153+
154+
samplingRules, err := (*client).GetSamplingRules()
155+
require.NoError(t, err)
156+
157+
// Priority and ReservoirSize are missing in API response so they are assigned as nil
158+
assert.Nil(t, samplingRules[0].SamplingRule.Priority)
159+
assert.Nil(t, samplingRules[0].SamplingRule.ReservoirSize)
160+
161+
// other values are stored as expected
162+
assert.Equal(t, *samplingRules[0].SamplingRule.RuleName, "Default")
163+
}
164+
165+
func TestGetSamplingTargets(t *testing.T) {
166+
body := []byte(`{
167+
"LastRuleModification": 123456,
168+
"SamplingTargetDocuments": [
169+
{
170+
"FixedRate": 6,
171+
"Interval": 6,
172+
"ReservoirQuota": 3,
173+
"ReservoirQuotaTTL": 456789,
174+
"RuleName": "r2"
175+
}
176+
],
177+
"UnprocessedStatistics": [
178+
{
179+
"ErrorCode": "200",
180+
"Message": "ok",
181+
"RuleName": "r2"
182+
}
183+
]
184+
}`)
185+
186+
client := createTestClient(t, body)
187+
188+
samplingTragets, err := (*client).GetSamplingTargets(nil)
189+
require.NoError(t, err)
190+
191+
assert.Equal(t, *samplingTragets.LastRuleModification, float64(123456))
192+
assert.Equal(t, *samplingTragets.SamplingTargetDocuments[0].FixedRate, float64(6))
193+
assert.Equal(t, *samplingTragets.SamplingTargetDocuments[0].Interval, int64(6))
194+
assert.Equal(t, *samplingTragets.SamplingTargetDocuments[0].ReservoirQuota, int64(3))
195+
assert.Equal(t, *samplingTragets.SamplingTargetDocuments[0].ReservoirQuotaTTL, float64(456789))
196+
assert.Equal(t, *samplingTragets.SamplingTargetDocuments[0].RuleName, "r2")
197+
assert.Equal(t, *samplingTragets.UnprocessedStatistics[0].RuleName, "r2")
198+
assert.Equal(t, *samplingTragets.UnprocessedStatistics[0].ErrorCode, "200")
199+
assert.Equal(t, *samplingTragets.UnprocessedStatistics[0].Message, "ok")
200+
}
201+
202+
func TestGetSamplingTargetsMissingValues(t *testing.T) {
203+
body := []byte(`{
204+
"LastRuleModification": 123459,
205+
"SamplingTargetDocuments": [
206+
{
207+
"FixedRate": 5,
208+
"ReservoirQuotaTTL": 3456789,
209+
"RuleName": "r1"
210+
}
211+
],
212+
"UnprocessedStatistics": [
213+
{
214+
"ErrorCode": "200",
215+
"Message": "ok",
216+
"RuleName": "r1"
217+
}
218+
]
219+
}`)
220+
221+
client := createTestClient(t, body)
222+
223+
samplingTragets, err := (*client).GetSamplingTargets(nil)
224+
require.NoError(t, err)
225+
226+
assert.Nil(t, samplingTragets.SamplingTargetDocuments[0].Interval)
227+
assert.Nil(t, samplingTragets.SamplingTargetDocuments[0].ReservoirQuota)
228+
}
229+
230+
func TestNilContext(t *testing.T) {
231+
client := createTestClient(t, []byte(``))
232+
samplingRulesOutput, err := (*client).GetSamplingRules()
233+
require.Error(t, err)
234+
require.Nil(t, samplingRulesOutput)
235+
236+
samplingTargetsOutput, err := (*client).GetSamplingTargets(nil)
237+
require.Error(t, err)
238+
require.Nil(t, samplingTargetsOutput)
239+
}
240+
241+
// Same as `newProxy` but returns type `proxy` instead of `svcProxy` for testing purposes
242+
func createProxyForTesting(d *daemoncfg.DaemonEndpoints) (proxy, error) {
243+
if d == nil {
244+
d = daemoncfg.GetDaemonEndpoints()
245+
}
246+
url := "http://" + d.TCPAddr.String()
247+
248+
// Construct resolved URLs for getSamplingRules and getSamplingTargets API calls.
249+
samplingRulesURL := url + "/GetSamplingRules"
250+
samplingTargetsURL := url + "/SamplingTargets"
251+
252+
p := &proxy{
253+
xray: &xrayClient{
254+
httpClient: &http.Client{},
255+
samplingRulesURL: samplingRulesURL,
256+
samplingTargetsURL: samplingTargetsURL,
257+
},
258+
}
259+
260+
return *p, nil
261+
}
262+
263+
func TestNewClient(t *testing.T) {
264+
udpAddr, _ := net.ResolveUDPAddr("udp", "127.0.0.1:2020")
265+
tcpAddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:2020")
266+
267+
xrayClient, err := createProxyForTesting(&daemoncfg.DaemonEndpoints{
268+
UDPAddr: udpAddr,
269+
TCPAddr: tcpAddr,
270+
})
271+
272+
require.NoError(t, err)
273+
274+
assert.Equal(t, "http://127.0.0.1:2020/GetSamplingRules", xrayClient.xray.samplingRulesURL)
275+
assert.Equal(t, "http://127.0.0.1:2020/SamplingTargets", xrayClient.xray.samplingTargetsURL)
276+
}
277+
278+
func TestEndpointIsNotReachable(t *testing.T) {
279+
udpAddr, _ := net.ResolveUDPAddr("udp", "127.0.0.1:2020")
280+
tcpAddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:2020")
281+
282+
client, err := createProxyForTesting(&daemoncfg.DaemonEndpoints{
283+
UDPAddr: udpAddr,
284+
TCPAddr: tcpAddr,
285+
})
286+
287+
_, err = client.GetSamplingRules()
288+
assert.Error(t, err)
289+
}

0 commit comments

Comments
 (0)