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)