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