Skip to content

Commit e055463

Browse files
committed
add test for configuration and provisioning protocol
1 parent f2555c3 commit e055463

File tree

5 files changed

+576
-102
lines changed

5 files changed

+576
-102
lines changed
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
package configurationprotocol
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/arduino/arduino-cloud-cli/internal/board-protocols/configuration-protocol/cborcoders"
8+
"github.com/arduino/arduino-cloud-cli/internal/board-protocols/frame"
9+
"github.com/arduino/arduino-cloud-cli/internal/board-protocols/transport"
10+
"github.com/arduino/arduino-cloud-cli/internal/board-protocols/transport/mocks"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/mock"
13+
)
14+
15+
func newMockTransportSerial() *mocks.TransportInterface {
16+
m := &mocks.TransportInterface{}
17+
m.On("Type").Return(transport.Serial)
18+
19+
return m
20+
}
21+
22+
func TestNewNetworkConfigurationProtocolSerial(t *testing.T) {
23+
mockTr := newMockTransportSerial()
24+
tr := transport.TransportInterface(mockTr)
25+
ncp := NewNetworkConfigurationProtocol(&tr)
26+
assert.NotNil(t, ncp)
27+
assert.Equal(t, &tr, ncp.transport)
28+
assert.Empty(t, ncp.msgList)
29+
}
30+
31+
func TestConnectSerial_Success(t *testing.T) {
32+
mockTr := newMockTransportSerial()
33+
mockTr.On("Connect", mock.Anything).Return(nil)
34+
mockTr.On("Send", mock.Anything).Return(nil)
35+
tr := transport.TransportInterface(mockTr)
36+
ncp := NewNetworkConfigurationProtocol(&tr)
37+
connectMsg := frame.CreateFrame([]byte{serialInitByte}, frame.TransmissionControl)
38+
connectParams := transport.TransportInterfaceParams{
39+
Port: "COM1",
40+
BoundRate: 9600,
41+
}
42+
43+
err := ncp.Connect("COM1")
44+
assert.NoError(t, err)
45+
mockTr.AssertCalled(t, "Connect", connectParams)
46+
mockTr.AssertCalled(t, "Send", connectMsg.ToBytes())
47+
}
48+
49+
func TestConnectSerial_Error(t *testing.T) {
50+
mockTr := newMockTransportSerial()
51+
mockTr.On("Connect", mock.Anything).Return(errors.New("port busy"))
52+
tr := transport.TransportInterface(mockTr)
53+
ncp := NewNetworkConfigurationProtocol(&tr)
54+
55+
err := ncp.Connect("COM1")
56+
assert.Error(t, err)
57+
assert.Contains(t, err.Error(), "connecting to serial port")
58+
}
59+
60+
func TestCloseSerial_Success(t *testing.T) {
61+
mockTr := newMockTransportSerial()
62+
mockTr.On("Send", mock.Anything).Return(nil)
63+
mockTr.On("Close").Return(nil)
64+
tr := transport.TransportInterface(mockTr)
65+
ncp := NewNetworkConfigurationProtocol(&tr)
66+
67+
closeMsg := []byte{0x55, 0xaa, 0x03, 0x00, 0x03, 0x02, 0xD3, 0x6A, 0xaa, 0x55}
68+
69+
err := ncp.Close()
70+
assert.NoError(t, err)
71+
mockTr.AssertCalled(t, "Send", closeMsg)
72+
mockTr.AssertCalled(t, "Close")
73+
assert.Empty(t, ncp.msgList)
74+
}
75+
76+
func TestSendData_Success(t *testing.T) {
77+
mockTr := newMockTransportSerial()
78+
mockTr.On("Connected").Return(true)
79+
mockTr.On("Send", mock.Anything).Return(nil)
80+
tr := transport.TransportInterface(mockTr)
81+
ncp := NewNetworkConfigurationProtocol(&tr)
82+
connectMessage := cborcoders.From(cborcoders.ProvisioningCommandsMessage{Command: Commands["Connect"]})
83+
84+
want := []byte{0x55, 0xaa, 0x02, 0x00, 0x09, 0xda, 0x00, 0x01, 0x20, 0x03, 0x81, 0x01, 0x7e, 0x1b, 0xaa, 0x55}
85+
err := ncp.SendData(connectMessage)
86+
assert.NoError(t, err)
87+
mockTr.AssertCalled(t, "Send", want)
88+
}
89+
90+
func TestReceiveData_TransportNotConnected(t *testing.T) {
91+
mockTr := newMockTransportSerial()
92+
mockTr.On("Connected").Return(false)
93+
mockTr.On("Receive", mock.Anything).Return(nil, nil)
94+
tr := transport.TransportInterface(mockTr)
95+
ncp := NewNetworkConfigurationProtocol(&tr)
96+
97+
res, err := ncp.ReceiveData(1)
98+
assert.Nil(t, res)
99+
assert.Error(t, err)
100+
assert.Contains(t, err.Error(), "transport interface is not connected")
101+
}
102+
103+
func TestReceiveData_ReceiveTimeout(t *testing.T) {
104+
mockTr := newMockTransportSerial()
105+
mockTr.On("Connected").Return(true)
106+
mockTr.On("Receive", mock.Anything).Return(nil, errors.New("recv error"))
107+
tr := transport.TransportInterface(mockTr)
108+
ncp := NewNetworkConfigurationProtocol(&tr)
109+
110+
res, err := ncp.ReceiveData(1)
111+
assert.Nil(t, res)
112+
assert.Error(t, err)
113+
assert.Contains(t, err.Error(), "recv error")
114+
}
115+
116+
func TestReceiveData_FrameInvalid(t *testing.T) {
117+
mockTr := newMockTransportSerial()
118+
invalidFrame := frame.Frame{}
119+
invalidFrame.SetHeader([]byte{0x55, 0xaa, 0x02, 0x00, 0x03})
120+
invalidFrame.SetPayload([]byte{0x04})
121+
invalidFrame.SetCrc([]byte{0x00, 0x00})
122+
invalidFrame.SetFooter([]byte{0xaa, 0x55})
123+
want := []byte{0x55, 0xaa, 0x03, 0x00, 0x03, 0x03, 0xC2, 0xE3, 0xaa, 0x55}
124+
mockTr.On("Connected").Return(true)
125+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{invalidFrame}, nil)
126+
mockTr.On("Send", mock.Anything).Return(nil)
127+
tr := transport.TransportInterface(mockTr)
128+
ncp := NewNetworkConfigurationProtocol(&tr)
129+
130+
res, err := ncp.ReceiveData(1)
131+
assert.Nil(t, res)
132+
assert.NoError(t, err)
133+
mockTr.AssertCalled(t, "Send", want)
134+
}
135+
136+
func TestReceiveData_NackReceived(t *testing.T) {
137+
mockTr := newMockTransportSerial()
138+
nackFrame := frame.CreateFrame([]byte{nackByte}, frame.TransmissionControl)
139+
want := []byte{0x55, 0xaa, 0x02, 0x00, 0x09, 0xda, 0x00, 0x01, 0x20, 0x03, 0x81, 0x01, 0x7e, 0x1b, 0xaa, 0x55}
140+
mockTr.On("Connected").Return(true)
141+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{nackFrame}, nil)
142+
mockTr.On("Send", mock.Anything).Return(nil)
143+
tr := transport.TransportInterface(mockTr)
144+
ncp := NewNetworkConfigurationProtocol(&tr)
145+
146+
err := ncp.SendData(cborcoders.From(cborcoders.ProvisioningCommandsMessage{Command: Commands["Connect"]}))
147+
assert.NoError(t, err)
148+
mockTr.AssertCalled(t, "Send", want)
149+
res, err := ncp.ReceiveData(1)
150+
assert.Nil(t, res)
151+
assert.NoError(t, err)
152+
mockTr.AssertCalled(t, "Send", want)
153+
}
154+
155+
func TestReceiveData_SerialEndReceived(t *testing.T) {
156+
mockTr := newMockTransportSerial()
157+
endFrame := frame.CreateFrame([]byte{serialEndByte}, frame.TransmissionControl)
158+
mockTr.On("Connected").Return(true)
159+
mockTr.On("Close").Return(nil)
160+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{endFrame}, nil)
161+
tr := transport.TransportInterface(mockTr)
162+
ncp := NewNetworkConfigurationProtocol(&tr)
163+
164+
res, err := ncp.ReceiveData(1)
165+
assert.Nil(t, res)
166+
assert.NoError(t, err)
167+
mockTr.AssertCalled(t, "Close")
168+
}
169+
170+
func TestReceiveData_MsgAndSerialEndReceived(t *testing.T) {
171+
mockTr := newMockTransportSerial()
172+
frameData := frame.CreateFrame([]byte{0xda, 0x00, 0x01, 0x20, 0x00, 0x81, 0x01}, frame.Data)
173+
endFrame := frame.CreateFrame([]byte{serialEndByte}, frame.TransmissionControl)
174+
mockTr.On("Connected").Return(true)
175+
mockTr.On("Close").Return(nil)
176+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{frameData, endFrame}, nil)
177+
tr := transport.TransportInterface(mockTr)
178+
ncp := NewNetworkConfigurationProtocol(&tr)
179+
180+
res, err := ncp.ReceiveData(1)
181+
assert.NoError(t, err)
182+
mockTr.AssertCalled(t, "Close")
183+
assert.NotNil(t, res)
184+
assert.Equal(t, res.Type(), cborcoders.ProvisioningStatusMessageType)
185+
assert.Equal(t, res.ToProvisioningStatusMessage().Status, int16(1))
186+
}
187+
188+
func TestReceiveData_MsgAndNackReceived(t *testing.T) {
189+
mockTr := newMockTransportSerial()
190+
frameData := frame.CreateFrame([]byte{0xda, 0x00, 0x01, 0x20, 0x00, 0x81, 0x01}, frame.Data)
191+
nackFrame := frame.CreateFrame([]byte{nackByte}, frame.TransmissionControl)
192+
want := []byte{0x55, 0xaa, 0x02, 0x00, 0x09, 0xda, 0x00, 0x01, 0x20, 0x03, 0x81, 0x01, 0x7e, 0x1b, 0xaa, 0x55}
193+
mockTr.On("Connected").Return(true)
194+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{frameData, nackFrame}, nil)
195+
mockTr.On("Send", mock.Anything).Return(nil)
196+
tr := transport.TransportInterface(mockTr)
197+
ncp := NewNetworkConfigurationProtocol(&tr)
198+
199+
err := ncp.SendData(cborcoders.From(cborcoders.ProvisioningCommandsMessage{Command: Commands["Connect"]}))
200+
assert.NoError(t, err)
201+
mockTr.AssertCalled(t, "Send", want)
202+
res, err := ncp.ReceiveData(1)
203+
assert.NoError(t, err)
204+
assert.NotNil(t, res)
205+
assert.Equal(t, res.Type(), cborcoders.ProvisioningStatusMessageType)
206+
assert.Equal(t, res.ToProvisioningStatusMessage().Status, int16(1))
207+
mockTr.AssertCalled(t, "Send", want)
208+
}
209+
210+
func TestReceiveData_ReceiveData(t *testing.T) {
211+
mockTr := newMockTransportSerial()
212+
frameData := frame.CreateFrame([]byte{0xda, 0x00, 0x01, 0x20, 0x00, 0x81, 0x01}, frame.Data)
213+
mockTr.On("Connected").Return(true)
214+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{frameData}, nil)
215+
tr := transport.TransportInterface(mockTr)
216+
ncp := NewNetworkConfigurationProtocol(&tr)
217+
218+
res, err := ncp.ReceiveData(1)
219+
assert.NoError(t, err)
220+
assert.NotNil(t, res)
221+
assert.Equal(t, res.Type(), cborcoders.ProvisioningStatusMessageType)
222+
assert.Equal(t, res.ToProvisioningStatusMessage().Status, int16(1))
223+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package provisioningprotocol
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/arduino/arduino-cloud-cli/internal/board-protocols/frame"
8+
"github.com/arduino/arduino-cloud-cli/internal/board-protocols/transport"
9+
"github.com/arduino/arduino-cloud-cli/internal/board-protocols/transport/mocks"
10+
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/mock"
12+
)
13+
14+
func TestSend_Success(t *testing.T) {
15+
mockTransportInterface := &mocks.TransportInterface{}
16+
var tr transport.TransportInterface = mockTransportInterface
17+
provProt := NewProvisioningProtocol(&tr)
18+
mockTransportInterface.On("Connected").Return(true)
19+
mockTransportInterface.On("Send", mock.AnythingOfType("[]uint8")).Return(nil)
20+
21+
payload := []byte{1, 2}
22+
cmd := SetDay
23+
want := []byte{0x55, 0xaa, 1, 0, 5, 10, 1, 2, 143, 124, 0xaa, 0x55}
24+
25+
err := provProt.Send(context.TODO(), cmd, payload)
26+
assert.NoError(t, err)
27+
mockTransportInterface.AssertCalled(t, "Send", want)
28+
}
29+
30+
func TestSendReceive_Success(t *testing.T) {
31+
32+
mockTransportInterface := &mocks.TransportInterface{}
33+
var tr transport.TransportInterface = mockTransportInterface
34+
provProt := NewProvisioningProtocol(&tr)
35+
36+
want := []byte{1, 2, 3}
37+
rec := frame.CreateFrame(want, frame.Response)
38+
receivedListFrame := []frame.Frame{
39+
rec,
40+
}
41+
42+
mockTransportInterface.On("Connected").Return(true)
43+
mockTransportInterface.On("Send", mock.AnythingOfType("[]uint8")).Return(nil)
44+
mockTransportInterface.On("Receive", mock.Anything).Return(receivedListFrame, nil)
45+
46+
res, err := provProt.SendReceive(context.TODO(), BeginStorage, []byte{1, 2})
47+
assert.NoError(t, err)
48+
49+
assert.NotNil(t, res, "Expected non-nil response")
50+
assert.Equal(t, res, want, "Expected %v but received %v", want, res)
51+
52+
}

0 commit comments

Comments
 (0)