Commit ba1aa7a579edd79e7b66dcc9157fae3339af6399

Authored by Volodymyr Babak
1 parent 206a3d38

Base Edge test - refactoring and stability fixes. Device Profile processor null …

…pointer exception fix is provision is not set
@@ -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 }
@@ -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,49 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -163,23 +186,49 @@ 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 + Assert.assertEquals(10, edgeImitator.getDownlinkMsgs().size());
  193 +
170 testDevices(); 194 testDevices();
  195 + Assert.assertEquals(14, edgeImitator.getDownlinkMsgs().size());
  196 +
171 testAssets(); 197 testAssets();
  198 + Assert.assertEquals(18, edgeImitator.getDownlinkMsgs().size());
  199 +
172 testRuleChains(); 200 testRuleChains();
  201 + Assert.assertEquals(21, edgeImitator.getDownlinkMsgs().size());
  202 +
173 testDashboards(); 203 testDashboards();
  204 + Assert.assertEquals(24, edgeImitator.getDownlinkMsgs().size());
  205 +
174 testRelations(); 206 testRelations();
  207 + Assert.assertEquals(26, edgeImitator.getDownlinkMsgs().size());
  208 +
175 testAlarms(); 209 testAlarms();
  210 + Assert.assertEquals(29, edgeImitator.getDownlinkMsgs().size());
  211 +
176 testEntityView(); 212 testEntityView();
  213 + Assert.assertEquals(31, edgeImitator.getDownlinkMsgs().size());
  214 +
177 testCustomer(); 215 testCustomer();
  216 + Assert.assertEquals(33, edgeImitator.getDownlinkMsgs().size());
  217 +
178 testWidgetsBundleAndWidgetType(); 218 testWidgetsBundleAndWidgetType();
  219 + Assert.assertEquals(37, edgeImitator.getDownlinkMsgs().size());
  220 +
179 testTimeseries(); 221 testTimeseries();
  222 + Assert.assertEquals(38, edgeImitator.getDownlinkMsgs().size());
  223 +
180 testAttributes(); 224 testAttributes();
  225 + Assert.assertEquals(41, edgeImitator.getDownlinkMsgs().size());
  226 +
181 testSendMessagesToCloud(); 227 testSendMessagesToCloud();
  228 + Assert.assertEquals(50, edgeImitator.getDownlinkMsgs().size());
  229 +
182 testRpcCall(); 230 testRpcCall();
  231 + Assert.assertEquals(51, edgeImitator.getDownlinkMsgs().size());
183 } 232 }
184 233
185 private Device findDeviceByName(String deviceName) throws Exception { 234 private Device findDeviceByName(String deviceName) throws Exception {
@@ -204,10 +253,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -204,10 +253,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
204 return asset; 253 return asset;
205 } 254 }
206 255
207 - private Device saveDevice(String deviceName) throws Exception { 256 + private Device saveDevice(String deviceName, String type) throws Exception {
208 Device device = new Device(); 257 Device device = new Device();
209 device.setName(deviceName); 258 device.setName(deviceName);
210 - device.setType("test"); 259 + device.setType(type);
211 return doPost("/api/device", device, Device.class); 260 return doPost("/api/device", device, Device.class);
212 } 261 }
213 262
@@ -233,7 +282,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -233,7 +282,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
233 edgeImitator.expectMessageAmount(1); 282 edgeImitator.expectMessageAmount(1);
234 edgeEventService.saveAsync(edgeEvent); 283 edgeEventService.saveAsync(edgeEvent);
235 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 284 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
236 - edgeImitator.waitForMessages(); 285 + Assert.assertTrue(edgeImitator.waitForMessages());
237 286
238 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 287 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
239 Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg); 288 Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg);
@@ -243,7 +292,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -243,7 +292,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
243 292
244 private void testReceivedInitialData() throws Exception { 293 private void testReceivedInitialData() throws Exception {
245 log.info("Checking received data"); 294 log.info("Checking received data");
246 - edgeImitator.waitForMessages(); 295 + Assert.assertTrue(edgeImitator.waitForMessages());
247 296
248 EdgeConfiguration configuration = edgeImitator.getConfiguration(); 297 EdgeConfiguration configuration = edgeImitator.getConfiguration();
249 Assert.assertNotNull(configuration); 298 Assert.assertNotNull(configuration);
@@ -253,9 +302,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -253,9 +302,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
253 UserId userId = edgeImitator.getUserId(); 302 UserId userId = edgeImitator.getUserId();
254 Assert.assertNotNull(userId); 303 Assert.assertNotNull(userId);
255 304
256 - Optional<DeviceUpdateMsg> optionalMsg1 = edgeImitator.findMessageByType(DeviceUpdateMsg.class);  
257 - Assert.assertTrue(optionalMsg1.isPresent());  
258 - DeviceUpdateMsg deviceUpdateMsg = optionalMsg1.get(); 305 + Optional<DeviceUpdateMsg> deviceUpdateMsgOpt = edgeImitator.findMessageByType(DeviceUpdateMsg.class);
  306 + Assert.assertTrue(deviceUpdateMsgOpt.isPresent());
  307 + DeviceUpdateMsg deviceUpdateMsg = deviceUpdateMsgOpt.get();
259 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType()); 308 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
260 UUID deviceUUID = new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB()); 309 UUID deviceUUID = new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB());
261 Device device = doGet("/api/device/" + deviceUUID.toString(), Device.class); 310 Device device = doGet("/api/device/" + deviceUUID.toString(), Device.class);
@@ -264,9 +313,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -264,9 +313,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
264 new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData(); 313 new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
265 Assert.assertTrue(edgeDevices.contains(device)); 314 Assert.assertTrue(edgeDevices.contains(device));
266 315
267 - Optional<AssetUpdateMsg> optionalMsg2 = edgeImitator.findMessageByType(AssetUpdateMsg.class);  
268 - Assert.assertTrue(optionalMsg2.isPresent());  
269 - AssetUpdateMsg assetUpdateMsg = optionalMsg2.get(); 316 + List<DeviceProfileUpdateMsg> deviceProfileUpdateMsgList = edgeImitator.findAllMessagesByType(DeviceProfileUpdateMsg.class);
  317 + Assert.assertEquals(3, deviceProfileUpdateMsgList.size());
  318 + Optional<DeviceProfileUpdateMsg> deviceProfileUpdateMsgOpt =
  319 + deviceProfileUpdateMsgList.stream().filter(dfum -> CUSTOM_DEVICE_PROFILE_NAME.equals(dfum.getName())).findAny();
  320 + Assert.assertTrue(deviceProfileUpdateMsgOpt.isPresent());
  321 + DeviceProfileUpdateMsg deviceProfileUpdateMsg = deviceProfileUpdateMsgOpt.get();
  322 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType());
  323 + UUID deviceProfileUUID = new UUID(deviceProfileUpdateMsg.getIdMSB(), deviceProfileUpdateMsg.getIdLSB());
  324 + DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + deviceProfileUUID.toString(), DeviceProfile.class);
  325 + Assert.assertNotNull(deviceProfile);
  326 + Assert.assertNotNull(deviceProfile.getProfileData());
  327 + Assert.assertNotNull(deviceProfile.getProfileData().getAlarms());
  328 + Assert.assertNotNull(deviceProfile.getProfileData().getAlarms().get(0).getClearRule());
  329 +
  330 + testAutoGeneratedCodeByProtobuf(deviceProfileUpdateMsg);
  331 +
  332 + Optional<AssetUpdateMsg> assetUpdateMsgOpt = edgeImitator.findMessageByType(AssetUpdateMsg.class);
  333 + Assert.assertTrue(assetUpdateMsgOpt.isPresent());
  334 + AssetUpdateMsg assetUpdateMsg = assetUpdateMsgOpt.get();
270 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType()); 335 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
271 UUID assetUUID = new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB()); 336 UUID assetUUID = new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB());
272 Asset asset = doGet("/api/asset/" + assetUUID.toString(), Asset.class); 337 Asset asset = doGet("/api/asset/" + assetUUID.toString(), Asset.class);
@@ -277,9 +342,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -277,9 +342,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
277 342
278 testAutoGeneratedCodeByProtobuf(assetUpdateMsg); 343 testAutoGeneratedCodeByProtobuf(assetUpdateMsg);
279 344
280 - Optional<RuleChainUpdateMsg> optionalMsg3 = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);  
281 - Assert.assertTrue(optionalMsg3.isPresent());  
282 - RuleChainUpdateMsg ruleChainUpdateMsg = optionalMsg3.get(); 345 + Optional<RuleChainUpdateMsg> ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);
  346 + Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent());
  347 + RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get();
283 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType()); 348 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
284 UUID ruleChainUUID = new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB()); 349 UUID ruleChainUUID = new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB());
285 RuleChain ruleChain = doGet("/api/ruleChain/" + ruleChainUUID.toString(), RuleChain.class); 350 RuleChain ruleChain = doGet("/api/ruleChain/" + ruleChainUUID.toString(), RuleChain.class);
@@ -296,13 +361,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -296,13 +361,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
296 private void testDevices() throws Exception { 361 private void testDevices() throws Exception {
297 log.info("Testing devices"); 362 log.info("Testing devices");
298 363
299 - Device savedDevice = saveDevice("Edge Device 2");  
300 - 364 + // 1
301 edgeImitator.expectMessageAmount(1); 365 edgeImitator.expectMessageAmount(1);
  366 + Device savedDevice = saveDevice("Edge Device 2", "Default");
302 doPost("/api/edge/" + edge.getId().getId().toString() 367 doPost("/api/edge/" + edge.getId().getId().toString()
303 + "/device/" + savedDevice.getId().getId().toString(), Device.class); 368 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
304 - edgeImitator.waitForMessages();  
305 - 369 + Assert.assertTrue(edgeImitator.waitForMessages());
306 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 370 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
307 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 371 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
308 DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage; 372 DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
@@ -312,11 +376,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -312,11 +376,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
312 Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName()); 376 Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName());
313 Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType()); 377 Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType());
314 378
  379 + // 2
315 edgeImitator.expectMessageAmount(1); 380 edgeImitator.expectMessageAmount(1);
316 doDelete("/api/edge/" + edge.getId().getId().toString() 381 doDelete("/api/edge/" + edge.getId().getId().toString()
317 + "/device/" + savedDevice.getId().getId().toString(), Device.class); 382 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
318 - edgeImitator.waitForMessages();  
319 - 383 + Assert.assertTrue(edgeImitator.waitForMessages());
320 latestMessage = edgeImitator.getLatestMessage(); 384 latestMessage = edgeImitator.getLatestMessage();
321 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 385 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
322 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage; 386 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
@@ -324,11 +388,34 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -324,11 +388,34 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
324 Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits()); 388 Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits());
325 Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits()); 389 Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits());
326 390
  391 + // 3
327 edgeImitator.expectMessageAmount(1); 392 edgeImitator.expectMessageAmount(1);
328 doDelete("/api/device/" + savedDevice.getId().getId().toString()) 393 doDelete("/api/device/" + savedDevice.getId().getId().toString())
329 .andExpect(status().isOk()); 394 .andExpect(status().isOk());
330 - edgeImitator.waitForMessages(); 395 + // we should not get any message because device is not assigned to edge any more
  396 + Assert.assertFalse(edgeImitator.waitForMessages(1));
331 397
  398 + // 4
  399 + edgeImitator.expectMessageAmount(1);
  400 + savedDevice = saveDevice("Edge Device 3", "Default");
  401 + doPost("/api/edge/" + edge.getId().getId().toString()
  402 + + "/device/" + savedDevice.getId().getId().toString(), Device.class);
  403 + Assert.assertTrue(edgeImitator.waitForMessages());
  404 + latestMessage = edgeImitator.getLatestMessage();
  405 + Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
  406 + deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
  407 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
  408 + Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits());
  409 + Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits());
  410 + Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName());
  411 + Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType());
  412 +
  413 + // 5
  414 + edgeImitator.expectMessageAmount(1);
  415 + doDelete("/api/device/" + savedDevice.getId().getId().toString())
  416 + .andExpect(status().isOk());
  417 + // in this case we should get messages because device was assigned to edge
  418 + Assert.assertTrue(edgeImitator.waitForMessages());
332 latestMessage = edgeImitator.getLatestMessage(); 419 latestMessage = edgeImitator.getLatestMessage();
333 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 420 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
334 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage; 421 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
@@ -342,13 +429,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -342,13 +429,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
342 429
343 private void testAssets() throws Exception { 430 private void testAssets() throws Exception {
344 log.info("Testing assets"); 431 log.info("Testing assets");
345 - Asset savedAsset = saveAsset("Edge Asset 2");  
346 432
  433 + // 1
347 edgeImitator.expectMessageAmount(1); 434 edgeImitator.expectMessageAmount(1);
  435 + Asset savedAsset = saveAsset("Edge Asset 2");
348 doPost("/api/edge/" + edge.getId().getId().toString() 436 doPost("/api/edge/" + edge.getId().getId().toString()
349 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); 437 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
350 - edgeImitator.waitForMessages();  
351 - 438 + Assert.assertTrue(edgeImitator.waitForMessages());
352 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 439 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
353 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg); 440 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
354 AssetUpdateMsg assetUpdateMsg = (AssetUpdateMsg) latestMessage; 441 AssetUpdateMsg assetUpdateMsg = (AssetUpdateMsg) latestMessage;
@@ -358,11 +445,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -358,11 +445,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
358 Assert.assertEquals(assetUpdateMsg.getName(), savedAsset.getName()); 445 Assert.assertEquals(assetUpdateMsg.getName(), savedAsset.getName());
359 Assert.assertEquals(assetUpdateMsg.getType(), savedAsset.getType()); 446 Assert.assertEquals(assetUpdateMsg.getType(), savedAsset.getType());
360 447
  448 + // 2
361 edgeImitator.expectMessageAmount(1); 449 edgeImitator.expectMessageAmount(1);
362 doDelete("/api/edge/" + edge.getId().getId().toString() 450 doDelete("/api/edge/" + edge.getId().getId().toString()
363 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); 451 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
364 - edgeImitator.waitForMessages();  
365 - 452 + Assert.assertTrue(edgeImitator.waitForMessages());
366 latestMessage = edgeImitator.getLatestMessage(); 453 latestMessage = edgeImitator.getLatestMessage();
367 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg); 454 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
368 assetUpdateMsg = (AssetUpdateMsg) latestMessage; 455 assetUpdateMsg = (AssetUpdateMsg) latestMessage;
@@ -370,11 +457,32 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -370,11 +457,32 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
370 Assert.assertEquals(assetUpdateMsg.getIdMSB(), savedAsset.getUuidId().getMostSignificantBits()); 457 Assert.assertEquals(assetUpdateMsg.getIdMSB(), savedAsset.getUuidId().getMostSignificantBits());
371 Assert.assertEquals(assetUpdateMsg.getIdLSB(), savedAsset.getUuidId().getLeastSignificantBits()); 458 Assert.assertEquals(assetUpdateMsg.getIdLSB(), savedAsset.getUuidId().getLeastSignificantBits());
372 459
  460 + // 3
373 edgeImitator.expectMessageAmount(1); 461 edgeImitator.expectMessageAmount(1);
374 doDelete("/api/asset/" + savedAsset.getId().getId().toString()) 462 doDelete("/api/asset/" + savedAsset.getId().getId().toString())
375 .andExpect(status().isOk()); 463 .andExpect(status().isOk());
376 - edgeImitator.waitForMessages(); 464 + Assert.assertFalse(edgeImitator.waitForMessages(1));
377 465
  466 + // 4
  467 + edgeImitator.expectMessageAmount(1);
  468 + savedAsset = saveAsset("Edge Asset 3");
  469 + doPost("/api/edge/" + edge.getId().getId().toString()
  470 + + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
  471 + Assert.assertTrue(edgeImitator.waitForMessages());
  472 + latestMessage = edgeImitator.getLatestMessage();
  473 + Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
  474 + assetUpdateMsg = (AssetUpdateMsg) latestMessage;
  475 + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
  476 + Assert.assertEquals(assetUpdateMsg.getIdMSB(), savedAsset.getUuidId().getMostSignificantBits());
  477 + Assert.assertEquals(assetUpdateMsg.getIdLSB(), savedAsset.getUuidId().getLeastSignificantBits());
  478 + Assert.assertEquals(assetUpdateMsg.getName(), savedAsset.getName());
  479 + Assert.assertEquals(assetUpdateMsg.getType(), savedAsset.getType());
  480 +
  481 + // 5
  482 + edgeImitator.expectMessageAmount(1);
  483 + doDelete("/api/asset/" + savedAsset.getId().getId().toString())
  484 + .andExpect(status().isOk());
  485 + Assert.assertTrue(edgeImitator.waitForMessages());
378 latestMessage = edgeImitator.getLatestMessage(); 486 latestMessage = edgeImitator.getLatestMessage();
379 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg); 487 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
380 assetUpdateMsg = (AssetUpdateMsg) latestMessage; 488 assetUpdateMsg = (AssetUpdateMsg) latestMessage;
@@ -387,21 +495,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -387,21 +495,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
387 495
388 private void testRuleChains() throws Exception { 496 private void testRuleChains() throws Exception {
389 log.info("Testing RuleChains"); 497 log.info("Testing RuleChains");
  498 +
  499 + // 1
  500 + edgeImitator.expectMessageAmount(1);
390 RuleChain ruleChain = new RuleChain(); 501 RuleChain ruleChain = new RuleChain();
391 ruleChain.setName("Edge Test Rule Chain"); 502 ruleChain.setName("Edge Test Rule Chain");
392 ruleChain.setType(RuleChainType.EDGE); 503 ruleChain.setType(RuleChainType.EDGE);
393 RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class); 504 RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class);
394 -  
395 createRuleChainMetadata(savedRuleChain); 505 createRuleChainMetadata(savedRuleChain);
396 -  
397 - // Wait before rule chain metadata saved to database before rule chain is assigned to edge 506 + // sleep 1 seconds to avoid ENTITY_UPDATED_RPC_MESSAGE for the rule chain
  507 + // rule chain metadata is going to be stored and updated event pushed to edge notification service
  508 + // while service will be processing this event assignment rule chain to edge will be completed if bad timing
398 Thread.sleep(1000); 509 Thread.sleep(1000);
399 -  
400 - edgeImitator.expectMessageAmount(1);  
401 doPost("/api/edge/" + edge.getId().getId().toString() 510 doPost("/api/edge/" + edge.getId().getId().toString()
402 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class); 511 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
403 - edgeImitator.waitForMessages();  
404 - 512 + Assert.assertTrue(edgeImitator.waitForMessages());
405 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 513 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
406 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg); 514 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);
407 RuleChainUpdateMsg ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage; 515 RuleChainUpdateMsg ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;
@@ -410,13 +518,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -410,13 +518,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
410 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits()); 518 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
411 Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName()); 519 Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName());
412 520
  521 + // 2
413 testRuleChainMetadataRequestMsg(savedRuleChain.getId()); 522 testRuleChainMetadataRequestMsg(savedRuleChain.getId());
414 523
  524 + // 3
415 edgeImitator.expectMessageAmount(1); 525 edgeImitator.expectMessageAmount(1);
416 doDelete("/api/edge/" + edge.getId().getId().toString() 526 doDelete("/api/edge/" + edge.getId().getId().toString()
417 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class); 527 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
418 - edgeImitator.waitForMessages();  
419 - 528 + Assert.assertTrue(edgeImitator.waitForMessages());
420 latestMessage = edgeImitator.getLatestMessage(); 529 latestMessage = edgeImitator.getLatestMessage();
421 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg); 530 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);
422 ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage; 531 ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;
@@ -424,17 +533,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -424,17 +533,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
424 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits()); 533 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
425 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits()); 534 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
426 535
  536 + // 4
427 edgeImitator.expectMessageAmount(1); 537 edgeImitator.expectMessageAmount(1);
428 doDelete("/api/ruleChain/" + savedRuleChain.getId().getId().toString()) 538 doDelete("/api/ruleChain/" + savedRuleChain.getId().getId().toString())
429 .andExpect(status().isOk()); 539 .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()); 540 + Assert.assertFalse(edgeImitator.waitForMessages(1));
438 541
439 log.info("RuleChains tested successfully"); 542 log.info("RuleChains tested successfully");
440 } 543 }
@@ -452,8 +555,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -452,8 +555,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
452 edgeImitator.expectResponsesAmount(1); 555 edgeImitator.expectResponsesAmount(1);
453 edgeImitator.expectMessageAmount(1); 556 edgeImitator.expectMessageAmount(1);
454 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 557 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
455 - edgeImitator.waitForResponses();  
456 - edgeImitator.waitForMessages(); 558 + Assert.assertTrue(edgeImitator.waitForResponses());
  559 + Assert.assertTrue(edgeImitator.waitForMessages());
457 560
458 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 561 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
459 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg); 562 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
@@ -502,15 +605,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -502,15 +605,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
502 605
503 private void testDashboards() throws Exception { 606 private void testDashboards() throws Exception {
504 log.info("Testing Dashboards"); 607 log.info("Testing Dashboards");
  608 +
  609 + // 1
  610 + edgeImitator.expectMessageAmount(1);
505 Dashboard dashboard = new Dashboard(); 611 Dashboard dashboard = new Dashboard();
506 dashboard.setTitle("Edge Test Dashboard"); 612 dashboard.setTitle("Edge Test Dashboard");
507 Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class); 613 Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class);
508 -  
509 - edgeImitator.expectMessageAmount(1);  
510 doPost("/api/edge/" + edge.getId().getId().toString() 614 doPost("/api/edge/" + edge.getId().getId().toString()
511 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class); 615 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class);
512 - edgeImitator.waitForMessages();  
513 - 616 + Assert.assertTrue(edgeImitator.waitForMessages());
514 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 617 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
515 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg); 618 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
516 DashboardUpdateMsg dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage; 619 DashboardUpdateMsg dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
@@ -518,25 +621,24 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -518,25 +621,24 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
518 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits()); 621 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits());
519 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits()); 622 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits());
520 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName()); 623 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName());
521 -  
522 testAutoGeneratedCodeByProtobuf(dashboardUpdateMsg); 624 testAutoGeneratedCodeByProtobuf(dashboardUpdateMsg);
523 625
  626 + // 2
524 edgeImitator.expectMessageAmount(1); 627 edgeImitator.expectMessageAmount(1);
525 savedDashboard.setTitle("Updated Edge Test Dashboard"); 628 savedDashboard.setTitle("Updated Edge Test Dashboard");
526 doPost("/api/dashboard", savedDashboard, Dashboard.class); 629 doPost("/api/dashboard", savedDashboard, Dashboard.class);
527 - edgeImitator.waitForMessages();  
528 - 630 + Assert.assertTrue(edgeImitator.waitForMessages());
529 latestMessage = edgeImitator.getLatestMessage(); 631 latestMessage = edgeImitator.getLatestMessage();
530 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg); 632 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
531 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage; 633 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
532 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType()); 634 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());
533 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName()); 635 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName());
534 636
  637 + // 3
535 edgeImitator.expectMessageAmount(1); 638 edgeImitator.expectMessageAmount(1);
536 doDelete("/api/edge/" + edge.getId().getId().toString() 639 doDelete("/api/edge/" + edge.getId().getId().toString()
537 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class); 640 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class);
538 - edgeImitator.waitForMessages();  
539 - 641 + Assert.assertTrue(edgeImitator.waitForMessages());
540 latestMessage = edgeImitator.getLatestMessage(); 642 latestMessage = edgeImitator.getLatestMessage();
541 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg); 643 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
542 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage; 644 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
@@ -544,17 +646,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -544,17 +646,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
544 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits()); 646 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits());
545 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits()); 647 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits());
546 648
  649 + // 4
547 edgeImitator.expectMessageAmount(1); 650 edgeImitator.expectMessageAmount(1);
548 doDelete("/api/dashboard/" + savedDashboard.getId().getId().toString()) 651 doDelete("/api/dashboard/" + savedDashboard.getId().getId().toString())
549 .andExpect(status().isOk()); 652 .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()); 653 + Assert.assertFalse(edgeImitator.waitForMessages(1));
558 654
559 log.info("Dashboards tested successfully"); 655 log.info("Dashboards tested successfully");
560 } 656 }
@@ -562,19 +658,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -562,19 +658,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
562 private void testRelations() throws Exception { 658 private void testRelations() throws Exception {
563 log.info("Testing Relations"); 659 log.info("Testing Relations");
564 660
  661 + // 1
  662 + edgeImitator.expectMessageAmount(1);
565 Device device = findDeviceByName("Edge Device 1"); 663 Device device = findDeviceByName("Edge Device 1");
566 Asset asset = findAssetByName("Edge Asset 1"); 664 Asset asset = findAssetByName("Edge Asset 1");
567 -  
568 EntityRelation relation = new EntityRelation(); 665 EntityRelation relation = new EntityRelation();
569 relation.setType("test"); 666 relation.setType("test");
570 relation.setFrom(device.getId()); 667 relation.setFrom(device.getId());
571 relation.setTo(asset.getId()); 668 relation.setTo(asset.getId());
572 relation.setTypeGroup(RelationTypeGroup.COMMON); 669 relation.setTypeGroup(RelationTypeGroup.COMMON);
573 -  
574 - edgeImitator.expectMessageAmount(1);  
575 doPost("/api/relation", relation); 670 doPost("/api/relation", relation);
576 - edgeImitator.waitForMessages();  
577 - 671 + Assert.assertTrue(edgeImitator.waitForMessages());
578 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 672 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
579 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg); 673 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
580 RelationUpdateMsg relationUpdateMsg = (RelationUpdateMsg) latestMessage; 674 RelationUpdateMsg relationUpdateMsg = (RelationUpdateMsg) latestMessage;
@@ -588,6 +682,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -588,6 +682,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
588 Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name()); 682 Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
589 Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name()); 683 Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name());
590 684
  685 + // 2
591 edgeImitator.expectMessageAmount(1); 686 edgeImitator.expectMessageAmount(1);
592 doDelete("/api/relation?" + 687 doDelete("/api/relation?" +
593 "fromId=" + relation.getFrom().getId().toString() + 688 "fromId=" + relation.getFrom().getId().toString() +
@@ -597,8 +692,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -597,8 +692,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
597 "&toId=" + relation.getTo().getId().toString() + 692 "&toId=" + relation.getTo().getId().toString() +
598 "&toType=" + relation.getTo().getEntityType().name()) 693 "&toType=" + relation.getTo().getEntityType().name())
599 .andExpect(status().isOk()); 694 .andExpect(status().isOk());
600 - edgeImitator.waitForMessages();  
601 - 695 + Assert.assertTrue(edgeImitator.waitForMessages());
602 latestMessage = edgeImitator.getLatestMessage(); 696 latestMessage = edgeImitator.getLatestMessage();
603 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg); 697 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
604 relationUpdateMsg = (RelationUpdateMsg) latestMessage; 698 relationUpdateMsg = (RelationUpdateMsg) latestMessage;
@@ -617,18 +711,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -617,18 +711,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
617 711
618 private void testAlarms() throws Exception { 712 private void testAlarms() throws Exception {
619 log.info("Testing Alarms"); 713 log.info("Testing Alarms");
620 - Device device = findDeviceByName("Edge Device 1");  
621 714
  715 + // 1
  716 + edgeImitator.expectMessageAmount(1);
  717 + Device device = findDeviceByName("Edge Device 1");
622 Alarm alarm = new Alarm(); 718 Alarm alarm = new Alarm();
623 alarm.setOriginator(device.getId()); 719 alarm.setOriginator(device.getId());
624 alarm.setStatus(AlarmStatus.ACTIVE_UNACK); 720 alarm.setStatus(AlarmStatus.ACTIVE_UNACK);
625 alarm.setType("alarm"); 721 alarm.setType("alarm");
626 alarm.setSeverity(AlarmSeverity.CRITICAL); 722 alarm.setSeverity(AlarmSeverity.CRITICAL);
627 -  
628 - edgeImitator.expectMessageAmount(1);  
629 Alarm savedAlarm = doPost("/api/alarm", alarm, Alarm.class); 723 Alarm savedAlarm = doPost("/api/alarm", alarm, Alarm.class);
630 - edgeImitator.waitForMessages();  
631 - 724 + Assert.assertTrue(edgeImitator.waitForMessages());
632 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 725 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
633 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg); 726 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
634 AlarmUpdateMsg alarmUpdateMsg = (AlarmUpdateMsg) latestMessage; 727 AlarmUpdateMsg alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
@@ -639,10 +732,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -639,10 +732,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
639 Assert.assertEquals(alarmUpdateMsg.getStatus(), savedAlarm.getStatus().name()); 732 Assert.assertEquals(alarmUpdateMsg.getStatus(), savedAlarm.getStatus().name());
640 Assert.assertEquals(alarmUpdateMsg.getSeverity(), savedAlarm.getSeverity().name()); 733 Assert.assertEquals(alarmUpdateMsg.getSeverity(), savedAlarm.getSeverity().name());
641 734
  735 + // 2
642 edgeImitator.expectMessageAmount(1); 736 edgeImitator.expectMessageAmount(1);
643 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/ack"); 737 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/ack");
644 - edgeImitator.waitForMessages();  
645 - 738 + Assert.assertTrue(edgeImitator.waitForMessages());
646 latestMessage = edgeImitator.getLatestMessage(); 739 latestMessage = edgeImitator.getLatestMessage();
647 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg); 740 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
648 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage; 741 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
@@ -652,10 +745,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -652,10 +745,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
652 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName()); 745 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName());
653 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.ACTIVE_ACK.name()); 746 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.ACTIVE_ACK.name());
654 747
  748 + // 3
655 edgeImitator.expectMessageAmount(1); 749 edgeImitator.expectMessageAmount(1);
656 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/clear"); 750 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/clear");
657 - edgeImitator.waitForMessages();  
658 - 751 + Assert.assertTrue(edgeImitator.waitForMessages());
659 latestMessage = edgeImitator.getLatestMessage(); 752 latestMessage = edgeImitator.getLatestMessage();
660 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg); 753 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
661 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage; 754 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
@@ -665,26 +758,29 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -665,26 +758,29 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
665 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName()); 758 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName());
666 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.CLEARED_ACK.name()); 759 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.CLEARED_ACK.name());
667 760
  761 + // 4
  762 + edgeImitator.expectMessageAmount(1);
668 doDelete("/api/alarm/" + savedAlarm.getId().getId().toString()) 763 doDelete("/api/alarm/" + savedAlarm.getId().getId().toString())
669 .andExpect(status().isOk()); 764 .andExpect(status().isOk());
  765 + Assert.assertFalse(edgeImitator.waitForMessages(1));
  766 +
670 log.info("Alarms tested successfully"); 767 log.info("Alarms tested successfully");
671 } 768 }
672 769
673 private void testEntityView() throws Exception { 770 private void testEntityView() throws Exception {
674 log.info("Testing EntityView"); 771 log.info("Testing EntityView");
675 - Device device = findDeviceByName("Edge Device 1");  
676 772
  773 + // 1
  774 + edgeImitator.expectMessageAmount(1);
  775 + Device device = findDeviceByName("Edge Device 1");
677 EntityView entityView = new EntityView(); 776 EntityView entityView = new EntityView();
678 entityView.setName("Edge EntityView 1"); 777 entityView.setName("Edge EntityView 1");
679 entityView.setType("test"); 778 entityView.setType("test");
680 entityView.setEntityId(device.getId()); 779 entityView.setEntityId(device.getId());
681 EntityView savedEntityView = doPost("/api/entityView", entityView, EntityView.class); 780 EntityView savedEntityView = doPost("/api/entityView", entityView, EntityView.class);
682 -  
683 - edgeImitator.expectMessageAmount(1);  
684 doPost("/api/edge/" + edge.getId().getId().toString() 781 doPost("/api/edge/" + edge.getId().getId().toString()
685 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class); 782 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class);
686 - edgeImitator.waitForMessages();  
687 - 783 + Assert.assertTrue(edgeImitator.waitForMessages());
688 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 784 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
689 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg); 785 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
690 EntityViewUpdateMsg entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage; 786 EntityViewUpdateMsg entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
@@ -697,11 +793,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -697,11 +793,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
697 Assert.assertEquals(entityViewUpdateMsg.getEntityIdLSB(), device.getUuidId().getLeastSignificantBits()); 793 Assert.assertEquals(entityViewUpdateMsg.getEntityIdLSB(), device.getUuidId().getLeastSignificantBits());
698 Assert.assertEquals(entityViewUpdateMsg.getEntityType().name(), device.getId().getEntityType().name()); 794 Assert.assertEquals(entityViewUpdateMsg.getEntityType().name(), device.getId().getEntityType().name());
699 795
  796 + // 2
700 edgeImitator.expectMessageAmount(1); 797 edgeImitator.expectMessageAmount(1);
701 doDelete("/api/edge/" + edge.getId().getId().toString() 798 doDelete("/api/edge/" + edge.getId().getId().toString()
702 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class); 799 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class);
703 - edgeImitator.waitForMessages();  
704 - 800 + Assert.assertTrue(edgeImitator.waitForMessages());
705 latestMessage = edgeImitator.getLatestMessage(); 801 latestMessage = edgeImitator.getLatestMessage();
706 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg); 802 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
707 entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage; 803 entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
@@ -709,17 +805,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -709,17 +805,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
709 Assert.assertEquals(entityViewUpdateMsg.getIdMSB(), savedEntityView.getUuidId().getMostSignificantBits()); 805 Assert.assertEquals(entityViewUpdateMsg.getIdMSB(), savedEntityView.getUuidId().getMostSignificantBits());
710 Assert.assertEquals(entityViewUpdateMsg.getIdLSB(), savedEntityView.getUuidId().getLeastSignificantBits()); 806 Assert.assertEquals(entityViewUpdateMsg.getIdLSB(), savedEntityView.getUuidId().getLeastSignificantBits());
711 807
  808 + // 3
712 edgeImitator.expectMessageAmount(1); 809 edgeImitator.expectMessageAmount(1);
713 doDelete("/api/entityView/" + savedEntityView.getId().getId().toString()) 810 doDelete("/api/entityView/" + savedEntityView.getId().getId().toString())
714 .andExpect(status().isOk()); 811 .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()); 812 + Assert.assertFalse(edgeImitator.waitForMessages(1));
723 813
724 log.info("EntityView tested successfully"); 814 log.info("EntityView tested successfully");
725 } 815 }
@@ -727,15 +817,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -727,15 +817,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
727 private void testCustomer() throws Exception { 817 private void testCustomer() throws Exception {
728 log.info("Testing Customer"); 818 log.info("Testing Customer");
729 819
  820 + // 1
  821 + edgeImitator.expectMessageAmount(1);
730 Customer customer = new Customer(); 822 Customer customer = new Customer();
731 customer.setTitle("Edge Customer 1"); 823 customer.setTitle("Edge Customer 1");
732 Customer savedCustomer = doPost("/api/customer", customer, Customer.class); 824 Customer savedCustomer = doPost("/api/customer", customer, Customer.class);
733 -  
734 - edgeImitator.expectMessageAmount(1);  
735 doPost("/api/customer/" + savedCustomer.getId().getId().toString() 825 doPost("/api/customer/" + savedCustomer.getId().getId().toString()
736 + "/edge/" + edge.getId().getId().toString(), Edge.class); 826 + "/edge/" + edge.getId().getId().toString(), Edge.class);
737 - edgeImitator.waitForMessages();  
738 - 827 + Assert.assertTrue(edgeImitator.waitForMessages());
739 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 828 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
740 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg); 829 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg);
741 CustomerUpdateMsg customerUpdateMsg = (CustomerUpdateMsg) latestMessage; 830 CustomerUpdateMsg customerUpdateMsg = (CustomerUpdateMsg) latestMessage;
@@ -743,13 +832,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -743,13 +832,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
743 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits()); 832 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits());
744 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits()); 833 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits());
745 Assert.assertEquals(customerUpdateMsg.getTitle(), savedCustomer.getTitle()); 834 Assert.assertEquals(customerUpdateMsg.getTitle(), savedCustomer.getTitle());
746 -  
747 testAutoGeneratedCodeByProtobuf(customerUpdateMsg); 835 testAutoGeneratedCodeByProtobuf(customerUpdateMsg);
748 836
  837 + // 2
749 edgeImitator.expectMessageAmount(1); 838 edgeImitator.expectMessageAmount(1);
750 doDelete("/api/customer/edge/" + edge.getId().getId().toString(), Edge.class); 839 doDelete("/api/customer/edge/" + edge.getId().getId().toString(), Edge.class);
751 - edgeImitator.waitForMessages();  
752 - 840 + Assert.assertTrue(edgeImitator.waitForMessages());
753 latestMessage = edgeImitator.getLatestMessage(); 841 latestMessage = edgeImitator.getLatestMessage();
754 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg); 842 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg);
755 customerUpdateMsg = (CustomerUpdateMsg) latestMessage; 843 customerUpdateMsg = (CustomerUpdateMsg) latestMessage;
@@ -757,17 +845,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -757,17 +845,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
757 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits()); 845 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits());
758 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits()); 846 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits());
759 847
  848 + // 3
760 edgeImitator.expectMessageAmount(1); 849 edgeImitator.expectMessageAmount(1);
761 doDelete("/api/customer/" + savedCustomer.getId().getId().toString()) 850 doDelete("/api/customer/" + savedCustomer.getId().getId().toString())
762 .andExpect(status().isOk()); 851 .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()); 852 + Assert.assertFalse(edgeImitator.waitForMessages(1));
771 853
772 log.info("Customer tested successfully"); 854 log.info("Customer tested successfully");
773 } 855 }
@@ -775,13 +857,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -775,13 +857,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
775 private void testWidgetsBundleAndWidgetType() throws Exception { 857 private void testWidgetsBundleAndWidgetType() throws Exception {
776 log.info("Testing WidgetsBundle and WidgetType"); 858 log.info("Testing WidgetsBundle and WidgetType");
777 859
  860 + // 1
  861 + edgeImitator.expectMessageAmount(1);
778 WidgetsBundle widgetsBundle = new WidgetsBundle(); 862 WidgetsBundle widgetsBundle = new WidgetsBundle();
779 widgetsBundle.setTitle("Test Widget Bundle"); 863 widgetsBundle.setTitle("Test Widget Bundle");
780 -  
781 - edgeImitator.expectMessageAmount(1);  
782 WidgetsBundle savedWidgetsBundle = doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class); 864 WidgetsBundle savedWidgetsBundle = doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class);
783 - edgeImitator.waitForMessages();  
784 - 865 + Assert.assertTrue(edgeImitator.waitForMessages());
785 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 866 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
786 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg); 867 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg);
787 WidgetsBundleUpdateMsg widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage; 868 WidgetsBundleUpdateMsg widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage;
@@ -790,20 +871,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -790,20 +871,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
790 Assert.assertEquals(widgetsBundleUpdateMsg.getIdLSB(), savedWidgetsBundle.getUuidId().getLeastSignificantBits()); 871 Assert.assertEquals(widgetsBundleUpdateMsg.getIdLSB(), savedWidgetsBundle.getUuidId().getLeastSignificantBits());
791 Assert.assertEquals(widgetsBundleUpdateMsg.getAlias(), savedWidgetsBundle.getAlias()); 872 Assert.assertEquals(widgetsBundleUpdateMsg.getAlias(), savedWidgetsBundle.getAlias());
792 Assert.assertEquals(widgetsBundleUpdateMsg.getTitle(), savedWidgetsBundle.getTitle()); 873 Assert.assertEquals(widgetsBundleUpdateMsg.getTitle(), savedWidgetsBundle.getTitle());
793 -  
794 testAutoGeneratedCodeByProtobuf(widgetsBundleUpdateMsg); 874 testAutoGeneratedCodeByProtobuf(widgetsBundleUpdateMsg);
795 875
  876 + // 2
  877 + edgeImitator.expectMessageAmount(1);
796 WidgetType widgetType = new WidgetType(); 878 WidgetType widgetType = new WidgetType();
797 widgetType.setName("Test Widget Type"); 879 widgetType.setName("Test Widget Type");
798 widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); 880 widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
799 ObjectNode descriptor = mapper.createObjectNode(); 881 ObjectNode descriptor = mapper.createObjectNode();
800 descriptor.put("key", "value"); 882 descriptor.put("key", "value");
801 widgetType.setDescriptor(descriptor); 883 widgetType.setDescriptor(descriptor);
802 -  
803 - edgeImitator.expectMessageAmount(1);  
804 WidgetType savedWidgetType = doPost("/api/widgetType", widgetType, WidgetType.class); 884 WidgetType savedWidgetType = doPost("/api/widgetType", widgetType, WidgetType.class);
805 - edgeImitator.waitForMessages();  
806 - 885 + Assert.assertTrue(edgeImitator.waitForMessages());
807 latestMessage = edgeImitator.getLatestMessage(); 886 latestMessage = edgeImitator.getLatestMessage();
808 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg); 887 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg);
809 WidgetTypeUpdateMsg widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage; 888 WidgetTypeUpdateMsg widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage;
@@ -814,11 +893,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -814,11 +893,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
814 Assert.assertEquals(widgetTypeUpdateMsg.getName(), savedWidgetType.getName()); 893 Assert.assertEquals(widgetTypeUpdateMsg.getName(), savedWidgetType.getName());
815 Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson()), savedWidgetType.getDescriptor()); 894 Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson()), savedWidgetType.getDescriptor());
816 895
  896 + // 3
817 edgeImitator.expectMessageAmount(1); 897 edgeImitator.expectMessageAmount(1);
818 doDelete("/api/widgetType/" + savedWidgetType.getId().getId().toString()) 898 doDelete("/api/widgetType/" + savedWidgetType.getId().getId().toString())
819 .andExpect(status().isOk()); 899 .andExpect(status().isOk());
820 - edgeImitator.waitForMessages();  
821 - 900 + Assert.assertTrue(edgeImitator.waitForMessages());
822 latestMessage = edgeImitator.getLatestMessage(); 901 latestMessage = edgeImitator.getLatestMessage();
823 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg); 902 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg);
824 widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage; 903 widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage;
@@ -826,11 +905,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -826,11 +905,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
826 Assert.assertEquals(widgetTypeUpdateMsg.getIdMSB(), savedWidgetType.getUuidId().getMostSignificantBits()); 905 Assert.assertEquals(widgetTypeUpdateMsg.getIdMSB(), savedWidgetType.getUuidId().getMostSignificantBits());
827 Assert.assertEquals(widgetTypeUpdateMsg.getIdLSB(), savedWidgetType.getUuidId().getLeastSignificantBits()); 906 Assert.assertEquals(widgetTypeUpdateMsg.getIdLSB(), savedWidgetType.getUuidId().getLeastSignificantBits());
828 907
  908 + // 4
829 edgeImitator.expectMessageAmount(1); 909 edgeImitator.expectMessageAmount(1);
830 doDelete("/api/widgetsBundle/" + savedWidgetsBundle.getId().getId().toString()) 910 doDelete("/api/widgetsBundle/" + savedWidgetsBundle.getId().getId().toString())
831 .andExpect(status().isOk()); 911 .andExpect(status().isOk());
832 - edgeImitator.waitForMessages();  
833 - 912 + Assert.assertTrue(edgeImitator.waitForMessages());
834 latestMessage = edgeImitator.getLatestMessage(); 913 latestMessage = edgeImitator.getLatestMessage();
835 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg); 914 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg);
836 widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage; 915 widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage;
@@ -843,15 +922,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -843,15 +922,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
843 922
844 private void testTimeseries() throws Exception { 923 private void testTimeseries() throws Exception {
845 log.info("Testing timeseries"); 924 log.info("Testing timeseries");
846 - Device device = findDeviceByName("Edge Device 1");  
847 925
  926 + edgeImitator.expectMessageAmount(1);
  927 + Device device = findDeviceByName("Edge Device 1");
848 String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}"; 928 String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}";
849 JsonNode timeseriesEntityData = mapper.readTree(timeseriesData); 929 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); 930 + EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
  931 + edgeEventService.saveAsync(edgeEvent);
853 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 932 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
854 - edgeImitator.waitForMessages(); 933 + Assert.assertTrue(edgeImitator.waitForMessages());
855 934
856 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 935 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
857 Assert.assertTrue(latestMessage instanceof EntityDataProto); 936 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -890,7 +969,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -890,7 +969,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
890 edgeImitator.expectMessageAmount(1); 969 edgeImitator.expectMessageAmount(1);
891 edgeEventService.saveAsync(edgeEvent); 970 edgeEventService.saveAsync(edgeEvent);
892 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 971 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
893 - edgeImitator.waitForMessages(); 972 + Assert.assertTrue(edgeImitator.waitForMessages());
894 973
895 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 974 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
896 Assert.assertTrue(latestMessage instanceof EntityDataProto); 975 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -916,7 +995,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -916,7 +995,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
916 edgeImitator.expectMessageAmount(1); 995 edgeImitator.expectMessageAmount(1);
917 edgeEventService.saveAsync(edgeEvent); 996 edgeEventService.saveAsync(edgeEvent);
918 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 997 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
919 - edgeImitator.waitForMessages(); 998 + Assert.assertTrue(edgeImitator.waitForMessages());
920 999
921 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1000 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
922 Assert.assertTrue(latestMessage instanceof EntityDataProto); 1001 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -941,7 +1020,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -941,7 +1020,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
941 edgeImitator.expectMessageAmount(1); 1020 edgeImitator.expectMessageAmount(1);
942 edgeEventService.saveAsync(edgeEvent1); 1021 edgeEventService.saveAsync(edgeEvent1);
943 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 1022 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
944 - edgeImitator.waitForMessages(); 1023 + Assert.assertTrue(edgeImitator.waitForMessages());
945 1024
946 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1025 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
947 Assert.assertTrue(latestMessage instanceof EntityDataProto); 1026 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -996,8 +1075,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -996,8 +1075,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
996 1075
997 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1076 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
998 1077
999 - edgeImitator.waitForResponses();  
1000 - edgeImitator.waitForMessages(); 1078 + Assert.assertTrue(edgeImitator.waitForResponses());
  1079 + Assert.assertTrue(edgeImitator.waitForMessages());
1001 1080
1002 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1081 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1003 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 1082 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
@@ -1013,7 +1092,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1013,7 +1092,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1013 1092
1014 private void sendDeviceWithNameThatAlreadyExistsOnCloud() throws Exception { 1093 private void sendDeviceWithNameThatAlreadyExistsOnCloud() throws Exception {
1015 String deviceOnCloudName = RandomStringUtils.randomAlphanumeric(15); 1094 String deviceOnCloudName = RandomStringUtils.randomAlphanumeric(15);
1016 - Device deviceOnCloud = saveDevice(deviceOnCloudName); 1095 + Device deviceOnCloud = saveDevice(deviceOnCloudName, "Default");
1017 1096
1018 UUID uuid = Uuids.timeBased(); 1097 UUID uuid = Uuids.timeBased();
1019 1098
@@ -1033,8 +1112,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1033,8 +1112,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1033 1112
1034 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1113 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1035 1114
1036 - edgeImitator.waitForResponses();  
1037 - edgeImitator.waitForMessages(); 1115 + Assert.assertTrue(edgeImitator.waitForResponses());
  1116 + Assert.assertTrue(edgeImitator.waitForMessages());
1038 1117
1039 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1118 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1040 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); 1119 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
@@ -1063,7 +1142,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1063,7 +1142,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1063 1142
1064 edgeImitator.expectMessageAmount(1); 1143 edgeImitator.expectMessageAmount(1);
1065 doPost("/api/relation", relation); 1144 doPost("/api/relation", relation);
1066 - edgeImitator.waitForMessages(); 1145 + Assert.assertTrue(edgeImitator.waitForMessages());
1067 1146
1068 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); 1147 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
1069 RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder(); 1148 RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder();
@@ -1078,8 +1157,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1078,8 +1157,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1078 edgeImitator.expectResponsesAmount(1); 1157 edgeImitator.expectResponsesAmount(1);
1079 edgeImitator.expectMessageAmount(1); 1158 edgeImitator.expectMessageAmount(1);
1080 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1159 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1081 - edgeImitator.waitForResponses();  
1082 - edgeImitator.waitForMessages(); 1160 + Assert.assertTrue(edgeImitator.waitForResponses());
  1161 + Assert.assertTrue(edgeImitator.waitForMessages());
1083 1162
1084 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1163 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1085 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg); 1164 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
@@ -1115,7 +1194,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1115,7 +1194,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1115 1194
1116 edgeImitator.expectResponsesAmount(1); 1195 edgeImitator.expectResponsesAmount(1);
1117 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1196 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1118 - edgeImitator.waitForResponses(); 1197 + Assert.assertTrue(edgeImitator.waitForResponses());
1119 1198
1120 1199
1121 List<AlarmInfo> alarms = doGetTypedWithPageLink("/api/alarm/{entityType}/{entityId}?", 1200 List<AlarmInfo> alarms = doGetTypedWithPageLink("/api/alarm/{entityType}/{entityId}?",
@@ -1158,7 +1237,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1158,7 +1237,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1158 1237
1159 edgeImitator.expectResponsesAmount(1); 1238 edgeImitator.expectResponsesAmount(1);
1160 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1239 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1161 - edgeImitator.waitForResponses(); 1240 + Assert.assertTrue(edgeImitator.waitForResponses());
1162 1241
1163 EntityRelation relation = doGet("/api/relation?" + 1242 EntityRelation relation = doGet("/api/relation?" +
1164 "&fromId=" + device2.getId().getId().toString() + 1243 "&fromId=" + device2.getId().getId().toString() +
@@ -1212,7 +1291,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1212,7 +1291,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1212 testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder2); 1291 testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder2);
1213 1292
1214 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build()); 1293 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build());
1215 - edgeImitator.waitForResponses(); 1294 + Assert.assertTrue(edgeImitator.waitForResponses());
1216 1295
1217 // Wait before device attributes saved to database before requesting them from controller 1296 // Wait before device attributes saved to database before requesting them from controller
1218 Thread.sleep(1000); 1297 Thread.sleep(1000);
@@ -1243,8 +1322,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1243,8 +1322,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1243 edgeImitator.expectResponsesAmount(1); 1322 edgeImitator.expectResponsesAmount(1);
1244 edgeImitator.expectMessageAmount(1); 1323 edgeImitator.expectMessageAmount(1);
1245 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1324 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1246 - edgeImitator.waitForResponses();  
1247 - edgeImitator.waitForMessages(); 1325 + Assert.assertTrue(edgeImitator.waitForResponses());
  1326 + Assert.assertTrue(edgeImitator.waitForMessages());;
1248 1327
1249 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1328 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1250 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg); 1329 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
@@ -1270,8 +1349,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1270,8 +1349,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1270 edgeImitator.expectResponsesAmount(1); 1349 edgeImitator.expectResponsesAmount(1);
1271 edgeImitator.expectMessageAmount(1); 1350 edgeImitator.expectMessageAmount(1);
1272 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1351 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1273 - edgeImitator.waitForResponses();  
1274 - edgeImitator.waitForMessages(); 1352 + Assert.assertTrue(edgeImitator.waitForResponses());
  1353 + Assert.assertTrue(edgeImitator.waitForMessages());
1275 1354
1276 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1355 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1277 Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg); 1356 Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
@@ -1299,8 +1378,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1299,8 +1378,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1299 edgeImitator.expectResponsesAmount(1); 1378 edgeImitator.expectResponsesAmount(1);
1300 edgeImitator.expectMessageAmount(1); 1379 edgeImitator.expectMessageAmount(1);
1301 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1380 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1302 - edgeImitator.waitForResponses();  
1303 - edgeImitator.waitForMessages(); 1381 + Assert.assertTrue(edgeImitator.waitForResponses());
  1382 + Assert.assertTrue(edgeImitator.waitForMessages());
1304 1383
1305 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1384 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1306 Assert.assertTrue(latestMessage instanceof DeviceCredentialsUpdateMsg); 1385 Assert.assertTrue(latestMessage instanceof DeviceCredentialsUpdateMsg);
@@ -1327,7 +1406,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1327,7 +1406,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1327 1406
1328 edgeImitator.expectResponsesAmount(1); 1407 edgeImitator.expectResponsesAmount(1);
1329 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1408 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1330 - edgeImitator.waitForResponses(); 1409 + Assert.assertTrue(edgeImitator.waitForResponses());
1331 } 1410 }
1332 1411
1333 private void sendDeviceRpcResponse() throws Exception { 1412 private void sendDeviceRpcResponse() throws Exception {
@@ -1352,7 +1431,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1352,7 +1431,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1352 1431
1353 edgeImitator.expectResponsesAmount(1); 1432 edgeImitator.expectResponsesAmount(1);
1354 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1433 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1355 - edgeImitator.waitForResponses(); 1434 + Assert.assertTrue(edgeImitator.waitForResponses());
1356 } 1435 }
1357 1436
1358 private void sendAttributesRequest() throws Exception { 1437 private void sendAttributesRequest() throws Exception {
@@ -1383,8 +1462,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1383,8 +1462,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1383 edgeImitator.expectResponsesAmount(1); 1462 edgeImitator.expectResponsesAmount(1);
1384 edgeImitator.expectMessageAmount(1); 1463 edgeImitator.expectMessageAmount(1);
1385 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); 1464 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1386 - edgeImitator.waitForResponses();  
1387 - edgeImitator.waitForMessages(); 1465 + Assert.assertTrue(edgeImitator.waitForResponses());
  1466 + Assert.assertTrue(edgeImitator.waitForMessages());
1388 1467
1389 AbstractMessage latestMessage = edgeImitator.getLatestMessage(); 1468 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1390 Assert.assertTrue(latestMessage instanceof EntityDataProto); 1469 Assert.assertTrue(latestMessage instanceof EntityDataProto);
@@ -1416,7 +1495,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1416,7 +1495,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1416 1495
1417 edgeImitator.expectResponsesAmount(1); 1496 edgeImitator.expectResponsesAmount(1);
1418 edgeImitator.sendUplinkMsg(upLinkMsgBuilder.build()); 1497 edgeImitator.sendUplinkMsg(upLinkMsgBuilder.build());
1419 - edgeImitator.waitForResponses(); 1498 + Assert.assertTrue(edgeImitator.waitForResponses());
1420 device = doGet("/api/device/" + device.getId().getId().toString(), Device.class); 1499 device = doGet("/api/device/" + device.getId().getId().toString(), Device.class);
1421 Assert.assertNotNull(device); 1500 Assert.assertNotNull(device);
1422 List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", 1501 List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
@@ -1428,7 +1507,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1428,7 +1507,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1428 private void installation() throws Exception { 1507 private void installation() throws Exception {
1429 edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class); 1508 edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class);
1430 1509
1431 - Device savedDevice = saveDevice("Edge Device 1"); 1510 + DeviceProfile deviceProfile = this.createDeviceProfile(CUSTOM_DEVICE_PROFILE_NAME, null);
  1511 + extendDeviceProfileData(deviceProfile);
  1512 + doPost("/api/deviceProfile", deviceProfile, DeviceProfile.class);
  1513 +
  1514 + Device savedDevice = saveDevice("Edge Device 1", CUSTOM_DEVICE_PROFILE_NAME);
1432 doPost("/api/edge/" + edge.getId().getId().toString() 1515 doPost("/api/edge/" + edge.getId().getId().toString()
1433 + "/device/" + savedDevice.getId().getId().toString(), Device.class); 1516 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
1434 1517
@@ -1437,6 +1520,35 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1437,6 +1520,35 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1437 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); 1520 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
1438 } 1521 }
1439 1522
  1523 + private void extendDeviceProfileData(DeviceProfile deviceProfile) {
  1524 + DeviceProfileData profileData = deviceProfile.getProfileData();
  1525 + List<DeviceProfileAlarm> alarms = new ArrayList<>();
  1526 + DeviceProfileAlarm deviceProfileAlarm = new DeviceProfileAlarm();
  1527 + deviceProfileAlarm.setAlarmType("High Temperature");
  1528 + AlarmRule alarmRule = new AlarmRule();
  1529 + alarmRule.setAlarmDetails("Alarm Details");
  1530 + AlarmCondition alarmCondition = new AlarmCondition();
  1531 + alarmCondition.setSpec(new SimpleAlarmConditionSpec());
  1532 + List<AlarmConditionFilter> condition = new ArrayList<>();
  1533 + AlarmConditionFilter alarmConditionFilter = new AlarmConditionFilter();
  1534 + alarmConditionFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.ATTRIBUTE, "temperature"));
  1535 + NumericFilterPredicate predicate = new NumericFilterPredicate();
  1536 + predicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER);
  1537 + predicate.setValue(new FilterPredicateValue<>(55.0));
  1538 + alarmConditionFilter.setPredicate(predicate);
  1539 + alarmConditionFilter.setValueType(EntityKeyValueType.NUMERIC);
  1540 + condition.add(alarmConditionFilter);
  1541 + alarmCondition.setCondition(condition);
  1542 + alarmRule.setCondition(alarmCondition);
  1543 + deviceProfileAlarm.setClearRule(alarmRule);
  1544 + TreeMap<AlarmSeverity, AlarmRule> createRules = new TreeMap<>();
  1545 + createRules.put(AlarmSeverity.CRITICAL, alarmRule);
  1546 + deviceProfileAlarm.setCreateRules(createRules);
  1547 + alarms.add(deviceProfileAlarm);
  1548 + profileData.setAlarms(alarms);
  1549 + profileData.setProvisionConfiguration(new AllowCreateNewDevicesDeviceProfileProvisionConfiguration("123"));
  1550 + }
  1551 +
1440 private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) { 1552 private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) {
1441 EdgeEvent edgeEvent = new EdgeEvent(); 1553 EdgeEvent edgeEvent = new EdgeEvent();
1442 edgeEvent.setEdgeId(edgeId); 1554 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 }