From a85587fc9116bbb0dbccfc4e780006cbb1f22c79 Mon Sep 17 00:00:00 2001 From: Jude Hung Date: Tue, 2 Mar 2021 15:56:47 +0800 Subject: [PATCH] feat(data): Implement UnmarshalCBOR for AddEventRequest DTO Per review comment from https://github.com/edgexfoundry/edgex-go/pull/3202/files#r583905762, AddEventRequest DTO shall implement UnmarshalCBOR just like it does for JSON. Signed-off-by: Jude Hung --- v2/dtos/requests/event.go | 16 ++++++++++-- v2/dtos/requests/event_test.go | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/v2/dtos/requests/event.go b/v2/dtos/requests/event.go index 6890cc9d..28153246 100644 --- a/v2/dtos/requests/event.go +++ b/v2/dtos/requests/event.go @@ -13,6 +13,7 @@ import ( "github.com/edgexfoundry/go-mod-core-contracts/v2/v2/dtos" "github.com/edgexfoundry/go-mod-core-contracts/v2/v2/dtos/common" "github.com/edgexfoundry/go-mod-core-contracts/v2/v2/models" + "github.com/fxamacker/cbor/v2" ) // AddEventRequest defines the Request Content for POST event DTO. @@ -49,13 +50,24 @@ func (a AddEventRequest) Validate() error { return nil } +type unmarshal func([]byte, interface{}) error + func (a *AddEventRequest) UnmarshalJSON(b []byte) error { + return a.Unmarshal(b, json.Unmarshal) +} + +func (a *AddEventRequest) UnmarshalCBOR(b []byte) error { + return a.Unmarshal(b, cbor.Unmarshal) +} + +func (a *AddEventRequest) Unmarshal(b []byte, f unmarshal) error { + // To avoid recursively invoke unmarshaler interface, intentionally create a struct to represent AddEventRequest DTO var addEvent struct { common.BaseRequest Event dtos.Event } - if err := json.Unmarshal(b, &addEvent); err != nil { - return errors.NewCommonEdgeX(errors.KindContractInvalid, "Failed to unmarshal request body as JSON.", err) + if err := f(b, &addEvent); err != nil { + return errors.NewCommonEdgeX(errors.KindContractInvalid, "Failed to unmarshal the byte array.", err) } *a = AddEventRequest(addEvent) diff --git a/v2/dtos/requests/event_test.go b/v2/dtos/requests/event_test.go index 5f589e5b..350a0d0e 100644 --- a/v2/dtos/requests/event_test.go +++ b/v2/dtos/requests/event_test.go @@ -14,6 +14,7 @@ import ( "github.com/edgexfoundry/go-mod-core-contracts/v2/v2" "github.com/edgexfoundry/go-mod-core-contracts/v2/v2/dtos" "github.com/edgexfoundry/go-mod-core-contracts/v2/v2/models" + "github.com/fxamacker/cbor/v2" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -234,6 +235,50 @@ func TestAddEvent_UnmarshalJSON(t *testing.T) { } } +func TestAddEvent_UnmarshalCBOR(t *testing.T) { + expected := eventRequestData() + expected.RequestId = ExampleUUID + validData, err := cbor.Marshal(expected) + require.NoError(t, err) + + validValueTypeLowerCase := eventRequestData() + validValueTypeLowerCase.RequestId = ExampleUUID + validValueTypeLowerCase.Event.Readings[0].ValueType = "uint8" + validValueTypeLowerCaseData, err := cbor.Marshal(validValueTypeLowerCase) + require.NoError(t, err) + + validValueTypeUpperCase := eventRequestData() + validValueTypeUpperCase.RequestId = ExampleUUID + validValueTypeUpperCase.Event.Readings[0].ValueType = "UINT8" + validValueTypeUpperCaseData, err := cbor.Marshal(validValueTypeUpperCase) + require.NoError(t, err) + + tests := []struct { + name string + data []byte + wantErr bool + }{ + {"unmarshal AddEventRequest with success", validData, false}, + {"unmarshal AddEventRequest with success, valid value type uint8", validValueTypeLowerCaseData, false}, + {"unmarshal AddEventRequest with success, valid value type UINT8", validValueTypeUpperCaseData, false}, + {"unmarshal invalid AddEventRequest, empty data", []byte{}, true}, + {"unmarshal invalid AddEventRequest, string data", []byte("Invalid AddEventRequest"), true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var addEvent AddEventRequest + err := addEvent.UnmarshalCBOR(tt.data) + if tt.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + assert.Equal(t, expected, addEvent, "Unmarshal did not result in expected AddEventRequest.") + } + }) + } +} + func Test_AddEventReqToEventModels(t *testing.T) { valid := eventRequestData() s := models.SimpleReading{