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  }