Skip to content

Commit 9e01568

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

File tree

5 files changed

+573
-102
lines changed

5 files changed

+573
-102
lines changed
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
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("Send", mock.Anything).Return(nil)
79+
tr := transport.TransportInterface(mockTr)
80+
ncp := NewNetworkConfigurationProtocol(&tr)
81+
connectMessage := cborcoders.From(cborcoders.ProvisioningCommandsMessage{Command: Commands["Connect"]})
82+
83+
want := []byte{0x55, 0xaa, 0x02, 0x00, 0x09, 0xda, 0x00, 0x01, 0x20, 0x03, 0x81, 0x01, 0x7e, 0x1b, 0xaa, 0x55}
84+
err := ncp.SendData(connectMessage)
85+
assert.NoError(t, err)
86+
mockTr.AssertCalled(t, "Send", want)
87+
}
88+
89+
func TestReceiveData_TransportNotConnected(t *testing.T) {
90+
mockTr := newMockTransportSerial()
91+
mockTr.On("Connected").Return(false)
92+
mockTr.On("Receive", mock.Anything).Return(nil, nil)
93+
tr := transport.TransportInterface(mockTr)
94+
ncp := NewNetworkConfigurationProtocol(&tr)
95+
96+
res, err := ncp.ReceiveData(1)
97+
assert.Nil(t, res)
98+
assert.Error(t, err)
99+
assert.Contains(t, err.Error(), "transport interface is not connected")
100+
}
101+
102+
func TestReceiveData_ReceiveTimeout(t *testing.T) {
103+
mockTr := newMockTransportSerial()
104+
mockTr.On("Connected").Return(true)
105+
mockTr.On("Receive", mock.Anything).Return(nil, errors.New("recv error"))
106+
tr := transport.TransportInterface(mockTr)
107+
ncp := NewNetworkConfigurationProtocol(&tr)
108+
109+
res, err := ncp.ReceiveData(1)
110+
assert.Nil(t, res)
111+
assert.Error(t, err)
112+
assert.Contains(t, err.Error(), "recv error")
113+
}
114+
115+
func TestReceiveData_FrameInvalid(t *testing.T) {
116+
mockTr := newMockTransportSerial()
117+
invalidFrame := frame.Frame{}
118+
invalidFrame.SetHeader([]byte{0x55, 0xaa, 0x02, 0x00, 0x03})
119+
invalidFrame.SetPayload([]byte{0x04})
120+
invalidFrame.SetCrc([]byte{0x00, 0x00})
121+
invalidFrame.SetFooter([]byte{0xaa, 0x55})
122+
want := []byte{0x55, 0xaa, 0x03, 0x00, 0x03, 0x03, 0xC2, 0xE3, 0xaa, 0x55}
123+
mockTr.On("Connected").Return(true)
124+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{invalidFrame}, nil)
125+
mockTr.On("Send", mock.Anything).Return(nil)
126+
tr := transport.TransportInterface(mockTr)
127+
ncp := NewNetworkConfigurationProtocol(&tr)
128+
129+
res, err := ncp.ReceiveData(1)
130+
assert.Nil(t, res)
131+
assert.NoError(t, err)
132+
mockTr.AssertCalled(t, "Send", want)
133+
}
134+
135+
func TestReceiveData_NackReceived(t *testing.T) {
136+
mockTr := newMockTransportSerial()
137+
nackFrame := frame.CreateFrame([]byte{nackByte}, frame.TransmissionControl)
138+
want := []byte{0x55, 0xaa, 0x02, 0x00, 0x09, 0xda, 0x00, 0x01, 0x20, 0x03, 0x81, 0x01, 0x7e, 0x1b, 0xaa, 0x55}
139+
mockTr.On("Connected").Return(true)
140+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{nackFrame}, nil)
141+
mockTr.On("Send", mock.Anything).Return(nil)
142+
tr := transport.TransportInterface(mockTr)
143+
ncp := NewNetworkConfigurationProtocol(&tr)
144+
145+
err := ncp.SendData(cborcoders.From(cborcoders.ProvisioningCommandsMessage{Command: Commands["Connect"]}))
146+
assert.NoError(t, err)
147+
mockTr.AssertCalled(t, "Send", want)
148+
res, err := ncp.ReceiveData(1)
149+
assert.Nil(t, res)
150+
assert.NoError(t, err)
151+
mockTr.AssertCalled(t, "Send", want)
152+
}
153+
154+
func TestReceiveData_SerialEndReceived(t *testing.T) {
155+
mockTr := newMockTransportSerial()
156+
endFrame := frame.CreateFrame([]byte{serialEndByte}, frame.TransmissionControl)
157+
mockTr.On("Connected").Return(true)
158+
mockTr.On("Close").Return(nil)
159+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{endFrame}, nil)
160+
tr := transport.TransportInterface(mockTr)
161+
ncp := NewNetworkConfigurationProtocol(&tr)
162+
163+
res, err := ncp.ReceiveData(1)
164+
assert.Nil(t, res)
165+
assert.NoError(t, err)
166+
mockTr.AssertCalled(t, "Close")
167+
}
168+
169+
func TestReceiveData_MsgAndSerialEndReceived(t *testing.T) {
170+
mockTr := newMockTransportSerial()
171+
frameData := frame.CreateFrame([]byte{0xda, 0x00, 0x01, 0x20, 0x00, 0x81, 0x01}, frame.Data)
172+
endFrame := frame.CreateFrame([]byte{serialEndByte}, frame.TransmissionControl)
173+
mockTr.On("Connected").Return(true)
174+
mockTr.On("Close").Return(nil)
175+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{frameData, endFrame}, nil)
176+
tr := transport.TransportInterface(mockTr)
177+
ncp := NewNetworkConfigurationProtocol(&tr)
178+
179+
res, err := ncp.ReceiveData(1)
180+
assert.NoError(t, err)
181+
mockTr.AssertCalled(t, "Close")
182+
assert.NotNil(t, res)
183+
assert.Equal(t, res.Type(), cborcoders.ProvisioningStatusMessageType)
184+
assert.Equal(t, res.ToProvisioningStatusMessage().Status, int16(1))
185+
}
186+
187+
func TestReceiveData_MsgAndNackReceived(t *testing.T) {
188+
mockTr := newMockTransportSerial()
189+
frameData := frame.CreateFrame([]byte{0xda, 0x00, 0x01, 0x20, 0x00, 0x81, 0x01}, frame.Data)
190+
nackFrame := frame.CreateFrame([]byte{nackByte}, frame.TransmissionControl)
191+
want := []byte{0x55, 0xaa, 0x02, 0x00, 0x09, 0xda, 0x00, 0x01, 0x20, 0x03, 0x81, 0x01, 0x7e, 0x1b, 0xaa, 0x55}
192+
mockTr.On("Connected").Return(true)
193+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{frameData, nackFrame}, nil)
194+
mockTr.On("Send", mock.Anything).Return(nil)
195+
tr := transport.TransportInterface(mockTr)
196+
ncp := NewNetworkConfigurationProtocol(&tr)
197+
198+
err := ncp.SendData(cborcoders.From(cborcoders.ProvisioningCommandsMessage{Command: Commands["Connect"]}))
199+
assert.NoError(t, err)
200+
mockTr.AssertCalled(t, "Send", want)
201+
res, err := ncp.ReceiveData(1)
202+
assert.NoError(t, err)
203+
assert.NotNil(t, res)
204+
assert.Equal(t, res.Type(), cborcoders.ProvisioningStatusMessageType)
205+
assert.Equal(t, res.ToProvisioningStatusMessage().Status, int16(1))
206+
mockTr.AssertCalled(t, "Send", want)
207+
}
208+
209+
func TestReceiveData_ReceiveData(t *testing.T) {
210+
mockTr := newMockTransportSerial()
211+
frameData := frame.CreateFrame([]byte{0xda, 0x00, 0x01, 0x20, 0x00, 0x81, 0x01}, frame.Data)
212+
mockTr.On("Connected").Return(true)
213+
mockTr.On("Receive", mock.Anything).Return([]frame.Frame{frameData}, nil)
214+
tr := transport.TransportInterface(mockTr)
215+
ncp := NewNetworkConfigurationProtocol(&tr)
216+
217+
res, err := ncp.ReceiveData(1)
218+
assert.NoError(t, err)
219+
assert.NotNil(t, res)
220+
assert.Equal(t, res.Type(), cborcoders.ProvisioningStatusMessageType)
221+
assert.Equal(t, res.ToProvisioningStatusMessage().Status, int16(1))
222+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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("Send", mock.AnythingOfType("[]uint8")).Return(nil)
19+
20+
payload := []byte{1, 2}
21+
cmd := SetDay
22+
want := []byte{0x55, 0xaa, 1, 0, 5, 10, 1, 2, 143, 124, 0xaa, 0x55}
23+
24+
err := provProt.Send(context.TODO(), cmd, payload)
25+
assert.NoError(t, err)
26+
mockTransportInterface.AssertCalled(t, "Send", want)
27+
}
28+
29+
func TestSendReceive_Success(t *testing.T) {
30+
31+
mockTransportInterface := &mocks.TransportInterface{}
32+
var tr transport.TransportInterface = mockTransportInterface
33+
provProt := NewProvisioningProtocol(&tr)
34+
35+
want := []byte{1, 2, 3}
36+
rec := frame.CreateFrame(want, frame.Response)
37+
receivedListFrame := []frame.Frame{
38+
rec,
39+
}
40+
41+
mockTransportInterface.On("Send", mock.AnythingOfType("[]uint8")).Return(nil)
42+
mockTransportInterface.On("Receive", mock.Anything).Return(receivedListFrame, nil)
43+
44+
res, err := provProt.SendReceive(context.TODO(), BeginStorage, []byte{1, 2})
45+
assert.NoError(t, err)
46+
47+
assert.NotNil(t, res, "Expected non-nil response")
48+
assert.Equal(t, res, want, "Expected %v but received %v", want, res)
49+
50+
}

0 commit comments

Comments
 (0)