Skip to content

Commit

Permalink
feat(plc4go/test): add write interceptor to test transport instance
Browse files Browse the repository at this point in the history
useful for using test transport instance as a mock
  • Loading branch information
sruehl committed Apr 11, 2023
1 parent 1ad4fc7 commit 8a7edba
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 22 deletions.
16 changes: 8 additions & 8 deletions plc4go/spi/transports/TransportInstance.go
Expand Up @@ -36,10 +36,10 @@ type TransportInstance interface {
FillBuffer(until func(pos uint, currentByte byte, reader *bufio.Reader) bool) error
// GetNumBytesAvailableInBuffer returns the bytes currently available in buffer (!!!Careful: if you looking for a termination you have to use FillBuffer)
GetNumBytesAvailableInBuffer() (uint32, error)
PeekReadableBytes(numBytes uint32) ([]uint8, error)
Read(numBytes uint32) ([]uint8, error)
PeekReadableBytes(numBytes uint32) ([]byte, error)
Read(numBytes uint32) ([]byte, error)

Write(data []uint8) error
Write(data []byte) error
}

type DefaultBufferedTransportInstanceRequirements interface {
Expand All @@ -51,8 +51,8 @@ type DefaultBufferedTransportInstance interface {
ConnectWithContext(ctx context.Context) error
GetNumBytesAvailableInBuffer() (uint32, error)
FillBuffer(until func(pos uint, currentByte byte, reader *bufio.Reader) bool) error
PeekReadableBytes(numBytes uint32) ([]uint8, error)
Read(numBytes uint32) ([]uint8, error)
PeekReadableBytes(numBytes uint32) ([]byte, error)
Read(numBytes uint32) ([]byte, error)
}

func NewDefaultBufferedTransportInstance(defaultBufferedTransportInstanceRequirements DefaultBufferedTransportInstanceRequirements) DefaultBufferedTransportInstance {
Expand Down Expand Up @@ -103,18 +103,18 @@ func (m *defaultBufferedTransportInstance) FillBuffer(until func(pos uint, curre
}
}

func (m *defaultBufferedTransportInstance) PeekReadableBytes(numBytes uint32) ([]uint8, error) {
func (m *defaultBufferedTransportInstance) PeekReadableBytes(numBytes uint32) ([]byte, error) {
if m.GetReader() == nil {
return nil, errors.New("error peeking from transport. No reader available")
}
return m.GetReader().Peek(int(numBytes))
}

func (m *defaultBufferedTransportInstance) Read(numBytes uint32) ([]uint8, error) {
func (m *defaultBufferedTransportInstance) Read(numBytes uint32) ([]byte, error) {
if m.GetReader() == nil {
return nil, errors.New("error reading from transport. No reader available")
}
data := make([]uint8, numBytes)
data := make([]byte, numBytes)
for i := uint32(0); i < numBytes; i++ {
val, err := m.GetReader().ReadByte()
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion plc4go/spi/transports/pcap/Transport.go
Expand Up @@ -191,7 +191,7 @@ func (m *TransportInstance) IsConnected() bool {
return m.connected
}

func (m *TransportInstance) Write(_ []uint8) error {
func (m *TransportInstance) Write(_ []byte) error {
panic("Write to pcap not supported")
}

Expand Down
2 changes: 1 addition & 1 deletion plc4go/spi/transports/serial/Transport.go
Expand Up @@ -138,7 +138,7 @@ func (m *TransportInstance) IsConnected() bool {
return m.serialPort != nil
}

func (m *TransportInstance) Write(data []uint8) error {
func (m *TransportInstance) Write(data []byte) error {
if m.serialPort == nil {
return errors.New("error writing to transport. No writer available")
}
Expand Down
2 changes: 1 addition & 1 deletion plc4go/spi/transports/tcp/Transport.go
Expand Up @@ -154,7 +154,7 @@ func (m *TransportInstance) IsConnected() bool {
return m.tcpConn != nil
}

func (m *TransportInstance) Write(data []uint8) error {
func (m *TransportInstance) Write(data []byte) error {
if m.tcpConn == nil {
return errors.New("error writing to transport. No writer available")
}
Expand Down
22 changes: 15 additions & 7 deletions plc4go/spi/transports/test/Transport.go
Expand Up @@ -68,10 +68,11 @@ func (m *Transport) String() string {
}

type TransportInstance struct {
readBuffer []byte
writeBuffer []byte
connected bool
transport *Transport
readBuffer []byte
writeBuffer []byte
connected bool
transport *Transport
writeInterceptor func(transportInstance *TransportInstance, data []byte)
}

func NewTransportInstance(transport *Transport) *TransportInstance {
Expand Down Expand Up @@ -123,7 +124,7 @@ func (m *TransportInstance) FillBuffer(until func(pos uint, currentByte byte, re
}
}

func (m *TransportInstance) PeekReadableBytes(numBytes uint32) ([]uint8, error) {
func (m *TransportInstance) PeekReadableBytes(numBytes uint32) ([]byte, error) {
log.Trace().Msgf("Peek %d readable bytes", numBytes)
availableBytes := uint32(math.Min(float64(numBytes), float64(len(m.readBuffer))))
var err error
Expand All @@ -136,14 +137,21 @@ func (m *TransportInstance) PeekReadableBytes(numBytes uint32) ([]uint8, error)
return m.readBuffer[0:availableBytes], nil
}

func (m *TransportInstance) Read(numBytes uint32) ([]uint8, error) {
func (m *TransportInstance) Read(numBytes uint32) ([]byte, error) {
log.Trace().Msgf("Read num bytes %d", numBytes)
data := m.readBuffer[0:int(numBytes)]
m.readBuffer = m.readBuffer[int(numBytes):]
return data, nil
}

func (m *TransportInstance) Write(data []uint8) error {
func (m *TransportInstance) SetWriteInterceptor(writeInterceptor func(transportInstance *TransportInstance, data []byte)) {
m.writeInterceptor = writeInterceptor
}

func (m *TransportInstance) Write(data []byte) error {
if m.writeInterceptor != nil {
m.writeInterceptor(m, data)
}
log.Trace().Msgf("Write data 0x%x", data)
m.writeBuffer = append(m.writeBuffer, data...)
return nil
Expand Down
8 changes: 4 additions & 4 deletions plc4go/spi/transports/udp/Transport.go
Expand Up @@ -223,18 +223,18 @@ func (m *TransportInstance) FillBuffer(until func(pos uint, currentByte byte, re
}
}

func (m *TransportInstance) PeekReadableBytes(numBytes uint32) ([]uint8, error) {
func (m *TransportInstance) PeekReadableBytes(numBytes uint32) ([]byte, error) {
if m.reader == nil {
return nil, errors.New("error peeking from transport. No reader available")
}
return m.reader.Peek(int(numBytes))
}

func (m *TransportInstance) Read(numBytes uint32) ([]uint8, error) {
func (m *TransportInstance) Read(numBytes uint32) ([]byte, error) {
if m.reader == nil {
return nil, errors.New("error reading from transport. No reader available")
}
data := make([]uint8, numBytes)
data := make([]byte, numBytes)
for i := uint32(0); i < numBytes; i++ {
val, err := m.reader.ReadByte()
if err != nil {
Expand All @@ -245,7 +245,7 @@ func (m *TransportInstance) Read(numBytes uint32) ([]uint8, error) {
return data, nil
}

func (m *TransportInstance) Write(data []uint8) error {
func (m *TransportInstance) Write(data []byte) error {
if m.udpConn == nil {
return errors.New("error writing to transport. No writer available")
}
Expand Down

0 comments on commit 8a7edba

Please sign in to comment.