2024-02-04 18:50:43 +01:00
|
|
|
package serialport
|
2014-04-26 03:11:51 -07:00
|
|
|
|
|
|
|
import (
|
2014-12-17 14:32:12 -08:00
|
|
|
"errors"
|
2014-12-23 07:00:23 -08:00
|
|
|
"io"
|
2017-02-02 16:46:25 +01:00
|
|
|
"strings"
|
2014-06-13 14:26:18 -07:00
|
|
|
"testing"
|
2014-11-28 18:21:02 -08:00
|
|
|
|
2023-10-20 10:27:09 +02:00
|
|
|
"github.com/stretchr/testify/assert"
|
2023-11-12 14:17:02 +01:00
|
|
|
"github.com/stretchr/testify/require"
|
2023-11-15 20:51:52 +01:00
|
|
|
|
2023-05-20 14:25:21 +02:00
|
|
|
"gobot.io/x/gobot/v2"
|
2014-04-26 03:11:51 -07:00
|
|
|
)
|
|
|
|
|
2016-10-01 18:52:58 +02:00
|
|
|
var _ gobot.Adaptor = (*Adaptor)(nil)
|
2016-08-27 11:56:01 +02:00
|
|
|
|
2024-02-12 16:27:08 +01:00
|
|
|
func initTestAdaptor() (*Adaptor, *nullReadWriteCloser) {
|
|
|
|
a := NewAdaptor("/dev/null")
|
|
|
|
rwc := newNullReadWriteCloser()
|
2014-12-17 14:32:12 -08:00
|
|
|
|
2024-02-12 16:27:08 +01:00
|
|
|
a.connectFunc = func(string, int) (io.ReadWriteCloser, error) {
|
|
|
|
return rwc, nil
|
|
|
|
}
|
2014-12-17 14:32:12 -08:00
|
|
|
|
2024-02-12 16:27:08 +01:00
|
|
|
if err := a.Connect(); err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
return a, rwc
|
2014-12-17 14:32:12 -08:00
|
|
|
}
|
|
|
|
|
2024-02-12 16:27:08 +01:00
|
|
|
func TestNewAdaptor(t *testing.T) {
|
|
|
|
// arrange
|
|
|
|
a := NewAdaptor("/dev/null")
|
|
|
|
assert.Equal(t, "/dev/null", a.Port())
|
|
|
|
require.NotNil(t, a.cfg)
|
|
|
|
assert.Equal(t, 115200, a.cfg.baudRate)
|
|
|
|
assert.True(t, strings.HasPrefix(a.Name(), "Serial"))
|
2014-12-17 14:32:12 -08:00
|
|
|
}
|
|
|
|
|
2024-02-12 16:27:08 +01:00
|
|
|
func TestSerialRead(t *testing.T) {
|
|
|
|
tests := map[string]struct {
|
|
|
|
readDataBuffer []byte
|
|
|
|
simReadErr bool
|
|
|
|
wantCount int
|
|
|
|
wantErr string
|
|
|
|
}{
|
|
|
|
"read_ok": {
|
|
|
|
readDataBuffer: []byte{0, 0},
|
|
|
|
wantCount: 2,
|
2017-04-02 23:50:07 +02:00
|
|
|
},
|
2024-02-12 16:27:08 +01:00
|
|
|
"error_read": {
|
|
|
|
readDataBuffer: []byte{},
|
|
|
|
simReadErr: true,
|
|
|
|
wantErr: "read error",
|
2017-04-02 23:50:07 +02:00
|
|
|
},
|
|
|
|
}
|
2024-02-12 16:27:08 +01:00
|
|
|
for name, tc := range tests {
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
// arrange
|
|
|
|
a, rwc := initTestAdaptor()
|
|
|
|
rwc.simulateReadErr = tc.simReadErr
|
|
|
|
// act
|
|
|
|
gotCount, err := a.SerialRead(tc.readDataBuffer)
|
|
|
|
// assert
|
|
|
|
if tc.wantErr == "" {
|
|
|
|
require.NoError(t, err)
|
|
|
|
} else {
|
|
|
|
require.EqualError(t, err, tc.wantErr)
|
|
|
|
}
|
|
|
|
assert.Equal(t, tc.wantCount, gotCount)
|
|
|
|
})
|
2014-12-23 07:00:23 -08:00
|
|
|
}
|
2014-06-13 14:26:18 -07:00
|
|
|
}
|
2014-04-26 03:11:51 -07:00
|
|
|
|
2024-02-12 16:27:08 +01:00
|
|
|
func TestSerialWrite(t *testing.T) {
|
|
|
|
tests := map[string]struct {
|
|
|
|
writeDataBuffer []byte
|
|
|
|
simWriteErr bool
|
|
|
|
wantCount int
|
|
|
|
wantWritten []byte
|
|
|
|
wantErr string
|
|
|
|
}{
|
|
|
|
"write_ok": {
|
|
|
|
writeDataBuffer: []byte{1, 3, 6},
|
|
|
|
wantWritten: []byte{1, 3, 6},
|
|
|
|
wantCount: 3,
|
|
|
|
},
|
|
|
|
"error_write": {
|
|
|
|
writeDataBuffer: []byte{},
|
|
|
|
simWriteErr: true,
|
|
|
|
wantErr: "write error",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for name, tc := range tests {
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
// arrange
|
|
|
|
a, rwc := initTestAdaptor()
|
|
|
|
rwc.simulateWriteErr = tc.simWriteErr
|
|
|
|
// act
|
|
|
|
gotCount, err := a.SerialWrite(tc.writeDataBuffer)
|
|
|
|
// assert
|
|
|
|
if tc.wantErr == "" {
|
|
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, tc.wantWritten, rwc.written)
|
|
|
|
} else {
|
|
|
|
require.EqualError(t, err, tc.wantErr)
|
|
|
|
}
|
|
|
|
assert.Equal(t, tc.wantCount, gotCount)
|
|
|
|
})
|
|
|
|
}
|
2017-04-06 11:16:48 +02:00
|
|
|
}
|
|
|
|
|
2024-02-12 16:27:08 +01:00
|
|
|
func TestConnect(t *testing.T) {
|
|
|
|
// arrange
|
2024-02-10 18:02:09 +01:00
|
|
|
a, _ := initTestAdaptor()
|
2024-02-12 16:27:08 +01:00
|
|
|
require.True(t, a.IsConnected())
|
|
|
|
// act & assert
|
|
|
|
require.EqualError(t, a.Connect(), "serial port is already connected, try reconnect or run disconnect first")
|
|
|
|
// re-arrange error
|
2024-02-12 17:55:26 +01:00
|
|
|
a.sp = nil
|
2024-02-12 16:27:08 +01:00
|
|
|
a.connectFunc = func(string, int) (io.ReadWriteCloser, error) {
|
|
|
|
return nil, errors.New("connect error")
|
|
|
|
}
|
|
|
|
// act & assert
|
|
|
|
require.ErrorContains(t, a.Connect(), "connect error")
|
|
|
|
assert.False(t, a.IsConnected())
|
2014-12-17 14:32:12 -08:00
|
|
|
}
|
|
|
|
|
2024-02-10 18:02:09 +01:00
|
|
|
func TestReconnect(t *testing.T) {
|
2024-02-12 16:27:08 +01:00
|
|
|
// arrange
|
2024-02-10 18:02:09 +01:00
|
|
|
a, _ := initTestAdaptor()
|
2024-02-12 17:55:26 +01:00
|
|
|
require.NotNil(t, a.sp)
|
2024-02-12 16:27:08 +01:00
|
|
|
// act & assert
|
2024-02-10 18:02:09 +01:00
|
|
|
require.NoError(t, a.Reconnect())
|
2024-02-12 17:55:26 +01:00
|
|
|
require.NotNil(t, a.sp)
|
2024-02-12 16:27:08 +01:00
|
|
|
// act & assert
|
2024-02-10 18:02:09 +01:00
|
|
|
require.NoError(t, a.Disconnect())
|
2024-02-12 17:55:26 +01:00
|
|
|
require.Nil(t, a.sp)
|
2024-02-12 16:27:08 +01:00
|
|
|
// act & assert
|
2024-02-10 18:02:09 +01:00
|
|
|
require.NoError(t, a.Reconnect())
|
2024-02-12 17:55:26 +01:00
|
|
|
require.NotNil(t, a.sp)
|
2014-12-17 14:32:12 -08:00
|
|
|
}
|
|
|
|
|
2024-02-10 18:02:09 +01:00
|
|
|
func TestFinalize(t *testing.T) {
|
2024-02-12 16:27:08 +01:00
|
|
|
// arrange
|
2024-02-10 18:02:09 +01:00
|
|
|
a, rwc := initTestAdaptor()
|
2024-02-12 16:27:08 +01:00
|
|
|
// act & assert
|
2023-11-12 14:17:02 +01:00
|
|
|
require.NoError(t, a.Finalize())
|
2024-02-12 16:27:08 +01:00
|
|
|
assert.False(t, a.IsConnected())
|
|
|
|
// re-arrange error
|
|
|
|
rwc.simulateCloseErr = true
|
2024-02-12 17:55:26 +01:00
|
|
|
require.NoError(t, a.Connect())
|
2024-02-12 16:27:08 +01:00
|
|
|
// act & assert
|
2023-11-12 14:17:02 +01:00
|
|
|
require.ErrorContains(t, a.Finalize(), "close error")
|
2014-06-13 14:26:18 -07:00
|
|
|
}
|