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);
}
@Override
public TbMsg newMsg(String queueName, String type, EntityId originator, TbMsgMetaData metaData, String data) {
return newMsg(queueName, type, originator, null, metaData, data);
}
@Override
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
@ -383,7 +387,16 @@ public class DefaultTbContext implements TbContext {
@Override
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
@ -497,7 +510,15 @@ public class DefaultTbContext implements TbContext {
defaultQueueName = profile.getDefaultQueueName();
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) {
@ -515,7 +536,15 @@ public class DefaultTbContext implements TbContext {
defaultQueueName = profile.getDefaultQueueName();
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

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

@ -239,7 +239,12 @@ public class RpcV2Controller extends AbstractRpcController {
rpcService.deleteRpc(getTenantId(), rpcId);
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);
}
}

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);
}
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) {
case "update":
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("requestUUID", requestId.toString());
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,
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()) {
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);
} catch (Exception 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) {
try {
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);
} catch (IllegalArgumentException 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) {
try {
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);
} catch (JsonProcessingException | IllegalArgumentException 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("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);
} catch (Exception 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,
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() {
@Override
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();
data.put("method", deviceRpcCallMsg.getRequestMsg().getMethod());
data.put("params", deviceRpcCallMsg.getRequestMsg().getParams());
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.TO_SERVER_RPC_REQUEST, deviceId, null, metaData,
TbMsgDataType.JSON, JacksonUtil.toString(data));
TbMsg tbMsg = TbMsg.builder()
.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() {
@Override
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());
metaData.putValue("ts", tsKv.getTs() + "");
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() {
@Override
public void onSuccess(TbQueueMsgMetadata metadata) {
@ -252,7 +261,16 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
SettableFuture<Void> futureToSet = SettableFuture.create();
JsonObject json = JsonUtils.getJsonObject(msg.getKvList());
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() {
@Override
public void onSuccess(TbQueueMsgMetadata metadata) {
@ -281,8 +299,16 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
@Override
public void onSuccess(@Nullable Void tmp) {
var defaultQueueAndRuleChain = getDefaultQueueNameAndRuleChainId(tenantId, entityId);
TbMsg tbMsg = TbMsg.newMsg(defaultQueueAndRuleChain.getKey(), TbMsgType.ATTRIBUTES_UPDATED, entityId,
customerId, metaData, gson.toJson(json), defaultQueueAndRuleChain.getValue(), null);
TbMsg tbMsg = TbMsg.builder()
.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() {
@Override
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) {
String data = JacksonUtil.toString(JacksonUtil.valueToTree(assignedDevice));
if (data != null) {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.ENTITY_ASSIGNED_FROM_TENANT, assignedDevice.getId(),
assignedDevice.getCustomerId(), getMetaDataForAssignedFrom(currentTenant), TbMsgDataType.JSON, data);
TbMsg tbMsg = TbMsg.builder()
.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);
}
}

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());
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);
} catch (IllegalArgumentException 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) {
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);
}

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

@ -857,7 +857,14 @@ public class DefaultDeviceStateService extends AbstractPartitionBasedService<Dev
if (!persistToTelemetry) {
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);
} catch (Exception 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();
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);
} else {
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) {
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() {
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() {
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() {

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

@ -62,7 +62,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
@Test
public void testHandleRuleEngineRequestWithMsgOriginatorUser() throws Exception {
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);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/", REQUEST_BODY, new TypeReference<>() {
@ -86,7 +91,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin();
Device device = createDevice("Test", "123");
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);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId(), REQUEST_BODY, new TypeReference<>() {
@ -110,7 +120,12 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin();
Device device = createDevice("Test", "123");
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);
JsonNode apiResponse = doPostAsyncWithTypedResponse("/api/rule-engine/DEVICE/" + deviceId.getId() + "/15000", REQUEST_BODY, new TypeReference<>() {
@ -156,7 +171,13 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
loginTenantAdmin();
Device device = createDevice("Test", "123");
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);
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);
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);
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) {
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()
.setTenantIdMSB(tenantId.getId().getMostSignificantBits())
.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);
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);
// Pushing Message to the system
actorSystem.tell(qMsg);
@ -309,7 +315,13 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
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);
// Pushing Message to the system
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");
TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
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);
// Pushing Message to the system
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);
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);
@ -305,7 +311,12 @@ public class DefaultTbClusterServiceTest {
public void testPushMsgToRuleEngineWithTenantIdIsNullUuidAndEntityIsDevice() {
TenantId tenantId = TenantId.SYS_TENANT_ID;
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);
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"));
DeviceId deviceId = new DeviceId(UUID.fromString("adbb9d41-3367-40fd-9e74-7dd7cc5d30cf"));
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(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer);
@ -341,7 +358,12 @@ public class DefaultTbClusterServiceTest {
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.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(producerProvider.getRuleEngineMsgProducer()).thenReturn(tbREQueueProducer);
@ -375,12 +397,12 @@ public class DefaultTbClusterServiceTest {
device.setDeviceProfileId(deviceProfileId);
// 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);
verify(deviceProfileCache, times(1)).get(tenantId, deviceId);
// 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);
verify(deviceProfileCache, times(1)).get(tenantId, deviceProfileId);
}
@ -395,12 +417,12 @@ public class DefaultTbClusterServiceTest {
asset.setAssetProfileId(assetProfileId);
// 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);
verify(assetProfileCache, times(1)).get(tenantId, assetId);
// 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);
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() {
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";
UUID requestId = UUID.fromString("f64a20df-eb1e-46a3-ba6f-0b3ae053ee0a");
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()
.setRequestIdMSB(requestId.getMostSignificantBits())
.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("requestUUID", requestId.toString());
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;
doAnswer(invocation -> {
@ -113,7 +119,13 @@ public class DefaultRuleEngineCallServiceTest {
metaData.put("serviceId", "core");
metaData.put("requestUUID", requestId.toString());
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;
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 {
for (Device device : devices) {
TbMsg tbMsg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST,
device.getId(),
getTbMsgMetadata(device.getName(), ts.get(idx)),
TbMsgDataType.JSON,
getTbMsgData(msgValue.get(idx)));
TbMsg tbMsg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(device.getId())
.metaData(getTbMsgMetadata(device.getName(), ts.get(idx)).copy())
.dataType(TbMsgDataType.JSON)
.data(getTbMsgData(msgValue.get(idx)))
.build();
saveDeviceTsEntry(device.getId(), tbMsg, msgValue.get(idx));
saveAssetTsEntry(asset, device.getName(), msgValue.get(idx), TbMsgTimeseriesNode.computeTs(tbMsg, configuration.isUseServerTs()));
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 lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@ -47,7 +46,6 @@ import static java.util.Objects.requireNonNull;
@Data
@Slf4j
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(toBuilder = true)
public final class TbMsg implements Serializable {
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);
}
@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,
RuleChainId ruleChainId, RuleNodeId ruleNodeId, UUID correlationId, Integer partition, TbMsgProcessingCtx ctx, TbMsgCallback callback) {
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.type = type != null ? type : this.internalType.name();
this.originator = requireNonNull(originator, "msg originator is missing");
this.originator = originator;
if (customerId == null || customerId.isNullUid()) {
if (originator != null && originator.getEntityType() == EntityType.CUSTOMER) {
this.customerId = new CustomerId(originator.getId());
@ -572,4 +347,150 @@ public final class TbMsg implements Serializable {
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.Tenant;
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.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId;
@ -1137,7 +1136,16 @@ public class DefaultTransportService extends TransportActivityManager implements
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));
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);
@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.
*

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();
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);
Assertions.assertEquals("ABC metadata_value data_value", result);
}
@ -58,7 +63,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode();
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);
Assertions.assertEquals(pattern, result);
}
@ -72,7 +82,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode();
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);
Assertions.assertEquals("ABC metadata_value data_value", result);
}
@ -93,7 +108,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode();
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);
Assertions.assertEquals("ABC metadata_value value3", result);
}
@ -114,7 +134,12 @@ public class TbNodeUtilsTest {
ObjectNode node = JacksonUtil.newObjectNode();
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);
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();
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);
scheduleTickMsg(ctx, tbMsg);
} 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();
}
}
deduplicationResults.add(TbMsg.newMsg(
queueName,
config.getOutMsgType(),
deduplicationId,
getMetadata(),
getMergedData(pack)));
deduplicationResults.add(TbMsg.builder()
.queueName(queueName)
.type(config.getOutMsgType())
.originator(deduplicationId)
.metaData(getMetadata().copy())
.data(getMergedData(pack))
.build());
} else {
TbMsg resultMsg = null;
boolean searchMin = DeduplicationStrategy.FIRST.equals(config.getStrategy());
@ -176,13 +177,15 @@ public class TbMsgDeduplicationNode implements TbNode {
}
}
if (resultMsg != null) {
deduplicationResults.add(TbMsg.newMsg(
queueName != null ? queueName : resultMsg.getQueueName(),
resultMsg.getType(),
resultMsg.getOriginator(),
resultMsg.getCustomerId(),
resultMsg.getMetaData(),
resultMsg.getData()));
String queueName1 = queueName != null ? queueName : resultMsg.getQueueName();
deduplicationResults.add(TbMsg.builder()
.queueName(queueName1)
.type(resultMsg.getType())
.originator(resultMsg.getOriginator())
.customerId(resultMsg.getCustomerId())
.metaData(resultMsg.getMetaData().copy())
.data(resultMsg.getData())
.build());
}
}
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()));
if (pendingMsg != null) {
ctx.enqueueForTellNext(
TbMsg.newMsg(
pendingMsg.getQueueName(),
pendingMsg.getType(),
pendingMsg.getOriginator(),
pendingMsg.getCustomerId(),
pendingMsg.getMetaData(),
pendingMsg.getData()
),
TbMsg.builder()
.queueName(pendingMsg.getQueueName())
.type(pendingMsg.getType())
.originator(pendingMsg.getOriginator())
.customerId(pendingMsg.getCustomerId())
.metaData(pendingMsg.getMetaData().copy())
.data(pendingMsg.getData())
.build(),
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.DeviceProfile;
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.DeviceProfileId;
import org.thingsboard.server.common.data.msg.TbMsgType;
@ -176,7 +177,14 @@ public class TbDeviceProfileNode implements TbNode {
}
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));
}
@ -201,7 +209,12 @@ public class TbDeviceProfileNode implements TbNode {
}
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) {
@ -210,7 +223,12 @@ public class TbDeviceProfileNode implements TbNode {
if (deviceProfile != null) {
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) {

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) {
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) {

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

@ -91,7 +91,12 @@ class TbClearAlarmNodeTest {
void alarmCanBeCleared() {
initWithClearAlarmScript();
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();
Alarm activeAlarm = Alarm.builder().type("SomeType").tenantId(tenantId).originator(msgOriginator).severity(AlarmSeverity.WARNING).endTs(oldEndDate).build();
@ -143,7 +148,12 @@ class TbClearAlarmNodeTest {
void alarmCanBeClearedWithAlarmOriginator() {
initWithClearAlarmScript();
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();
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() {
EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID,
new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())),
"{\"clientAttribute1\": 100, \"clientAttribute2\": \"value2\"}");
TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())).copy())
.data("{\"clientAttribute1\": 100, \"clientAttribute2\": \"value2\"}")
.build();
mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -140,9 +143,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenExistingServerAttributesAndMsgTypeAttributesDeleted_whenOnMsg_thenDeleteAttributesFromView() {
EntityView entityView = getEntityView(SERVER_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg(
ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())),
"{\"attributes\": [\"serverAttribute1\"]}");
TbMsg msg = TbMsg.builder()
.type(ATTRIBUTES_DELETED)
.originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())).copy())
.data("{\"attributes\": [\"serverAttribute1\"]}")
.build();
mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -171,9 +177,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenNonMatchedSharedAttributesAndMsgTypeIsAttributesDeleted_whenOnMsg_thenNoAttributesDeleteFromView() {
EntityView entityView = getEntityView(SHARED_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg(
TbMsgType.ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SHARED_SCOPE.name())),
"{\"attributes\": [\"anotherAttribute\"]}");
TbMsg msg = TbMsg.builder()
.type(TbMsgType.ATTRIBUTES_DELETED)
.originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SHARED_SCOPE.name())).copy())
.data("{\"attributes\": [\"anotherAttribute\"]}")
.build();
mockEntityViewLookup(entityView);
@ -188,9 +197,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
public void givenNonMatchedAttributesAndMsgTypeIsPostAttributesRequest_whenOnMsg_thenCopyNoAttributesToView() {
EntityView entityView = getEntityView(CLIENT_TELEMETRY_ENTITY_VIEW);
TbMsg msg = TbMsg.newMsg(
TbMsgType.POST_ATTRIBUTES_REQUEST, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())),
"{\"clientAttribute2\": \"value2\"}");
TbMsg msg = TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())).copy())
.data("{\"clientAttribute2\": \"value2\"}")
.build();
mockEntityViewLookup(entityView);
when(ctxMock.getTelemetryService()).thenReturn(telemetryServiceMock);
@ -220,9 +232,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
);
mockEntityViewLookup(entityView);
TbMsg msg = TbMsg.newMsg(
ATTRIBUTES_DELETED, DEVICE_ID, new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())),
"{\"attributes\": [\"serverAttribute1\"]}");
TbMsg msg = TbMsg.builder()
.type(ATTRIBUTES_DELETED)
.originator(DEVICE_ID)
.metaData(new TbMsgMetaData(Map.of(DataConstants.SCOPE, AttributeScope.SERVER_SCOPE.name())).copy())
.data("{\"attributes\": [\"serverAttribute1\"]}")
.build();
node.onMsg(ctxMock, msg);
verify(entityViewServiceMock).findEntityViewsByTenantIdAndEntityIdAsync(eq(TENANT_ID), eq(DEVICE_ID));
@ -233,7 +248,12 @@ public class TbCopyAttributesToEntityViewNodeTest {
@ParameterizedTest
@EnumSource(TbMsgType.class)
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);

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 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;
@ -317,7 +322,12 @@ class TbCreateAlarmNodeTest {
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()
.tenantId(tenantId)
@ -508,7 +518,12 @@ class TbCreateAlarmNodeTest {
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 existingActiveAlarm = Alarm.builder()
@ -680,7 +695,12 @@ class TbCreateAlarmNodeTest {
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()
.tenantId(tenantId)
@ -867,7 +887,12 @@ class TbCreateAlarmNodeTest {
.details(newAlarmDetails)
.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 existingActiveAlarm = Alarm.builder()
@ -1048,7 +1073,12 @@ class TbCreateAlarmNodeTest {
.details(alarmDetails)
.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 existingActiveAlarm = Alarm.builder()
@ -1189,7 +1219,12 @@ class TbCreateAlarmNodeTest {
// GIVEN
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.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);
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);
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) {
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() {

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) {
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() {

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));
var data = JacksonUtil.newObjectNode();
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
@ -207,7 +212,12 @@ public class TbDeviceStateNodeTest {
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
node.onMsg(ctxMock, msg);
@ -236,7 +246,13 @@ public class TbDeviceStateNodeTest {
given(ctxMock.getDeviceStateManager()).willReturn(deviceStateManagerMock);
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
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();
String data = "{\"key\": \"value\"}";
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);
log.info(logMessage);
@ -66,7 +71,12 @@ public class TbLogNodeTest {
void givenEmptyDataMsg_whenToLog_thenReturnString() {
TbLogNode node = new TbLogNode();
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);
log.info(logMessage);
@ -82,7 +92,12 @@ public class TbLogNodeTest {
void givenNullDataMsg_whenToLog_thenReturnString() {
TbLogNode node = new TbLogNode();
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);
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 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 TbMsgCountNode node;
@ -120,7 +125,12 @@ public class TbMsgCountNodeTest {
var expectedProcessedMsgs = new ArrayList<TbMsg>();
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()) {
break;
}
@ -142,7 +152,12 @@ public class TbMsgCountNodeTest {
then(ctxMock).should().enqueueForTellNext(msgWithCounterCaptor.capture(), eq(TbNodeConnectionType.SUCCESS));
TbMsg resultedMsg = msgWithCounterCaptor.getValue();
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()
.ignoringFields("id", "ts", "ctx", "metaData")
.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)));
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))
.isInstanceOf(IllegalStateException.class)
.hasMessage("Invalid message structure, it is not a JSON Object: " + null);
@ -206,7 +211,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
"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))
.isInstanceOf(RuntimeException.class)
.hasMessage("Message data doesn't contain key: 'temp'!");
@ -227,7 +237,12 @@ public class TbSaveToCustomCassandraTableNodeTest extends AbstractRuleNodeUpgrad
"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))
.isInstanceOf(RuntimeException.class)
.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();
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);
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);
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) {
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) {

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.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);
String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23";
@ -197,7 +202,12 @@ public class TbAwsLambdaNodeTest {
init();
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);
String requestIdStr = "a124af57-e7c3-4ebb-83bf-b09ff86eaa23";
String errorMsg = "Unhandled exception from function";
@ -233,7 +243,12 @@ public class TbAwsLambdaNodeTest {
public void givenExceptionWasThrownInsideFunctionAndTellFailureIfFuncThrowsExcIsFalse_whenOnMsg_thenTellSuccess() {
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);
String requestIdStr = "e83dfbc4-68d5-441c-8ee9-289959a30d3b";
String payload = "{\"errorMessage\":\"Something went wrong\",\"errorType\":\"Exception\",\"requestId\":\"" + requestIdStr + "\"}";
@ -266,7 +281,12 @@ public class TbAwsLambdaNodeTest {
public void givenPayloadFromResultIsNull_whenOnMsg_thenTellFailure() {
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);
String requestIdStr = "12bbb074-e2fc-4381-8f28-d4bd235103d5";
String errorMsg = "Payload from result of AWS Lambda function execution is null.";
@ -300,7 +320,12 @@ public class TbAwsLambdaNodeTest {
@Test
public void givenExceptionWasThrownOnAWS_whenOnMsg_thenTellFailure() {
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);
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(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);
then(ctxMock).should().ack(msg);
@ -143,7 +148,12 @@ class TbSnsNodeTest {
ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg));
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);
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();
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);
SendMessageRequest sendMsgRequest = new SendMessageRequest()
@ -143,7 +148,12 @@ class TbSqsNodeTest {
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);
Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
@ -186,7 +196,12 @@ class TbSqsNodeTest {
given(sendMessageResultMock.getMD5OfMessageAttributes()).willReturn(messageAttributesMd5);
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);
then(ctxMock).should().ack(msg);
@ -221,7 +236,12 @@ class TbSqsNodeTest {
ListenableFuture<TbMsg> failedFuture = Futures.immediateFailedFuture(new RuntimeException(errorMsg));
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);
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);
// 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);
// invocation of tellSelf() method
@ -203,16 +208,31 @@ public class TbMsgGeneratorNodeTest extends AbstractRuleNodeUpgradeTest {
}).given(ctxMock).tellSelf(any(), any(Long.class));
// 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);
// creation of generated message
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));
// 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);
// 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(edgeService.findRelatedEdgeIdsByEntityId(tenantId, deviceId, new PageLink(RELATED_EDGES_CACHE_ITEMS))).thenReturn(new PageData<>());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, null, null);
TbMsg msg = TbMsg.builder()
.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);
@ -106,8 +113,15 @@ public class TbMsgPushToEdgeNodeTest {
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);
TbMsg msg = TbMsg.newMsg(TbMsgType.ATTRIBUTES_UPDATED, userId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, TbMsg.EMPTY_JSON_OBJECT, null, null);
TbMsg msg = TbMsg.builder()
.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);
@ -137,8 +151,15 @@ public class TbMsgPushToEdgeNodeTest {
Mockito.when(ctx.getDbCallbackExecutor()).thenReturn(dbCallbackExecutor);
Mockito.when(edgeEventService.saveAsync(any())).thenReturn(SettableFuture.create());
TbMsg msg = TbMsg.newMsg(event, new EdgeId(UUID.randomUUID()), metaData,
TbMsgDataType.JSON, "{\"lastConnectTs\":1}", null, null);
TbMsg msg = TbMsg.builder()
.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);

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) {
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) {
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 {
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;
@ -196,7 +201,12 @@ class TbCheckMessageNodeTest {
metadata.putValue(DataConstants.DEVICE_NAME, "Test Device");
metadata.putValue(DataConstants.DEVICE_TYPE, DataConstants.DEFAULT_DEVICE_TYPE);
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 DeviceId ORIGINATOR_ID = new DeviceId(UUID.randomUUID());
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;

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) {
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
public void falseEvaluationDoNotSendMsg() throws TbNodeException {
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));
node.onMsg(ctx, msg);
@ -71,7 +79,15 @@ public class TbJsFilterNodeTest {
public void exceptionInJsThrowsException() throws TbNodeException {
initWithScript();
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")));
@ -83,7 +99,15 @@ public class TbJsFilterNodeTest {
public void metadataConditionCanBeTrue() throws TbNodeException {
initWithScript();
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));
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");
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")));
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) {
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) {
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) {
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) {
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 {
node.init(ctxMock, nodeConfiguration);
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);
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);
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);
ArgumentCaptor<Runnable> onSuccess = ArgumentCaptor.forClass(Runnable.class);
@ -101,7 +106,12 @@ public class TbCheckpointNodeTest extends AbstractRuleNodeUpgradeTest {
given(ctxMock.getQueueName()).willReturn(DataConstants.HP_QUEUE_NAME);
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);
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) {
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);
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);
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);
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);
then(ctxMock).should().ack(msg);
@ -164,7 +169,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
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);
then(ctxMock).should(never()).ack(msg);
@ -193,7 +203,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
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);
then(ctxMock).should(never()).ack(any());
@ -221,7 +236,12 @@ class TbPubSubNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
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);
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) {
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() {

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) {
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) {
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));
// 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);
// THEN
@ -212,7 +217,12 @@ public class TbKafkaNodeTest {
// WHEN
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);
// THEN
@ -232,7 +242,12 @@ public class TbKafkaNodeTest {
// GIVEN
config.setTopicPattern(topicPattern);
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 key = TbNodeUtils.processPattern(keyPattern, msg);
@ -278,7 +293,12 @@ public class TbKafkaNodeTest {
// WHEN
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);
// THEN
@ -303,7 +323,12 @@ public class TbKafkaNodeTest {
// WHEN
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);
// THEN
@ -331,7 +356,12 @@ public class TbKafkaNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
TbMsgMetaData metaData = new TbMsgMetaData();
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);
// 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 + "}";
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
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");
ObjectNode msgNode = JacksonUtil.newObjectNode()
.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);
@ -181,7 +186,12 @@ public class TbMathNodeTest {
metaData.putValue("key2", "argumentC");
msgNode = JacksonUtil.newObjectNode()
.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);
@ -228,7 +238,12 @@ public class TbMathNodeTest {
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);
@ -291,7 +306,12 @@ public class TbMathNodeTest {
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);
@ -314,7 +334,12 @@ public class TbMathNodeTest {
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);
@ -337,7 +362,12 @@ public class TbMathNodeTest {
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);
@ -361,7 +391,12 @@ public class TbMathNodeTest {
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"))
.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")
);
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);
@ -411,7 +451,12 @@ public class TbMathNodeTest {
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);
@ -433,7 +478,12 @@ public class TbMathNodeTest {
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()))
.thenReturn(Futures.immediateFuture(null));
@ -459,7 +509,12 @@ public class TbMathNodeTest {
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)))
.thenReturn(Futures.immediateFuture(null));
@ -484,7 +539,12 @@ public class TbMathNodeTest {
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)))
.thenReturn(Futures.immediateFuture(null));
@ -515,7 +575,12 @@ public class TbMathNodeTest {
new TbMathResult(TbMathArgumentType.MESSAGE_METADATA, "result", 3, false, false, null),
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);
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 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);
ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -550,7 +620,12 @@ public class TbMathNodeTest {
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);
ArgumentCaptor<Throwable> tCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -570,10 +645,20 @@ public class TbMathNodeTest {
CountDownLatch slowProcessingLatch = new CountDownLatch(1);
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();
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();
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);
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());
assertThat(slowMsgList.size()).as("slow msgs >= rule-dispatcher pool size").isGreaterThanOrEqualTo(RULE_DISPATCHER_POOL_SIZE);
@ -713,7 +803,12 @@ public class TbMathNodeTest {
})
.toList();
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()));
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
node.init(ctxMock, nodeConfiguration);
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
node.onMsg(ctxMock, msg);
@ -184,7 +189,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenInvalidMsgDataType_whenOnMsg_thenShouldTellNextOther() throws TbNodeException {
// GIVEN
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
node.onMsg(ctxMock, msg);
@ -200,7 +210,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenInputKeyIsNotPresent_whenOnMsg_thenShouldTellNextOther() throws TbNodeException {
// GIVEN
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
node.onMsg(ctxMock, msg);
@ -224,7 +239,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", 40.5)));
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
node.onMsg(ctxMock, msg);
@ -254,7 +274,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("temperature", 40L)));
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
node.onMsg(ctxMock, msg);
@ -284,7 +309,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("temperature", "40.0")));
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
node.onMsg(ctxMock, msg);
@ -318,7 +348,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
var msgData = "{\"temperature\": 42,\"airPressure\":123}";
var firstMsgMetaData = new TbMsgMetaData();
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
node.onMsg(ctxMock, firstMsg);
@ -344,7 +379,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
var secondMsgMetaData = new TbMsgMetaData();
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
node.onMsg(ctxMock, secondMsg);
@ -375,7 +415,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new DoubleDataEntry("temperature", null)));
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
node.onMsg(ctxMock, msg);
@ -403,7 +448,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L)));
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
node.onMsg(ctxMock, msg);
@ -435,7 +485,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new LongDataEntry("pulseCounter", 200L)));
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
node.onMsg(ctxMock, msg);
@ -459,7 +514,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry("pulseCounter", "high")));
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
node.onMsg(ctxMock, msg);
@ -484,7 +544,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new BooleanDataEntry("pulseCounter", false)));
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
node.onMsg(ctxMock, msg);
@ -509,7 +574,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(System.currentTimeMillis(), new JsonDataEntry("pulseCounter", "{\"isActive\":false}")));
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
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 -> {
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();
CountDownLatch processingLatch = new CountDownLatch(tbMsgList.size());
@ -597,7 +672,12 @@ public class CalculateDeltaNodeTest extends AbstractRuleNodeUpgradeTest {
mockFindLatestAsync(new BasicTsKvEntry(1L, new DoubleDataEntry("temperature", testConfig.prevValue())));
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
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 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 org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ -247,7 +246,12 @@ public class TbGetAttributesNodeTest extends AbstractRuleNodeUpgradeTest {
public void givenFetchLatestTimeseriesToDataAndDataIsNotJsonObject_whenOnMsg_thenException() throws Exception {
// GIVEN
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
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("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) {

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() {
// GIVEN
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
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -225,7 +230,12 @@ public class TbGetCustomerAttributeNodeTest {
// GIVEN
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);
@ -469,7 +479,12 @@ public class TbGetCustomerAttributeNodeTest {
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

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() {
// GIVEN
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
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -458,7 +463,12 @@ public class TbGetCustomerDetailsNodeTest {
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() {

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(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);
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() {
// GIVEN
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
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -164,7 +169,12 @@ public class TbGetOriginatorFieldsNodeTest {
node.fetchTo = TbMsgSource.DATA;
var msgMetaData = new TbMsgMetaData();
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.getTenantId()).thenReturn(DUMMY_TENANT_ID);
@ -206,7 +216,12 @@ public class TbGetOriginatorFieldsNodeTest {
node.fetchTo = TbMsgSource.DATA;
var msgMetaData = new TbMsgMetaData();
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.getTenantId()).thenReturn(DUMMY_TENANT_ID);
@ -249,7 +264,12 @@ public class TbGetOriginatorFieldsNodeTest {
"testKey1", "testValue1",
"testKey2", "123"));
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.getTenantId()).thenReturn(DUMMY_TENANT_ID);
@ -297,7 +317,12 @@ public class TbGetOriginatorFieldsNodeTest {
"testKey1", "testValue1",
"testKey2", "123"));
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.getTenantId()).thenReturn(DUMMY_TENANT_ID);
@ -355,7 +380,12 @@ public class TbGetOriginatorFieldsNodeTest {
"testKey1", "testValue1",
"testKey2", "123"));
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);

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() {
// GIVEN
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
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\"}";
}
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

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
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))
.isInstanceOf(RuntimeException.class)
.hasMessage("Interval start should be less than Interval end");
@ -205,7 +210,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
long endTs = 1719220353000L;
TbMsgMetaData metaData = new TbMsgMetaData();
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);
// 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()));
// 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);
// THEN
@ -251,7 +266,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
// WHEN
TbMsgMetaData metaData = new TbMsgMetaData();
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);
// 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()));
// 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);
// 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()));
// 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);
// 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()));
// 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);
// THEN
@ -382,7 +417,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
// 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);
}
@ -411,7 +451,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(tsKvEntries));
// 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);
// THEN
@ -442,7 +487,12 @@ public class TbGetTelemetryNodeTest extends AbstractRuleNodeUpgradeTest {
given(timeseriesServiceMock.findAll(any(TenantId.class), any(EntityId.class), anyList())).willReturn(Futures.immediateFuture(tsKvEntries));
// 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);
// 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() {
// GIVEN
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
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\"}";
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

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() {
// GIVEN
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
var exception = assertThrows(IllegalArgumentException.class, () -> node.onMsg(ctxMock, msg));
@ -289,7 +294,12 @@ public class TbGetTenantDetailsNodeTest {
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() {

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;
}).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);
then(ctxMock).should().ack(msg);
@ -322,7 +327,12 @@ public class TbMqttNodeTest extends AbstractRuleNodeUpgradeTest {
return null;
}).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);
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 -> {
TbMsgType type = invocationOnMock.getArgument(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());
DeviceState deviceState = createDeviceState(deviceId, alarmConfig);
TbMsg attributeUpdateMsg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST,
deviceId, TbMsgMetaData.EMPTY, "{ \"enabled\": false }");
TbMsg attributeUpdateMsg = TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("{ \"enabled\": false }")
.build();
deviceState.process(ctx, attributeUpdateMsg);
@ -116,11 +125,21 @@ public class DeviceStateTest {
verify(ctx).enqueueForTellNext(resultMsgCaptor.capture(), eq("Alarm Created"));
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);
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());
}
@ -130,17 +149,31 @@ public class DeviceStateTest {
DeviceId deviceId = new DeviceId(UUID.randomUUID());
DeviceState deviceState = createDeviceState(deviceId, alarmConfig);
TbMsg attributeUpdateMsg = TbMsg.newMsg(TbMsgType.POST_ATTRIBUTES_REQUEST,
deviceId, TbMsgMetaData.EMPTY, "{ \"enabled\": false }");
TbMsg attributeUpdateMsg = TbMsg.builder()
.type(TbMsgType.POST_ATTRIBUTES_REQUEST)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data("{ \"enabled\": false }")
.build();
deviceState.process(ctx, attributeUpdateMsg);
ArgumentCaptor<TbMsg> resultMsgCaptor = ArgumentCaptor.forClass(TbMsg.class);
verify(ctx).enqueueForTellNext(resultMsgCaptor.capture(), eq("Alarm Created"));
Alarm alarm = JacksonUtil.fromString(resultMsgCaptor.getValue().getData(), Alarm.class);
deviceState.process(ctx, TbMsg.newMsg(TbMsgType.ALARM_CLEAR, deviceId, TbMsgMetaData.EMPTY, JacksonUtil.toString(alarm)));
TbMsg alarmDeleteNotification = TbMsg.newMsg(TbMsgType.ALARM_DELETE, 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());
TbMsg alarmDeleteNotification = TbMsg.builder()
.type(TbMsgType.ALARM_DELETE)
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.data(JacksonUtil.toString(alarm))
.build();
assertDoesNotThrow(() -> {
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);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg("123456789", deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data));
TbMsg msg = TbMsg.builder()
.type("123456789")
.originator(deviceId)
.metaData(TbMsgMetaData.EMPTY.copy())
.dataType(TbMsgDataType.JSON)
.data(JacksonUtil.toString(data))
.build();
node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg);
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);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg);
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);
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);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg);
verify(ctx).enqueueForTellNext(theMsg, "Alarm Created");
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);
registerCreateAlarmMock(alarmService.updateAlarm(any()), false);
Thread.sleep(1);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg2 = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg2);
verify(ctx).enqueueForTellNext(theMsg2, "Alarm Updated");
@ -274,19 +310,36 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(alarmService.findLatestActiveByOriginatorAndType(tenantId, deviceId, "highTemperatureAlarm1")).thenReturn(null);
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);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg);
verify(ctx).enqueueForTellNext(theMsg, "Alarm Created");
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);
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);
data.put("temperature", 52);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg2 = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg2);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 21);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 21);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg);
@ -655,8 +763,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Thread.sleep(halfOfAlarmDelay + 1);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg2 = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg);
@ -781,8 +908,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Thread.sleep(halfOfAlarmDelay + 1);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg2 = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg);
@ -886,8 +1032,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
verify(ctx, Mockito.never()).tellNext(theMsg, "Alarm Created");
data.put("temperature", 151);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg2 = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg);
@ -1004,8 +1169,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
verify(ctx, Mockito.never()).tellNext(theMsg, "Alarm Created");
data.put("temperature", 151);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg2 = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
verify(ctx).tellSuccess(msg);
@ -1107,8 +1291,15 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Thread.sleep(halfOfAlarmDelay + 1);
TbMsg msg2 = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg2 = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
@ -1365,12 +1580,24 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
Mockito.when(attributesService.find(eq(tenantId), eq(deviceId), Mockito.any(AttributeScope.class), Mockito.anySet()))
.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();
data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 25);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 40);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150L);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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()))
.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()))
.thenReturn(theMsg);
ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150L);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, TbMsgMetaData.EMPTY,
TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
TbMsg msg = TbMsg.builder()
.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);
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);
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);
then(ctxMock).should().ack(msg);
@ -178,7 +183,12 @@ public class TbRabbitMqNodeTest {
given(ctxMock.getExternalCallExecutor()).willReturn(executor);
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);
then(ctxMock).should(never()).ack(any(TbMsg.class));
@ -201,7 +211,12 @@ public class TbRabbitMqNodeTest {
node.init(ctxMock, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
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);
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 msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, new DeviceId(EntityId.NULL_UUID), TbMsgMetaData.EMPTY, TbMsg.EMPTY_JSON_OBJECT);
var successMsg = TbMsg.newMsg(
TbMsgType.POST_TELEMETRY_REQUEST, msg.getOriginator(),
msg.getMetaData(), msg.getData()
);
var msg = TbMsg.builder()
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(new DeviceId(EntityId.NULL_UUID))
.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);
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));
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);
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));
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);
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(
requestIdAttribute, requestUUIDStr,
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);
@ -109,7 +114,12 @@ public class TbSendRestApiCallReplyNodeTest {
@ParameterizedTest
@MethodSource
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);

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() {
when(ctx.getRpcService()).thenReturn(rpcService);
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, getDefaultMetadata(),
TbMsgDataType.JSON, DUMMY_DATA, null, null);
TbMsg msg = TbMsg.builder()
.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);
@ -111,8 +118,15 @@ public class TbSendRPCReplyNodeTest {
TbMsgMetaData defaultMetadata = getDefaultMetadata();
defaultMetadata.putValue(DataConstants.EDGE_ID, UUID.randomUUID().toString());
defaultMetadata.putValue(DataConstants.DEVICE_ID, UUID.randomUUID().toString());
TbMsg msg = TbMsg.newMsg(TbMsgType.POST_TELEMETRY_REQUEST, deviceId, defaultMetadata,
TbMsgDataType.JSON, DUMMY_DATA, null, null);
TbMsg msg = TbMsg.builder()
.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);
@ -124,7 +138,12 @@ public class TbSendRPCReplyNodeTest {
@EnumSource(EntityType.class)
public void testOriginatorEntityTypes(EntityType entityType) {
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);
@ -138,7 +157,12 @@ public class TbSendRPCReplyNodeTest {
@ParameterizedTest
@MethodSource
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);

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();
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);
var ruleEngineDeviceRpcRequestCaptor = captureRequest();
@ -128,7 +133,12 @@ public class TbSendRPCRequestNodeTest {
given(ctxMock.getRpcService()).willReturn(rpcServiceMock);
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = ArgumentCaptor.forClass(RuleEngineDeviceRpcRequest.class);
@ -149,7 +159,12 @@ public class TbSendRPCRequestNodeTest {
given(ctxMock.getRpcService()).willReturn(rpcServiceMock);
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -170,7 +185,12 @@ public class TbSendRPCRequestNodeTest {
"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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -185,7 +205,12 @@ public class TbSendRPCRequestNodeTest {
String requestUUID = "b795a241-5a30-48fb-92d5-46b864d47130";
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -200,7 +225,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -215,7 +245,12 @@ public class TbSendRPCRequestNodeTest {
String originServiceId = "service-id-123";
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -230,7 +265,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -245,7 +285,12 @@ public class TbSendRPCRequestNodeTest {
String expirationTime = "2000000000000";
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -260,7 +305,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -275,7 +325,12 @@ public class TbSendRPCRequestNodeTest {
Integer retries = 3;
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -290,7 +345,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -303,7 +363,12 @@ public class TbSendRPCRequestNodeTest {
given(ctxMock.getRpcService()).willReturn(rpcServiceMock);
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -322,7 +387,12 @@ public class TbSendRPCRequestNodeTest {
TbMsgMetaData metadata = new TbMsgMetaData();
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);
ArgumentCaptor<RuleEngineDeviceRpcRequest> requestCaptor = captureRequest();
@ -346,7 +416,12 @@ public class TbSendRPCRequestNodeTest {
@Test
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.getTenantId()).willReturn(TENANT_ID);
@ -361,7 +436,12 @@ public class TbSendRPCRequestNodeTest {
return null;
}).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);
then(ctxMock).should().enqueueForTellNext(outMsg, TbNodeConnectionType.SUCCESS);
@ -370,7 +450,12 @@ public class TbSendRPCRequestNodeTest {
@Test
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.getTenantId()).willReturn(TENANT_ID);
@ -384,7 +469,12 @@ public class TbSendRPCRequestNodeTest {
return null;
}).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);
then(ctxMock).should().enqueueForTellFailure(outMsg, RpcError.NO_ACTIVE_CONNECTION.name());
@ -396,7 +486,12 @@ public class TbSendRPCRequestNodeTest {
public void givenOriginatorIsNotDevice_whenOnMsg_thenThrowsException(EntityType entityType) {
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);
ArgumentCaptor<Throwable> throwableCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -409,7 +504,12 @@ public class TbSendRPCRequestNodeTest {
@ParameterizedTest
@ValueSource(strings = {"method", "params"})
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);

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);
}
// 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")));
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\"}";
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);
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)
public void givenMsgTypeAndEmptyMsgData_whenOnMsg_thenVerifyFailureMsg(TbMsgType msgType) throws TbNodeException {
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);
ArgumentCaptor<Throwable> throwableCaptor = ArgumentCaptor.forClass(Throwable.class);
@ -122,7 +127,12 @@ public class TbMsgTimeseriesNodeTest {
"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.getTenantId()).thenReturn(TENANT_ID);
@ -159,7 +169,12 @@ public class TbMsgTimeseriesNodeTest {
""";
long ts = System.currentTimeMillis();
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.getTenantId()).thenReturn(TENANT_ID);
@ -197,7 +212,12 @@ public class TbMsgTimeseriesNodeTest {
""";
var metadata = new TbMsgMetaData();
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);
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.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);
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
@ -199,7 +204,12 @@ public class TbChangeOriginatorNodeTest {
public void givenOriginatorSourceIsTenant_whenOnMsg_thenTellSuccess() throws TbNodeException {
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);
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
@ -219,7 +229,12 @@ public class TbChangeOriginatorNodeTest {
public void givenOriginatorSourceIsRelatedAndNewOriginatorIsNull_whenOnMsg_thenTellFailure() throws TbNodeException {
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.getRelationService()).willReturn(relationServiceMock);
@ -253,7 +268,12 @@ public class TbChangeOriginatorNodeTest {
Alarm alarm = new Alarm(alarmId);
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);
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
@ -279,7 +299,12 @@ public class TbChangeOriginatorNodeTest {
config.setEntityType(EntityType.ASSET.name());
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);
given(ctxMock.getDbCallbackExecutor()).willReturn(dbExecutor);
@ -315,7 +340,12 @@ public class TbChangeOriginatorNodeTest {
TbMsgMetaData metaData = new TbMsgMetaData();
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.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",
"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",
"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",
"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];
TbMsgMetaData metaData = (TbMsgMetaData) (invocationOnMock.getArguments())[3];
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));
node = spy(new TbMsgDeduplicationNode());
config = new TbMsgDeduplicationNodeConfiguration().defaultConfiguration();
@ -452,12 +457,13 @@ public class TbMsgDeduplicationNodeTest extends AbstractRuleNodeUpgradeTest {
dataNode.put("deviceId", deviceId.getId().toString());
TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("ts", String.valueOf(ts));
return TbMsg.newMsg(
DataConstants.MAIN_QUEUE_NAME,
TbMsgType.POST_TELEMETRY_REQUEST,
deviceId,
metaData,
JacksonUtil.toString(dataNode));
return TbMsg.builder()
.queueName(DataConstants.MAIN_QUEUE_NAME)
.type(TbMsgType.POST_TELEMETRY_REQUEST)
.originator(deviceId)
.metaData(metaData.copy())
.data(JacksonUtil.toString(dataNode))
.build();
}
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",
"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",
"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