git.colasdn.top/newrelic/go-agent@v3.26.0+incompatible/internal/cross_process_http_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  	"net/http"
     8  	"reflect"
     9  	"testing"
    10  
    11  	"github.com/newrelic/go-agent/internal/cat"
    12  )
    13  
    14  func TestTxnCrossProcessInitFromHTTPRequest(t *testing.T) {
    15  	txp := &TxnCrossProcess{}
    16  	txp.Init(true, false, replyAccountOne)
    17  	if txp.IsInbound() {
    18  		t.Error("inbound CAT enabled even though there was no request")
    19  	}
    20  
    21  	txp = &TxnCrossProcess{}
    22  	req, err := http.NewRequest("GET", "http://foo.bar/", nil)
    23  	if err != nil {
    24  		t.Fatal(err)
    25  	}
    26  	txp.Init(true, false, replyAccountOne)
    27  	if err := txp.InboundHTTPRequest(req.Header); err != nil {
    28  		t.Errorf("got error while consuming an empty request: %v", err)
    29  	}
    30  	if txp.IsInbound() {
    31  		t.Error("inbound CAT enabled even though there was no metadata in the request")
    32  	}
    33  
    34  	txp = &TxnCrossProcess{}
    35  	req, err = http.NewRequest("GET", "http://foo.bar/", nil)
    36  	if err != nil {
    37  		t.Fatal(err)
    38  	}
    39  	req.Header.Add(cat.NewRelicIDName, mustObfuscate(`1#1`, "foo"))
    40  	req.Header.Add(cat.NewRelicTxnName, mustObfuscate(`["abcdefgh",false,"12345678","b95be233"]`, "foo"))
    41  	txp.Init(true, false, replyAccountOne)
    42  	if err := txp.InboundHTTPRequest(req.Header); err != nil {
    43  		t.Errorf("got error while consuming an inbound CAT request: %v", err)
    44  	}
    45  	// A second call to InboundHTTPRequest to ensure that it can safely
    46  	// be called multiple times:
    47  	if err := txp.InboundHTTPRequest(req.Header); err != nil {
    48  		t.Errorf("got error while consuming an inbound CAT request: %v", err)
    49  	}
    50  	if !txp.IsInbound() {
    51  		t.Error("inbound CAT disabled even though there was metadata in the request")
    52  	}
    53  	if txp.ClientID != "1#1" {
    54  		t.Errorf("incorrect ClientID: %s", txp.ClientID)
    55  	}
    56  	if txp.ReferringTxnGUID != "abcdefgh" {
    57  		t.Errorf("incorrect ReferringTxnGUID: %s", txp.ReferringTxnGUID)
    58  	}
    59  	if txp.TripID != "12345678" {
    60  		t.Errorf("incorrect TripID: %s", txp.TripID)
    61  	}
    62  	if txp.ReferringPathHash != "b95be233" {
    63  		t.Errorf("incorrect ReferringPathHash: %s", txp.ReferringPathHash)
    64  	}
    65  }
    66  
    67  func TestAppDataToHTTPHeader(t *testing.T) {
    68  	header := AppDataToHTTPHeader("")
    69  	if len(header) != 0 {
    70  		t.Errorf("unexpected number of header elements: %d", len(header))
    71  	}
    72  
    73  	header = AppDataToHTTPHeader("foo")
    74  	if len(header) != 1 {
    75  		t.Errorf("unexpected number of header elements: %d", len(header))
    76  	}
    77  	if actual := header.Get(cat.NewRelicAppDataName); actual != "foo" {
    78  		t.Errorf("unexpected header value: %s", actual)
    79  	}
    80  }
    81  
    82  func TestHTTPHeaderToAppData(t *testing.T) {
    83  	if appData := HTTPHeaderToAppData(nil); appData != "" {
    84  		t.Errorf("unexpected app data: %s", appData)
    85  	}
    86  
    87  	header := http.Header{}
    88  	if appData := HTTPHeaderToAppData(header); appData != "" {
    89  		t.Errorf("unexpected app data: %s", appData)
    90  	}
    91  
    92  	header.Add("X-Foo", "bar")
    93  	if appData := HTTPHeaderToAppData(header); appData != "" {
    94  		t.Errorf("unexpected app data: %s", appData)
    95  	}
    96  
    97  	header.Add(cat.NewRelicAppDataName, "foo")
    98  	if appData := HTTPHeaderToAppData(header); appData != "foo" {
    99  		t.Errorf("unexpected app data: %s", appData)
   100  	}
   101  }
   102  
   103  func TestHTTPHeaderToMetadata(t *testing.T) {
   104  	if metadata := HTTPHeaderToMetadata(nil); !reflect.DeepEqual(metadata, CrossProcessMetadata{}) {
   105  		t.Errorf("unexpected metadata: %v", metadata)
   106  	}
   107  
   108  	header := http.Header{}
   109  	if metadata := HTTPHeaderToMetadata(header); !reflect.DeepEqual(metadata, CrossProcessMetadata{}) {
   110  		t.Errorf("unexpected metadata: %v", metadata)
   111  	}
   112  
   113  	header.Add("X-Foo", "bar")
   114  	if metadata := HTTPHeaderToMetadata(header); !reflect.DeepEqual(metadata, CrossProcessMetadata{}) {
   115  		t.Errorf("unexpected metadata: %v", metadata)
   116  	}
   117  
   118  	header.Add(cat.NewRelicIDName, "id")
   119  	if metadata := HTTPHeaderToMetadata(header); !reflect.DeepEqual(metadata, CrossProcessMetadata{
   120  		ID: "id",
   121  	}) {
   122  		t.Errorf("unexpected metadata: %v", metadata)
   123  	}
   124  
   125  	header.Add(cat.NewRelicTxnName, "txn")
   126  	if metadata := HTTPHeaderToMetadata(header); !reflect.DeepEqual(metadata, CrossProcessMetadata{
   127  		ID:      "id",
   128  		TxnData: "txn",
   129  	}) {
   130  		t.Errorf("unexpected metadata: %v", metadata)
   131  	}
   132  
   133  	header.Add(cat.NewRelicSyntheticsName, "synth")
   134  	if metadata := HTTPHeaderToMetadata(header); !reflect.DeepEqual(metadata, CrossProcessMetadata{
   135  		ID:         "id",
   136  		TxnData:    "txn",
   137  		Synthetics: "synth",
   138  	}) {
   139  		t.Errorf("unexpected metadata: %v", metadata)
   140  	}
   141  }
   142  
   143  func TestMetadataToHTTPHeader(t *testing.T) {
   144  	metadata := CrossProcessMetadata{}
   145  
   146  	header := MetadataToHTTPHeader(metadata)
   147  	if len(header) != 0 {
   148  		t.Errorf("unexpected number of header elements: %d", len(header))
   149  	}
   150  
   151  	metadata.ID = "id"
   152  	header = MetadataToHTTPHeader(metadata)
   153  	if len(header) != 1 {
   154  		t.Errorf("unexpected number of header elements: %d", len(header))
   155  	}
   156  	if actual := header.Get(cat.NewRelicIDName); actual != "id" {
   157  		t.Errorf("unexpected header value: %s", actual)
   158  	}
   159  
   160  	metadata.TxnData = "txn"
   161  	header = MetadataToHTTPHeader(metadata)
   162  	if len(header) != 2 {
   163  		t.Errorf("unexpected number of header elements: %d", len(header))
   164  	}
   165  	if actual := header.Get(cat.NewRelicIDName); actual != "id" {
   166  		t.Errorf("unexpected header value: %s", actual)
   167  	}
   168  	if actual := header.Get(cat.NewRelicTxnName); actual != "txn" {
   169  		t.Errorf("unexpected header value: %s", actual)
   170  	}
   171  
   172  	metadata.Synthetics = "synth"
   173  	header = MetadataToHTTPHeader(metadata)
   174  	if len(header) != 3 {
   175  		t.Errorf("unexpected number of header elements: %d", len(header))
   176  	}
   177  	if actual := header.Get(cat.NewRelicIDName); actual != "id" {
   178  		t.Errorf("unexpected header value: %s", actual)
   179  	}
   180  	if actual := header.Get(cat.NewRelicTxnName); actual != "txn" {
   181  		t.Errorf("unexpected header value: %s", actual)
   182  	}
   183  	if actual := header.Get(cat.NewRelicSyntheticsName); actual != "synth" {
   184  		t.Errorf("unexpected header value: %s", actual)
   185  	}
   186  }