You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2023/06/16 16:46:24 UTC

[plc4x] 07/07: fix(plc4go/cbus): fix error when reader doesn't get a alpha capable response

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 bf275e23d1f043f70ff8328d320eb40d1ebd0180
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Jun 16 18:43:53 2023 +0200

    fix(plc4go/cbus): fix error when reader doesn't get a alpha capable response
---
 plc4go/internal/cbus/Reader.go      | 15 ++++++---
 plc4go/internal/cbus/Reader_test.go | 67 ++++++++-----------------------------
 2 files changed, 25 insertions(+), 57 deletions(-)

diff --git a/plc4go/internal/cbus/Reader.go b/plc4go/internal/cbus/Reader.go
index 3a7063cb8f..55015da183 100644
--- a/plc4go/internal/cbus/Reader.go
+++ b/plc4go/internal/cbus/Reader.go
@@ -139,14 +139,16 @@ func (m *Reader) createMessageTransactionAndWait(ctx context.Context, messageToS
 func (m *Reader) sendMessageOverTheWire(ctx context.Context, transaction transactions.RequestTransaction, messageToSend readWriteModel.CBusMessage, addResponseCode func(name string, responseCode apiModel.PlcResponseCode), tagName string, addPlcValue func(name string, plcValue apiValues.PlcValue)) {
 	// Send the over the wire
 	m.log.Trace().Msg("send over the wire")
+	ttl := time.Second * 5
 	if deadline, ok := ctx.Deadline(); ok {
-		m.log.Debug().Msgf("Message expires in %s", deadline.Sub(time.Now()))
+		ttl = -time.Since(deadline)
+		m.log.Debug().Msgf("setting ttl to %s", ttl)
 	}
 	if err := m.messageCodec.SendRequest(
 		ctx,
 		messageToSend,
 		func(cbusMessage spi.Message) bool {
-			m.log.Trace().Msgf("Checking\n%T", cbusMessage)
+			m.log.Trace().Msgf("Checking %T", cbusMessage)
 			messageToClient, ok := cbusMessage.(readWriteModel.CBusMessageToClientExactly)
 			if !ok {
 				m.log.Trace().Msg("Not a message to client")
@@ -166,7 +168,12 @@ func (m *Reader) sendMessageOverTheWire(ctx context.Context, transaction transac
 			}
 			actualAlpha := confirmation.GetConfirmation().GetAlpha().GetCharacter()
 			// TODO: assert that this is a CBusMessageToServer indeed (by changing param for example)
-			expectedAlpha := messageToSend.(readWriteModel.CBusMessageToServer).GetRequest().(interface{ GetAlpha() readWriteModel.Alpha }).GetAlpha().GetCharacter()
+			alphaRetriever, ok := messageToSend.(readWriteModel.CBusMessageToServer).GetRequest().(interface{ GetAlpha() readWriteModel.Alpha })
+			if !ok {
+				m.log.Trace().Msg("no alpha there")
+				return false
+			}
+			expectedAlpha := alphaRetriever.GetAlpha().GetCharacter()
 			m.log.Trace().Msgf("Comparing expected alpha '%c' to actual alpha '%c'", expectedAlpha, actualAlpha)
 			return actualAlpha == expectedAlpha
 		},
@@ -223,7 +230,7 @@ func (m *Reader) sendMessageOverTheWire(ctx context.Context, transaction transac
 			addResponseCode(tagName, apiModel.PlcResponseCode_INTERNAL_ERROR)
 			return transaction.FailRequest(err)
 		},
-		time.Second*5); err != nil {
+		ttl); err != nil {
 		m.log.Debug().Err(err).Msgf("Error sending message for tag %s", tagName)
 		addResponseCode(tagName, apiModel.PlcResponseCode_INTERNAL_ERROR)
 		if err := transaction.FailRequest(errors.Errorf("timeout after %s", time.Second*1)); err != nil {
diff --git a/plc4go/internal/cbus/Reader_test.go b/plc4go/internal/cbus/Reader_test.go
index cc017ac3a0..e66c1d7534 100644
--- a/plc4go/internal/cbus/Reader_test.go
+++ b/plc4go/internal/cbus/Reader_test.go
@@ -234,11 +234,7 @@ func TestReader_readSync(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				readRequest: spiModel.NewDefaultPlcReadRequest(
 					map[string]apiModel.PlcTag{
 						"blub": NewCALIdentifyTag(readWriteModel.NewUnitAddress(2), nil, readWriteModel.Attribute_Type, 1),
@@ -397,11 +393,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx:           testutils.TestContext(t),
 				messageToSend: nil,
 				addResponseCode: func(t *testing.T) func(name string, responseCode apiModel.PlcResponseCode) {
 					return func(name string, responseCode apiModel.PlcResponseCode) {
@@ -440,16 +432,12 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 			},
 		},
 		{
-			name: "Send message which responds with message to client",
+			name: "Send message which responds with message to server",
 			fields: fields{
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				messageToSend: readWriteModel.NewCBusMessageToServer(
 					readWriteModel.NewRequestReset(
 						readWriteModel.RequestType_RESET,
@@ -470,7 +458,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 					return func(name string, responseCode apiModel.PlcResponseCode) {
 						t.Logf("Got response code %s for %s", responseCode, name)
 						assert.Equal(t, "horst", name)
-						assert.Equal(t, apiModel.PlcResponseCode_REQUEST_TIMEOUT, responseCode)
+						assert.Equal(t, apiModel.PlcResponseCode_INTERNAL_ERROR, responseCode)
 					}
 				},
 				tagName: "horst",
@@ -527,11 +515,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				messageToSend: readWriteModel.NewCBusMessageToServer(
 					readWriteModel.NewRequestReset(
 						readWriteModel.RequestType_RESET,
@@ -610,11 +594,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				messageToSend: readWriteModel.NewCBusMessageToServer(
 					readWriteModel.NewRequestDirectCommandAccess(
 						readWriteModel.NewCALDataIdentify(
@@ -695,11 +675,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				messageToSend: readWriteModel.NewCBusMessageToServer(
 					readWriteModel.NewRequestDirectCommandAccess(
 						readWriteModel.NewCALDataIdentify(
@@ -780,11 +756,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				messageToSend: readWriteModel.NewCBusMessageToServer(
 					readWriteModel.NewRequestDirectCommandAccess(
 						readWriteModel.NewCALDataIdentify(
@@ -865,11 +837,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				messageToSend: readWriteModel.NewCBusMessageToServer(
 					readWriteModel.NewRequestDirectCommandAccess(
 						readWriteModel.NewCALDataIdentify(
@@ -950,11 +918,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				messageToSend: readWriteModel.NewCBusMessageToServer(
 					readWriteModel.NewRequestDirectCommandAccess(
 						readWriteModel.NewCALDataIdentify(
@@ -1035,11 +999,7 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: &AlphaGenerator{currentAlpha: 'g'},
 			},
 			args: args{
-				ctx: func() context.Context {
-					timeout, cancel := context.WithTimeout(context.Background(), 2*time.Second)
-					t.Cleanup(cancel)
-					return timeout
-				}(),
+				ctx: testutils.TestContext(t),
 				messageToSend: readWriteModel.NewCBusMessageToServer(
 					readWriteModel.NewRequestDirectCommandAccess(
 						readWriteModel.NewCALDataIdentify(
@@ -1125,10 +1085,11 @@ func TestReader_sendMessageOverTheWire(t *testing.T) {
 				alphaGenerator: tt.fields.alphaGenerator,
 				messageCodec:   tt.fields.messageCodec,
 				tm:             tt.fields.tm,
+				log:            testutils.ProduceTestingLogger(t),
 			}
 			m.sendMessageOverTheWire(tt.args.ctx, tt.args.transaction, tt.args.messageToSend, tt.args.addResponseCode(t), tt.args.tagName, tt.args.addPlcValue(t))
 			t.Log("Waiting now")
-			timer := time.NewTimer(3 * time.Second)
+			timer := time.NewTimer(10 * time.Second)
 			defer utils.CleanupTimer(timer)
 			select {
 			case <-ch: