Skip to content

Commit 95019e2

Browse files
authored
Merge pull request #13 from FireTail-io/tests
Improve Firetail Package Test Coverage
2 parents 4821906 + cd34919 commit 95019e2

File tree

6 files changed

+578
-2
lines changed

6 files changed

+578
-2
lines changed

firetail/extract_firetail_records_test.go

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package firetail
22

33
import (
4+
"encoding/base32"
45
"encoding/base64"
56
"encoding/json"
7+
"firetail-lambda-extension/logsapi"
68
"testing"
9+
"time"
710

811
"github.com/stretchr/testify/assert"
912
"github.com/stretchr/testify/require"
@@ -26,3 +29,170 @@ func TestDecodeFiretailRecordResponse(t *testing.T) {
2629

2730
assert.Equal(t, testRecord.Response, *&decodedRecord.Response)
2831
}
32+
33+
func TestDecodeFiretailRecordWithMissingPart(t *testing.T) {
34+
encodedRecord := "firetail:log-ext"
35+
36+
decodedRecord, err := decodeFiretailRecord(encodedRecord)
37+
assert.Nil(t, decodedRecord)
38+
require.NotNil(t, err)
39+
40+
assert.Equal(t, "record had 2 parts when split by ':'", err.Error())
41+
}
42+
43+
func TestDecodeFiretailRecordWithExtraPart(t *testing.T) {
44+
testRecord := Record{
45+
Response: RecordResponse{
46+
StatusCode: 200,
47+
Body: "Test Body",
48+
},
49+
}
50+
testPayloadBytes, err := json.Marshal(testRecord)
51+
require.Nil(t, err)
52+
53+
encodedRecord := "firetail:log-ext:" + base64.StdEncoding.EncodeToString(testPayloadBytes) + ":extra"
54+
55+
decodedRecord, err := decodeFiretailRecord(encodedRecord)
56+
assert.Nil(t, decodedRecord)
57+
require.NotNil(t, err)
58+
59+
assert.Equal(t, "record had 4 parts when split by ':'", err.Error())
60+
}
61+
62+
func TestDecodeFiretailRecordWithInvalidPrefix(t *testing.T) {
63+
testRecord := Record{
64+
Response: RecordResponse{
65+
StatusCode: 200,
66+
Body: "Test Body",
67+
},
68+
}
69+
testPayloadBytes, err := json.Marshal(testRecord)
70+
require.Nil(t, err)
71+
72+
encodedRecord := "tailfire:log-ext:" + base64.StdEncoding.EncodeToString(testPayloadBytes)
73+
74+
decodedRecord, err := decodeFiretailRecord(encodedRecord)
75+
assert.Nil(t, decodedRecord)
76+
require.NotNil(t, err)
77+
78+
assert.Equal(t, "record did not have firetail prefix", err.Error())
79+
}
80+
81+
func TestDecodeFiretailRecordWithInvalidToken(t *testing.T) {
82+
testRecord := Record{
83+
Response: RecordResponse{
84+
StatusCode: 200,
85+
Body: "Test Body",
86+
},
87+
}
88+
testPayloadBytes, err := json.Marshal(testRecord)
89+
require.Nil(t, err)
90+
91+
encodedRecord := "firetail:ext-log:" + base64.StdEncoding.EncodeToString(testPayloadBytes)
92+
93+
decodedRecord, err := decodeFiretailRecord(encodedRecord)
94+
assert.Nil(t, decodedRecord)
95+
require.NotNil(t, err)
96+
97+
assert.Equal(t, "firetail prefixed record did not have valid token", err.Error())
98+
}
99+
100+
func TestDecodeFiretailRecordWithInvalidPayloadEncoding(t *testing.T) {
101+
testRecord := Record{
102+
Response: RecordResponse{
103+
StatusCode: 200,
104+
Body: "Test Body",
105+
},
106+
}
107+
testPayloadBytes, err := json.Marshal(testRecord)
108+
require.Nil(t, err)
109+
110+
encodedRecord := "firetail:log-ext:" + base32.StdEncoding.EncodeToString(testPayloadBytes)
111+
112+
decodedRecord, err := decodeFiretailRecord(encodedRecord)
113+
assert.Nil(t, decodedRecord)
114+
require.NotNil(t, err)
115+
116+
assert.Contains(t, err.Error(), "failed to b64 decode firetail record")
117+
}
118+
119+
func TestDecodeFiretailRecordWithInvalidPayloadTypes(t *testing.T) {
120+
type Event struct {
121+
Event string `json:"event"`
122+
Response int `json:"response"`
123+
ExecutionTime string `json:"execution_time"`
124+
}
125+
testRecord := Event{
126+
Event: "my birthday party",
127+
Response: 0,
128+
ExecutionTime: "tomorrow",
129+
}
130+
testPayloadBytes, err := json.Marshal(testRecord)
131+
require.Nil(t, err)
132+
133+
encodedRecord := "firetail:log-ext:" + base64.StdEncoding.EncodeToString(testPayloadBytes)
134+
135+
decodedRecord, err := decodeFiretailRecord(encodedRecord)
136+
assert.Nil(t, decodedRecord)
137+
require.NotNil(t, err)
138+
139+
assert.Contains(t, err.Error(), "failed to unmarshal firetail event")
140+
}
141+
142+
func TestExtractSingleRecord(t *testing.T) {
143+
testRecord := Record{
144+
Response: RecordResponse{
145+
StatusCode: 200,
146+
Body: "Test Body",
147+
},
148+
}
149+
testPayloadBytes, err := json.Marshal(testRecord)
150+
require.Nil(t, err)
151+
encodedRecord := "firetail:log-ext:" + base64.StdEncoding.EncodeToString(testPayloadBytes)
152+
153+
testMessage := logsapi.LogMessage{
154+
Time: time.Now().Format("2006-01-02T15:04:05.000Z"),
155+
Type: "function",
156+
Record: json.RawMessage{},
157+
}
158+
testRecordBytes, err := json.Marshal(encodedRecord)
159+
require.Nil(t, err)
160+
testMessage.Record = testRecordBytes
161+
162+
decodedRecords, err := ExtractFiretailRecords([]logsapi.LogMessage{testMessage})
163+
require.Nil(t, err)
164+
165+
require.Len(t, decodedRecords, 1)
166+
assert.Equal(t, testRecord.Response, decodedRecords[0].Response)
167+
}
168+
169+
func TestExtractRecordOfInvalidType(t *testing.T) {
170+
testMessage := logsapi.LogMessage{
171+
Type: "platform.start",
172+
}
173+
174+
decodedRecords, err := ExtractFiretailRecords([]logsapi.LogMessage{testMessage})
175+
require.NotNil(t, err)
176+
177+
assert.Len(t, decodedRecords, 0)
178+
assert.Contains(t, err.Error(), "logMessage type is 'platform.start', not 'function'")
179+
}
180+
181+
func TestExtractRecordWithInvalidType(t *testing.T) {
182+
invalidRecord := 3.14159
183+
testMessage := logsapi.LogMessage{
184+
Time: time.Now().Format("2006-01-02T15:04:05.000Z"),
185+
Type: "function",
186+
Record: json.RawMessage{},
187+
}
188+
testRecordBytes, err := json.Marshal(invalidRecord)
189+
require.Nil(t, err)
190+
testMessage.Record = testRecordBytes
191+
192+
decodedRecords, err := ExtractFiretailRecords([]logsapi.LogMessage{testMessage})
193+
require.NotNil(t, err)
194+
195+
assert.Len(t, decodedRecords, 0)
196+
assert.Contains(t, err.Error(), "Err unmarshalling event record as string, err: json: cannot unmarshal number into Go value of type string")
197+
assert.Contains(t, err.Error(), "Err decoding event record as firetail event, err: record had 1 parts when split by ':'")
198+
}

firetail/log_entry_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package firetail
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestEncodeAndDecodeLogEntry(t *testing.T) {
12+
testLogEntry := LogEntry{
13+
DateCreated: time.Now().UnixMilli(),
14+
ExecutionTime: 50,
15+
Request: LogEntryRequest{
16+
Body: "{\"Description\":\"This is a test request body\"}",
17+
Headers: map[string][]string{
18+
"Test-Request-Header": {"Test-Value-1", "Test-Value-2"},
19+
},
20+
HTTPProtocol: HTTP2,
21+
IP: "8.8.8.8",
22+
Method: Get,
23+
URI: "https://www.example.com/pets/100",
24+
Resource: "/pets/{id}",
25+
},
26+
Response: LogEntryResponse{
27+
Body: "{\"Description\":\"This is a test response body\"}",
28+
Headers: map[string][]string{
29+
"Test-Response-Header": {"Test-Value-1", "Test-Value-2"},
30+
},
31+
StatusCode: 200,
32+
},
33+
Version: The100Alpha,
34+
}
35+
36+
testLogEntryBytes, err := testLogEntry.Marshal()
37+
require.Nil(t, err)
38+
39+
unmarshalledLogEntry, err := UnmarshalLogEntry(testLogEntryBytes)
40+
require.Nil(t, err)
41+
assert.Equal(t, testLogEntry, unmarshalledLogEntry)
42+
43+
remarshalledLogEntryBytes, err := unmarshalledLogEntry.Marshal()
44+
require.Nil(t, err)
45+
assert.Equal(t, testLogEntryBytes, remarshalledLogEntryBytes)
46+
}

firetail/record.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ func (r *Record) getLogEntryRequest() (*LogEntryRequest, int64, error) {
3939

4040
var apiGatewayV1Request events.APIGatewayProxyRequest
4141
apiGatewayV1RequestErr := json.Unmarshal(r.Event, &apiGatewayV1Request)
42-
if apiGatewayV1RequestErr == nil {
42+
// If there was no err in unmarshalling into an events.APIGatewayProxyRequest, and the HTTPMethod was populated with a non-zero value, we will
43+
// assume it's an events.APIGatewayProxyRequest.
44+
if apiGatewayV1RequestErr == nil && apiGatewayV1Request.Resource != "" {
4345
logEntryRequest := &LogEntryRequest{
4446
Body: apiGatewayV1Request.Body,
4547
Headers: apiGatewayV1Request.MultiValueHeaders,

0 commit comments

Comments
 (0)