Skip to content

Commit 213258f

Browse files
committed
Merge branch 'release/v0.1.3'
2 parents d142ee7 + 79b5b41 commit 213258f

40 files changed

+2448
-217
lines changed

service/hub.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,6 @@ func (h *connectionsHub) connectionForSKI(ski string) *ship.ShipConnection {
225225

226226
// close all connections
227227
func (h *connectionsHub) shutdown() {
228-
h.muxCon.Lock()
229-
defer h.muxCon.Unlock()
230-
231228
h.mdns.ShutdownMdnsService()
232229
for _, c := range h.connections {
233230
c.CloseConnection(false, "")

service/mdns.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"syscall"
1212

1313
"github.com/enbility/eebus-go/logging"
14+
"github.com/enbility/eebus-go/util"
1415
"github.com/godbus/dbus/v5"
1516
"github.com/holoplot/go-avahi"
1617
"github.com/libp2p/zeroconf/v2"
@@ -365,6 +366,10 @@ func (m *mdns) resolveEntries() {
365366
// stop searching for mDNS entries
366367
func (m *mdns) stopResolvingEntries() {
367368
if m.cancelChan != nil {
369+
if util.IsChannelClosed(m.cancelChan) {
370+
return
371+
}
372+
368373
logging.Log.Debug("mdns: stop search")
369374

370375
m.cancelChan <- true

ship/websocket.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func (w *websocketConnection) readShipPump() {
118118

119119
message, err := w.readWebsocketMessage()
120120
if err != nil {
121-
logging.Log.Error(w.remoteSki, "websocket read error: ", err)
121+
logging.Log.Debug(w.remoteSki, "websocket read error: ", err)
122122
w.close()
123123
w.dataProcessing.ReportConnectionError(err)
124124
return

spine/device_local_test.go

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ var _ spine.SpineDataConnection = (*DeviceLocalTestSuite)(nil)
2222

2323
func (d *DeviceLocalTestSuite) WriteSpineMessage([]byte) {}
2424

25+
func (d *DeviceLocalTestSuite) Test_RemoveRemoteDevice() {
26+
sut := spine.NewDeviceLocalImpl("brand", "model", "serial", "code", "address", model.DeviceTypeTypeEnergyManagementSystem, model.NetworkManagementFeatureSetTypeSmart)
27+
28+
ski := "test"
29+
sut.AddRemoteDevice(ski, d)
30+
rDevice := sut.RemoteDeviceForSki(ski)
31+
assert.NotNil(d.T(), rDevice)
32+
33+
sut.RemoveRemoteDeviceConnection(ski)
34+
35+
rDevice = sut.RemoteDeviceForSki(ski)
36+
assert.Nil(d.T(), rDevice)
37+
}
38+
2539
func (d *DeviceLocalTestSuite) Test_RemoteDevice() {
2640
sut := spine.NewDeviceLocalImpl("brand", "model", "serial", "code", "address", model.DeviceTypeTypeEnergyManagementSystem, model.NetworkManagementFeatureSetTypeSmart)
2741
localEntity := spine.NewEntityLocalImpl(sut, model.EntityTypeTypeCEM, spine.NewAddressEntityType([]uint{1}))
@@ -73,3 +87,150 @@ func (d *DeviceLocalTestSuite) Test_RemoteDevice() {
7387
remote = sut.RemoteDeviceForSki(ski)
7488
assert.Nil(d.T(), remote)
7589
}
90+
91+
func (d *DeviceLocalTestSuite) Test_ProcessCmd_Errors() {
92+
sut := spine.NewDeviceLocalImpl("brand", "model", "serial", "code", "address", model.DeviceTypeTypeEnergyManagementSystem, model.NetworkManagementFeatureSetTypeSmart)
93+
localEntity := spine.NewEntityLocalImpl(sut, model.EntityTypeTypeCEM, spine.NewAddressEntityType([]uint{1}))
94+
sut.AddEntity(localEntity)
95+
96+
ski := "test"
97+
sut.AddRemoteDevice(ski, d)
98+
remote := sut.RemoteDeviceForSki(ski)
99+
assert.NotNil(d.T(), remote)
100+
101+
datagram := model.DatagramType{
102+
Header: model.HeaderType{
103+
AddressSource: &model.FeatureAddressType{
104+
Device: util.Ptr(model.AddressDeviceType("localdevice")),
105+
},
106+
AddressDestination: &model.FeatureAddressType{
107+
Device: util.Ptr(model.AddressDeviceType("localdevice")),
108+
},
109+
MsgCounter: util.Ptr(model.MsgCounterType(1)),
110+
CmdClassifier: util.Ptr(model.CmdClassifierTypeRead),
111+
},
112+
Payload: model.PayloadType{
113+
Cmd: []model.CmdType{},
114+
},
115+
}
116+
117+
err := sut.ProcessCmd(datagram, remote)
118+
assert.NotNil(d.T(), err)
119+
120+
datagram = model.DatagramType{
121+
Header: model.HeaderType{
122+
AddressSource: &model.FeatureAddressType{
123+
Device: util.Ptr(model.AddressDeviceType("localdevice")),
124+
},
125+
AddressDestination: &model.FeatureAddressType{
126+
Device: util.Ptr(model.AddressDeviceType("localdevice")),
127+
},
128+
MsgCounter: util.Ptr(model.MsgCounterType(1)),
129+
CmdClassifier: util.Ptr(model.CmdClassifierTypeRead),
130+
},
131+
Payload: model.PayloadType{
132+
Cmd: []model.CmdType{
133+
{},
134+
},
135+
},
136+
}
137+
138+
err = sut.ProcessCmd(datagram, remote)
139+
assert.NotNil(d.T(), err)
140+
}
141+
142+
func (d *DeviceLocalTestSuite) Test_ProcessCmd() {
143+
sut := spine.NewDeviceLocalImpl("brand", "model", "serial", "code", "address", model.DeviceTypeTypeEnergyManagementSystem, model.NetworkManagementFeatureSetTypeSmart)
144+
localEntity := spine.NewEntityLocalImpl(sut, model.EntityTypeTypeCEM, spine.NewAddressEntityType([]uint{1}))
145+
sut.AddEntity(localEntity)
146+
147+
f := spine.NewFeatureLocalImpl(1, localEntity, model.FeatureTypeTypeElectricalConnection, model.RoleTypeClient)
148+
localEntity.AddFeature(f)
149+
f = spine.NewFeatureLocalImpl(2, localEntity, model.FeatureTypeTypeMeasurement, model.RoleTypeClient)
150+
localEntity.AddFeature(f)
151+
f = spine.NewFeatureLocalImpl(3, localEntity, model.FeatureTypeTypeElectricalConnection, model.RoleTypeServer)
152+
localEntity.AddFeature(f)
153+
154+
ski := "test"
155+
remoteDeviceName := "remote"
156+
sut.AddRemoteDevice(ski, d)
157+
remote := sut.RemoteDeviceForSki(ski)
158+
assert.NotNil(d.T(), remote)
159+
160+
detailedData := &model.NodeManagementDetailedDiscoveryDataType{
161+
DeviceInformation: &model.NodeManagementDetailedDiscoveryDeviceInformationType{
162+
Description: &model.NetworkManagementDeviceDescriptionDataType{
163+
DeviceAddress: &model.DeviceAddressType{
164+
Device: util.Ptr(model.AddressDeviceType(remoteDeviceName)),
165+
},
166+
},
167+
},
168+
EntityInformation: []model.NodeManagementDetailedDiscoveryEntityInformationType{
169+
{
170+
Description: &model.NetworkManagementEntityDescriptionDataType{
171+
EntityAddress: &model.EntityAddressType{
172+
Device: util.Ptr(model.AddressDeviceType(remoteDeviceName)),
173+
Entity: []model.AddressEntityType{1},
174+
},
175+
EntityType: util.Ptr(model.EntityTypeTypeEVSE),
176+
},
177+
},
178+
},
179+
FeatureInformation: []model.NodeManagementDetailedDiscoveryFeatureInformationType{
180+
{
181+
Description: &model.NetworkManagementFeatureDescriptionDataType{
182+
FeatureAddress: &model.FeatureAddressType{
183+
Device: util.Ptr(model.AddressDeviceType(remoteDeviceName)),
184+
Entity: []model.AddressEntityType{1},
185+
Feature: util.Ptr(model.AddressFeatureType(1)),
186+
},
187+
FeatureType: util.Ptr(model.FeatureTypeTypeElectricalConnection),
188+
Role: util.Ptr(model.RoleTypeServer),
189+
},
190+
},
191+
},
192+
}
193+
_, err := remote.AddEntityAndFeatures(true, detailedData)
194+
assert.Nil(d.T(), err)
195+
196+
datagram := model.DatagramType{
197+
Header: model.HeaderType{
198+
AddressSource: &model.FeatureAddressType{
199+
Device: util.Ptr(model.AddressDeviceType(remoteDeviceName)),
200+
Entity: []model.AddressEntityType{1},
201+
Feature: util.Ptr(model.AddressFeatureType(1)),
202+
},
203+
AddressDestination: &model.FeatureAddressType{
204+
Device: util.Ptr(model.AddressDeviceType("localdevice")),
205+
Entity: []model.AddressEntityType{1},
206+
},
207+
MsgCounter: util.Ptr(model.MsgCounterType(1)),
208+
CmdClassifier: util.Ptr(model.CmdClassifierTypeRead),
209+
},
210+
Payload: model.PayloadType{
211+
Cmd: []model.CmdType{},
212+
},
213+
}
214+
215+
err = sut.ProcessCmd(datagram, remote)
216+
assert.NotNil(d.T(), err)
217+
218+
cmd := model.CmdType{
219+
ElectricalConnectionParameterDescriptionListData: &model.ElectricalConnectionParameterDescriptionListDataType{},
220+
}
221+
222+
datagram.Payload.Cmd = append(datagram.Payload.Cmd, cmd)
223+
224+
err = sut.ProcessCmd(datagram, remote)
225+
assert.NotNil(d.T(), err)
226+
227+
datagram.Header.AddressDestination.Feature = util.Ptr(model.AddressFeatureType(1))
228+
229+
err = sut.ProcessCmd(datagram, remote)
230+
assert.NotNil(d.T(), err)
231+
232+
datagram.Header.AddressDestination.Feature = util.Ptr(model.AddressFeatureType(3))
233+
234+
err = sut.ProcessCmd(datagram, remote)
235+
assert.Nil(d.T(), err)
236+
}

spine/device_remote.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func (d *DeviceRemoteImpl) HandleIncomingSpineMesssage(message []byte) (*model.M
7575
}
7676
err := d.localDevice.ProcessCmd(datagram.Datagram, d)
7777
if err != nil {
78-
logging.Log.Error(err)
78+
logging.Log.Trace(err)
7979
}
8080

8181
return datagram.Datagram.Header.MsgCounter, nil

spine/entity_local.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ func (r *EntityLocalImpl) Features() []FeatureLocal {
5858
}
5959

6060
func (r *EntityLocalImpl) Feature(addressFeature *model.AddressFeatureType) FeatureLocal {
61+
if addressFeature == nil {
62+
return nil
63+
}
6164
for _, f := range r.features {
6265
if *f.Address().Feature == *addressFeature {
6366
return f

0 commit comments

Comments
 (0)