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  }