Commit b4b6f7eb55721c761eb3e31a623c551dfa5f47e5

Authored by Volodymyr Babak
1 parent 86fb9f07

Decreased execution time of test

... ... @@ -166,7 +166,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
166 166 // sleep 1 seconds to avoid CREDENTIALS updated message for the user
167 167 // user credentials is going to be stored and updated event pushed to edge notification service
168 168 // while service will be processing this event edge could be already added and additional message will be pushed
169   - Thread.sleep(1000);
  169 + Thread.sleep(500);
170 170
171 171 installation();
172 172
... ... @@ -177,6 +177,22 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
177 177 testReceivedInitialData();
178 178 }
179 179
  180 + private void installation() throws Exception {
  181 + edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class);
  182 +
  183 + DeviceProfile deviceProfile = this.createDeviceProfile(CUSTOM_DEVICE_PROFILE_NAME, null);
  184 + extendDeviceProfileData(deviceProfile);
  185 + doPost("/api/deviceProfile", deviceProfile, DeviceProfile.class);
  186 +
  187 + Device savedDevice = saveDevice("Edge Device 1", CUSTOM_DEVICE_PROFILE_NAME);
  188 + doPost("/api/edge/" + edge.getId().getId().toString()
  189 + + "/device/" + savedDevice.getId().getId().toString(), Device.class);
  190 +
  191 + Asset savedAsset = saveAsset("Edge Asset 1");
  192 + doPost("/api/edge/" + edge.getId().getId().toString()
  193 + + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
  194 + }
  195 +
180 196 @After
181 197 public void afterTest() throws Exception {
182 198 try {
... ... @@ -190,7 +206,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
190 206 }
191 207
192 208 @Test
193   - public void generalTest() throws Exception {
  209 + public void test() throws Exception {
194 210 testDevices();
195 211
196 212 testAssets();
... ... @@ -216,179 +232,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
216 232 testSendMessagesToCloud();
217 233
218 234 testRpcCall();
219   - }
220   -
221   - @Test
222   - public void testTimeseriesWithFailures() throws Exception {
223   - log.info("Testing timeseries with failures");
224   -
225   - int numberOfTimeseriesToSend = 1000;
226   -
227   - edgeImitator.setRandomFailuresOnTimeseriesDownlink(true);
228   - // imitator will generate failure in 5% of cases
229   - edgeImitator.setFailureProbability(5.0);
230   -
231   - edgeImitator.expectMessageAmount(numberOfTimeseriesToSend);
232   - Device device = findDeviceByName("Edge Device 1");
233   - for (int idx = 1; idx <= numberOfTimeseriesToSend; idx++) {
234   - String timeseriesData = "{\"data\":{\"idx\":" + idx + "},\"ts\":" + System.currentTimeMillis() + "}";
235   - JsonNode timeseriesEntityData = mapper.readTree(timeseriesData);
236   - EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED,
237   - device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
238   - edgeEventService.saveAsync(edgeEvent);
239   - clusterService.onEdgeEventUpdate(tenantId, edge.getId());
240   - }
241 235
242   - Assert.assertTrue(edgeImitator.waitForMessages(60));
243   -
244   - List<EntityDataProto> allTelemetryMsgs = edgeImitator.findAllMessagesByType(EntityDataProto.class);
245   - Assert.assertEquals(numberOfTimeseriesToSend, allTelemetryMsgs.size());
246   -
247   - for (int idx = 1; idx <= numberOfTimeseriesToSend; idx++) {
248   - Assert.assertTrue(isIdxExistsInTheDownlinkList(idx, allTelemetryMsgs));
249   - }
250   -
251   - edgeImitator.setRandomFailuresOnTimeseriesDownlink(false);
252   - log.info("Timeseries with failures tested successfully");
253   - }
254   -
255   - private boolean isIdxExistsInTheDownlinkList(int idx, List<EntityDataProto> allTelemetryMsgs) {
256   - for (EntityDataProto proto : allTelemetryMsgs) {
257   - TransportProtos.PostTelemetryMsg postTelemetryMsg = proto.getPostTelemetryMsg();
258   - Assert.assertEquals(1, postTelemetryMsg.getTsKvListCount());
259   - TransportProtos.TsKvListProto tsKvListProto = postTelemetryMsg.getTsKvList(0);
260   - Assert.assertEquals(1, tsKvListProto.getKvCount());
261   - TransportProtos.KeyValueProto keyValueProto = tsKvListProto.getKv(0);
262   - Assert.assertEquals("idx", keyValueProto.getKey());
263   - if (keyValueProto.getLongV() == idx) {
264   - return true;
265   - }
266   - }
267   - return false;
268   - }
269   -
270   - private Device findDeviceByName(String deviceName) throws Exception {
271   - List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
272   - new TypeReference<PageData<Device>>() {
273   - }, new PageLink(100)).getData();
274   - Optional<Device> foundDevice = edgeDevices.stream().filter(d -> d.getName().equals(deviceName)).findAny();
275   - Assert.assertTrue(foundDevice.isPresent());
276   - Device device = foundDevice.get();
277   - Assert.assertEquals(deviceName, device.getName());
278   - return device;
279   - }
280   -
281   - private Asset findAssetByName(String assetName) throws Exception {
282   - List<Asset> edgeAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
283   - new TypeReference<PageData<Asset>>() {
284   - }, new PageLink(100)).getData();
285   -
286   - Assert.assertEquals(1, edgeAssets.size());
287   - Asset asset = edgeAssets.get(0);
288   - Assert.assertEquals(assetName, asset.getName());
289   - return asset;
290   - }
291   -
292   - private Device saveDevice(String deviceName, String type) throws Exception {
293   - Device device = new Device();
294   - device.setName(deviceName);
295   - device.setType(type);
296   - return doPost("/api/device", device, Device.class);
297   - }
298   -
299   - private Asset saveAsset(String assetName) throws Exception {
300   - Asset asset = new Asset();
301   - asset.setName(assetName);
302   - asset.setType("test");
303   - return doPost("/api/asset", asset, Asset.class);
304   - }
305   -
306   - private void testRpcCall() throws Exception {
307   - Device device = findDeviceByName("Edge Device 1");
308   -
309   - ObjectNode body = mapper.createObjectNode();
310   - body.put("requestId", new Random().nextInt());
311   - body.put("requestUUID", Uuids.timeBased().toString());
312   - body.put("oneway", false);
313   - body.put("expirationTime", System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10));
314   - body.put("method", "test_method");
315   - body.put("params", "{\"param1\":\"value1\"}");
316   -
317   - EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.RPC_CALL, device.getId().getId(), EdgeEventType.DEVICE, body);
318   - edgeImitator.expectMessageAmount(1);
319   - edgeEventService.saveAsync(edgeEvent);
320   - clusterService.onEdgeEventUpdate(tenantId, edge.getId());
321   - Assert.assertTrue(edgeImitator.waitForMessages());
322   -
323   - AbstractMessage latestMessage = edgeImitator.getLatestMessage();
324   - Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg);
325   - DeviceRpcCallMsg latestDeviceRpcCallMsg = (DeviceRpcCallMsg) latestMessage;
326   - Assert.assertEquals("test_method", latestDeviceRpcCallMsg.getRequestMsg().getMethod());
327   - }
328   -
329   - private void testReceivedInitialData() throws Exception {
330   - log.info("Checking received data");
331   - Assert.assertTrue(edgeImitator.waitForMessages());
332   -
333   - EdgeConfiguration configuration = edgeImitator.getConfiguration();
334   - Assert.assertNotNull(configuration);
335   -
336   - testAutoGeneratedCodeByProtobuf(configuration);
337   -
338   - Optional<DeviceUpdateMsg> deviceUpdateMsgOpt = edgeImitator.findMessageByType(DeviceUpdateMsg.class);
339   - Assert.assertTrue(deviceUpdateMsgOpt.isPresent());
340   - DeviceUpdateMsg deviceUpdateMsg = deviceUpdateMsgOpt.get();
341   - Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
342   - UUID deviceUUID = new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB());
343   - Device device = doGet("/api/device/" + deviceUUID.toString(), Device.class);
344   - Assert.assertNotNull(device);
345   - List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
346   - new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
347   - Assert.assertTrue(edgeDevices.contains(device));
348   -
349   - List<DeviceProfileUpdateMsg> deviceProfileUpdateMsgList = edgeImitator.findAllMessagesByType(DeviceProfileUpdateMsg.class);
350   - Assert.assertEquals(3, deviceProfileUpdateMsgList.size());
351   - Optional<DeviceProfileUpdateMsg> deviceProfileUpdateMsgOpt =
352   - deviceProfileUpdateMsgList.stream().filter(dfum -> CUSTOM_DEVICE_PROFILE_NAME.equals(dfum.getName())).findAny();
353   - Assert.assertTrue(deviceProfileUpdateMsgOpt.isPresent());
354   - DeviceProfileUpdateMsg deviceProfileUpdateMsg = deviceProfileUpdateMsgOpt.get();
355   - Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType());
356   - UUID deviceProfileUUID = new UUID(deviceProfileUpdateMsg.getIdMSB(), deviceProfileUpdateMsg.getIdLSB());
357   - DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + deviceProfileUUID.toString(), DeviceProfile.class);
358   - Assert.assertNotNull(deviceProfile);
359   - Assert.assertNotNull(deviceProfile.getProfileData());
360   - Assert.assertNotNull(deviceProfile.getProfileData().getAlarms());
361   - Assert.assertNotNull(deviceProfile.getProfileData().getAlarms().get(0).getClearRule());
362   -
363   - testAutoGeneratedCodeByProtobuf(deviceProfileUpdateMsg);
364   -
365   - Optional<AssetUpdateMsg> assetUpdateMsgOpt = edgeImitator.findMessageByType(AssetUpdateMsg.class);
366   - Assert.assertTrue(assetUpdateMsgOpt.isPresent());
367   - AssetUpdateMsg assetUpdateMsg = assetUpdateMsgOpt.get();
368   - Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
369   - UUID assetUUID = new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB());
370   - Asset asset = doGet("/api/asset/" + assetUUID.toString(), Asset.class);
371   - Assert.assertNotNull(asset);
372   - List<Asset> edgeAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
373   - new TypeReference<PageData<Asset>>() {}, new PageLink(100)).getData();
374   - Assert.assertTrue(edgeAssets.contains(asset));
375   -
376   - testAutoGeneratedCodeByProtobuf(assetUpdateMsg);
377   -
378   - Optional<RuleChainUpdateMsg> ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);
379   - Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent());
380   - RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get();
381   - Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
382   - UUID ruleChainUUID = new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB());
383   - RuleChain ruleChain = doGet("/api/ruleChain/" + ruleChainUUID.toString(), RuleChain.class);
384   - Assert.assertNotNull(ruleChain);
385   - List<RuleChain> edgeRuleChains = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/ruleChains?",
386   - new TypeReference<PageData<RuleChain>>() {}, new PageLink(100)).getData();
387   - Assert.assertTrue(edgeRuleChains.contains(ruleChain));
388   -
389   - testAutoGeneratedCodeByProtobuf(ruleChainUpdateMsg);
390   -
391   - log.info("Received data checked");
  236 + testTimeseriesWithFailures();
392 237 }
393 238
394 239 private void testDevices() throws Exception {
... ... @@ -529,23 +374,20 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
529 374 log.info("Testing RuleChains");
530 375
531 376 // 1
532   - edgeImitator.expectMessageAmount(1);
  377 + edgeImitator.expectMessageAmount(2);
533 378 RuleChain ruleChain = new RuleChain();
534 379 ruleChain.setName("Edge Test Rule Chain");
535 380 ruleChain.setType(RuleChainType.EDGE);
536 381 RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class);
537   - createRuleChainMetadata(savedRuleChain);
538   - // sleep 1 seconds to avoid ENTITY_UPDATED_RPC_MESSAGE for the rule chain
539   - // rule chain metadata is going to be stored and updated event pushed to edge notification service
540   - // while service will be processing this event assignment rule chain to edge will be completed if bad timing
541   - Thread.sleep(1000);
542 382 doPost("/api/edge/" + edge.getId().getId().toString()
543 383 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
  384 + createRuleChainMetadata(savedRuleChain);
544 385 Assert.assertTrue(edgeImitator.waitForMessages());
545   - AbstractMessage latestMessage = edgeImitator.getLatestMessage();
546   - Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);
547   - RuleChainUpdateMsg ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;
548   - Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
  386 + Optional<RuleChainUpdateMsg> ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);
  387 + Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent());
  388 + RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get();
  389 + Assert.assertTrue(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(ruleChainUpdateMsg.getMsgType()) ||
  390 + UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE.equals(ruleChainUpdateMsg.getMsgType()));
549 391 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
550 392 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
551 393 Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName());
... ... @@ -558,9 +400,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
558 400 doDelete("/api/edge/" + edge.getId().getId().toString()
559 401 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
560 402 Assert.assertTrue(edgeImitator.waitForMessages());
561   - latestMessage = edgeImitator.getLatestMessage();
562   - Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);
563   - ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;
  403 + ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);
  404 + Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent());
  405 + ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get();
564 406 Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
565 407 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
566 408 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
... ... @@ -574,67 +416,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
574 416 log.info("RuleChains tested successfully");
575 417 }
576 418
577   - private void testRuleChainMetadataRequestMsg(RuleChainId ruleChainId) throws Exception {
578   - RuleChainMetadataRequestMsg.Builder ruleChainMetadataRequestMsgBuilder = RuleChainMetadataRequestMsg.newBuilder()
579   - .setRuleChainIdMSB(ruleChainId.getId().getMostSignificantBits())
580   - .setRuleChainIdLSB(ruleChainId.getId().getLeastSignificantBits());
581   - testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsgBuilder);
582   -
583   - UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder()
584   - .addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsgBuilder.build());
585   - testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder);
586   -
587   - edgeImitator.expectResponsesAmount(1);
588   - edgeImitator.expectMessageAmount(1);
589   - edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
590   - Assert.assertTrue(edgeImitator.waitForResponses());
591   - Assert.assertTrue(edgeImitator.waitForMessages());
592   -
593   - AbstractMessage latestMessage = edgeImitator.getLatestMessage();
594   - Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
595   - RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = (RuleChainMetadataUpdateMsg) latestMessage;
596   - RuleChainId receivedRuleChainId =
597   - new RuleChainId(new UUID(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), ruleChainMetadataUpdateMsg.getRuleChainIdLSB()));
598   - Assert.assertEquals(ruleChainId, receivedRuleChainId);
599   - }
600   -
601   - private void createRuleChainMetadata(RuleChain ruleChain) throws Exception {
602   - RuleChainMetaData ruleChainMetaData = new RuleChainMetaData();
603   - ruleChainMetaData.setRuleChainId(ruleChain.getId());
604   -
605   - ObjectMapper mapper = new ObjectMapper();
606   -
607   - RuleNode ruleNode1 = new RuleNode();
608   - ruleNode1.setName("name1");
609   - ruleNode1.setType("type1");
610   - ruleNode1.setConfiguration(mapper.readTree("\"key1\": \"val1\""));
611   -
612   - RuleNode ruleNode2 = new RuleNode();
613   - ruleNode2.setName("name2");
614   - ruleNode2.setType("type2");
615   - ruleNode2.setConfiguration(mapper.readTree("\"key2\": \"val2\""));
616   -
617   - RuleNode ruleNode3 = new RuleNode();
618   - ruleNode3.setName("name3");
619   - ruleNode3.setType("type3");
620   - ruleNode3.setConfiguration(mapper.readTree("\"key3\": \"val3\""));
621   -
622   - List<RuleNode> ruleNodes = new ArrayList<>();
623   - ruleNodes.add(ruleNode1);
624   - ruleNodes.add(ruleNode2);
625   - ruleNodes.add(ruleNode3);
626   - ruleChainMetaData.setFirstNodeIndex(0);
627   - ruleChainMetaData.setNodes(ruleNodes);
628   -
629   - ruleChainMetaData.addConnectionInfo(0, 1, "success");
630   - ruleChainMetaData.addConnectionInfo(0, 2, "fail");
631   - ruleChainMetaData.addConnectionInfo(1, 2, "success");
632   -
633   - ruleChainMetaData.addRuleChainConnectionInfo(2, edge.getRootRuleChainId(), "success", mapper.createObjectNode());
634   -
635   - doPost("/api/ruleChain/metadata", ruleChainMetaData, RuleChainMetaData.class);
636   - }
637   -
638 419 private void testDashboards() throws Exception {
639 420 log.info("Testing Dashboards");
640 421
... ... @@ -1037,12 +818,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1037 818 log.info("Attributes tested successfully");
1038 819 }
1039 820
1040   - private void testAttributesDeleteMsg(Device device) throws JsonProcessingException, InterruptedException {
1041   - String deleteAttributesData = "{\"scope\":\"SERVER_SCOPE\",\"keys\":[\"key1\",\"key2\"]}";
1042   - JsonNode deleteAttributesEntityData = mapper.readTree(deleteAttributesData);
1043   - EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_DELETED, device.getId().getId(), EdgeEventType.DEVICE, deleteAttributesEntityData);
  821 + private void testAttributesUpdatedMsg(Device device) throws JsonProcessingException, InterruptedException {
  822 + String attributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key1\":\"value1\"}}";
  823 + JsonNode attributesEntityData = mapper.readTree(attributesData);
  824 + EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, attributesEntityData);
1044 825 edgeImitator.expectMessageAmount(1);
1045   - edgeEventService.saveAsync(edgeEvent);
  826 + edgeEventService.saveAsync(edgeEvent1);
1046 827 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
1047 828 Assert.assertTrue(edgeImitator.waitForMessages());
1048 829
... ... @@ -1052,15 +833,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1052 833 Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB());
1053 834 Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB());
1054 835 Assert.assertEquals(device.getId().getEntityType().name(), latestEntityDataMsg.getEntityType());
  836 + Assert.assertEquals("SERVER_SCOPE", latestEntityDataMsg.getPostAttributeScope());
  837 + Assert.assertTrue(latestEntityDataMsg.hasAttributesUpdatedMsg());
1055 838
1056   - Assert.assertTrue(latestEntityDataMsg.hasAttributeDeleteMsg());
1057   -
1058   - AttributeDeleteMsg attributeDeleteMsg = latestEntityDataMsg.getAttributeDeleteMsg();
1059   - Assert.assertEquals(attributeDeleteMsg.getScope(), deleteAttributesEntityData.get("scope").asText());
1060   -
1061   - Assert.assertEquals(2, attributeDeleteMsg.getAttributeNamesCount());
1062   - Assert.assertEquals("key1", attributeDeleteMsg.getAttributeNames(0));
1063   - Assert.assertEquals("key2", attributeDeleteMsg.getAttributeNames(1));
  839 + TransportProtos.PostAttributeMsg attributesUpdatedMsg = latestEntityDataMsg.getAttributesUpdatedMsg();
  840 + Assert.assertEquals(1, attributesUpdatedMsg.getKvCount());
  841 + TransportProtos.KeyValueProto keyValueProto = attributesUpdatedMsg.getKv(0);
  842 + Assert.assertEquals("key1", keyValueProto.getKey());
  843 + Assert.assertEquals("value1", keyValueProto.getStringV());
1064 844 }
1065 845
1066 846 private void testPostAttributesMsg(Device device) throws JsonProcessingException, InterruptedException {
... ... @@ -1088,29 +868,192 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1088 868 Assert.assertEquals("value2", keyValueProto.getStringV());
1089 869 }
1090 870
1091   - private void testAttributesUpdatedMsg(Device device) throws JsonProcessingException, InterruptedException {
1092   - String attributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key1\":\"value1\"}}";
1093   - JsonNode attributesEntityData = mapper.readTree(attributesData);
1094   - EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, attributesEntityData);
  871 + private void testAttributesDeleteMsg(Device device) throws JsonProcessingException, InterruptedException {
  872 + String deleteAttributesData = "{\"scope\":\"SERVER_SCOPE\",\"keys\":[\"key1\",\"key2\"]}";
  873 + JsonNode deleteAttributesEntityData = mapper.readTree(deleteAttributesData);
  874 + EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_DELETED, device.getId().getId(), EdgeEventType.DEVICE, deleteAttributesEntityData);
1095 875 edgeImitator.expectMessageAmount(1);
1096   - edgeEventService.saveAsync(edgeEvent1);
  876 + edgeEventService.saveAsync(edgeEvent);
1097 877 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
1098 878 Assert.assertTrue(edgeImitator.waitForMessages());
1099 879
1100   - AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1101   - Assert.assertTrue(latestMessage instanceof EntityDataProto);
1102   - EntityDataProto latestEntityDataMsg = (EntityDataProto) latestMessage;
1103   - Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB());
1104   - Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB());
1105   - Assert.assertEquals(device.getId().getEntityType().name(), latestEntityDataMsg.getEntityType());
1106   - Assert.assertEquals("SERVER_SCOPE", latestEntityDataMsg.getPostAttributeScope());
1107   - Assert.assertTrue(latestEntityDataMsg.hasAttributesUpdatedMsg());
  880 + AbstractMessage latestMessage = edgeImitator.getLatestMessage();
  881 + Assert.assertTrue(latestMessage instanceof EntityDataProto);
  882 + EntityDataProto latestEntityDataMsg = (EntityDataProto) latestMessage;
  883 + Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB());
  884 + Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB());
  885 + Assert.assertEquals(device.getId().getEntityType().name(), latestEntityDataMsg.getEntityType());
  886 +
  887 + Assert.assertTrue(latestEntityDataMsg.hasAttributeDeleteMsg());
  888 +
  889 + AttributeDeleteMsg attributeDeleteMsg = latestEntityDataMsg.getAttributeDeleteMsg();
  890 + Assert.assertEquals(attributeDeleteMsg.getScope(), deleteAttributesEntityData.get("scope").asText());
  891 +
  892 + Assert.assertEquals(2, attributeDeleteMsg.getAttributeNamesCount());
  893 + Assert.assertEquals("key1", attributeDeleteMsg.getAttributeNames(0));
  894 + Assert.assertEquals("key2", attributeDeleteMsg.getAttributeNames(1));
  895 + }
  896 +
  897 + private Device findDeviceByName(String deviceName) throws Exception {
  898 + List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  899 + new TypeReference<PageData<Device>>() {
  900 + }, new PageLink(100)).getData();
  901 + Optional<Device> foundDevice = edgeDevices.stream().filter(d -> d.getName().equals(deviceName)).findAny();
  902 + Assert.assertTrue(foundDevice.isPresent());
  903 + Device device = foundDevice.get();
  904 + Assert.assertEquals(deviceName, device.getName());
  905 + return device;
  906 + }
  907 +
  908 + private Asset findAssetByName(String assetName) throws Exception {
  909 + List<Asset> edgeAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
  910 + new TypeReference<PageData<Asset>>() {
  911 + }, new PageLink(100)).getData();
  912 +
  913 + Assert.assertEquals(1, edgeAssets.size());
  914 + Asset asset = edgeAssets.get(0);
  915 + Assert.assertEquals(assetName, asset.getName());
  916 + return asset;
  917 + }
  918 +
  919 + private Device saveDevice(String deviceName, String type) throws Exception {
  920 + Device device = new Device();
  921 + device.setName(deviceName);
  922 + device.setType(type);
  923 + return doPost("/api/device", device, Device.class);
  924 + }
  925 +
  926 + private Asset saveAsset(String assetName) throws Exception {
  927 + Asset asset = new Asset();
  928 + asset.setName(assetName);
  929 + asset.setType("test");
  930 + return doPost("/api/asset", asset, Asset.class);
  931 + }
  932 +
  933 + private void testReceivedInitialData() throws Exception {
  934 + log.info("Checking received data");
  935 + Assert.assertTrue(edgeImitator.waitForMessages());
  936 +
  937 + EdgeConfiguration configuration = edgeImitator.getConfiguration();
  938 + Assert.assertNotNull(configuration);
  939 +
  940 + testAutoGeneratedCodeByProtobuf(configuration);
  941 +
  942 + Optional<DeviceUpdateMsg> deviceUpdateMsgOpt = edgeImitator.findMessageByType(DeviceUpdateMsg.class);
  943 + Assert.assertTrue(deviceUpdateMsgOpt.isPresent());
  944 + DeviceUpdateMsg deviceUpdateMsg = deviceUpdateMsgOpt.get();
  945 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
  946 + UUID deviceUUID = new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB());
  947 + Device device = doGet("/api/device/" + deviceUUID.toString(), Device.class);
  948 + Assert.assertNotNull(device);
  949 + List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  950 + new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
  951 + Assert.assertTrue(edgeDevices.contains(device));
  952 +
  953 + List<DeviceProfileUpdateMsg> deviceProfileUpdateMsgList = edgeImitator.findAllMessagesByType(DeviceProfileUpdateMsg.class);
  954 + Assert.assertEquals(3, deviceProfileUpdateMsgList.size());
  955 + Optional<DeviceProfileUpdateMsg> deviceProfileUpdateMsgOpt =
  956 + deviceProfileUpdateMsgList.stream().filter(dfum -> CUSTOM_DEVICE_PROFILE_NAME.equals(dfum.getName())).findAny();
  957 + Assert.assertTrue(deviceProfileUpdateMsgOpt.isPresent());
  958 + DeviceProfileUpdateMsg deviceProfileUpdateMsg = deviceProfileUpdateMsgOpt.get();
  959 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType());
  960 + UUID deviceProfileUUID = new UUID(deviceProfileUpdateMsg.getIdMSB(), deviceProfileUpdateMsg.getIdLSB());
  961 + DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + deviceProfileUUID.toString(), DeviceProfile.class);
  962 + Assert.assertNotNull(deviceProfile);
  963 + Assert.assertNotNull(deviceProfile.getProfileData());
  964 + Assert.assertNotNull(deviceProfile.getProfileData().getAlarms());
  965 + Assert.assertNotNull(deviceProfile.getProfileData().getAlarms().get(0).getClearRule());
  966 +
  967 + testAutoGeneratedCodeByProtobuf(deviceProfileUpdateMsg);
  968 +
  969 + Optional<AssetUpdateMsg> assetUpdateMsgOpt = edgeImitator.findMessageByType(AssetUpdateMsg.class);
  970 + Assert.assertTrue(assetUpdateMsgOpt.isPresent());
  971 + AssetUpdateMsg assetUpdateMsg = assetUpdateMsgOpt.get();
  972 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
  973 + UUID assetUUID = new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB());
  974 + Asset asset = doGet("/api/asset/" + assetUUID.toString(), Asset.class);
  975 + Assert.assertNotNull(asset);
  976 + List<Asset> edgeAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
  977 + new TypeReference<PageData<Asset>>() {}, new PageLink(100)).getData();
  978 + Assert.assertTrue(edgeAssets.contains(asset));
  979 +
  980 + testAutoGeneratedCodeByProtobuf(assetUpdateMsg);
  981 +
  982 + Optional<RuleChainUpdateMsg> ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);
  983 + Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent());
  984 + RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get();
  985 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
  986 + UUID ruleChainUUID = new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB());
  987 + RuleChain ruleChain = doGet("/api/ruleChain/" + ruleChainUUID.toString(), RuleChain.class);
  988 + Assert.assertNotNull(ruleChain);
  989 + List<RuleChain> edgeRuleChains = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/ruleChains?",
  990 + new TypeReference<PageData<RuleChain>>() {}, new PageLink(100)).getData();
  991 + Assert.assertTrue(edgeRuleChains.contains(ruleChain));
  992 +
  993 + testAutoGeneratedCodeByProtobuf(ruleChainUpdateMsg);
  994 +
  995 + log.info("Received data checked");
  996 + }
  997 +
  998 + private void testRuleChainMetadataRequestMsg(RuleChainId ruleChainId) throws Exception {
  999 + RuleChainMetadataRequestMsg.Builder ruleChainMetadataRequestMsgBuilder = RuleChainMetadataRequestMsg.newBuilder()
  1000 + .setRuleChainIdMSB(ruleChainId.getId().getMostSignificantBits())
  1001 + .setRuleChainIdLSB(ruleChainId.getId().getLeastSignificantBits());
  1002 + testAutoGeneratedCodeByProtobuf(ruleChainMetadataRequestMsgBuilder);
  1003 +
  1004 + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder()
  1005 + .addRuleChainMetadataRequestMsg(ruleChainMetadataRequestMsgBuilder.build());
  1006 + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder);
  1007 +
  1008 + edgeImitator.expectResponsesAmount(1);
  1009 + edgeImitator.expectMessageAmount(1);
  1010 + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
  1011 + Assert.assertTrue(edgeImitator.waitForResponses());
  1012 + Assert.assertTrue(edgeImitator.waitForMessages());
  1013 +
  1014 + AbstractMessage latestMessage = edgeImitator.getLatestMessage();
  1015 + Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
  1016 + RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = (RuleChainMetadataUpdateMsg) latestMessage;
  1017 + RuleChainId receivedRuleChainId =
  1018 + new RuleChainId(new UUID(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), ruleChainMetadataUpdateMsg.getRuleChainIdLSB()));
  1019 + Assert.assertEquals(ruleChainId, receivedRuleChainId);
  1020 + }
  1021 +
  1022 + private void createRuleChainMetadata(RuleChain ruleChain) throws Exception {
  1023 + RuleChainMetaData ruleChainMetaData = new RuleChainMetaData();
  1024 + ruleChainMetaData.setRuleChainId(ruleChain.getId());
  1025 +
  1026 + ObjectMapper mapper = new ObjectMapper();
  1027 +
  1028 + RuleNode ruleNode1 = new RuleNode();
  1029 + ruleNode1.setName("name1");
  1030 + ruleNode1.setType("type1");
  1031 + ruleNode1.setConfiguration(mapper.readTree("\"key1\": \"val1\""));
  1032 +
  1033 + RuleNode ruleNode2 = new RuleNode();
  1034 + ruleNode2.setName("name2");
  1035 + ruleNode2.setType("type2");
  1036 + ruleNode2.setConfiguration(mapper.readTree("\"key2\": \"val2\""));
  1037 +
  1038 + RuleNode ruleNode3 = new RuleNode();
  1039 + ruleNode3.setName("name3");
  1040 + ruleNode3.setType("type3");
  1041 + ruleNode3.setConfiguration(mapper.readTree("\"key3\": \"val3\""));
  1042 +
  1043 + List<RuleNode> ruleNodes = new ArrayList<>();
  1044 + ruleNodes.add(ruleNode1);
  1045 + ruleNodes.add(ruleNode2);
  1046 + ruleNodes.add(ruleNode3);
  1047 + ruleChainMetaData.setFirstNodeIndex(0);
  1048 + ruleChainMetaData.setNodes(ruleNodes);
  1049 +
  1050 + ruleChainMetaData.addConnectionInfo(0, 1, "success");
  1051 + ruleChainMetaData.addConnectionInfo(0, 2, "fail");
  1052 + ruleChainMetaData.addConnectionInfo(1, 2, "success");
1108 1053
1109   - TransportProtos.PostAttributeMsg attributesUpdatedMsg = latestEntityDataMsg.getAttributesUpdatedMsg();
1110   - Assert.assertEquals(1, attributesUpdatedMsg.getKvCount());
1111   - TransportProtos.KeyValueProto keyValueProto = attributesUpdatedMsg.getKv(0);
1112   - Assert.assertEquals("key1", keyValueProto.getKey());
1113   - Assert.assertEquals("value1", keyValueProto.getStringV());
  1054 + ruleChainMetaData.addRuleChainConnectionInfo(2, edge.getRootRuleChainId(), "success", mapper.createObjectNode());
  1055 +
  1056 + doPost("/api/ruleChain/metadata", ruleChainMetaData, RuleChainMetaData.class);
1114 1057 }
1115 1058
1116 1059 private void testSendMessagesToCloud() throws Exception {
... ... @@ -1284,46 +1227,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1284 1227 Assert.assertEquals(AlarmSeverity.CRITICAL, alarmInfo.getSeverity());
1285 1228 }
1286 1229
1287   - private void sendRelation() throws Exception {
1288   - List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
1289   - new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
1290   - Optional<Device> foundDevice1 = edgeDevices.stream().filter(device1 -> device1.getName().equals("Edge Device 1")).findAny();
1291   - Assert.assertTrue(foundDevice1.isPresent());
1292   - Device device1 = foundDevice1.get();
1293   - Optional<Device> foundDevice2 = edgeDevices.stream().filter(device2 -> device2.getName().equals("Edge Device 2")).findAny();
1294   - Assert.assertTrue(foundDevice2.isPresent());
1295   - Device device2 = foundDevice2.get();
1296   -
1297   - UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
1298   - RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder();
1299   - relationUpdateMsgBuilder.setType("test");
1300   - relationUpdateMsgBuilder.setTypeGroup(RelationTypeGroup.COMMON.name());
1301   - relationUpdateMsgBuilder.setToIdMSB(device1.getId().getId().getMostSignificantBits());
1302   - relationUpdateMsgBuilder.setToIdLSB(device1.getId().getId().getLeastSignificantBits());
1303   - relationUpdateMsgBuilder.setToEntityType(device1.getId().getEntityType().name());
1304   - relationUpdateMsgBuilder.setFromIdMSB(device2.getId().getId().getMostSignificantBits());
1305   - relationUpdateMsgBuilder.setFromIdLSB(device2.getId().getId().getLeastSignificantBits());
1306   - relationUpdateMsgBuilder.setFromEntityType(device2.getId().getEntityType().name());
1307   - relationUpdateMsgBuilder.setAdditionalInfo("{}");
1308   - testAutoGeneratedCodeByProtobuf(relationUpdateMsgBuilder);
1309   - uplinkMsgBuilder.addRelationUpdateMsg(relationUpdateMsgBuilder.build());
1310   -
1311   - testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder);
1312   -
1313   - edgeImitator.expectResponsesAmount(1);
1314   - edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1315   - Assert.assertTrue(edgeImitator.waitForResponses());
1316   -
1317   - EntityRelation relation = doGet("/api/relation?" +
1318   - "&fromId=" + device2.getId().getId().toString() +
1319   - "&fromType=" + device2.getId().getEntityType().name() +
1320   - "&relationType=" + "test" +
1321   - "&relationTypeGroup=" + RelationTypeGroup.COMMON.name() +
1322   - "&toId=" + device1.getId().getId().toString() +
1323   - "&toType=" + device1.getId().getEntityType().name(), EntityRelation.class);
1324   - Assert.assertNotNull(relation);
1325   - }
1326   -
1327 1230 private void sendTelemetry() throws Exception {
1328 1231 List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
1329 1232 new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
... ... @@ -1368,9 +1271,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1368 1271 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build());
1369 1272 Assert.assertTrue(edgeImitator.waitForResponses());
1370 1273
1371   - // Wait before device attributes saved to database before requesting them from controller
1372   - Thread.sleep(1000);
1373   - Map<String, List<Map<String, String>>> timeseries = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/values/timeseries?keys=" + timeseriesKey, new TypeReference<>() {});
  1274 + int attempt = 0;
  1275 + Map<String, List<Map<String, String>>> timeseries;
  1276 + do {
  1277 + timeseries = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/values/timeseries?keys=" + timeseriesKey,
  1278 + new TypeReference<>() {});
  1279 + // Wait before device attributes saved to database before requesting them from controller
  1280 + Thread.sleep(100);
  1281 + attempt++;
  1282 + } while (!timeseries.containsKey(timeseriesKey) || attempt < 10);
1374 1283 Assert.assertTrue(timeseries.containsKey(timeseriesKey));
1375 1284 Assert.assertEquals(1, timeseries.get(timeseriesKey).size());
1376 1285 Assert.assertEquals(timeseriesValue, timeseries.get(timeseriesKey).get(0).get("value"));
... ... @@ -1382,6 +1291,69 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1382 1291
1383 1292 }
1384 1293
  1294 + private void sendRelation() throws Exception {
  1295 + List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  1296 + new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
  1297 + Optional<Device> foundDevice1 = edgeDevices.stream().filter(device1 -> device1.getName().equals("Edge Device 1")).findAny();
  1298 + Assert.assertTrue(foundDevice1.isPresent());
  1299 + Device device1 = foundDevice1.get();
  1300 + Optional<Device> foundDevice2 = edgeDevices.stream().filter(device2 -> device2.getName().equals("Edge Device 2")).findAny();
  1301 + Assert.assertTrue(foundDevice2.isPresent());
  1302 + Device device2 = foundDevice2.get();
  1303 +
  1304 + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
  1305 + RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder();
  1306 + relationUpdateMsgBuilder.setType("test");
  1307 + relationUpdateMsgBuilder.setTypeGroup(RelationTypeGroup.COMMON.name());
  1308 + relationUpdateMsgBuilder.setToIdMSB(device1.getId().getId().getMostSignificantBits());
  1309 + relationUpdateMsgBuilder.setToIdLSB(device1.getId().getId().getLeastSignificantBits());
  1310 + relationUpdateMsgBuilder.setToEntityType(device1.getId().getEntityType().name());
  1311 + relationUpdateMsgBuilder.setFromIdMSB(device2.getId().getId().getMostSignificantBits());
  1312 + relationUpdateMsgBuilder.setFromIdLSB(device2.getId().getId().getLeastSignificantBits());
  1313 + relationUpdateMsgBuilder.setFromEntityType(device2.getId().getEntityType().name());
  1314 + relationUpdateMsgBuilder.setAdditionalInfo("{}");
  1315 + testAutoGeneratedCodeByProtobuf(relationUpdateMsgBuilder);
  1316 + uplinkMsgBuilder.addRelationUpdateMsg(relationUpdateMsgBuilder.build());
  1317 +
  1318 + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder);
  1319 +
  1320 + edgeImitator.expectResponsesAmount(1);
  1321 + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
  1322 + Assert.assertTrue(edgeImitator.waitForResponses());
  1323 +
  1324 + EntityRelation relation = doGet("/api/relation?" +
  1325 + "&fromId=" + device2.getId().getId().toString() +
  1326 + "&fromType=" + device2.getId().getEntityType().name() +
  1327 + "&relationType=" + "test" +
  1328 + "&relationTypeGroup=" + RelationTypeGroup.COMMON.name() +
  1329 + "&toId=" + device1.getId().getId().toString() +
  1330 + "&toType=" + device1.getId().getEntityType().name(), EntityRelation.class);
  1331 + Assert.assertNotNull(relation);
  1332 + }
  1333 +
  1334 + private void sendDeleteDeviceOnEdge() throws Exception {
  1335 + Device device = findDeviceByName("Edge Device 2");
  1336 + UplinkMsg.Builder upLinkMsgBuilder = UplinkMsg.newBuilder();
  1337 + DeviceUpdateMsg.Builder deviceDeleteMsgBuilder = DeviceUpdateMsg.newBuilder();
  1338 + deviceDeleteMsgBuilder.setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE);
  1339 + deviceDeleteMsgBuilder.setIdMSB(device.getId().getId().getMostSignificantBits());
  1340 + deviceDeleteMsgBuilder.setIdLSB(device.getId().getId().getLeastSignificantBits());
  1341 + testAutoGeneratedCodeByProtobuf(deviceDeleteMsgBuilder);
  1342 +
  1343 + upLinkMsgBuilder.addDeviceUpdateMsg(deviceDeleteMsgBuilder.build());
  1344 + testAutoGeneratedCodeByProtobuf(upLinkMsgBuilder);
  1345 +
  1346 + edgeImitator.expectResponsesAmount(1);
  1347 + edgeImitator.sendUplinkMsg(upLinkMsgBuilder.build());
  1348 + Assert.assertTrue(edgeImitator.waitForResponses());
  1349 + device = doGet("/api/device/" + device.getId().getId().toString(), Device.class);
  1350 + Assert.assertNotNull(device);
  1351 + List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  1352 + new TypeReference<PageData<Device>>() {
  1353 + }, new PageLink(100)).getData();
  1354 + Assert.assertFalse(edgeDevices.contains(device));
  1355 + }
  1356 +
1385 1357 private void sendRuleChainMetadataRequest() throws Exception {
1386 1358 RuleChainId edgeRootRuleChainId = edge.getRootRuleChainId();
1387 1359
... ... @@ -1463,25 +1435,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1463 1435 Assert.assertEquals(deviceCredentialsUpdateMsg.getCredentialsId(), deviceCredentials.getCredentialsId());
1464 1436 }
1465 1437
1466   - private void sendDeviceCredentialsUpdate() throws Exception {
1467   - Device device = findDeviceByName("Edge Device 1");
1468   -
1469   - UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
1470   - DeviceCredentialsUpdateMsg.Builder deviceCredentialsUpdateMsgBuilder = DeviceCredentialsUpdateMsg.newBuilder();
1471   - deviceCredentialsUpdateMsgBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits());
1472   - deviceCredentialsUpdateMsgBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits());
1473   - deviceCredentialsUpdateMsgBuilder.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN.name());
1474   - deviceCredentialsUpdateMsgBuilder.setCredentialsId("NEW_TOKEN");
1475   - testAutoGeneratedCodeByProtobuf(deviceCredentialsUpdateMsgBuilder);
1476   - uplinkMsgBuilder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsgBuilder.build());
1477   -
1478   - testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder);
1479   -
1480   - edgeImitator.expectResponsesAmount(1);
1481   - edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1482   - Assert.assertTrue(edgeImitator.waitForResponses());
1483   - }
1484   -
1485 1438 private void sendDeviceRpcResponse() throws Exception {
1486 1439 Device device = findDeviceByName("Edge Device 1");
1487 1440
... ... @@ -1507,6 +1460,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1507 1460 Assert.assertTrue(edgeImitator.waitForResponses());
1508 1461 }
1509 1462
  1463 + private void sendDeviceCredentialsUpdate() throws Exception {
  1464 + Device device = findDeviceByName("Edge Device 1");
  1465 +
  1466 + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
  1467 + DeviceCredentialsUpdateMsg.Builder deviceCredentialsUpdateMsgBuilder = DeviceCredentialsUpdateMsg.newBuilder();
  1468 + deviceCredentialsUpdateMsgBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits());
  1469 + deviceCredentialsUpdateMsgBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits());
  1470 + deviceCredentialsUpdateMsgBuilder.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN.name());
  1471 + deviceCredentialsUpdateMsgBuilder.setCredentialsId("NEW_TOKEN");
  1472 + testAutoGeneratedCodeByProtobuf(deviceCredentialsUpdateMsgBuilder);
  1473 + uplinkMsgBuilder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsgBuilder.build());
  1474 +
  1475 + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder);
  1476 +
  1477 + edgeImitator.expectResponsesAmount(1);
  1478 + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
  1479 + Assert.assertTrue(edgeImitator.waitForResponses());
  1480 + }
  1481 +
1510 1482 private void sendAttributesRequest() throws Exception {
1511 1483 Device device = findDeviceByName("Edge Device 1");
1512 1484 sendAttributesRequest(device, DataConstants.SERVER_SCOPE, "{\"key1\":\"value1\"}", "key1", "value1");
... ... @@ -1520,7 +1492,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1520 1492 attributesData);
1521 1493
1522 1494 // Wait before device attributes saved to database before requesting them from edge
1523   - Thread.sleep(1000);
  1495 + // queue used to save attributes to database
  1496 + Thread.sleep(500);
1524 1497
1525 1498 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
1526 1499 AttributesRequestMsg.Builder attributesRequestMsgBuilder = AttributesRequestMsg.newBuilder();
... ... @@ -1554,43 +1527,75 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1554 1527 Assert.assertEquals(expectedValue, keyValueProto.getStringV());
1555 1528 }
1556 1529
1557   - private void sendDeleteDeviceOnEdge() throws Exception {
1558   - Device device = findDeviceByName("Edge Device 2");
1559   - UplinkMsg.Builder upLinkMsgBuilder = UplinkMsg.newBuilder();
1560   - DeviceUpdateMsg.Builder deviceDeleteMsgBuilder = DeviceUpdateMsg.newBuilder();
1561   - deviceDeleteMsgBuilder.setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE);
1562   - deviceDeleteMsgBuilder.setIdMSB(device.getId().getId().getMostSignificantBits());
1563   - deviceDeleteMsgBuilder.setIdLSB(device.getId().getId().getLeastSignificantBits());
1564   - testAutoGeneratedCodeByProtobuf(deviceDeleteMsgBuilder);
  1530 + private void testRpcCall() throws Exception {
  1531 + Device device = findDeviceByName("Edge Device 1");
1565 1532
1566   - upLinkMsgBuilder.addDeviceUpdateMsg(deviceDeleteMsgBuilder.build());
1567   - testAutoGeneratedCodeByProtobuf(upLinkMsgBuilder);
  1533 + ObjectNode body = mapper.createObjectNode();
  1534 + body.put("requestId", new Random().nextInt());
  1535 + body.put("requestUUID", Uuids.timeBased().toString());
  1536 + body.put("oneway", false);
  1537 + body.put("expirationTime", System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10));
  1538 + body.put("method", "test_method");
  1539 + body.put("params", "{\"param1\":\"value1\"}");
1568 1540
1569   - edgeImitator.expectResponsesAmount(1);
1570   - edgeImitator.sendUplinkMsg(upLinkMsgBuilder.build());
1571   - Assert.assertTrue(edgeImitator.waitForResponses());
1572   - device = doGet("/api/device/" + device.getId().getId().toString(), Device.class);
1573   - Assert.assertNotNull(device);
1574   - List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
1575   - new TypeReference<PageData<Device>>() {
1576   - }, new PageLink(100)).getData();
1577   - Assert.assertFalse(edgeDevices.contains(device));
  1541 + EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.RPC_CALL, device.getId().getId(), EdgeEventType.DEVICE, body);
  1542 + edgeImitator.expectMessageAmount(1);
  1543 + edgeEventService.saveAsync(edgeEvent);
  1544 + clusterService.onEdgeEventUpdate(tenantId, edge.getId());
  1545 + Assert.assertTrue(edgeImitator.waitForMessages());
  1546 +
  1547 + AbstractMessage latestMessage = edgeImitator.getLatestMessage();
  1548 + Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg);
  1549 + DeviceRpcCallMsg latestDeviceRpcCallMsg = (DeviceRpcCallMsg) latestMessage;
  1550 + Assert.assertEquals("test_method", latestDeviceRpcCallMsg.getRequestMsg().getMethod());
1578 1551 }
1579 1552
1580   - private void installation() throws Exception {
1581   - edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class);
  1553 + private void testTimeseriesWithFailures() throws Exception {
  1554 + log.info("Testing timeseries with failures");
1582 1555
1583   - DeviceProfile deviceProfile = this.createDeviceProfile(CUSTOM_DEVICE_PROFILE_NAME, null);
1584   - extendDeviceProfileData(deviceProfile);
1585   - doPost("/api/deviceProfile", deviceProfile, DeviceProfile.class);
  1556 + int numberOfTimeseriesToSend = 1000;
1586 1557
1587   - Device savedDevice = saveDevice("Edge Device 1", CUSTOM_DEVICE_PROFILE_NAME);
1588   - doPost("/api/edge/" + edge.getId().getId().toString()
1589   - + "/device/" + savedDevice.getId().getId().toString(), Device.class);
  1558 + edgeImitator.setRandomFailuresOnTimeseriesDownlink(true);
  1559 + // imitator will generate failure in 5% of cases
  1560 + edgeImitator.setFailureProbability(5.0);
1590 1561
1591   - Asset savedAsset = saveAsset("Edge Asset 1");
1592   - doPost("/api/edge/" + edge.getId().getId().toString()
1593   - + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
  1562 + edgeImitator.expectMessageAmount(numberOfTimeseriesToSend);
  1563 + Device device = findDeviceByName("Edge Device 1");
  1564 + for (int idx = 1; idx <= numberOfTimeseriesToSend; idx++) {
  1565 + String timeseriesData = "{\"data\":{\"idx\":" + idx + "},\"ts\":" + System.currentTimeMillis() + "}";
  1566 + JsonNode timeseriesEntityData = mapper.readTree(timeseriesData);
  1567 + EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED,
  1568 + device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
  1569 + edgeEventService.saveAsync(edgeEvent);
  1570 + clusterService.onEdgeEventUpdate(tenantId, edge.getId());
  1571 + }
  1572 +
  1573 + Assert.assertTrue(edgeImitator.waitForMessages(60));
  1574 +
  1575 + List<EntityDataProto> allTelemetryMsgs = edgeImitator.findAllMessagesByType(EntityDataProto.class);
  1576 + Assert.assertEquals(numberOfTimeseriesToSend, allTelemetryMsgs.size());
  1577 +
  1578 + for (int idx = 1; idx <= numberOfTimeseriesToSend; idx++) {
  1579 + Assert.assertTrue(isIdxExistsInTheDownlinkList(idx, allTelemetryMsgs));
  1580 + }
  1581 +
  1582 + edgeImitator.setRandomFailuresOnTimeseriesDownlink(false);
  1583 + log.info("Timeseries with failures tested successfully");
  1584 + }
  1585 +
  1586 + private boolean isIdxExistsInTheDownlinkList(int idx, List<EntityDataProto> allTelemetryMsgs) {
  1587 + for (EntityDataProto proto : allTelemetryMsgs) {
  1588 + TransportProtos.PostTelemetryMsg postTelemetryMsg = proto.getPostTelemetryMsg();
  1589 + Assert.assertEquals(1, postTelemetryMsg.getTsKvListCount());
  1590 + TransportProtos.TsKvListProto tsKvListProto = postTelemetryMsg.getTsKvList(0);
  1591 + Assert.assertEquals(1, tsKvListProto.getKvCount());
  1592 + TransportProtos.KeyValueProto keyValueProto = tsKvListProto.getKv(0);
  1593 + Assert.assertEquals("idx", keyValueProto.getKey());
  1594 + if (keyValueProto.getLongV() == idx) {
  1595 + return true;
  1596 + }
  1597 + }
  1598 + return false;
1594 1599 }
1595 1600
1596 1601 private void extendDeviceProfileData(DeviceProfile deviceProfile) {
... ...
1 1 transport.lwm2m.security.key_store=lwm2m/credentials/serverKeyStore.jks
2 2 transport.lwm2m.security.key_store_password=server
3 3 edges.enabled=true
  4 +edges.storage.no_read_records_sleep=500
  5 +edges.storage.sleep_between_batches=500
4 6 transport.lwm2m.bootstrap.security.alias=server
\ No newline at end of file
... ...