Skip to content

Commit e996df8

Browse files
Merge pull request #6 from DataDog/darcy.rayner/fix-context-only-handler
Fix support for handler single argument context input
2 parents fd7e673 + df71aed commit e996df8

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

internal/wrapper/wrap_handler.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Unless explicitly stated otherwise all files in this repository are licensed
33
* under the Apache License Version 2.0.
4-
*
4+
*
55
* This product includes software developed at Datadog (https://www.datadoghq.com/).
66
* Copyright 2019 Datadog, Inc.
77
*/
@@ -94,8 +94,15 @@ func callHandler(ctx context.Context, msg json.RawMessage, handler interface{})
9494
args := []reflect.Value{}
9595

9696
if handlerType.NumIn() == 1 {
97-
// When there is only one argument, argument is always the event payload.
98-
args = []reflect.Value{ev.Elem()}
97+
// When there is only one argument, argument is either the event payload, or the context.
98+
contextType := reflect.TypeOf((*context.Context)(nil)).Elem()
99+
firstArgType := handlerType.In(0)
100+
if firstArgType.Implements(contextType) {
101+
args = []reflect.Value{reflect.ValueOf(ctx)}
102+
} else {
103+
args = []reflect.Value{ev.Elem()}
104+
105+
}
99106
} else if handlerType.NumIn() == 2 {
100107
// Or when there are two arguments, context is always first, followed by event payload.
101108
args = []reflect.Value{reflect.ValueOf(ctx), ev.Elem()}
@@ -130,6 +137,13 @@ func unmarshalEventForHandler(ev json.RawMessage, handler interface{}) (reflect.
130137
}
131138

132139
messageType := handlerType.In(handlerType.NumIn() - 1)
140+
contextType := reflect.TypeOf((*context.Context)(nil)).Elem()
141+
firstArgType := handlerType.In(0)
142+
143+
if handlerType.NumIn() == 1 && firstArgType.Implements(contextType) {
144+
return reflect.ValueOf(nil), nil
145+
}
146+
133147
newMessage := reflect.New(messageType)
134148
err := json.Unmarshal(ev, newMessage.Interface())
135149
if err != nil {

internal/wrapper/wrap_handler_test.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Unless explicitly stated otherwise all files in this repository are licensed
33
* under the Apache License Version 2.0.
4-
*
4+
*
55
* This product includes software developed at Datadog (https://www.datadoghq.com/).
66
* Copyright 2019 Datadog, Inc.
77
*/
@@ -177,6 +177,20 @@ func TestWrapHandlerEventArgumentOnly(t *testing.T) {
177177
assert.Equal(t, 5, response)
178178
}
179179

180+
func TestWrapHandlerContextArgumentOnly(t *testing.T) {
181+
called := true
182+
var handler = func(ctx context.Context) (interface{}, error) {
183+
return nil, nil
184+
}
185+
186+
mhl := mockHandlerListener{}
187+
wrappedHandler := WrapHandlerWithListeners(handler, &mhl).(func(context.Context, json.RawMessage) (interface{}, error))
188+
189+
_, err := wrappedHandler(context.Background(), nil)
190+
assert.NoError(t, err)
191+
assert.True(t, called)
192+
}
193+
180194
func TestWrapHandlerNoArguments(t *testing.T) {
181195
called := false
182196

@@ -223,6 +237,22 @@ func TestWrapHandlerReturnsError(t *testing.T) {
223237
assert.Equal(t, 5, response)
224238
}
225239

240+
func TestWrapHandlerReturnsErrorOnly(t *testing.T) {
241+
called := false
242+
defaultErr := errors.New("Some error")
243+
244+
handler := func(request mockNonProxyEvent) error {
245+
called = true
246+
return defaultErr
247+
}
248+
249+
_, response, err := runHandlerWithJSON(t, "../testdata/non-proxy-no-metadata.json", handler)
250+
251+
assert.True(t, called)
252+
assert.Equal(t, defaultErr, err)
253+
assert.Equal(t, nil, response)
254+
}
255+
226256
func TestWrapHandlerReturnsOriginalHandlerIfInvalid(t *testing.T) {
227257

228258
var handler interface{} = func(arg1, arg2, arg3 int) (int, error) {

0 commit comments

Comments
 (0)