1// +build go1.13
2
3// Copyright (c) Microsoft Corporation. All rights reserved.
4// Licensed under the MIT License.
5
6package azcore
7
8import (
9	"context"
10	"fmt"
11	"net/http"
12	"testing"
13
14	"github.com/Azure/azure-sdk-for-go/sdk/internal/mock"
15)
16
17var defaultTelemetry = UserAgent + " " + platformInfo
18
19func TestPolicyTelemetryDefault(t *testing.T) {
20	srv, close := mock.NewServer()
21	defer close()
22	srv.SetResponse()
23	pl := NewPipeline(srv, NewTelemetryPolicy(nil))
24	req, err := NewRequest(context.Background(), http.MethodGet, srv.URL())
25	if err != nil {
26		t.Fatalf("unexpected error: %v", err)
27	}
28	resp, err := pl.Do(req)
29	if err != nil {
30		t.Fatalf("unexpected error: %v", err)
31	}
32	if v := resp.Request.Header.Get(HeaderUserAgent); v != defaultTelemetry {
33		t.Fatalf("unexpected user agent value: %s", v)
34	}
35}
36
37func TestPolicyTelemetryWithCustomInfo(t *testing.T) {
38	srv, close := mock.NewServer()
39	defer close()
40	srv.SetResponse()
41	const testValue = "azcore_test"
42	pl := NewPipeline(srv, NewTelemetryPolicy(&TelemetryOptions{Value: testValue}))
43	req, err := NewRequest(context.Background(), http.MethodGet, srv.URL())
44	if err != nil {
45		t.Fatalf("unexpected error: %v", err)
46	}
47	resp, err := pl.Do(req)
48	if err != nil {
49		t.Fatalf("unexpected error: %v", err)
50	}
51	if v := resp.Request.Header.Get(HeaderUserAgent); v != fmt.Sprintf("%s %s", testValue, defaultTelemetry) {
52		t.Fatalf("unexpected user agent value: %s", v)
53	}
54}
55
56func TestPolicyTelemetryPreserveExisting(t *testing.T) {
57	srv, close := mock.NewServer()
58	defer close()
59	srv.SetResponse()
60	pl := NewPipeline(srv, NewTelemetryPolicy(nil))
61	req, err := NewRequest(context.Background(), http.MethodGet, srv.URL())
62	if err != nil {
63		t.Fatalf("unexpected error: %v", err)
64	}
65	const otherValue = "this should stay"
66	req.Header.Set(HeaderUserAgent, otherValue)
67	resp, err := pl.Do(req)
68	if err != nil {
69		t.Fatalf("unexpected error: %v", err)
70	}
71	if v := resp.Request.Header.Get(HeaderUserAgent); v != fmt.Sprintf("%s %s", defaultTelemetry, otherValue) {
72		t.Fatalf("unexpected user agent value: %s", v)
73	}
74}
75
76func TestPolicyTelemetryWithAppID(t *testing.T) {
77	srv, close := mock.NewServer()
78	defer close()
79	srv.SetResponse()
80	const appID = "my_application"
81	pl := NewPipeline(srv, NewTelemetryPolicy(&TelemetryOptions{ApplicationID: appID}))
82	req, err := NewRequest(context.Background(), http.MethodGet, srv.URL())
83	if err != nil {
84		t.Fatalf("unexpected error: %v", err)
85	}
86	resp, err := pl.Do(req)
87	if err != nil {
88		t.Fatalf("unexpected error: %v", err)
89	}
90	if v := resp.Request.Header.Get(HeaderUserAgent); v != fmt.Sprintf("%s %s", appID, defaultTelemetry) {
91		t.Fatalf("unexpected user agent value: %s", v)
92	}
93}
94
95func TestPolicyTelemetryWithAppIDAndReqTelemetry(t *testing.T) {
96	srv, close := mock.NewServer()
97	defer close()
98	srv.SetResponse()
99	const appID = "my_application"
100	pl := NewPipeline(srv, NewTelemetryPolicy(&TelemetryOptions{ApplicationID: appID}))
101	req, err := NewRequest(context.Background(), http.MethodGet, srv.URL())
102	if err != nil {
103		t.Fatalf("unexpected error: %v", err)
104	}
105	req.Telemetry("TestPolicyTelemetryWithAppIDAndReqTelemetry")
106	resp, err := pl.Do(req)
107	if err != nil {
108		t.Fatalf("unexpected error: %v", err)
109	}
110	if v := resp.Request.Header.Get(HeaderUserAgent); v != fmt.Sprintf("%s %s %s", "TestPolicyTelemetryWithAppIDAndReqTelemetry", appID, defaultTelemetry) {
111		t.Fatalf("unexpected user agent value: %s", v)
112	}
113}
114
115func TestPolicyTelemetryWithAppIDSanitized(t *testing.T) {
116	srv, close := mock.NewServer()
117	defer close()
118	srv.SetResponse()
119	const appID = "This will get the spaces removed and truncated."
120	pl := NewPipeline(srv, NewTelemetryPolicy(&TelemetryOptions{ApplicationID: appID}))
121	req, err := NewRequest(context.Background(), http.MethodGet, srv.URL())
122	if err != nil {
123		t.Fatalf("unexpected error: %v", err)
124	}
125	resp, err := pl.Do(req)
126	if err != nil {
127		t.Fatalf("unexpected error: %v", err)
128	}
129	const newAppID = "This/will/get/the/spaces"
130	if v := resp.Request.Header.Get(HeaderUserAgent); v != fmt.Sprintf("%s %s", newAppID, defaultTelemetry) {
131		t.Fatalf("unexpected user agent value: %s", v)
132	}
133}
134
135func TestPolicyTelemetryPreserveExistingWithAppID(t *testing.T) {
136	srv, close := mock.NewServer()
137	defer close()
138	srv.SetResponse()
139	const appID = "my_application"
140	pl := NewPipeline(srv, NewTelemetryPolicy(&TelemetryOptions{ApplicationID: appID}))
141	req, err := NewRequest(context.Background(), http.MethodGet, srv.URL())
142	if err != nil {
143		t.Fatalf("unexpected error: %v", err)
144	}
145	const otherValue = "this should stay"
146	req.Header.Set(HeaderUserAgent, otherValue)
147	resp, err := pl.Do(req)
148	if err != nil {
149		t.Fatalf("unexpected error: %v", err)
150	}
151	if v := resp.Request.Header.Get(HeaderUserAgent); v != fmt.Sprintf("%s %s %s", appID, defaultTelemetry, otherValue) {
152		t.Fatalf("unexpected user agent value: %s", v)
153	}
154}
155
156func TestPolicyTelemetryDisabled(t *testing.T) {
157	srv, close := mock.NewServer()
158	defer close()
159	srv.SetResponse()
160	const appID = "my_application"
161	pl := NewPipeline(srv, NewTelemetryPolicy(&TelemetryOptions{ApplicationID: appID, Disabled: true}))
162	req, err := NewRequest(context.Background(), http.MethodGet, srv.URL())
163	if err != nil {
164		t.Fatalf("unexpected error: %v", err)
165	}
166	req.Telemetry("this should be ignored")
167	resp, err := pl.Do(req)
168	if err != nil {
169		t.Fatalf("unexpected error: %v", err)
170	}
171	if v := resp.Request.Header.Get(HeaderUserAgent); v != "" {
172		t.Fatalf("unexpected user agent value: %s", v)
173	}
174}
175