Skip to content

Commit 130494a

Browse files
committed
Fix logic checking for address match
1 parent cb6d157 commit 130494a

File tree

4 files changed

+80
-36
lines changed

4 files changed

+80
-36
lines changed

spine/binding_manager.go

+8-18
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,10 @@ func (c *BindingManager) RemoveBindingsForRemoteEntity(remoteEntity api.EntityRe
177177
remoteEntityAddress := remoteEntity.Address().Entity
178178

179179
for _, binding := range bindingData.BindingEntry {
180-
// check if this binding contains the remote device
181-
if !reflect.DeepEqual(binding.ClientAddress.Device, remoteDeviceAddress) &&
182-
!reflect.DeepEqual(binding.ServerAddress.Device, remoteDeviceAddress) {
183-
continue
184-
}
185-
186-
// check if this binding contains the remote entity
187-
if !reflect.DeepEqual(binding.ClientAddress.Entity, remoteEntityAddress) &&
188-
!reflect.DeepEqual(binding.ServerAddress.Entity, remoteEntityAddress) {
180+
// check if binding matches ClientAddress or ServerAddress
181+
if !isMatchingClientOrServerByDeviceAndEntity(
182+
binding.ClientAddress, binding.ServerAddress,
183+
remoteDeviceAddress, remoteEntityAddress) {
189184
continue
190185
}
191186

@@ -208,15 +203,10 @@ func (c *BindingManager) RemoveBindingsForLocalEntity(localEntity api.EntityLoca
208203
localEntityAddress := localEntity.Address().Entity
209204

210205
for _, binding := range bindingData.BindingEntry {
211-
// check if this binding contains the local device
212-
if !reflect.DeepEqual(binding.ClientAddress.Device, localDeviceAddress) &&
213-
!reflect.DeepEqual(binding.ServerAddress.Device, localDeviceAddress) {
214-
continue
215-
}
216-
217-
// check if this binding contains the local entity
218-
if !reflect.DeepEqual(binding.ClientAddress.Entity, localEntityAddress) &&
219-
!reflect.DeepEqual(binding.ServerAddress.Entity, localEntityAddress) {
206+
// check if binding matches ClientAddress or ServerAddress
207+
if !isMatchingClientOrServerByDeviceAndEntity(
208+
binding.ClientAddress, binding.ServerAddress,
209+
localDeviceAddress, localEntityAddress) {
220210
continue
221211
}
222212

spine/subscription_manager.go

+8-18
Original file line numberDiff line numberDiff line change
@@ -168,15 +168,10 @@ func (c *SubscriptionManager) RemoveSubscriptionsForRemoteEntity(remoteEntity ap
168168
remoteEntityAddress := remoteEntity.Address().Entity
169169

170170
for _, subscription := range subscriptionData.SubscriptionEntry {
171-
// check if this subscription contains the remote device
172-
if !reflect.DeepEqual(subscription.ClientAddress.Device, remoteDeviceAddress) &&
173-
!reflect.DeepEqual(subscription.ServerAddress.Device, remoteDeviceAddress) {
174-
continue
175-
}
176-
177-
// check if this subscription contains the remote entity
178-
if !reflect.DeepEqual(subscription.ClientAddress.Entity, remoteEntityAddress) &&
179-
!reflect.DeepEqual(subscription.ServerAddress.Entity, remoteEntityAddress) {
171+
// check if subscription matches ClientAddress or ServerAddress
172+
if !isMatchingClientOrServerByDeviceAndEntity(
173+
subscription.ClientAddress, subscription.ServerAddress,
174+
remoteDeviceAddress, remoteEntityAddress) {
180175
continue
181176
}
182177

@@ -199,15 +194,10 @@ func (c *SubscriptionManager) RemoveSubscriptionsForLocalEntity(localEntity api.
199194
localEntityAddress := localEntity.Address().Entity
200195

201196
for _, subscription := range subscriptionData.SubscriptionEntry {
202-
// check if this subscription contains the remote device
203-
if !reflect.DeepEqual(subscription.ClientAddress.Device, localDeviceAddress) &&
204-
!reflect.DeepEqual(subscription.ServerAddress.Device, localDeviceAddress) {
205-
continue
206-
}
207-
208-
// check if this subscription contains the remote entity
209-
if !reflect.DeepEqual(subscription.ClientAddress.Entity, localEntityAddress) &&
210-
!reflect.DeepEqual(subscription.ServerAddress.Entity, localEntityAddress) {
197+
// check if subscription matches ClientAddress or ServerAddress
198+
if !isMatchingClientOrServerByDeviceAndEntity(
199+
subscription.ClientAddress, subscription.ServerAddress,
200+
localDeviceAddress, localEntityAddress) {
211201
continue
212202
}
213203

spine/util.go

+26
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,32 @@ import (
1111

1212
var notFoundError = errors.New("data not found")
1313

14+
// check if a client or server feature address matches
15+
// a combination of a deviceAddress and entityAddress
16+
func isMatchingClientOrServerByDeviceAndEntity(
17+
clientAddress, serverAddress *model.FeatureAddressType,
18+
deviceAddress *model.AddressDeviceType,
19+
entityAddress []model.AddressEntityType,
20+
) bool {
21+
if deviceAddress == nil || entityAddress == nil {
22+
return false
23+
}
24+
25+
if clientAddress != nil &&
26+
reflect.DeepEqual(clientAddress.Device, deviceAddress) &&
27+
reflect.DeepEqual(clientAddress.Entity, entityAddress) {
28+
return true
29+
}
30+
31+
if serverAddress != nil &&
32+
reflect.DeepEqual(serverAddress.Device, deviceAddress) &&
33+
reflect.DeepEqual(serverAddress.Entity, entityAddress) {
34+
return true
35+
}
36+
37+
return false
38+
}
39+
1440
// return details for a given remoteDevice of a client and server address
1541
//
1642
// Note: when the feature address and/or entity address is not given,

spine/util_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,44 @@ type UtilsSuite struct {
2424

2525
func (s *UtilsSuite) WriteShipMessageWithPayload([]byte) {}
2626

27+
func (s *UtilsSuite) Test_isMatchingClientOrServerByDeviceAndEntity() {
28+
result := isMatchingClientOrServerByDeviceAndEntity(nil, nil, nil, nil)
29+
assert.False(s.T(), result)
30+
31+
clientAddress := &model.FeatureAddressType{}
32+
serverAddress := &model.FeatureAddressType{}
33+
result = isMatchingClientOrServerByDeviceAndEntity(clientAddress, serverAddress, nil, nil)
34+
assert.False(s.T(), result)
35+
36+
clientAddress = &model.FeatureAddressType{
37+
Device: util.Ptr(model.AddressDeviceType("Device1")),
38+
Entity: []model.AddressEntityType{1},
39+
Feature: util.Ptr(model.AddressFeatureType(100)),
40+
}
41+
serverAddress = &model.FeatureAddressType{
42+
Device: util.Ptr(model.AddressDeviceType("Device2")),
43+
Entity: []model.AddressEntityType{1},
44+
Feature: util.Ptr(model.AddressFeatureType(100)),
45+
}
46+
deviceAddress := util.Ptr(model.AddressDeviceType("Device1"))
47+
entityAddress := []model.AddressEntityType{2}
48+
result = isMatchingClientOrServerByDeviceAndEntity(clientAddress, serverAddress, deviceAddress, entityAddress)
49+
assert.False(s.T(), result)
50+
51+
entityAddress = []model.AddressEntityType{1}
52+
result = isMatchingClientOrServerByDeviceAndEntity(clientAddress, serverAddress, deviceAddress, entityAddress)
53+
assert.True(s.T(), result)
54+
55+
deviceAddress = util.Ptr(model.AddressDeviceType("Device2"))
56+
entityAddress = []model.AddressEntityType{2}
57+
result = isMatchingClientOrServerByDeviceAndEntity(clientAddress, serverAddress, deviceAddress, entityAddress)
58+
assert.False(s.T(), result)
59+
60+
entityAddress = []model.AddressEntityType{1}
61+
result = isMatchingClientOrServerByDeviceAndEntity(clientAddress, serverAddress, deviceAddress, entityAddress)
62+
assert.True(s.T(), result)
63+
}
64+
2765
func (s *UtilsSuite) Test_addressDetails() {
2866
s.localDevice = NewDeviceLocal("brand", "model", "serial", "code", "address", model.DeviceTypeTypeEnergyManagementSystem, model.NetworkManagementFeatureSetTypeSmart)
2967

0 commit comments

Comments
 (0)