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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy