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,7 +166,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
166 // sleep 1 seconds to avoid CREDENTIALS updated message for the user 166 // sleep 1 seconds to avoid CREDENTIALS updated message for the user
167 // user credentials is going to be stored and updated event pushed to edge notification service 167 // user credentials is going to be stored and updated event pushed to edge notification service
168 // while service will be processing this event edge could be already added and additional message will be pushed 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 installation(); 171 installation();
172 172
@@ -177,6 +177,22 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -177,6 +177,22 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
177 testReceivedInitialData(); 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 @After 196 @After
181 public void afterTest() throws Exception { 197 public void afterTest() throws Exception {
182 try { 198 try {
@@ -190,7 +206,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -190,7 +206,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
190 } 206 }
191 207
192 @Test 208 @Test
193 - public void generalTest() throws Exception { 209 + public void test() throws Exception {
194 testDevices(); 210 testDevices();
195 211
196 testAssets(); 212 testAssets();
@@ -216,179 +232,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -216,179 +232,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
216 testSendMessagesToCloud(); 232 testSendMessagesToCloud();
217 233
218 testRpcCall(); 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 private void testDevices() throws Exception { 239 private void testDevices() throws Exception {
@@ -529,23 +374,20 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -529,23 +374,20 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
529 log.info("Testing RuleChains"); 374 log.info("Testing RuleChains");
530 375
531 // 1 376 // 1
532 - edgeImitator.expectMessageAmount(1); 377 + edgeImitator.expectMessageAmount(2);
533 RuleChain ruleChain = new RuleChain(); 378 RuleChain ruleChain = new RuleChain();
534 ruleChain.setName("Edge Test Rule Chain"); 379 ruleChain.setName("Edge Test Rule Chain");
535 ruleChain.setType(RuleChainType.EDGE); 380 ruleChain.setType(RuleChainType.EDGE);
536 RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class); 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 doPost("/api/edge/" + edge.getId().getId().toString() 382 doPost("/api/edge/" + edge.getId().getId().toString()
543 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class); 383 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
  384 + createRuleChainMetadata(savedRuleChain);
544 Assert.assertTrue(edgeImitator.waitForMessages()); 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 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits()); 391 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
550 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits()); 392 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
551 Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName()); 393 Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName());
@@ -558,9 +400,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -558,9 +400,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
558 doDelete("/api/edge/" + edge.getId().getId().toString() 400 doDelete("/api/edge/" + edge.getId().getId().toString()
559 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class); 401 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
560 Assert.assertTrue(edgeImitator.waitForMessages()); 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 Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType()); 406 Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
565 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits()); 407 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
566 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits()); 408 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
@@ -574,67 +416,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -574,67 +416,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
574 log.info("RuleChains tested successfully"); 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 private void testDashboards() throws Exception { 419 private void testDashboards() throws Exception {
639 log.info("Testing Dashboards"); 420 log.info("Testing Dashboards");
640 421
@@ -1037,12 +818,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1037,12 +818,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1037 log.info("Attributes tested successfully"); 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 edgeImitator.expectMessageAmount(1); 825 edgeImitator.expectMessageAmount(1);
1045 - edgeEventService.saveAsync(edgeEvent); 826 + edgeEventService.saveAsync(edgeEvent1);
1046 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 827 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
1047 Assert.assertTrue(edgeImitator.waitForMessages()); 828 Assert.assertTrue(edgeImitator.waitForMessages());
1048 829
@@ -1052,15 +833,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1052,15 +833,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1052 Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB()); 833 Assert.assertEquals(device.getUuidId().getMostSignificantBits(), latestEntityDataMsg.getEntityIdMSB());
1053 Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB()); 834 Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestEntityDataMsg.getEntityIdLSB());
1054 Assert.assertEquals(device.getId().getEntityType().name(), latestEntityDataMsg.getEntityType()); 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 private void testPostAttributesMsg(Device device) throws JsonProcessingException, InterruptedException { 846 private void testPostAttributesMsg(Device device) throws JsonProcessingException, InterruptedException {
@@ -1088,29 +868,192 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1088,29 +868,192 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1088 Assert.assertEquals("value2", keyValueProto.getStringV()); 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 edgeImitator.expectMessageAmount(1); 875 edgeImitator.expectMessageAmount(1);
1096 - edgeEventService.saveAsync(edgeEvent1); 876 + edgeEventService.saveAsync(edgeEvent);
1097 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 877 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
1098 Assert.assertTrue(edgeImitator.waitForMessages()); 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 private void testSendMessagesToCloud() throws Exception { 1059 private void testSendMessagesToCloud() throws Exception {
@@ -1284,46 +1227,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1284,46 +1227,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1284 Assert.assertEquals(AlarmSeverity.CRITICAL, alarmInfo.getSeverity()); 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 private void sendTelemetry() throws Exception { 1230 private void sendTelemetry() throws Exception {
1328 List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", 1231 List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
1329 new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData(); 1232 new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
@@ -1368,9 +1271,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1368,9 +1271,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1368 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build()); 1271 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build());
1369 Assert.assertTrue(edgeImitator.waitForResponses()); 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 Assert.assertTrue(timeseries.containsKey(timeseriesKey)); 1283 Assert.assertTrue(timeseries.containsKey(timeseriesKey));
1375 Assert.assertEquals(1, timeseries.get(timeseriesKey).size()); 1284 Assert.assertEquals(1, timeseries.get(timeseriesKey).size());
1376 Assert.assertEquals(timeseriesValue, timeseries.get(timeseriesKey).get(0).get("value")); 1285 Assert.assertEquals(timeseriesValue, timeseries.get(timeseriesKey).get(0).get("value"));
@@ -1382,6 +1291,69 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -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 private void sendRuleChainMetadataRequest() throws Exception { 1357 private void sendRuleChainMetadataRequest() throws Exception {
1386 RuleChainId edgeRootRuleChainId = edge.getRootRuleChainId(); 1358 RuleChainId edgeRootRuleChainId = edge.getRootRuleChainId();
1387 1359
@@ -1463,25 +1435,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1463,25 +1435,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1463 Assert.assertEquals(deviceCredentialsUpdateMsg.getCredentialsId(), deviceCredentials.getCredentialsId()); 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 private void sendDeviceRpcResponse() throws Exception { 1438 private void sendDeviceRpcResponse() throws Exception {
1486 Device device = findDeviceByName("Edge Device 1"); 1439 Device device = findDeviceByName("Edge Device 1");
1487 1440
@@ -1507,6 +1460,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1507,6 +1460,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1507 Assert.assertTrue(edgeImitator.waitForResponses()); 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 private void sendAttributesRequest() throws Exception { 1482 private void sendAttributesRequest() throws Exception {
1511 Device device = findDeviceByName("Edge Device 1"); 1483 Device device = findDeviceByName("Edge Device 1");
1512 sendAttributesRequest(device, DataConstants.SERVER_SCOPE, "{\"key1\":\"value1\"}", "key1", "value1"); 1484 sendAttributesRequest(device, DataConstants.SERVER_SCOPE, "{\"key1\":\"value1\"}", "key1", "value1");
@@ -1520,7 +1492,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1520,7 +1492,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1520 attributesData); 1492 attributesData);
1521 1493
1522 // Wait before device attributes saved to database before requesting them from edge 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 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); 1498 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
1526 AttributesRequestMsg.Builder attributesRequestMsgBuilder = AttributesRequestMsg.newBuilder(); 1499 AttributesRequestMsg.Builder attributesRequestMsgBuilder = AttributesRequestMsg.newBuilder();
@@ -1554,43 +1527,75 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1554,43 +1527,75 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1554 Assert.assertEquals(expectedValue, keyValueProto.getStringV()); 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 private void extendDeviceProfileData(DeviceProfile deviceProfile) { 1601 private void extendDeviceProfileData(DeviceProfile deviceProfile) {
1 transport.lwm2m.security.key_store=lwm2m/credentials/serverKeyStore.jks 1 transport.lwm2m.security.key_store=lwm2m/credentials/serverKeyStore.jks
2 transport.lwm2m.security.key_store_password=server 2 transport.lwm2m.security.key_store_password=server
3 edges.enabled=true 3 edges.enabled=true
  4 +edges.storage.no_read_records_sleep=500
  5 +edges.storage.sleep_between_batches=500
4 transport.lwm2m.bootstrap.security.alias=server 6 transport.lwm2m.bootstrap.security.alias=server