github.com/newrelic/go-agent@v3.26.0+incompatible/_integrations/nrlambda/events_test.go (about) 1 // Copyright 2020 New Relic Corporation. All rights reserved. 2 // SPDX-License-Identifier: Apache-2.0 3 4 package nrlambda 5 6 import ( 7 "testing" 8 9 "github.com/aws/aws-lambda-go/events" 10 newrelic "github.com/newrelic/go-agent" 11 ) 12 13 func TestGetEventAttributes(t *testing.T) { 14 testcases := []struct { 15 Name string 16 Input interface{} 17 Arn string 18 }{ 19 {Name: "nil", Input: nil, Arn: ""}, 20 {Name: "SQSEvent empty", Input: events.SQSEvent{}, Arn: ""}, 21 {Name: "SQSEvent", Input: events.SQSEvent{ 22 Records: []events.SQSMessage{{ 23 EventSourceARN: "ARN", 24 }}, 25 }, Arn: "ARN"}, 26 {Name: "SNSEvent empty", Input: events.SNSEvent{}, Arn: ""}, 27 {Name: "SNSEvent", Input: events.SNSEvent{ 28 Records: []events.SNSEventRecord{{ 29 EventSubscriptionArn: "ARN", 30 }}, 31 }, Arn: "ARN"}, 32 {Name: "S3Event empty", Input: events.S3Event{}, Arn: ""}, 33 {Name: "S3Event", Input: events.S3Event{ 34 Records: []events.S3EventRecord{{ 35 S3: events.S3Entity{ 36 Bucket: events.S3Bucket{ 37 Arn: "ARN", 38 }, 39 }, 40 }}, 41 }, Arn: "ARN"}, 42 {Name: "DynamoDBEvent empty", Input: events.DynamoDBEvent{}, Arn: ""}, 43 {Name: "DynamoDBEvent", Input: events.DynamoDBEvent{ 44 Records: []events.DynamoDBEventRecord{{ 45 EventSourceArn: "ARN", 46 }}, 47 }, Arn: "ARN"}, 48 {Name: "CodeCommitEvent empty", Input: events.CodeCommitEvent{}, Arn: ""}, 49 {Name: "CodeCommitEvent", Input: events.CodeCommitEvent{ 50 Records: []events.CodeCommitRecord{{ 51 EventSourceARN: "ARN", 52 }}, 53 }, Arn: "ARN"}, 54 {Name: "KinesisEvent empty", Input: events.KinesisEvent{}, Arn: ""}, 55 {Name: "KinesisEvent", Input: events.KinesisEvent{ 56 Records: []events.KinesisEventRecord{{ 57 EventSourceArn: "ARN", 58 }}, 59 }, Arn: "ARN"}, 60 {Name: "KinesisFirehoseEvent", Input: events.KinesisFirehoseEvent{ 61 DeliveryStreamArn: "ARN", 62 }, Arn: "ARN"}, 63 } 64 65 for _, testcase := range testcases { 66 arn := getEventSourceARN(testcase.Input) 67 if arn != testcase.Arn { 68 t.Error(testcase.Name, arn, testcase.Arn) 69 } 70 } 71 } 72 73 func TestEventWebRequest(t *testing.T) { 74 // First test a type that does not count as a web request. 75 req := eventWebRequest(22) 76 if nil != req { 77 t.Error(req) 78 } 79 80 testcases := []struct { 81 testname string 82 input interface{} 83 numHeaders int 84 method string 85 urlString string 86 transport newrelic.TransportType 87 }{ 88 { 89 testname: "empty proxy request", 90 input: events.APIGatewayProxyRequest{}, 91 numHeaders: 0, 92 method: "", 93 urlString: "", 94 transport: newrelic.TransportUnknown, 95 }, 96 { 97 testname: "populated proxy request", 98 input: events.APIGatewayProxyRequest{ 99 Headers: map[string]string{ 100 "x-forwarded-port": "4000", 101 "x-forwarded-proto": "HTTPS", 102 }, 103 HTTPMethod: "GET", 104 Path: "the/path", 105 }, 106 numHeaders: 2, 107 method: "GET", 108 urlString: "//:4000/the/path", 109 transport: newrelic.TransportHTTPS, 110 }, 111 { 112 testname: "empty alb request", 113 input: events.ALBTargetGroupRequest{}, 114 numHeaders: 0, 115 method: "", 116 urlString: "", 117 transport: newrelic.TransportUnknown, 118 }, 119 { 120 testname: "populated alb request", 121 input: events.ALBTargetGroupRequest{ 122 Headers: map[string]string{ 123 "x-forwarded-port": "3000", 124 "x-forwarded-proto": "HttP", 125 }, 126 HTTPMethod: "GET", 127 Path: "the/path", 128 }, 129 numHeaders: 2, 130 method: "GET", 131 urlString: "//:3000/the/path", 132 transport: newrelic.TransportHTTP, 133 }, 134 } 135 136 for _, tc := range testcases { 137 req = eventWebRequest(tc.input) 138 if req == nil { 139 t.Error(tc.testname, "no request returned") 140 continue 141 } 142 if h := req.Header(); len(h) != tc.numHeaders { 143 t.Error(tc.testname, "header len mismatch", h, tc.numHeaders) 144 } 145 if u := req.URL().String(); u != tc.urlString { 146 t.Error(tc.testname, "url mismatch", u, tc.urlString) 147 } 148 if m := req.Method(); m != tc.method { 149 t.Error(tc.testname, "method mismatch", m, tc.method) 150 } 151 if tr := req.Transport(); tr != tc.transport { 152 t.Error(tc.testname, "transport mismatch", tr, tc.transport) 153 } 154 } 155 } 156 157 func TestEventResponse(t *testing.T) { 158 // First test a type that does not count as a web request. 159 resp := eventResponse(22) 160 if nil != resp { 161 t.Error(resp) 162 } 163 164 testcases := []struct { 165 testname string 166 input interface{} 167 numHeaders int 168 code int 169 }{ 170 { 171 testname: "empty proxy response", 172 input: events.APIGatewayProxyResponse{}, 173 numHeaders: 0, 174 code: 0, 175 }, 176 { 177 testname: "populated proxy response", 178 input: events.APIGatewayProxyResponse{ 179 StatusCode: 200, 180 Headers: map[string]string{ 181 "x-custom-header": "my custom header value", 182 }, 183 }, 184 numHeaders: 1, 185 code: 200, 186 }, 187 { 188 testname: "empty alb response", 189 input: events.ALBTargetGroupResponse{}, 190 numHeaders: 0, 191 code: 0, 192 }, 193 { 194 testname: "populated alb response", 195 input: events.ALBTargetGroupResponse{ 196 StatusCode: 200, 197 Headers: map[string]string{ 198 "x-custom-header": "my custom header value", 199 }, 200 }, 201 numHeaders: 1, 202 code: 200, 203 }, 204 } 205 206 for _, tc := range testcases { 207 resp = eventResponse(tc.input) 208 if resp == nil { 209 t.Error(tc.testname, "no response returned") 210 continue 211 } 212 if h := resp.Header(); len(h) != tc.numHeaders { 213 t.Error(tc.testname, "header len mismatch", h, tc.numHeaders) 214 } 215 if resp.code != tc.code { 216 t.Error(tc.testname, "status code mismatch", resp.code, tc.code) 217 } 218 } 219 }