This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 60955cc3ce89b534fb6247542740d75bae9e1b98 Author: Sebastian Rühl <[email protected]> AuthorDate: Wed Apr 5 11:55:39 2023 +0200 test(plc4go/cbus): improved test for MessageCodec --- plc4go/internal/cbus/MessageCodec.go | 5 +- plc4go/internal/cbus/MessageCodec_test.go | 443 +++++++++++++++++++++++++++++- 2 files changed, 444 insertions(+), 4 deletions(-) diff --git a/plc4go/internal/cbus/MessageCodec.go b/plc4go/internal/cbus/MessageCodec.go index 66568ec09b..b04e14334b 100644 --- a/plc4go/internal/cbus/MessageCodec.go +++ b/plc4go/internal/cbus/MessageCodec.go @@ -63,7 +63,10 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec { func (m *MessageCodec) Send(message spi.Message) error { log.Trace().Msg("Sending message") // Cast the message to the correct type of struct - cbusMessage := message.(readWriteModel.CBusMessage) + cbusMessage, ok := message.(readWriteModel.CBusMessage) + if !ok { + return errors.Errorf("Invalid message type %T", message) + } // Set the right request context m.requestContext = CreateRequestContext(cbusMessage) diff --git a/plc4go/internal/cbus/MessageCodec_test.go b/plc4go/internal/cbus/MessageCodec_test.go index 6d07340b16..dcec75f184 100644 --- a/plc4go/internal/cbus/MessageCodec_test.go +++ b/plc4go/internal/cbus/MessageCodec_test.go @@ -50,7 +50,22 @@ func TestMessageCodec_Send(t *testing.T) { args args wantErr assert.ErrorAssertionFunc }{ - // TODO: Add test cases. + { + name: "send nothing", + wantErr: assert.Error, + }, + { + name: "a cbus message", + fields: fields{ + DefaultCodec: NewMessageCodec(test.NewTransportInstance(test.NewTransport())), + }, + args: args{message: readWriteModel.NewCBusMessageToClient( + readWriteModel.NewReplyOrConfirmationConfirmation( + readWriteModel.NewConfirmation(readWriteModel.NewAlpha('!'), nil, readWriteModel.ConfirmationType_CHECKSUM_FAILURE), nil, 0x00, nil, nil, + ), nil, nil, + )}, + wantErr: assert.NoError, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -70,6 +85,9 @@ func TestMessageCodec_Send(t *testing.T) { } func TestMessageCodec_Receive(t *testing.T) { + requestContext := readWriteModel.NewRequestContext(false) + cbusOptions := readWriteModel.NewCBusOptions(false, false, false, false, false, false, false, false, false) + type fields struct { DefaultCodec _default.DefaultCodec requestContext readWriteModel.RequestContext @@ -94,8 +112,8 @@ func TestMessageCodec_Receive(t *testing.T) { transportInstance := test.NewTransportInstance(transport) return transportInstance }()), - requestContext: nil, - cbusOptions: nil, + requestContext: requestContext, + cbusOptions: cbusOptions, monitoredMMIs: nil, monitoredSALs: nil, lastPackageHash: 0, @@ -104,6 +122,420 @@ func TestMessageCodec_Receive(t *testing.T) { }, wantErr: assert.Error, }, + { + name: "checksum error", + fields: fields{ + DefaultCodec: NewMessageCodec(func() transports.TransportInstance { + transport := test.NewTransport() + transportInstance := test.NewTransportInstance(transport) + if err := transportInstance.FillReadBuffer([]byte("!")); err != nil { + t.Error(err) + return nil + } + return transportInstance + }()), + requestContext: requestContext, + cbusOptions: cbusOptions, + monitoredMMIs: nil, + monitoredSALs: nil, + lastPackageHash: 0, + hashEncountered: 0, + currentlyReportedServerErrors: 0, + }, + want: readWriteModel.NewCBusMessageToClient( + readWriteModel.NewServerErrorReply( + 33, cbusOptions, requestContext, + ), + requestContext, cbusOptions, + ), + wantErr: assert.NoError, + }, + { + name: "A21 echo", + fields: fields{ + DefaultCodec: NewMessageCodec(func() transports.TransportInstance { + transport := test.NewTransport() + transportInstance := test.NewTransportInstance(transport) + if err := transportInstance.FillReadBuffer([]byte("@A62120\r@A62120\r")); err != nil { + t.Error(err) + return nil + } + return transportInstance + }()), + requestContext: requestContext, + cbusOptions: cbusOptions, + monitoredMMIs: nil, + monitoredSALs: nil, + lastPackageHash: 0, + hashEncountered: 0, + currentlyReportedServerErrors: 0, + }, + wantErr: assert.NoError, + }, + { + name: "garbage", + fields: fields{ + DefaultCodec: NewMessageCodec(func() transports.TransportInstance { + transport := test.NewTransport() + transportInstance := test.NewTransportInstance(transport) + if err := transportInstance.FillReadBuffer([]byte("what on earth\n\r")); err != nil { + t.Error(err) + return nil + } + return transportInstance + }()), + requestContext: requestContext, + cbusOptions: cbusOptions, + monitoredMMIs: nil, + monitoredSALs: nil, + lastPackageHash: 0, + hashEncountered: 0, + currentlyReportedServerErrors: 0, + }, + wantErr: assert.NoError, + }, + { + name: "error encountered multiple time", + fields: fields{ + DefaultCodec: NewMessageCodec(func() transports.TransportInstance { + transport := test.NewTransport() + transportInstance := test.NewTransportInstance(transport) + if err := transportInstance.FillReadBuffer([]byte("AFFE!!!\r")); err != nil { + t.Error(err) + return nil + } + return transportInstance + }()), + requestContext: requestContext, + cbusOptions: cbusOptions, + monitoredMMIs: nil, + monitoredSALs: nil, + lastPackageHash: 0, + hashEncountered: 9999, + currentlyReportedServerErrors: 0, + }, + want: readWriteModel.NewCBusMessageToClient( + readWriteModel.NewServerErrorReply( + 33, cbusOptions, requestContext, + ), + requestContext, cbusOptions, + ), + wantErr: assert.NoError, + }, + { + name: "error encountered and reported multiple time", + fields: fields{ + DefaultCodec: NewMessageCodec(func() transports.TransportInstance { + transport := test.NewTransport() + transportInstance := test.NewTransportInstance(transport) + if err := transportInstance.FillReadBuffer([]byte("@1A2001!!!\r")); err != nil { + t.Error(err) + return nil + } + return transportInstance + }()), + requestContext: requestContext, + cbusOptions: cbusOptions, + monitoredMMIs: nil, + monitoredSALs: nil, + lastPackageHash: 0, + hashEncountered: 9999, + currentlyReportedServerErrors: 9999, + }, + want: readWriteModel.NewCBusMessageToServer( + readWriteModel.NewRequestDirectCommandAccess( + readWriteModel.NewCALDataRecall( + readWriteModel.Parameter_UNKNOWN_33, + 1, + readWriteModel.CALCommandTypeContainer_CALCommandRecall, + nil, + nil, + ), + nil, + readWriteModel.RequestType_DIRECT_COMMAND, + nil, + nil, + 64, + readWriteModel.NewRequestTermination(), + cbusOptions, + ), + requestContext, cbusOptions, + ), + wantErr: assert.NoError, + }, + { + name: "mmi", + fields: fields{ + DefaultCodec: NewMessageCodec(func() transports.TransportInstance { + transport := test.NewTransport() + transportInstance := test.NewTransportInstance(transport) + if err := transportInstance.FillReadBuffer([]byte("86040200F940380001000000000000000008000000000000000000000000FA\r\n")); err != nil { + t.Error(err) + return nil + } + return transportInstance + }()), + requestContext: requestContext, + cbusOptions: cbusOptions, + monitoredMMIs: nil, + monitoredSALs: nil, + lastPackageHash: 0, + hashEncountered: 9999, + currentlyReportedServerErrors: 9999, + }, + want: readWriteModel.NewCBusMessageToClient( + readWriteModel.NewReplyOrConfirmationReply( + readWriteModel.NewReplyEncodedReply( + readWriteModel.NewEncodedReplyCALReply( + readWriteModel.NewCALReplyLong( + 262656, + readWriteModel.NewUnitAddress(4), + nil, + readWriteModel.NewSerialInterfaceAddress(2), + func() *byte { + var b byte = 0 + return &b + }(), + nil, + 134, + readWriteModel.NewCALDataStatusExtended( + 64, + 56, + 0, + []readWriteModel.StatusByte{ + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_ON, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_OFF, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + readWriteModel.NewStatusByte( + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + readWriteModel.GAVState_DOES_NOT_EXIST, + ), + }, + nil, + 249, + nil, + requestContext, + ), + cbusOptions, + requestContext, + ), + 134, + cbusOptions, + requestContext, + ), + nil, + 56, + cbusOptions, + requestContext, + ), + readWriteModel.NewResponseTermination(), + 56, + cbusOptions, + requestContext, + ), + requestContext, cbusOptions, + ), + wantErr: assert.NoError, + }, + { + name: "sal", + fields: fields{ + DefaultCodec: NewMessageCodec(func() transports.TransportInstance { + transport := test.NewTransport() + transportInstance := test.NewTransportInstance(transport) + if err := transportInstance.FillReadBuffer([]byte("0531AC0079042F0401430316000011\r\n")); err != nil { + t.Error(err) + return nil + } + return transportInstance + }()), + requestContext: requestContext, + cbusOptions: cbusOptions, + monitoredMMIs: nil, + monitoredSALs: nil, + lastPackageHash: 0, + hashEncountered: 9999, + currentlyReportedServerErrors: 9999, + }, + want: readWriteModel.NewCBusMessageToClient( + readWriteModel.NewReplyOrConfirmationReply( + readWriteModel.NewReplyEncodedReply( + readWriteModel.NewMonitoredSALReply( + readWriteModel.NewMonitoredSALLongFormSmartMode( + 3255296, + readWriteModel.NewUnitAddress(49), + nil, + 172, + func() *byte { + var b byte = 0 + return &b + }(), + nil, + readWriteModel.NewSALDataAirConditioning( + readWriteModel.NewAirConditioningDataSetZoneGroupOn( + 4, + readWriteModel.AirConditioningCommandTypeContainer_AirConditioningCommandSetZoneGroupOn, + ), + readWriteModel.NewSALDataAirConditioning( + readWriteModel.NewAirConditioningDataSetZoneHvacMode( + 4, + readWriteModel.NewHVACZoneList(false, false, false, false, false, false, false, true), + readWriteModel.NewHVACModeAndFlags(true, false, false, false, readWriteModel.HVACModeAndFlagsMode_HEAT_AND_COOL), + 3, + readWriteModel.NewHVACTemperature(5632), + nil, + readWriteModel.NewHVACAuxiliaryLevel(false, 0), + readWriteModel.AirConditioningCommandTypeContainer_AirConditioningCommandSetZoneHvacMode, + ), + nil, + ), + ), + 5, + cbusOptions, + ), + 5, + cbusOptions, + requestContext, + ), + nil, + 48, + cbusOptions, + requestContext, + ), + readWriteModel.NewResponseTermination(), + 48, + cbusOptions, + requestContext, + ), + requestContext, cbusOptions, + ), + wantErr: assert.NoError, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -262,6 +694,11 @@ func TestNewMessageCodec(t *testing.T) { } } +func TestMessageCodec_GetCodec(t *testing.T) { + // just a useless test... + (&MessageCodec{}).GetCodec() +} + func Test_extractMMIAndSAL(t *testing.T) { type args struct { codec _default.DefaultCodecRequirements
