Browse Source

Refactor TbMsg.newMsg usages

pull/12256/head
ViacheslavKlimov 2 years ago
parent
commit
cbd2e012dd
  1. 47
      application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
  2. 7
      application/src/main/java/org/thingsboard/server/controller/RpcV2Controller.java
  3. 8
      application/src/main/java/org/thingsboard/server/controller/RuleChainController.java
  4. 9
      application/src/main/java/org/thingsboard/server/controller/RuleEngineController.java
  5. 9
      application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java
  6. 16
      application/src/main/java/org/thingsboard/server/service/device/DeviceProvisionServiceImpl.java
  7. 8
      application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java
  8. 9
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java
  9. 9
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java
  10. 34
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java
  11. 10
      application/src/main/java/org/thingsboard/server/service/entitiy/EntityStateSourcingListener.java
  12. 9
      application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java
  13. 7
      application/src/main/java/org/thingsboard/server/service/rpc/TbRpcService.java
  14. 9
      application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java
  15. 9
      application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java
  16. 23
      application/src/test/java/org/thingsboard/server/actors/rule/DefaultTbContextTest.java
  17. 37
      application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java
  18. 7
      application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java
  19. 16
      application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java
  20. 8
      application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java
  21. 38
      application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java
  22. 7
      application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java
  23. 7
      application/src/test/java/org/thingsboard/server/service/rpc/DefaultTbRuleEngineRpcServiceTest.java
  24. 16
      application/src/test/java/org/thingsboard/server/service/ruleengine/DefaultRuleEngineCallServiceTest.java
  25. 12
      application/src/test/java/org/thingsboard/server/service/sql/SequentialTimeseriesPersistenceTest.java
  26. 373
      common/message/src/main/java/org/thingsboard/server/common/msg/TbMsg.java
  27. 12
      common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java
  28. 3
      rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
  29. 35
      rule-engine/rule-engine-api/src/test/java/org/thingsboard/rule/engine/api/util/TbNodeUtilsTest.java
  30. 9
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java
  31. 29
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/deduplication/TbMsgDeduplicationNode.java
  32. 16
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/delay/TbMsgDelayNode.java
  33. 24
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java
  34. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAssignToCustomerNodeTest.java
  35. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbClearAlarmNodeTest.java
  36. 52
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNodeTest.java
  37. 49
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateAlarmNodeTest.java
  38. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeTest.java
  39. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbDeleteRelationNodeTest.java
  40. 22
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbDeviceStateNodeTest.java
  41. 21
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbLogNodeTest.java
  42. 21
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbMsgCountNodeTest.java
  43. 35
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbSaveToCustomCassandraTableNodeTest.java
  44. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbUnassignFromCustomerNodeTest.java
  45. 35
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNodeTest.java
  46. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/sns/TbSnsNodeTest.java
  47. 28
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/sqs/TbSqsNodeTest.java
  48. 28
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNodeTest.java
  49. 33
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java
  50. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbAssetTypeSwitchNodeTest.java
  51. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNodeTest.java
  52. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeTest.java
  53. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckRelationNodeTest.java
  54. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbDeviceTypeSwitchNodeTest.java
  55. 30
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java
  56. 10
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java
  57. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbMsgTypeFilterNodeTest.java
  58. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbMsgTypeSwitchNodeTest.java
  59. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeFilterNodeTest.java
  60. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeSwitchNodeTest.java
  61. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbAckNodeTest.java
  62. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbCheckpointNodeTest.java
  63. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbRuleChainInputNodeTest.java
  64. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbRuleChainOutputNodeTest.java
  65. 28
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNodeTest.java
  66. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/geo/TbGpsGeofencingActionNodeTest.java
  67. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/geo/TbGpsGeofencingFilterNodeTest.java
  68. 42
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/kafka/TbKafkaNodeTest.java
  69. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java
  70. 133
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/math/TbMathNodeTest.java
  71. 112
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNodeTest.java
  72. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNodeTest.java
  73. 15
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNodeTest.java
  74. 21
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java
  75. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java
  76. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetDeviceAttrNodeTest.java
  77. 42
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNodeTest.java
  78. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNodeTest.java
  79. 70
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNodeTest.java
  80. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNodeTest.java
  81. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNodeTest.java
  82. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mqtt/TbMqttNodeTest.java
  83. 53
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/DeviceStateTest.java
  84. 417
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeTest.java
  85. 21
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rabbitmq/TbRabbitMqNodeTest.java
  86. 17
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rest/TbHttpClientTest.java
  87. 20
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rest/TbRestApiCallNodeTest.java
  88. 14
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rest/TbSendRestApiCallReplyNodeTest.java
  89. 36
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNodeTest.java
  90. 140
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNodeTest.java
  91. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNodeTest.java
  92. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesNodeTest.java
  93. 28
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java
  94. 42
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java
  95. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java
  96. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java
  97. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbJsonPathNodeTest.java
  98. 20
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbMsgDeduplicationNodeTest.java
  99. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeTest.java
  100. 8
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbSplitArrayMsgNodeTest.java

47
application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java

@ -361,14 +361,18 @@ public class DefaultTbContext implements TbContext {
nodeCtx.setSelf(self); nodeCtx.setSelf(self);
} }
@Override
public TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(queueName, type, originator, null, metaData, data);
}
@Override @Override
public TbMsg newMsg(String queueName, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) { public TbMsg newMsg(String queueName, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return TbMsg.newMsg(queueName, type, originator, customerId, metaData, data, nodeCtx.getSelf().getRuleChainId(), nodeCtx.getSelf().getId()); return TbMsg.builder()
.queueName(queueName)
.type(type)
.originator(originator)
.customerId(customerId)
.metaData(metaData.copy())
.data(data)
.ruleChainId(nodeCtx.getSelf().getRuleChainId())
.ruleNodeId(nodeCtx.getSelf().getId())
.build();
} }
@Override @Override
@ -383,7 +387,16 @@ public class DefaultTbContext implements TbContext {
@Override @Override
public TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) { public TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return TbMsg.newMsg(queueName, type, originator, customerId, metaData, data, nodeCtx.getSelf().getRuleChainId(), nodeCtx.getSelf().getId()); return TbMsg.builder()
.queueName(queueName)
.type(type)
.originator(originator)
.customerId(customerId)
.metaData(metaData.copy())
.data(data)
.ruleChainId(nodeCtx.getSelf().getRuleChainId())
.ruleNodeId(nodeCtx.getSelf().getId())
.build();
} }
@Override @Override
@ -497,7 +510,15 @@ public class DefaultTbContext implements TbContext {
defaultQueueName = profile.getDefaultQueueName(); defaultQueueName = profile.getDefaultQueueName();
defaultRuleChainId = profile.getDefaultRuleChainId(); defaultRuleChainId = profile.getDefaultRuleChainId();
} }
return TbMsg.newMsg(defaultQueueName, action, id, msgMetaData, msgData, defaultRuleChainId, null); return TbMsg.builder()
.queueName(defaultQueueName)
.type(action)
.originator(id)
.metaData(msgMetaData.copy())
.data(msgData)
.ruleChainId(defaultRuleChainId)
.ruleNodeId(null)
.build();
} }
public <E, I extends EntityId, K extends HasRuleEngineProfile> TbMsg entityActionMsg(E entity, I id, RuleNodeId ruleNodeId, TbMsgType actionMsgType, K profile) { public <E, I extends EntityId, K extends HasRuleEngineProfile> TbMsg entityActionMsg(E entity, I id, RuleNodeId ruleNodeId, TbMsgType actionMsgType, K profile) {
@ -515,7 +536,15 @@ public class DefaultTbContext implements TbContext {
defaultQueueName = profile.getDefaultQueueName(); defaultQueueName = profile.getDefaultQueueName();
defaultRuleChainId = profile.getDefaultRuleChainId(); defaultRuleChainId = profile.getDefaultRuleChainId();
} }
return TbMsg.newMsg(defaultQueueName, actionMsgType, id, msgMetaData, msgData, defaultRuleChainId, null); return TbMsg.builder()
.queueName(defaultQueueName)
.type(actionMsgType)
.originator(id)
.metaData(msgMetaData.copy())
.data(msgData)
.ruleChainId(defaultRuleChainId)
.ruleNodeId(null)
.build();
} }
@Override @Override

7
application/src/main/java/org/thingsboard/server/controller/RpcV2Controller.java

@ -239,7 +239,12 @@ public class RpcV2Controller extends AbstractRpcController {
rpcService.deleteRpc(getTenantId(), rpcId); rpcService.deleteRpc(getTenantId(), rpcId);
rpc.setStatus(RpcStatus.DELETED); rpc.setStatus(RpcStatus.DELETED);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_DELETED, rpc.getDeviceId(), TbMsgMetaData.EMPTY, JacksonUtil.toString(rpc)); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_DELETED)
.originator(rpc.getDeviceId())
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.toString(rpc))
.build();
tbClusterService.pushMsgToRuleEngine(getTenantId(), rpc.getDeviceId(), msg, null); tbClusterService.pushMsgToRuleEngine(getTenantId(), rpc.getDeviceId(), msg, null);
} }
} }

8
application/src/main/java/org/thingsboard/server/controller/RuleChainController.java

@ -384,7 +384,13 @@ public class RuleChainController extends BaseController {
} }
engine = new RuleNodeTbelScriptEngine(getTenantId(), tbelInvokeService, script, argNames); engine = new RuleNodeTbelScriptEngine(getTenantId(), tbelInvokeService, script, argNames);
} }
TbMsg inMsg = TbMsg.newMsg(msgType, null, new TbMsgMetaData(metadata), TbMsgDataType.JSON, data); TbMsg inMsg = TbMsg.builder()
.type(msgType)
.originator(null)
.metaData(new TbMsgMetaData(metadata).copy())
.dataType(TbMsgDataType.JSON)
.data(data)
.build();
switch (scriptType) { switch (scriptType) {
case "update": case "update":
output = msgToOutput(engine.executeUpdateAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS)); output = msgToOutput(engine.executeUpdateAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS));

9
application/src/main/java/org/thingsboard/server/controller/RuleEngineController.java

@ -169,7 +169,14 @@ public class RuleEngineController extends BaseController {
metaData.put("serviceId", serviceInfoProvider.getServiceId()); metaData.put("serviceId", serviceInfoProvider.getServiceId());
metaData.put("requestUUID", requestId.toString()); metaData.put("requestUUID", requestId.toString());
metaData.put("expirationTime", Long.toString(expTime)); metaData.put("expirationTime", Long.toString(expTime));
TbMsg msg = TbMsg.newMsg(queueName, TbMsgType.REST_API_REQUEST, entityId, currentUser.getCustomerId(), new TbMsgMetaData(metaData), requestBody); TbMsg msg = TbMsg.builder()
.queueName(queueName)
.type(TbMsgType.REST_API_REQUEST)
.originator(entityId)
.customerId(currentUser.getCustomerId())
.metaData(new TbMsgMetaData(metaData).copy())
.data(requestBody)
.build();
ruleEngineCallService.processRestApiCallToRuleEngine(currentUser.getTenantId(), requestId, msg, queueName != null, ruleEngineCallService.processRestApiCallToRuleEngine(currentUser.getTenantId(), requestId, msg, queueName != null,
reply -> reply(new LocalRequestMetaData(msg, currentUser, result), reply)); reply -> reply(new LocalRequestMetaData(msg, currentUser, result), reply));
} }

9
application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java

@ -172,7 +172,14 @@ public class EntityActionService {
if (tenantId != null && !tenantId.isSysTenantId()) { if (tenantId != null && !tenantId.isSysTenantId()) {
processNotificationRules(tenantId, entityId, entity, actionType, user, additionalInfo); processNotificationRules(tenantId, entityId, entity, actionType, user, additionalInfo);
} }
TbMsg tbMsg = TbMsg.newMsg(msgType.get(), entityId, customerId, metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode)); TbMsg tbMsg = TbMsg.builder()
.type(msgType.get())
.originator(entityId)
.customerId(customerId)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(entityNode))
.build();
tbClusterService.pushMsgToRuleEngine(tenantId, entityId, tbMsg, null); tbClusterService.pushMsgToRuleEngine(tenantId, entityId, tbMsg, null);
} catch (Exception e) { } catch (Exception e) {
log.warn("[{}] Failed to push entity action to rule engine: {}", entityId, actionType, e); log.warn("[{}] Failed to push entity action to rule engine: {}", entityId, actionType, e);

16
application/src/main/java/org/thingsboard/server/service/device/DeviceProvisionServiceImpl.java

@ -253,7 +253,13 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
private void pushProvisionEventToRuleEngine(ProvisionRequest request, Device device, TbMsgType type) { private void pushProvisionEventToRuleEngine(ProvisionRequest request, Device device, TbMsgType type) {
try { try {
JsonNode entityNode = JacksonUtil.valueToTree(request); JsonNode entityNode = JacksonUtil.valueToTree(request);
TbMsg msg = TbMsg.newMsg(type, device.getId(), device.getCustomerId(), createTbMsgMetaData(device), JacksonUtil.toString(entityNode)); TbMsg msg = TbMsg.builder()
.type(type)
.originator(device.getId())
.customerId(device.getCustomerId())
.metaData(createTbMsgMetaData(device).copy())
.data(JacksonUtil.toString(entityNode))
.build();
sendToRuleEngine(device.getTenantId(), msg, null); sendToRuleEngine(device.getTenantId(), msg, null);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), type, e); log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), type, e);
@ -263,7 +269,13 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
private void pushDeviceCreatedEventToRuleEngine(Device device) { private void pushDeviceCreatedEventToRuleEngine(Device device) {
try { try {
ObjectNode entityNode = JacksonUtil.OBJECT_MAPPER.valueToTree(device); ObjectNode entityNode = JacksonUtil.OBJECT_MAPPER.valueToTree(device);
TbMsg msg = TbMsg.newMsg(TbMsgType.ENTITY_CREATED, device.getId(), device.getCustomerId(), createTbMsgMetaData(device), JacksonUtil.OBJECT_MAPPER.writeValueAsString(entityNode)); TbMsg msg = TbMsg.builder()
.type(TbMsgType.ENTITY_CREATED)
.originator(device.getId())
.customerId(device.getCustomerId())
.metaData(createTbMsgMetaData(device).copy())
.data(JacksonUtil.OBJECT_MAPPER.writeValueAsString(entityNode))
.build();
sendToRuleEngine(device.getTenantId(), msg, null); sendToRuleEngine(device.getTenantId(), msg, null);
} catch (JsonProcessingException | IllegalArgumentException e) { } catch (JsonProcessingException | IllegalArgumentException e) {
log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), TbMsgType.ENTITY_CREATED.name(), e); log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), TbMsgType.ENTITY_CREATED.name(), e);

8
application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java

@ -575,7 +575,13 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
md.putValue("edgeName", edge.getName()); md.putValue("edgeName", edge.getName());
md.putValue("edgeType", edge.getType()); md.putValue("edgeType", edge.getType());
} }
TbMsg tbMsg = TbMsg.newMsg(msgType, edgeId, md, TbMsgDataType.JSON, data); TbMsg tbMsg = TbMsg.builder()
.type(msgType)
.originator(edgeId)
.metaData(md.copy())
.dataType(TbMsgDataType.JSON)
.data(data)
.build();
clusterService.pushMsgToRuleEngine(tenantId, edgeId, tbMsg, null); clusterService.pushMsgToRuleEngine(tenantId, edgeId, tbMsg, null);
} catch (Exception e) { } catch (Exception e) {
log.warn("[{}][{}] Failed to push {}", tenantId, edge.getId(), msgType, e); log.warn("[{}][{}] Failed to push {}", tenantId, edge.getId(), msgType, e);

9
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java

@ -343,7 +343,14 @@ public abstract class BaseEdgeProcessor {
protected void pushEntityEventToRuleEngine(TenantId tenantId, EntityId entityId, CustomerId customerId, protected void pushEntityEventToRuleEngine(TenantId tenantId, EntityId entityId, CustomerId customerId,
TbMsgType msgType, String msgData, TbMsgMetaData metaData) { TbMsgType msgType, String msgData, TbMsgMetaData metaData) {
TbMsg tbMsg = TbMsg.newMsg(msgType, entityId, customerId, metaData, TbMsgDataType.JSON, msgData); TbMsg tbMsg = TbMsg.builder()
.type(msgType)
.originator(entityId)
.customerId(customerId)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(msgData)
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, entityId, tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, entityId, tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {

9
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java

@ -190,8 +190,13 @@ public abstract class DeviceEdgeProcessor extends BaseDeviceProcessor implements
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("method", deviceRpcCallMsg.getRequestMsg().getMethod()); data.put("method", deviceRpcCallMsg.getRequestMsg().getMethod());
data.put("params", deviceRpcCallMsg.getRequestMsg().getParams()); data.put("params", deviceRpcCallMsg.getRequestMsg().getParams());
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.TO_SERVER_RPC_REQUEST, deviceId, null, metaData, TbMsg tbMsg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data)); .type(TbMsgType.TO_SERVER_RPC_REQUEST)
.originator(deviceId)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, deviceId, tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, deviceId, tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {

34
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java

@ -208,7 +208,16 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
JsonObject json = JsonUtils.getJsonObject(tsKv.getKvList()); JsonObject json = JsonUtils.getJsonObject(tsKv.getKvList());
metaData.putValue("ts", tsKv.getTs() + ""); metaData.putValue("ts", tsKv.getTs() + "");
var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId);
TbMsg tbMsg = TbMsg.newMsg(defaultQueueAndRuleChain.getKey(), TbMsgType.POST_TELEMETRY_REQUEST, entityId, customerId, metaData, gson.toJson(json), defaultQueueAndRuleChain.getValue(), null); TbMsg tbMsg = TbMsg.builder()
.queueName(defaultQueueAndRuleChain.getKey())
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(entityId)
.customerId(customerId)
.metaData(metaData.copy())
.data(gson.toJson(json))
.ruleChainId(defaultQueueAndRuleChain.getValue())
.ruleNodeId(null)
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {
@ -252,7 +261,16 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
SettableFuture<Void> futureToSet = SettableFuture.create(); SettableFuture<Void> futureToSet = SettableFuture.create();
JsonObject json = JsonUtils.getJsonObject(msg.getKvList()); JsonObject json = JsonUtils.getJsonObject(msg.getKvList());
var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId);
TbMsg tbMsg = TbMsg.newMsg(defaultQueueAndRuleChain.getKey(), TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, customerId, metaData, gson.toJson(json), defaultQueueAndRuleChain.getValue(), null); TbMsg tbMsg = TbMsg.builder()
.queueName(defaultQueueAndRuleChain.getKey())
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.customerId(customerId)
.metaData(metaData.copy())
.data(gson.toJson(json))
.ruleChainId(defaultQueueAndRuleChain.getValue())
.ruleNodeId(null)
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {
@ -281,8 +299,16 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
@Override @Override
public void onSuccess(@Nullable Void tmp) { public void onSuccess(@Nullable Void tmp) {
var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId); var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId);
TbMsg tbMsg = TbMsg.newMsg(defaultQueueAndRuleChain.getKey(), TbMsgType.ATTRIBUTES_UPDATED, entityId, TbMsg tbMsg = TbMsg.builder()
customerId, metaData, gson.toJson(json), defaultQueueAndRuleChain.getValue(), null); .queueName(defaultQueueAndRuleChain.getKey())
.type(TbMsgType.ATTRIBUTES_UPDATED)
.originator(entityId)
.customerId(customerId)
.metaData(metaData.copy())
.data(gson.toJson(json))
.ruleChainId(defaultQueueAndRuleChain.getValue())
.ruleNodeId(null)
.build();
edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() { edgeCtx.getClusterService().pushMsgToRuleEngine(tenantId, tbMsg.getOriginator(), tbMsg, new TbQueueCallback() {
@Override @Override
public void onSuccess(TbQueueMsgMetadata metadata) { public void onSuccess(TbQueueMsgMetadata metadata) {

10
application/src/main/java/org/thingsboard/server/service/entitiy/EntityStateSourcingListener.java

@ -250,8 +250,14 @@ public class EntityStateSourcingListener {
private void pushAssignedFromNotification(Tenant currentTenant, TenantId newTenantId, Device assignedDevice) { private void pushAssignedFromNotification(Tenant currentTenant, TenantId newTenantId, Device assignedDevice) {
String data = JacksonUtil.toString(JacksonUtil.valueToTree(assignedDevice)); String data = JacksonUtil.toString(JacksonUtil.valueToTree(assignedDevice));
if (data != null) { if (data != null) {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.ENTITY_ASSIGNED_FROM_TENANT, assignedDevice.getId(), TbMsg tbMsg = TbMsg.builder()
assignedDevice.getCustomerId(), getMetaDataForAssignedFrom(currentTenant), TbMsgDataType.JSON, data); .type(TbMsgType.ENTITY_ASSIGNED_FROM_TENANT)
.originator(assignedDevice.getId())
.customerId(assignedDevice.getCustomerId())
.metaData(getMetaDataForAssignedFrom(currentTenant).copy())
.dataType(TbMsgDataType.JSON)
.data(data)
.build();
tbClusterService.pushMsgToRuleEngine(newTenantId, assignedDevice.getId(), tbMsg, null); tbClusterService.pushMsgToRuleEngine(newTenantId, assignedDevice.getId(), tbMsg, null);
} }
} }

9
application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java

@ -183,7 +183,14 @@ public class DefaultTbCoreDeviceRpcService implements TbCoreDeviceRpcService {
entityNode.put(DataConstants.ADDITIONAL_INFO, msg.getAdditionalInfo()); entityNode.put(DataConstants.ADDITIONAL_INFO, msg.getAdditionalInfo());
try { try {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, msg.getDeviceId(), Optional.ofNullable(currentUser).map(User::getCustomerId).orElse(null), metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode)); TbMsg tbMsg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(msg.getDeviceId())
.customerId(Optional.ofNullable(currentUser).map(User::getCustomerId).orElse(null))
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(entityNode))
.build();
clusterService.pushMsgToRuleEngine(msg.getTenantId(), msg.getDeviceId(), tbMsg, null); clusterService.pushMsgToRuleEngine(msg.getTenantId(), msg.getDeviceId(), tbMsg, null);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new RuntimeException(e); throw new RuntimeException(e);

7
application/src/main/java/org/thingsboard/server/service/rpc/TbRpcService.java

@ -63,7 +63,12 @@ public class TbRpcService {
} }
private void pushRpcMsgToRuleEngine(TenantId tenantId, Rpc rpc) { private void pushRpcMsgToRuleEngine(TenantId tenantId, Rpc rpc) {
TbMsg msg = TbMsg.newMsg(TbMsgType.valueOf("RPC_" + rpc.getStatus().name()), rpc.getDeviceId(), TbMsgMetaData.EMPTY, JacksonUtil.toString(rpc)); TbMsg msg = TbMsg.builder()
.type(TbMsgType.valueOf("RPC_" + rpc.getStatus().name()))
.originator(rpc.getDeviceId())
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.toString(rpc))
.build();
tbClusterService.pushMsgToRuleEngine(tenantId, rpc.getDeviceId(), msg, null); tbClusterService.pushMsgToRuleEngine(tenantId, rpc.getDeviceId(), msg, null);
} }

9
application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java

@ -857,7 +857,14 @@ public class DefaultDeviceStateService extends AbstractPartitionBasedService<Dev
if (!persistToTelemetry) { if (!persistToTelemetry) {
md.putValue(SCOPE, SERVER_SCOPE); md.putValue(SCOPE, SERVER_SCOPE);
} }
TbMsg tbMsg = TbMsg.newMsg(msgType, stateData.getDeviceId(), stateData.getCustomerId(), md, TbMsgDataType.JSON, data); TbMsg tbMsg = TbMsg.builder()
.type(msgType)
.originator(stateData.getDeviceId())
.customerId(stateData.getCustomerId())
.metaData(md.copy())
.dataType(TbMsgDataType.JSON)
.data(data)
.build();
clusterService.pushMsgToRuleEngine(stateData.getTenantId(), stateData.getDeviceId(), tbMsg, null); clusterService.pushMsgToRuleEngine(stateData.getTenantId(), stateData.getDeviceId(), tbMsg, null);
} catch (Exception e) { } catch (Exception e) {
log.warn("[{}] Failed to push inactivity alarm: {}", stateData.getDeviceId(), state, e); log.warn("[{}] Failed to push inactivity alarm: {}", stateData.getDeviceId(), state, e);

9
application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java

@ -362,7 +362,14 @@ public class DefaultTransportApiService implements TransportApiService {
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
JsonNode entityNode = JacksonUtil.valueToTree(device); JsonNode entityNode = JacksonUtil.valueToTree(device);
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.ENTITY_CREATED, deviceId, customerId, metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode)); TbMsg tbMsg = TbMsg.builder()
.type(TbMsgType.ENTITY_CREATED)
.originator(deviceId)
.customerId(customerId)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(entityNode))
.build();
tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, null); tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, null);
} else { } else {
JsonNode deviceAdditionalInfo = device.getAdditionalInfo(); JsonNode deviceAdditionalInfo = device.getAdditionalInfo();

23
application/src/test/java/org/thingsboard/server/actors/rule/DefaultTbContextTest.java

@ -928,15 +928,32 @@ class DefaultTbContextTest {
} }
private TbMsg getTbMsgWithCallback(TbMsgCallback callback) { private TbMsg getTbMsgWithCallback(TbMsgCallback callback) {
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TENANT_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING, callback); return TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TENANT_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.callback(callback)
.build();
} }
private TbMsg getTbMsgWithQueueName() { private TbMsg getTbMsgWithQueueName() {
return TbMsg.newMsg(DataConstants.MAIN_QUEUE_NAME, TbMsgType.POST_TELEMETRY_REQUEST, TENANT_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); return TbMsg.builder()
.queueName(DataConstants.MAIN_QUEUE_NAME)
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TENANT_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
} }
private TbMsg getTbMsg() { private TbMsg getTbMsg() {
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TENANT_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); return TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TENANT_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
} }
private static long getUntilTime() { private static long getUntilTime() {

37
application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java

@ -62,7 +62,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
@Test @Test
public void testHandleRuleEngineRequestWithMsgOriginatorUser() throws Exception { public void testHandleRuleEngineRequestWithMsgOriginatorUser() throws Exception {
loginSysAdmin(); loginSysAdmin();
TbMsg responseMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, currentUserId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(currentUserId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/", REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/", REQUEST_BODY, new TypeReference<>() {
@ -86,7 +91,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
Device device = createDevice("Test", "123"); Device device = createDevice("Test", "123");
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
TbMsg responseMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() {
@ -110,7 +120,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
Device device = createDevice("Test", "123"); Device device = createDevice("Test", "123");
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
TbMsg responseMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/15000", REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/15000", REQUEST_BODY, new TypeReference<>() {
@ -156,7 +171,13 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
Device device = createDevice("Test", "123"); Device device = createDevice("Test", "123");
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
TbMsg responseMsg = TbMsg.newMsg(DataConstants.HP_QUEUE_NAME, TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.builder()
.queueName(DataConstants.HP_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/HighPriority/1000", REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/HighPriority/1000", REQUEST_BODY, new TypeReference<>() {
@ -195,7 +216,13 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
assignDeviceToCustomer(deviceId, customerId); assignDeviceToCustomer(deviceId, customerId);
loginCustomerUser(); loginCustomerUser();
TbMsg responseMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, customerId, TbMsgMetaData.EMPTY, RESPONSE_BODY); TbMsg responseMsg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.customerId(customerId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(RESPONSE_BODY)
.build();
mockRestApiCallToRuleEngine(responseMsg); mockRestApiCallToRuleEngine(responseMsg);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() { JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() {

7
application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java

@ -743,7 +743,12 @@ public class TenantControllerTest extends AbstractControllerTest {
} }
private TbMsg publishTbMsg(TenantId tenantId, TopicPartitionInfo tpi) { private TbMsg publishTbMsg(TenantId tenantId, TopicPartitionInfo tpi) {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, tenantId, TbMsgMetaData.EMPTY, "{\"test\":1}"); TbMsg tbMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(tenantId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("{\"test\":1}")
.build();
TransportProtos.ToRuleEngineMsg msg = TransportProtos.ToRuleEngineMsg.newBuilder() TransportProtos.ToRuleEngineMsg msg = TransportProtos.ToRuleEngineMsg.newBuilder()
.setTenantIdMSB(tenantId.getId().getMostSignificantBits()) .setTenantIdMSB(tenantId.getId().getMostSignificantBits())
.setTenantIdLSB(tenantId.getId().getLeastSignificantBits()) .setTenantIdLSB(tenantId.getId().getLeastSignificantBits())

16
application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java

@ -184,7 +184,13 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class); TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true); Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true);
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, device.getId(), TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, tbMsgCallback); TbMsg tbMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(device.getId())
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(tbMsgCallback)
.build();
QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null); QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null);
// Pushing Message to the system // Pushing Message to the system
actorSystem.tell(qMsg); actorSystem.tell(qMsg);
@ -309,7 +315,13 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class); TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true); Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true);
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, device.getId(), TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, tbMsgCallback); TbMsg tbMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(device.getId())
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(tbMsgCallback)
.build();
QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null); QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null);
// Pushing Message to the system // Pushing Message to the system
actorSystem.tell(qMsg); actorSystem.tell(qMsg);

8
application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java

@ -142,7 +142,13 @@ public abstract class AbstractRuleEngineLifecycleIntegrationTest extends Abstrac
log.warn("attr updated"); log.warn("attr updated");
TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class); TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true); Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true);
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, device.getId(), TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, tbMsgCallback); TbMsg tbMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(device.getId())
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(tbMsgCallback)
.build();
QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(tenantId, tbMsg, null, null); QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(tenantId, tbMsg, null, null);
// Pushing Message to the system // Pushing Message to the system
log.warn("before tell tbMsgCallback"); log.warn("before tell tbMsgCallback");

38
application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java

@ -291,7 +291,13 @@ public class DefaultTbClusterServiceTest {
TbQueueCallback callback = mock(TbQueueCallback.class); TbQueueCallback callback = mock(TbQueueCallback.class);
TenantId tenantId = TenantId.fromUUID(UUID.fromString("3c8bd350-1239-4a3b-b9c3-4dd76f8e20f1")); TenantId tenantId = TenantId.fromUUID(UUID.fromString("3c8bd350-1239-4a3b-b9c3-4dd76f8e20f1"));
TbMsg requestMsg = TbMsg.newMsg(DataConstants.HP_QUEUE_NAME, TbMsgType.REST_API_REQUEST, tenantId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg requestMsg = TbMsg.builder()
.queueName(DataConstants.HP_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(tenantId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer); when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer);
@ -305,7 +311,12 @@ public class DefaultTbClusterServiceTest {
public void testPushMsgToRuleEngineWithTenantIdIsNullUuidAndEntityIsDevice() { public void testPushMsgToRuleEngineWithTenantIdIsNullUuidAndEntityIsDevice() {
TenantId tenantId = TenantId.SYS_TENANT_ID; TenantId tenantId = TenantId.SYS_TENANT_ID;
DeviceId deviceId = new DeviceId(UUID.fromString("aa6d112d-2914-4a22-a9e3-bee33edbdb14")); DeviceId deviceId = new DeviceId(UUID.fromString("aa6d112d-2914-4a22-a9e3-bee33edbdb14"));
TbMsg requestMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg requestMsg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
TbQueueCallback callback = mock(TbQueueCallback.class); TbQueueCallback callback = mock(TbQueueCallback.class);
clusterService.pushMsgToRuleEngine(tenantId, deviceId, requestMsg, false, callback); clusterService.pushMsgToRuleEngine(tenantId, deviceId, requestMsg, false, callback);
@ -321,7 +332,13 @@ public class DefaultTbClusterServiceTest {
TenantId tenantId = TenantId.fromUUID(UUID.fromString("3c8bd350-1239-4a3b-b9c3-4dd76f8e20f1")); TenantId tenantId = TenantId.fromUUID(UUID.fromString("3c8bd350-1239-4a3b-b9c3-4dd76f8e20f1"));
DeviceId deviceId = new DeviceId(UUID.fromString("adbb9d41-3367-40fd-9e74-7dd7cc5d30cf")); DeviceId deviceId = new DeviceId(UUID.fromString("adbb9d41-3367-40fd-9e74-7dd7cc5d30cf"));
DeviceProfile deviceProfile = new DeviceProfile(new DeviceProfileId(UUID.fromString("552f5d6d-0b2b-43e1-a7d2-a51cb2a96927"))); DeviceProfile deviceProfile = new DeviceProfile(new DeviceProfileId(UUID.fromString("552f5d6d-0b2b-43e1-a7d2-a51cb2a96927")));
TbMsg requestMsg = TbMsg.newMsg(DataConstants.HP_QUEUE_NAME, TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg requestMsg = TbMsg.builder()
.queueName(DataConstants.HP_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
when(deviceProfileCache.get(any(TenantId.class), any(DeviceId.class))).thenReturn(deviceProfile); when(deviceProfileCache.get(any(TenantId.class), any(DeviceId.class))).thenReturn(deviceProfile);
when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer); when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer);
@ -341,7 +358,12 @@ public class DefaultTbClusterServiceTest {
DeviceId deviceId = new DeviceId(UUID.fromString("016c2abb-f46f-49f9-a83d-4d28b803cfe6")); DeviceId deviceId = new DeviceId(UUID.fromString("016c2abb-f46f-49f9-a83d-4d28b803cfe6"));
DeviceProfile deviceProfile = new DeviceProfile(new DeviceProfileId(UUID.fromString("dc5766e2-1a32-4022-859b-743050097ab7"))); DeviceProfile deviceProfile = new DeviceProfile(new DeviceProfileId(UUID.fromString("dc5766e2-1a32-4022-859b-743050097ab7")));
deviceProfile.setDefaultQueueName(DataConstants.MAIN_QUEUE_NAME); deviceProfile.setDefaultQueueName(DataConstants.MAIN_QUEUE_NAME);
TbMsg requestMsg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg requestMsg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
when(deviceProfileCache.get(any(TenantId.class), any(DeviceId.class))).thenReturn(deviceProfile); when(deviceProfileCache.get(any(TenantId.class), any(DeviceId.class))).thenReturn(deviceProfile);
when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer); when(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer);
@ -375,12 +397,12 @@ public class DefaultTbClusterServiceTest {
device.setDeviceProfileId(deviceProfileId); device.setDeviceProfileId(deviceProfileId);
// device updated // device updated
TbMsg tbMsg = TbMsg.builder().internalType(TbMsgType.ENTITY_UPDATED).build(); TbMsg tbMsg = TbMsg.builder().type(TbMsgType.ENTITY_UPDATED).build();
((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, deviceId, tbMsg); ((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, deviceId, tbMsg);
verify(deviceProfileCache, times(1)).get(tenantId, deviceId); verify(deviceProfileCache, times(1)).get(tenantId, deviceId);
// device deleted // device deleted
tbMsg = TbMsg.builder().internalType(TbMsgType.ENTITY_DELETED).data(JacksonUtil.toString(device)).build(); tbMsg = TbMsg.builder().type(TbMsgType.ENTITY_DELETED).data(JacksonUtil.toString(device)).build();
((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, deviceId, tbMsg); ((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, deviceId, tbMsg);
verify(deviceProfileCache, times(1)).get(tenantId, deviceProfileId); verify(deviceProfileCache, times(1)).get(tenantId, deviceProfileId);
} }
@ -395,12 +417,12 @@ public class DefaultTbClusterServiceTest {
asset.setAssetProfileId(assetProfileId); asset.setAssetProfileId(assetProfileId);
// asset updated // asset updated
TbMsg tbMsg = TbMsg.builder().internalType(TbMsgType.ENTITY_UPDATED).build(); TbMsg tbMsg = TbMsg.builder().type(TbMsgType.ENTITY_UPDATED).build();
((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, assetId, tbMsg); ((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, assetId, tbMsg);
verify(assetProfileCache, times(1)).get(tenantId, assetId); verify(assetProfileCache, times(1)).get(tenantId, assetId);
// asset deleted // asset deleted
tbMsg = TbMsg.builder().internalType(TbMsgType.ENTITY_DELETED).data(JacksonUtil.toString(asset)).build(); tbMsg = TbMsg.builder().type(TbMsgType.ENTITY_DELETED).data(JacksonUtil.toString(asset)).build();
((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, assetId, tbMsg); ((DefaultTbClusterService) clusterService).getRuleEngineProfileForEntityOrElseNull(tenantId, assetId, tbMsg);
verify(assetProfileCache, times(1)).get(tenantId, assetProfileId); verify(assetProfileCache, times(1)).get(tenantId, assetProfileId);
} }

7
application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java

@ -782,7 +782,12 @@ public class TbRuleEngineQueueConsumerManagerTest {
} }
public void setUpTestMsg() { public void setUpTestMsg() {
testMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, new DeviceId(UUID.randomUUID()), new TbMsgMetaData(), "{}"); testMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(new DeviceId(UUID.randomUUID()))
.metaData(new TbMsgMetaData().copy())
.data("{}")
.build();
} }
} }

7
application/src/test/java/org/thingsboard/server/service/rpc/DefaultTbRuleEngineRpcServiceTest.java

@ -46,7 +46,12 @@ class DefaultTbRuleEngineRpcServiceTest {
String serviceId = "tb-core-0"; String serviceId = "tb-core-0";
UUID requestId = UUID.fromString("f64a20df-eb1e-46a3-ba6f-0b3ae053ee0a"); UUID requestId = UUID.fromString("f64a20df-eb1e-46a3-ba6f-0b3ae053ee0a");
DeviceId deviceId = new DeviceId(UUID.fromString("1d9f771a-7cdc-4ac7-838c-ba193d05a012")); DeviceId deviceId = new DeviceId(UUID.fromString("1d9f771a-7cdc-4ac7-838c-ba193d05a012"));
TbMsg msg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
var restApiCallResponseMsgProto = TransportProtos.RestApiCallResponseMsgProto.newBuilder() var restApiCallResponseMsgProto = TransportProtos.RestApiCallResponseMsgProto.newBuilder()
.setRequestIdMSB(requestId.getMostSignificantBits()) .setRequestIdMSB(requestId.getMostSignificantBits())
.setRequestIdLSB(requestId.getLeastSignificantBits()) .setRequestIdLSB(requestId.getLeastSignificantBits())

16
application/src/test/java/org/thingsboard/server/service/ruleengine/DefaultRuleEngineCallServiceTest.java

@ -85,7 +85,13 @@ public class DefaultRuleEngineCallServiceTest {
metaData.put("serviceId", "core"); metaData.put("serviceId", "core");
metaData.put("requestUUID", requestId.toString()); metaData.put("requestUUID", requestId.toString());
metaData.put("expirationTime", Long.toString(expTime)); metaData.put("expirationTime", Long.toString(expTime));
TbMsg msg = TbMsg.newMsg(DataConstants.MAIN_QUEUE_NAME, TbMsgType.REST_API_REQUEST, TENANT_ID, new TbMsgMetaData(metaData), "{\"key\":\"value\"}"); TbMsg msg = TbMsg.builder()
.queueName(DataConstants.MAIN_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(TENANT_ID)
.metaData(new TbMsgMetaData(metaData).copy())
.data("{\"key\":\"value\"}")
.build();
Consumer<TbMsg> anyConsumer = TbMsg::getData; Consumer<TbMsg> anyConsumer = TbMsg::getData;
doAnswer(invocation -> { doAnswer(invocation -> {
@ -113,7 +119,13 @@ public class DefaultRuleEngineCallServiceTest {
metaData.put("serviceId", "core"); metaData.put("serviceId", "core");
metaData.put("requestUUID", requestId.toString()); metaData.put("requestUUID", requestId.toString());
metaData.put("expirationTime", Long.toString(expTime)); metaData.put("expirationTime", Long.toString(expTime));
TbMsg msg = TbMsg.newMsg(DataConstants.MAIN_QUEUE_NAME, TbMsgType.REST_API_REQUEST, TENANT_ID, new TbMsgMetaData(metaData), "{\"key\":\"value\"}"); TbMsg msg = TbMsg.builder()
.queueName(DataConstants.MAIN_QUEUE_NAME)
.type(TbMsgType.REST_API_REQUEST)
.originator(TENANT_ID)
.metaData(new TbMsgMetaData(metaData).copy())
.data("{\"key\":\"value\"}")
.build();
Consumer<TbMsg> anyConsumer = TbMsg::getData; Consumer<TbMsg> anyConsumer = TbMsg::getData;
doAnswer(invocation -> { doAnswer(invocation -> {

12
application/src/test/java/org/thingsboard/server/service/sql/SequentialTimeseriesPersistenceTest.java

@ -131,11 +131,13 @@ public class SequentialTimeseriesPersistenceTest extends AbstractControllerTest
void saveLatestTsForAssetAndDevice(List<Device> devices, Asset asset, int idx) throws ExecutionException, InterruptedException, TimeoutException { void saveLatestTsForAssetAndDevice(List<Device> devices, Asset asset, int idx) throws ExecutionException, InterruptedException, TimeoutException {
for (Device device : devices) { for (Device device : devices) {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TbMsg tbMsg = TbMsg.builder()
device.getId(), .type(TbMsgType.POST_TELEMETRY_REQUEST)
getTbMsgMetadata(device.getName(), ts.get(idx)), .originator(device.getId())
TbMsgDataType.JSON, .metaData(getTbMsgMetadata(device.getName(), ts.get(idx)).copy())
getTbMsgData(msgValue.get(idx))); .dataType(TbMsgDataType.JSON)
.data(getTbMsgData(msgValue.get(idx)))
.build();
saveDeviceTsEntry(device.getId(), tbMsg, msgValue.get(idx)); saveDeviceTsEntry(device.getId(), tbMsg, msgValue.get(idx));
saveAssetTsEntry(asset, device.getName(), msgValue.get(idx), TbMsgTimeseriesNode.computeTs(tbMsg, configuration.isUseServerTs())); saveAssetTsEntry(asset, device.getName(), msgValue.get(idx), TbMsgTimeseriesNode.computeTs(tbMsg, configuration.isUseServerTs()));
idx++; idx++;

373
common/message/src/main/java/org/thingsboard/server/common/msg/TbMsg.java

@ -20,7 +20,6 @@ import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -47,7 +46,6 @@ import static java.util.Objects.requireNonNull;
@Data @Data
@Slf4j @Slf4j
@AllArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(toBuilder = true)
public final class TbMsg implements Serializable { public final class TbMsg implements Serializable {
public static final String EMPTY_JSON_OBJECT = "{}"; public static final String EMPTY_JSON_OBJECT = "{}";
@ -156,229 +154,6 @@ public final class TbMsg implements Serializable {
tbMsg.getDataType(), tbMsg.getData(), ruleChainId, ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), TbMsgCallback.EMPTY); tbMsg.getDataType(), tbMsg.getData(), ruleChainId, ruleNodeId, tbMsg.correlationId, tbMsg.partition, tbMsg.ctx.copy(), TbMsgCallback.EMPTY);
} }
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return newMsg(queueName, type, originator, null, metaData, data, ruleChainId, ruleNodeId);
}
/**
* Creates a new TbMsg instance with the specified parameters.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #newMsg(String, TbMsgType, EntityId, CustomerId, TbMsgMetaData, String, RuleChainId, RuleNodeId)}
* method instead.</p>
*
* @param queueName the name of the queue where the message will be sent
* @param type the type of the message
* @param originator the originator of the message
* @param customerId the ID of the customer associated with the message
* @param metaData the metadata of the message
* @param data the data of the message
* @param ruleChainId the ID of the rule chain associated with the message
* @param ruleNodeId the ID of the rule node associated with the message
* @return new TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg newMsg(String queueName, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return TbMsg.builder()
.queueName(queueName)
.type(type)
.originator(originator)
.metaData(metaData.copy())
.data(data)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
}
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(type, originator, null, metaData, data);
}
@Deprecated(since = "3.6.0", forRemoval = true)
public static TbMsg newMsg(String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return TbMsg.builder()
.type(type)
.originator(originator)
.customerId(customerId)
.metaData(metaData.copy())
.data(data)
.build();
}
public static TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return newMsg(queueName, type, originator, null, metaData, data, ruleChainId, ruleNodeId);
}
public static TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return TbMsg.builder()
.queueName(queueName)
.internalType(type)
.originator(originator)
.customerId(customerId)
.metaData(metaData.copy())
.data(data)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(type, originator, null, metaData, data);
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return TbMsg.builder()
.internalType(type)
.originator(originator)
.customerId(customerId)
.metaData(metaData.copy())
.data(data)
.build();
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data, long ts) {
return TbMsg.builder()
.ts(ts)
.internalType(type)
.originator(originator)
.metaData(metaData.copy())
.data(data)
.build();
}
// REALLY NEW MSG
/**
* Creates a new TbMsg instance with the specified parameters.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #newMsg(String, TbMsgType, EntityId, TbMsgMetaData, String)}
* method instead.</p>
*
* @param queueName the name of the queue where the message will be sent
* @param type the type of the message
* @param originator the originator of the message
* @param metaData the metadata of the message
* @param data the data of the message
* @return new TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(queueName, type, originator, null, metaData, data);
}
/**
* Creates a new TbMsg instance with the specified parameters.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #newMsg(String, TbMsgType, EntityId, CustomerId, TbMsgMetaData, String)}
* method instead.</p>
*
* @param queueName the name of the queue where the message will be sent
* @param type the type of the message
* @param originator the originator of the message
* @param customerId the ID of the customer associated with the message
* @param metaData the metadata of the message
* @param data the data of the message
* @return new TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg newMsg(String queueName, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return TbMsg.builder()
.queueName(queueName)
.type(type)
.originator(originator)
.customerId(customerId)
.metaData(metaData.copy())
.data(data)
.build();
}
/**
* Creates a new TbMsg instance with the specified parameters.
*
* <p><strong>Deprecated:</strong> This method is deprecated since version 3.6.0 and should only be used when you need to
* specify a custom message type that doesn't exist in the {@link TbMsgType} enum. For standard message types,
* it is recommended to use the {@link #newMsg(TbMsgType, EntityId, TbMsgMetaData, TbMsgDataType, String)}
* method instead.</p>
*
* @param type the type of the message
* @param originator the originator of the message
* @param metaData the metadata of the message
* @param dataType the dataType of the message
* @param data the data of the message
* @return new TbMsg instance
*/
@Deprecated(since = "3.6.0")
public static TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, TbMsgDataType dataType, String data) {
return TbMsg.builder()
.type(type)
.originator(originator)
.customerId(null)
.metaData(metaData.copy())
.dataType(dataType)
.data(data)
.build();
}
public static TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(queueName, type, originator, null, metaData, data);
}
public static TbMsg newMsg(String queueName, TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, String data) {
return TbMsg.builder()
.queueName(queueName)
.internalType(type)
.originator(originator)
.customerId(customerId)
.metaData(metaData.copy())
.data(data)
.build();
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data) {
return TbMsg.builder()
.internalType(type)
.originator(originator)
.customerId(customerId)
.metaData(metaData.copy())
.dataType(dataType)
.data(data)
.build();
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, TbMsgDataType dataType, String data) {
return newMsg(type, originator, null, metaData, dataType, data);
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, TbMsgDataType dataType, String data, RuleChainId ruleChainId, RuleNodeId ruleNodeId) {
return TbMsg.builder()
.internalType(type)
.originator(originator)
.metaData(metaData.copy())
.dataType(dataType)
.data(data)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
}
public static TbMsg newMsg(TbMsgType type, EntityId originator, TbMsgMetaData metaData, String data, TbMsgCallback callback) {
return TbMsg.builder()
.internalType(type)
.originator(originator)
.metaData(metaData.copy())
.data(data)
.callback(callback)
.build();
}
@Builder
private TbMsg(String queueName, UUID id, long ts, TbMsgType internalType, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data, private TbMsg(String queueName, UUID id, long ts, TbMsgType internalType, String type, EntityId originator, CustomerId customerId, TbMsgMetaData metaData, TbMsgDataType dataType, String data,
RuleChainId ruleChainId, RuleNodeId ruleNodeId, UUID correlationId, Integer partition, TbMsgProcessingCtx ctx, TbMsgCallback callback) { RuleChainId ruleChainId, RuleNodeId ruleNodeId, UUID correlationId, Integer partition, TbMsgProcessingCtx ctx, TbMsgCallback callback) {
this.id = id != null ? id : UUID.randomUUID(); this.id = id != null ? id : UUID.randomUUID();
@ -390,7 +165,7 @@ public final class TbMsg implements Serializable {
} }
this.internalType = internalType != null ? internalType : getInternalType(type); this.internalType = internalType != null ? internalType : getInternalType(type);
this.type = type != null ? type : this.internalType.name(); this.type = type != null ? type : this.internalType.name();
this.originator = requireNonNull(originator, "msg originator is missing"); this.originator = originator;
if (customerId == null || customerId.isNullUid()) { if (customerId == null || customerId.isNullUid()) {
if (originator != null && originator.getEntityType() == EntityType.CUSTOMER) { if (originator != null && originator.getEntityType() == EntityType.CUSTOMER) {
this.customerId = new CustomerId(originator.getId()); this.customerId = new CustomerId(originator.getId());
@ -572,4 +347,150 @@ public final class TbMsg implements Serializable {
return false; return false;
} }
public static TbMsgBuilder builder() {
return new TbMsgBuilder();
}
public TbMsgBuilder toBuilder() {
return new TbMsgBuilder()
.queueName(this.queueName)
.id(this.id)
.ts(this.ts)
.type(this.type)
.type(this.internalType)
.originator(this.originator)
.customerId(this.customerId)
.metaData(this.metaData)
.dataType(this.dataType)
.data(this.data)
.ruleChainId(this.ruleChainId)
.ruleNodeId(this.ruleNodeId)
.correlationId(this.correlationId)
.partition(this.partition)
.ctx(this.ctx)
.callback(this.callback);
}
public static class TbMsgBuilder {
private String queueName;
private UUID id;
private long ts;
private String type;
private TbMsgType internalType;
private EntityId originator;
private CustomerId customerId;
private TbMsgMetaData metaData;
private TbMsgDataType dataType;
private String data;
private RuleChainId ruleChainId;
private RuleNodeId ruleNodeId;
private UUID correlationId;
private Integer partition;
private TbMsgProcessingCtx ctx;
private TbMsgCallback callback;
TbMsgBuilder() {}
public TbMsgBuilder queueName(String queueName) {
this.queueName = queueName;
return this;
}
public TbMsgBuilder id(UUID id) {
this.id = id;
return this;
}
public TbMsgBuilder ts(long ts) {
this.ts = ts;
return this;
}
/**
* <p><strong>Deprecated:</strong> This should only be used when you need to specify a custom message type that doesn't exist in the {@link TbMsgType} enum.
* Prefer using {@link #type(TbMsgType)} instead.
*
* */
@Deprecated
public TbMsgBuilder type(String type) {
this.type = type;
return this;
}
public TbMsgBuilder type(TbMsgType internalType) {
this.internalType = internalType;
return this;
}
public TbMsgBuilder originator(EntityId originator) {
this.originator = originator;
return this;
}
public TbMsgBuilder customerId(CustomerId customerId) {
this.customerId = customerId;
return this;
}
public TbMsgBuilder metaData(TbMsgMetaData metaData) {
this.metaData = metaData;
return this;
}
public TbMsgBuilder dataType(TbMsgDataType dataType) {
this.dataType = dataType;
return this;
}
public TbMsgBuilder data(String data) {
this.data = data;
return this;
}
public TbMsgBuilder ruleChainId(RuleChainId ruleChainId) {
this.ruleChainId = ruleChainId;
return this;
}
public TbMsgBuilder ruleNodeId(RuleNodeId ruleNodeId) {
this.ruleNodeId = ruleNodeId;
return this;
}
public TbMsgBuilder correlationId(UUID correlationId) {
this.correlationId = correlationId;
return this;
}
public TbMsgBuilder partition(Integer partition) {
this.partition = partition;
return this;
}
public TbMsgBuilder ctx(TbMsgProcessingCtx ctx) {
this.ctx = ctx;
return this;
}
public TbMsgBuilder callback(TbMsgCallback callback) {
this.callback = callback;
return this;
}
public TbMsg build() {
return new TbMsg(queueName, id, ts, type, internalType, originator, customerId, metaData, dataType, data, ruleChainId, ruleNodeId, correlationId, partition, ctx, callback);
}
public String toString() {
return "TbMsg.TbMsgBuilder(queueName=" + this.queueName + ", id=" + this.id + ", ts=" + this.ts +
", type=" + this.type + ", internalType=" + this.internalType + ", originator=" + this.originator +
", customerId=" + this.customerId + ", metaData=" + this.metaData + ", dataType=" + this.dataType +
", data=" + this.data + ", ruleChainId=" + this.ruleChainId + ", ruleNodeId=" + this.ruleNodeId +
", correlationId=" + this.correlationId + ", partition=" + this.partition + ", ctx=" + this.ctx +
", callback=" + this.callback + ")";
}
}
} }

12
common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java

@ -45,7 +45,6 @@ import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.device.data.PowerMode; import org.thingsboard.server.common.data.device.data.PowerMode;
import org.thingsboard.server.common.data.exception.TenantNotFoundException;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.DeviceProfileId;
@ -1137,7 +1136,16 @@ public class DefaultTransportService extends TransportActivityManager implements
queueName = deviceProfile.getDefaultQueueName(); queueName = deviceProfile.getDefaultQueueName();
} }
TbMsg tbMsg = TbMsg.newMsg(queueName, tbMsgType, deviceId, customerId, metaData, gson.toJson(json), ruleChainId, null); TbMsg tbMsg = TbMsg.builder()
.queueName(queueName)
.type(tbMsgType)
.originator(deviceId)
.customerId(customerId)
.metaData(metaData.copy())
.data(gson.toJson(json))
.ruleChainId(ruleChainId)
.ruleNodeId(null)
.build();
ruleEngineProducerService.sendToRuleEngine(ruleEngineMsgProducer, tenantId, tbMsg, new StatsCallback(callback, ruleEngineProducerStats)); ruleEngineProducerService.sendToRuleEngine(ruleEngineMsgProducer, tenantId, tbMsg, new StatsCallback(callback, ruleEngineProducerStats));
ruleEngineProducerStats.incrementTotal(); ruleEngineProducerStats.incrementTotal();
} }

3
rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java

@ -192,9 +192,6 @@ public interface TbContext {
void ack(TbMsg tbMsg); void ack(TbMsg tbMsg);
@Deprecated(since = "3.6.0", forRemoval = true)
TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data);
/** /**
* Creates a new TbMsg instance with the specified parameters. * Creates a new TbMsg instance with the specified parameters.
* *

35
rule-engine/rule-engine-api/src/test/java/org/thingsboard/rule/engine/api/util/TbNodeUtilsTest.java

@ -44,7 +44,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.put("data_key", "data_value"); node.put("data_key", "data_value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.metaData(md.copy())
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals("ABC metadata_value data_value", result); Assertions.assertEquals("ABC metadata_value data_value", result);
} }
@ -58,7 +63,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.put("key", "data_value"); node.put("key", "data_value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.metaData(md.copy())
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals(pattern, result); Assertions.assertEquals(pattern, result);
} }
@ -72,7 +82,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.put("key", "data_value"); node.put("key", "data_value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.metaData(md.copy())
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals("ABC metadata_value data_value", result); Assertions.assertEquals("ABC metadata_value data_value", result);
} }
@ -93,7 +108,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.set("key1", key1Node); node.set("key1", key1Node);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.metaData(md.copy())
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals("ABC metadata_value value3", result); Assertions.assertEquals("ABC metadata_value value3", result);
} }
@ -114,7 +134,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.set("key1", key1Node); node.set("key1", key1Node);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, md, JacksonUtil.toString(node)); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.metaData(md.copy())
.data(JacksonUtil.toString(node))
.build();
String result = TbNodeUtils.processPattern(pattern, msg); String result = TbNodeUtils.processPattern(pattern, msg);
Assertions.assertEquals("ABC metadata_value $[key1.key2[0].key3]", result); Assertions.assertEquals("ABC metadata_value $[key1.key2[0].key3]", result);
} }

9
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java

@ -74,7 +74,14 @@ public class TbMsgCountNode implements TbNode {
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("delta", Long.toString(System.currentTimeMillis() - lastScheduledTs + delay)); metaData.putValue("delta", Long.toString(System.currentTimeMillis() - lastScheduledTs + delay));
TbMsg tbMsg = TbMsg.newMsg(msg.getQueueName(), TbMsgType.POST_TELEMETRY_REQUEST, ctx.getTenantId(), msg.getCustomerId(), metaData, gson.toJson(telemetryJson)); TbMsg tbMsg = TbMsg.builder()
.queueName(msg.getQueueName())
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(ctx.getTenantId())
.customerId(msg.getCustomerId())
.metaData(metaData.copy())
.data(gson.toJson(telemetryJson))
.build();
ctx.enqueueForTellNext(tbMsg, TbNodeConnectionType.SUCCESS); ctx.enqueueForTellNext(tbMsg, TbNodeConnectionType.SUCCESS);
scheduleTickMsg(ctx, tbMsg); scheduleTickMsg(ctx, tbMsg);
} else { } else {

29
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/deduplication/TbMsgDeduplicationNode.java

@ -154,12 +154,13 @@ public class TbMsgDeduplicationNode implements TbNode {
iterator.remove(); iterator.remove();
} }
} }
deduplicationResults.add(TbMsg.newMsg( deduplicationResults.add(TbMsg.builder()
queueName, .queueName(queueName)
config.getOutMsgType(), .type(config.getOutMsgType())
deduplicationId, .originator(deduplicationId)
getMetadata(), .metaData(getMetadata().copy())
getMergedData(pack))); .data(getMergedData(pack))
.build());
} else { } else {
TbMsg resultMsg = null; TbMsg resultMsg = null;
boolean searchMin = DeduplicationStrategy.FIRST.equals(config.getStrategy()); boolean searchMin = DeduplicationStrategy.FIRST.equals(config.getStrategy());
@ -176,13 +177,15 @@ public class TbMsgDeduplicationNode implements TbNode {
} }
} }
if (resultMsg != null) { if (resultMsg != null) {
deduplicationResults.add(TbMsg.newMsg( String queueName1 = queueName != null ? queueName : resultMsg.getQueueName();
queueName != null ? queueName : resultMsg.getQueueName(), deduplicationResults.add(TbMsg.builder()
resultMsg.getType(), .queueName(queueName1)
resultMsg.getOriginator(), .type(resultMsg.getType())
resultMsg.getCustomerId(), .originator(resultMsg.getOriginator())
resultMsg.getMetaData(), .customerId(resultMsg.getCustomerId())
resultMsg.getData())); .metaData(resultMsg.getMetaData().copy())
.data(resultMsg.getData())
.build());
} }
} }
packBoundsOpt = findValidPack(msgList, deduplicationTimeoutMs); packBoundsOpt = findValidPack(msgList, deduplicationTimeoutMs);

16
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/delay/TbMsgDelayNode.java

@ -65,14 +65,14 @@ public class TbMsgDelayNode implements TbNode {
TbMsg pendingMsg = pendingMsgs.remove(UUID.fromString(msg.getData())); TbMsg pendingMsg = pendingMsgs.remove(UUID.fromString(msg.getData()));
if (pendingMsg != null) { if (pendingMsg != null) {
ctx.enqueueForTellNext( ctx.enqueueForTellNext(
TbMsg.newMsg( TbMsg.builder()
pendingMsg.getQueueName(), .queueName(pendingMsg.getQueueName())
pendingMsg.getType(), .type(pendingMsg.getType())
pendingMsg.getOriginator(), .originator(pendingMsg.getOriginator())
pendingMsg.getCustomerId(), .customerId(pendingMsg.getCustomerId())
pendingMsg.getMetaData(), .metaData(pendingMsg.getMetaData().copy())
pendingMsg.getData() .data(pendingMsg.getData())
), .build(),
TbNodeConnectionType.SUCCESS TbNodeConnectionType.SUCCESS
); );
} }

24
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java

@ -29,6 +29,7 @@ import org.thingsboard.rule.engine.api.util.TbNodeUtils;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.msg.TbMsgType; import org.thingsboard.server.common.data.msg.TbMsgType;
@ -176,7 +177,14 @@ public class TbDeviceProfileNode implements TbNode {
} }
protected void scheduleAlarmHarvesting(TbContext ctx, TbMsg msg) { protected void scheduleAlarmHarvesting(TbContext ctx, TbMsg msg) {
TbMsg periodicCheck = TbMsg.newMsg(TbMsgType.DEVICE_PROFILE_PERIODIC_SELF_MSG, ctx.getTenantId(), msg != null ? msg.getCustomerId() : null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); CustomerId customerId = msg != null ? msg.getCustomerId() : null;
TbMsg periodicCheck = TbMsg.builder()
.type(TbMsgType.DEVICE_PROFILE_PERIODIC_SELF_MSG)
.originator(ctx.getTenantId())
.customerId(customerId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
ctx.tellSelf(periodicCheck, TimeUnit.MINUTES.toMillis(1)); ctx.tellSelf(periodicCheck, TimeUnit.MINUTES.toMillis(1));
} }
@ -201,7 +209,12 @@ public class TbDeviceProfileNode implements TbNode {
} }
protected void onProfileUpdate(DeviceProfile profile) { protected void onProfileUpdate(DeviceProfile profile) {
ctx.tellSelf(TbMsg.newMsg(TbMsgType.DEVICE_PROFILE_UPDATE_SELF_MSG, ctx.getTenantId(), TbMsgMetaData.EMPTY, profile.getId().getId().toString()), 0L); ctx.tellSelf(TbMsg.builder()
.type(TbMsgType.DEVICE_PROFILE_UPDATE_SELF_MSG)
.originator(ctx.getTenantId())
.metaData(TbMsgMetaData.EMPTY.copy())
.data(profile.getId().getId().toString())
.build(), 0L);
} }
private void onDeviceUpdate(DeviceId deviceId, DeviceProfile deviceProfile) { private void onDeviceUpdate(DeviceId deviceId, DeviceProfile deviceProfile) {
@ -210,7 +223,12 @@ public class TbDeviceProfileNode implements TbNode {
if (deviceProfile != null) { if (deviceProfile != null) {
msgData.put("deviceProfileId", deviceProfile.getId().getId().toString()); msgData.put("deviceProfileId", deviceProfile.getId().getId().toString());
} }
ctx.tellSelf(TbMsg.newMsg(TbMsgType.DEVICE_UPDATE_SELF_MSG, ctx.getTenantId(), TbMsgMetaData.EMPTY, JacksonUtil.toString(msgData)), 0L); ctx.tellSelf(TbMsg.builder()
.type(TbMsgType.DEVICE_UPDATE_SELF_MSG)
.originator(ctx.getTenantId())
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.toString(msgData))
.build(), 0L);
} }
protected void invalidateDeviceProfileCache(DeviceId deviceId, String deviceJson) { protected void invalidateDeviceProfileCache(DeviceId deviceId, String deviceJson) {

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAssignToCustomerNodeTest.java

@ -306,7 +306,12 @@ class TbAssignToCustomerNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getTbMsg(EntityId originator) { private TbMsg getTbMsg(EntityId originator) {
return TbMsg.newMsg(TbMsgType.NA, originator, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.builder()
.type(TbMsgType.NA)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
private EntityId toOriginator(EntityType type) { private EntityId toOriginator(EntityType type) {

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbClearAlarmNodeTest.java

@ -91,7 +91,12 @@ class TbClearAlarmNodeTest {
void alarmCanBeCleared() { void alarmCanBeCleared() {
initWithClearAlarmScript(); initWithClearAlarmScript();
metadata.putValue("key", "value"); metadata.putValue("key", "value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50}"); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.metaData(metadata.copy())
.data("{\"temperature\": 50}")
.build();
long oldEndDate = System.currentTimeMillis(); long oldEndDate = System.currentTimeMillis();
Alarm activeAlarm = Alarm.builder().type("SomeType").tenantId(tenantId).originator(msgOriginator).severity(AlarmSeverity.WARNING).endTs(oldEndDate).build(); Alarm activeAlarm = Alarm.builder().type("SomeType").tenantId(tenantId).originator(msgOriginator).severity(AlarmSeverity.WARNING).endTs(oldEndDate).build();
@ -143,7 +148,12 @@ class TbClearAlarmNodeTest {
void alarmCanBeClearedWithAlarmOriginator() { void alarmCanBeClearedWithAlarmOriginator() {
initWithClearAlarmScript(); initWithClearAlarmScript();
metadata.putValue("key", "value"); metadata.putValue("key", "value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, alarmOriginator, metadata, "{\"temperature\": 50}"); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(alarmOriginator)
.metaData(metadata.copy())
.data("{\"temperature\": 50}")
.build();
long oldEndDate = System.currentTimeMillis(); long oldEndDate = System.currentTimeMillis();
AlarmId id = new AlarmId(alarmOriginator.getId()); AlarmId id = new AlarmId(alarmOriginator.getId());

52
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNodeTest.java

@ -106,9 +106,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenExistingClientAttributes_whenOnMsg_thenCopyAttributesToView() { public void givenExistingClientAttributes_whenOnMsg_thenCopyAttributesToView() {
EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW); EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, TbMsg msg = TbMsg.builder()
new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())), .type(TbMsgType.POST_ATTRIBUTES_REQUEST)
"{\"clientAttribute1\": 100, \"clientAttribute2\": \"value2\"}"); .originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())).copy())
.data("{\"clientAttribute1\": 100, \"clientAttribute2\": \"value2\"}")
.build();
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -140,9 +143,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenExistingServerAttributesAndMsgTypeAttributesDeleted_whenOnMsg_thenDeleteAttributesFromView() { public void givenExistingServerAttributesAndMsgTypeAttributesDeleted_whenOnMsg_thenDeleteAttributesFromView() {
EntityView entityView = getEntityView(SERVER_TELEMETRY_ENTITY_VIEW); EntityView entityView = getEntityView(SERVER_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg( TbMsg msg = TbMsg.builder()
ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())), .type(ATTRIBUTES_DELETED)
"{\"attributes\": [\"serverAttribute1\"]}"); .originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())).copy())
.data("{\"attributes\": [\"serverAttribute1\"]}")
.build();
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -171,9 +177,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenNonMatchedSharedAttributesAndMsgTypeIsAttributesDeleted_whenOnMsg_thenNoAttributesDeleteFromView() { public void givenNonMatchedSharedAttributesAndMsgTypeIsAttributesDeleted_whenOnMsg_thenNoAttributesDeleteFromView() {
EntityView entityView = getEntityView(SHARED_TELEMETRY_ENTITY_VIEW); EntityView entityView = getEntityView(SHARED_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg( TbMsg msg = TbMsg.builder()
TbMsgType.ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SHARED_SCOPE.name())), .type(TbMsgType.ATTRIBUTES_DELETED)
"{\"attributes\": [\"anotherAttribute\"]}"); .originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SHARED_SCOPE.name())).copy())
.data("{\"attributes\": [\"anotherAttribute\"]}")
.build();
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
@ -188,9 +197,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenNonMatchedAttributesAndMsgTypeIsPostAttributesRequest_whenOnMsg_thenCopyNoAttributesToView() { public void givenNonMatchedAttributesAndMsgTypeIsPostAttributesRequest_whenOnMsg_thenCopyNoAttributesToView() {
EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW); EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg( TbMsg msg = TbMsg.builder()
TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())), .type(TbMsgType.POST_ATTRIBUTES_REQUEST)
"{\"clientAttribute2\": \"value2\"}"); .originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())).copy())
.data("{\"clientAttribute2\": \"value2\"}")
.build();
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -220,9 +232,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
); );
mockEntityViewLookup(entityView); mockEntityViewLookup(entityView);
TbMsg msg = TbMsg.newMsg( TbMsg msg = TbMsg.builder()
ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())), .type(ATTRIBUTES_DELETED)
"{\"attributes\": [\"serverAttribute1\"]}"); .originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())).copy())
.data("{\"attributes\": [\"serverAttribute1\"]}")
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
verify(entityViewServiceMock).findEntityViewsByTenantIdAndEntityIdAsync(eq(TENANT_ID), eq(DEVICE_ID)); verify(entityViewServiceMock).findEntityViewsByTenantIdAndEntityIdAsync(eq(TENANT_ID), eq(DEVICE_ID));
@ -233,7 +248,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
@ParameterizedTest @ParameterizedTest
@EnumSource(TbMsgType.class) @EnumSource(TbMsgType.class)
public void givenMsgTypeAndEmptyMetadata_whenOnMsg_thenVerifyFailureMsg(TbMsgType msgType) { public void givenMsgTypeAndEmptyMetadata_whenOnMsg_thenVerifyFailureMsg(TbMsgType msgType) {
TbMsg msg = TbMsg.newMsg(msgType, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(msgType)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

49
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateAlarmNodeTest.java

@ -163,7 +163,12 @@ class TbCreateAlarmNodeTest {
var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased()); var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased());
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50}"); var incomingMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.metaData(metadata.copy())
.data("{\"temperature\": 50}")
.build();
Alarm existingAlarm = null; Alarm existingAlarm = null;
@ -317,7 +322,12 @@ class TbCreateAlarmNodeTest {
var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased()); var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased());
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50, \"alarmType\": \"" + alarmType + "\"}"); var incomingMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.metaData(metadata.copy())
.data("{\"temperature\": 50, \"alarmType\": \"" + alarmType + "\"}")
.build();
var existingClearedAlarm = Alarm.builder() var existingClearedAlarm = Alarm.builder()
.tenantId(tenantId) .tenantId(tenantId)
@ -508,7 +518,12 @@ class TbCreateAlarmNodeTest {
var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased()); var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased());
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50, \"alarmSeverity\": \"" + newAlarmSeverity.name() + "\"}"); var incomingMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.metaData(metadata.copy())
.data("{\"temperature\": 50, \"alarmSeverity\": \"" + newAlarmSeverity.name() + "\"}")
.build();
var existingAlarmId = new AlarmId(Uuids.timeBased()); var existingAlarmId = new AlarmId(Uuids.timeBased());
var existingActiveAlarm = Alarm.builder() var existingActiveAlarm = Alarm.builder()
@ -680,7 +695,12 @@ class TbCreateAlarmNodeTest {
var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased()); var ruleNodeSelfId = new RuleNodeId(Uuids.timeBased());
var incomingMsg = TbMsg.newMsg(TbMsgType.ALARM, msgOriginator, metadata, JacksonUtil.toString(alarmFromIncomingMessage)); var incomingMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(msgOriginator)
.metaData(metadata.copy())
.data(JacksonUtil.toString(alarmFromIncomingMessage))
.build();
var existingClearedAlarm = Alarm.builder() var existingClearedAlarm = Alarm.builder()
.tenantId(tenantId) .tenantId(tenantId)
@ -867,7 +887,12 @@ class TbCreateAlarmNodeTest {
.details(newAlarmDetails) .details(newAlarmDetails)
.build(); .build();
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, JacksonUtil.toString(alarmFromIncomingMessage)); var incomingMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.metaData(metadata.copy())
.data(JacksonUtil.toString(alarmFromIncomingMessage))
.build();
var existingAlarmId = new AlarmId(Uuids.timeBased()); var existingAlarmId = new AlarmId(Uuids.timeBased());
var existingActiveAlarm = Alarm.builder() var existingActiveAlarm = Alarm.builder()
@ -1048,7 +1073,12 @@ class TbCreateAlarmNodeTest {
.details(alarmDetails) .details(alarmDetails)
.build(); .build();
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, JacksonUtil.toString(alarmFromIncomingMessage)); var incomingMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.metaData(metadata.copy())
.data(JacksonUtil.toString(alarmFromIncomingMessage))
.build();
var existingAlarmId = new AlarmId(Uuids.timeBased()); var existingAlarmId = new AlarmId(Uuids.timeBased());
var existingActiveAlarm = Alarm.builder() var existingActiveAlarm = Alarm.builder()
@ -1189,7 +1219,12 @@ class TbCreateAlarmNodeTest {
// GIVEN // GIVEN
config = config.defaultConfiguration(); config = config.defaultConfiguration();
var incomingMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, msgOriginator, metadata, "{\"temperature\": 50}"); var incomingMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msgOriginator)
.metaData(metadata.copy())
.data("{\"temperature\": 50}")
.build();
given(ctxMock.getTenantId()).willReturn(tenantId); given(ctxMock.getTenantId()).willReturn(tenantId);
given(ctxMock.getAlarmService()).willReturn(alarmServiceMock); given(ctxMock.getAlarmService()).willReturn(alarmServiceMock);

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeTest.java

@ -486,7 +486,12 @@ public class TbCreateRelationNodeTest extends AbstractRuleNodeUpgradeTest {
when(ctxMock.getRelationService()).thenReturn(relationServiceMock); when(ctxMock.getRelationService()).thenReturn(relationServiceMock);
var mockMethodCallsMap = mockEntityServiceCallsCreateEntityIfNotExistsEnabled(); var mockMethodCallsMap = mockEntityServiceCallsCreateEntityIfNotExistsEnabled();
var entityCreatedMsg = TbMsg.newMsg(TbMsgType.ENTITY_CREATED, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); var entityCreatedMsg = TbMsg.builder()
.type(TbMsgType.ENTITY_CREATED)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
mockMethodCallsMap.get(entityType).accept(entity, entityCreatedMsg); mockMethodCallsMap.get(entityType).accept(entity, entityCreatedMsg);
when(relationServiceMock.checkRelationAsync(any(), any(), any(), any(), any())).thenReturn(Futures.immediateFuture(false)); when(relationServiceMock.checkRelationAsync(any(), any(), any(), any(), any())).thenReturn(Futures.immediateFuture(false));
@ -676,7 +681,12 @@ public class TbCreateRelationNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getTbMsg(EntityId originator, TbMsgMetaData metaData) { private TbMsg getTbMsg(EntityId originator, TbMsgMetaData metaData) {
return TbMsg.newMsg(TbMsgType.NA, originator, metaData, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.builder()
.type(TbMsgType.NA)
.originator(originator)
.metaData(metaData.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
private TbMsgMetaData getMetadataWithNameTemplate() { private TbMsgMetaData getMetadataWithNameTemplate() {

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbDeleteRelationNodeTest.java

@ -560,7 +560,12 @@ public class TbDeleteRelationNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getTbMsg(EntityId originator, TbMsgMetaData metaData) { private TbMsg getTbMsg(EntityId originator, TbMsgMetaData metaData) {
return TbMsg.newMsg(TbMsgType.NA, originator, metaData, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.builder()
.type(TbMsgType.NA)
.originator(originator)
.metaData(metaData.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
private TbMsgMetaData getMetadataWithNameTemplate() { private TbMsgMetaData getMetadataWithNameTemplate() {

22
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbDeviceStateNodeTest.java

@ -85,7 +85,12 @@ public class TbDeviceStateNodeTest {
metaData.putValue("ts", String.valueOf(METADATA_TS)); metaData.putValue("ts", String.valueOf(METADATA_TS));
var data = JacksonUtil.newObjectNode(); var data = JacksonUtil.newObjectNode();
data.put("humidity", 58.3); data.put("humidity", 58.3);
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, JacksonUtil.toString(data)); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(JacksonUtil.toString(data))
.build();
} }
@BeforeEach @BeforeEach
@ -207,7 +212,12 @@ public class TbDeviceStateNodeTest {
return unsupportedType; return unsupportedType;
} }
}; };
var msg = TbMsg.newMsg(TbMsgType.ENTITY_CREATED, nonDeviceOriginator, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); var msg = TbMsg.builder()
.type(TbMsgType.ENTITY_CREATED)
.originator(nonDeviceOriginator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -236,7 +246,13 @@ public class TbDeviceStateNodeTest {
given(ctxMock.getDeviceStateManager()).willReturn(deviceStateManagerMock); given(ctxMock.getDeviceStateManager()).willReturn(deviceStateManagerMock);
long msgTs = METADATA_TS + 1; long msgTs = METADATA_TS + 1;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, msgTs); msg = TbMsg.builder()
.ts(msgTs)
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

21
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbLogNodeTest.java

@ -50,7 +50,12 @@ public class TbLogNodeTest {
TbLogNode node = new TbLogNode(); TbLogNode node = new TbLogNode();
String data = "{\"key\": \"value\"}"; String data = "{\"key\": \"value\"}";
TbMsgMetaData metaData = new TbMsgMetaData(Map.of("mdKey1", "mdValue1", "mdKey2", "23")); TbMsgMetaData metaData = new TbMsgMetaData(Map.of("mdKey1", "mdValue1", "mdKey2", "23"));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.metaData(metaData.copy())
.data(data)
.build();
String logMessage = node.toLogMessage(msg); String logMessage = node.toLogMessage(msg);
log.info(logMessage); log.info(logMessage);
@ -66,7 +71,12 @@ public class TbLogNodeTest {
void givenEmptyDataMsg_whenToLog_thenReturnString() { void givenEmptyDataMsg_whenToLog_thenReturnString() {
TbLogNode node = new TbLogNode(); TbLogNode node = new TbLogNode();
TbMsgMetaData metaData = new TbMsgMetaData(Collections.emptyMap()); TbMsgMetaData metaData = new TbMsgMetaData(Collections.emptyMap());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, metaData, ""); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.metaData(metaData.copy())
.data("")
.build();
String logMessage = node.toLogMessage(msg); String logMessage = node.toLogMessage(msg);
log.info(logMessage); log.info(logMessage);
@ -82,7 +92,12 @@ public class TbLogNodeTest {
void givenNullDataMsg_whenToLog_thenReturnString() { void givenNullDataMsg_whenToLog_thenReturnString() {
TbLogNode node = new TbLogNode(); TbLogNode node = new TbLogNode();
TbMsgMetaData metaData = new TbMsgMetaData(Collections.emptyMap()); TbMsgMetaData metaData = new TbMsgMetaData(Collections.emptyMap());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TenantId.SYS_TENANT_ID, metaData, null); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TenantId.SYS_TENANT_ID)
.metaData(metaData.copy())
.data(null)
.build();
String logMessage = node.toLogMessage(msg); String logMessage = node.toLogMessage(msg);
log.info(logMessage); log.info(logMessage);

21
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbMsgCountNodeTest.java

@ -63,7 +63,12 @@ public class TbMsgCountNodeTest {
private final DeviceId DEVICE_ID = new DeviceId(UUID.fromString("1b21c7cc-0c9e-4ab1-b867-99451599e146")); private final DeviceId DEVICE_ID = new DeviceId(UUID.fromString("1b21c7cc-0c9e-4ab1-b867-99451599e146"));
private final TenantId TENANT_ID = TenantId.fromUUID(UUID.fromString("04dfbd38-10e5-47b7-925f-11e795db89e1")); private final TenantId TENANT_ID = TenantId.fromUUID(UUID.fromString("04dfbd38-10e5-47b7-925f-11e795db89e1"));
private final TbMsg tickMsg = TbMsg.newMsg(TbMsgType.MSG_COUNT_SELF_MSG, RULE_NODE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); private final TbMsg tickMsg = TbMsg.builder()
.type(TbMsgType.MSG_COUNT_SELF_MSG)
.originator(RULE_NODE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
private ScheduledExecutorService executorService; private ScheduledExecutorService executorService;
private TbMsgCountNode node; private TbMsgCountNode node;
@ -120,7 +125,12 @@ public class TbMsgCountNodeTest {
var expectedProcessedMsgs = new ArrayList<TbMsg>(); var expectedProcessedMsgs = new ArrayList<TbMsg>();
for (int i = 0; i < msgCount; i++) { for (int i = 0; i < msgCount; i++) {
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
if (msgWithCounterSent.get()) { if (msgWithCounterSent.get()) {
break; break;
} }
@ -142,7 +152,12 @@ public class TbMsgCountNodeTest {
then(ctxMock).should().enqueueForTellNext(msgWithCounterCaptor.capture(), eq(TbNodeConnectionType.SUCCESS)); then(ctxMock).should().enqueueForTellNext(msgWithCounterCaptor.capture(), eq(TbNodeConnectionType.SUCCESS));
TbMsg resultedMsg = msgWithCounterCaptor.getValue(); TbMsg resultedMsg = msgWithCounterCaptor.getValue();
String expectedData = "{\"messageCount_tb-rule-engine\":" + currentMsgNumber + "}"; String expectedData = "{\"messageCount_tb-rule-engine\":" + currentMsgNumber + "}";
TbMsg expectedMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, TENANT_ID, TbMsgMetaData.EMPTY, expectedData); TbMsg expectedMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(TENANT_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(expectedData)
.build();
assertThat(resultedMsg).usingRecursiveComparison() assertThat(resultedMsg).usingRecursiveComparison()
.ignoringFields("id", "ts", "ctx", "metaData") .ignoringFields("id", "ts", "ctx", "metaData")
.isEqualTo(expectedMsg); .isEqualTo(expectedMsg);

35
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbSaveToCustomCassandraTableNodeTest.java

@ -185,7 +185,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
assertThatThrownBy(() -> node.onMsg(ctxMock, msg)) assertThatThrownBy(() -> node.onMsg(ctxMock, msg))
.isInstanceOf(IllegalStateException.class) .isInstanceOf(IllegalStateException.class)
.hasMessage("Invalid message structure, it is not a JSON Object: " + null); .hasMessage("Invalid message structure, it is not a JSON Object: " + null);
@ -206,7 +211,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
"humidity": 77 "humidity": 77
} }
"""; """;
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(data)
.build();
assertThatThrownBy(() -> node.onMsg(ctxMock, msg)) assertThatThrownBy(() -> node.onMsg(ctxMock, msg))
.isInstanceOf(RuntimeException.class) .isInstanceOf(RuntimeException.class)
.hasMessage("Message data doesn't contain key: 'temp'!"); .hasMessage("Message data doesn't contain key: 'temp'!");
@ -227,7 +237,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
"temp": [value] "temp": [value]
} }
"""; """;
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(data)
.build();
assertThatThrownBy(() -> node.onMsg(ctxMock, msg)) assertThatThrownBy(() -> node.onMsg(ctxMock, msg))
.isInstanceOf(RuntimeException.class) .isInstanceOf(RuntimeException.class)
.hasMessage("Message data key: 'temp' with value: '[\"value\"]' is not a JSON Object or JSON Primitive!"); .hasMessage("Message data key: 'temp' with value: '[\"value\"]' is not a JSON Object or JSON Primitive!");
@ -249,7 +264,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
mockSubmittingCassandraTask(); mockSubmittingCassandraTask();
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(sessionMock).should().prepare(expectedQuery); then(sessionMock).should().prepare(expectedQuery);
@ -299,7 +319,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
} }
} }
"""; """;
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
verifySettingStatementBuilder(); verifySettingStatementBuilder();

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbUnassignFromCustomerNodeTest.java

@ -294,7 +294,12 @@ class TbUnassignFromCustomerNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getTbMsg(EntityId originator) { private TbMsg getTbMsg(EntityId originator) {
return TbMsg.newMsg(TbMsgType.NA, originator, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.builder()
.type(TbMsgType.NA)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
private static EntityId toOriginator(EntityType type) { private static EntityId toOriginator(EntityType type) {

35
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/lambda/TbAwsLambdaNodeTest.java

@ -145,7 +145,12 @@ public class TbAwsLambdaNodeTest {
config.setFunctionName(functionName); config.setFunctionName(functionName);
config.setQualifier(qualifier); config.setQualifier(qualifier);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metadata, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(data)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23"; String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23";
@ -197,7 +202,12 @@ public class TbAwsLambdaNodeTest {
init(); init();
config.setTellFailureIfFuncThrowsExc(true); config.setTellFailureIfFuncThrowsExc(true);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23"; String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23";
String errorMsg = "Unhandled exception from function"; String errorMsg = "Unhandled exception from function";
@ -233,7 +243,12 @@ public class TbAwsLambdaNodeTest {
public void givenExceptionWasThrownInsideFunctionAndTellFailureIfFuncThrowsExcIsFalse_whenOnMsg_thenTellSuccess() { public void givenExceptionWasThrownInsideFunctionAndTellFailureIfFuncThrowsExcIsFalse_whenOnMsg_thenTellSuccess() {
init(); init();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String requestIdStr = "e83dfbc4-68d5-441c-8ee9-289959a30d3b"; String requestIdStr = "e83dfbc4-68d5-441c-8ee9-289959a30d3b";
String payload = "{\"errorMessage\":\"Something went wrong\",\"errorType\":\"Exception\",\"requestId\":\"" + requestIdStr + "\"}"; String payload = "{\"errorMessage\":\"Something went wrong\",\"errorType\":\"Exception\",\"requestId\":\"" + requestIdStr + "\"}";
@ -266,7 +281,12 @@ public class TbAwsLambdaNodeTest {
public void givenPayloadFromResultIsNull_whenOnMsg_thenTellFailure() { public void givenPayloadFromResultIsNull_whenOnMsg_thenTellFailure() {
init(); init();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String requestIdStr = "12bbb074-e2fc-4381-8f28-d4bd235103d5"; String requestIdStr = "12bbb074-e2fc-4381-8f28-d4bd235103d5";
String errorMsg = "Payload from result of AWS Lambda function execution is null."; String errorMsg = "Payload from result of AWS Lambda function execution is null.";
@ -300,7 +320,12 @@ public class TbAwsLambdaNodeTest {
@Test @Test
public void givenExceptionWasThrownOnAWS_whenOnMsg_thenTellFailure() { public void givenExceptionWasThrownOnAWS_whenOnMsg_thenTellFailure() {
init(); init();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
InvokeRequest request = createInvokeRequest(msg); InvokeRequest request = createInvokeRequest(msg);
String errorMsg = "Simulated error"; String errorMsg = "Simulated error";

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/sns/TbSnsNodeTest.java

@ -105,7 +105,12 @@ class TbSnsNodeTest {
given(publishResultMock.getSdkResponseMetadata()).willReturn(responseMetadataMock); given(publishResultMock.getSdkResponseMetadata()).willReturn(responseMetadataMock);
given(responseMetadataMock.getRequestId()).willReturn(requestId); given(responseMetadataMock.getRequestId()).willReturn(requestId);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -143,7 +148,12 @@ class TbSnsNodeTest {
ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg)); ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg));
given(listeningExecutor.executeAsync(any(Callable.class))).willReturn(failedFuture); given(listeningExecutor.executeAsync(any(Callable.class))).willReturn(failedFuture);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).enqueueForTellNext(any(), any(String.class)); then(ctxMock).should(never()).enqueueForTellNext(any(), any(String.class));

28
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/aws/sqs/TbSqsNodeTest.java

@ -107,7 +107,12 @@ class TbSqsNodeTest {
mockSendingMsgRequest(); mockSendingMsgRequest();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
SendMessageRequest sendMsgRequest = new SendMessageRequest() SendMessageRequest sendMsgRequest = new SendMessageRequest()
@ -143,7 +148,12 @@ class TbSqsNodeTest {
mockSendingMsgRequest(); mockSendingMsgRequest();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
Map<String, MessageAttributeValue> messageAttributes = new HashMap<>(); Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
@ -186,7 +196,12 @@ class TbSqsNodeTest {
given(sendMessageResultMock.getMD5OfMessageAttributes()).willReturn(messageAttributesMd5); given(sendMessageResultMock.getMD5OfMessageAttributes()).willReturn(messageAttributesMd5);
given(sendMessageResultMock.getSequenceNumber()).willReturn(sequenceNumber); given(sendMessageResultMock.getSequenceNumber()).willReturn(sequenceNumber);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -221,7 +236,12 @@ class TbSqsNodeTest {
ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg)); ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg));
given(listeningExecutor.executeAsync(any(Callable.class))).willReturn(failedFuture); given(listeningExecutor.executeAsync(any(Callable.class))).willReturn(failedFuture);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).enqueueForTellNext(any(), any(String.class)); then(ctxMock).should(never()).enqueueForTellNext(any(), any(String.class));

28
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNodeTest.java

@ -190,7 +190,12 @@ public class TbMsgGeneratorNodeTest extends AbstractRuleNodeUpgradeTest {
given(ctxMock.createScriptEngine(any(), any(), any(), any(), any())).willReturn(scriptEngineMock); given(ctxMock.createScriptEngine(any(), any(), any(), any(), any())).willReturn(scriptEngineMock);
// creation of tickMsg // creation of tickMsg
TbMsg tickMsg = TbMsg.newMsg(TbMsgType.GENERATOR_NODE_SELF_MSG, RULE_NODE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg tickMsg = TbMsg.builder()
.type(TbMsgType.GENERATOR_NODE_SELF_MSG)
.originator(RULE_NODE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
given(ctxMock.newMsg(null, TbMsgType.GENERATOR_NODE_SELF_MSG, RULE_NODE_ID, null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING)).willReturn(tickMsg); given(ctxMock.newMsg(null, TbMsgType.GENERATOR_NODE_SELF_MSG, RULE_NODE_ID, null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING)).willReturn(tickMsg);
// invocation of tellSelf() method // invocation of tellSelf() method
@ -203,16 +208,31 @@ public class TbMsgGeneratorNodeTest extends AbstractRuleNodeUpgradeTest {
}).given(ctxMock).tellSelf(any(), any(Long.class)); }).given(ctxMock).tellSelf(any(), any(Long.class));
// creation of first message // creation of first message
TbMsg firstMsg = TbMsg.newMsg(TbMsg.EMPTY_STRING, RULE_NODE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg firstMsg = TbMsg.builder()
.type(TbMsg.EMPTY_STRING)
.originator(RULE_NODE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
given(ctxMock.newMsg(null, TbMsg.EMPTY_STRING, RULE_NODE_ID, null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT)).willReturn(firstMsg); given(ctxMock.newMsg(null, TbMsg.EMPTY_STRING, RULE_NODE_ID, null, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT)).willReturn(firstMsg);
// creation of generated message // creation of generated message
TbMsgMetaData metaData = new TbMsgMetaData(Map.of("data", "40")); TbMsgMetaData metaData = new TbMsgMetaData(Map.of("data", "40"));
TbMsg generatedMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, RULE_NODE_ID, metaData, "{ \"temp\": 42, \"humidity\": 77 }"); TbMsg generatedMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(RULE_NODE_ID)
.metaData(metaData.copy())
.data("{ \"temp\": 42, \"humidity\": 77 }")
.build();
given(scriptEngineMock.executeGenerateAsync(any())).willReturn(Futures.immediateFuture(generatedMsg)); given(scriptEngineMock.executeGenerateAsync(any())).willReturn(Futures.immediateFuture(generatedMsg));
// creation of prev message // creation of prev message
TbMsg prevMsg = TbMsg.newMsg(generatedMsg.getType(), RULE_NODE_ID, generatedMsg.getMetaData(), generatedMsg.getData()); TbMsg prevMsg = TbMsg.builder()
.type(generatedMsg.getType())
.originator(RULE_NODE_ID)
.metaData(generatedMsg.getMetaData().copy())
.data(generatedMsg.getData())
.build();
given(ctxMock.newMsg(null, generatedMsg.getType(), RULE_NODE_ID, null, generatedMsg.getMetaData(), generatedMsg.getData())).willReturn(prevMsg); given(ctxMock.newMsg(null, generatedMsg.getType(), RULE_NODE_ID, null, generatedMsg.getMetaData(), generatedMsg.getData())).willReturn(prevMsg);
// WHEN // WHEN

33
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java

@ -85,8 +85,15 @@ public class TbMsgPushToEdgeNodeTest {
Mockito.when(ctx.getEdgeService()).thenReturn(edgeService); Mockito.when(ctx.getEdgeService()).thenReturn(edgeService);
Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, deviceId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(new PageData<>()); Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, deviceId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(new PageData<>());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -106,8 +113,15 @@ public class TbMsgPushToEdgeNodeTest {
PageData<EdgeId> edgePageData = new PageData<>(List.of(edgeId), 1, 1, false); PageData<EdgeId> edgePageData = new PageData<>(List.of(edgeId), 1, 1, false);
Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, userId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(edgePageData); Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, userId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(edgePageData);
TbMsg msg = TbMsg.newMsg(TbMsgType.ATTRIBUTES_UPDATED, userId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, null, null); .type(TbMsgType.ATTRIBUTES_UPDATED)
.originator(userId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -137,8 +151,15 @@ public class TbMsgPushToEdgeNodeTest {
Mockito.when(ctx.getDbCallbackExecutor()).thenReturn(dbCallbackExecutor); Mockito.when(ctx.getDbCallbackExecutor()).thenReturn(dbCallbackExecutor);
Mockito.when(edgeEventService.saveAsync(any())).thenReturn(SettableFuture.create()); Mockito.when(edgeEventService.saveAsync(any())).thenReturn(SettableFuture.create());
TbMsg msg = TbMsg.newMsg(event, new EdgeId(UUID.randomUUID()), metaData, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, "{\"lastConnectTs\":1}", null, null); .type(event)
.originator(new EdgeId(UUID.randomUUID()))
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data("{\"lastConnectTs\":1}")
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbAssetTypeSwitchNodeTest.java

@ -118,7 +118,13 @@ class TbAssetTypeSwitchNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId) { private TbMsg getTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, callback); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(callback)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNodeTest.java

@ -174,7 +174,12 @@ class TbCheckAlarmStatusNodeTest {
} }
private TbMsg getTbMsg(String msgData) { private TbMsg getTbMsg(String msgData) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, msgData); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
} }
} }

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckMessageNodeTest.java

@ -44,7 +44,12 @@ import static org.mockito.Mockito.verify;
class TbCheckMessageNodeTest { class TbCheckMessageNodeTest {
private static final DeviceId DEVICE_ID = new DeviceId(UUID.randomUUID()); private static final DeviceId DEVICE_ID = new DeviceId(UUID.randomUUID());
private static final TbMsg EMPTY_POST_ATTRIBUTES_MSG = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); private static final TbMsg EMPTY_POST_ATTRIBUTES_MSG = TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
private TbCheckMessageNode node; private TbCheckMessageNode node;
@ -196,7 +201,12 @@ class TbCheckMessageNodeTest {
metadata.putValue(DataConstants.DEVICE_NAME, "Test Device"); metadata.putValue(DataConstants.DEVICE_NAME, "Test Device");
metadata.putValue(DataConstants.DEVICE_TYPE, DataConstants.DEFAULT_DEVICE_TYPE); metadata.putValue(DataConstants.DEVICE_TYPE, DataConstants.DEFAULT_DEVICE_TYPE);
metadata.putValue("ts", String.valueOf(System.currentTimeMillis())); metadata.putValue("ts", String.valueOf(System.currentTimeMillis()));
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, metadata, data); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(data)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbCheckRelationNodeTest.java

@ -66,7 +66,12 @@ class TbCheckRelationNodeTest extends AbstractRuleNodeUpgradeTest {
private final TenantId TENANT_ID = new TenantId(UUID.randomUUID()); private final TenantId TENANT_ID = new TenantId(UUID.randomUUID());
private final DeviceId ORIGINATOR_ID = new DeviceId(UUID.randomUUID()); private final DeviceId ORIGINATOR_ID = new DeviceId(UUID.randomUUID());
private final TestDbCallbackExecutor DB_EXECUTOR = new TestDbCallbackExecutor(); private final TestDbCallbackExecutor DB_EXECUTOR = new TestDbCallbackExecutor();
private final TbMsg EMPTY_POST_ATTRIBUTES_MSG = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, ORIGINATOR_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); private final TbMsg EMPTY_POST_ATTRIBUTES_MSG = TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(ORIGINATOR_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
private TbCheckRelationNode node; private TbCheckRelationNode node;

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbDeviceTypeSwitchNodeTest.java

@ -118,6 +118,12 @@ class TbDeviceTypeSwitchNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId) { private TbMsg getTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT, callback); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.callback(callback)
.build();
} }
} }

30
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java

@ -59,7 +59,15 @@ public class TbJsFilterNodeTest {
@Test @Test
public void falseEvaluationDoNotSendMsg() throws TbNodeException { public void falseEvaluationDoNotSendMsg() throws TbNodeException {
initWithScript(); initWithScript();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, null, TbMsgMetaData.EMPTY, TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(null)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFuture(false)); when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFuture(false));
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -71,7 +79,15 @@ public class TbJsFilterNodeTest {
public void exceptionInJsThrowsException() throws TbNodeException { public void exceptionInJsThrowsException() throws TbNodeException {
initWithScript(); initWithScript();
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, null, metaData, TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(null)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFailedFuture(new ScriptException("error"))); when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFailedFuture(new ScriptException("error")));
@ -83,7 +99,15 @@ public class TbJsFilterNodeTest {
public void metadataConditionCanBeTrue() throws TbNodeException { public void metadataConditionCanBeTrue() throws TbNodeException {
initWithScript(); initWithScript();
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, null, metaData, TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(null)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFuture(true)); when(scriptEngine.executeFilterAsync(msg)).thenReturn(Futures.immediateFuture(true));
node.onMsg(ctx, msg); node.onMsg(ctx, msg);

10
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java

@ -59,7 +59,15 @@ public class TbJsSwitchNodeTest {
metaData.putValue("humidity", "99"); metaData.putValue("humidity", "99");
String rawJson = "{\"name\": \"Vit\", \"passed\": 5}"; String rawJson = "{\"name\": \"Vit\", \"passed\": 5}";
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, null, metaData, TbMsgDataType.JSON, rawJson, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(null)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(rawJson)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
when(scriptEngine.executeSwitchAsync(msg)).thenReturn(Futures.immediateFuture(Sets.newHashSet("one", "three"))); when(scriptEngine.executeSwitchAsync(msg)).thenReturn(Futures.immediateFuture(Sets.newHashSet("one", "three")));
node.onMsg(ctx, msg); node.onMsg(ctx, msg);

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbMsgTypeFilterNodeTest.java

@ -97,7 +97,12 @@ class TbMsgTypeFilterNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId, TbMsgType msgType) { private TbMsg getTbMsg(EntityId entityId, TbMsgType msgType) {
return TbMsg.newMsg(msgType, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.builder()
.type(msgType)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbMsgTypeSwitchNodeTest.java

@ -89,7 +89,12 @@ class TbMsgTypeSwitchNodeTest {
} }
private TbMsg getTbMsg(TbMsgType msgType) { private TbMsg getTbMsg(TbMsgType msgType) {
return TbMsg.newMsg(msgType, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.builder()
.type(msgType)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeFilterNodeTest.java

@ -96,7 +96,12 @@ class TbOriginatorTypeFilterNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId) { private TbMsg getTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeSwitchNodeTest.java

@ -90,7 +90,12 @@ class TbOriginatorTypeSwitchNodeTest {
} }
private TbMsg getTbMsg(EntityId entityId) { private TbMsg getTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbAckNodeTest.java

@ -67,7 +67,12 @@ public class TbAckNodeTest {
public void givenMsg_whenOnMsg_thenAckAndTellSuccess() throws TbNodeException { public void givenMsg_whenOnMsg_thenAckAndTellSuccess() throws TbNodeException {
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
DeviceId deviceId = new DeviceId(UUID.fromString("5770153d-6ca2-4447-8a54-5d8a4538e052")); DeviceId deviceId = new DeviceId(UUID.fromString("5770153d-6ca2-4447-8a54-5d8a4538e052"));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbCheckpointNodeTest.java

@ -87,7 +87,12 @@ public class TbCheckpointNodeTest extends AbstractRuleNodeUpgradeTest {
given(ctxMock.getQueueName()).willReturn(queueName); given(ctxMock.getQueueName()).willReturn(queueName);
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<Runnable> onSuccess = ArgumentCaptor.forClass(Runnable.class); ArgumentCaptor<Runnable> onSuccess = ArgumentCaptor.forClass(Runnable.class);
@ -101,7 +106,12 @@ public class TbCheckpointNodeTest extends AbstractRuleNodeUpgradeTest {
given(ctxMock.getQueueName()).willReturn(DataConstants.HP_QUEUE_NAME); given(ctxMock.getQueueName()).willReturn(DataConstants.HP_QUEUE_NAME);
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<Consumer<Throwable>> onFailure = ArgumentCaptor.forClass(Consumer.class); ArgumentCaptor<Consumer<Throwable>> onFailure = ArgumentCaptor.forClass(Consumer.class);

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbRuleChainInputNodeTest.java

@ -300,6 +300,11 @@ public class TbRuleChainInputNodeTest extends AbstractRuleNodeUpgradeTest {
} }
private TbMsg getMsg(EntityId entityId) { private TbMsg getMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); return TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
} }
} }

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/flow/TbRuleChainOutputNodeTest.java

@ -74,7 +74,12 @@ public class TbRuleChainOutputNodeTest {
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
DeviceId deviceId = new DeviceId(UUID.fromString("f514da88-79b3-46da-9f02-1747c5e84f44")); DeviceId deviceId = new DeviceId(UUID.fromString("f514da88-79b3-46da-9f02-1747c5e84f44"));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().output(msg, "test"); then(ctxMock).should().output(msg, "test");

28
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNodeTest.java

@ -118,7 +118,12 @@ class TbPubSubNodeTest {
given(ctxMock.getExternalCallExecutor()).willReturn(executor); given(ctxMock.getExternalCallExecutor()).willReturn(executor);
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -164,7 +169,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metadata, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).ack(msg); then(ctxMock).should(never()).ack(msg);
@ -193,7 +203,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).ack(any()); then(ctxMock).should(never()).ack(any());
@ -221,7 +236,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/geo/TbGpsGeofencingActionNodeTest.java

@ -164,7 +164,12 @@ class TbGpsGeofencingActionNodeTest extends AbstractRuleNodeUpgradeTest {
private TbMsg getTbMsg(EntityId entityId, TbMsgMetaData metadata, double latitude, double longitude) { private TbMsg getTbMsg(EntityId entityId, TbMsgMetaData metadata, double latitude, double longitude) {
String data = "{\"latitude\": " + latitude + ", \"longitude\": " + longitude + "}"; String data = "{\"latitude\": " + latitude + ", \"longitude\": " + longitude + "}";
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, metadata, data); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(metadata.copy())
.data(data)
.build();
} }
private TbMsgMetaData getMetadataForNewVersionPolygonPerimeter() { private TbMsgMetaData getMetadataForNewVersionPolygonPerimeter() {

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/geo/TbGpsGeofencingFilterNodeTest.java

@ -448,11 +448,21 @@ class TbGpsGeofencingFilterNodeTest {
private TbMsg getTbMsg(EntityId entityId, TbMsgMetaData metadata, double latitude, double longitude) { private TbMsg getTbMsg(EntityId entityId, TbMsgMetaData metadata, double latitude, double longitude) {
String data = "{\"latitude\": " + latitude + ", \"longitude\": " + longitude + "}"; String data = "{\"latitude\": " + latitude + ", \"longitude\": " + longitude + "}";
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, metadata, data); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(metadata.copy())
.data(data)
.build();
} }
private TbMsg getEmptyArrayTbMsg(EntityId entityId) { private TbMsg getEmptyArrayTbMsg(EntityId entityId) {
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
} }
} }

42
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/kafka/TbKafkaNodeTest.java

@ -188,7 +188,12 @@ public class TbKafkaNodeTest {
ReflectionTestUtils.setField(node, "initError", new ThingsboardKafkaClientError(errorMsg)); ReflectionTestUtils.setField(node, "initError", new ThingsboardKafkaClientError(errorMsg));
// WHEN // WHEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -212,7 +217,12 @@ public class TbKafkaNodeTest {
// WHEN // WHEN
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -232,7 +242,12 @@ public class TbKafkaNodeTest {
// GIVEN // GIVEN
config.setTopicPattern(topicPattern); config.setTopicPattern(topicPattern);
config.setKeyPattern(keyPattern); config.setKeyPattern(keyPattern);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
String topic = TbNodeUtils.processPattern(topicPattern, msg); String topic = TbNodeUtils.processPattern(topicPattern, msg);
String key = TbNodeUtils.processPattern(keyPattern, msg); String key = TbNodeUtils.processPattern(keyPattern, msg);
@ -278,7 +293,12 @@ public class TbKafkaNodeTest {
// WHEN // WHEN
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -303,7 +323,12 @@ public class TbKafkaNodeTest {
// WHEN // WHEN
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -331,7 +356,12 @@ public class TbKafkaNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("key", "value"); metaData.putValue("key", "value");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java

@ -103,7 +103,12 @@ public class TbMsgToEmailNodeTest {
} }
var msgDataStr = "{\"temperature\": " + EXPECTED_TEMPERATURE + "}"; var msgDataStr = "{\"temperature\": " + EXPECTED_TEMPERATURE + "}";
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, md, msgDataStr); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(md.copy())
.data(msgDataStr)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

133
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/math/TbMathNodeTest.java

@ -173,7 +173,12 @@ public class TbMathNodeTest {
metaData.putValue("key2", "argumentA"); metaData.putValue("key2", "argumentA");
ObjectNode msgNode = JacksonUtil.newObjectNode() ObjectNode msgNode = JacksonUtil.newObjectNode()
.put("key3", "argumentB").put("argumentA", 2).put("argumentB", 2); .put("key3", "argumentB").put("argumentA", 2).put("argumentB", 2);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, metaData, msgNode.toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(metaData.copy())
.data(msgNode.toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -181,7 +186,12 @@ public class TbMathNodeTest {
metaData.putValue("key2", "argumentC"); metaData.putValue("key2", "argumentC");
msgNode = JacksonUtil.newObjectNode() msgNode = JacksonUtil.newObjectNode()
.put("key3", "argumentD").put("argumentC", 4).put("argumentD", 3); .put("key3", "argumentD").put("argumentC", 4).put("argumentD", 3);
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, metaData, msgNode.toString()); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(metaData.copy())
.data(msgNode.toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -228,7 +238,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", arg1).put("b", arg2).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", arg1).put("b", arg2).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -291,7 +306,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", arg1).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", arg1).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -314,7 +334,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -337,7 +362,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "b")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -361,7 +391,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.TIME_SERIES, "b") new TbMathArgument(TbMathArgumentType.TIME_SERIES, "b")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().toString())
.build();
when(attributesService.find(tenantId, originator, AttributeScope.SERVER_SCOPE, "a")) when(attributesService.find(tenantId, originator, AttributeScope.SERVER_SCOPE, "a"))
.thenReturn(Futures.immediateFuture(Optional.of(new BaseAttributeKvEntry(System.currentTimeMillis(), new DoubleDataEntry("a", 2.0))))); .thenReturn(Futures.immediateFuture(Optional.of(new BaseAttributeKvEntry(System.currentTimeMillis(), new DoubleDataEntry("a", 2.0)))));
@ -389,7 +424,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -411,7 +451,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -433,7 +478,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
when(telemetryService.saveAttrAndNotify(any(), any(), any(AttributeScope.class), anyString(), anyDouble())) when(telemetryService.saveAttrAndNotify(any(), any(), any(AttributeScope.class), anyString(), anyDouble()))
.thenReturn(Futures.immediateFuture(null)); .thenReturn(Futures.immediateFuture(null));
@ -459,7 +509,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
when(telemetryService.saveAndNotify(any(), any(), any(TsKvEntry.class))) when(telemetryService.saveAndNotify(any(), any(), any(TsKvEntry.class)))
.thenReturn(Futures.immediateFuture(null)); .thenReturn(Futures.immediateFuture(null));
@ -484,7 +539,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 5).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 5).toString())
.build();
when(telemetryService.saveAndNotify(any(), any(), any(TsKvEntry.class))) when(telemetryService.saveAndNotify(any(), any(), any(TsKvEntry.class)))
.thenReturn(Futures.immediateFuture(null)); .thenReturn(Futures.immediateFuture(null));
@ -515,7 +575,12 @@ public class TbMathNodeTest {
new TbMathResult(TbMathArgumentType.MESSAGE_METADATA, "result", 3, false, false, null), new TbMathResult(TbMathArgumentType.MESSAGE_METADATA, "result", 3, false, false, null),
tbMathArgument tbMathArgument
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 10).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 10).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
ArgumentCaptor<TbMsg> msgCaptor = ArgumentCaptor.forClass(TbMsg.class); ArgumentCaptor<TbMsg> msgCaptor = ArgumentCaptor.forClass(TbMsg.class);
@ -535,7 +600,12 @@ public class TbMathNodeTest {
new TbMathResult(TbMathArgumentType.TIME_SERIES, "result", 3, true, false, DataConstants.SERVER_SCOPE), new TbMathResult(TbMathArgumentType.TIME_SERIES, "result", 3, true, false, DataConstants.SERVER_SCOPE),
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "TestKey") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "TestKey")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 10).toString()); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 10).toString())
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -550,7 +620,12 @@ public class TbMathNodeTest {
new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a") new TbMathArgument(TbMathArgumentType.MESSAGE_BODY, "a")
); );
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -570,10 +645,20 @@ public class TbMathNodeTest {
CountDownLatch slowProcessingLatch = new CountDownLatch(1); CountDownLatch slowProcessingLatch = new CountDownLatch(1);
List<TbMsg> slowMsgList = IntStream.range(0, 5) List<TbMsg> slowMsgList = IntStream.range(0, 5)
.mapToObj(x -> TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originatorSlow, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())) .mapToObj(x -> TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originatorSlow)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build())
.toList(); .toList();
List<TbMsg> fastMsgList = IntStream.range(0, 2) List<TbMsg> fastMsgList = IntStream.range(0, 2)
.mapToObj(x -> TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originatorFast, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())) .mapToObj(x -> TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originatorFast)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build())
.toList(); .toList();
assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE); assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE);
@ -640,7 +725,12 @@ public class TbMathNodeTest {
CountDownLatch slowProcessingLatch = new CountDownLatch(1); CountDownLatch slowProcessingLatch = new CountDownLatch(1);
List<TbMsg> slowMsgList = IntStream.range(0, 5) List<TbMsg> slowMsgList = IntStream.range(0, 5)
.mapToObj(x -> TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originatorSlow, TbMsgMetaData.EMPTY, JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())) .mapToObj(x -> TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originatorSlow)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.newObjectNode().put("a", 2).put("b", 2).toString())
.build())
.collect(Collectors.toList()); .collect(Collectors.toList());
assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE); assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE);
@ -713,7 +803,12 @@ public class TbMathNodeTest {
}) })
.toList(); .toList();
ctxNodes.forEach(ctxNode -> ruleEngineDispatcherExecutor.executeAsync(() -> ctxNode.getRight() ctxNodes.forEach(ctxNode -> ruleEngineDispatcherExecutor.executeAsync(() -> ctxNode.getRight()
.onMsg(ctxNode.getLeft(), TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, TbMsgMetaData.EMPTY, "{\"a\":2,\"b\":2}")))); .onMsg(ctxNode.getLeft(), TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("{\"a\":2,\"b\":2}")
.build())));
ctxNodes.forEach(ctxNode -> verify(ctxNode.getRight(), timeout(TIMEOUT)).onMsg(eq(ctxNode.getLeft()), any())); ctxNodes.forEach(ctxNode -> verify(ctxNode.getRight(), timeout(TIMEOUT)).onMsg(eq(ctxNode.getLeft()), any()));
processingLatch.countDown(); processingLatch.countDown();

112
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNodeTest.java

@ -169,7 +169,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
// GIVEN // GIVEN
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
var msgData = "{\"pulseCounter\": 42}"; var msgData = "{\"pulseCounter\": 42}";
var msg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -184,7 +189,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenInvalidMsgDataType_whenOnMsg_thenShouldTellNextOther() throws TbNodeException { public void givenInvalidMsgDataType_whenOnMsg_thenShouldTellNextOther() throws TbNodeException {
// GIVEN // GIVEN
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -200,7 +210,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenInputKeyIsNotPresent_whenOnMsg_thenShouldTellNextOther() throws TbNodeException { public void givenInputKeyIsNotPresent_whenOnMsg_thenShouldTellNextOther() throws TbNodeException {
// GIVEN // GIVEN
node.init(ctxMock, nodeConfiguration); node.init(ctxMock, nodeConfiguration);
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -224,7 +239,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", 40.5))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", 40.5)));
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -254,7 +274,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("temperature", 40L))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("temperature", 40L)));
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -284,7 +309,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("temperature", "40.0"))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("temperature", "40.0")));
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -318,7 +348,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var firstMsgMetaData = new TbMsgMetaData(); var firstMsgMetaData = new TbMsgMetaData();
firstMsgMetaData.putValue("ts", String.valueOf(3L)); firstMsgMetaData.putValue("ts", String.valueOf(3L));
var firstMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, firstMsgMetaData, msgData); var firstMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(firstMsgMetaData.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, firstMsg); node.onMsg(ctxMock, firstMsg);
@ -344,7 +379,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
var secondMsgMetaData = new TbMsgMetaData(); var secondMsgMetaData = new TbMsgMetaData();
secondMsgMetaData.putValue("ts", String.valueOf(6L)); secondMsgMetaData.putValue("ts", String.valueOf(6L));
var secondMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, secondMsgMetaData, msgData); var secondMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(secondMsgMetaData.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, secondMsg); node.onMsg(ctxMock, secondMsg);
@ -375,7 +415,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", null))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", null)));
var msgData = "{\"temperature\": 42,\"airPressure\":123}"; var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -403,7 +448,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L)));
var msgData = "{\"pulseCounter\":\"123\"}"; var msgData = "{\"pulseCounter\":\"123\"}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -435,7 +485,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L)));
var msgData = "{\"pulseCounter\":\"123\"}"; var msgData = "{\"pulseCounter\":\"123\"}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -459,7 +514,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("pulseCounter", "high"))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("pulseCounter", "high")));
var msgData = "{\"pulseCounter\":\"123\"}"; var msgData = "{\"pulseCounter\":\"123\"}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -484,7 +544,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new BooleanDataEntry("pulseCounter", false))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new BooleanDataEntry("pulseCounter", false)));
var msgData = "{\"pulseCounter\":true}"; var msgData = "{\"pulseCounter\":true}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -509,7 +574,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new JsonDataEntry("pulseCounter", "{\"isActive\":false}"))); mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new JsonDataEntry("pulseCounter", "{\"isActive\":false}")));
var msgData = "{\"pulseCounter\":{\"isActive\":true}}"; var msgData = "{\"pulseCounter\":{\"isActive\":true}}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -552,7 +622,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
List<TbMsg> tbMsgList = IntStream.range(0, RULE_DISPATCHER_POOL_SIZE * 2).mapToObj(x -> { List<TbMsg> tbMsgList = IntStream.range(0, RULE_DISPATCHER_POOL_SIZE * 2).mapToObj(x -> {
var msgData = "{\"pulseCounter\":" + 2 + "}"; var msgData = "{\"pulseCounter\":" + 2 + "}";
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); return TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
}).toList(); }).toList();
CountDownLatch processingLatch = new CountDownLatch(tbMsgList.size()); CountDownLatch processingLatch = new CountDownLatch(tbMsgList.size());
@ -597,7 +672,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(1L, new DoubleDataEntry("temperature", testConfig.prevValue()))); mockFindLatestAsync(new BasicTsKvEntry(1L, new DoubleDataEntry("temperature", testConfig.prevValue())));
var msgData = "{\"temperature\":" + testConfig.currentValue() + ",\"airPressure\":123}"; var msgData = "{\"temperature\":" + testConfig.currentValue() + ",\"airPressure\":123}";
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, msgData); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(msgData)
.build();
// WHEN // WHEN
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNodeTest.java

@ -173,7 +173,13 @@ public class TbFetchDeviceCredentialsNodeTest {
final var metaData = new TbMsgMetaData(mdMap); final var metaData = new TbMsgMetaData(mdMap);
final String data = "{\"TestAttribute_1\": \"humidity\", \"TestAttribute_2\": \"voltage\"}"; final String data = "{\"TestAttribute_1\": \"humidity\", \"TestAttribute_2\": \"voltage\"}";
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, metaData, data, callbackMock); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(metaData.copy())
.data(data)
.callback(callbackMock)
.build();
} }
} }

15
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNodeTest.java

@ -17,7 +17,6 @@ package org.thingsboard.rule.engine.metadata;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
@ -247,7 +246,12 @@ public class TbGetAttributesNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenFetchLatestTimeseriesToDataAndDataIsNotJsonObject_whenOnMsg_thenException() throws Exception { public void givenFetchLatestTimeseriesToDataAndDataIsNotJsonObject_whenOnMsg_thenException() throws Exception {
// GIVEN // GIVEN
node = initNode(TbMsgSource.DATA, true, true); node = initNode(TbMsgSource.DATA, true, true);
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, ORIGINATOR_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(ORIGINATOR_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -343,7 +347,12 @@ public class TbGetAttributesNodeTest extends AbstractRuleNodeUpgradeTest {
msgMetaData.putValue("client_attr_metadata", "client_attr_3"); msgMetaData.putValue("client_attr_metadata", "client_attr_3");
msgMetaData.putValue("server_attr_metadata", "server_attr_3"); msgMetaData.putValue("server_attr_metadata", "server_attr_3");
return TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, entityId, msgMetaData, JacksonUtil.toString(msgData)); return TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(entityId)
.metaData(msgMetaData.copy())
.data(JacksonUtil.toString(msgData))
.build();
} }
private List<String> getAttributeNames(String prefix) { private List<String> getAttributeNames(String prefix) {

21
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java

@ -210,7 +210,12 @@ public class TbGetCustomerAttributeNodeTest {
public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() {
// GIVEN // GIVEN
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -225,7 +230,12 @@ public class TbGetCustomerAttributeNodeTest {
// GIVEN // GIVEN
var userId = new UserId(UUID.randomUUID()); var userId = new UserId(UUID.randomUUID());
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, userId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(userId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
when(ctxMock.getTenantId()).thenReturn(TENANT_ID); when(ctxMock.getTenantId()).thenReturn(TENANT_ID);
@ -469,7 +479,12 @@ public class TbGetCustomerAttributeNodeTest {
var msgData = "{\"temp\":42,\"humidity\":77,\"messageBodyPattern1\":\"targetKey2\",\"messageBodyPattern2\":\"sourceKey3\"}"; var msgData = "{\"temp\":42,\"humidity\":77,\"messageBodyPattern1\":\"targetKey2\",\"messageBodyPattern2\":\"sourceKey3\"}";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
} }
@RequiredArgsConstructor @RequiredArgsConstructor

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java

@ -159,7 +159,12 @@ public class TbGetCustomerDetailsNodeTest {
public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() {
// GIVEN // GIVEN
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -458,7 +463,12 @@ public class TbGetCustomerDetailsNodeTest {
var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
} }
private void mockFindCustomer() { private void mockFindCustomer() {

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetDeviceAttrNodeTest.java

@ -115,7 +115,12 @@ public class TbGetDeviceAttrNodeTest extends AbstractRuleNodeUpgradeTest {
given(deviceServiceMock.findDevicesByQuery(any(TenantId.class), any(DeviceSearchQuery.class))).willReturn(Futures.immediateFuture(Collections.emptyList())); given(deviceServiceMock.findDevicesByQuery(any(TenantId.class), any(DeviceSearchQuery.class))).willReturn(Futures.immediateFuture(Collections.emptyList()));
given(ctxMock.getDbCallbackExecutor()).willReturn(executor); given(ctxMock.getDbCallbackExecutor()).willReturn(executor);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<Throwable> actualException = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> actualException = ArgumentCaptor.forClass(Throwable.class);

42
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNodeTest.java

@ -135,7 +135,12 @@ public class TbGetOriginatorFieldsNodeTest {
public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() {
// GIVEN // GIVEN
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -164,7 +169,12 @@ public class TbGetOriginatorFieldsNodeTest {
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
var msgMetaData = new TbMsgMetaData(); var msgMetaData = new TbMsgMetaData();
var msgData = "{\"temp\":42,\"humidity\":77}"; var msgData = "{\"temp\":42,\"humidity\":77}";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock);
when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID); when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID);
@ -206,7 +216,12 @@ public class TbGetOriginatorFieldsNodeTest {
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
var msgMetaData = new TbMsgMetaData(); var msgMetaData = new TbMsgMetaData();
var msgData = "{\"temp\":42,\"humidity\":77}"; var msgData = "{\"temp\":42,\"humidity\":77}";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock);
when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID); when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID);
@ -249,7 +264,12 @@ public class TbGetOriginatorFieldsNodeTest {
"testKey1", "testValue1", "testKey1", "testValue1",
"testKey2", "123")); "testKey2", "123"));
var msgData = "[\"value1\",\"value2\"]"; var msgData = "[\"value1\",\"value2\"]";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock);
when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID); when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID);
@ -297,7 +317,12 @@ public class TbGetOriginatorFieldsNodeTest {
"testKey1", "testValue1", "testKey1", "testValue1",
"testKey2", "123")); "testKey2", "123"));
var msgData = "[\"value1\",\"value2\"]"; var msgData = "[\"value1\",\"value2\"]";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock); when(ctxMock.getDeviceService()).thenReturn(deviceServiceMock);
when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID); when(ctxMock.getTenantId()).thenReturn(DUMMY_TENANT_ID);
@ -355,7 +380,12 @@ public class TbGetOriginatorFieldsNodeTest {
"testKey1", "testValue1", "testKey1", "testValue1",
"testKey2", "123")); "testKey2", "123"));
var msgData = "[\"value1\",\"value2\"]"; var msgData = "[\"value1\",\"value2\"]";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, new DashboardId(UUID.randomUUID()), msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(new DashboardId(UUID.randomUUID()))
.metaData(msgMetaData.copy())
.data(msgData)
.build();
when(ctxMock.getDbCallbackExecutor()).thenReturn(DB_EXECUTOR); when(ctxMock.getDbCallbackExecutor()).thenReturn(DB_EXECUTOR);

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNodeTest.java

@ -223,7 +223,12 @@ public class TbGetRelatedAttributeNodeTest {
public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() {
// GIVEN // GIVEN
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -592,7 +597,12 @@ public class TbGetRelatedAttributeNodeTest {
msgData = "{\"temp\":42,\"humidity\":77,\"messageBodyPattern1\":\"targetKey2\",\"messageBodyPattern2\":\"sourceKey3\"}"; msgData = "{\"temp\":42,\"humidity\":77,\"messageBodyPattern1\":\"targetKey2\",\"messageBodyPattern2\":\"sourceKey3\"}";
} }
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
} }
@RequiredArgsConstructor @RequiredArgsConstructor

70
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNodeTest.java

@ -182,7 +182,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
// WHEN-THEN // WHEN-THEN
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
assertThatThrownBy(() -> node.onMsg(ctxMock, msg)) assertThatThrownBy(() -> node.onMsg(ctxMock, msg))
.isInstanceOf(RuntimeException.class) .isInstanceOf(RuntimeException.class)
.hasMessage("Interval start should be less than Interval end"); .hasMessage("Interval start should be less than Interval end");
@ -205,7 +210,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
long endTs = 1719220353000L; long endTs = 1719220353000L;
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("mdStartInterval", String.valueOf(startTs)); metaData.putValue("mdStartInterval", String.valueOf(startTs));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, "{\"msgEndInterval\":\"" + endTs + "\"}"); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data("{\"msgEndInterval\":\"" + endTs + "\"}")
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -227,7 +237,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(Collections.emptyList())); given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(Collections.emptyList()));
// WHEN // WHEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -251,7 +266,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
// WHEN // WHEN
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("mdTsKey", "humidity"); metaData.putValue("mdTsKey", "humidity");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, "{\"msgTsKey\":\"pressure\"}"); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data("{\"msgTsKey\":\"pressure\"}")
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -276,7 +296,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(Collections.emptyList())); given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(Collections.emptyList()));
// WHEN // WHEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -306,7 +331,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(Collections.emptyList())); given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(Collections.emptyList()));
// WHEN // WHEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -346,7 +376,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(Collections.emptyList())); given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(Collections.emptyList()));
// WHEN // WHEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -382,7 +417,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
// WHEN-THEN // WHEN-THEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, "{\"msgStartInterval\":\"start\"}"); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("{\"msgStartInterval\":\"start\"}")
.build();
assertThatThrownBy(() -> node.onMsg(ctxMock, msg)).isInstanceOf(IllegalArgumentException.class).hasMessage(errorMsg); assertThatThrownBy(() -> node.onMsg(ctxMock, msg)).isInstanceOf(IllegalArgumentException.class).hasMessage(errorMsg);
} }
@ -411,7 +451,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(tsKvEntries)); given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(tsKvEntries));
// WHEN // WHEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN
@ -442,7 +487,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(tsKvEntries)); given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(tsKvEntries));
// WHEN // WHEN
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
// THEN // THEN

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNodeTest.java

@ -190,7 +190,12 @@ public class TbGetTenantAttributeNodeTest {
public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() {
// GIVEN // GIVEN
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -398,7 +403,12 @@ public class TbGetTenantAttributeNodeTest {
var msgData = "{\"temp\":42,\"humidity\":77,\"messageBodyPattern1\":\"targetKey2\",\"messageBodyPattern2\":\"sourceKey3\"}"; var msgData = "{\"temp\":42,\"humidity\":77,\"messageBodyPattern1\":\"targetKey2\",\"messageBodyPattern2\":\"sourceKey3\"}";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
} }
@RequiredArgsConstructor @RequiredArgsConstructor

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNodeTest.java

@ -129,7 +129,12 @@ public class TbGetTenantDetailsNodeTest {
public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() { public void givenMsgDataIsNotAnJsonObjectAndFetchToData_whenOnMsg_thenException() {
// GIVEN // GIVEN
node.fetchTo = TbMsgSource.DATA; node.fetchTo = TbMsgSource.DATA;
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
// WHEN // WHEN
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg)); var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -289,7 +294,12 @@ public class TbGetTenantDetailsNodeTest {
var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}"; var msgData = "{\"dataKey1\":123,\"dataKey2\":\"dataValue2\"}";
msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DUMMY_DEVICE_ORIGINATOR, msgMetaData, msgData); msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DUMMY_DEVICE_ORIGINATOR)
.metaData(msgMetaData.copy())
.data(msgData)
.build();
} }
private void mockFindTenant() { private void mockFindTenant() {

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mqtt/TbMqttNodeTest.java

@ -283,7 +283,12 @@ public class TbMqttNodeTest extends AbstractRuleNodeUpgradeTest {
return null; return null;
}).given(future).addListener(any()); }).given(future).addListener(any());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
mqttNode.onMsg(ctxMock, msg); mqttNode.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -322,7 +327,12 @@ public class TbMqttNodeTest extends AbstractRuleNodeUpgradeTest {
return null; return null;
}).given(future).addListener(any()); }).given(future).addListener(any());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, "\"string\""); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("\"string\"")
.build();
mqttNode.onMsg(ctxMock, msg); mqttNode.onMsg(ctxMock, msg);
then(ctxMock).should(never()).ack(msg); then(ctxMock).should(never()).ack(msg);

53
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/DeviceStateTest.java

@ -95,7 +95,12 @@ public class DeviceStateTest {
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), any())).thenAnswer(invocationOnMock -> { when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), any())).thenAnswer(invocationOnMock -> {
TbMsgType type = invocationOnMock.getArgument(1); TbMsgType type = invocationOnMock.getArgument(1);
String data = invocationOnMock.getArgument(invocationOnMock.getArguments().length - 1); String data = invocationOnMock.getArgument(invocationOnMock.getArguments().length - 1);
return TbMsg.newMsg(type, null, TbMsgMetaData.EMPTY, data); return TbMsg.builder()
.type(type)
.originator(null)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(data)
.build();
}); });
} }
@ -107,8 +112,12 @@ public class DeviceStateTest {
DeviceId deviceId = new DeviceId(UUID.randomUUID()); DeviceId deviceId = new DeviceId(UUID.randomUUID());
DeviceState deviceState = createDeviceState(deviceId, alarmConfig); DeviceState deviceState = createDeviceState(deviceId, alarmConfig);
TbMsg attributeUpdateMsg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, TbMsg attributeUpdateMsg = TbMsg.builder()
deviceId, TbMsgMetaData.EMPTY, "{ \"enabled\": false }"); .type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("{ \"enabled\": false }")
.build();
deviceState.process(ctx, attributeUpdateMsg); deviceState.process(ctx, attributeUpdateMsg);
@ -116,11 +125,21 @@ public class DeviceStateTest {
verify(ctx).enqueueForTellNext(resultMsgCaptor.capture(), eq("Alarm Created")); verify(ctx).enqueueForTellNext(resultMsgCaptor.capture(), eq("Alarm Created"));
Alarm alarm = JacksonUtil.fromString(resultMsgCaptor.getValue().getData(), Alarm.class); Alarm alarm = JacksonUtil.fromString(resultMsgCaptor.getValue().getData(), Alarm.class);
deviceState.process(ctx, TbMsg.newMsg(TbMsgType.ALARM_CLEAR, deviceId, TbMsgMetaData.EMPTY, JacksonUtil.toString(alarm))); deviceState.process(ctx, TbMsg.builder()
.type(TbMsgType.ALARM_CLEAR)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.toString(alarm))
.build());
reset(ctx); reset(ctx);
String deletedAttributes = "{ \"attributes\": [ \"other\" ] }"; String deletedAttributes = "{ \"attributes\": [ \"other\" ] }";
deviceState.process(ctx, TbMsg.newMsg(TbMsgType.ATTRIBUTES_DELETED, deviceId, TbMsgMetaData.EMPTY, deletedAttributes)); deviceState.process(ctx, TbMsg.builder()
.type(TbMsgType.ATTRIBUTES_DELETED)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(deletedAttributes)
.build());
verify(ctx, never()).enqueueForTellNext(any(), anyString()); verify(ctx, never()).enqueueForTellNext(any(), anyString());
} }
@ -130,17 +149,31 @@ public class DeviceStateTest {
DeviceId deviceId = new DeviceId(UUID.randomUUID()); DeviceId deviceId = new DeviceId(UUID.randomUUID());
DeviceState deviceState = createDeviceState(deviceId, alarmConfig); DeviceState deviceState = createDeviceState(deviceId, alarmConfig);
TbMsg attributeUpdateMsg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, TbMsg attributeUpdateMsg = TbMsg.builder()
deviceId, TbMsgMetaData.EMPTY, "{ \"enabled\": false }"); .type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("{ \"enabled\": false }")
.build();
deviceState.process(ctx, attributeUpdateMsg); deviceState.process(ctx, attributeUpdateMsg);
ArgumentCaptor<TbMsg> resultMsgCaptor = ArgumentCaptor.forClass(TbMsg.class); ArgumentCaptor<TbMsg> resultMsgCaptor = ArgumentCaptor.forClass(TbMsg.class);
verify(ctx).enqueueForTellNext(resultMsgCaptor.capture(), eq("Alarm Created")); verify(ctx).enqueueForTellNext(resultMsgCaptor.capture(), eq("Alarm Created"));
Alarm alarm = JacksonUtil.fromString(resultMsgCaptor.getValue().getData(), Alarm.class); Alarm alarm = JacksonUtil.fromString(resultMsgCaptor.getValue().getData(), Alarm.class);
deviceState.process(ctx, TbMsg.newMsg(TbMsgType.ALARM_CLEAR, deviceId, TbMsgMetaData.EMPTY, JacksonUtil.toString(alarm))); deviceState.process(ctx, TbMsg.builder()
.type(TbMsgType.ALARM_CLEAR)
TbMsg alarmDeleteNotification = TbMsg.newMsg(TbMsgType.ALARM_DELETE, deviceId, TbMsgMetaData.EMPTY, JacksonUtil.toString(alarm)); .originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.toString(alarm))
.build());
TbMsg alarmDeleteNotification = TbMsg.builder()
.type(TbMsgType.ALARM_DELETE)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.toString(alarm))
.build();
assertDoesNotThrow(() -> { assertDoesNotThrow(() -> {
deviceState.process(ctx, alarmDeleteNotification); deviceState.process(ctx, alarmDeleteNotification);
}); });

417
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeTest.java

@ -127,8 +127,13 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile); Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42); data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg("123456789", deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data)); .type("123456789")
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any()); verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any());
@ -146,8 +151,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile); Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42); data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any()); verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any());
@ -198,26 +210,50 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(alarmService.findLatestActiveByOriginatorAndType(tenantId, deviceId, "highTemperatureAlarm")).thenReturn(null); Mockito.when(alarmService.findLatestActiveByOriginatorAndType(tenantId, deviceId, "highTemperatureAlarm")).thenReturn(null);
registerCreateAlarmMock(alarmService.createAlarm(any()), true); registerCreateAlarmMock(alarmService.createAlarm(any()), true);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg); when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42); data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
verify(ctx).enqueueForTellNext(theMsg, "Alarm Created"); verify(ctx).enqueueForTellNext(theMsg, "Alarm Created");
verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any()); verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any());
TbMsg theMsg2 = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, "2"); TbMsg theMsg2 = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("2")
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg2); when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg2);
registerCreateAlarmMock(alarmService.updateAlarm(any()), false); registerCreateAlarmMock(alarmService.updateAlarm(any()), false);
Thread.sleep(1); Thread.sleep(1);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg2 = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
verify(ctx).enqueueForTellNext(theMsg2, "Alarm Updated"); verify(ctx).enqueueForTellNext(theMsg2, "Alarm Updated");
@ -274,19 +310,36 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(alarmService.findLatestActiveByOriginatorAndType(tenantId, deviceId, "highTemperatureAlarm1")).thenReturn(null); Mockito.when(alarmService.findLatestActiveByOriginatorAndType(tenantId, deviceId, "highTemperatureAlarm1")).thenReturn(null);
registerCreateAlarmMock(alarmService.createAlarm(any()), true); registerCreateAlarmMock(alarmService.createAlarm(any()), true);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg); when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42); data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
verify(ctx).enqueueForTellNext(theMsg, "Alarm Created"); verify(ctx).enqueueForTellNext(theMsg, "Alarm Created");
verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any()); verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any());
TbMsg theMsg2 = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg2 = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg2); when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg2);
AlarmInfo alarm = new AlarmInfo(new Alarm(new AlarmId(UUID.randomUUID()))); AlarmInfo alarm = new AlarmInfo(new Alarm(new AlarmId(UUID.randomUUID())));
@ -305,8 +358,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
when(alarmService.updateAlarm(any())).thenReturn(result); when(alarmService.updateAlarm(any())).thenReturn(result);
data.put("temperature", 52); data.put("temperature", 52);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg2 = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
verify(ctx).enqueueForTellNext(theMsg2, "Alarm Severity Updated"); verify(ctx).enqueueForTellNext(theMsg2, "Alarm Severity Updated");
@ -380,14 +440,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(attrListListenableFuture); .thenReturn(attrListListenableFuture);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.any(TbMsgType.class), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.any(TbMsgType.class), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 21); data.put("temperature", 21);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -468,14 +540,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(tenantId), Mockito.any(AttributeScope.class), Mockito.anyString())) Mockito.when(attributesService.find(eq(tenantId), eq(tenantId), Mockito.any(AttributeScope.class), Mockito.anyString()))
.thenReturn(attrListListenableFuture); .thenReturn(attrListListenableFuture);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 21); data.put("temperature", 21);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -538,14 +622,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listListenableFutureWithLess); .thenReturn(listListenableFutureWithLess);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -634,14 +730,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listListenableFuture); .thenReturn(listListenableFuture);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -655,8 +763,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Thread.sleep(halfOfAlarmDelay + 1); Thread.sleep(halfOfAlarmDelay + 1);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg2 = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -760,14 +875,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listNoDurationAttribute); .thenReturn(listNoDurationAttribute);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150); data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -781,8 +908,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Thread.sleep(halfOfAlarmDelay + 1); Thread.sleep(halfOfAlarmDelay + 1);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg2 = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -871,14 +1005,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listListenableFuture); .thenReturn(listListenableFuture);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150); data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -886,8 +1032,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
verify(ctx, Mockito.never()).tellNext(theMsg, "Alarm Created"); verify(ctx, Mockito.never()).tellNext(theMsg, "Alarm Created");
data.put("temperature", 151); data.put("temperature", 151);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg2 = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -989,14 +1142,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listNoDurationAttribute); .thenReturn(listNoDurationAttribute);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150); data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1004,8 +1169,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
verify(ctx, Mockito.never()).tellNext(theMsg, "Alarm Created"); verify(ctx, Mockito.never()).tellNext(theMsg, "Alarm Created");
data.put("temperature", 151); data.put("temperature", 151);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg2 = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -1086,14 +1258,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listListenableFuture); .thenReturn(listListenableFuture);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1107,8 +1291,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Thread.sleep(halfOfAlarmDelay + 1); Thread.sleep(halfOfAlarmDelay + 1);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg2 = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -1185,14 +1376,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listListenableFuture); .thenReturn(listListenableFuture);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1268,14 +1471,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listListenableFutureActiveSchedule); .thenReturn(listListenableFutureActiveSchedule);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
// Mockito.reset(ctx); // Mockito.reset(ctx);
@ -1365,12 +1580,24 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet())) Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.thenReturn(listListenableFutureInactiveSchedule); .thenReturn(listListenableFutureInactiveSchedule);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1444,14 +1671,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(customerId), eq(AttributeScope.SERVER_SCOPE), Mockito.anyString())) Mockito.when(attributesService.find(eq(tenantId), eq(customerId), eq(AttributeScope.SERVER_SCOPE), Mockito.anyString()))
.thenReturn(optionalListenableFutureWithLess); .thenReturn(optionalListenableFutureWithLess);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 25); data.put("temperature", 25);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1518,14 +1757,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(tenantId), eq(AttributeScope.SERVER_SCOPE), Mockito.anyString())) Mockito.when(attributesService.find(eq(tenantId), eq(tenantId), eq(AttributeScope.SERVER_SCOPE), Mockito.anyString()))
.thenReturn(optionalListenableFutureWithLess); .thenReturn(optionalListenableFutureWithLess);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 40); data.put("temperature", 40);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1602,14 +1853,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(tenantId), eq(AttributeScope.SERVER_SCOPE), Mockito.anyString())) Mockito.when(attributesService.find(eq(tenantId), eq(tenantId), eq(AttributeScope.SERVER_SCOPE), Mockito.anyString()))
.thenReturn(optionalListenableFutureWithLess); .thenReturn(optionalListenableFutureWithLess);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150L); data.put("temperature", 150L);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1688,14 +1951,26 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(tenantId), eq(AttributeScope.SERVER_SCOPE), Mockito.anyString())) Mockito.when(attributesService.find(eq(tenantId), eq(tenantId), eq(AttributeScope.SERVER_SCOPE), Mockito.anyString()))
.thenReturn(optionalListenableFutureWithLess); .thenReturn(optionalListenableFutureWithLess);
TbMsg theMsg = TbMsg.newMsg(TbMsgType.ALARM, deviceId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_STRING); TbMsg theMsg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_STRING)
.build();
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())) when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150L); data.put("temperature", 150L);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);

21
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rabbitmq/TbRabbitMqNodeTest.java

@ -147,7 +147,12 @@ public class TbRabbitMqNodeTest {
given(ctxMock.getExternalCallExecutor()).willReturn(executor); given(ctxMock.getExternalCallExecutor()).willReturn(executor);
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().ack(msg); then(ctxMock).should().ack(msg);
@ -178,7 +183,12 @@ public class TbRabbitMqNodeTest {
given(ctxMock.getExternalCallExecutor()).willReturn(executor); given(ctxMock.getExternalCallExecutor()).willReturn(executor);
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(never()).ack(any(TbMsg.class)); then(ctxMock).should(never()).ack(any(TbMsg.class));
@ -201,7 +211,12 @@ public class TbRabbitMqNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config))); node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should(forceAck ? times(1) : never()).ack(any(TbMsg.class)); then(ctxMock).should(forceAck ? times(1) : never()).ack(any(TbMsg.class));

17
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rest/TbHttpClientTest.java

@ -140,11 +140,18 @@ public class TbHttpClientTest {
var httpClient = new TbHttpClient(config, eventLoop); var httpClient = new TbHttpClient(config, eventLoop);
var msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, new DeviceId(EntityId.NULL_UUID), TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); var msg = TbMsg.builder()
var successMsg = TbMsg.newMsg( .type(TbMsgType.POST_TELEMETRY_REQUEST)
TbMsgType.POST_TELEMETRY_REQUEST, msg.getOriginator(), .originator(new DeviceId(EntityId.NULL_UUID))
msg.getMetaData(), msg.getData() .metaData(TbMsgMetaData.EMPTY.copy())
); .data(TbMsg.EMPTY_JSON_OBJECT)
.build();
var successMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(msg.getOriginator())
.metaData(msg.getMetaData().copy())
.data(msg.getData())
.build();
var ctx = mock(TbContext.class); var ctx = mock(TbContext.class);
when(ctx.transformMsg( when(ctx.transformMsg(

20
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rest/TbRestApiCallNodeTest.java

@ -142,7 +142,15 @@ public class TbRestApiCallNodeTest extends AbstractRuleNodeUpgradeTest {
config.setRestEndpointUrlPattern(String.format("http://localhost:%d%s", server.getLocalPort(), path)); config.setRestEndpointUrlPattern(String.format("http://localhost:%d%s", server.getLocalPort(), path));
initWithConfig(config); initWithConfig(config);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, metaData, TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
restNode.onMsg(ctx, msg); restNode.onMsg(ctx, msg);
assertTrue(latch.await(10, TimeUnit.SECONDS), "Server handled request"); assertTrue(latch.await(10, TimeUnit.SECONDS), "Server handled request");
@ -203,7 +211,15 @@ public class TbRestApiCallNodeTest extends AbstractRuleNodeUpgradeTest {
config.setRestEndpointUrlPattern(String.format("http://localhost:%d%s", server.getLocalPort(), path)); config.setRestEndpointUrlPattern(String.format("http://localhost:%d%s", server.getLocalPort(), path));
initWithConfig(config); initWithConfig(config);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, originator, metaData, TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, ruleChainId, ruleNodeId); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(originator)
.metaData(metaData.copy())
.dataType(TbMsgDataType.JSON)
.data(TbMsg.EMPTY_JSON_OBJECT)
.ruleChainId(ruleChainId)
.ruleNodeId(ruleNodeId)
.build();
restNode.onMsg(ctx, msg); restNode.onMsg(ctx, msg);
assertTrue(latch.await(10, TimeUnit.SECONDS), "Server handled request"); assertTrue(latch.await(10, TimeUnit.SECONDS), "Server handled request");

14
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rest/TbSendRestApiCallReplyNodeTest.java

@ -89,7 +89,12 @@ public class TbSendRestApiCallReplyNodeTest {
Map<String, String> metadata = Map.of( Map<String, String> metadata = Map.of(
requestIdAttribute, requestUUIDStr, requestIdAttribute, requestUUIDStr,
serviceIdAttribute, serviceIdStr); serviceIdAttribute, serviceIdStr);
TbMsg msg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, DEVICE_ID, new TbMsgMetaData(metadata), data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(DEVICE_ID)
.metaData(new TbMsgMetaData(metadata).copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
@ -109,7 +114,12 @@ public class TbSendRestApiCallReplyNodeTest {
@ParameterizedTest @ParameterizedTest
@MethodSource @MethodSource
public void givenInvalidRequest_whenOnMsg_thenTellFailure(TbMsgMetaData metaData, String data, String errorMsg) { public void givenInvalidRequest_whenOnMsg_thenTellFailure(TbMsgMetaData metaData, String data, String errorMsg) {
TbMsg msg = TbMsg.newMsg(TbMsgType.REST_API_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.REST_API_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

36
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNodeTest.java

@ -92,8 +92,15 @@ public class TbSendRPCReplyNodeTest {
public void sendReplyToTransport() { public void sendReplyToTransport() {
when(ctx.getRpcService()).thenReturn(rpcService); when(ctx.getRpcService()).thenReturn(rpcService);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, getDefaultMetadata(), TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, DUMMY_DATA, null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(getDefaultMetadata().copy())
.dataType(TbMsgDataType.JSON)
.data(DUMMY_DATA)
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -111,8 +118,15 @@ public class TbSendRPCReplyNodeTest {
TbMsgMetaData defaultMetadata = getDefaultMetadata(); TbMsgMetaData defaultMetadata = getDefaultMetadata();
defaultMetadata.putValue(DataConstants.EDGE_ID, UUID.randomUUID().toString()); defaultMetadata.putValue(DataConstants.EDGE_ID, UUID.randomUUID().toString());
defaultMetadata.putValue(DataConstants.DEVICE_ID, UUID.randomUUID().toString()); defaultMetadata.putValue(DataConstants.DEVICE_ID, UUID.randomUUID().toString());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, defaultMetadata, TbMsg msg = TbMsg.builder()
TbMsgDataType.JSON, DUMMY_DATA, null, null); .type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(defaultMetadata.copy())
.dataType(TbMsgDataType.JSON)
.data(DUMMY_DATA)
.ruleChainId(null)
.ruleNodeId(null)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -124,7 +138,12 @@ public class TbSendRPCReplyNodeTest {
@EnumSource(EntityType.class) @EnumSource(EntityType.class)
public void testOriginatorEntityTypes(EntityType entityType) { public void testOriginatorEntityTypes(EntityType entityType) {
EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, "0f386739-210f-4e23-8739-23f84a172adc"); EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, "0f386739-210f-4e23-8739-23f84a172adc");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
@ -138,7 +157,12 @@ public class TbSendRPCReplyNodeTest {
@ParameterizedTest @ParameterizedTest
@MethodSource @MethodSource
public void testForAvailabilityOfMetadataAndDataValues(TbMsgMetaData metaData, String errorMsg) { public void testForAvailabilityOfMetadataAndDataValues(TbMsgMetaData metaData, String errorMsg) {
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, metaData, TbMsg.EMPTY_STRING); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(metaData.copy())
.data(TbMsg.EMPTY_STRING)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);

140
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNodeTest.java

@ -107,7 +107,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData msgMetadata = new TbMsgMetaData(); TbMsgMetaData msgMetadata = new TbMsgMetaData();
msgMetadata.putValue("oneway", mdKeyValue); msgMetadata.putValue("oneway", mdKeyValue);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, msgMetadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(msgMetadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
var ruleEngineDeviceRpcRequestCaptor = captureRequest(); var ruleEngineDeviceRpcRequestCaptor = captureRequest();
@ -128,7 +133,12 @@ public class TbSendRPCRequestNodeTest {
given(ctxMock.getRpcService()).willReturn(rpcServiceMock); given(ctxMock.getRpcService()).willReturn(rpcServiceMock);
given(ctxMock.getTenantId()).willReturn(TENANT_ID); given(ctxMock.getTenantId()).willReturn(TENANT_ID);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, TbMsgMetaData.EMPTY, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = ArgumentCaptor.forClass(RuleEngineDeviceRpcRequest.class); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = ArgumentCaptor.forClass(RuleEngineDeviceRpcRequest.class);
@ -149,7 +159,12 @@ public class TbSendRPCRequestNodeTest {
given(ctxMock.getRpcService()).willReturn(rpcServiceMock); given(ctxMock.getRpcService()).willReturn(rpcServiceMock);
given(ctxMock.getTenantId()).willReturn(TENANT_ID); given(ctxMock.getTenantId()).willReturn(TENANT_ID);
TbMsg msg = TbMsg.newMsg(TbMsgType.TO_SERVER_RPC_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.TO_SERVER_RPC_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -170,7 +185,12 @@ public class TbSendRPCRequestNodeTest {
"requestId": 12345 "requestId": 12345
} }
"""; """;
TbMsg msg = TbMsg.newMsg(TbMsgType.TO_SERVER_RPC_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.TO_SERVER_RPC_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -185,7 +205,12 @@ public class TbSendRPCRequestNodeTest {
String requestUUID = "b795a241-5a30-48fb-92d5-46b864d47130"; String requestUUID = "b795a241-5a30-48fb-92d5-46b864d47130";
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue("requestUUID", requestUUID); metadata.putValue("requestUUID", requestUUID);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -200,7 +225,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue("requestUUID", requestUUID); metadata.putValue("requestUUID", requestUUID);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -215,7 +245,12 @@ public class TbSendRPCRequestNodeTest {
String originServiceId = "service-id-123"; String originServiceId = "service-id-123";
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue("originServiceId", originServiceId); metadata.putValue("originServiceId", originServiceId);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -230,7 +265,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue("originServiceId", originServiceId); metadata.putValue("originServiceId", originServiceId);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -245,7 +285,12 @@ public class TbSendRPCRequestNodeTest {
String expirationTime = "2000000000000"; String expirationTime = "2000000000000";
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue(DataConstants.EXPIRATION_TIME, expirationTime); metadata.putValue(DataConstants.EXPIRATION_TIME, expirationTime);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -260,7 +305,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue(DataConstants.EXPIRATION_TIME, expirationTime); metadata.putValue(DataConstants.EXPIRATION_TIME, expirationTime);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -275,7 +325,12 @@ public class TbSendRPCRequestNodeTest {
Integer retries = 3; Integer retries = 3;
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue(DataConstants.RETRIES, String.valueOf(retries)); metadata.putValue(DataConstants.RETRIES, String.valueOf(retries));
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -290,7 +345,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue(DataConstants.RETRIES, retries); metadata.putValue(DataConstants.RETRIES, retries);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -303,7 +363,12 @@ public class TbSendRPCRequestNodeTest {
given(ctxMock.getRpcService()).willReturn(rpcServiceMock); given(ctxMock.getRpcService()).willReturn(rpcServiceMock);
given(ctxMock.getTenantId()).willReturn(TENANT_ID); given(ctxMock.getTenantId()).willReturn(TENANT_ID);
TbMsg msg = TbMsg.newMsg(msgType, DEVICE_ID, TbMsgMetaData.EMPTY, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(msgType)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -322,7 +387,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData(); TbMsgMetaData metadata = new TbMsgMetaData();
metadata.putValue(DataConstants.PERSISTENT, isPersisted); metadata.putValue(DataConstants.PERSISTENT, isPersisted);
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, metadata, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest(); ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -346,7 +416,12 @@ public class TbSendRPCRequestNodeTest {
@Test @Test
public void givenRpcResponseWithoutError_whenOnMsg_thenSendsRpcRequest() { public void givenRpcResponseWithoutError_whenOnMsg_thenSendsRpcRequest() {
TbMsg outMsg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg outMsg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
given(ctxMock.getRpcService()).willReturn(rpcServiceMock); given(ctxMock.getRpcService()).willReturn(rpcServiceMock);
given(ctxMock.getTenantId()).willReturn(TENANT_ID); given(ctxMock.getTenantId()).willReturn(TENANT_ID);
@ -361,7 +436,12 @@ public class TbSendRPCRequestNodeTest {
return null; return null;
}).given(rpcServiceMock).sendRpcRequestToDevice(any(RuleEngineDeviceRpcRequest.class), any(Consumer.class)); }).given(rpcServiceMock).sendRpcRequestToDevice(any(RuleEngineDeviceRpcRequest.class), any(Consumer.class));
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, TbMsgMetaData.EMPTY, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().enqueueForTellNext(outMsg, TbNodeConnectionType.SUCCESS); then(ctxMock).should().enqueueForTellNext(outMsg, TbNodeConnectionType.SUCCESS);
@ -370,7 +450,12 @@ public class TbSendRPCRequestNodeTest {
@Test @Test
public void givenRpcResponseWithError_whenOnMsg_thenTellFailure() { public void givenRpcResponseWithError_whenOnMsg_thenTellFailure() {
TbMsg outMsg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg outMsg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
given(ctxMock.getRpcService()).willReturn(rpcServiceMock); given(ctxMock.getRpcService()).willReturn(rpcServiceMock);
given(ctxMock.getTenantId()).willReturn(TENANT_ID); given(ctxMock.getTenantId()).willReturn(TENANT_ID);
@ -384,7 +469,12 @@ public class TbSendRPCRequestNodeTest {
return null; return null;
}).given(rpcServiceMock).sendRpcRequestToDevice(any(RuleEngineDeviceRpcRequest.class), any(Consumer.class)); }).given(rpcServiceMock).sendRpcRequestToDevice(any(RuleEngineDeviceRpcRequest.class), any(Consumer.class));
TbMsg msg = TbMsg.newMsg(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE, DEVICE_ID, TbMsgMetaData.EMPTY, MSG_DATA); TbMsg msg = TbMsg.builder()
.type(TbMsgType.RPC_CALL_FROM_SERVER_TO_DEVICE)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(MSG_DATA)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
then(ctxMock).should().enqueueForTellFailure(outMsg, RpcError.NO_ACTIVE_CONNECTION.name()); then(ctxMock).should().enqueueForTellFailure(outMsg, RpcError.NO_ACTIVE_CONNECTION.name());
@ -396,7 +486,12 @@ public class TbSendRPCRequestNodeTest {
public void givenOriginatorIsNotDevice_whenOnMsg_thenThrowsException(EntityType entityType) { public void givenOriginatorIsNotDevice_whenOnMsg_thenThrowsException(EntityType entityType) {
EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, "ac21a1bb-eabf-4463-8313-24bea1f498d9"); EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, "ac21a1bb-eabf-4463-8313-24bea1f498d9");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, entityId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(entityId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<Throwable> throwableCaptor = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> throwableCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -409,7 +504,12 @@ public class TbSendRPCRequestNodeTest {
@ParameterizedTest @ParameterizedTest
@ValueSource(strings = {"method", "params"}) @ValueSource(strings = {"method", "params"})
public void givenMethodOrParamsAreNotPresent_whenOnMsg_thenThrowsException(String key) { public void givenMethodOrParamsAreNotPresent_whenOnMsg_thenThrowsException(String key) {
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, "{\"" + key + "\": \"value\"}"); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("{\"" + key + "\": \"value\"}")
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNodeTest.java

@ -164,7 +164,12 @@ class TbMsgAttributesNodeTest extends AbstractRuleNodeUpgradeTest {
md.putValue(NOTIFY_DEVICE_METADATA_KEY, mdValue); md.putValue(NOTIFY_DEVICE_METADATA_KEY, mdValue);
} }
// dummy list with one ts kv to pass the empty list check. // dummy list with one ts kv to pass the empty list check.
var testTbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, md, TbMsg.EMPTY_STRING); var testTbMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(md.copy())
.data(TbMsg.EMPTY_STRING)
.build();
List<AttributeKvEntry> testAttrList = List.of(new BaseAttributeKvEntry(0L, new StringDataEntry("testKey", "testValue"))); List<AttributeKvEntry> testAttrList = List.of(new BaseAttributeKvEntry(0L, new StringDataEntry("testKey", "testValue")));
node.saveAttr(testAttrList, ctxMock, testTbMsg, AttributeScope.SHARED_SCOPE, false); node.saveAttr(testAttrList, ctxMock, testTbMsg, AttributeScope.SHARED_SCOPE, false);

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesNodeTest.java

@ -139,7 +139,13 @@ public class TbMsgDeleteAttributesNodeTest {
} }
final String data = "{\"TestAttribute_2\": \"humidity\", \"TestAttribute_3\": \"voltage\"}"; final String data = "{\"TestAttribute_2\": \"humidity\", \"TestAttribute_3\": \"voltage\"}";
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, deviceId, metaData, data, callback); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(deviceId)
.metaData(metaData.copy())
.data(data)
.callback(callback)
.build();
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
ArgumentCaptor<Runnable> successCaptor = ArgumentCaptor.forClass(Runnable.class); ArgumentCaptor<Runnable> successCaptor = ArgumentCaptor.forClass(Runnable.class);

28
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNodeTest.java

@ -96,7 +96,12 @@ public class TbMsgTimeseriesNodeTest {
@EnumSource(TbMsgType.class) @EnumSource(TbMsgType.class)
public void givenMsgTypeAndEmptyMsgData_whenOnMsg_thenVerifyFailureMsg(TbMsgType msgType) throws TbNodeException { public void givenMsgTypeAndEmptyMsgData_whenOnMsg_thenVerifyFailureMsg(TbMsgType msgType) throws TbNodeException {
init(); init();
TbMsg msg = TbMsg.newMsg(msgType, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_ARRAY); TbMsg msg = TbMsg.builder()
.type(msgType)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_ARRAY)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
ArgumentCaptor<Throwable> throwableCaptor = ArgumentCaptor.forClass(Throwable.class); ArgumentCaptor<Throwable> throwableCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -122,7 +127,12 @@ public class TbMsgTimeseriesNodeTest {
"humidity": 77 "humidity": 77
} }
"""; """;
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(data)
.build();
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
when(ctxMock.getTenantId()).thenReturn(TENANT_ID); when(ctxMock.getTenantId()).thenReturn(TENANT_ID);
@ -159,7 +169,12 @@ public class TbMsgTimeseriesNodeTest {
"""; """;
long ts = System.currentTimeMillis(); long ts = System.currentTimeMillis();
var metadata = Map.of("ts", String.valueOf(ts)); var metadata = Map.of("ts", String.valueOf(ts));
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, new TbMsgMetaData(metadata), data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(new TbMsgMetaData(metadata).copy())
.data(data)
.build();
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock); when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
when(ctxMock.getTenantId()).thenReturn(TENANT_ID); when(ctxMock.getTenantId()).thenReturn(TENANT_ID);
@ -197,7 +212,12 @@ public class TbMsgTimeseriesNodeTest {
"""; """;
var metadata = new TbMsgMetaData(); var metadata = new TbMsgMetaData();
metadata.putValue("TTL", ttlFromMd); metadata.putValue("TTL", ttlFromMd);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metadata, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metadata.copy())
.data(data)
.build();
node.onMsg(ctxMock, msg); node.onMsg(ctxMock, msg);
verify(telemetryServiceMock).saveAndNotify(eq(TENANT_ID), isNull(), eq(DEVICE_ID), anyList(), eq(expectedTtl), any(TelemetryNodeCallback.class)); verify(telemetryServiceMock).saveAndNotify(eq(TENANT_ID), isNull(), eq(DEVICE_ID), anyList(), eq(expectedTtl), any(TelemetryNodeCallback.class));

42
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java

@ -176,7 +176,12 @@ public class TbChangeOriginatorNodeTest {
Device device = new Device(DEVICE_ID); Device device = new Device(DEVICE_ID);
device.setCustomerId(CUSTOMER_ID); device.setCustomerId(CUSTOMER_ID);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
TbMsg expectedMsg = TbMsg.transformMsgOriginator(msg, CUSTOMER_ID); TbMsg expectedMsg = TbMsg.transformMsgOriginator(msg, CUSTOMER_ID);
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
@ -199,7 +204,12 @@ public class TbChangeOriginatorNodeTest {
public void givenOriginatorSourceIsTenant_whenOnMsg_thenTellSuccess() throws TbNodeException { public void givenOriginatorSourceIsTenant_whenOnMsg_thenTellSuccess() throws TbNodeException {
config.setOriginatorSource(TENANT); config.setOriginatorSource(TENANT);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, ASSET_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(ASSET_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
TbMsg expectedMsg = TbMsg.transformMsgOriginator(msg, TENANT_ID); TbMsg expectedMsg = TbMsg.transformMsgOriginator(msg, TENANT_ID);
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
@ -219,7 +229,12 @@ public class TbChangeOriginatorNodeTest {
public void givenOriginatorSourceIsRelatedAndNewOriginatorIsNull_whenOnMsg_thenTellFailure() throws TbNodeException { public void givenOriginatorSourceIsRelatedAndNewOriginatorIsNull_whenOnMsg_thenTellFailure() throws TbNodeException {
config.setOriginatorSource(RELATED); config.setOriginatorSource(RELATED);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, ASSET_ID, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(ASSET_ID)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
given(ctxMock.getRelationService()).willReturn(relationServiceMock); given(ctxMock.getRelationService()).willReturn(relationServiceMock);
@ -253,7 +268,12 @@ public class TbChangeOriginatorNodeTest {
Alarm alarm = new Alarm(alarmId); Alarm alarm = new Alarm(alarmId);
alarm.setOriginator(DEVICE_ID); alarm.setOriginator(DEVICE_ID);
TbMsg msg = TbMsg.newMsg(TbMsgType.ALARM, alarmId, TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.ALARM)
.originator(alarmId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
TbMsg expectedMsg = TbMsg.transformMsgOriginator(msg, DEVICE_ID); TbMsg expectedMsg = TbMsg.transformMsgOriginator(msg, DEVICE_ID);
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
@ -279,7 +299,12 @@ public class TbChangeOriginatorNodeTest {
config.setEntityType(EntityType.ASSET.name()); config.setEntityType(EntityType.ASSET.name());
config.setEntityNamePattern(entityNamePattern); config.setEntityNamePattern(entityNamePattern);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, data); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(data)
.build();
TbMsg expectedMsg = TbMsg.transformMsgOriginator(msg, ASSET_ID); TbMsg expectedMsg = TbMsg.transformMsgOriginator(msg, ASSET_ID);
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
@ -315,7 +340,12 @@ public class TbChangeOriginatorNodeTest {
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("md-name-pattern", "test-asset"); metaData.putValue("md-name-pattern", "test-asset");
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, DEVICE_ID, metaData, TbMsg.EMPTY_JSON_OBJECT); TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(DEVICE_ID)
.metaData(metaData.copy())
.data(TbMsg.EMPTY_JSON_OBJECT)
.build();
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor); given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
given(ctxMock.getAssetService()).willReturn(assetServiceMock); given(ctxMock.getAssetService()).willReturn(assetServiceMock);

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java

@ -196,7 +196,13 @@ public class TbCopyKeysNodeTest {
"voltageDataValue", "220", "voltageDataValue", "220",
"city", "NY" "city", "NY"
); );
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, new TbMsgMetaData(mdMap), data, callback); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(new TbMsgMetaData(mdMap).copy())
.data(data)
.callback(callback)
.build();
} }
} }

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java

@ -173,7 +173,13 @@ public class TbDeleteKeysNodeTest {
"voltageDataValue", "220", "voltageDataValue", "220",
"city", "NY" "city", "NY"
); );
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, new TbMsgMetaData(mdMap), data, callback); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(new TbMsgMetaData(mdMap).copy())
.data(data)
.callback(callback)
.build();
} }
} }

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbJsonPathNodeTest.java

@ -171,6 +171,12 @@ public class TbJsonPathNodeTest {
Map<String, String> mdMap = Map.of("country", "US", Map<String, String> mdMap = Map.of("country", "US",
"city", "NY" "city", "NY"
); );
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, new TbMsgMetaData(mdMap), data, callback); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(new TbMsgMetaData(mdMap).copy())
.data(data)
.callback(callback)
.build();
} }
} }

20
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbMsgDeduplicationNodeTest.java

@ -103,7 +103,12 @@ public class TbMsgDeduplicationNodeTest extends AbstractRuleNodeUpgradeTest {
EntityId originator = (EntityId) (invocationOnMock.getArguments())[2]; EntityId originator = (EntityId) (invocationOnMock.getArguments())[2];
TbMsgMetaData metaData = (TbMsgMetaData) (invocationOnMock.getArguments())[3]; TbMsgMetaData metaData = (TbMsgMetaData) (invocationOnMock.getArguments())[3];
String data = (String) (invocationOnMock.getArguments())[4]; String data = (String) (invocationOnMock.getArguments())[4];
return TbMsg.newMsg(type, originator, metaData.copy(), data); return TbMsg.builder()
.type(type)
.originator(originator)
.metaData(metaData.copy().copy())
.data(data)
.build();
}).when(ctx).newMsg(isNull(), eq(TbMsgType.DEDUPLICATION_TIMEOUT_SELF_MSG), nullable(EntityId.class), any(TbMsgMetaData.class), any(String.class)); }).when(ctx).newMsg(isNull(), eq(TbMsgType.DEDUPLICATION_TIMEOUT_SELF_MSG), nullable(EntityId.class), any(TbMsgMetaData.class), any(String.class));
node = spy(new TbMsgDeduplicationNode()); node = spy(new TbMsgDeduplicationNode());
config = new TbMsgDeduplicationNodeConfiguration().defaultConfiguration(); config = new TbMsgDeduplicationNodeConfiguration().defaultConfiguration();
@ -452,12 +457,13 @@ public class TbMsgDeduplicationNodeTest extends AbstractRuleNodeUpgradeTest {
dataNode.put("deviceId", deviceId.getId().toString()); dataNode.put("deviceId", deviceId.getId().toString());
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("ts", String.valueOf(ts)); metaData.putValue("ts", String.valueOf(ts));
return TbMsg.newMsg( return TbMsg.builder()
DataConstants.MAIN_QUEUE_NAME, .queueName(DataConstants.MAIN_QUEUE_NAME)
TbMsgType.POST_TELEMETRY_REQUEST, .type(TbMsgType.POST_TELEMETRY_REQUEST)
deviceId, .originator(deviceId)
metaData, .metaData(metaData.copy())
JacksonUtil.toString(dataNode)); .data(JacksonUtil.toString(dataNode))
.build();
} }
private String getMergedData(List<TbMsg> msgs) { private String getMergedData(List<TbMsg> msgs) {

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbRenameKeysNodeTest.java

@ -188,6 +188,12 @@ public class TbRenameKeysNodeTest {
"country", "US", "country", "US",
"city", "NY" "city", "NY"
); );
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, new TbMsgMetaData(mdMap), data, callback); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(new TbMsgMetaData(mdMap).copy())
.data(data)
.callback(callback)
.build();
} }
} }

8
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbSplitArrayMsgNodeTest.java

@ -132,6 +132,12 @@ public class TbSplitArrayMsgNodeTest {
"country", "US", "country", "US",
"city", "NY" "city", "NY"
); );
return TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, entityId, new TbMsgMetaData(mdMap), data, callback); return TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(entityId)
.metaData(new TbMsgMetaData(mdMap).copy())
.data(data)
.callback(callback)
.build();
} }
} }

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save