Commit eb16527e4dc6017038c5f3dc93e04a953b19299a

Authored by Igor Kulikov
Committed by GitHub
2 parents e08d1b2c 0e9f8e91

Merge pull request #4410 from volodymyr-babak/edge/refactoring

Edge test stabilization fixes. Edge minor refactoring
@@ -40,8 +40,6 @@ public class DeviceProfileMsgConstructor { @@ -40,8 +40,6 @@ public class DeviceProfileMsgConstructor {
40 .setName(deviceProfile.getName()) 40 .setName(deviceProfile.getName())
41 .setDefault(deviceProfile.isDefault()) 41 .setDefault(deviceProfile.isDefault())
42 .setType(deviceProfile.getType().name()) 42 .setType(deviceProfile.getType().name())
43 - .setTransportType(deviceProfile.getTransportType().name())  
44 - .setProvisionType(deviceProfile.getProvisionType().name())  
45 .setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfile.getProfileData()))); 43 .setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfile.getProfileData())));
46 // TODO: voba - should this be always null at the moment?? 44 // TODO: voba - should this be always null at the moment??
47 // if (deviceProfile.getDefaultRuleChainId() != null) { 45 // if (deviceProfile.getDefaultRuleChainId() != null) {
@@ -54,6 +52,12 @@ public class DeviceProfileMsgConstructor { @@ -54,6 +52,12 @@ public class DeviceProfileMsgConstructor {
54 if (deviceProfile.getDescription() != null) { 52 if (deviceProfile.getDescription() != null) {
55 builder.setDescription(deviceProfile.getDescription()); 53 builder.setDescription(deviceProfile.getDescription());
56 } 54 }
  55 + if (deviceProfile.getTransportType() != null) {
  56 + builder.setTransportType(deviceProfile.getTransportType().name());
  57 + }
  58 + if (deviceProfile.getProvisionType() != null) {
  59 + builder.setProvisionType(deviceProfile.getProvisionType().name());
  60 + }
57 if (deviceProfile.getProvisionDeviceKey() != null) { 61 if (deviceProfile.getProvisionDeviceKey() != null) {
58 builder.setProvisionDeviceKey(deviceProfile.getProvisionDeviceKey()); 62 builder.setProvisionDeviceKey(deviceProfile.getProvisionDeviceKey());
59 } 63 }
@@ -259,18 +259,12 @@ public class InstallScripts { @@ -259,18 +259,12 @@ public class InstallScripts {
259 try { 259 try {
260 createDefaultRuleChains(tenantId); 260 createDefaultRuleChains(tenantId);
261 createDefaultRuleChain(tenantId, "Thermostat"); 261 createDefaultRuleChain(tenantId, "Thermostat");
262 - loadEdgeDemoRuleChains(tenantId);  
263 } catch (Exception e) { 262 } catch (Exception e) {
264 log.error("Unable to load dashboard from json", e); 263 log.error("Unable to load dashboard from json", e);
265 throw new RuntimeException("Unable to load dashboard from json", e); 264 throw new RuntimeException("Unable to load dashboard from json", e);
266 } 265 }
267 } 266 }
268 267
269 - private void loadEdgeDemoRuleChains(TenantId tenantId) throws Exception {  
270 - Path edgeDemoRuleChainsDir = Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, EDGE_MANAGEMENT, RULE_CHAINS_DIR);  
271 - loadRuleChainsFromPath(tenantId, edgeDemoRuleChainsDir);  
272 - }  
273 -  
274 public void createOAuth2Templates() throws Exception { 268 public void createOAuth2Templates() throws Exception {
275 Path oauth2ConfigTemplatesDir = Paths.get(getDataDir(), JSON_DIR, SYSTEM_DIR, OAUTH2_CONFIG_TEMPLATES_DIR); 269 Path oauth2ConfigTemplatesDir = Paths.get(getDataDir(), JSON_DIR, SYSTEM_DIR, OAUTH2_CONFIG_TEMPLATES_DIR);
276 try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(oauth2ConfigTemplatesDir, path -> path.toString().endsWith(JSON_EXT))) { 270 try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(oauth2ConfigTemplatesDir, path -> path.toString().endsWith(JSON_EXT))) {
@@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.security.Authority; @@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.security.Authority;
38 import org.thingsboard.server.dao.model.ModelConstants; 38 import org.thingsboard.server.dao.model.ModelConstants;
39 import org.thingsboard.server.edge.imitator.EdgeImitator; 39 import org.thingsboard.server.edge.imitator.EdgeImitator;
40 import org.thingsboard.server.gen.edge.AssetUpdateMsg; 40 import org.thingsboard.server.gen.edge.AssetUpdateMsg;
  41 +import org.thingsboard.server.gen.edge.DeviceProfileUpdateMsg;
41 import org.thingsboard.server.gen.edge.DeviceUpdateMsg; 42 import org.thingsboard.server.gen.edge.DeviceUpdateMsg;
42 import org.thingsboard.server.gen.edge.RuleChainUpdateMsg; 43 import org.thingsboard.server.gen.edge.RuleChainUpdateMsg;
43 import org.thingsboard.server.gen.edge.UserCredentialsUpdateMsg; 44 import org.thingsboard.server.gen.edge.UserCredentialsUpdateMsg;
@@ -672,22 +673,24 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { @@ -672,22 +673,24 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest {
672 edgeImitator.ignoreType(UserCredentialsUpdateMsg.class); 673 edgeImitator.ignoreType(UserCredentialsUpdateMsg.class);
673 edgeImitator.expectMessageAmount(7); 674 edgeImitator.expectMessageAmount(7);
674 edgeImitator.connect(); 675 edgeImitator.connect();
675 - edgeImitator.waitForMessages(); 676 + Assert.assertTrue(edgeImitator.waitForMessages());
676 677
677 Assert.assertEquals(7, edgeImitator.getDownlinkMsgs().size()); 678 Assert.assertEquals(7, edgeImitator.getDownlinkMsgs().size());
678 Assert.assertTrue(edgeImitator.findMessageByType(RuleChainUpdateMsg.class).isPresent()); 679 Assert.assertTrue(edgeImitator.findMessageByType(RuleChainUpdateMsg.class).isPresent());
  680 + Assert.assertTrue(edgeImitator.findMessageByType(DeviceProfileUpdateMsg.class).isPresent());
679 Assert.assertTrue(edgeImitator.findMessageByType(DeviceUpdateMsg.class).isPresent()); 681 Assert.assertTrue(edgeImitator.findMessageByType(DeviceUpdateMsg.class).isPresent());
680 Assert.assertTrue(edgeImitator.findMessageByType(AssetUpdateMsg.class).isPresent()); 682 Assert.assertTrue(edgeImitator.findMessageByType(AssetUpdateMsg.class).isPresent());
681 Assert.assertTrue(edgeImitator.findMessageByType(UserUpdateMsg.class).isPresent()); 683 Assert.assertTrue(edgeImitator.findMessageByType(UserUpdateMsg.class).isPresent());
682 684
683 edgeImitator.getDownlinkMsgs().clear(); 685 edgeImitator.getDownlinkMsgs().clear();
684 686
685 - edgeImitator.expectMessageAmount(4); 687 + edgeImitator.expectMessageAmount(7);
686 doPost("/api/edge/sync/" + edge.getId()); 688 doPost("/api/edge/sync/" + edge.getId());
687 - edgeImitator.waitForMessages(); 689 + Assert.assertTrue(edgeImitator.waitForMessages());
688 690
689 - Assert.assertEquals(4, edgeImitator.getDownlinkMsgs().size()); 691 + Assert.assertEquals(7, edgeImitator.getDownlinkMsgs().size());
690 Assert.assertTrue(edgeImitator.findMessageByType(RuleChainUpdateMsg.class).isPresent()); 692 Assert.assertTrue(edgeImitator.findMessageByType(RuleChainUpdateMsg.class).isPresent());
  693 + Assert.assertTrue(edgeImitator.findMessageByType(DeviceProfileUpdateMsg.class).isPresent());
691 Assert.assertTrue(edgeImitator.findMessageByType(DeviceUpdateMsg.class).isPresent()); 694 Assert.assertTrue(edgeImitator.findMessageByType(DeviceUpdateMsg.class).isPresent());
692 Assert.assertTrue(edgeImitator.findMessageByType(AssetUpdateMsg.class).isPresent()); 695 Assert.assertTrue(edgeImitator.findMessageByType(AssetUpdateMsg.class).isPresent());
693 Assert.assertTrue(edgeImitator.findMessageByType(UserUpdateMsg.class).isPresent()); 696 Assert.assertTrue(edgeImitator.findMessageByType(UserUpdateMsg.class).isPresent());
@@ -42,7 +42,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @@ -42,7 +42,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
42 public class BaseEdgeEventControllerTest extends AbstractControllerTest { 42 public class BaseEdgeEventControllerTest extends AbstractControllerTest {
43 43
44 private Tenant savedTenant; 44 private Tenant savedTenant;
45 - private TenantId tenantId;  
46 private User tenantAdmin; 45 private User tenantAdmin;
47 46
48 @Before 47 @Before
@@ -52,7 +51,6 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest { @@ -52,7 +51,6 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest {
52 Tenant tenant = new Tenant(); 51 Tenant tenant = new Tenant();
53 tenant.setTitle("My tenant"); 52 tenant.setTitle("My tenant");
54 savedTenant = doPost("/api/tenant", tenant, Tenant.class); 53 savedTenant = doPost("/api/tenant", tenant, Tenant.class);
55 - tenantId = savedTenant.getId();  
56 Assert.assertNotNull(savedTenant); 54 Assert.assertNotNull(savedTenant);
57 55
58 tenantAdmin = new User(); 56 tenantAdmin = new User();
@@ -63,6 +61,10 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest { @@ -63,6 +61,10 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest {
63 tenantAdmin.setLastName("Downs"); 61 tenantAdmin.setLastName("Downs");
64 62
65 tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1"); 63 tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1");
  64 + // sleep 1 seconds to avoid CREDENTIALS updated message for the user
  65 + // user credentials is going to be stored and updated event pushed to edge notification service
  66 + // while service will be processing this event edge could be already added and additional message will be pushed
  67 + Thread.sleep(1000);
66 } 68 }
67 69
68 @After 70 @After
@@ -75,7 +77,6 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest { @@ -75,7 +77,6 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest {
75 77
76 @Test 78 @Test
77 public void testGetEdgeEvents() throws Exception { 79 public void testGetEdgeEvents() throws Exception {
78 - Thread.sleep(500);  
79 Edge edge = constructEdge("TestEdge", "default"); 80 Edge edge = constructEdge("TestEdge", "default");
80 edge = doPost("/api/edge", edge, Edge.class); 81 edge = doPost("/api/edge", edge, Edge.class);
81 82
@@ -83,29 +84,31 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest { @@ -83,29 +84,31 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest {
83 Device savedDevice = doPost("/api/device", device, Device.class); 84 Device savedDevice = doPost("/api/device", device, Device.class);
84 85
85 doPost("/api/edge/" + edge.getId().toString() + "/device/" + savedDevice.getId().toString(), Device.class); 86 doPost("/api/edge/" + edge.getId().toString() + "/device/" + savedDevice.getId().toString(), Device.class);
86 - Thread.sleep(500);  
87 87
88 Asset asset = constructAsset("TestAsset", "default"); 88 Asset asset = constructAsset("TestAsset", "default");
89 Asset savedAsset = doPost("/api/asset", asset, Asset.class); 89 Asset savedAsset = doPost("/api/asset", asset, Asset.class);
90 90
91 doPost("/api/edge/" + edge.getId().toString() + "/asset/" + savedAsset.getId().toString(), Asset.class); 91 doPost("/api/edge/" + edge.getId().toString() + "/asset/" + savedAsset.getId().toString(), Asset.class);
92 - Thread.sleep(500);  
93 92
94 EntityRelation relation = new EntityRelation(savedAsset.getId(), savedDevice.getId(), EntityRelation.CONTAINS_TYPE); 93 EntityRelation relation = new EntityRelation(savedAsset.getId(), savedDevice.getId(), EntityRelation.CONTAINS_TYPE);
95 94
96 doPost("/api/relation", relation); 95 doPost("/api/relation", relation);
97 - Thread.sleep(500);  
98 96
99 - List<EdgeEvent> edgeEvents = doGetTypedWithTimePageLink("/api/edge/" + edge.getId().toString() + "/events?",  
100 - new TypeReference<PageData<EdgeEvent>>() {  
101 - }, new TimePageLink(4)).getData();  
102 -  
103 - Assert.assertFalse(edgeEvents.isEmpty()); 97 + // wait while edge event for the relation entity persisted to DB
  98 + Thread.sleep(100);
  99 + List<EdgeEvent> edgeEvents;
  100 + int attempt = 1;
  101 + do {
  102 + edgeEvents = doGetTypedWithTimePageLink("/api/edge/" + edge.getId().toString() + "/events?",
  103 + new TypeReference<PageData<EdgeEvent>>() {}, new TimePageLink(4)).getData();
  104 + attempt++;
  105 + Thread.sleep(100);
  106 + } while (edgeEvents.size() != 4 || attempt < 5);
104 Assert.assertEquals(4, edgeEvents.size()); 107 Assert.assertEquals(4, edgeEvents.size());
105 - Assert.assertEquals(EdgeEventType.RULE_CHAIN, edgeEvents.get(0).getType());  
106 - Assert.assertEquals(EdgeEventType.DEVICE, edgeEvents.get(1).getType());  
107 - Assert.assertEquals(EdgeEventType.ASSET, edgeEvents.get(2).getType());  
108 - Assert.assertEquals(EdgeEventType.RELATION, edgeEvents.get(3).getType()); 108 + Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.RULE_CHAIN.equals(ee.getType())));
  109 + Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.DEVICE.equals(ee.getType())));
  110 + Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.ASSET.equals(ee.getType())));
  111 + Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.RELATION.equals(ee.getType())));
109 } 112 }
110 113
111 private Device constructDevice(String name, String type) { 114 private Device constructDevice(String name, String type) {
@@ -32,10 +32,12 @@ import org.junit.Assert; @@ -32,10 +32,12 @@ import org.junit.Assert;
32 import org.junit.Before; 32 import org.junit.Before;
33 import org.junit.Test; 33 import org.junit.Test;
34 import org.springframework.beans.factory.annotation.Autowired; 34 import org.springframework.beans.factory.annotation.Autowired;
  35 +import org.thingsboard.common.util.JacksonUtil;
35 import org.thingsboard.server.common.data.Customer; 36 import org.thingsboard.server.common.data.Customer;
36 import org.thingsboard.server.common.data.Dashboard; 37 import org.thingsboard.server.common.data.Dashboard;
37 import org.thingsboard.server.common.data.DataConstants; 38 import org.thingsboard.server.common.data.DataConstants;
38 import org.thingsboard.server.common.data.Device; 39 import org.thingsboard.server.common.data.Device;
  40 +import org.thingsboard.server.common.data.DeviceProfile;
39 import org.thingsboard.server.common.data.EntityType; 41 import org.thingsboard.server.common.data.EntityType;
40 import org.thingsboard.server.common.data.EntityView; 42 import org.thingsboard.server.common.data.EntityView;
41 import org.thingsboard.server.common.data.Tenant; 43 import org.thingsboard.server.common.data.Tenant;
@@ -45,6 +47,15 @@ import org.thingsboard.server.common.data.alarm.AlarmInfo; @@ -45,6 +47,15 @@ import org.thingsboard.server.common.data.alarm.AlarmInfo;
45 import org.thingsboard.server.common.data.alarm.AlarmSeverity; 47 import org.thingsboard.server.common.data.alarm.AlarmSeverity;
46 import org.thingsboard.server.common.data.alarm.AlarmStatus; 48 import org.thingsboard.server.common.data.alarm.AlarmStatus;
47 import org.thingsboard.server.common.data.asset.Asset; 49 import org.thingsboard.server.common.data.asset.Asset;
  50 +import org.thingsboard.server.common.data.device.profile.AlarmCondition;
  51 +import org.thingsboard.server.common.data.device.profile.AlarmConditionFilter;
  52 +import org.thingsboard.server.common.data.device.profile.AlarmConditionFilterKey;
  53 +import org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType;
  54 +import org.thingsboard.server.common.data.device.profile.AlarmRule;
  55 +import org.thingsboard.server.common.data.device.profile.AllowCreateNewDevicesDeviceProfileProvisionConfiguration;
  56 +import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm;
  57 +import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
  58 +import org.thingsboard.server.common.data.device.profile.SimpleAlarmConditionSpec;
48 import org.thingsboard.server.common.data.edge.Edge; 59 import org.thingsboard.server.common.data.edge.Edge;
49 import org.thingsboard.server.common.data.edge.EdgeEvent; 60 import org.thingsboard.server.common.data.edge.EdgeEvent;
50 import org.thingsboard.server.common.data.edge.EdgeEventActionType; 61 import org.thingsboard.server.common.data.edge.EdgeEventActionType;
@@ -57,6 +68,9 @@ import org.thingsboard.server.common.data.id.TenantId; @@ -57,6 +68,9 @@ import org.thingsboard.server.common.data.id.TenantId;
57 import org.thingsboard.server.common.data.id.UserId; 68 import org.thingsboard.server.common.data.id.UserId;
58 import org.thingsboard.server.common.data.page.PageData; 69 import org.thingsboard.server.common.data.page.PageData;
59 import org.thingsboard.server.common.data.page.PageLink; 70 import org.thingsboard.server.common.data.page.PageLink;
  71 +import org.thingsboard.server.common.data.query.EntityKeyValueType;
  72 +import org.thingsboard.server.common.data.query.FilterPredicateValue;
  73 +import org.thingsboard.server.common.data.query.NumericFilterPredicate;
60 import org.thingsboard.server.common.data.relation.EntityRelation; 74 import org.thingsboard.server.common.data.relation.EntityRelation;
61 import org.thingsboard.server.common.data.relation.RelationTypeGroup; 75 import org.thingsboard.server.common.data.relation.RelationTypeGroup;
62 import org.thingsboard.server.common.data.rule.RuleChain; 76 import org.thingsboard.server.common.data.rule.RuleChain;
@@ -71,7 +85,6 @@ import org.thingsboard.server.common.data.widget.WidgetsBundle; @@ -71,7 +85,6 @@ import org.thingsboard.server.common.data.widget.WidgetsBundle;
71 import org.thingsboard.server.common.transport.adaptor.JsonConverter; 85 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
72 import org.thingsboard.server.controller.AbstractControllerTest; 86 import org.thingsboard.server.controller.AbstractControllerTest;
73 import org.thingsboard.server.dao.edge.EdgeEventService; 87 import org.thingsboard.server.dao.edge.EdgeEventService;
74 -import org.thingsboard.common.util.JacksonUtil;  
75 import org.thingsboard.server.edge.imitator.EdgeImitator; 88 import org.thingsboard.server.edge.imitator.EdgeImitator;
76 import org.thingsboard.server.gen.edge.AlarmUpdateMsg; 89 import org.thingsboard.server.gen.edge.AlarmUpdateMsg;
77 import org.thingsboard.server.gen.edge.AssetUpdateMsg; 90 import org.thingsboard.server.gen.edge.AssetUpdateMsg;
@@ -81,6 +94,7 @@ import org.thingsboard.server.gen.edge.CustomerUpdateMsg; @@ -81,6 +94,7 @@ import org.thingsboard.server.gen.edge.CustomerUpdateMsg;
81 import org.thingsboard.server.gen.edge.DashboardUpdateMsg; 94 import org.thingsboard.server.gen.edge.DashboardUpdateMsg;
82 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; 95 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg;
83 import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg; 96 import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg;
  97 +import org.thingsboard.server.gen.edge.DeviceProfileUpdateMsg;
84 import org.thingsboard.server.gen.edge.DeviceRpcCallMsg; 98 import org.thingsboard.server.gen.edge.DeviceRpcCallMsg;
85 import org.thingsboard.server.gen.edge.DeviceUpdateMsg; 99 import org.thingsboard.server.gen.edge.DeviceUpdateMsg;
86 import org.thingsboard.server.gen.edge.EdgeConfiguration; 100 import org.thingsboard.server.gen.edge.EdgeConfiguration;
@@ -106,6 +120,7 @@ import java.util.List; @@ -106,6 +120,7 @@ import java.util.List;
106 import java.util.Map; 120 import java.util.Map;
107 import java.util.Optional; 121 import java.util.Optional;
108 import java.util.Random; 122 import java.util.Random;
  123 +import java.util.TreeMap;
109 import java.util.UUID; 124 import java.util.UUID;
110 import java.util.concurrent.TimeUnit; 125 import java.util.concurrent.TimeUnit;
111 126
@@ -114,6 +129,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @@ -114,6 +129,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
114 @Slf4j 129 @Slf4j
115 abstract public class BaseEdgeTest extends AbstractControllerTest { 130 abstract public class BaseEdgeTest extends AbstractControllerTest {
116 131
  132 + private static final String CUSTOM_DEVICE_PROFILE_NAME = "Thermostat";
  133 +
117 private Tenant savedTenant; 134 private Tenant savedTenant;
118 private TenantId tenantId; 135 private TenantId tenantId;
119 private User tenantAdmin; 136 private User tenantAdmin;
@@ -145,11 +162,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -145,11 +162,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
145 tenantAdmin.setLastName("Downs"); 162 tenantAdmin.setLastName("Downs");
146 163
147 tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1"); 164 tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1");
  165 + // sleep 1 seconds to avoid CREDENTIALS updated message for the user
  166 + // user credentials is going to be stored and updated event pushed to edge notification service
  167 + // while service will be processing this event edge could be already added and additional message will be pushed
  168 + Thread.sleep(1000);
  169 +
148 installation(); 170 installation();
149 171
150 edgeImitator = new EdgeImitator("localhost", 7070, edge.getRoutingKey(), edge.getSecret()); 172 edgeImitator = new EdgeImitator("localhost", 7070, edge.getRoutingKey(), edge.getSecret());
151 - // should be less, but events from SyncEdgeService stack with events from controller. will be fixed in next releases  
152 - edgeImitator.expectMessageAmount(7); 173 + // TODO: voba - should be less, but events from SyncEdgeService stack with events from controller. will be fixed in next releases
  174 + // so ideally sync process should check current edge queue and add only missing entities to the edge queue
  175 + edgeImitator.expectMessageAmount(10);
153 edgeImitator.connect(); 176 edgeImitator.connect();
154 } 177 }
155 178
@@ -163,23 +186,63 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -163,23 +186,63 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
163 .andExpect(status().isOk()); 186 .andExpect(status().isOk());
164 } 187 }
165 188
166 -  
167 @Test 189 @Test
168 public void test() throws Exception { 190 public void test() throws Exception {
169 testReceivedInitialData(); 191 testReceivedInitialData();
  192 + int expectedDownlinkSize = 10;
  193 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  194 +
170 testDevices(); 195 testDevices();
  196 + expectedDownlinkSize = expectedDownlinkSize + 4;
  197 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  198 +
171 testAssets(); 199 testAssets();
  200 + expectedDownlinkSize = expectedDownlinkSize + 4;
  201 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  202 +
172 testRuleChains(); 203 testRuleChains();
  204 + expectedDownlinkSize = expectedDownlinkSize + 3;
  205 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  206 +
173 testDashboards(); 207 testDashboards();
  208 + expectedDownlinkSize = expectedDownlinkSize + 3;
  209 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  210 +
174 testRelations(); 211 testRelations();
  212 + expectedDownlinkSize = expectedDownlinkSize + 2;
  213 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  214 +
175 testAlarms(); 215 testAlarms();
  216 + expectedDownlinkSize = expectedDownlinkSize + 3;
  217 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  218 +
176 testEntityView(); 219 testEntityView();
  220 + expectedDownlinkSize = expectedDownlinkSize + 2;
  221 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  222 +
177 testCustomer(); 223 testCustomer();
  224 + expectedDownlinkSize = expectedDownlinkSize + 2;
  225 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  226 +
178 testWidgetsBundleAndWidgetType(); 227 testWidgetsBundleAndWidgetType();
  228 + expectedDownlinkSize = expectedDownlinkSize + 4;
  229 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  230 +
179 testTimeseries(); 231 testTimeseries();
  232 + expectedDownlinkSize = expectedDownlinkSize + 1;
  233 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  234 +
180 testAttributes(); 235 testAttributes();
  236 + expectedDownlinkSize = expectedDownlinkSize + 3;
  237 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  238 +
181 testSendMessagesToCloud(); 239 testSendMessagesToCloud();
  240 + expectedDownlinkSize = expectedDownlinkSize + 9;
  241 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
  242 +
182 testRpcCall(); 243 testRpcCall();
  244 + expectedDownlinkSize = expectedDownlinkSize + 1;
  245 + Assert.assertEquals(expectedDownlinkSize, edgeImitator.getDownlinkMsgs().size());
183 } 246 }
184 247
185 private Device findDeviceByName(String deviceName) throws Exception { 248 private Device findDeviceByName(String deviceName) throws Exception {
@@ -204,10 +267,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -204,10 +267,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
204 return asset; 267 return asset;
205 } 268 }
206 269
207 - private Device saveDevice(String deviceName) throws Exception { 270 + private Device saveDevice(String deviceName, String type) throws Exception {
208 Device device = new Device(); 271 Device device = new Device();
209 device.setName(deviceName); 272 device.setName(deviceName);
210 - device.setType("test"); 273 + device.setType(type);
211 return doPost("/api/device", device, Device.class); 274 return doPost("/api/device", device, Device.class);
212 } 275 }
213 276
@@ -233,7 +296,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -233,7 +296,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
233 edgeImitator.expectMessageAmount(1); 296 edgeImitator.expectMessageAmount(1);
234 edgeEventService.saveAsync(edgeEvent); 297 edgeEventService.saveAsync(edgeEvent);
235 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 298 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
236 - edgeImitator.waitForMessages(); 299 + Assert.assertTrue(edgeImitator.waitForMessages());
237 300
238 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 301 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
239 Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg); 302 Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg);
@@ -243,7 +306,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -243,7 +306,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
243 306
244 private void testReceivedInitialData() throws Exception { 307 private void testReceivedInitialData() throws Exception {
245 log.info("Checking received data"); 308 log.info("Checking received data");
246 - edgeImitator.waitForMessages(); 309 + Assert.assertTrue(edgeImitator.waitForMessages());
247 310
248 EdgeConfiguration configuration = edgeImitator.getConfiguration(); 311 EdgeConfiguration configuration = edgeImitator.getConfiguration();
249 Assert.assertNotNull(configuration); 312 Assert.assertNotNull(configuration);
@@ -253,9 +316,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -253,9 +316,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
253 UserId userId = edgeImitator.getUserId(); 316 UserId userId = edgeImitator.getUserId();
254 Assert.assertNotNull(userId); 317 Assert.assertNotNull(userId);
255 318
256 - Optional<DeviceUpdateMsg> optionalMsg1 = edgeImitator.findMessageByType(DeviceUpdateMsg.class);  
257 - Assert.assertTrue(optionalMsg1.isPresent());  
258 - DeviceUpdateMsg deviceUpdateMsg = optionalMsg1.get(); 319 + Optional<DeviceUpdateMsg> deviceUpdateMsgOpt = edgeImitator.findMessageByType(DeviceUpdateMsg.class);
  320 + Assert.assertTrue(deviceUpdateMsgOpt.isPresent());
  321 + DeviceUpdateMsg deviceUpdateMsg = deviceUpdateMsgOpt.get();
259 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType()); 322 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
260 UUID deviceUUID = new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB()); 323 UUID deviceUUID = new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB());
261 Device device = doGet("/api/device/" + deviceUUID.toString(), Device.class); 324 Device device = doGet("/api/device/" + deviceUUID.toString(), Device.class);
@@ -264,9 +327,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -264,9 +327,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
264 new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData(); 327 new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
265 Assert.assertTrue(edgeDevices.contains(device)); 328 Assert.assertTrue(edgeDevices.contains(device));
266 329
267 - Optional<AssetUpdateMsg> optionalMsg2 = edgeImitator.findMessageByType(AssetUpdateMsg.class);  
268 - Assert.assertTrue(optionalMsg2.isPresent());  
269 - AssetUpdateMsg assetUpdateMsg = optionalMsg2.get(); 330 + List<DeviceProfileUpdateMsg> deviceProfileUpdateMsgList = edgeImitator.findAllMessagesByType(DeviceProfileUpdateMsg.class);
  331 + Assert.assertEquals(3, deviceProfileUpdateMsgList.size());
  332 + Optional<DeviceProfileUpdateMsg> deviceProfileUpdateMsgOpt =
  333 + deviceProfileUpdateMsgList.stream().filter(dfum -> CUSTOM_DEVICE_PROFILE_NAME.equals(dfum.getName())).findAny();
  334 + Assert.assertTrue(deviceProfileUpdateMsgOpt.isPresent());
  335 + DeviceProfileUpdateMsg deviceProfileUpdateMsg = deviceProfileUpdateMsgOpt.get();
  336 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType());
  337 + UUID deviceProfileUUID = new UUID(deviceProfileUpdateMsg.getIdMSB(), deviceProfileUpdateMsg.getIdLSB());
  338 + DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + deviceProfileUUID.toString(), DeviceProfile.class);
  339 + Assert.assertNotNull(deviceProfile);
  340 + Assert.assertNotNull(deviceProfile.getProfileData());
  341 + Assert.assertNotNull(deviceProfile.getProfileData().getAlarms());
  342 + Assert.assertNotNull(deviceProfile.getProfileData().getAlarms().get(0).getClearRule());
  343 +
  344 + testAutoGeneratedCodeByProtobuf(deviceProfileUpdateMsg);
  345 +
  346 + Optional<AssetUpdateMsg> assetUpdateMsgOpt = edgeImitator.findMessageByType(AssetUpdateMsg.class);
  347 + Assert.assertTrue(assetUpdateMsgOpt.isPresent());
  348 + AssetUpdateMsg assetUpdateMsg = assetUpdateMsgOpt.get();
270 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType()); 349 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
271 UUID assetUUID = new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB()); 350 UUID assetUUID = new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB());
272 Asset asset = doGet("/api/asset/" + assetUUID.toString(), Asset.class); 351 Asset asset = doGet("/api/asset/" + assetUUID.toString(), Asset.class);
@@ -277,9 +356,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -277,9 +356,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
277 356
278 testAutoGeneratedCodeByProtobuf(assetUpdateMsg); 357 testAutoGeneratedCodeByProtobuf(assetUpdateMsg);
279 358
280 - Optional<RuleChainUpdateMsg> optionalMsg3 = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);  
281 - Assert.assertTrue(optionalMsg3.isPresent());  
282 - RuleChainUpdateMsg ruleChainUpdateMsg = optionalMsg3.get(); 359 + Optional<RuleChainUpdateMsg> ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);
  360 + Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent());
  361 + RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get();
283 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType()); 362 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
284 UUID ruleChainUUID = new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB()); 363 UUID ruleChainUUID = new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB());
285 RuleChain ruleChain = doGet("/api/ruleChain/" + ruleChainUUID.toString(), RuleChain.class); 364 RuleChain ruleChain = doGet("/api/ruleChain/" + ruleChainUUID.toString(), RuleChain.class);
@@ -296,13 +375,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -296,13 +375,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
296 private void testDevices() throws Exception { 375 private void testDevices() throws Exception {
297 log.info("Testing devices"); 376 log.info("Testing devices");
298 377
299 - Device savedDevice = saveDevice("Edge Device 2");  
300 - 378 + // 1
301 edgeImitator.expectMessageAmount(1); 379 edgeImitator.expectMessageAmount(1);
  380 + Device savedDevice = saveDevice("Edge Device 2", "Default");
302 doPost("/api/edge/" + edge.getId().getId().toString() 381 doPost("/api/edge/" + edge.getId().getId().toString()
303 + "/device/" + savedDevice.getId().getId().toString(), Device.class); 382 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
304 - edgeImitator.waitForMessages();  
305 - 383 + Assert.assertTrue(edgeImitator.waitForMessages());
306 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 384 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
307 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 385 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
308 DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage; 386 DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
@@ -312,11 +390,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -312,11 +390,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
312 Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName()); 390 Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName());
313 Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType()); 391 Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType());
314 392
  393 + // 2
315 edgeImitator.expectMessageAmount(1); 394 edgeImitator.expectMessageAmount(1);
316 doDelete("/api/edge/" + edge.getId().getId().toString() 395 doDelete("/api/edge/" + edge.getId().getId().toString()
317 + "/device/" + savedDevice.getId().getId().toString(), Device.class); 396 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
318 - edgeImitator.waitForMessages();  
319 - 397 + Assert.assertTrue(edgeImitator.waitForMessages());
320 latestMessage = edgeImitator.getLatestMessage(); 398 latestMessage = edgeImitator.getLatestMessage();
321 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 399 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
322 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage; 400 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
@@ -324,11 +402,34 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -324,11 +402,34 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
324 Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits()); 402 Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits());
325 Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits()); 403 Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits());
326 404
  405 + // 3
327 edgeImitator.expectMessageAmount(1); 406 edgeImitator.expectMessageAmount(1);
328 doDelete("/api/device/" + savedDevice.getId().getId().toString()) 407 doDelete("/api/device/" + savedDevice.getId().getId().toString())
329 .andExpect(status().isOk()); 408 .andExpect(status().isOk());
330 - edgeImitator.waitForMessages(); 409 + // we should not get any message because device is not assigned to edge any more
  410 + Assert.assertFalse(edgeImitator.waitForMessages(1));
331 411
  412 + // 4
  413 + edgeImitator.expectMessageAmount(1);
  414 + savedDevice = saveDevice("Edge Device 3", "Default");
  415 + doPost("/api/edge/" + edge.getId().getId().toString()
  416 + + "/device/" + savedDevice.getId().getId().toString(), Device.class);
  417 + Assert.assertTrue(edgeImitator.waitForMessages());
  418 + latestMessage = edgeImitator.getLatestMessage();
  419 + Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
  420 + deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
  421 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
  422 + Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits());
  423 + Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits());
  424 + Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName());
  425 + Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType());
  426 +
  427 + // 5
  428 + edgeImitator.expectMessageAmount(1);
  429 + doDelete("/api/device/" + savedDevice.getId().getId().toString())
  430 + .andExpect(status().isOk());
  431 + // in this case we should get messages because device was assigned to edge
  432 + Assert.assertTrue(edgeImitator.waitForMessages());
332 latestMessage = edgeImitator.getLatestMessage(); 433 latestMessage = edgeImitator.getLatestMessage();
333 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 434 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
334 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage; 435 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
@@ -342,13 +443,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -342,13 +443,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
342 443
343 private void testAssets() throws Exception { 444 private void testAssets() throws Exception {
344 log.info("Testing assets"); 445 log.info("Testing assets");
345 - Asset savedAsset = saveAsset("Edge Asset 2");  
346 446
  447 + // 1
347 edgeImitator.expectMessageAmount(1); 448 edgeImitator.expectMessageAmount(1);
  449 + Asset savedAsset = saveAsset("Edge Asset 2");
348 doPost("/api/edge/" + edge.getId().getId().toString() 450 doPost("/api/edge/" + edge.getId().getId().toString()
349 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); 451 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
350 - edgeImitator.waitForMessages();  
351 - 452 + Assert.assertTrue(edgeImitator.waitForMessages());
352 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 453 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
353 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg); 454 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
354 AssetUpdateMsg assetUpdateMsg = (AssetUpdateMsg) latestMessage; 455 AssetUpdateMsg assetUpdateMsg = (AssetUpdateMsg) latestMessage;
@@ -358,11 +459,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -358,11 +459,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
358 Assert.assertEquals(assetUpdateMsg.getName(), savedAsset.getName()); 459 Assert.assertEquals(assetUpdateMsg.getName(), savedAsset.getName());
359 Assert.assertEquals(assetUpdateMsg.getType(), savedAsset.getType()); 460 Assert.assertEquals(assetUpdateMsg.getType(), savedAsset.getType());
360 461
  462 + // 2
361 edgeImitator.expectMessageAmount(1); 463 edgeImitator.expectMessageAmount(1);
362 doDelete("/api/edge/" + edge.getId().getId().toString() 464 doDelete("/api/edge/" + edge.getId().getId().toString()
363 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); 465 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
364 - edgeImitator.waitForMessages();  
365 - 466 + Assert.assertTrue(edgeImitator.waitForMessages());
366 latestMessage = edgeImitator.getLatestMessage(); 467 latestMessage = edgeImitator.getLatestMessage();
367 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg); 468 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
368 assetUpdateMsg = (AssetUpdateMsg) latestMessage; 469 assetUpdateMsg = (AssetUpdateMsg) latestMessage;
@@ -370,11 +471,32 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -370,11 +471,32 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
370 Assert.assertEquals(assetUpdateMsg.getIdMSB(), savedAsset.getUuidId().getMostSignificantBits()); 471 Assert.assertEquals(assetUpdateMsg.getIdMSB(), savedAsset.getUuidId().getMostSignificantBits());
371 Assert.assertEquals(assetUpdateMsg.getIdLSB(), savedAsset.getUuidId().getLeastSignificantBits()); 472 Assert.assertEquals(assetUpdateMsg.getIdLSB(), savedAsset.getUuidId().getLeastSignificantBits());
372 473
  474 + // 3
373 edgeImitator.expectMessageAmount(1); 475 edgeImitator.expectMessageAmount(1);
374 doDelete("/api/asset/" + savedAsset.getId().getId().toString()) 476 doDelete("/api/asset/" + savedAsset.getId().getId().toString())
375 .andExpect(status().isOk()); 477 .andExpect(status().isOk());
376 - edgeImitator.waitForMessages(); 478 + Assert.assertFalse(edgeImitator.waitForMessages(1));
377 479
  480 + // 4
  481 + edgeImitator.expectMessageAmount(1);
  482 + savedAsset = saveAsset("Edge Asset 3");
  483 + doPost("/api/edge/" + edge.getId().getId().toString()
  484 + + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
  485 + Assert.assertTrue(edgeImitator.waitForMessages());
  486 + latestMessage = edgeImitator.getLatestMessage();
  487 + Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
  488 + assetUpdateMsg = (AssetUpdateMsg) latestMessage;
  489 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
  490 + Assert.assertEquals(assetUpdateMsg.getIdMSB(), savedAsset.getUuidId().getMostSignificantBits());
  491 + Assert.assertEquals(assetUpdateMsg.getIdLSB(), savedAsset.getUuidId().getLeastSignificantBits());
  492 + Assert.assertEquals(assetUpdateMsg.getName(), savedAsset.getName());
  493 + Assert.assertEquals(assetUpdateMsg.getType(), savedAsset.getType());
  494 +
  495 + // 5
  496 + edgeImitator.expectMessageAmount(1);
  497 + doDelete("/api/asset/" + savedAsset.getId().getId().toString())
  498 + .andExpect(status().isOk());
  499 + Assert.assertTrue(edgeImitator.waitForMessages());
378 latestMessage = edgeImitator.getLatestMessage(); 500 latestMessage = edgeImitator.getLatestMessage();
379 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg); 501 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
380 assetUpdateMsg = (AssetUpdateMsg) latestMessage; 502 assetUpdateMsg = (AssetUpdateMsg) latestMessage;
@@ -387,21 +509,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -387,21 +509,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
387 509
388 private void testRuleChains() throws Exception { 510 private void testRuleChains() throws Exception {
389 log.info("Testing RuleChains"); 511 log.info("Testing RuleChains");
  512 +
  513 + // 1
  514 + edgeImitator.expectMessageAmount(1);
390 RuleChain ruleChain = new RuleChain(); 515 RuleChain ruleChain = new RuleChain();
391 ruleChain.setName("Edge Test Rule Chain"); 516 ruleChain.setName("Edge Test Rule Chain");
392 ruleChain.setType(RuleChainType.EDGE); 517 ruleChain.setType(RuleChainType.EDGE);
393 RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class); 518 RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class);
394 -  
395 createRuleChainMetadata(savedRuleChain); 519 createRuleChainMetadata(savedRuleChain);
396 -  
397 - // Wait before rule chain metadata saved to database before rule chain is assigned to edge 520 + // sleep 1 seconds to avoid ENTITY_UPDATED_RPC_MESSAGE for the rule chain
  521 + // rule chain metadata is going to be stored and updated event pushed to edge notification service
  522 + // while service will be processing this event assignment rule chain to edge will be completed if bad timing
398 Thread.sleep(1000); 523 Thread.sleep(1000);
399 -  
400 - edgeImitator.expectMessageAmount(1);  
401 doPost("/api/edge/" + edge.getId().getId().toString() 524 doPost("/api/edge/" + edge.getId().getId().toString()
402 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class); 525 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
403 - edgeImitator.waitForMessages();  
404 - 526 + Assert.assertTrue(edgeImitator.waitForMessages());
405 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 527 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
406 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg); 528 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);
407 RuleChainUpdateMsg ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage; 529 RuleChainUpdateMsg ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;
@@ -410,13 +532,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -410,13 +532,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
410 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits()); 532 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
411 Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName()); 533 Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName());
412 534
  535 + // 2
413 testRuleChainMetadataRequestMsg(savedRuleChain.getId()); 536 testRuleChainMetadataRequestMsg(savedRuleChain.getId());
414 537
  538 + // 3
415 edgeImitator.expectMessageAmount(1); 539 edgeImitator.expectMessageAmount(1);
416 doDelete("/api/edge/" + edge.getId().getId().toString() 540 doDelete("/api/edge/" + edge.getId().getId().toString()
417 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class); 541 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
418 - edgeImitator.waitForMessages();  
419 - 542 + Assert.assertTrue(edgeImitator.waitForMessages());
420 latestMessage = edgeImitator.getLatestMessage(); 543 latestMessage = edgeImitator.getLatestMessage();
421 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg); 544 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);
422 ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage; 545 ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;
@@ -424,17 +547,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -424,17 +547,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
424 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits()); 547 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
425 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits()); 548 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
426 549
  550 + // 4
427 edgeImitator.expectMessageAmount(1); 551 edgeImitator.expectMessageAmount(1);
428 doDelete("/api/ruleChain/" + savedRuleChain.getId().getId().toString()) 552 doDelete("/api/ruleChain/" + savedRuleChain.getId().getId().toString())
429 .andExpect(status().isOk()); 553 .andExpect(status().isOk());
430 - edgeImitator.waitForMessages();  
431 -  
432 - latestMessage = edgeImitator.getLatestMessage();  
433 - Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);  
434 - ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;  
435 - Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());  
436 - Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());  
437 - Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits()); 554 + Assert.assertFalse(edgeImitator.waitForMessages(1));
438 555
439 log.info("RuleChains tested successfully"); 556 log.info("RuleChains tested successfully");
440 } 557 }
@@ -452,8 +569,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -452,8 +569,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
452 edgeImitator.expectResponsesAmount(1); 569 edgeImitator.expectResponsesAmount(1);
453 edgeImitator.expectMessageAmount(1); 570 edgeImitator.expectMessageAmount(1);
454 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 571 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
455 - edgeImitator.waitForResponses();  
456 - edgeImitator.waitForMessages(); 572 + Assert.assertTrue(edgeImitator.waitForResponses());
  573 + Assert.assertTrue(edgeImitator.waitForMessages());
457 574
458 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 575 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
459 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg); 576 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
@@ -502,15 +619,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -502,15 +619,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
502 619
503 private void testDashboards() throws Exception { 620 private void testDashboards() throws Exception {
504 log.info("Testing Dashboards"); 621 log.info("Testing Dashboards");
  622 +
  623 + // 1
  624 + edgeImitator.expectMessageAmount(1);
505 Dashboard dashboard = new Dashboard(); 625 Dashboard dashboard = new Dashboard();
506 dashboard.setTitle("Edge Test Dashboard"); 626 dashboard.setTitle("Edge Test Dashboard");
507 Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class); 627 Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class);
508 -  
509 - edgeImitator.expectMessageAmount(1);  
510 doPost("/api/edge/" + edge.getId().getId().toString() 628 doPost("/api/edge/" + edge.getId().getId().toString()
511 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class); 629 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class);
512 - edgeImitator.waitForMessages();  
513 - 630 + Assert.assertTrue(edgeImitator.waitForMessages());
514 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 631 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
515 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg); 632 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
516 DashboardUpdateMsg dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage; 633 DashboardUpdateMsg dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
@@ -518,25 +635,24 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -518,25 +635,24 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
518 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits()); 635 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits());
519 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits()); 636 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits());
520 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName()); 637 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName());
521 -  
522 testAutoGeneratedCodeByProtobuf(dashboardUpdateMsg); 638 testAutoGeneratedCodeByProtobuf(dashboardUpdateMsg);
523 639
  640 + // 2
524 edgeImitator.expectMessageAmount(1); 641 edgeImitator.expectMessageAmount(1);
525 savedDashboard.setTitle("Updated Edge Test Dashboard"); 642 savedDashboard.setTitle("Updated Edge Test Dashboard");
526 doPost("/api/dashboard", savedDashboard, Dashboard.class); 643 doPost("/api/dashboard", savedDashboard, Dashboard.class);
527 - edgeImitator.waitForMessages();  
528 - 644 + Assert.assertTrue(edgeImitator.waitForMessages());
529 latestMessage = edgeImitator.getLatestMessage(); 645 latestMessage = edgeImitator.getLatestMessage();
530 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg); 646 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
531 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage; 647 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
532 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType()); 648 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());
533 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName()); 649 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName());
534 650
  651 + // 3
535 edgeImitator.expectMessageAmount(1); 652 edgeImitator.expectMessageAmount(1);
536 doDelete("/api/edge/" + edge.getId().getId().toString() 653 doDelete("/api/edge/" + edge.getId().getId().toString()
537 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class); 654 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class);
538 - edgeImitator.waitForMessages();  
539 - 655 + Assert.assertTrue(edgeImitator.waitForMessages());
540 latestMessage = edgeImitator.getLatestMessage(); 656 latestMessage = edgeImitator.getLatestMessage();
541 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg); 657 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
542 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage; 658 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
@@ -544,17 +660,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -544,17 +660,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
544 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits()); 660 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits());
545 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits()); 661 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits());
546 662
  663 + // 4
547 edgeImitator.expectMessageAmount(1); 664 edgeImitator.expectMessageAmount(1);
548 doDelete("/api/dashboard/" + savedDashboard.getId().getId().toString()) 665 doDelete("/api/dashboard/" + savedDashboard.getId().getId().toString())
549 .andExpect(status().isOk()); 666 .andExpect(status().isOk());
550 - edgeImitator.waitForMessages();  
551 -  
552 - latestMessage = edgeImitator.getLatestMessage();  
553 - Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);  
554 - dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;  
555 - Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());  
556 - Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits());  
557 - Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits()); 667 + Assert.assertFalse(edgeImitator.waitForMessages(1));
558 668
559 log.info("Dashboards tested successfully"); 669 log.info("Dashboards tested successfully");
560 } 670 }
@@ -562,19 +672,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -562,19 +672,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
562 private void testRelations() throws Exception { 672 private void testRelations() throws Exception {
563 log.info("Testing Relations"); 673 log.info("Testing Relations");
564 674
  675 + // 1
  676 + edgeImitator.expectMessageAmount(1);
565 Device device = findDeviceByName("Edge Device 1"); 677 Device device = findDeviceByName("Edge Device 1");
566 Asset asset = findAssetByName("Edge Asset 1"); 678 Asset asset = findAssetByName("Edge Asset 1");
567 -  
568 EntityRelation relation = new EntityRelation(); 679 EntityRelation relation = new EntityRelation();
569 relation.setType("test"); 680 relation.setType("test");
570 relation.setFrom(device.getId()); 681 relation.setFrom(device.getId());
571 relation.setTo(asset.getId()); 682 relation.setTo(asset.getId());
572 relation.setTypeGroup(RelationTypeGroup.COMMON); 683 relation.setTypeGroup(RelationTypeGroup.COMMON);
573 -  
574 - edgeImitator.expectMessageAmount(1);  
575 doPost("/api/relation", relation); 684 doPost("/api/relation", relation);
576 - edgeImitator.waitForMessages();  
577 - 685 + Assert.assertTrue(edgeImitator.waitForMessages());
578 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 686 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
579 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg); 687 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
580 RelationUpdateMsg relationUpdateMsg = (RelationUpdateMsg) latestMessage; 688 RelationUpdateMsg relationUpdateMsg = (RelationUpdateMsg) latestMessage;
@@ -588,6 +696,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -588,6 +696,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
588 Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name()); 696 Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
589 Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name()); 697 Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name());
590 698
  699 + // 2
591 edgeImitator.expectMessageAmount(1); 700 edgeImitator.expectMessageAmount(1);
592 doDelete("/api/relation?" + 701 doDelete("/api/relation?" +
593 "fromId=" + relation.getFrom().getId().toString() + 702 "fromId=" + relation.getFrom().getId().toString() +
@@ -597,8 +706,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -597,8 +706,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
597 "&toId=" + relation.getTo().getId().toString() + 706 "&toId=" + relation.getTo().getId().toString() +
598 "&toType=" + relation.getTo().getEntityType().name()) 707 "&toType=" + relation.getTo().getEntityType().name())
599 .andExpect(status().isOk()); 708 .andExpect(status().isOk());
600 - edgeImitator.waitForMessages();  
601 - 709 + Assert.assertTrue(edgeImitator.waitForMessages());
602 latestMessage = edgeImitator.getLatestMessage(); 710 latestMessage = edgeImitator.getLatestMessage();
603 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg); 711 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
604 relationUpdateMsg = (RelationUpdateMsg) latestMessage; 712 relationUpdateMsg = (RelationUpdateMsg) latestMessage;
@@ -617,18 +725,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -617,18 +725,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
617 725
618 private void testAlarms() throws Exception { 726 private void testAlarms() throws Exception {
619 log.info("Testing Alarms"); 727 log.info("Testing Alarms");
620 - Device device = findDeviceByName("Edge Device 1");  
621 728
  729 + // 1
  730 + edgeImitator.expectMessageAmount(1);
  731 + Device device = findDeviceByName("Edge Device 1");
622 Alarm alarm = new Alarm(); 732 Alarm alarm = new Alarm();
623 alarm.setOriginator(device.getId()); 733 alarm.setOriginator(device.getId());
624 alarm.setStatus(AlarmStatus.ACTIVE_UNACK); 734 alarm.setStatus(AlarmStatus.ACTIVE_UNACK);
625 alarm.setType("alarm"); 735 alarm.setType("alarm");
626 alarm.setSeverity(AlarmSeverity.CRITICAL); 736 alarm.setSeverity(AlarmSeverity.CRITICAL);
627 -  
628 - edgeImitator.expectMessageAmount(1);  
629 Alarm savedAlarm = doPost("/api/alarm", alarm, Alarm.class); 737 Alarm savedAlarm = doPost("/api/alarm", alarm, Alarm.class);
630 - edgeImitator.waitForMessages();  
631 - 738 + Assert.assertTrue(edgeImitator.waitForMessages());
632 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 739 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
633 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg); 740 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
634 AlarmUpdateMsg alarmUpdateMsg = (AlarmUpdateMsg) latestMessage; 741 AlarmUpdateMsg alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
@@ -639,10 +746,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -639,10 +746,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
639 Assert.assertEquals(alarmUpdateMsg.getStatus(), savedAlarm.getStatus().name()); 746 Assert.assertEquals(alarmUpdateMsg.getStatus(), savedAlarm.getStatus().name());
640 Assert.assertEquals(alarmUpdateMsg.getSeverity(), savedAlarm.getSeverity().name()); 747 Assert.assertEquals(alarmUpdateMsg.getSeverity(), savedAlarm.getSeverity().name());
641 748
  749 + // 2
642 edgeImitator.expectMessageAmount(1); 750 edgeImitator.expectMessageAmount(1);
643 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/ack"); 751 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/ack");
644 - edgeImitator.waitForMessages();  
645 - 752 + Assert.assertTrue(edgeImitator.waitForMessages());
646 latestMessage = edgeImitator.getLatestMessage(); 753 latestMessage = edgeImitator.getLatestMessage();
647 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg); 754 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
648 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage; 755 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
@@ -652,10 +759,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -652,10 +759,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
652 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName()); 759 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName());
653 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.ACTIVE_ACK.name()); 760 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.ACTIVE_ACK.name());
654 761
  762 + // 3
655 edgeImitator.expectMessageAmount(1); 763 edgeImitator.expectMessageAmount(1);
656 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/clear"); 764 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/clear");
657 - edgeImitator.waitForMessages();  
658 - 765 + Assert.assertTrue(edgeImitator.waitForMessages());
659 latestMessage = edgeImitator.getLatestMessage(); 766 latestMessage = edgeImitator.getLatestMessage();
660 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg); 767 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
661 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage; 768 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
@@ -665,26 +772,29 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -665,26 +772,29 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
665 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName()); 772 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName());
666 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.CLEARED_ACK.name()); 773 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.CLEARED_ACK.name());
667 774
  775 + // 4
  776 + edgeImitator.expectMessageAmount(1);
668 doDelete("/api/alarm/" + savedAlarm.getId().getId().toString()) 777 doDelete("/api/alarm/" + savedAlarm.getId().getId().toString())
669 .andExpect(status().isOk()); 778 .andExpect(status().isOk());
  779 + Assert.assertFalse(edgeImitator.waitForMessages(1));
  780 +
670 log.info("Alarms tested successfully"); 781 log.info("Alarms tested successfully");
671 } 782 }
672 783
673 private void testEntityView() throws Exception { 784 private void testEntityView() throws Exception {
674 log.info("Testing EntityView"); 785 log.info("Testing EntityView");
675 - Device device = findDeviceByName("Edge Device 1");  
676 786
  787 + // 1
  788 + edgeImitator.expectMessageAmount(1);
  789 + Device device = findDeviceByName("Edge Device 1");
677 EntityView entityView = new EntityView(); 790 EntityView entityView = new EntityView();
678 entityView.setName("Edge EntityView 1"); 791 entityView.setName("Edge EntityView 1");
679 entityView.setType("test"); 792 entityView.setType("test");
680 entityView.setEntityId(device.getId()); 793 entityView.setEntityId(device.getId());
681 EntityView savedEntityView = doPost("/api/entityView", entityView, EntityView.class); 794 EntityView savedEntityView = doPost("/api/entityView", entityView, EntityView.class);
682 -  
683 - edgeImitator.expectMessageAmount(1);  
684 doPost("/api/edge/" + edge.getId().getId().toString() 795 doPost("/api/edge/" + edge.getId().getId().toString()
685 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class); 796 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class);
686 - edgeImitator.waitForMessages();  
687 - 797 + Assert.assertTrue(edgeImitator.waitForMessages());
688 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 798 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
689 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg); 799 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
690 EntityViewUpdateMsg entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage; 800 EntityViewUpdateMsg entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
@@ -697,11 +807,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -697,11 +807,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
697 Assert.assertEquals(entityViewUpdateMsg.getEntityIdLSB(), device.getUuidId().getLeastSignificantBits()); 807 Assert.assertEquals(entityViewUpdateMsg.getEntityIdLSB(), device.getUuidId().getLeastSignificantBits());
698 Assert.assertEquals(entityViewUpdateMsg.getEntityType().name(), device.getId().getEntityType().name()); 808 Assert.assertEquals(entityViewUpdateMsg.getEntityType().name(), device.getId().getEntityType().name());
699 809
  810 + // 2
700 edgeImitator.expectMessageAmount(1); 811 edgeImitator.expectMessageAmount(1);
701 doDelete("/api/edge/" + edge.getId().getId().toString() 812 doDelete("/api/edge/" + edge.getId().getId().toString()
702 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class); 813 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class);
703 - edgeImitator.waitForMessages();  
704 - 814 + Assert.assertTrue(edgeImitator.waitForMessages());
705 latestMessage = edgeImitator.getLatestMessage(); 815 latestMessage = edgeImitator.getLatestMessage();
706 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg); 816 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
707 entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage; 817 entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
@@ -709,17 +819,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -709,17 +819,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
709 Assert.assertEquals(entityViewUpdateMsg.getIdMSB(), savedEntityView.getUuidId().getMostSignificantBits()); 819 Assert.assertEquals(entityViewUpdateMsg.getIdMSB(), savedEntityView.getUuidId().getMostSignificantBits());
710 Assert.assertEquals(entityViewUpdateMsg.getIdLSB(), savedEntityView.getUuidId().getLeastSignificantBits()); 820 Assert.assertEquals(entityViewUpdateMsg.getIdLSB(), savedEntityView.getUuidId().getLeastSignificantBits());
711 821
  822 + // 3
712 edgeImitator.expectMessageAmount(1); 823 edgeImitator.expectMessageAmount(1);
713 doDelete("/api/entityView/" + savedEntityView.getId().getId().toString()) 824 doDelete("/api/entityView/" + savedEntityView.getId().getId().toString())
714 .andExpect(status().isOk()); 825 .andExpect(status().isOk());
715 - edgeImitator.waitForMessages();  
716 -  
717 - latestMessage = edgeImitator.getLatestMessage();  
718 - Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);  
719 - entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;  
720 - Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, entityViewUpdateMsg.getMsgType());  
721 - Assert.assertEquals(entityViewUpdateMsg.getIdMSB(), savedEntityView.getUuidId().getMostSignificantBits());  
722 - Assert.assertEquals(entityViewUpdateMsg.getIdLSB(), savedEntityView.getUuidId().getLeastSignificantBits()); 826 + Assert.assertFalse(edgeImitator.waitForMessages(1));
723 827
724 log.info("EntityView tested successfully"); 828 log.info("EntityView tested successfully");
725 } 829 }
@@ -727,15 +831,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -727,15 +831,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
727 private void testCustomer() throws Exception { 831 private void testCustomer() throws Exception {
728 log.info("Testing Customer"); 832 log.info("Testing Customer");
729 833
  834 + // 1
  835 + edgeImitator.expectMessageAmount(1);
730 Customer customer = new Customer(); 836 Customer customer = new Customer();
731 customer.setTitle("Edge Customer 1"); 837 customer.setTitle("Edge Customer 1");
732 Customer savedCustomer = doPost("/api/customer", customer, Customer.class); 838 Customer savedCustomer = doPost("/api/customer", customer, Customer.class);
733 -  
734 - edgeImitator.expectMessageAmount(1);  
735 doPost("/api/customer/" + savedCustomer.getId().getId().toString() 839 doPost("/api/customer/" + savedCustomer.getId().getId().toString()
736 + "/edge/" + edge.getId().getId().toString(), Edge.class); 840 + "/edge/" + edge.getId().getId().toString(), Edge.class);
737 - edgeImitator.waitForMessages();  
738 - 841 + Assert.assertTrue(edgeImitator.waitForMessages());
739 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 842 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
740 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg); 843 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg);
741 CustomerUpdateMsg customerUpdateMsg = (CustomerUpdateMsg) latestMessage; 844 CustomerUpdateMsg customerUpdateMsg = (CustomerUpdateMsg) latestMessage;
@@ -743,13 +846,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -743,13 +846,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
743 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits()); 846 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits());
744 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits()); 847 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits());
745 Assert.assertEquals(customerUpdateMsg.getTitle(), savedCustomer.getTitle()); 848 Assert.assertEquals(customerUpdateMsg.getTitle(), savedCustomer.getTitle());
746 -  
747 testAutoGeneratedCodeByProtobuf(customerUpdateMsg); 849 testAutoGeneratedCodeByProtobuf(customerUpdateMsg);
748 850
  851 + // 2
749 edgeImitator.expectMessageAmount(1); 852 edgeImitator.expectMessageAmount(1);
750 doDelete("/api/customer/edge/" + edge.getId().getId().toString(), Edge.class); 853 doDelete("/api/customer/edge/" + edge.getId().getId().toString(), Edge.class);
751 - edgeImitator.waitForMessages();  
752 - 854 + Assert.assertTrue(edgeImitator.waitForMessages());
753 latestMessage = edgeImitator.getLatestMessage(); 855 latestMessage = edgeImitator.getLatestMessage();
754 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg); 856 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg);
755 customerUpdateMsg = (CustomerUpdateMsg) latestMessage; 857 customerUpdateMsg = (CustomerUpdateMsg) latestMessage;
@@ -757,17 +859,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -757,17 +859,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
757 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits()); 859 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits());
758 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits()); 860 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits());
759 861
  862 + // 3
760 edgeImitator.expectMessageAmount(1); 863 edgeImitator.expectMessageAmount(1);
761 doDelete("/api/customer/" + savedCustomer.getId().getId().toString()) 864 doDelete("/api/customer/" + savedCustomer.getId().getId().toString())
762 .andExpect(status().isOk()); 865 .andExpect(status().isOk());
763 - edgeImitator.waitForMessages();  
764 -  
765 - latestMessage = edgeImitator.getLatestMessage();  
766 - Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg);  
767 - customerUpdateMsg = (CustomerUpdateMsg) latestMessage;  
768 - Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, customerUpdateMsg.getMsgType());  
769 - Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits());  
770 - Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits()); 866 + Assert.assertFalse(edgeImitator.waitForMessages(1));
771 867
772 log.info("Customer tested successfully"); 868 log.info("Customer tested successfully");
773 } 869 }
@@ -775,13 +871,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -775,13 +871,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
775 private void testWidgetsBundleAndWidgetType() throws Exception { 871 private void testWidgetsBundleAndWidgetType() throws Exception {
776 log.info("Testing WidgetsBundle and WidgetType"); 872 log.info("Testing WidgetsBundle and WidgetType");
777 873
  874 + // 1
  875 + edgeImitator.expectMessageAmount(1);
778 WidgetsBundle widgetsBundle = new WidgetsBundle(); 876 WidgetsBundle widgetsBundle = new WidgetsBundle();
779 widgetsBundle.setTitle("Test Widget Bundle"); 877 widgetsBundle.setTitle("Test Widget Bundle");
780 -  
781 - edgeImitator.expectMessageAmount(1);  
782 WidgetsBundle savedWidgetsBundle = doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class); 878 WidgetsBundle savedWidgetsBundle = doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class);
783 - edgeImitator.waitForMessages();  
784 - 879 + Assert.assertTrue(edgeImitator.waitForMessages());
785 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 880 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
786 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg); 881 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg);
787 WidgetsBundleUpdateMsg widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage; 882 WidgetsBundleUpdateMsg widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage;
@@ -790,20 +885,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -790,20 +885,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
790 Assert.assertEquals(widgetsBundleUpdateMsg.getIdLSB(), savedWidgetsBundle.getUuidId().getLeastSignificantBits()); 885 Assert.assertEquals(widgetsBundleUpdateMsg.getIdLSB(), savedWidgetsBundle.getUuidId().getLeastSignificantBits());
791 Assert.assertEquals(widgetsBundleUpdateMsg.getAlias(), savedWidgetsBundle.getAlias()); 886 Assert.assertEquals(widgetsBundleUpdateMsg.getAlias(), savedWidgetsBundle.getAlias());
792 Assert.assertEquals(widgetsBundleUpdateMsg.getTitle(), savedWidgetsBundle.getTitle()); 887 Assert.assertEquals(widgetsBundleUpdateMsg.getTitle(), savedWidgetsBundle.getTitle());
793 -  
794 testAutoGeneratedCodeByProtobuf(widgetsBundleUpdateMsg); 888 testAutoGeneratedCodeByProtobuf(widgetsBundleUpdateMsg);
795 889
  890 + // 2
  891 + edgeImitator.expectMessageAmount(1);
796 WidgetType widgetType = new WidgetType(); 892 WidgetType widgetType = new WidgetType();
797 widgetType.setName("Test Widget Type"); 893 widgetType.setName("Test Widget Type");
798 widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); 894 widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
799 ObjectNode descriptor = mapper.createObjectNode(); 895 ObjectNode descriptor = mapper.createObjectNode();
800 descriptor.put("key", "value"); 896 descriptor.put("key", "value");
801 widgetType.setDescriptor(descriptor); 897 widgetType.setDescriptor(descriptor);
802 -  
803 - edgeImitator.expectMessageAmount(1);  
804 WidgetType savedWidgetType = doPost("/api/widgetType", widgetType, WidgetType.class); 898 WidgetType savedWidgetType = doPost("/api/widgetType", widgetType, WidgetType.class);
805 - edgeImitator.waitForMessages();  
806 - 899 + Assert.assertTrue(edgeImitator.waitForMessages());
807 latestMessage = edgeImitator.getLatestMessage(); 900 latestMessage = edgeImitator.getLatestMessage();
808 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg); 901 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg);
809 WidgetTypeUpdateMsg widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage; 902 WidgetTypeUpdateMsg widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage;
@@ -814,11 +907,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -814,11 +907,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
814 Assert.assertEquals(widgetTypeUpdateMsg.getName(), savedWidgetType.getName()); 907 Assert.assertEquals(widgetTypeUpdateMsg.getName(), savedWidgetType.getName());
815 Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson()), savedWidgetType.getDescriptor()); 908 Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson()), savedWidgetType.getDescriptor());
816 909
  910 + // 3
817 edgeImitator.expectMessageAmount(1); 911 edgeImitator.expectMessageAmount(1);
818 doDelete("/api/widgetType/" + savedWidgetType.getId().getId().toString()) 912 doDelete("/api/widgetType/" + savedWidgetType.getId().getId().toString())
819 .andExpect(status().isOk()); 913 .andExpect(status().isOk());
820 - edgeImitator.waitForMessages();  
821 - 914 + Assert.assertTrue(edgeImitator.waitForMessages());
822 latestMessage = edgeImitator.getLatestMessage(); 915 latestMessage = edgeImitator.getLatestMessage();
823 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg); 916 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg);
824 widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage; 917 widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage;
@@ -826,11 +919,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -826,11 +919,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
826 Assert.assertEquals(widgetTypeUpdateMsg.getIdMSB(), savedWidgetType.getUuidId().getMostSignificantBits()); 919 Assert.assertEquals(widgetTypeUpdateMsg.getIdMSB(), savedWidgetType.getUuidId().getMostSignificantBits());
827 Assert.assertEquals(widgetTypeUpdateMsg.getIdLSB(), savedWidgetType.getUuidId().getLeastSignificantBits()); 920 Assert.assertEquals(widgetTypeUpdateMsg.getIdLSB(), savedWidgetType.getUuidId().getLeastSignificantBits());
828 921
  922 + // 4
829 edgeImitator.expectMessageAmount(1); 923 edgeImitator.expectMessageAmount(1);
830 doDelete("/api/widgetsBundle/" + savedWidgetsBundle.getId().getId().toString()) 924 doDelete("/api/widgetsBundle/" + savedWidgetsBundle.getId().getId().toString())
831 .andExpect(status().isOk()); 925 .andExpect(status().isOk());
832 - edgeImitator.waitForMessages();  
833 - 926 + Assert.assertTrue(edgeImitator.waitForMessages());
834 latestMessage = edgeImitator.getLatestMessage(); 927 latestMessage = edgeImitator.getLatestMessage();
835 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg); 928 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg);
836 widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage; 929 widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage;
@@ -843,15 +936,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -843,15 +936,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
843 936
844 private void testTimeseries() throws Exception { 937 private void testTimeseries() throws Exception {
845 log.info("Testing timeseries"); 938 log.info("Testing timeseries");
846 - Device device = findDeviceByName("Edge Device 1");  
847 939
  940 + edgeImitator.expectMessageAmount(1);
  941 + Device device = findDeviceByName("Edge Device 1");
848 String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}"; 942 String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}";
849 JsonNode timeseriesEntityData = mapper.readTree(timeseriesData); 943 JsonNode timeseriesEntityData = mapper.readTree(timeseriesData);
850 - EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);  
851 - edgeImitator.expectMessageAmount(1);  
852 - edgeEventService.saveAsync(edgeEvent1); 944 + EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
  945 + edgeEventService.saveAsync(edgeEvent);
853 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 946 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
854 - edgeImitator.waitForMessages(); 947 + Assert.assertTrue(edgeImitator.waitForMessages());
855 948
856 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 949 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
857 Assert.assertTrue(latestMessage instanceof EntityDataProto); 950 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -890,7 +983,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -890,7 +983,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
890 edgeImitator.expectMessageAmount(1); 983 edgeImitator.expectMessageAmount(1);
891 edgeEventService.saveAsync(edgeEvent); 984 edgeEventService.saveAsync(edgeEvent);
892 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 985 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
893 - edgeImitator.waitForMessages(); 986 + Assert.assertTrue(edgeImitator.waitForMessages());
894 987
895 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 988 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
896 Assert.assertTrue(latestMessage instanceof EntityDataProto); 989 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -916,7 +1009,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -916,7 +1009,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
916 edgeImitator.expectMessageAmount(1); 1009 edgeImitator.expectMessageAmount(1);
917 edgeEventService.saveAsync(edgeEvent); 1010 edgeEventService.saveAsync(edgeEvent);
918 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 1011 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
919 - edgeImitator.waitForMessages(); 1012 + Assert.assertTrue(edgeImitator.waitForMessages());
920 1013
921 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1014 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
922 Assert.assertTrue(latestMessage instanceof EntityDataProto); 1015 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -941,7 +1034,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -941,7 +1034,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
941 edgeImitator.expectMessageAmount(1); 1034 edgeImitator.expectMessageAmount(1);
942 edgeEventService.saveAsync(edgeEvent1); 1035 edgeEventService.saveAsync(edgeEvent1);
943 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 1036 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
944 - edgeImitator.waitForMessages(); 1037 + Assert.assertTrue(edgeImitator.waitForMessages());
945 1038
946 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1039 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
947 Assert.assertTrue(latestMessage instanceof EntityDataProto); 1040 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -996,8 +1089,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -996,8 +1089,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
996 1089
997 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1090 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
998 1091
999 - edgeImitator.waitForResponses();  
1000 - edgeImitator.waitForMessages(); 1092 + Assert.assertTrue(edgeImitator.waitForResponses());
  1093 + Assert.assertTrue(edgeImitator.waitForMessages());
1001 1094
1002 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1095 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1003 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 1096 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
@@ -1013,7 +1106,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1013,7 +1106,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1013 1106
1014 private void sendDeviceWithNameThatAlreadyExistsOnCloud() throws Exception { 1107 private void sendDeviceWithNameThatAlreadyExistsOnCloud() throws Exception {
1015 String deviceOnCloudName = RandomStringUtils.randomAlphanumeric(15); 1108 String deviceOnCloudName = RandomStringUtils.randomAlphanumeric(15);
1016 - Device deviceOnCloud = saveDevice(deviceOnCloudName); 1109 + Device deviceOnCloud = saveDevice(deviceOnCloudName, "Default");
1017 1110
1018 UUID uuid = Uuids.timeBased(); 1111 UUID uuid = Uuids.timeBased();
1019 1112
@@ -1033,8 +1126,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1033,8 +1126,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1033 1126
1034 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1127 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1035 1128
1036 - edgeImitator.waitForResponses();  
1037 - edgeImitator.waitForMessages(); 1129 + Assert.assertTrue(edgeImitator.waitForResponses());
  1130 + Assert.assertTrue(edgeImitator.waitForMessages());
1038 1131
1039 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1132 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1040 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 1133 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
@@ -1063,7 +1156,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1063,7 +1156,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1063 1156
1064 edgeImitator.expectMessageAmount(1); 1157 edgeImitator.expectMessageAmount(1);
1065 doPost("/api/relation", relation); 1158 doPost("/api/relation", relation);
1066 - edgeImitator.waitForMessages(); 1159 + Assert.assertTrue(edgeImitator.waitForMessages());
1067 1160
1068 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); 1161 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
1069 RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder(); 1162 RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder();
@@ -1078,8 +1171,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1078,8 +1171,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1078 edgeImitator.expectResponsesAmount(1); 1171 edgeImitator.expectResponsesAmount(1);
1079 edgeImitator.expectMessageAmount(1); 1172 edgeImitator.expectMessageAmount(1);
1080 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1173 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1081 - edgeImitator.waitForResponses();  
1082 - edgeImitator.waitForMessages(); 1174 + Assert.assertTrue(edgeImitator.waitForResponses());
  1175 + Assert.assertTrue(edgeImitator.waitForMessages());
1083 1176
1084 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1177 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1085 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg); 1178 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
@@ -1115,7 +1208,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1115,7 +1208,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1115 1208
1116 edgeImitator.expectResponsesAmount(1); 1209 edgeImitator.expectResponsesAmount(1);
1117 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1210 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1118 - edgeImitator.waitForResponses(); 1211 + Assert.assertTrue(edgeImitator.waitForResponses());
1119 1212
1120 1213
1121 List<AlarmInfo> alarms = doGetTypedWithPageLink("/api/alarm/{entityType}/{entityId}?", 1214 List<AlarmInfo> alarms = doGetTypedWithPageLink("/api/alarm/{entityType}/{entityId}?",
@@ -1158,7 +1251,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1158,7 +1251,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1158 1251
1159 edgeImitator.expectResponsesAmount(1); 1252 edgeImitator.expectResponsesAmount(1);
1160 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1253 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1161 - edgeImitator.waitForResponses(); 1254 + Assert.assertTrue(edgeImitator.waitForResponses());
1162 1255
1163 EntityRelation relation = doGet("/api/relation?" + 1256 EntityRelation relation = doGet("/api/relation?" +
1164 "&fromId=" + device2.getId().getId().toString() + 1257 "&fromId=" + device2.getId().getId().toString() +
@@ -1212,7 +1305,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1212,7 +1305,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1212 testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder2); 1305 testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder2);
1213 1306
1214 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build()); 1307 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build());
1215 - edgeImitator.waitForResponses(); 1308 + Assert.assertTrue(edgeImitator.waitForResponses());
1216 1309
1217 // Wait before device attributes saved to database before requesting them from controller 1310 // Wait before device attributes saved to database before requesting them from controller
1218 Thread.sleep(1000); 1311 Thread.sleep(1000);
@@ -1243,8 +1336,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1243,8 +1336,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1243 edgeImitator.expectResponsesAmount(1); 1336 edgeImitator.expectResponsesAmount(1);
1244 edgeImitator.expectMessageAmount(1); 1337 edgeImitator.expectMessageAmount(1);
1245 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1338 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1246 - edgeImitator.waitForResponses();  
1247 - edgeImitator.waitForMessages(); 1339 + Assert.assertTrue(edgeImitator.waitForResponses());
  1340 + Assert.assertTrue(edgeImitator.waitForMessages());;
1248 1341
1249 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1342 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1250 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg); 1343 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
@@ -1270,8 +1363,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1270,8 +1363,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1270 edgeImitator.expectResponsesAmount(1); 1363 edgeImitator.expectResponsesAmount(1);
1271 edgeImitator.expectMessageAmount(1); 1364 edgeImitator.expectMessageAmount(1);
1272 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1365 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1273 - edgeImitator.waitForResponses();  
1274 - edgeImitator.waitForMessages(); 1366 + Assert.assertTrue(edgeImitator.waitForResponses());
  1367 + Assert.assertTrue(edgeImitator.waitForMessages());
1275 1368
1276 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1369 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1277 Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg); 1370 Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
@@ -1299,8 +1392,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1299,8 +1392,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1299 edgeImitator.expectResponsesAmount(1); 1392 edgeImitator.expectResponsesAmount(1);
1300 edgeImitator.expectMessageAmount(1); 1393 edgeImitator.expectMessageAmount(1);
1301 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1394 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1302 - edgeImitator.waitForResponses();  
1303 - edgeImitator.waitForMessages(); 1395 + Assert.assertTrue(edgeImitator.waitForResponses());
  1396 + Assert.assertTrue(edgeImitator.waitForMessages());
1304 1397
1305 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1398 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1306 Assert.assertTrue(latestMessage instanceof DeviceCredentialsUpdateMsg); 1399 Assert.assertTrue(latestMessage instanceof DeviceCredentialsUpdateMsg);
@@ -1327,7 +1420,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1327,7 +1420,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1327 1420
1328 edgeImitator.expectResponsesAmount(1); 1421 edgeImitator.expectResponsesAmount(1);
1329 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1422 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1330 - edgeImitator.waitForResponses(); 1423 + Assert.assertTrue(edgeImitator.waitForResponses());
1331 } 1424 }
1332 1425
1333 private void sendDeviceRpcResponse() throws Exception { 1426 private void sendDeviceRpcResponse() throws Exception {
@@ -1352,7 +1445,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1352,7 +1445,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1352 1445
1353 edgeImitator.expectResponsesAmount(1); 1446 edgeImitator.expectResponsesAmount(1);
1354 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1447 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1355 - edgeImitator.waitForResponses(); 1448 + Assert.assertTrue(edgeImitator.waitForResponses());
1356 } 1449 }
1357 1450
1358 private void sendAttributesRequest() throws Exception { 1451 private void sendAttributesRequest() throws Exception {
@@ -1383,8 +1476,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1383,8 +1476,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1383 edgeImitator.expectResponsesAmount(1); 1476 edgeImitator.expectResponsesAmount(1);
1384 edgeImitator.expectMessageAmount(1); 1477 edgeImitator.expectMessageAmount(1);
1385 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1478 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1386 - edgeImitator.waitForResponses();  
1387 - edgeImitator.waitForMessages(); 1479 + Assert.assertTrue(edgeImitator.waitForResponses());
  1480 + Assert.assertTrue(edgeImitator.waitForMessages());
1388 1481
1389 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1482 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1390 Assert.assertTrue(latestMessage instanceof EntityDataProto); 1483 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -1416,7 +1509,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1416,7 +1509,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1416 1509
1417 edgeImitator.expectResponsesAmount(1); 1510 edgeImitator.expectResponsesAmount(1);
1418 edgeImitator.sendUplinkMsg(upLinkMsgBuilder.build()); 1511 edgeImitator.sendUplinkMsg(upLinkMsgBuilder.build());
1419 - edgeImitator.waitForResponses(); 1512 + Assert.assertTrue(edgeImitator.waitForResponses());
1420 device = doGet("/api/device/" + device.getId().getId().toString(), Device.class); 1513 device = doGet("/api/device/" + device.getId().getId().toString(), Device.class);
1421 Assert.assertNotNull(device); 1514 Assert.assertNotNull(device);
1422 List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", 1515 List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
@@ -1428,7 +1521,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1428,7 +1521,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1428 private void installation() throws Exception { 1521 private void installation() throws Exception {
1429 edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class); 1522 edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class);
1430 1523
1431 - Device savedDevice = saveDevice("Edge Device 1"); 1524 + DeviceProfile deviceProfile = this.createDeviceProfile(CUSTOM_DEVICE_PROFILE_NAME, null);
  1525 + extendDeviceProfileData(deviceProfile);
  1526 + doPost("/api/deviceProfile", deviceProfile, DeviceProfile.class);
  1527 +
  1528 + Device savedDevice = saveDevice("Edge Device 1", CUSTOM_DEVICE_PROFILE_NAME);
1432 doPost("/api/edge/" + edge.getId().getId().toString() 1529 doPost("/api/edge/" + edge.getId().getId().toString()
1433 + "/device/" + savedDevice.getId().getId().toString(), Device.class); 1530 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
1434 1531
@@ -1437,6 +1534,35 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1437,6 +1534,35 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1437 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); 1534 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
1438 } 1535 }
1439 1536
  1537 + private void extendDeviceProfileData(DeviceProfile deviceProfile) {
  1538 + DeviceProfileData profileData = deviceProfile.getProfileData();
  1539 + List<DeviceProfileAlarm> alarms = new ArrayList<>();
  1540 + DeviceProfileAlarm deviceProfileAlarm = new DeviceProfileAlarm();
  1541 + deviceProfileAlarm.setAlarmType("High Temperature");
  1542 + AlarmRule alarmRule = new AlarmRule();
  1543 + alarmRule.setAlarmDetails("Alarm Details");
  1544 + AlarmCondition alarmCondition = new AlarmCondition();
  1545 + alarmCondition.setSpec(new SimpleAlarmConditionSpec());
  1546 + List<AlarmConditionFilter> condition = new ArrayList<>();
  1547 + AlarmConditionFilter alarmConditionFilter = new AlarmConditionFilter();
  1548 + alarmConditionFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.ATTRIBUTE, "temperature"));
  1549 + NumericFilterPredicate predicate = new NumericFilterPredicate();
  1550 + predicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER);
  1551 + predicate.setValue(new FilterPredicateValue<>(55.0));
  1552 + alarmConditionFilter.setPredicate(predicate);
  1553 + alarmConditionFilter.setValueType(EntityKeyValueType.NUMERIC);
  1554 + condition.add(alarmConditionFilter);
  1555 + alarmCondition.setCondition(condition);
  1556 + alarmRule.setCondition(alarmCondition);
  1557 + deviceProfileAlarm.setClearRule(alarmRule);
  1558 + TreeMap<AlarmSeverity, AlarmRule> createRules = new TreeMap<>();
  1559 + createRules.put(AlarmSeverity.CRITICAL, alarmRule);
  1560 + deviceProfileAlarm.setCreateRules(createRules);
  1561 + alarms.add(deviceProfileAlarm);
  1562 + profileData.setAlarms(alarms);
  1563 + profileData.setProvisionConfiguration(new AllowCreateNewDevicesDeviceProfileProvisionConfiguration("123"));
  1564 + }
  1565 +
1440 private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) { 1566 private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) {
1441 EdgeEvent edgeEvent = new EdgeEvent(); 1567 EdgeEvent edgeEvent = new EdgeEvent();
1442 edgeEvent.setEdgeId(edgeId); 1568 edgeEvent.setEdgeId(edgeId);
@@ -32,6 +32,7 @@ import org.thingsboard.server.gen.edge.CustomerUpdateMsg; @@ -32,6 +32,7 @@ import org.thingsboard.server.gen.edge.CustomerUpdateMsg;
32 import org.thingsboard.server.gen.edge.DashboardUpdateMsg; 32 import org.thingsboard.server.gen.edge.DashboardUpdateMsg;
33 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; 33 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg;
34 import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg; 34 import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg;
  35 +import org.thingsboard.server.gen.edge.DeviceProfileUpdateMsg;
35 import org.thingsboard.server.gen.edge.DeviceRpcCallMsg; 36 import org.thingsboard.server.gen.edge.DeviceRpcCallMsg;
36 import org.thingsboard.server.gen.edge.DeviceUpdateMsg; 37 import org.thingsboard.server.gen.edge.DeviceUpdateMsg;
37 import org.thingsboard.server.gen.edge.DownlinkMsg; 38 import org.thingsboard.server.gen.edge.DownlinkMsg;
@@ -58,6 +59,7 @@ import java.util.concurrent.CountDownLatch; @@ -58,6 +59,7 @@ import java.util.concurrent.CountDownLatch;
58 import java.util.concurrent.TimeUnit; 59 import java.util.concurrent.TimeUnit;
59 import java.util.concurrent.locks.Lock; 60 import java.util.concurrent.locks.Lock;
60 import java.util.concurrent.locks.ReentrantLock; 61 import java.util.concurrent.locks.ReentrantLock;
  62 +import java.util.stream.Collectors;
61 63
62 @Slf4j 64 @Slf4j
63 public class EdgeImitator { 65 public class EdgeImitator {
@@ -154,88 +156,93 @@ public class EdgeImitator { @@ -154,88 +156,93 @@ public class EdgeImitator {
154 156
155 private ListenableFuture<List<Void>> processDownlinkMsg(DownlinkMsg downlinkMsg) { 157 private ListenableFuture<List<Void>> processDownlinkMsg(DownlinkMsg downlinkMsg) {
156 List<ListenableFuture<Void>> result = new ArrayList<>(); 158 List<ListenableFuture<Void>> result = new ArrayList<>();
157 - if (downlinkMsg.getDeviceUpdateMsgList() != null && !downlinkMsg.getDeviceUpdateMsgList().isEmpty()) { 159 + if (downlinkMsg.getDeviceUpdateMsgCount() > 0) {
158 for (DeviceUpdateMsg deviceUpdateMsg: downlinkMsg.getDeviceUpdateMsgList()) { 160 for (DeviceUpdateMsg deviceUpdateMsg: downlinkMsg.getDeviceUpdateMsgList()) {
159 result.add(saveDownlinkMsg(deviceUpdateMsg)); 161 result.add(saveDownlinkMsg(deviceUpdateMsg));
160 } 162 }
161 } 163 }
162 - if (downlinkMsg.getDeviceCredentialsUpdateMsgList() != null && !downlinkMsg.getDeviceCredentialsUpdateMsgList().isEmpty()) { 164 + if (downlinkMsg.getDeviceProfileUpdateMsgCount() > 0) {
  165 + for (DeviceProfileUpdateMsg deviceProfileUpdateMsg : downlinkMsg.getDeviceProfileUpdateMsgList()) {
  166 + result.add(saveDownlinkMsg(deviceProfileUpdateMsg));
  167 + }
  168 + }
  169 + if (downlinkMsg.getDeviceCredentialsUpdateMsgCount() > 0) {
163 for (DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg: downlinkMsg.getDeviceCredentialsUpdateMsgList()) { 170 for (DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg: downlinkMsg.getDeviceCredentialsUpdateMsgList()) {
164 result.add(saveDownlinkMsg(deviceCredentialsUpdateMsg)); 171 result.add(saveDownlinkMsg(deviceCredentialsUpdateMsg));
165 } 172 }
166 } 173 }
167 - if (downlinkMsg.getAssetUpdateMsgList() != null && !downlinkMsg.getAssetUpdateMsgList().isEmpty()) { 174 + if (downlinkMsg.getAssetUpdateMsgCount() > 0) {
168 for (AssetUpdateMsg assetUpdateMsg: downlinkMsg.getAssetUpdateMsgList()) { 175 for (AssetUpdateMsg assetUpdateMsg: downlinkMsg.getAssetUpdateMsgList()) {
169 result.add(saveDownlinkMsg(assetUpdateMsg)); 176 result.add(saveDownlinkMsg(assetUpdateMsg));
170 } 177 }
171 } 178 }
172 - if (downlinkMsg.getRuleChainUpdateMsgList() != null && !downlinkMsg.getRuleChainUpdateMsgList().isEmpty()) { 179 + if (downlinkMsg.getRuleChainUpdateMsgCount() > 0) {
173 for (RuleChainUpdateMsg ruleChainUpdateMsg: downlinkMsg.getRuleChainUpdateMsgList()) { 180 for (RuleChainUpdateMsg ruleChainUpdateMsg: downlinkMsg.getRuleChainUpdateMsgList()) {
174 result.add(saveDownlinkMsg(ruleChainUpdateMsg)); 181 result.add(saveDownlinkMsg(ruleChainUpdateMsg));
175 } 182 }
176 } 183 }
177 - if (downlinkMsg.getRuleChainMetadataUpdateMsgList() != null && !downlinkMsg.getRuleChainMetadataUpdateMsgList().isEmpty()) { 184 + if (downlinkMsg.getRuleChainMetadataUpdateMsgCount() > 0) {
178 for (RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg: downlinkMsg.getRuleChainMetadataUpdateMsgList()) { 185 for (RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg: downlinkMsg.getRuleChainMetadataUpdateMsgList()) {
179 result.add(saveDownlinkMsg(ruleChainMetadataUpdateMsg)); 186 result.add(saveDownlinkMsg(ruleChainMetadataUpdateMsg));
180 } 187 }
181 } 188 }
182 - if (downlinkMsg.getDashboardUpdateMsgList() != null && !downlinkMsg.getDashboardUpdateMsgList().isEmpty()) { 189 + if (downlinkMsg.getDashboardUpdateMsgCount() > 0) {
183 for (DashboardUpdateMsg dashboardUpdateMsg: downlinkMsg.getDashboardUpdateMsgList()) { 190 for (DashboardUpdateMsg dashboardUpdateMsg: downlinkMsg.getDashboardUpdateMsgList()) {
184 result.add(saveDownlinkMsg(dashboardUpdateMsg)); 191 result.add(saveDownlinkMsg(dashboardUpdateMsg));
185 } 192 }
186 } 193 }
187 - if (downlinkMsg.getRelationUpdateMsgList() != null && !downlinkMsg.getRelationUpdateMsgList().isEmpty()) { 194 + if (downlinkMsg.getRelationUpdateMsgCount() > 0) {
188 for (RelationUpdateMsg relationUpdateMsg: downlinkMsg.getRelationUpdateMsgList()) { 195 for (RelationUpdateMsg relationUpdateMsg: downlinkMsg.getRelationUpdateMsgList()) {
189 result.add(saveDownlinkMsg(relationUpdateMsg)); 196 result.add(saveDownlinkMsg(relationUpdateMsg));
190 } 197 }
191 } 198 }
192 - if (downlinkMsg.getAlarmUpdateMsgList() != null && !downlinkMsg.getAlarmUpdateMsgList().isEmpty()) { 199 + if (downlinkMsg.getAlarmUpdateMsgCount() > 0) {
193 for (AlarmUpdateMsg alarmUpdateMsg: downlinkMsg.getAlarmUpdateMsgList()) { 200 for (AlarmUpdateMsg alarmUpdateMsg: downlinkMsg.getAlarmUpdateMsgList()) {
194 result.add(saveDownlinkMsg(alarmUpdateMsg)); 201 result.add(saveDownlinkMsg(alarmUpdateMsg));
195 } 202 }
196 } 203 }
197 - if (downlinkMsg.getEntityDataList() != null && !downlinkMsg.getEntityDataList().isEmpty()) { 204 + if (downlinkMsg.getEntityDataCount() > 0) {
198 for (EntityDataProto entityData: downlinkMsg.getEntityDataList()) { 205 for (EntityDataProto entityData: downlinkMsg.getEntityDataList()) {
199 result.add(saveDownlinkMsg(entityData)); 206 result.add(saveDownlinkMsg(entityData));
200 } 207 }
201 } 208 }
202 - if (downlinkMsg.getEntityViewUpdateMsgList() != null && !downlinkMsg.getEntityViewUpdateMsgList().isEmpty()) { 209 + if (downlinkMsg.getEntityViewUpdateMsgCount() > 0) {
203 for (EntityViewUpdateMsg entityViewUpdateMsg: downlinkMsg.getEntityViewUpdateMsgList()) { 210 for (EntityViewUpdateMsg entityViewUpdateMsg: downlinkMsg.getEntityViewUpdateMsgList()) {
204 result.add(saveDownlinkMsg(entityViewUpdateMsg)); 211 result.add(saveDownlinkMsg(entityViewUpdateMsg));
205 } 212 }
206 } 213 }
207 - if (downlinkMsg.getCustomerUpdateMsgList() != null && !downlinkMsg.getCustomerUpdateMsgList().isEmpty()) { 214 + if (downlinkMsg.getCustomerUpdateMsgCount() > 0) {
208 for (CustomerUpdateMsg customerUpdateMsg: downlinkMsg.getCustomerUpdateMsgList()) { 215 for (CustomerUpdateMsg customerUpdateMsg: downlinkMsg.getCustomerUpdateMsgList()) {
209 result.add(saveDownlinkMsg(customerUpdateMsg)); 216 result.add(saveDownlinkMsg(customerUpdateMsg));
210 } 217 }
211 } 218 }
212 - if (downlinkMsg.getWidgetsBundleUpdateMsgList() != null && !downlinkMsg.getWidgetsBundleUpdateMsgList().isEmpty()) { 219 + if (downlinkMsg.getWidgetsBundleUpdateMsgCount() > 0) {
213 for (WidgetsBundleUpdateMsg widgetsBundleUpdateMsg: downlinkMsg.getWidgetsBundleUpdateMsgList()) { 220 for (WidgetsBundleUpdateMsg widgetsBundleUpdateMsg: downlinkMsg.getWidgetsBundleUpdateMsgList()) {
214 result.add(saveDownlinkMsg(widgetsBundleUpdateMsg)); 221 result.add(saveDownlinkMsg(widgetsBundleUpdateMsg));
215 } 222 }
216 } 223 }
217 - if (downlinkMsg.getWidgetTypeUpdateMsgList() != null && !downlinkMsg.getWidgetTypeUpdateMsgList().isEmpty()) { 224 + if (downlinkMsg.getWidgetTypeUpdateMsgCount() > 0) {
218 for (WidgetTypeUpdateMsg widgetTypeUpdateMsg: downlinkMsg.getWidgetTypeUpdateMsgList()) { 225 for (WidgetTypeUpdateMsg widgetTypeUpdateMsg: downlinkMsg.getWidgetTypeUpdateMsgList()) {
219 result.add(saveDownlinkMsg(widgetTypeUpdateMsg)); 226 result.add(saveDownlinkMsg(widgetTypeUpdateMsg));
220 } 227 }
221 } 228 }
222 - if (downlinkMsg.getUserUpdateMsgList() != null && !downlinkMsg.getUserUpdateMsgList().isEmpty()) { 229 + if (downlinkMsg.getUserUpdateMsgCount() > 0) {
223 for (UserUpdateMsg userUpdateMsg: downlinkMsg.getUserUpdateMsgList()) { 230 for (UserUpdateMsg userUpdateMsg: downlinkMsg.getUserUpdateMsgList()) {
224 onUserUpdate(userUpdateMsg); 231 onUserUpdate(userUpdateMsg);
225 result.add(saveDownlinkMsg(userUpdateMsg)); 232 result.add(saveDownlinkMsg(userUpdateMsg));
226 } 233 }
227 } 234 }
228 - if (downlinkMsg.getUserCredentialsUpdateMsgList() != null && !downlinkMsg.getUserCredentialsUpdateMsgList().isEmpty()) { 235 + if (downlinkMsg.getUserCredentialsUpdateMsgCount() > 0) {
229 for (UserCredentialsUpdateMsg userCredentialsUpdateMsg: downlinkMsg.getUserCredentialsUpdateMsgList()) { 236 for (UserCredentialsUpdateMsg userCredentialsUpdateMsg: downlinkMsg.getUserCredentialsUpdateMsgList()) {
230 result.add(saveDownlinkMsg(userCredentialsUpdateMsg)); 237 result.add(saveDownlinkMsg(userCredentialsUpdateMsg));
231 } 238 }
232 } 239 }
233 - if (downlinkMsg.getDeviceRpcCallMsgList() != null && !downlinkMsg.getDeviceRpcCallMsgList().isEmpty()) { 240 + if (downlinkMsg.getDeviceRpcCallMsgCount() > 0) {
234 for (DeviceRpcCallMsg deviceRpcCallMsg: downlinkMsg.getDeviceRpcCallMsgList()) { 241 for (DeviceRpcCallMsg deviceRpcCallMsg: downlinkMsg.getDeviceRpcCallMsgList()) {
235 result.add(saveDownlinkMsg(deviceRpcCallMsg)); 242 result.add(saveDownlinkMsg(deviceRpcCallMsg));
236 } 243 }
237 } 244 }
238 - if (downlinkMsg.getDeviceCredentialsRequestMsgList() != null && !downlinkMsg.getDeviceCredentialsRequestMsgList().isEmpty()) { 245 + if (downlinkMsg.getDeviceCredentialsRequestMsgCount() > 0) {
239 for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg: downlinkMsg.getDeviceCredentialsRequestMsgList()) { 246 for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg: downlinkMsg.getDeviceCredentialsRequestMsgList()) {
240 result.add(saveDownlinkMsg(deviceCredentialsRequestMsg)); 247 result.add(saveDownlinkMsg(deviceCredentialsRequestMsg));
241 } 248 }
@@ -256,15 +263,21 @@ public class EdgeImitator { @@ -256,15 +263,21 @@ public class EdgeImitator {
256 return Futures.immediateFuture(null); 263 return Futures.immediateFuture(null);
257 } 264 }
258 265
259 - public void waitForMessages() throws InterruptedException {  
260 - messagesLatch.await(5, TimeUnit.SECONDS); 266 + public boolean waitForMessages() throws InterruptedException {
  267 + return waitForMessages(5);
  268 + }
  269 +
  270 + public boolean waitForMessages(int timeout) throws InterruptedException {
  271 + return messagesLatch.await(timeout, TimeUnit.SECONDS);
261 } 272 }
262 273
263 public void expectMessageAmount(int messageAmount) { 274 public void expectMessageAmount(int messageAmount) {
264 messagesLatch = new CountDownLatch(messageAmount); 275 messagesLatch = new CountDownLatch(messageAmount);
265 } 276 }
266 277
267 - public void waitForResponses() throws InterruptedException { responsesLatch.await(5, TimeUnit.SECONDS); } 278 + public boolean waitForResponses() throws InterruptedException {
  279 + return responsesLatch.await(5, TimeUnit.SECONDS);
  280 + }
268 281
269 public void expectResponsesAmount(int messageAmount) { 282 public void expectResponsesAmount(int messageAmount) {
270 responsesLatch = new CountDownLatch(messageAmount); 283 responsesLatch = new CountDownLatch(messageAmount);
@@ -282,6 +295,18 @@ public class EdgeImitator { @@ -282,6 +295,18 @@ public class EdgeImitator {
282 return result; 295 return result;
283 } 296 }
284 297
  298 + @SuppressWarnings("unchecked")
  299 + public <T extends AbstractMessage> List<T> findAllMessagesByType(Class<T> tClass) {
  300 + List<T> result;
  301 + try {
  302 + lock.lock();
  303 + result = (List<T>) downlinkMsgs.stream().filter(downlinkMsg -> downlinkMsg.getClass().isAssignableFrom(tClass)).collect(Collectors.toList());
  304 + } finally {
  305 + lock.unlock();
  306 + }
  307 + return result;
  308 + }
  309 +
285 public AbstractMessage getLatestMessage() { 310 public AbstractMessage getLatestMessage() {
286 return downlinkMsgs.get(downlinkMsgs.size() - 1); 311 return downlinkMsgs.get(downlinkMsgs.size() - 1);
287 } 312 }