Skip to content
This repository has been archived by the owner on Jun 29, 2024. It is now read-only.

Commit

Permalink
Various updates
Browse files Browse the repository at this point in the history
- Added tests
- Changed event name
- Fixed possible panic
- Corrected/updated heartbeat message check
  • Loading branch information
DerAndereAndi committed May 23, 2024
1 parent 24358ac commit 551b465
Show file tree
Hide file tree
Showing 11 changed files with 113 additions and 5 deletions.
3 changes: 2 additions & 1 deletion uclpcserver/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ func (e *UCLPCServer) HandleEvent(payload spineapi.EventPayload) {
}

if util.IsHeartbeat(localEntity, payload) {
e.eventCB(payload.Ski, payload.Device, payload.Entity, Heartbeat)
e.eventCB(payload.Ski, payload.Device, payload.Entity, DataUpdateHeartbeat)
return
}

if localEntity == nil ||
Expand Down
8 changes: 8 additions & 0 deletions uclpcserver/events_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ func (s *UCLPCServerSuite) Test_Events() {
payload.ChangeType = spineapi.ElementChangeAdd
payload.LocalFeature = s.loadControlFeature
s.sut.HandleEvent(payload)

payload.EventType = spineapi.EventTypeDataChange
payload.ChangeType = spineapi.ElementChangeUpdate
payload.Function = model.FunctionTypeDeviceDiagnosisHeartbeatData
payload.LocalFeature = s.deviceDiagnosisFeature
payload.CmdClassifier = eebusutil.Ptr(model.CmdClassifierTypeNotify)
payload.Data = eebusutil.Ptr(model.DeviceDiagnosisHeartbeatDataType{})
s.sut.HandleEvent(payload)
}

func (s *UCLPCServerSuite) Test_deviceConnected() {
Expand Down
4 changes: 4 additions & 0 deletions uclpcserver/public.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,10 @@ func (e *UCLPCServer) SetFailsafeDurationMinimum(duration time.Duration, changea
// Scenario 3

func (e *UCLPCServer) IsHeartbeatWithinDuration() bool {
if e.heartbeatDiag == nil {
return false
}

return e.heartbeatDiag.IsHeartbeatWithinDuration(2 * time.Minute)
}

Expand Down
38 changes: 38 additions & 0 deletions uclpcserver/public_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"time"

"github.com/enbility/cemd/api"
"github.com/enbility/cemd/util"
eebusutil "github.com/enbility/eebus-go/util"
spineapi "github.com/enbility/spine-go/api"
"github.com/enbility/spine-go/model"
Expand Down Expand Up @@ -102,6 +103,43 @@ func (s *UCLPCServerSuite) Test_Failsafe() {
assert.Nil(s.T(), err)
}

func (s *UCLPCServerSuite) Test_IsHeartbeatWithinDuration() {
assert.Nil(s.T(), s.sut.heartbeatDiag)

value := s.sut.IsHeartbeatWithinDuration()
assert.False(s.T(), value)

remoteDiagServer := s.monitoredEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeServer)
assert.NotNil(s.T(), remoteDiagServer)

var err error
s.sut.heartbeatDiag, err = util.DeviceDiagnosis(s.service, s.monitoredEntity)
assert.NotNil(s.T(), remoteDiagServer)
assert.Nil(s.T(), err)

// add heartbeat data to the remoteDiagServer
timestamp := time.Now().Add(-time.Second * 121)
data := &model.DeviceDiagnosisHeartbeatDataType{
Timestamp: model.NewAbsoluteOrRelativeTimeTypeFromTime(timestamp),
HeartbeatCounter: eebusutil.Ptr(uint64(1)),
HeartbeatTimeout: model.NewDurationType(time.Second * 120),
}
err1 := remoteDiagServer.UpdateData(model.FunctionTypeDeviceDiagnosisHeartbeatData, data, nil, nil)
assert.Nil(s.T(), err1)

value = s.sut.IsHeartbeatWithinDuration()
assert.False(s.T(), value)

timestamp = time.Now()
data.Timestamp = model.NewAbsoluteOrRelativeTimeTypeFromTime(timestamp)

err1 = remoteDiagServer.UpdateData(model.FunctionTypeDeviceDiagnosisHeartbeatData, data, nil, nil)
assert.Nil(s.T(), err1)

value = s.sut.IsHeartbeatWithinDuration()
assert.True(s.T(), value)
}

func (s *UCLPCServerSuite) Test_ContractualConsumptionNominalMax() {
value, err := s.sut.ContractualConsumptionNominalMax()
assert.Equal(s.T(), 0.0, value)
Expand Down
3 changes: 2 additions & 1 deletion uclpcserver/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const (

// Indicates a notify heartbeat event the application should care of.
// E.g. going into or out of the Failsafe state
//
// Use Case LPC, Scenario 3
Heartbeat api.EventType = "Heartbeat"
DataUpdateHeartbeat api.EventType = "uclpcserver-DataUpdateHeartbeat"
)
3 changes: 2 additions & 1 deletion uclppserver/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ func (e *UCLPPServer) HandleEvent(payload spineapi.EventPayload) {
}

if util.IsHeartbeat(localEntity, payload) {
e.eventCB(payload.Ski, payload.Device, payload.Entity, Heartbeat)
e.eventCB(payload.Ski, payload.Device, payload.Entity, DataUpdateHeartbeat)
return
}

if localEntity == nil ||
Expand Down
8 changes: 8 additions & 0 deletions uclppserver/events_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ func (s *UCLPPServerSuite) Test_Events() {
payload.ChangeType = spineapi.ElementChangeAdd
payload.LocalFeature = s.loadControlFeature
s.sut.HandleEvent(payload)

payload.EventType = spineapi.EventTypeDataChange
payload.ChangeType = spineapi.ElementChangeUpdate
payload.Function = model.FunctionTypeDeviceDiagnosisHeartbeatData
payload.LocalFeature = s.deviceDiagnosisFeature
payload.CmdClassifier = eebusutil.Ptr(model.CmdClassifierTypeNotify)
payload.Data = eebusutil.Ptr(model.DeviceDiagnosisHeartbeatDataType{})
s.sut.HandleEvent(payload)
}

func (s *UCLPPServerSuite) Test_deviceConnected() {
Expand Down
4 changes: 4 additions & 0 deletions uclppserver/public.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,10 @@ func (e *UCLPPServer) SetFailsafeDurationMinimum(duration time.Duration, changea
// Scenario 3

func (e *UCLPPServer) IsHeartbeatWithinDuration() bool {
if e.heartbeatDiag == nil {
return false
}

return e.heartbeatDiag.IsHeartbeatWithinDuration(2 * time.Minute)
}

Expand Down
38 changes: 38 additions & 0 deletions uclppserver/public_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"time"

"github.com/enbility/cemd/api"
"github.com/enbility/cemd/util"
eebusutil "github.com/enbility/eebus-go/util"
spineapi "github.com/enbility/spine-go/api"
"github.com/enbility/spine-go/model"
Expand Down Expand Up @@ -102,6 +103,43 @@ func (s *UCLPPServerSuite) Test_Failsafe() {
assert.Nil(s.T(), err)
}

func (s *UCLPPServerSuite) Test_IsHeartbeatWithinDuration() {
assert.Nil(s.T(), s.sut.heartbeatDiag)

value := s.sut.IsHeartbeatWithinDuration()
assert.False(s.T(), value)

remoteDiagServer := s.monitoredEntity.FeatureOfTypeAndRole(model.FeatureTypeTypeDeviceDiagnosis, model.RoleTypeServer)
assert.NotNil(s.T(), remoteDiagServer)

var err error
s.sut.heartbeatDiag, err = util.DeviceDiagnosis(s.service, s.monitoredEntity)
assert.NotNil(s.T(), remoteDiagServer)
assert.Nil(s.T(), err)

// add heartbeat data to the remoteDiagServer
timestamp := time.Now().Add(-time.Second * 121)
data := &model.DeviceDiagnosisHeartbeatDataType{
Timestamp: model.NewAbsoluteOrRelativeTimeTypeFromTime(timestamp),
HeartbeatCounter: eebusutil.Ptr(uint64(1)),
HeartbeatTimeout: model.NewDurationType(time.Second * 120),
}
err1 := remoteDiagServer.UpdateData(model.FunctionTypeDeviceDiagnosisHeartbeatData, data, nil, nil)
assert.Nil(s.T(), err1)

value = s.sut.IsHeartbeatWithinDuration()
assert.False(s.T(), value)

timestamp = time.Now()
data.Timestamp = model.NewAbsoluteOrRelativeTimeTypeFromTime(timestamp)

err1 = remoteDiagServer.UpdateData(model.FunctionTypeDeviceDiagnosisHeartbeatData, data, nil, nil)
assert.Nil(s.T(), err1)

value = s.sut.IsHeartbeatWithinDuration()
assert.True(s.T(), value)
}

func (s *UCLPPServerSuite) Test_ContractualProductionNominalMax() {
value, err := s.sut.ContractualProductionNominalMax()
assert.Equal(s.T(), 0.0, value)
Expand Down
3 changes: 2 additions & 1 deletion uclppserver/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const (

// Indicates a notify heartbeat event the application should care of.
// E.g. going into or out of the Failsafe state
//
// Use Case LPP, Scenario 3
Heartbeat api.EventType = "Heartbeat"
DataUpdateHeartbeat api.EventType = "uclpcserver-DataUpdateHeartbeat"
)
6 changes: 5 additions & 1 deletion util/heartbeat.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ func IsHeartbeat(localEntity spineapi.EntityLocalInterface, payload spineapi.Eve
//revive:disable-next-line
switch payload.Data.(type) {
case *model.DeviceDiagnosisHeartbeatDataType:
return payload.Function == "" && *payload.CmdClassifier == model.CmdClassifierTypeNotify
return payload.Function == model.FunctionTypeDeviceDiagnosisHeartbeatData &&
payload.EventType == spineapi.EventTypeDataChange &&
payload.ChangeType == spineapi.ElementChangeUpdate &&
payload.CmdClassifier != nil &&
*payload.CmdClassifier == model.CmdClassifierTypeNotify
default:
return false
}
Expand Down

0 comments on commit 551b465

Please sign in to comment.