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  }