From b5b867ad41074f55658e05151196cfae9236027e Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 22 Oct 2020 16:00:55 +0300 Subject: [PATCH 01/12] Added ATTRIBUTES_DELETED action and service test --- .../service/edge/rpc/EdgeGrpcSession.java | 1 + .../constructor/EntityDataMsgConstructor.java | 20 +-- .../thingsboard/server/edge/BaseEdgeTest.java | 119 ++++++++++-------- .../common/data/edge/EdgeEventActionType.java | 1 + .../rule/engine/edge/TbMsgPushToEdgeNode.java | 9 +- 5 files changed, 85 insertions(+), 65 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index 35f045d66b..1dea607dc4 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -335,6 +335,7 @@ public final class EdgeGrpcSession implements Closeable { downlinkMsg = processEntityMessage(edgeEvent, edgeEvent.getAction()); break; case ATTRIBUTES_UPDATED: + case POST_ATTRIBUTES: case ATTRIBUTES_DELETED: case TIMESERIES_UPDATED: downlinkMsg = processTelemetryMessage(edgeEvent); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java index 19fa3f9036..469207a0cc 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java @@ -60,15 +60,21 @@ public class EntityDataMsgConstructor { case ATTRIBUTES_UPDATED: try { JsonObject data = entityData.getAsJsonObject(); - TransportProtos.PostAttributeMsg postAttributeMsg = JsonConverter.convertToAttributesProto(data.getAsJsonObject("kv")); - if (data.has("isPostAttributes") && data.getAsJsonPrimitive("isPostAttributes").getAsBoolean()) { - builder.setPostAttributesMsg(postAttributeMsg); - } else { - builder.setAttributesUpdatedMsg(postAttributeMsg); - } + TransportProtos.PostAttributeMsg attributesUpdatedMsg = JsonConverter.convertToAttributesProto(data.getAsJsonObject("kv")); + builder.setAttributesUpdatedMsg(attributesUpdatedMsg); + builder.setPostAttributeScope(data.getAsJsonPrimitive("scope").getAsString()); + } catch (Exception e) { + log.warn("[{}] Can't convert to AttributesUpdatedMsg proto, entityData [{}]", entityId, entityData, e); + } + break; + case POST_ATTRIBUTES: + try { + JsonObject data = entityData.getAsJsonObject(); + TransportProtos.PostAttributeMsg postAttributesMsg = JsonConverter.convertToAttributesProto(data.getAsJsonObject("kv")); + builder.setPostAttributesMsg(postAttributesMsg); builder.setPostAttributeScope(data.getAsJsonPrimitive("scope").getAsString()); } catch (Exception e) { - log.warn("[{}] Can't convert to attributes proto, entityData [{}]", entityId, entityData, e); + log.warn("[{}] Can't convert to PostAttributesMsg, entityData [{}]", entityId, entityData, e); } break; case ATTRIBUTES_DELETED: diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index ee5161869a..3aab1b909e 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -16,6 +16,7 @@ package org.thingsboard.server.edge; import com.datastax.driver.core.utils.UUIDs; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -65,6 +66,7 @@ import org.thingsboard.server.dao.util.mapping.JacksonUtil; import org.thingsboard.server.edge.imitator.EdgeImitator; import org.thingsboard.server.gen.edge.AlarmUpdateMsg; import org.thingsboard.server.gen.edge.AssetUpdateMsg; +import org.thingsboard.server.gen.edge.AttributeDeleteMsg; import org.thingsboard.server.gen.edge.CustomerUpdateMsg; import org.thingsboard.server.gen.edge.DashboardUpdateMsg; import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; @@ -92,9 +94,6 @@ import java.util.UUID; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -; - - @Slf4j abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -137,7 +136,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @After public void afterTest() throws Exception { edgeImitator.disconnect(); - uninstallation(); loginSysAdmin(); @@ -740,56 +738,91 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testAttributes() throws Exception { log.info("Testing attributes"); + List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", new TypeReference>() {}, new TextPageLink(100)).getData(); Assert.assertEquals(1, edgeDevices.size()); Device device = edgeDevices.get(0); Assert.assertEquals("Edge Device 1", device.getName()); - String attributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key\":\"value\"}}"; - JsonNode attributesEntityData = mapper.readTree(attributesData); - EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, attributesEntityData); + testAttributesUpdatedMsg(device); + testPostAttributesMsg(device); + testAttributesDeleteMsg(device); + + log.info("Attributes tested successfully"); + } + + private void testAttributesDeleteMsg(Device device) throws JsonProcessingException, InterruptedException { + String deleteAttributesData = "{\"scope\":\"SERVER_SCOPE\",\"keys\":[\"key1\",\"key2\"]}"; + JsonNode deleteAttributesEntityData = mapper.readTree(deleteAttributesData); + EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_DELETED, device.getId().getId(), EdgeEventType.DEVICE, deleteAttributesEntityData); edgeImitator.expectMessageAmount(1); - edgeEventService.saveAsync(edgeEvent1); + edgeEventService.saveAsync(edgeEvent); edgeImitator.waitForMessages(); AbstractMessage latestMessage = edgeImitator.getLatestMessage(); Assert.assertTrue(latestMessage instanceof EntityDataProto); EntityDataProto latestEntityDataMsg = (EntityDataProto) latestMessage; - Assert.assertEquals(latestEntityDataMsg.getEntityIdMSB(), device.getUuidId().getMostSignificantBits()); - Assert.assertEquals(latestEntityDataMsg.getEntityIdLSB(), device.getUuidId().getLeastSignificantBits()); - Assert.assertEquals(latestEntityDataMsg.getEntityType(), device.getId().getEntityType().name()); - Assert.assertEquals(latestEntityDataMsg.getPostAttributeScope(), attributesEntityData.get("scope").asText()); - Assert.assertTrue(latestEntityDataMsg.hasAttributesUpdatedMsg()); + Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB()); + Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB()); + Assert.assertEquals(device.getId().getEntityType().name(), latestEntityDataMsg.getEntityType()); - TransportProtos.PostAttributeMsg attributesUpdatedMsg = latestEntityDataMsg.getAttributesUpdatedMsg(); - Assert.assertEquals(1, attributesUpdatedMsg.getKvCount()); - TransportProtos.KeyValueProto keyValueProto = attributesUpdatedMsg.getKv(0); - Assert.assertEquals("key", keyValueProto.getKey()); - Assert.assertEquals("value", keyValueProto.getStringV()); + Assert.assertTrue(latestEntityDataMsg.hasAttributeDeleteMsg()); + + AttributeDeleteMsg attributeDeleteMsg = latestEntityDataMsg.getAttributeDeleteMsg(); + Assert.assertEquals(attributeDeleteMsg.getScope(), deleteAttributesEntityData.get("scope").asText()); + + Assert.assertEquals(2, attributeDeleteMsg.getAttributeNamesCount()); + Assert.assertEquals("key1", attributeDeleteMsg.getAttributeNames(0)); + Assert.assertEquals("key2", attributeDeleteMsg.getAttributeNames(1)); + } - ((ObjectNode) attributesEntityData).put("isPostAttributes", true); - EdgeEvent edgeEvent2 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, attributesEntityData); + private void testPostAttributesMsg(Device device) throws JsonProcessingException, InterruptedException { + String postAttributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key2\":\"value2\"}}"; + JsonNode postAttributesEntityData = mapper.readTree(postAttributesData); + EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.POST_ATTRIBUTES, device.getId().getId(), EdgeEventType.DEVICE, postAttributesEntityData); edgeImitator.expectMessageAmount(1); - edgeEventService.saveAsync(edgeEvent2); + edgeEventService.saveAsync(edgeEvent); edgeImitator.waitForMessages(); - latestMessage = edgeImitator.getLatestMessage(); + AbstractMessage latestMessage = edgeImitator.getLatestMessage(); Assert.assertTrue(latestMessage instanceof EntityDataProto); - latestEntityDataMsg = (EntityDataProto) latestMessage; - Assert.assertEquals(latestEntityDataMsg.getEntityIdMSB(), device.getUuidId().getMostSignificantBits()); - Assert.assertEquals(latestEntityDataMsg.getEntityIdLSB(), device.getUuidId().getLeastSignificantBits()); - Assert.assertEquals(latestEntityDataMsg.getEntityType(), device.getId().getEntityType().name()); - Assert.assertEquals(latestEntityDataMsg.getPostAttributeScope(), attributesEntityData.get("scope").asText()); + EntityDataProto latestEntityDataMsg = (EntityDataProto) latestMessage; + Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB()); + Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB()); + Assert.assertEquals(device.getId().getEntityType().name(), latestEntityDataMsg.getEntityType()); + Assert.assertEquals("SERVER_SCOPE", latestEntityDataMsg.getPostAttributeScope()); Assert.assertTrue(latestEntityDataMsg.hasPostAttributesMsg()); - attributesUpdatedMsg = latestEntityDataMsg.getPostAttributesMsg(); - Assert.assertEquals(1, attributesUpdatedMsg.getKvCount()); - keyValueProto = attributesUpdatedMsg.getKv(0); - Assert.assertEquals("key", keyValueProto.getKey()); - Assert.assertEquals("value", keyValueProto.getStringV()); + TransportProtos.PostAttributeMsg postAttributesMsg = latestEntityDataMsg.getPostAttributesMsg(); + Assert.assertEquals(1, postAttributesMsg.getKvCount()); + TransportProtos.KeyValueProto keyValueProto = postAttributesMsg.getKv(0); + Assert.assertEquals("key2", keyValueProto.getKey()); + Assert.assertEquals("value2", keyValueProto.getStringV()); + } - log.info("Attributes tested successfully"); + private void testAttributesUpdatedMsg(Device device) throws JsonProcessingException, InterruptedException { + String attributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key1\":\"value1\"}}"; + JsonNode attributesEntityData = mapper.readTree(attributesData); + EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, attributesEntityData); + edgeImitator.expectMessageAmount(1); + edgeEventService.saveAsync(edgeEvent1); + edgeImitator.waitForMessages(); + + AbstractMessage latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof EntityDataProto); + EntityDataProto latestEntityDataMsg = (EntityDataProto) latestMessage; + Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB()); + Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB()); + Assert.assertEquals(device.getId().getEntityType().name(), latestEntityDataMsg.getEntityType()); + Assert.assertEquals("SERVER_SCOPE", latestEntityDataMsg.getPostAttributeScope()); + Assert.assertTrue(latestEntityDataMsg.hasAttributesUpdatedMsg()); + + TransportProtos.PostAttributeMsg attributesUpdatedMsg = latestEntityDataMsg.getAttributesUpdatedMsg(); + Assert.assertEquals(1, attributesUpdatedMsg.getKvCount()); + TransportProtos.KeyValueProto keyValueProto = attributesUpdatedMsg.getKv(0); + Assert.assertEquals("key1", keyValueProto.getKey()); + Assert.assertEquals("value1", keyValueProto.getStringV()); } private void testSendMessagesToCloud() throws Exception { @@ -1057,26 +1090,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); } - private void uninstallation() throws Exception { - - TimePageData pageDataDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", - new TypeReference>() {}, new TextPageLink(100)); - for (Device device: pageDataDevices.getData()) { - doDelete("/api/device/" + device.getId().getId().toString()) - .andExpect(status().isOk()); - } - - TimePageData pageDataAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?", - new TypeReference>() {}, new TextPageLink(100)); - for (Asset asset: pageDataAssets.getData()) { - doDelete("/api/asset/" + asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - doDelete("/api/edge/" + edge.getId().getId().toString()) - .andExpect(status().isOk()); - } - private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) { EdgeEvent edgeEvent = new EdgeEvent(); edgeEvent.setEdgeId(edgeId); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventActionType.java b/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventActionType.java index 2422aec651..b8b386ac1a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventActionType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventActionType.java @@ -19,6 +19,7 @@ public enum EdgeEventActionType { ADDED, DELETED, UPDATED, + POST_ATTRIBUTES, ATTRIBUTES_UPDATED, ATTRIBUTES_DELETED, TIMESERIES_UPDATED, diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java index 5bd33a056a..6072e0cae9 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java @@ -152,11 +152,9 @@ public class TbMsgPushToEdgeNode implements TbNode { JsonNode dataJson = json.readTree(msg.getData()); switch (actionType) { case ATTRIBUTES_UPDATED: + case POST_ATTRIBUTES: entityBody.put("kv", dataJson); entityBody.put("scope", metadata.get("scope")); - if (SessionMsgType.POST_ATTRIBUTES_REQUEST.name().equals(msgType)) { - entityBody.put("isPostAttributes", true); - } break; case ATTRIBUTES_DELETED: List keys = json.treeToValue(dataJson.get("attributes"), List.class); @@ -192,9 +190,10 @@ public class TbMsgPushToEdgeNode implements TbNode { EdgeEventActionType actionType; if (SessionMsgType.POST_TELEMETRY_REQUEST.name().equals(msgType)) { actionType = EdgeEventActionType.TIMESERIES_UPDATED; - } else if (SessionMsgType.POST_ATTRIBUTES_REQUEST.name().equals(msgType) - || DataConstants.ATTRIBUTES_UPDATED.equals(msgType)) { + } else if (DataConstants.ATTRIBUTES_UPDATED.equals(msgType)) { actionType = EdgeEventActionType.ATTRIBUTES_UPDATED; + } else if (SessionMsgType.POST_ATTRIBUTES_REQUEST.name().equals(msgType)) { + actionType = EdgeEventActionType.POST_ATTRIBUTES; } else { actionType = EdgeEventActionType.ATTRIBUTES_DELETED; } From 800e5d9ba5f728e92bc69ac99ce6a7beedc9e2db Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 22 Oct 2020 17:58:56 +0300 Subject: [PATCH 02/12] Added RPC call test --- .../rpc/constructor/DeviceMsgConstructor.java | 4 +- .../thingsboard/server/edge/BaseEdgeTest.java | 136 +++++++++++------- .../server/edge/imitator/EdgeImitator.java | 6 + 3 files changed, 92 insertions(+), 54 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java index fb005d7c3a..63f0a55ea3 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java @@ -89,9 +89,11 @@ public class DeviceMsgConstructor { .setRequestIdMSB(request.getRequestUUID().getMostSignificantBits()) .setRequestIdLSB(request.getRequestUUID().getLeastSignificantBits()) .setExpirationTime(request.getExpirationTime()) - .setOriginServiceId(request.getOriginServiceId()) .setOneway(request.isOneway()) .setRequestMsg(requestBuilder.build()); + if (request.getOriginServiceId() != null) { + builder.setOriginServiceId(request.getOriginServiceId()); + } return builder.build(); } } diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 3aab1b909e..9ce30feabb 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.protobuf.AbstractMessage; import lombok.extern.slf4j.Slf4j; @@ -28,6 +29,8 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.thingsboard.rule.engine.api.RuleEngineDeviceRpcRequest; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.DataConstants; @@ -45,6 +48,7 @@ import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventType; +import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; @@ -71,11 +75,13 @@ import org.thingsboard.server.gen.edge.CustomerUpdateMsg; import org.thingsboard.server.gen.edge.DashboardUpdateMsg; import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg; +import org.thingsboard.server.gen.edge.DeviceRpcCallMsg; import org.thingsboard.server.gen.edge.DeviceUpdateMsg; import org.thingsboard.server.gen.edge.EdgeConfiguration; import org.thingsboard.server.gen.edge.EntityDataProto; import org.thingsboard.server.gen.edge.EntityViewUpdateMsg; import org.thingsboard.server.gen.edge.RelationUpdateMsg; +import org.thingsboard.server.gen.edge.RpcRequestMsg; import org.thingsboard.server.gen.edge.RuleChainMetadataRequestMsg; import org.thingsboard.server.gen.edge.RuleChainMetadataUpdateMsg; import org.thingsboard.server.gen.edge.RuleChainUpdateMsg; @@ -90,7 +96,9 @@ import org.thingsboard.server.gen.transport.TransportProtos; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Random; import java.util.UUID; +import java.util.concurrent.TimeUnit; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -159,6 +167,69 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { testTimeseries(); testAttributes(); testSendMessagesToCloud(); + testRpcCall(); + } + + private Device findDeviceByName(String deviceName) throws Exception { + List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", + new TypeReference>() {}, new TextPageLink(100)).getData(); + Optional foundDevice = edgeDevices.stream().filter(d -> d.getName().equals(deviceName)).findAny(); + Assert.assertTrue(foundDevice.isPresent()); + Device device = foundDevice.get(); + Assert.assertEquals(deviceName, device.getName()); + return device; + } + + private Asset findAssetByName(String assetName) throws Exception { + List edgeAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?", + new TypeReference>() {}, new TextPageLink(100)).getData(); + + Assert.assertEquals(1, edgeAssets.size()); + Asset asset = edgeAssets.get(0); + Assert.assertEquals(assetName, asset.getName()); + return asset; + } + + private Device saveDevice(String deviceName) throws Exception { + Device device = new Device(); + device.setName(deviceName); + device.setType("test"); + return doPost("/api/device", device, Device.class); + } + + private Asset saveAsset(String assetName) throws Exception { + Asset asset = new Asset(); + asset.setName(assetName); + asset.setType("test"); + return doPost("/api/asset", asset, Asset.class); + } + + private void testRpcCall() throws Exception { + Device device = findDeviceByName("Edge Device 1"); + + RuleEngineDeviceRpcRequest request = RuleEngineDeviceRpcRequest.builder() + .oneway(true) + .method("test_method") + .body("{\"param1\":\"value1\"}") + .tenantId(device.getTenantId()) + .deviceId(device.getId()) + .requestId(new Random().nextInt()) + .requestUUID(UUIDs.timeBased()) + .originServiceId("originServiceId") + .expirationTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)) + .restApiCall(true) + .build(); + + JsonNode body = mapper.valueToTree(request); + EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.RPC_CALL, device.getId().getId(), EdgeEventType.DEVICE, body); + edgeImitator.expectMessageAmount(1); + edgeEventService.saveAsync(edgeEvent); + edgeImitator.waitForMessages(); + + AbstractMessage latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg); + DeviceRpcCallMsg latestDeviceRpcCallMsg = (DeviceRpcCallMsg) latestMessage; + Assert.assertEquals("test_method", latestDeviceRpcCallMsg.getRequestMsg().getMethod()); } private void testReceivedInitialData() throws Exception { @@ -210,10 +281,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testDevices() throws Exception { log.info("Testing devices"); - Device device = new Device(); - device.setName("Edge Device 2"); - device.setType("test"); - Device savedDevice = doPost("/api/device", device, Device.class); + Device savedDevice = saveDevice("Edge Device 2"); edgeImitator.expectMessageAmount(1); doPost("/api/edge/" + edge.getId().getId().toString() @@ -259,10 +327,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testAssets() throws Exception { log.info("Testing assets"); - Asset asset = new Asset(); - asset.setName("Edge Asset 2"); - asset.setType("test"); - Asset savedAsset = doPost("/api/asset", asset, Asset.class); + Asset savedAsset = saveAsset("Edge Asset 2"); edgeImitator.expectMessageAmount(1); doPost("/api/edge/" + edge.getId().getId().toString() @@ -411,18 +476,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testRelations() throws Exception { log.info("Testing Relations"); - List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", - new TypeReference>() {}, new TextPageLink(100)).getData(); - List edgeAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?", - new TypeReference>() {}, new TextPageLink(100)).getData(); - - Assert.assertEquals(1, edgeDevices.size()); - Assert.assertEquals(1, edgeAssets.size()); - Device device = edgeDevices.get(0); - Asset asset = edgeAssets.get(0); - Assert.assertEquals("Edge Device 1", device.getName()); - Assert.assertEquals("Edge Asset 1", asset.getName()); + Device device = findDeviceByName("Edge Device 1"); + Asset asset = findAssetByName("Edge Asset 1"); + EntityRelation relation = new EntityRelation(); relation.setType("test"); relation.setFrom(device.getId()); @@ -474,11 +531,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testAlarms() throws Exception { log.info("Testing Alarms"); - List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", - new TypeReference>() {}, new TextPageLink(100)).getData(); - Assert.assertEquals(1, edgeDevices.size()); - Device device = edgeDevices.get(0); - Assert.assertEquals("Edge Device 1", device.getName()); + Device device = findDeviceByName("Edge Device 1"); Alarm alarm = new Alarm(); alarm.setOriginator(device.getId()); @@ -533,11 +586,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testEntityView() throws Exception { log.info("Testing EntityView"); - List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", - new TypeReference>() {}, new TextPageLink(100)).getData(); - Assert.assertEquals(1, edgeDevices.size()); - Device device = edgeDevices.get(0); - Assert.assertEquals("Edge Device 1", device.getName()); + Device device = findDeviceByName("Edge Device 1"); EntityView entityView = new EntityView(); entityView.setName("Edge EntityView 1"); @@ -704,11 +753,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testTimeseries() throws Exception { log.info("Testing timeseries"); - List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", - new TypeReference>() {}, new TextPageLink(100)).getData(); - Assert.assertEquals(1, edgeDevices.size()); - Device device = edgeDevices.get(0); - Assert.assertEquals("Edge Device 1", device.getName()); + Device device = findDeviceByName("Edge Device 1"); String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}"; JsonNode timeseriesEntityData = mapper.readTree(timeseriesData); @@ -738,12 +783,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testAttributes() throws Exception { log.info("Testing attributes"); - - List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", - new TypeReference>() {}, new TextPageLink(100)).getData(); - Assert.assertEquals(1, edgeDevices.size()); - Device device = edgeDevices.get(0); - Assert.assertEquals("Edge Device 1", device.getName()); + Device device = findDeviceByName("Edge Device 1"); testAttributesUpdatedMsg(device); testPostAttributesMsg(device); @@ -859,11 +899,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { } private void sendAlarm() throws Exception { - List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", - new TypeReference>() {}, new TextPageLink(100)).getData(); - Optional foundDevice = edgeDevices.stream().filter(device1 -> device1.getName().equals("Edge Device 2")).findAny(); - Assert.assertTrue(foundDevice.isPresent()); - Device device = foundDevice.get(); + Device device = findDeviceByName("Edge Device 2"); UplinkMsg.Builder builder = UplinkMsg.newBuilder(); AlarmUpdateMsg.Builder alarmUpdateMgBuilder = AlarmUpdateMsg.newBuilder(); @@ -1075,17 +1111,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void installation() throws Exception { edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class); - Device device = new Device(); - device.setName("Edge Device 1"); - device.setType("test"); - Device savedDevice = doPost("/api/device", device, Device.class); + Device savedDevice = saveDevice("Edge Device 1"); doPost("/api/edge/" + edge.getId().getId().toString() + "/device/" + savedDevice.getId().getId().toString(), Device.class); - Asset asset = new Asset(); - asset.setName("Edge Asset 1"); - asset.setType("test"); - Asset savedAsset = doPost("/api/asset", asset, Asset.class); + Asset savedAsset = saveAsset("Edge Asset 1"); doPost("/api/edge/" + edge.getId().getId().toString() + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); } diff --git a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java index 3eca5438dd..e683426c34 100644 --- a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java +++ b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java @@ -31,6 +31,7 @@ import org.thingsboard.server.gen.edge.AssetUpdateMsg; import org.thingsboard.server.gen.edge.CustomerUpdateMsg; import org.thingsboard.server.gen.edge.DashboardUpdateMsg; import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg; +import org.thingsboard.server.gen.edge.DeviceRpcCallMsg; import org.thingsboard.server.gen.edge.DeviceUpdateMsg; import org.thingsboard.server.gen.edge.DownlinkMsg; import org.thingsboard.server.gen.edge.DownlinkResponseMsg; @@ -224,6 +225,11 @@ public class EdgeImitator { result.add(saveDownlinkMsg(userCredentialsUpdateMsg)); } } + if (downlinkMsg.getDeviceRpcCallMsgList() != null && !downlinkMsg.getDeviceRpcCallMsgList().isEmpty()) { + for (DeviceRpcCallMsg deviceRpcCallMsg: downlinkMsg.getDeviceRpcCallMsgList()) { + result.add(saveDownlinkMsg(deviceRpcCallMsg)); + } + } return Futures.allAsList(result); } From 51e53462de41d602e25dd581e4d9d2facccb6654 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 22 Oct 2020 18:17:30 +0300 Subject: [PATCH 03/12] Added RPC response test --- .../thingsboard/server/edge/BaseEdgeTest.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 9ce30feabb..3ff160da92 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -82,11 +82,13 @@ import org.thingsboard.server.gen.edge.EntityDataProto; import org.thingsboard.server.gen.edge.EntityViewUpdateMsg; import org.thingsboard.server.gen.edge.RelationUpdateMsg; import org.thingsboard.server.gen.edge.RpcRequestMsg; +import org.thingsboard.server.gen.edge.RpcResponseMsg; import org.thingsboard.server.gen.edge.RuleChainMetadataRequestMsg; import org.thingsboard.server.gen.edge.RuleChainMetadataUpdateMsg; import org.thingsboard.server.gen.edge.RuleChainUpdateMsg; import org.thingsboard.server.gen.edge.UpdateMsgType; import org.thingsboard.server.gen.edge.UplinkMsg; +import org.thingsboard.server.gen.edge.UplinkResponseMsg; import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg; import org.thingsboard.server.gen.edge.UserCredentialsUpdateMsg; import org.thingsboard.server.gen.edge.WidgetTypeUpdateMsg; @@ -875,6 +877,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { sendRuleChainMetadataRequest(); sendUserCredentialsRequest(); sendDeviceCredentialsRequest(); + sendDeviceRpcResponse(); log.info("Messages were sent successfully"); } @@ -1056,11 +1059,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { } private void sendDeviceCredentialsRequest() throws Exception { - List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", - new TypeReference>() {}, new TextPageLink(100)).getData(); - Optional foundDevice = edgeDevices.stream().filter(device1 -> device1.getName().equals("Edge Device 1")).findAny(); - Assert.assertTrue(foundDevice.isPresent()); - Device device = foundDevice.get(); + Device device = findDeviceByName("Edge Device 1"); DeviceCredentials deviceCredentials = doGet("/api/device/" + device.getId().getId().toString() + "/credentials", DeviceCredentials.class); @@ -1085,6 +1084,26 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(deviceCredentialsUpdateMsg.getCredentialsId(), deviceCredentials.getCredentialsId()); } + private void sendDeviceRpcResponse() throws Exception { + Device device = findDeviceByName("Edge Device 1"); + + UplinkMsg.Builder builder = UplinkMsg.newBuilder(); + DeviceRpcCallMsg.Builder deviceRpcCallResponse = DeviceRpcCallMsg.newBuilder(); + deviceRpcCallResponse.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); + deviceRpcCallResponse.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); + deviceRpcCallResponse.setOneway(true); + deviceRpcCallResponse.setOriginServiceId("originServiceId"); + deviceRpcCallResponse.setExpirationTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)); + RpcResponseMsg.Builder responseBuilder = + RpcResponseMsg.newBuilder().setResponse("{}"); + deviceRpcCallResponse.setResponseMsg(responseBuilder.build()); + builder.addDeviceRpcCallMsg(deviceRpcCallResponse.build()); + + edgeImitator.expectResponsesAmount(1); + edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.waitForResponses(); + } + private void sendDeleteDeviceOnEdge() throws Exception { List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", new TypeReference>() {}, new TextPageLink(100)).getData(); From f08ae3fb68dee0837909c15dc14484c49d618602 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 23 Oct 2020 10:40:22 +0300 Subject: [PATCH 04/12] Added test for rule chain connections --- .../thingsboard/server/edge/BaseEdgeTest.java | 75 +++++++++++++++++-- .../server/edge/imitator/EdgeImitator.java | 6 ++ 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 3ff160da92..3bb7177de1 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -19,8 +19,8 @@ import com.datastax.driver.core.utils.UUIDs; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.protobuf.AbstractMessage; import lombok.extern.slf4j.Slf4j; @@ -29,7 +29,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.StringUtils; import org.thingsboard.rule.engine.api.RuleEngineDeviceRpcRequest; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Dashboard; @@ -48,7 +47,6 @@ import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventType; -import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; @@ -58,7 +56,9 @@ import org.thingsboard.server.common.data.page.TimePageData; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.rule.RuleChain; +import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainType; +import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.widget.WidgetType; @@ -81,20 +81,19 @@ import org.thingsboard.server.gen.edge.EdgeConfiguration; import org.thingsboard.server.gen.edge.EntityDataProto; import org.thingsboard.server.gen.edge.EntityViewUpdateMsg; import org.thingsboard.server.gen.edge.RelationUpdateMsg; -import org.thingsboard.server.gen.edge.RpcRequestMsg; import org.thingsboard.server.gen.edge.RpcResponseMsg; import org.thingsboard.server.gen.edge.RuleChainMetadataRequestMsg; import org.thingsboard.server.gen.edge.RuleChainMetadataUpdateMsg; import org.thingsboard.server.gen.edge.RuleChainUpdateMsg; import org.thingsboard.server.gen.edge.UpdateMsgType; import org.thingsboard.server.gen.edge.UplinkMsg; -import org.thingsboard.server.gen.edge.UplinkResponseMsg; import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg; import org.thingsboard.server.gen.edge.UserCredentialsUpdateMsg; import org.thingsboard.server.gen.edge.WidgetTypeUpdateMsg; import org.thingsboard.server.gen.edge.WidgetsBundleUpdateMsg; import org.thingsboard.server.gen.transport.TransportProtos; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -379,6 +378,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { ruleChain.setType(RuleChainType.EDGE); RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class); + createRuleChainMetadata(savedRuleChain); + + // Wait before rule chain metadata saved to database before rule chain is assigned to edge + Thread.sleep(1000); + edgeImitator.expectMessageAmount(1); doPost("/api/edge/" + edge.getId().getId().toString() + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class); @@ -392,6 +396,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits()); Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName()); + testRuleChainMetadataRequestMsg(savedRuleChain.getId()); + edgeImitator.expectMessageAmount(1); doDelete("/api/edge/" + edge.getId().getId().toString() + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class); @@ -419,6 +425,65 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { log.info("RuleChains tested successfully"); } + private void testRuleChainMetadataRequestMsg(RuleChainId ruleChainId) throws InterruptedException { + RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg = RuleChainMetadataRequestMsg.newBuilder() + .setRuleChainIdMSB(ruleChainId.getId().getMostSignificantBits()) + .setRuleChainIdLSB(ruleChainId.getId().getLeastSignificantBits()) + .build(); + UplinkMsg uplinkMsg = UplinkMsg.newBuilder() + .addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsg) + .build(); + edgeImitator.expectResponsesAmount(1); + edgeImitator.expectMessageAmount(1); + edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.waitForResponses(); + edgeImitator.waitForMessages(); + + AbstractMessage latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg); + RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = (RuleChainMetadataUpdateMsg) latestMessage; + RuleChainId receivedRuleChainId = + new RuleChainId(new UUID(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), ruleChainMetadataUpdateMsg.getRuleChainIdLSB())); + Assert.assertEquals(ruleChainId, receivedRuleChainId); + } + + private void createRuleChainMetadata(RuleChain ruleChain) throws Exception { + RuleChainMetaData ruleChainMetaData = new RuleChainMetaData(); + ruleChainMetaData.setRuleChainId(ruleChain.getId()); + + ObjectMapper mapper = new ObjectMapper(); + + RuleNode ruleNode1 = new RuleNode(); + ruleNode1.setName("name1"); + ruleNode1.setType("type1"); + ruleNode1.setConfiguration(mapper.readTree("\"key1\": \"val1\"")); + + RuleNode ruleNode2 = new RuleNode(); + ruleNode2.setName("name2"); + ruleNode2.setType("type2"); + ruleNode2.setConfiguration(mapper.readTree("\"key2\": \"val2\"")); + + RuleNode ruleNode3 = new RuleNode(); + ruleNode3.setName("name3"); + ruleNode3.setType("type3"); + ruleNode3.setConfiguration(mapper.readTree("\"key3\": \"val3\"")); + + List ruleNodes = new ArrayList<>(); + ruleNodes.add(ruleNode1); + ruleNodes.add(ruleNode2); + ruleNodes.add(ruleNode3); + ruleChainMetaData.setFirstNodeIndex(0); + ruleChainMetaData.setNodes(ruleNodes); + + ruleChainMetaData.addConnectionInfo(0,1,"success"); + ruleChainMetaData.addConnectionInfo(0,2,"fail"); + ruleChainMetaData.addConnectionInfo(1,2,"success"); + + ruleChainMetaData.addRuleChainConnectionInfo(2, edge.getRootRuleChainId(), "success", mapper.createObjectNode()); + + doPost("/api/ruleChain/metadata", ruleChainMetaData, RuleChainMetaData.class); + } + private void testDashboards() throws Exception { log.info("Testing Dashboards"); Dashboard dashboard = new Dashboard(); diff --git a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java index e683426c34..c2122a9c83 100644 --- a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java +++ b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java @@ -30,6 +30,7 @@ import org.thingsboard.server.gen.edge.AlarmUpdateMsg; import org.thingsboard.server.gen.edge.AssetUpdateMsg; import org.thingsboard.server.gen.edge.CustomerUpdateMsg; import org.thingsboard.server.gen.edge.DashboardUpdateMsg; +import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg; import org.thingsboard.server.gen.edge.DeviceRpcCallMsg; import org.thingsboard.server.gen.edge.DeviceUpdateMsg; @@ -230,6 +231,11 @@ public class EdgeImitator { result.add(saveDownlinkMsg(deviceRpcCallMsg)); } } + if (downlinkMsg.getDeviceCredentialsRequestMsgList() != null && !downlinkMsg.getDeviceCredentialsRequestMsgList().isEmpty()) { + for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg: downlinkMsg.getDeviceCredentialsRequestMsgList()) { + result.add(saveDownlinkMsg(deviceCredentialsRequestMsg)); + } + } return Futures.allAsList(result); } From 1929f4142c2ed1876f157d467074a6ca9cd369dd Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 23 Oct 2020 11:00:11 +0300 Subject: [PATCH 05/12] Added attributes request msg --- .../thingsboard/server/edge/BaseEdgeTest.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 3bb7177de1..80e0cf6787 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -29,6 +29,14 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.context.request.async.DeferredResult; import org.thingsboard.rule.engine.api.RuleEngineDeviceRpcRequest; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Dashboard; @@ -47,7 +55,10 @@ import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventType; +import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.EdgeId; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.EntityIdFactory; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; @@ -71,6 +82,7 @@ import org.thingsboard.server.edge.imitator.EdgeImitator; import org.thingsboard.server.gen.edge.AlarmUpdateMsg; import org.thingsboard.server.gen.edge.AssetUpdateMsg; import org.thingsboard.server.gen.edge.AttributeDeleteMsg; +import org.thingsboard.server.gen.edge.AttributesRequestMsg; import org.thingsboard.server.gen.edge.CustomerUpdateMsg; import org.thingsboard.server.gen.edge.DashboardUpdateMsg; import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; @@ -943,9 +955,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { sendUserCredentialsRequest(); sendDeviceCredentialsRequest(); sendDeviceRpcResponse(); + sendAttributesRequest(); log.info("Messages were sent successfully"); } + private void sendDevice() throws Exception { UUID uuid = UUIDs.timeBased(); @@ -1169,6 +1183,44 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { edgeImitator.waitForResponses(); } + private void sendAttributesRequest() throws Exception { + Device device = findDeviceByName("Edge Device 1"); + + String attributesDataStr = "{\"key1\":\"value1\"}"; + JsonNode attributesData = mapper.readTree(attributesDataStr); + + doPost("/api/plugins/telemetry/DEVICE/" + device.getId().getId().toString() + "/attributes/" + DataConstants.SERVER_SCOPE, + attributesData); + + UplinkMsg.Builder builder = UplinkMsg.newBuilder(); + AttributesRequestMsg.Builder attributesRequestMsgBuilder = AttributesRequestMsg.newBuilder(); + attributesRequestMsgBuilder.setEntityIdMSB(device.getUuidId().getMostSignificantBits()); + attributesRequestMsgBuilder.setEntityIdLSB(device.getUuidId().getLeastSignificantBits()); + attributesRequestMsgBuilder.setEntityType(EntityType.DEVICE.name()); + builder.addAttributesRequestMsg(attributesRequestMsgBuilder.build()); + + edgeImitator.expectResponsesAmount(1); + edgeImitator.expectMessageAmount(1); + edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.waitForResponses(); + edgeImitator.waitForMessages(); + + AbstractMessage latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof EntityDataProto); + EntityDataProto latestEntityDataMsg = (EntityDataProto) latestMessage; + Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB()); + Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB()); + Assert.assertEquals(device.getId().getEntityType().name(), latestEntityDataMsg.getEntityType()); + Assert.assertEquals("SERVER_SCOPE", latestEntityDataMsg.getPostAttributeScope()); + Assert.assertTrue(latestEntityDataMsg.hasAttributesUpdatedMsg()); + + TransportProtos.PostAttributeMsg attributesUpdatedMsg = latestEntityDataMsg.getAttributesUpdatedMsg(); + Assert.assertEquals(1, attributesUpdatedMsg.getKvCount()); + TransportProtos.KeyValueProto keyValueProto = attributesUpdatedMsg.getKv(0); + Assert.assertEquals("key1", keyValueProto.getKey()); + Assert.assertEquals("value1", keyValueProto.getStringV()); + } + private void sendDeleteDeviceOnEdge() throws Exception { List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", new TypeReference>() {}, new TextPageLink(100)).getData(); From 43b37b67dac2f2fe305b35711d16bfa1b92f87fd Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 23 Oct 2020 16:01:43 +0300 Subject: [PATCH 06/12] Added device attribute update test case --- .../thingsboard/server/edge/BaseEdgeTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 80e0cf6787..73c639834c 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -72,6 +72,7 @@ import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.DeviceCredentials; +import org.thingsboard.server.common.data.security.DeviceCredentialsType; import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.transport.adaptor.JsonConverter; @@ -955,6 +956,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { sendUserCredentialsRequest(); sendDeviceCredentialsRequest(); sendDeviceRpcResponse(); + sendDeviceCredentialsUpdate(); sendAttributesRequest(); log.info("Messages were sent successfully"); } @@ -1163,6 +1165,22 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(deviceCredentialsUpdateMsg.getCredentialsId(), deviceCredentials.getCredentialsId()); } + private void sendDeviceCredentialsUpdate() throws Exception { + Device device = findDeviceByName("Edge Device 1"); + + UplinkMsg.Builder builder = UplinkMsg.newBuilder(); + DeviceCredentialsUpdateMsg.Builder deviceCredentialsUpdateMsgBuilder = DeviceCredentialsUpdateMsg.newBuilder(); + deviceCredentialsUpdateMsgBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); + deviceCredentialsUpdateMsgBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); + deviceCredentialsUpdateMsgBuilder.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN.name()); + deviceCredentialsUpdateMsgBuilder.setCredentialsId("NEW_TOKEN"); + builder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsgBuilder.build()); + + edgeImitator.expectResponsesAmount(1); + edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.waitForResponses(); + } + private void sendDeviceRpcResponse() throws Exception { Device device = findDeviceByName("Edge Device 1"); From 3efe0beb07106c0b570f498edbc4838c9faa6712 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 23 Oct 2020 17:25:04 +0300 Subject: [PATCH 07/12] Added relation request message --- .../thingsboard/server/edge/BaseEdgeTest.java | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 73c639834c..0974986455 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -93,6 +93,7 @@ import org.thingsboard.server.gen.edge.DeviceUpdateMsg; import org.thingsboard.server.gen.edge.EdgeConfiguration; import org.thingsboard.server.gen.edge.EntityDataProto; import org.thingsboard.server.gen.edge.EntityViewUpdateMsg; +import org.thingsboard.server.gen.edge.RelationRequestMsg; import org.thingsboard.server.gen.edge.RelationUpdateMsg; import org.thingsboard.server.gen.edge.RpcResponseMsg; import org.thingsboard.server.gen.edge.RuleChainMetadataRequestMsg; @@ -948,6 +949,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testSendMessagesToCloud() throws Exception { log.info("Sending messages to cloud"); sendDevice(); + sendRelationRequest(); sendAlarm(); sendTelemetry(); sendRelation(); @@ -961,7 +963,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { log.info("Messages were sent successfully"); } - private void sendDevice() throws Exception { UUID uuid = UUIDs.timeBased(); @@ -982,6 +983,50 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals("Edge Device 2", device.getName()); } + private void sendRelationRequest() throws Exception { + Device device = findDeviceByName("Edge Device 1"); + Asset asset = findAssetByName("Edge Asset 1"); + + EntityRelation relation = new EntityRelation(); + relation.setType("test"); + relation.setFrom(device.getId()); + relation.setTo(asset.getId()); + relation.setTypeGroup(RelationTypeGroup.COMMON); + + edgeImitator.expectMessageAmount(1); + doPost("/api/relation", relation); + edgeImitator.waitForMessages(); + + UplinkMsg.Builder builder = UplinkMsg.newBuilder(); + RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder(); + relationRequestMsgBuilder.setEntityIdMSB(device.getId().getId().getMostSignificantBits()); + relationRequestMsgBuilder.setEntityIdLSB(device.getId().getId().getLeastSignificantBits()); + relationRequestMsgBuilder.setEntityType(device.getId().getEntityType().name()); + builder.addRelationRequestMsg(relationRequestMsgBuilder.build()); + + edgeImitator.expectResponsesAmount(1); + edgeImitator.expectMessageAmount(1); + edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.waitForResponses(); + edgeImitator.waitForMessages(); + + AbstractMessage latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof RelationUpdateMsg); + RelationUpdateMsg relationUpdateMsg = (RelationUpdateMsg) latestMessage; + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, relationUpdateMsg.getMsgType()); + Assert.assertEquals(relation.getType(), relationUpdateMsg.getType()); + + UUID fromUUID = new UUID(relationUpdateMsg.getFromIdMSB(), relationUpdateMsg.getFromIdLSB()); + EntityId fromEntityId = EntityIdFactory.getByTypeAndUuid(relationUpdateMsg.getFromEntityType(), fromUUID); + Assert.assertEquals(relation.getFrom(), fromEntityId); + + UUID toUUID = new UUID(relationUpdateMsg.getToIdMSB(), relationUpdateMsg.getToIdLSB()); + EntityId toEntityId = EntityIdFactory.getByTypeAndUuid(relationUpdateMsg.getToEntityType(), toUUID); + Assert.assertEquals(relation.getTo(), toEntityId); + + Assert.assertEquals(relation.getTypeGroup().name(), relationUpdateMsg.getTypeGroup()); + } + private void sendAlarm() throws Exception { Device device = findDeviceByName("Edge Device 2"); From 4b1500390e0221faf492304725b8983e69fc542f Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 23 Oct 2020 19:28:36 +0300 Subject: [PATCH 08/12] Added test for autogenerated code of protobuf --- .../thingsboard/server/edge/BaseEdgeTest.java | 206 ++++++++++++------ 1 file changed, 139 insertions(+), 67 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 0974986455..55dfdeeaee 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -23,20 +23,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.JsonObject; import com.google.protobuf.AbstractMessage; +import com.google.protobuf.Extension; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.MessageLite; +import com.google.protobuf.Parser; import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.context.request.async.DeferredResult; import org.thingsboard.rule.engine.api.RuleEngineDeviceRpcRequest; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Dashboard; @@ -55,7 +51,6 @@ import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventType; -import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityIdFactory; @@ -115,6 +110,7 @@ import java.util.Random; import java.util.UUID; import java.util.concurrent.TimeUnit; +import static com.google.protobuf.Extension.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Slf4j @@ -439,14 +435,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { log.info("RuleChains tested successfully"); } - private void testRuleChainMetadataRequestMsg(RuleChainId ruleChainId) throws InterruptedException { - RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg = RuleChainMetadataRequestMsg.newBuilder() + private void testRuleChainMetadataRequestMsg(RuleChainId ruleChainId) throws Exception { + RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg = RuleChainMetadataRequestMsg.newBuilder().clear() .setRuleChainIdMSB(ruleChainId.getId().getMostSignificantBits()) .setRuleChainIdLSB(ruleChainId.getId().getLeastSignificantBits()) .build(); - UplinkMsg uplinkMsg = UplinkMsg.newBuilder() + testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsg); + + UplinkMsg uplinkMsg = UplinkMsg.newBuilder().clear() .addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsg) .build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); + edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); edgeImitator.sendUplinkMsg(uplinkMsg); @@ -966,16 +966,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendDevice() throws Exception { UUID uuid = UUIDs.timeBased(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - DeviceUpdateMsg.Builder deviceUpdateMsgBuilder = DeviceUpdateMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + DeviceUpdateMsg.Builder deviceUpdateMsgBuilder = DeviceUpdateMsg.newBuilder().clear(); deviceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits()); deviceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits()); deviceUpdateMsgBuilder.setName("Edge Device 2"); deviceUpdateMsgBuilder.setType("test"); deviceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE); - builder.addDeviceUpdateMsg(deviceUpdateMsgBuilder.build()); + DeviceUpdateMsg deviceUpdateMsg = deviceUpdateMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(deviceUpdateMsg); + builder.addDeviceUpdateMsg(deviceUpdateMsg); + edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); Device device = doGet("/api/device/" + uuid.toString(), Device.class); @@ -997,16 +1002,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { doPost("/api/relation", relation); edgeImitator.waitForMessages(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder().clear(); relationRequestMsgBuilder.setEntityIdMSB(device.getId().getId().getMostSignificantBits()); relationRequestMsgBuilder.setEntityIdLSB(device.getId().getId().getLeastSignificantBits()); relationRequestMsgBuilder.setEntityType(device.getId().getEntityType().name()); - builder.addRelationRequestMsg(relationRequestMsgBuilder.build()); + RelationRequestMsg relationRequestMsg = relationRequestMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(relationRequestMsg); + + builder.addRelationRequestMsg(relationRequestMsg); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1030,16 +1040,22 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendAlarm() throws Exception { Device device = findDeviceByName("Edge Device 2"); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - AlarmUpdateMsg.Builder alarmUpdateMgBuilder = AlarmUpdateMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + AlarmUpdateMsg.Builder alarmUpdateMgBuilder = AlarmUpdateMsg.newBuilder().clear(); alarmUpdateMgBuilder.setName("alarm from edge"); alarmUpdateMgBuilder.setStatus(AlarmStatus.ACTIVE_UNACK.name()); alarmUpdateMgBuilder.setSeverity(AlarmSeverity.CRITICAL.name()); alarmUpdateMgBuilder.setOriginatorName(device.getName()); alarmUpdateMgBuilder.setOriginatorType(EntityType.DEVICE.name()); - builder.addAlarmUpdateMsg(alarmUpdateMgBuilder.build()); + AlarmUpdateMsg alarmUpdateMsg = alarmUpdateMgBuilder.build(); + testAutoGeneratedCodeByProtobuf(alarmUpdateMsg); + builder.addAlarmUpdateMsg(alarmUpdateMsg); + + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); + edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); @@ -1065,8 +1081,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertTrue(foundDevice2.isPresent()); Device device2 = foundDevice2.get(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder().clear(); relationUpdateMsgBuilder.setType("test"); relationUpdateMsgBuilder.setTypeGroup(RelationTypeGroup.COMMON.name()); relationUpdateMsgBuilder.setToIdMSB(device1.getId().getId().getMostSignificantBits()); @@ -1076,10 +1092,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { relationUpdateMsgBuilder.setFromIdLSB(device2.getId().getId().getLeastSignificantBits()); relationUpdateMsgBuilder.setFromEntityType(device2.getId().getEntityType().name()); relationUpdateMsgBuilder.setAdditionalInfo("{}"); - builder.addRelationUpdateMsg(relationUpdateMsgBuilder.build()); - UplinkMsg msg = builder.build(); + RelationUpdateMsg relationUpdateMsg = relationUpdateMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(relationUpdateMsg); + builder.addRelationUpdateMsg(relationUpdateMsg); + + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); + edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(msg); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); EntityRelation relation = doGet("/api/relation?" + @@ -1105,28 +1126,39 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { String timeseriesKey = "key"; String timeseriesValue = "25"; data.addProperty(timeseriesKey, timeseriesValue); - UplinkMsg.Builder builder1 = UplinkMsg.newBuilder(); - EntityDataProto.Builder entityDataBuilder = EntityDataProto.newBuilder(); + UplinkMsg.Builder builder1 = UplinkMsg.newBuilder().clear(); + EntityDataProto.Builder entityDataBuilder = EntityDataProto.newBuilder().clear(); entityDataBuilder.setPostTelemetryMsg(JsonConverter.convertToTelemetryProto(data, System.currentTimeMillis())); entityDataBuilder.setEntityType(device.getId().getEntityType().name()); entityDataBuilder.setEntityIdMSB(device.getUuidId().getMostSignificantBits()); entityDataBuilder.setEntityIdLSB(device.getUuidId().getLeastSignificantBits()); - builder1.addEntityData(entityDataBuilder.build()); - edgeImitator.sendUplinkMsg(builder1.build()); + EntityDataProto entityDataProto1 = entityDataBuilder.build(); + testAutoGeneratedCodeByProtobuf(entityDataProto1); + builder1.addEntityData(entityDataProto1); + + UplinkMsg uplinkMsg1 = builder1.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg1); + edgeImitator.sendUplinkMsg(uplinkMsg1); JsonObject attributesData = new JsonObject(); String attributesKey = "test_attr"; String attributesValue = "test_value"; attributesData.addProperty(attributesKey, attributesValue); - UplinkMsg.Builder builder2 = UplinkMsg.newBuilder(); - EntityDataProto.Builder entityDataBuilder2 = EntityDataProto.newBuilder(); + UplinkMsg.Builder builder2 = UplinkMsg.newBuilder().clear(); + EntityDataProto.Builder entityDataBuilder2 = EntityDataProto.newBuilder().clear(); entityDataBuilder2.setEntityType(device.getId().getEntityType().name()); entityDataBuilder2.setEntityIdMSB(device.getId().getId().getMostSignificantBits()); entityDataBuilder2.setEntityIdLSB(device.getId().getId().getLeastSignificantBits()); entityDataBuilder2.setAttributesUpdatedMsg(JsonConverter.convertToAttributesProto(attributesData)); entityDataBuilder2.setPostAttributeScope(DataConstants.SERVER_SCOPE); - builder2.addEntityData(entityDataBuilder2.build()); - edgeImitator.sendUplinkMsg(builder2.build()); + EntityDataProto entityDataProto2 = entityDataBuilder2.build(); + testAutoGeneratedCodeByProtobuf(entityDataProto2); + + builder2.addEntityData(entityDataProto2); + UplinkMsg uplinkMsg2 = builder2.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg2); + + edgeImitator.sendUplinkMsg(uplinkMsg2); edgeImitator.waitForResponses(); Thread.sleep(1000); @@ -1145,14 +1177,20 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendRuleChainMetadataRequest() throws Exception { RuleChainId edgeRootRuleChainId = edge.getRootRuleChainId(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - RuleChainMetadataRequestMsg.Builder ruleChainMetadataRequestMsgBuilder = RuleChainMetadataRequestMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + RuleChainMetadataRequestMsg.Builder ruleChainMetadataRequestMsgBuilder = RuleChainMetadataRequestMsg.newBuilder().clear(); ruleChainMetadataRequestMsgBuilder.setRuleChainIdMSB(edgeRootRuleChainId.getId().getMostSignificantBits()); ruleChainMetadataRequestMsgBuilder.setRuleChainIdLSB(edgeRootRuleChainId.getId().getLeastSignificantBits()); - builder.addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsgBuilder.build()); + RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg = ruleChainMetadataRequestMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsg); + + builder.addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsg); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); + edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1166,14 +1204,19 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendUserCredentialsRequest() throws Exception { UserId userId = edgeImitator.getUserId(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - UserCredentialsRequestMsg.Builder userCredentialsRequestMsgBuilder = UserCredentialsRequestMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + UserCredentialsRequestMsg.Builder userCredentialsRequestMsgBuilder = UserCredentialsRequestMsg.newBuilder().clear(); userCredentialsRequestMsgBuilder.setUserIdMSB(userId.getId().getMostSignificantBits()); userCredentialsRequestMsgBuilder.setUserIdLSB(userId.getId().getLeastSignificantBits()); - builder.addUserCredentialsRequestMsg(userCredentialsRequestMsgBuilder.build()); + UserCredentialsRequestMsg userCredentialsRequestMsg = userCredentialsRequestMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(userCredentialsRequestMsg); + builder.addUserCredentialsRequestMsg(userCredentialsRequestMsg); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); + edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1189,15 +1232,19 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { DeviceCredentials deviceCredentials = doGet("/api/device/" + device.getId().getId().toString() + "/credentials", DeviceCredentials.class); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - DeviceCredentialsRequestMsg.Builder deviceCredentialsRequestMsgBuilder = DeviceCredentialsRequestMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + DeviceCredentialsRequestMsg.Builder deviceCredentialsRequestMsgBuilder = DeviceCredentialsRequestMsg.newBuilder().clear(); deviceCredentialsRequestMsgBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); deviceCredentialsRequestMsgBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); - builder.addDeviceCredentialsRequestMsg(deviceCredentialsRequestMsgBuilder.build()); + DeviceCredentialsRequestMsg deviceCredentialsRequestMsg = deviceCredentialsRequestMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(deviceCredentialsRequestMsg); + builder.addDeviceCredentialsRequestMsg(deviceCredentialsRequestMsg); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1213,36 +1260,46 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendDeviceCredentialsUpdate() throws Exception { Device device = findDeviceByName("Edge Device 1"); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - DeviceCredentialsUpdateMsg.Builder deviceCredentialsUpdateMsgBuilder = DeviceCredentialsUpdateMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + DeviceCredentialsUpdateMsg.Builder deviceCredentialsUpdateMsgBuilder = DeviceCredentialsUpdateMsg.newBuilder().clear(); deviceCredentialsUpdateMsgBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); deviceCredentialsUpdateMsgBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); deviceCredentialsUpdateMsgBuilder.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN.name()); deviceCredentialsUpdateMsgBuilder.setCredentialsId("NEW_TOKEN"); - builder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsgBuilder.build()); + DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg = deviceCredentialsUpdateMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(deviceCredentialsUpdateMsg); + builder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsg); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); } private void sendDeviceRpcResponse() throws Exception { Device device = findDeviceByName("Edge Device 1"); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - DeviceRpcCallMsg.Builder deviceRpcCallResponse = DeviceRpcCallMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + DeviceRpcCallMsg.Builder deviceRpcCallResponse = DeviceRpcCallMsg.newBuilder().clear(); deviceRpcCallResponse.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); deviceRpcCallResponse.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); deviceRpcCallResponse.setOneway(true); deviceRpcCallResponse.setOriginServiceId("originServiceId"); deviceRpcCallResponse.setExpirationTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)); RpcResponseMsg.Builder responseBuilder = - RpcResponseMsg.newBuilder().setResponse("{}"); - deviceRpcCallResponse.setResponseMsg(responseBuilder.build()); - builder.addDeviceRpcCallMsg(deviceRpcCallResponse.build()); + RpcResponseMsg.newBuilder().clear().setResponse("{}"); + RpcResponseMsg rpcResponseMsg = responseBuilder.build(); + testAutoGeneratedCodeByProtobuf(rpcResponseMsg); + deviceRpcCallResponse.setResponseMsg(rpcResponseMsg); + DeviceRpcCallMsg deviceRpcCallMsg = deviceRpcCallResponse.build(); + testAutoGeneratedCodeByProtobuf(deviceRpcCallMsg); + builder.addDeviceRpcCallMsg(deviceRpcCallMsg); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); } @@ -1255,16 +1312,20 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { doPost("/api/plugins/telemetry/DEVICE/" + device.getId().getId().toString() + "/attributes/" + DataConstants.SERVER_SCOPE, attributesData); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - AttributesRequestMsg.Builder attributesRequestMsgBuilder = AttributesRequestMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + AttributesRequestMsg.Builder attributesRequestMsgBuilder = AttributesRequestMsg.newBuilder().clear(); attributesRequestMsgBuilder.setEntityIdMSB(device.getUuidId().getMostSignificantBits()); attributesRequestMsgBuilder.setEntityIdLSB(device.getUuidId().getLeastSignificantBits()); attributesRequestMsgBuilder.setEntityType(EntityType.DEVICE.name()); - builder.addAttributesRequestMsg(attributesRequestMsgBuilder.build()); + AttributesRequestMsg attributesRequestMsg = attributesRequestMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(attributesRequestMsg); + builder.addAttributesRequestMsg(attributesRequestMsg); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1290,14 +1351,19 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Optional foundDevice = edgeDevices.stream().filter(device1 -> device1.getName().equals("Edge Device 2")).findAny(); Assert.assertTrue(foundDevice.isPresent()); Device device = foundDevice.get(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder(); - DeviceUpdateMsg.Builder deviceDeleteMsgBuilder = DeviceUpdateMsg.newBuilder(); + UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); + DeviceUpdateMsg.Builder deviceDeleteMsgBuilder = DeviceUpdateMsg.newBuilder().clear(); deviceDeleteMsgBuilder.setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE); deviceDeleteMsgBuilder.setIdMSB(device.getId().getId().getMostSignificantBits()); deviceDeleteMsgBuilder.setIdLSB(device.getId().getId().getLeastSignificantBits()); - builder.addDeviceUpdateMsg(deviceDeleteMsgBuilder.build()); + DeviceUpdateMsg deviceUpdateMsg = deviceDeleteMsgBuilder.build(); + testAutoGeneratedCodeByProtobuf(deviceUpdateMsg); + builder.addDeviceUpdateMsg(deviceUpdateMsg); + UplinkMsg uplinkMsg = builder.build(); + testAutoGeneratedCodeByProtobuf(uplinkMsg); + edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(builder.build()); + edgeImitator.sendUplinkMsg(uplinkMsg); edgeImitator.waitForResponses(); device = doGet("/api/device/" + device.getId().getId().toString(), Device.class); Assert.assertNotNull(device); @@ -1329,4 +1395,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { edgeEvent.setBody(entityBody); return edgeEvent; } + + private void testAutoGeneratedCodeByProtobuf(MessageLite source) throws InvalidProtocolBufferException { + MessageLite target = source.getParserForType().parseFrom(source.toByteArray()); + Assert.assertEquals(source, target); + Assert.assertEquals(source.hashCode(), target.hashCode()); + } } From c452cae853b78a931fa7cfe33048d36896b59041 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 23 Oct 2020 22:32:24 +0300 Subject: [PATCH 09/12] Added test for auto generated code --- .../thingsboard/server/edge/BaseEdgeTest.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 55dfdeeaee..8d461cef4b 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -23,10 +23,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.JsonObject; import com.google.protobuf.AbstractMessage; -import com.google.protobuf.Extension; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.MessageLite; -import com.google.protobuf.Parser; import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Assert; @@ -110,7 +108,6 @@ import java.util.Random; import java.util.UUID; import java.util.concurrent.TimeUnit; -import static com.google.protobuf.Extension.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Slf4j @@ -250,6 +247,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { EdgeConfiguration configuration = edgeImitator.getConfiguration(); Assert.assertNotNull(configuration); + testAutoGeneratedCodeByProtobuf(configuration); + UserId userId = edgeImitator.getUserId(); Assert.assertNotNull(userId); @@ -275,6 +274,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { new TypeReference>() {}, new TextPageLink(100)).getData(); Assert.assertTrue(edgeAssets.contains(asset)); + testAutoGeneratedCodeByProtobuf(assetUpdateMsg); + Optional optionalMsg3 = edgeImitator.findMessageByType(RuleChainUpdateMsg.class); Assert.assertTrue(optionalMsg3.isPresent()); RuleChainUpdateMsg ruleChainUpdateMsg = optionalMsg3.get(); @@ -286,6 +287,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { new TypeReference>() {}, new TextPageLink(100)).getData(); Assert.assertTrue(edgeRuleChains.contains(ruleChain)); + testAutoGeneratedCodeByProtobuf(ruleChainUpdateMsg); + log.info("Received data checked"); } @@ -517,6 +520,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits()); Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName()); + testAutoGeneratedCodeByProtobuf(dashboardUpdateMsg); + edgeImitator.expectMessageAmount(1); savedDashboard.setTitle("Updated Edge Test Dashboard"); doPost("/api/dashboard", savedDashboard, Dashboard.class); @@ -739,6 +744,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits()); Assert.assertEquals(customerUpdateMsg.getTitle(), savedCustomer.getTitle()); + testAutoGeneratedCodeByProtobuf(customerUpdateMsg); + edgeImitator.expectMessageAmount(1); doDelete("/api/customer/edge/" + edge.getId().getId().toString(), Edge.class); edgeImitator.waitForMessages(); @@ -784,6 +791,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(widgetsBundleUpdateMsg.getAlias(), savedWidgetsBundle.getAlias()); Assert.assertEquals(widgetsBundleUpdateMsg.getTitle(), savedWidgetsBundle.getTitle()); + testAutoGeneratedCodeByProtobuf(widgetsBundleUpdateMsg); + WidgetType widgetType = new WidgetType(); widgetType.setName("Test Widget Type"); widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); @@ -1199,6 +1208,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = (RuleChainMetadataUpdateMsg) latestMessage; Assert.assertEquals(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), edgeRootRuleChainId.getId().getMostSignificantBits()); Assert.assertEquals(ruleChainMetadataUpdateMsg.getRuleChainIdLSB(), edgeRootRuleChainId.getId().getLeastSignificantBits()); + + testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsg); } private void sendUserCredentialsRequest() throws Exception { @@ -1225,6 +1236,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { UserCredentialsUpdateMsg userCredentialsUpdateMsg = (UserCredentialsUpdateMsg) latestMessage; Assert.assertEquals(userCredentialsUpdateMsg.getUserIdMSB(), userId.getId().getMostSignificantBits()); Assert.assertEquals(userCredentialsUpdateMsg.getUserIdLSB(), userId.getId().getLeastSignificantBits()); + + testAutoGeneratedCodeByProtobuf(userCredentialsUpdateMsg); } private void sendDeviceCredentialsRequest() throws Exception { From 8aa51ee6f7e34df1b84a0fdd5fe124c8bae77693 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 26 Oct 2020 12:19:11 +0200 Subject: [PATCH 10/12] Added coverage for merge functionality --- .../thingsboard/server/edge/BaseEdgeTest.java | 227 ++++++++---------- 1 file changed, 104 insertions(+), 123 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 55dfdeeaee..a31077ef51 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -436,20 +436,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { } private void testRuleChainMetadataRequestMsg(RuleChainId ruleChainId) throws Exception { - RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg = RuleChainMetadataRequestMsg.newBuilder().clear() + RuleChainMetadataRequestMsg.Builder ruleChainMetadataRequestMsgBuilder = RuleChainMetadataRequestMsg.newBuilder() .setRuleChainIdMSB(ruleChainId.getId().getMostSignificantBits()) - .setRuleChainIdLSB(ruleChainId.getId().getLeastSignificantBits()) - .build(); - testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsg); + .setRuleChainIdLSB(ruleChainId.getId().getLeastSignificantBits()); + testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsgBuilder); - UplinkMsg uplinkMsg = UplinkMsg.newBuilder().clear() - .addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsg) - .build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder() + .addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsgBuilder.build()); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -966,21 +964,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendDevice() throws Exception { UUID uuid = UUIDs.timeBased(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - DeviceUpdateMsg.Builder deviceUpdateMsgBuilder = DeviceUpdateMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + DeviceUpdateMsg.Builder deviceUpdateMsgBuilder = DeviceUpdateMsg.newBuilder(); deviceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits()); deviceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits()); deviceUpdateMsgBuilder.setName("Edge Device 2"); deviceUpdateMsgBuilder.setType("test"); deviceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE); - DeviceUpdateMsg deviceUpdateMsg = deviceUpdateMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(deviceUpdateMsg); - builder.addDeviceUpdateMsg(deviceUpdateMsg); + testAutoGeneratedCodeByProtobuf(deviceUpdateMsgBuilder); + uplinkMsgBuilder.addDeviceUpdateMsg(deviceUpdateMsgBuilder.build()); edgeImitator.expectResponsesAmount(1); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); - edgeImitator.sendUplinkMsg(uplinkMsg); + + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); + + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); Device device = doGet("/api/device/" + uuid.toString(), Device.class); @@ -1002,21 +1000,19 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { doPost("/api/relation", relation); edgeImitator.waitForMessages(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder(); relationRequestMsgBuilder.setEntityIdMSB(device.getId().getId().getMostSignificantBits()); relationRequestMsgBuilder.setEntityIdLSB(device.getId().getId().getLeastSignificantBits()); relationRequestMsgBuilder.setEntityType(device.getId().getEntityType().name()); - RelationRequestMsg relationRequestMsg = relationRequestMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(relationRequestMsg); + testAutoGeneratedCodeByProtobuf(relationRequestMsgBuilder); - builder.addRelationRequestMsg(relationRequestMsg); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + uplinkMsgBuilder.addRelationRequestMsg(relationRequestMsgBuilder.build()); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1040,22 +1036,20 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendAlarm() throws Exception { Device device = findDeviceByName("Edge Device 2"); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - AlarmUpdateMsg.Builder alarmUpdateMgBuilder = AlarmUpdateMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + AlarmUpdateMsg.Builder alarmUpdateMgBuilder = AlarmUpdateMsg.newBuilder(); alarmUpdateMgBuilder.setName("alarm from edge"); alarmUpdateMgBuilder.setStatus(AlarmStatus.ACTIVE_UNACK.name()); alarmUpdateMgBuilder.setSeverity(AlarmSeverity.CRITICAL.name()); alarmUpdateMgBuilder.setOriginatorName(device.getName()); alarmUpdateMgBuilder.setOriginatorType(EntityType.DEVICE.name()); - AlarmUpdateMsg alarmUpdateMsg = alarmUpdateMgBuilder.build(); - testAutoGeneratedCodeByProtobuf(alarmUpdateMsg); - builder.addAlarmUpdateMsg(alarmUpdateMsg); + testAutoGeneratedCodeByProtobuf(alarmUpdateMgBuilder); + uplinkMsgBuilder.addAlarmUpdateMsg(alarmUpdateMgBuilder.build()); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); @@ -1081,8 +1075,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertTrue(foundDevice2.isPresent()); Device device2 = foundDevice2.get(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder(); relationUpdateMsgBuilder.setType("test"); relationUpdateMsgBuilder.setTypeGroup(RelationTypeGroup.COMMON.name()); relationUpdateMsgBuilder.setToIdMSB(device1.getId().getId().getMostSignificantBits()); @@ -1092,15 +1086,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { relationUpdateMsgBuilder.setFromIdLSB(device2.getId().getId().getLeastSignificantBits()); relationUpdateMsgBuilder.setFromEntityType(device2.getId().getEntityType().name()); relationUpdateMsgBuilder.setAdditionalInfo("{}"); - RelationUpdateMsg relationUpdateMsg = relationUpdateMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(relationUpdateMsg); - builder.addRelationUpdateMsg(relationUpdateMsg); + testAutoGeneratedCodeByProtobuf(relationUpdateMsgBuilder); + uplinkMsgBuilder.addRelationUpdateMsg(relationUpdateMsgBuilder.build()); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); EntityRelation relation = doGet("/api/relation?" + @@ -1126,39 +1118,35 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { String timeseriesKey = "key"; String timeseriesValue = "25"; data.addProperty(timeseriesKey, timeseriesValue); - UplinkMsg.Builder builder1 = UplinkMsg.newBuilder().clear(); - EntityDataProto.Builder entityDataBuilder = EntityDataProto.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder1 = UplinkMsg.newBuilder(); + EntityDataProto.Builder entityDataBuilder = EntityDataProto.newBuilder(); entityDataBuilder.setPostTelemetryMsg(JsonConverter.convertToTelemetryProto(data, System.currentTimeMillis())); entityDataBuilder.setEntityType(device.getId().getEntityType().name()); entityDataBuilder.setEntityIdMSB(device.getUuidId().getMostSignificantBits()); entityDataBuilder.setEntityIdLSB(device.getUuidId().getLeastSignificantBits()); - EntityDataProto entityDataProto1 = entityDataBuilder.build(); - testAutoGeneratedCodeByProtobuf(entityDataProto1); - builder1.addEntityData(entityDataProto1); + testAutoGeneratedCodeByProtobuf(entityDataBuilder); + uplinkMsgBuilder1.addEntityData(entityDataBuilder.build()); - UplinkMsg uplinkMsg1 = builder1.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg1); - edgeImitator.sendUplinkMsg(uplinkMsg1); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder1); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder1.build()); JsonObject attributesData = new JsonObject(); String attributesKey = "test_attr"; String attributesValue = "test_value"; attributesData.addProperty(attributesKey, attributesValue); - UplinkMsg.Builder builder2 = UplinkMsg.newBuilder().clear(); - EntityDataProto.Builder entityDataBuilder2 = EntityDataProto.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder2 = UplinkMsg.newBuilder(); + EntityDataProto.Builder entityDataBuilder2 = EntityDataProto.newBuilder(); entityDataBuilder2.setEntityType(device.getId().getEntityType().name()); entityDataBuilder2.setEntityIdMSB(device.getId().getId().getMostSignificantBits()); entityDataBuilder2.setEntityIdLSB(device.getId().getId().getLeastSignificantBits()); entityDataBuilder2.setAttributesUpdatedMsg(JsonConverter.convertToAttributesProto(attributesData)); entityDataBuilder2.setPostAttributeScope(DataConstants.SERVER_SCOPE); - EntityDataProto entityDataProto2 = entityDataBuilder2.build(); - testAutoGeneratedCodeByProtobuf(entityDataProto2); + testAutoGeneratedCodeByProtobuf(entityDataBuilder2); - builder2.addEntityData(entityDataProto2); - UplinkMsg uplinkMsg2 = builder2.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg2); + uplinkMsgBuilder2.addEntityData(entityDataBuilder2.build()); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder2); - edgeImitator.sendUplinkMsg(uplinkMsg2); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build()); edgeImitator.waitForResponses(); Thread.sleep(1000); @@ -1177,20 +1165,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendRuleChainMetadataRequest() throws Exception { RuleChainId edgeRootRuleChainId = edge.getRootRuleChainId(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - RuleChainMetadataRequestMsg.Builder ruleChainMetadataRequestMsgBuilder = RuleChainMetadataRequestMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + RuleChainMetadataRequestMsg.Builder ruleChainMetadataRequestMsgBuilder = RuleChainMetadataRequestMsg.newBuilder(); ruleChainMetadataRequestMsgBuilder.setRuleChainIdMSB(edgeRootRuleChainId.getId().getMostSignificantBits()); ruleChainMetadataRequestMsgBuilder.setRuleChainIdLSB(edgeRootRuleChainId.getId().getLeastSignificantBits()); - RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg = ruleChainMetadataRequestMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsg); + testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsgBuilder); + uplinkMsgBuilder.addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsgBuilder.build()); - builder.addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsg); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1204,19 +1190,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendUserCredentialsRequest() throws Exception { UserId userId = edgeImitator.getUserId(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - UserCredentialsRequestMsg.Builder userCredentialsRequestMsgBuilder = UserCredentialsRequestMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + UserCredentialsRequestMsg.Builder userCredentialsRequestMsgBuilder = UserCredentialsRequestMsg.newBuilder(); userCredentialsRequestMsgBuilder.setUserIdMSB(userId.getId().getMostSignificantBits()); userCredentialsRequestMsgBuilder.setUserIdLSB(userId.getId().getLeastSignificantBits()); - UserCredentialsRequestMsg userCredentialsRequestMsg = userCredentialsRequestMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(userCredentialsRequestMsg); - builder.addUserCredentialsRequestMsg(userCredentialsRequestMsg); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + testAutoGeneratedCodeByProtobuf(userCredentialsRequestMsgBuilder); + uplinkMsgBuilder.addUserCredentialsRequestMsg(userCredentialsRequestMsgBuilder.build()); + + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1232,19 +1217,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { DeviceCredentials deviceCredentials = doGet("/api/device/" + device.getId().getId().toString() + "/credentials", DeviceCredentials.class); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - DeviceCredentialsRequestMsg.Builder deviceCredentialsRequestMsgBuilder = DeviceCredentialsRequestMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + DeviceCredentialsRequestMsg.Builder deviceCredentialsRequestMsgBuilder = DeviceCredentialsRequestMsg.newBuilder(); deviceCredentialsRequestMsgBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); deviceCredentialsRequestMsgBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); - DeviceCredentialsRequestMsg deviceCredentialsRequestMsg = deviceCredentialsRequestMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(deviceCredentialsRequestMsg); - builder.addDeviceCredentialsRequestMsg(deviceCredentialsRequestMsg); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + testAutoGeneratedCodeByProtobuf(deviceCredentialsRequestMsgBuilder); + uplinkMsgBuilder.addDeviceCredentialsRequestMsg(deviceCredentialsRequestMsgBuilder.build()); + + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1260,46 +1244,44 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void sendDeviceCredentialsUpdate() throws Exception { Device device = findDeviceByName("Edge Device 1"); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - DeviceCredentialsUpdateMsg.Builder deviceCredentialsUpdateMsgBuilder = DeviceCredentialsUpdateMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + DeviceCredentialsUpdateMsg.Builder deviceCredentialsUpdateMsgBuilder = DeviceCredentialsUpdateMsg.newBuilder(); deviceCredentialsUpdateMsgBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); deviceCredentialsUpdateMsgBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); deviceCredentialsUpdateMsgBuilder.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN.name()); deviceCredentialsUpdateMsgBuilder.setCredentialsId("NEW_TOKEN"); - DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg = deviceCredentialsUpdateMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(deviceCredentialsUpdateMsg); - builder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsg); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + testAutoGeneratedCodeByProtobuf(deviceCredentialsUpdateMsgBuilder); + uplinkMsgBuilder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsgBuilder.build()); + + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); } private void sendDeviceRpcResponse() throws Exception { Device device = findDeviceByName("Edge Device 1"); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - DeviceRpcCallMsg.Builder deviceRpcCallResponse = DeviceRpcCallMsg.newBuilder().clear(); - deviceRpcCallResponse.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); - deviceRpcCallResponse.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); - deviceRpcCallResponse.setOneway(true); - deviceRpcCallResponse.setOriginServiceId("originServiceId"); - deviceRpcCallResponse.setExpirationTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + DeviceRpcCallMsg.Builder deviceRpcCallResponseBuilder = DeviceRpcCallMsg.newBuilder(); + deviceRpcCallResponseBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); + deviceRpcCallResponseBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); + deviceRpcCallResponseBuilder.setOneway(true); + deviceRpcCallResponseBuilder.setOriginServiceId("originServiceId"); + deviceRpcCallResponseBuilder.setExpirationTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)); RpcResponseMsg.Builder responseBuilder = - RpcResponseMsg.newBuilder().clear().setResponse("{}"); - RpcResponseMsg rpcResponseMsg = responseBuilder.build(); - testAutoGeneratedCodeByProtobuf(rpcResponseMsg); - deviceRpcCallResponse.setResponseMsg(rpcResponseMsg); - DeviceRpcCallMsg deviceRpcCallMsg = deviceRpcCallResponse.build(); - testAutoGeneratedCodeByProtobuf(deviceRpcCallMsg); - builder.addDeviceRpcCallMsg(deviceRpcCallMsg); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + RpcResponseMsg.newBuilder().setResponse("{}"); + testAutoGeneratedCodeByProtobuf(responseBuilder); + + deviceRpcCallResponseBuilder.setResponseMsg(responseBuilder.build()); + testAutoGeneratedCodeByProtobuf(deviceRpcCallResponseBuilder); + + uplinkMsgBuilder.addDeviceRpcCallMsg(deviceRpcCallResponseBuilder.build()); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); } @@ -1312,20 +1294,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { doPost("/api/plugins/telemetry/DEVICE/" + device.getId().getId().toString() + "/attributes/" + DataConstants.SERVER_SCOPE, attributesData); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - AttributesRequestMsg.Builder attributesRequestMsgBuilder = AttributesRequestMsg.newBuilder().clear(); + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + AttributesRequestMsg.Builder attributesRequestMsgBuilder = AttributesRequestMsg.newBuilder(); attributesRequestMsgBuilder.setEntityIdMSB(device.getUuidId().getMostSignificantBits()); attributesRequestMsgBuilder.setEntityIdLSB(device.getUuidId().getLeastSignificantBits()); attributesRequestMsgBuilder.setEntityType(EntityType.DEVICE.name()); - AttributesRequestMsg attributesRequestMsg = attributesRequestMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(attributesRequestMsg); - builder.addAttributesRequestMsg(attributesRequestMsg); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + testAutoGeneratedCodeByProtobuf(attributesRequestMsgBuilder); + uplinkMsgBuilder.addAttributesRequestMsg(attributesRequestMsgBuilder.build()); + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); edgeImitator.expectResponsesAmount(1); edgeImitator.expectMessageAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.waitForResponses(); edgeImitator.waitForMessages(); @@ -1351,19 +1331,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Optional foundDevice = edgeDevices.stream().filter(device1 -> device1.getName().equals("Edge Device 2")).findAny(); Assert.assertTrue(foundDevice.isPresent()); Device device = foundDevice.get(); - UplinkMsg.Builder builder = UplinkMsg.newBuilder().clear(); - DeviceUpdateMsg.Builder deviceDeleteMsgBuilder = DeviceUpdateMsg.newBuilder().clear(); + UplinkMsg.Builder upLinkMsgBuilder = UplinkMsg.newBuilder(); + DeviceUpdateMsg.Builder deviceDeleteMsgBuilder = DeviceUpdateMsg.newBuilder(); deviceDeleteMsgBuilder.setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE); deviceDeleteMsgBuilder.setIdMSB(device.getId().getId().getMostSignificantBits()); deviceDeleteMsgBuilder.setIdLSB(device.getId().getId().getLeastSignificantBits()); - DeviceUpdateMsg deviceUpdateMsg = deviceDeleteMsgBuilder.build(); - testAutoGeneratedCodeByProtobuf(deviceUpdateMsg); - builder.addDeviceUpdateMsg(deviceUpdateMsg); - UplinkMsg uplinkMsg = builder.build(); - testAutoGeneratedCodeByProtobuf(uplinkMsg); + testAutoGeneratedCodeByProtobuf(deviceDeleteMsgBuilder); + + upLinkMsgBuilder.addDeviceUpdateMsg(deviceDeleteMsgBuilder.build()); + testAutoGeneratedCodeByProtobuf(upLinkMsgBuilder); edgeImitator.expectResponsesAmount(1); - edgeImitator.sendUplinkMsg(uplinkMsg); + edgeImitator.sendUplinkMsg(upLinkMsgBuilder.build()); edgeImitator.waitForResponses(); device = doGet("/api/device/" + device.getId().getId().toString(), Device.class); Assert.assertNotNull(device); @@ -1396,9 +1375,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { return edgeEvent; } - private void testAutoGeneratedCodeByProtobuf(MessageLite source) throws InvalidProtocolBufferException { + private void testAutoGeneratedCodeByProtobuf(MessageLite.Builder builder) throws InvalidProtocolBufferException { + MessageLite source = builder.build(); MessageLite target = source.getParserForType().parseFrom(source.toByteArray()); Assert.assertEquals(source, target); Assert.assertEquals(source.hashCode(), target.hashCode()); + builder.clear().mergeFrom(target); } } From 23d4c5ee99b805cac125818970b59e1d8bd5ab73 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 26 Oct 2020 12:39:06 +0200 Subject: [PATCH 11/12] Merge fix --- .../org/thingsboard/server/edge/BaseEdgeTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index e153d3be9b..5095d32566 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -1195,7 +1195,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), edgeRootRuleChainId.getId().getMostSignificantBits()); Assert.assertEquals(ruleChainMetadataUpdateMsg.getRuleChainIdLSB(), edgeRootRuleChainId.getId().getLeastSignificantBits()); - testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsg); + testAutoGeneratedCodeByProtobuf(ruleChainMetadataUpdateMsg); } private void sendUserCredentialsRequest() throws Exception { @@ -1390,9 +1390,16 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void testAutoGeneratedCodeByProtobuf(MessageLite.Builder builder) throws InvalidProtocolBufferException { MessageLite source = builder.build(); + + testAutoGeneratedCodeByProtobuf(source); + + MessageLite target = source.getParserForType().parseFrom(source.toByteArray()); + builder.clear().mergeFrom(target); + } + + private void testAutoGeneratedCodeByProtobuf(MessageLite source) throws InvalidProtocolBufferException { MessageLite target = source.getParserForType().parseFrom(source.toByteArray()); Assert.assertEquals(source, target); Assert.assertEquals(source.hashCode(), target.hashCode()); - builder.clear().mergeFrom(target); } } From efaca8e7f232a43268400141db7189ae724c9284 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Wed, 28 Oct 2020 19:33:42 +0200 Subject: [PATCH 12/12] Code clean up --- ui/src/app/event/event-table.directive.js | 30 +++++++++++------------ 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/ui/src/app/event/event-table.directive.js b/ui/src/app/event/event-table.directive.js index 9c7c57d5d7..b706a80f67 100644 --- a/ui/src/app/event/event-table.directive.js +++ b/ui/src/app/event/event-table.directive.js @@ -221,39 +221,37 @@ export default function EventTableDirective($compile, $templateCache, $rootScope } scope.subscriptionId = null; - scope.queueStartTs; + scope.queueStartTs = 0; scope.loadEdgeInfo = function() { - attributeService.getEntityAttributesValues(scope.entityType, scope.entityId, types.attributesScope.server.value, - types.edgeAttributeKeys.queueStartTs, {}) + attributeService.getEntityAttributesValues( + scope.entityType, + scope.entityId, + types.attributesScope.server.value, + types.edgeAttributeKeys.queueStartTs, + {}) .then(function success(attributes) { - scope.onUpdate(attributes); + scope.onEdgeAttributesUpdate(attributes); }); scope.checkSubscription(); - - attributeService.getEntityAttributes(scope.entityType, scope.entityId, types.attributesScope.server.value, {order: '', limit: 1, page: 1, search: ''}, - function (attributes) { - if (attributes && attributes.data) { - scope.onUpdate(attributes.data); - } - }); } - scope.onUpdate = function(attributes) { - let edge = attributes.reduce(function (map, attribute) { + scope.onEdgeAttributesUpdate = function(attributes) { + let edgeAttributes = attributes.reduce(function (map, attribute) { map[attribute.key] = attribute; return map; }, {}); - if (edge.queueStartTs) { - scope.queueStartTs = edge.queueStartTs.lastUpdateTs; + if (edgeAttributes.queueStartTs) { + scope.queueStartTs = edgeAttributes.queueStartTs.lastUpdateTs; } } scope.checkSubscription = function() { var newSubscriptionId = null; if (scope.entityId && scope.entityType && types.attributesScope.server.value) { - newSubscriptionId = attributeService.subscribeForEntityAttributes(scope.entityType, scope.entityId, types.attributesScope.server.value); + newSubscriptionId = + attributeService.subscribeForEntityAttributes(scope.entityType, scope.entityId, types.attributesScope.server.value); } if (scope.subscriptionId && scope.subscriptionId != newSubscriptionId) { attributeService.unsubscribeForEntityAttributes(scope.subscriptionId);