github.com/enbility/spine-go@v0.7.0/spine/binding_manager_test.go (about) 1 package spine 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/enbility/spine-go/api" 8 "github.com/enbility/spine-go/model" 9 "github.com/enbility/spine-go/util" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/suite" 12 ) 13 14 func TestBindingManagerSuite(t *testing.T) { 15 suite.Run(t, new(BindingManagerSuite)) 16 } 17 18 type BindingManagerSuite struct { 19 suite.Suite 20 21 localDevice api.DeviceLocalInterface 22 writeHandler *WriteMessageHandler 23 remoteDevice *DeviceRemote 24 25 sut api.BindingManagerInterface 26 } 27 28 func (s *BindingManagerSuite) BeforeTest(suiteName, testName string) { 29 s.localDevice = NewDeviceLocal("TestBrandName", "TestDeviceModel", "TestSerialNumber", "TestDeviceCode", 30 "TestDeviceAddress", model.DeviceTypeTypeEnergyManagementSystem, model.NetworkManagementFeatureSetTypeSmart) 31 remoteSki := "TestRemoteSki" 32 33 s.writeHandler = &WriteMessageHandler{} 34 35 sender := NewSender(s.writeHandler) 36 s.remoteDevice = NewDeviceRemote(s.localDevice, remoteSki, sender) 37 s.remoteDevice.address = util.Ptr(model.AddressDeviceType("Address")) 38 39 s.sut = NewBindingManager(s.localDevice) 40 } 41 42 func (suite *BindingManagerSuite) Test_Bindings() { 43 entity := NewEntityLocal(suite.localDevice, model.EntityTypeTypeCEM, []model.AddressEntityType{1}, time.Second*4) 44 suite.localDevice.AddEntity(entity) 45 46 localFeature := entity.GetOrAddFeature(model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeServer) 47 localClientFeature := entity.GetOrAddFeature(model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeClient) 48 49 remoteEntity := NewEntityRemote(suite.remoteDevice, model.EntityTypeTypeEVSE, []model.AddressEntityType{1}) 50 51 remoteFeature := NewFeatureRemote(remoteEntity.NextFeatureId(), remoteEntity, model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeClient) 52 remoteFeature.Address().Device = util.Ptr(model.AddressDeviceType("remoteDevice")) 53 remoteEntity.AddFeature(remoteFeature) 54 55 remoteServerFeature := NewFeatureRemote(remoteEntity.NextFeatureId(), remoteEntity, model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeServer) 56 remoteServerFeature.Address().Device = util.Ptr(model.AddressDeviceType("remoteDevice")) 57 remoteEntity.AddFeature(remoteServerFeature) 58 59 suite.remoteDevice.AddEntity(remoteEntity) 60 61 bindingMgr := suite.localDevice.BindingManager() 62 63 bindingRequest := model.BindingManagementRequestCallType{ 64 ClientAddress: util.Ptr(model.FeatureAddressType{ 65 Device: util.Ptr(model.AddressDeviceType("dummy")), 66 Entity: []model.AddressEntityType{1000}, 67 Feature: util.Ptr(model.AddressFeatureType(1000)), 68 }), 69 ServerAddress: util.Ptr(model.FeatureAddressType{ 70 Device: util.Ptr(model.AddressDeviceType("dummy")), 71 Entity: []model.AddressEntityType{1000}, 72 Feature: util.Ptr(model.AddressFeatureType(1000)), 73 }), 74 ServerFeatureType: util.Ptr(model.FeatureTypeTypeDeviceDiagnosis), 75 } 76 77 err := bindingMgr.AddBinding(suite.remoteDevice, bindingRequest) 78 assert.NotNil(suite.T(), err) 79 80 bindingRequest = model.BindingManagementRequestCallType{ 81 ClientAddress: util.Ptr(model.FeatureAddressType{ 82 Device: util.Ptr(model.AddressDeviceType("dummy")), 83 Entity: []model.AddressEntityType{1000}, 84 Feature: util.Ptr(model.AddressFeatureType(1000)), 85 }), 86 ServerAddress: localClientFeature.Address(), 87 } 88 89 err = bindingMgr.AddBinding(suite.remoteDevice, bindingRequest) 90 assert.NotNil(suite.T(), err) 91 92 bindingRequest.ServerFeatureType = util.Ptr(model.FeatureTypeTypeDeviceDiagnosis) 93 94 err = bindingMgr.AddBinding(suite.remoteDevice, bindingRequest) 95 assert.NotNil(suite.T(), err) 96 97 bindingRequest.ServerAddress = localFeature.Address() 98 99 err = bindingMgr.AddBinding(suite.remoteDevice, bindingRequest) 100 assert.NotNil(suite.T(), err) 101 102 bindingRequest.ClientAddress = remoteServerFeature.Address() 103 104 err = bindingMgr.AddBinding(suite.remoteDevice, bindingRequest) 105 assert.NotNil(suite.T(), err) 106 107 bindingRequest.ClientAddress = remoteFeature.Address() 108 109 err = bindingMgr.AddBinding(suite.remoteDevice, bindingRequest) 110 assert.Nil(suite.T(), err) 111 112 subs := bindingMgr.Bindings(suite.remoteDevice) 113 assert.Equal(suite.T(), 1, len(subs)) 114 115 err = bindingMgr.AddBinding(suite.remoteDevice, bindingRequest) 116 assert.NotNil(suite.T(), err) 117 118 subs = bindingMgr.Bindings(suite.remoteDevice) 119 assert.Equal(suite.T(), 1, len(subs)) 120 121 address := model.FeatureAddressType{ 122 Device: entity.Device().Address(), 123 Entity: entity.Address().Entity, 124 Feature: util.Ptr(model.AddressFeatureType(10)), 125 } 126 entries := bindingMgr.BindingsOnFeature(address) 127 assert.Equal(suite.T(), 0, len(entries)) 128 129 address.Feature = localFeature.Address().Feature 130 entries = bindingMgr.BindingsOnFeature(address) 131 assert.Equal(suite.T(), 1, len(entries)) 132 133 bindingDelete := model.BindingManagementDeleteCallType{ 134 ClientAddress: util.Ptr(model.FeatureAddressType{ 135 Device: util.Ptr(model.AddressDeviceType("dummy")), 136 Entity: []model.AddressEntityType{1000}, 137 Feature: util.Ptr(model.AddressFeatureType(1000)), 138 }), 139 ServerAddress: util.Ptr(model.FeatureAddressType{ 140 Device: util.Ptr(model.AddressDeviceType("dummy")), 141 Entity: []model.AddressEntityType{1000}, 142 Feature: util.Ptr(model.AddressFeatureType(1000)), 143 }), 144 } 145 146 err = bindingMgr.RemoveBinding(bindingDelete, suite.remoteDevice) 147 assert.NotNil(suite.T(), err) 148 149 bindingDelete.ClientAddress = remoteServerFeature.Address() 150 151 err = bindingMgr.RemoveBinding(bindingDelete, suite.remoteDevice) 152 assert.NotNil(suite.T(), err) 153 154 bindingDelete.ServerAddress = localClientFeature.Address() 155 156 err = bindingMgr.RemoveBinding(bindingDelete, suite.remoteDevice) 157 assert.NotNil(suite.T(), err) 158 159 err = bindingMgr.RemoveBinding(bindingDelete, suite.remoteDevice) 160 assert.NotNil(suite.T(), err) 161 162 bindingDelete.ServerAddress = localFeature.Address() 163 164 err = bindingMgr.RemoveBinding(bindingDelete, suite.remoteDevice) 165 assert.NotNil(suite.T(), err) 166 167 bindingDelete.ClientAddress = remoteFeature.Address() 168 169 err = bindingMgr.RemoveBinding(bindingDelete, suite.remoteDevice) 170 assert.Nil(suite.T(), err) 171 172 subs = bindingMgr.Bindings(suite.remoteDevice) 173 assert.Equal(suite.T(), 0, len(subs)) 174 175 err = bindingMgr.RemoveBinding(bindingDelete, suite.remoteDevice) 176 assert.NotNil(suite.T(), err) 177 178 err = bindingMgr.AddBinding(suite.remoteDevice, bindingRequest) 179 assert.Nil(suite.T(), err) 180 181 subs = bindingMgr.Bindings(suite.remoteDevice) 182 assert.Equal(suite.T(), 1, len(subs)) 183 184 bindingMgr.RemoveBindingsForDevice(suite.remoteDevice) 185 186 subs = bindingMgr.Bindings(suite.remoteDevice) 187 assert.Equal(suite.T(), 0, len(subs)) 188 }