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 }