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 19:44:59 UTC

[plc4x] 01/05: fix(plc4go/spi): test transport instance panics if worked with on disconnected state

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 3c7acbdfa5f310cb1119f7fc029e5aa2ed5744b6
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Jun 16 20:33:44 2023 +0200

    fix(plc4go/spi): test transport instance panics if worked with on disconnected state
---
 plc4go/internal/cbus/Connection_test.go            |  6 +++++
 plc4go/spi/transports/test/TransportInstance.go    | 24 ++++++++++++++++++
 .../spi/transports/test/TransportInstance_test.go  | 29 ++++++++++++++++++++--
 3 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/plc4go/internal/cbus/Connection_test.go b/plc4go/internal/cbus/Connection_test.go
index 42671b3a4b..d0924f7674 100644
--- a/plc4go/internal/cbus/Connection_test.go
+++ b/plc4go/internal/cbus/Connection_test.go
@@ -900,6 +900,7 @@ func TestConnection_sendCalDataWrite(t *testing.T) {
 				ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, nil, _options...)
 				require.NoError(t, err)
 				codec := NewMessageCodec(ti, _options...)
+				require.NoError(t, codec.Connect())
 				t.Cleanup(func() {
 					assert.Error(t, codec.Disconnect())
 				})
@@ -973,6 +974,7 @@ func TestConnection_sendReset(t *testing.T) {
 				ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, nil, _options...)
 				require.NoError(t, err)
 				codec := NewMessageCodec(ti, _options...)
+				require.NoError(t, codec.Connect())
 				t.Cleanup(func() {
 					assert.Error(t, codec.Disconnect())
 				})
@@ -1046,6 +1048,7 @@ func TestConnection_setApplicationFilter(t *testing.T) {
 				ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, nil, _options...)
 				require.NoError(t, err)
 				codec := NewMessageCodec(ti, _options...)
+				require.NoError(t, codec.Connect())
 				t.Cleanup(func() {
 					assert.Error(t, codec.Disconnect())
 				})
@@ -1119,6 +1122,7 @@ func TestConnection_setInterface1PowerUpSettings(t *testing.T) {
 				ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, nil, _options...)
 				require.NoError(t, err)
 				codec := NewMessageCodec(ti, _options...)
+				require.NoError(t, codec.Connect())
 				t.Cleanup(func() {
 					assert.Error(t, codec.Disconnect())
 				})
@@ -1192,6 +1196,7 @@ func TestConnection_setInterfaceOptions1(t *testing.T) {
 				ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, nil, _options...)
 				require.NoError(t, err)
 				codec := NewMessageCodec(ti, _options...)
+				require.NoError(t, codec.Connect())
 				t.Cleanup(func() {
 					assert.Error(t, codec.Disconnect())
 				})
@@ -1265,6 +1270,7 @@ func TestConnection_setInterfaceOptions3(t *testing.T) {
 				ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, nil, _options...)
 				require.NoError(t, err)
 				codec := NewMessageCodec(ti, _options...)
+				require.NoError(t, codec.Connect())
 				t.Cleanup(func() {
 					assert.Error(t, codec.Disconnect())
 				})
diff --git a/plc4go/spi/transports/test/TransportInstance.go b/plc4go/spi/transports/test/TransportInstance.go
index 8a17d4ec8e..972a5f4b8c 100644
--- a/plc4go/spi/transports/test/TransportInstance.go
+++ b/plc4go/spi/transports/test/TransportInstance.go
@@ -88,6 +88,9 @@ func (m *TransportInstance) IsConnected() bool {
 }
 
 func (m *TransportInstance) GetNumBytesAvailableInBuffer() (uint32, error) {
+	if !m.IsConnected() {
+		panic(errors.New("working on a unconnected connection"))
+	}
 	m.dataMutex.RLock()
 	defer m.dataMutex.RUnlock()
 	readableBytes := len(m.readBuffer)
@@ -96,6 +99,9 @@ func (m *TransportInstance) GetNumBytesAvailableInBuffer() (uint32, error) {
 }
 
 func (m *TransportInstance) FillBuffer(until func(pos uint, currentByte byte, reader *bufio.Reader) bool) error {
+	if !m.IsConnected() {
+		panic(errors.New("working on a unconnected connection"))
+	}
 	m.log.Trace().Msg("Fill the buffer")
 	nBytes := uint32(1)
 	for {
@@ -117,6 +123,9 @@ func (m *TransportInstance) FillBuffer(until func(pos uint, currentByte byte, re
 }
 
 func (m *TransportInstance) PeekReadableBytes(numBytes uint32) ([]byte, error) {
+	if !m.IsConnected() {
+		panic(errors.New("working on a unconnected connection"))
+	}
 	m.dataMutex.RLock()
 	defer m.dataMutex.RUnlock()
 	availableBytes := uint32(math.Min(float64(numBytes), float64(len(m.readBuffer))))
@@ -133,6 +142,9 @@ func (m *TransportInstance) PeekReadableBytes(numBytes uint32) ([]byte, error) {
 }
 
 func (m *TransportInstance) Read(numBytes uint32) ([]byte, error) {
+	if !m.IsConnected() {
+		panic(errors.New("working on a unconnected connection"))
+	}
 	m.dataMutex.Lock()
 	defer m.dataMutex.Unlock()
 	nBytes := len(m.readBuffer)
@@ -151,6 +163,9 @@ func (m *TransportInstance) SetWriteInterceptor(writeInterceptor func(transportI
 }
 
 func (m *TransportInstance) Write(data []byte) error {
+	if !m.IsConnected() {
+		panic(errors.New("working on a unconnected connection"))
+	}
 	if m.writeInterceptor != nil {
 		m.log.Trace().Msgf("Passing data to write interceptor\n%s", hex.Dump(data))
 		m.writeInterceptor(m, data)
@@ -163,6 +178,9 @@ func (m *TransportInstance) Write(data []byte) error {
 }
 
 func (m *TransportInstance) FillReadBuffer(data []byte) {
+	if !m.IsConnected() {
+		panic(errors.New("working on a unconnected connection"))
+	}
 	m.dataMutex.Lock()
 	defer m.dataMutex.Unlock()
 	m.log.Trace().Msgf("fill read buffer with \n%s (%d bytes). (Adding to %d bytes existing)", hex.Dump(data), len(data), len(m.readBuffer))
@@ -170,6 +188,9 @@ func (m *TransportInstance) FillReadBuffer(data []byte) {
 }
 
 func (m *TransportInstance) GetNumDrainableBytes() uint32 {
+	if !m.IsConnected() {
+		panic(errors.New("working on a unconnected connection"))
+	}
 	m.dataMutex.RLock()
 	defer m.dataMutex.RUnlock()
 	m.log.Trace().Msg("get number of drainable bytes")
@@ -177,6 +198,9 @@ func (m *TransportInstance) GetNumDrainableBytes() uint32 {
 }
 
 func (m *TransportInstance) DrainWriteBuffer(numBytes uint32) []byte {
+	if !m.IsConnected() {
+		panic(errors.New("working on a unconnected connection"))
+	}
 	m.dataMutex.Lock()
 	defer m.dataMutex.Unlock()
 	m.log.Trace().Msgf("Drain write buffer with number of bytes %d", numBytes)
diff --git a/plc4go/spi/transports/test/TransportInstance_test.go b/plc4go/spi/transports/test/TransportInstance_test.go
index dcb2069032..36fdb95e97 100644
--- a/plc4go/spi/transports/test/TransportInstance_test.go
+++ b/plc4go/spi/transports/test/TransportInstance_test.go
@@ -175,6 +175,9 @@ func TestTransportInstance_DrainWriteBuffer(t *testing.T) {
 	}{
 		{
 			name: "drain it",
+			fields: fields{
+				connected: true,
+			},
 		},
 	}
 	for _, tt := range tests {
@@ -212,6 +215,9 @@ func TestTransportInstance_FillBuffer(t *testing.T) {
 	}{
 		{
 			name: "fill it (errors)",
+			fields: fields{
+				connected: true,
+			},
 			args: args{
 				until: func(pos uint, currentByte byte, reader *bufio.Reader) bool {
 					return pos < 3
@@ -222,6 +228,7 @@ func TestTransportInstance_FillBuffer(t *testing.T) {
 		{
 			name: "fill it",
 			fields: fields{
+				connected:  true,
 				readBuffer: []byte{1, 2, 3, 4},
 			},
 			args: args{
@@ -266,6 +273,7 @@ func TestTransportInstance_FillReadBuffer(t *testing.T) {
 		{
 			name: "fill it",
 			fields: fields{
+				connected:  true,
 				readBuffer: []byte{1, 2, 3, 4},
 			},
 			args: args{
@@ -303,10 +311,14 @@ func TestTransportInstance_GetNumBytesAvailableInBuffer(t *testing.T) {
 	}{
 		{
 			name: "get it",
+			fields: fields{
+				connected: true,
+			},
 		},
 		{
-			name: "get it",
+			name: "get it too",
 			fields: fields{
+				connected:  true,
 				readBuffer: []byte{1, 2, 3, 4},
 			},
 			want: 4,
@@ -348,6 +360,9 @@ func TestTransportInstance_GetNumDrainableBytes(t *testing.T) {
 	}{
 		{
 			name: "get it",
+			fields: fields{
+				connected: true,
+			},
 		},
 	}
 	for _, tt := range tests {
@@ -419,6 +434,9 @@ func TestTransportInstance_PeekReadableBytes(t *testing.T) {
 	}{
 		{
 			name: "peek it",
+			fields: fields{
+				connected: true,
+			},
 		},
 	}
 	for _, tt := range tests {
@@ -461,7 +479,10 @@ func TestTransportInstance_Read(t *testing.T) {
 		wantErr bool
 	}{
 		{
-			name:    "read it",
+			name: "read it",
+			fields: fields{
+				connected: true,
+			},
 			wantErr: true,
 		},
 	}
@@ -573,10 +594,14 @@ func TestTransportInstance_Write(t *testing.T) {
 	}{
 		{
 			name: "write it",
+			fields: fields{
+				connected: true,
+			},
 		},
 		{
 			name: "write it",
 			fields: fields{
+				connected: true,
 				writeInterceptor: func(transportInstance *TransportInstance, data []byte) {
 					assert.NotNil(t, transportInstance)
 					assert.Equal(t, []byte{1, 2, 3, 4}, data)