github.com/newrelic/go-agent@v3.26.0+incompatible/internal/distributed_tracing_test.go (about) 1 // Copyright 2020 New Relic Corporation. All rights reserved. 2 // SPDX-License-Identifier: Apache-2.0 3 4 package internal 5 6 import ( 7 "encoding/json" 8 "testing" 9 "time" 10 ) 11 12 var ( 13 samplePayload = Payload{ 14 payloadCaller: payloadCaller{ 15 Type: CallerType, 16 Account: "123", 17 App: "456", 18 }, 19 ID: "myid", 20 TracedID: "mytrip", 21 Priority: 0.12345, 22 Timestamp: timestampMillis(time.Now()), 23 } 24 ) 25 26 func TestPayloadRaw(t *testing.T) { 27 out, err := AcceptPayload(samplePayload) 28 if err != nil || out == nil { 29 t.Fatal(err, out) 30 } 31 if samplePayload != *out { 32 t.Fatal(samplePayload, out) 33 } 34 } 35 36 func TestPayloadNil(t *testing.T) { 37 out, err := AcceptPayload(nil) 38 if err != nil || out != nil { 39 t.Fatal(err, out) 40 } 41 } 42 43 func TestPayloadText(t *testing.T) { 44 out, err := AcceptPayload(samplePayload.Text()) 45 if err != nil || out == nil { 46 t.Fatal(err, out) 47 } 48 out.Timestamp = samplePayload.Timestamp // account for timezone differences 49 if samplePayload != *out { 50 t.Fatal(samplePayload, out) 51 } 52 } 53 54 func TestPayloadTextByteSlice(t *testing.T) { 55 out, err := AcceptPayload([]byte(samplePayload.Text())) 56 if err != nil || out == nil { 57 t.Fatal(err, out) 58 } 59 out.Timestamp = samplePayload.Timestamp // account for timezone differences 60 if samplePayload != *out { 61 t.Fatal(samplePayload, out) 62 } 63 } 64 65 func TestPayloadHTTPSafe(t *testing.T) { 66 out, err := AcceptPayload(samplePayload.HTTPSafe()) 67 if err != nil || nil == out { 68 t.Fatal(err, out) 69 } 70 out.Timestamp = samplePayload.Timestamp // account for timezone differences 71 if samplePayload != *out { 72 t.Fatal(samplePayload, out) 73 } 74 } 75 76 func TestPayloadHTTPSafeByteSlice(t *testing.T) { 77 out, err := AcceptPayload([]byte(samplePayload.HTTPSafe())) 78 if err != nil || nil == out { 79 t.Fatal(err, out) 80 } 81 out.Timestamp = samplePayload.Timestamp // account for timezone differences 82 if samplePayload != *out { 83 t.Fatal(samplePayload, out) 84 } 85 } 86 87 func TestPayloadInvalidBase64(t *testing.T) { 88 out, err := AcceptPayload("======") 89 if _, ok := err.(ErrPayloadParse); !ok { 90 t.Fatal(err) 91 } 92 if nil != out { 93 t.Fatal(out) 94 } 95 } 96 97 func TestPayloadEmptyString(t *testing.T) { 98 out, err := AcceptPayload("") 99 if err != nil { 100 t.Fatal(err) 101 } 102 if nil != out { 103 t.Fatal(out) 104 } 105 } 106 107 func TestPayloadUnexpectedType(t *testing.T) { 108 out, err := AcceptPayload(1) 109 if err != nil { 110 t.Fatal(err) 111 } 112 if nil != out { 113 t.Fatal(out) 114 } 115 } 116 117 func TestPayloadBadVersion(t *testing.T) { 118 futuristicVersion := distTraceVersion([2]int{ 119 currentDistTraceVersion[0] + 1, 120 currentDistTraceVersion[1] + 1, 121 }) 122 out, err := AcceptPayload(samplePayload.text(futuristicVersion)) 123 if _, ok := err.(ErrUnsupportedPayloadVersion); !ok { 124 t.Fatal(err) 125 } 126 if out != nil { 127 t.Fatal(out) 128 } 129 } 130 131 func TestPayloadBadEnvelope(t *testing.T) { 132 out, err := AcceptPayload("{") 133 if _, ok := err.(ErrPayloadParse); !ok { 134 t.Fatal(err) 135 } 136 if out != nil { 137 t.Fatal(out) 138 } 139 } 140 141 func TestPayloadBadPayload(t *testing.T) { 142 var envelope map[string]interface{} 143 if err := json.Unmarshal([]byte(samplePayload.Text()), &envelope); nil != err { 144 t.Fatal(err) 145 } 146 envelope["d"] = "123" 147 payload, err := json.Marshal(envelope) 148 if nil != err { 149 t.Fatal(err) 150 } 151 out, err := AcceptPayload(payload) 152 if _, ok := err.(ErrPayloadParse); !ok { 153 t.Fatal(err) 154 } 155 if out != nil { 156 t.Fatal(out) 157 } 158 } 159 160 func TestTimestampMillisMarshalUnmarshal(t *testing.T) { 161 var sec int64 = 111 162 var millis int64 = 222 163 var micros int64 = 333 164 var nsecWithMicros = 1000*1000*millis + 1000*micros 165 var nsecWithoutMicros = 1000 * 1000 * millis 166 167 input := time.Unix(sec, nsecWithMicros) 168 expectOutput := time.Unix(sec, nsecWithoutMicros) 169 170 var tm timestampMillis 171 tm.Set(input) 172 js, err := json.Marshal(tm) 173 if nil != err { 174 t.Fatal(err) 175 } 176 var out timestampMillis 177 err = json.Unmarshal(js, &out) 178 if nil != err { 179 t.Fatal(err) 180 } 181 if out.Time() != expectOutput { 182 t.Fatal(out.Time(), expectOutput) 183 } 184 } 185 186 func BenchmarkPayloadText(b *testing.B) { 187 b.ReportAllocs() 188 b.ResetTimer() 189 190 for n := 0; n < b.N; n++ { 191 samplePayload.Text() 192 } 193 } 194 195 func TestEmptyPayloadData(t *testing.T) { 196 // does an empty payload json blob result in an invalid payload 197 var payload Payload 198 fixture := []byte(`{}`) 199 200 if err := json.Unmarshal(fixture, &payload); nil != err { 201 t.Log("Could not marshall fixture data into payload") 202 t.Error(err) 203 } 204 205 if err := payload.IsValid(); err == nil { 206 t.Log("Expected error from empty payload data") 207 t.Fail() 208 } 209 } 210 211 func TestRequiredFieldsPayloadData(t *testing.T) { 212 var payload Payload 213 fixture := []byte(`{ 214 "ty":"App", 215 "ac":"123", 216 "ap":"456", 217 "id":"id", 218 "tr":"traceID", 219 "ti":1488325987402 220 }`) 221 222 if err := json.Unmarshal(fixture, &payload); nil != err { 223 t.Log("Could not marshall fixture data into payload") 224 t.Error(err) 225 } 226 227 if err := payload.IsValid(); err != nil { 228 t.Log("Expected valid payload if ty, ac, ap, id, tr, and ti are set") 229 t.Error(err) 230 } 231 } 232 233 func TestRequiredFieldsMissingType(t *testing.T) { 234 var payload Payload 235 fixture := []byte(`{ 236 "ac":"123", 237 "ap":"456", 238 "id":"id", 239 "tr":"traceID", 240 "ti":1488325987402 241 }`) 242 243 if err := json.Unmarshal(fixture, &payload); nil != err { 244 t.Log("Could not marshall fixture data into payload") 245 t.Error(err) 246 } 247 248 if err := payload.IsValid(); err == nil { 249 t.Log("Expected error from missing Type (ty)") 250 t.Fail() 251 } 252 } 253 254 func TestRequiredFieldsMissingAccount(t *testing.T) { 255 var payload Payload 256 fixture := []byte(`{ 257 "ty":"App", 258 "ap":"456", 259 "id":"id", 260 "tr":"traceID", 261 "ti":1488325987402 262 }`) 263 264 if err := json.Unmarshal(fixture, &payload); nil != err { 265 t.Log("Could not marshall fixture data into payload") 266 t.Error(err) 267 } 268 269 if err := payload.IsValid(); err == nil { 270 t.Log("Expected error from missing Account (ac)") 271 t.Fail() 272 } 273 } 274 275 func TestRequiredFieldsMissingApp(t *testing.T) { 276 var payload Payload 277 fixture := []byte(`{ 278 "ty":"App", 279 "ac":"123", 280 "id":"id", 281 "tr":"traceID", 282 "ti":1488325987402 283 }`) 284 285 if err := json.Unmarshal(fixture, &payload); nil != err { 286 t.Log("Could not marshall fixture data into payload") 287 t.Error(err) 288 } 289 290 if err := payload.IsValid(); err == nil { 291 t.Log("Expected error from missing App (ap)") 292 t.Fail() 293 } 294 } 295 296 func TestRequiredFieldsMissingTimestamp(t *testing.T) { 297 var payload Payload 298 fixture := []byte(`{ 299 "ty":"App", 300 "ac":"123", 301 "ap":"456", 302 "tr":"traceID" 303 }`) 304 305 if err := json.Unmarshal(fixture, &payload); nil != err { 306 t.Log("Could not marshall fixture data into payload") 307 t.Error(err) 308 } 309 310 if err := payload.IsValid(); err == nil { 311 t.Log("Expected error from missing Timestamp (ti)") 312 t.Fail() 313 } 314 } 315 316 func TestRequiredFieldsZeroTimestamp(t *testing.T) { 317 var payload Payload 318 fixture := []byte(`{ 319 "ty":"App", 320 "ac":"123", 321 "ap":"456", 322 "tr":"traceID", 323 "ti":0 324 }`) 325 326 if err := json.Unmarshal(fixture, &payload); nil != err { 327 t.Log("Could not marshall fixture data into payload") 328 t.Error(err) 329 } 330 331 if err := payload.IsValid(); err == nil { 332 t.Log("Expected error from missing Timestamp (ti)") 333 t.Fail() 334 } 335 }