Skip to content

Commit 841c095

Browse files
authored
Merge pull request #14 from FireTail-io/test-and-refactor
Test and refactor
2 parents 2f72379 + 6dbb75d commit 841c095

32 files changed

+1888
-722
lines changed

agent/http.go

Lines changed: 0 additions & 154 deletions
This file was deleted.

await_shutdown.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"firetail-lambda-extension/extensionsapi"
6+
"log"
7+
8+
"github.com/pkg/errors"
9+
)
10+
11+
// awaitShutdown calls /event/next until a shutdown event is received, or the context is cancelled.
12+
// It returns a reason, or an error, depending upon the cause of the shutdown.
13+
func awaitShutdown(extensionClient *extensionsapi.Client, ctx context.Context) (string, error) {
14+
for {
15+
select {
16+
case <-ctx.Done():
17+
log.Printf(", returning...")
18+
return "context cancelled", nil
19+
default:
20+
log.Printf("Waiting for event...")
21+
res, err := extensionClient.NextEvent(ctx) // This is a blocking call
22+
if err != nil {
23+
return "", errors.WithMessage(err, "failed to get next event")
24+
}
25+
if res.EventType == extensionsapi.Shutdown {
26+
return "received shutdown event", nil
27+
}
28+
}
29+
}
30+
}

await_shutdown_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"firetail-lambda-extension/extensionsapi"
6+
"fmt"
7+
"net/http"
8+
"net/http/httptest"
9+
"strings"
10+
"testing"
11+
"time"
12+
13+
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
15+
)
16+
17+
func getMockExtensionsApiServer() *httptest.Server {
18+
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
19+
fmt.Fprintf(w, `{"eventType": "SHUTDOWN"}`)
20+
}))
21+
}
22+
23+
func TestAwaitShutdownContextCancelled(t *testing.T) {
24+
extensionClient := extensionsapi.NewClient()
25+
26+
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
27+
cancel()
28+
29+
reason, err := awaitShutdown(extensionClient, ctx)
30+
31+
assert.Nil(t, err)
32+
assert.Equal(t, "context cancelled", reason)
33+
}
34+
35+
func TestAwaitShutdownNextEventErrs(t *testing.T) {
36+
extensionClient := extensionsapi.NewClient()
37+
38+
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
39+
40+
reason, err := awaitShutdown(extensionClient, ctx)
41+
42+
require.NotNil(t, err)
43+
assert.Contains(t, err.Error(), "failed to get next event")
44+
assert.Equal(t, "", reason)
45+
46+
cancel()
47+
}
48+
49+
func TestAwaitShutdownShutdownEvent(t *testing.T) {
50+
mockExtensionsApi := getMockExtensionsApiServer()
51+
defer mockExtensionsApi.Close()
52+
53+
t.Setenv("AWS_LAMBDA_RUNTIME_API", strings.Join(strings.Split(mockExtensionsApi.URL, ":")[1:], ":")[2:])
54+
extensionClient := extensionsapi.NewClient()
55+
56+
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
57+
defer cancel()
58+
59+
reason, err := awaitShutdown(extensionClient, ctx)
60+
require.Nil(t, err)
61+
assert.Equal(t, "received shutdown event", reason)
62+
}

context.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log"
6+
"os"
7+
"os/signal"
8+
"syscall"
9+
)
10+
11+
// Returns a context which will be cancelled whenever a SIGTERM or SIGINT signal is received
12+
func getContext() context.Context {
13+
ctx, cancel := context.WithCancel(context.Background())
14+
sigs := make(chan os.Signal, 1)
15+
signal.Notify(sigs, syscall.SIGTERM, syscall.SIGINT)
16+
go func() {
17+
s := <-sigs
18+
log.Printf("Received signal '%s'. Exiting...", s.String())
19+
cancel()
20+
}()
21+
return ctx
22+
}

0 commit comments

Comments
 (0)