@ -35,6 +35,8 @@ import org.thingsboard.rule.engine.api.*;
import org.thingsboard.server.common.data.alarm.Alarm ;
import org.thingsboard.server.common.data.id.DeviceId ;
import org.thingsboard.server.common.data.id.EntityId ;
import org.thingsboard.server.common.data.id.RuleChainId ;
import org.thingsboard.server.common.data.id.RuleNodeId ;
import org.thingsboard.server.common.data.id.TenantId ;
import org.thingsboard.server.common.msg.TbMsg ;
import org.thingsboard.server.common.msg.TbMsgMetaData ;
@ -73,6 +75,9 @@ public class TbAlarmNodeTest {
@Mock
private ScriptEngine detailsJs ;
private RuleChainId ruleChainId = new RuleChainId ( UUIDs . timeBased ( ) ) ;
private RuleNodeId ruleNodeId = new RuleNodeId ( UUIDs . timeBased ( ) ) ;
private ListeningExecutor dbExecutor ;
private EntityId originator = new DeviceId ( UUIDs . timeBased ( ) ) ;
@ -103,7 +108,7 @@ public class TbAlarmNodeTest {
public void newAlarmCanBeCreated ( ) throws ScriptException , IOException {
initWithScript ( ) ;
metaData . putValue ( "key" , "value" ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson , ruleChainId , ruleNodeId , 0L ) ;
when ( createJs . executeFilter ( msg ) ) . thenReturn ( true ) ;
when ( detailsJs . executeJson ( msg ) ) . thenReturn ( null ) ;
@ -113,17 +118,21 @@ public class TbAlarmNodeTest {
node . onMsg ( ctx , msg ) ;
ArgumentCaptor < TbMsg > captor = ArgumentCaptor . forClass ( TbMsg . class ) ;
verify ( ctx ) . tellNext ( captor . capture ( ) , eq ( "Created" ) ) ;
TbMsg actualMsg = captor . getValue ( ) ;
verify ( ctx ) . tellNext ( any ( ) , eq ( "Created" ) ) ;
ArgumentCaptor < String > typeCaptor = ArgumentCaptor . forClass ( String . class ) ;
ArgumentCaptor < EntityId > originatorCaptor = ArgumentCaptor . forClass ( EntityId . class ) ;
ArgumentCaptor < TbMsgMetaData > metadataCaptor = ArgumentCaptor . forClass ( TbMsgMetaData . class ) ;
ArgumentCaptor < String > dataCaptor = ArgumentCaptor . forClass ( String . class ) ;
verify ( ctx ) . newMsg ( typeCaptor . capture ( ) , originatorCaptor . capture ( ) , metadataCaptor . capture ( ) , dataCaptor . capture ( ) ) ;
assertEquals ( "ALARM" , actualMsg . getType ( ) ) ;
assertEquals ( originator , actualMsg . getOriginator ( ) ) ;
assertEquals ( "value" , actualMsg . getMetaData ( ) . getValue ( "key" ) ) ;
assertEquals ( Boolean . TRUE . toString ( ) , actualMsg . getMetaData ( ) . getValue ( IS_NEW_ALARM ) ) ;
assertNotSame ( metaData , actualMsg . getMetaData ( ) ) ;
assertEquals ( "ALARM" , typeCaptor . getValu e( ) ) ;
assertEquals ( originator , originatorCaptor . getValue ( ) ) ;
assertEquals ( "value" , metadataCaptor . getValue ( ) . getValue ( "key" ) ) ;
assertEquals ( Boolean . TRUE . toString ( ) , metadataCaptor . getValue ( ) . getValue ( IS_NEW_ALARM ) ) ;
assertNotSame ( metaData , metadataCaptor . getValue ( ) ) ;
Alarm actualAlarm = new ObjectMapper ( ) . readValue ( actualMsg . getData ( ) . getBytes ( ) , Alarm . class ) ;
Alarm actualAlarm = new ObjectMapper ( ) . readValue ( dataCaptor . getValue ( ) . getBytes ( ) , Alarm . class ) ;
Alarm expectedAlarm = Alarm . builder ( )
. tenantId ( tenantId )
. originator ( originator )
@ -143,7 +152,7 @@ public class TbAlarmNodeTest {
public void shouldCreateScriptThrowsException ( ) throws ScriptException {
initWithScript ( ) ;
metaData . putValue ( "key" , "value" ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson , ruleChainId , ruleNodeId , 0L ) ;
when ( createJs . executeFilter ( msg ) ) . thenThrow ( new NotImplementedException ( "message" ) ) ;
@ -165,7 +174,7 @@ public class TbAlarmNodeTest {
public void buildDetailsThrowsException ( ) throws ScriptException , IOException {
initWithScript ( ) ;
metaData . putValue ( "key" , "value" ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson , ruleChainId , ruleNodeId , 0L ) ;
when ( createJs . executeFilter ( msg ) ) . thenReturn ( true ) ;
when ( detailsJs . executeJson ( msg ) ) . thenThrow ( new NotImplementedException ( "message" ) ) ;
@ -191,7 +200,7 @@ public class TbAlarmNodeTest {
public void ifAlarmClearedCreateNew ( ) throws ScriptException , IOException {
initWithScript ( ) ;
metaData . putValue ( "key" , "value" ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson , ruleChainId , ruleNodeId , 0L ) ;
Alarm clearedAlarm = Alarm . builder ( ) . status ( CLEARED_ACK ) . build ( ) ;
@ -203,17 +212,22 @@ public class TbAlarmNodeTest {
node . onMsg ( ctx , msg ) ;
ArgumentCaptor < TbMsg > captor = ArgumentCaptor . forClass ( TbMsg . class ) ;
verify ( ctx ) . tellNext ( captor . capture ( ) , eq ( "Created" ) ) ;
TbMsg actualMsg = captor . getValue ( ) ;
verify ( ctx ) . tellNext ( any ( ) , eq ( "Created" ) ) ;
ArgumentCaptor < String > typeCaptor = ArgumentCaptor . forClass ( String . class ) ;
ArgumentCaptor < EntityId > originatorCaptor = ArgumentCaptor . forClass ( EntityId . class ) ;
ArgumentCaptor < TbMsgMetaData > metadataCaptor = ArgumentCaptor . forClass ( TbMsgMetaData . class ) ;
ArgumentCaptor < String > dataCaptor = ArgumentCaptor . forClass ( String . class ) ;
verify ( ctx ) . newMsg ( typeCaptor . capture ( ) , originatorCaptor . capture ( ) , metadataCaptor . capture ( ) , dataCaptor . capture ( ) ) ;
assertEquals ( "ALARM" , actualMsg . getType ( ) ) ;
assertEquals ( originator , actualMsg . getOriginator ( ) ) ;
assertEquals ( "value" , actualMsg . getMetaData ( ) . getValue ( "key" ) ) ;
assertEquals ( Boolean . TRUE . toString ( ) , actualMsg . getMetaData ( ) . getValue ( IS_NEW_ALARM ) ) ;
assertNotSame ( metaData , actualMsg . getMetaData ( ) ) ;
assertEquals ( "ALARM" , typeCaptor . getValu e( ) ) ;
assertEquals ( originator , originatorCaptor . getValue ( ) ) ;
assertEquals ( "value" , metadataCaptor . getValue ( ) . getValue ( "key" ) ) ;
assertEquals ( Boolean . TRUE . toString ( ) , metadataCaptor . getValue ( ) . getValue ( IS_NEW_ALARM ) ) ;
assertNotSame ( metaData , metadataCaptor . getValue ( ) ) ;
Alarm actualAlarm = new ObjectMapper ( ) . readValue ( actualMsg . getData ( ) . getBytes ( ) , Alarm . class ) ;
Alarm actualAlarm = new ObjectMapper ( ) . readValue ( dataCaptor . getValue ( ) . getBytes ( ) , Alarm . class ) ;
Alarm expectedAlarm = Alarm . builder ( )
. tenantId ( tenantId )
. originator ( originator )
@ -233,7 +247,7 @@ public class TbAlarmNodeTest {
public void alarmCanBeUpdated ( ) throws ScriptException , IOException {
initWithScript ( ) ;
metaData . putValue ( "key" , "value" ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson , ruleChainId , ruleNodeId , 0L ) ;
long oldEndDate = System . currentTimeMillis ( ) ;
Alarm activeAlarm = Alarm . builder ( ) . type ( "SomeType" ) . tenantId ( tenantId ) . originator ( originator ) . status ( ACTIVE_UNACK ) . severity ( WARNING ) . endTs ( oldEndDate ) . build ( ) ;
@ -247,17 +261,21 @@ public class TbAlarmNodeTest {
node . onMsg ( ctx , msg ) ;
ArgumentCaptor < TbMsg > captor = ArgumentCaptor . forClass ( TbMsg . class ) ;
verify ( ctx ) . tellNext ( captor . capture ( ) , eq ( "Updated" ) ) ;
TbMsg actualMsg = captor . getValue ( ) ;
verify ( ctx ) . tellNext ( any ( ) , eq ( "Updated" ) ) ;
ArgumentCaptor < String > typeCaptor = ArgumentCaptor . forClass ( String . class ) ;
ArgumentCaptor < EntityId > originatorCaptor = ArgumentCaptor . forClass ( EntityId . class ) ;
ArgumentCaptor < TbMsgMetaData > metadataCaptor = ArgumentCaptor . forClass ( TbMsgMetaData . class ) ;
ArgumentCaptor < String > dataCaptor = ArgumentCaptor . forClass ( String . class ) ;
verify ( ctx ) . newMsg ( typeCaptor . capture ( ) , originatorCaptor . capture ( ) , metadataCaptor . capture ( ) , dataCaptor . capture ( ) ) ;
assertEquals ( "ALARM" , actualMsg . getType ( ) ) ;
assertEquals ( originator , actualMsg . getOriginator ( ) ) ;
assertEquals ( "value" , actualMsg . getMetaData ( ) . getValue ( "key" ) ) ;
assertEquals ( Boolean . TRUE . toString ( ) , actualMsg . getMetaData ( ) . getValue ( IS_EXISTING_ALARM ) ) ;
assertNotSame ( metaData , actualMsg . getMetaData ( ) ) ;
assertEquals ( "ALARM" , typeCaptor . getValu e( ) ) ;
assertEquals ( originator , originatorCaptor . getValue ( ) ) ;
assertEquals ( "value" , metadataCaptor . getValue ( ) . getValue ( "key" ) ) ;
assertEquals ( Boolean . TRUE . toString ( ) , metadataCaptor . getValue ( ) . getValue ( IS_EXISTING_ALARM ) ) ;
assertNotSame ( metaData , metadataCaptor . getValue ( ) ) ;
Alarm actualAlarm = new ObjectMapper ( ) . readValue ( actualMsg . getData ( ) . getBytes ( ) , Alarm . class ) ;
Alarm actualAlarm = new ObjectMapper ( ) . readValue ( dataCaptor . getValue ( ) . getBytes ( ) , Alarm . class ) ;
assertTrue ( activeAlarm . getEndTs ( ) > oldEndDate ) ;
Alarm expectedAlarm = Alarm . builder ( )
. tenantId ( tenantId )
@ -279,7 +297,7 @@ public class TbAlarmNodeTest {
public void alarmCanBeCleared ( ) throws ScriptException , IOException {
initWithScript ( ) ;
metaData . putValue ( "key" , "value" ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson ) ;
TbMsg msg = new TbMsg ( UUIDs . timeBased ( ) , "USER" , originator , metaData , rawJson , ruleChainId , ruleNodeId , 0L ) ;
long oldEndDate = System . currentTimeMillis ( ) ;
Alarm activeAlarm = Alarm . builder ( ) . type ( "SomeType" ) . tenantId ( tenantId ) . originator ( originator ) . status ( ACTIVE_UNACK ) . severity ( WARNING ) . endTs ( oldEndDate ) . build ( ) ;
@ -293,17 +311,21 @@ public class TbAlarmNodeTest {
node . onMsg ( ctx , msg ) ;
ArgumentCaptor < TbMsg > captor = ArgumentCaptor . forClass ( TbMsg . class ) ;
verify ( ctx ) . tellNext ( captor . capture ( ) , eq ( "Cleared" ) ) ;
TbMsg actualMsg = captor . getValue ( ) ;
verify ( ctx ) . tellNext ( any ( ) , eq ( "Cleared" ) ) ;
ArgumentCaptor < String > typeCaptor = ArgumentCaptor . forClass ( String . class ) ;
ArgumentCaptor < EntityId > originatorCaptor = ArgumentCaptor . forClass ( EntityId . class ) ;
ArgumentCaptor < TbMsgMetaData > metadataCaptor = ArgumentCaptor . forClass ( TbMsgMetaData . class ) ;
ArgumentCaptor < String > dataCaptor = ArgumentCaptor . forClass ( String . class ) ;
verify ( ctx ) . newMsg ( typeCaptor . capture ( ) , originatorCaptor . capture ( ) , metadataCaptor . capture ( ) , dataCaptor . capture ( ) ) ;
assertEquals ( "ALARM" , actualMsg . getType ( ) ) ;
assertEquals ( originator , actualMsg . getOriginator ( ) ) ;
assertEquals ( "value" , actualMsg . getMetaData ( ) . getValue ( "key" ) ) ;
assertEquals ( Boolean . TRUE . toString ( ) , actualMsg . getMetaData ( ) . getValue ( IS_CLEARED_ALARM ) ) ;
assertNotSame ( metaData , actualMsg . getMetaData ( ) ) ;
assertEquals ( "ALARM" , typeCaptor . getValu e( ) ) ;
assertEquals ( originator , originatorCaptor . getValue ( ) ) ;
assertEquals ( "value" , metadataCaptor . getValue ( ) . getValue ( "key" ) ) ;
assertEquals ( Boolean . TRUE . toString ( ) , metadataCaptor . getValue ( ) . getValue ( IS_CLEARED_ALARM ) ) ;
assertNotSame ( metaData , metadataCaptor . getValue ( ) ) ;
Alarm actualAlarm = new ObjectMapper ( ) . readValue ( actualMsg . getData ( ) . getBytes ( ) , Alarm . class ) ;
Alarm actualAlarm = new ObjectMapper ( ) . readValue ( dataCaptor . getValue ( ) . getBytes ( ) , Alarm . class ) ;
Alarm expectedAlarm = Alarm . builder ( )
. tenantId ( tenantId )
. originator ( originator )