github.com/enbility/spine-go@v0.7.0/spine/subscription_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 TestSubscriptionManagerSuite(t *testing.T) {
    15  	suite.Run(t, new(SubscriptionManagerSuite))
    16  }
    17  
    18  type SubscriptionManagerSuite struct {
    19  	suite.Suite
    20  
    21  	localDevice api.DeviceLocalInterface
    22  	remoteDevice,
    23  	remoteDevice2 api.DeviceRemoteInterface
    24  	sut api.SubscriptionManagerInterface
    25  }
    26  
    27  func (suite *SubscriptionManagerSuite) WriteShipMessageWithPayload([]byte) {}
    28  
    29  func (suite *SubscriptionManagerSuite) SetupSuite() {
    30  	suite.localDevice = NewDeviceLocal("brand", "model", "serial", "code", "address", model.DeviceTypeTypeEnergyManagementSystem, model.NetworkManagementFeatureSetTypeSmart)
    31  
    32  	ski := "test"
    33  	sender := NewSender(suite)
    34  	suite.remoteDevice = NewDeviceRemote(suite.localDevice, ski, sender)
    35  	_ = suite.localDevice.SetupRemoteDevice(ski, suite)
    36  
    37  	ski2 := "test2"
    38  	suite.remoteDevice2 = NewDeviceRemote(suite.localDevice, ski2, sender)
    39  	_ = suite.localDevice.SetupRemoteDevice(ski2, suite)
    40  
    41  	suite.sut = NewSubscriptionManager(suite.localDevice)
    42  }
    43  
    44  func (suite *SubscriptionManagerSuite) Test_Subscriptions() {
    45  	entity := NewEntityLocal(suite.localDevice, model.EntityTypeTypeCEM, []model.AddressEntityType{1}, time.Second*4)
    46  	suite.localDevice.AddEntity(entity)
    47  
    48  	localFeature := entity.GetOrAddFeature(model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeServer)
    49  
    50  	remoteEntity := NewEntityRemote(suite.remoteDevice, model.EntityTypeTypeEVSE, []model.AddressEntityType{1})
    51  	suite.remoteDevice.AddEntity(remoteEntity)
    52  
    53  	remoteFeature := NewFeatureRemote(remoteEntity.NextFeatureId(), remoteEntity, model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeClient)
    54  	remoteFeature.Address().Device = util.Ptr(model.AddressDeviceType("remoteDevice"))
    55  	remoteEntity.AddFeature(remoteFeature)
    56  	remoteEntity.Address().Device = util.Ptr(model.AddressDeviceType("remoteDevice"))
    57  
    58  	subscrRequest := model.SubscriptionManagementRequestCallType{
    59  		ClientAddress:     remoteFeature.Address(),
    60  		ServerAddress:     localFeature.Address(),
    61  		ServerFeatureType: util.Ptr(model.FeatureTypeTypeDeviceDiagnosis),
    62  	}
    63  
    64  	remoteEntity2 := NewEntityRemote(suite.remoteDevice2, model.EntityTypeTypeEVSE, []model.AddressEntityType{1})
    65  	suite.remoteDevice2.AddEntity(remoteEntity2)
    66  
    67  	remoteFeature2 := NewFeatureRemote(remoteEntity2.NextFeatureId(), remoteEntity2, model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeClient)
    68  	remoteFeature2.Address().Device = util.Ptr(model.AddressDeviceType("remoteDevice2"))
    69  	remoteEntity2.AddFeature(remoteFeature2)
    70  	remoteEntity2.Address().Device = util.Ptr(model.AddressDeviceType("remoteDevice2"))
    71  
    72  	subscrRequest2 := model.SubscriptionManagementRequestCallType{
    73  		ClientAddress:     remoteFeature2.Address(),
    74  		ServerAddress:     localFeature.Address(),
    75  		ServerFeatureType: util.Ptr(model.FeatureTypeTypeDeviceDiagnosis),
    76  	}
    77  
    78  	subMgr := suite.localDevice.SubscriptionManager()
    79  	err := subMgr.AddSubscription(suite.remoteDevice, subscrRequest)
    80  	assert.Nil(suite.T(), err)
    81  
    82  	subs := subMgr.Subscriptions(suite.remoteDevice)
    83  	assert.Equal(suite.T(), 1, len(subs))
    84  
    85  	err = subMgr.AddSubscription(suite.remoteDevice, subscrRequest)
    86  	assert.NotNil(suite.T(), err)
    87  
    88  	subs = subMgr.Subscriptions(suite.remoteDevice)
    89  	assert.Equal(suite.T(), 1, len(subs))
    90  
    91  	err = subMgr.AddSubscription(suite.remoteDevice2, subscrRequest2)
    92  	assert.Nil(suite.T(), err)
    93  
    94  	subs = subMgr.Subscriptions(suite.remoteDevice2)
    95  	assert.Equal(suite.T(), 1, len(subs))
    96  
    97  	subscrDelete := model.SubscriptionManagementDeleteCallType{
    98  		ClientAddress: remoteFeature.Address(),
    99  		ServerAddress: localFeature.Address(),
   100  	}
   101  
   102  	err = subMgr.RemoveSubscription(subscrDelete, suite.remoteDevice)
   103  	assert.Nil(suite.T(), err)
   104  
   105  	subs = subMgr.Subscriptions(suite.remoteDevice)
   106  	assert.Equal(suite.T(), 0, len(subs))
   107  
   108  	err = subMgr.RemoveSubscription(subscrDelete, suite.remoteDevice)
   109  	assert.NotNil(suite.T(), err)
   110  
   111  	subMgr = suite.localDevice.SubscriptionManager()
   112  	err = subMgr.AddSubscription(suite.remoteDevice, subscrRequest)
   113  	assert.Nil(suite.T(), err)
   114  
   115  	subs = subMgr.Subscriptions(suite.remoteDevice)
   116  	assert.Equal(suite.T(), 1, len(subs))
   117  
   118  	subMgr.RemoveSubscriptionsForEntity(nil)
   119  
   120  	subs = subMgr.Subscriptions(suite.remoteDevice)
   121  	assert.Equal(suite.T(), 1, len(subs))
   122  
   123  	subMgr.RemoveSubscriptionsForDevice(nil)
   124  
   125  	subs = subMgr.Subscriptions(suite.remoteDevice)
   126  	assert.Equal(suite.T(), 1, len(subs))
   127  
   128  	subMgr.RemoveSubscriptionsForDevice(suite.remoteDevice)
   129  
   130  	subs = subMgr.Subscriptions(suite.remoteDevice)
   131  	assert.Equal(suite.T(), 0, len(subs))
   132  
   133  	subs = subMgr.Subscriptions(suite.remoteDevice2)
   134  	assert.Equal(suite.T(), 1, len(subs))
   135  }