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 40 .setName(deviceProfile.getName())
41 41 .setDefault(deviceProfile.isDefault())
42 42 .setType(deviceProfile.getType().name())
43   - .setTransportType(deviceProfile.getTransportType().name())
44   - .setProvisionType(deviceProfile.getProvisionType().name())
45 43 .setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfile.getProfileData())));
46 44 // TODO: voba - should this be always null at the moment??
47 45 // if (deviceProfile.getDefaultRuleChainId() != null) {
... ... @@ -54,6 +52,12 @@ public class DeviceProfileMsgConstructor {
54 52 if (deviceProfile.getDescription() != null) {
55 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 61 if (deviceProfile.getProvisionDeviceKey() != null) {
58 62 builder.setProvisionDeviceKey(deviceProfile.getProvisionDeviceKey());
59 63 }
... ...
... ... @@ -32,10 +32,12 @@ import org.junit.Assert;
32 32 import org.junit.Before;
33 33 import org.junit.Test;
34 34 import org.springframework.beans.factory.annotation.Autowired;
  35 +import org.thingsboard.common.util.JacksonUtil;
35 36 import org.thingsboard.server.common.data.Customer;
36 37 import org.thingsboard.server.common.data.Dashboard;
37 38 import org.thingsboard.server.common.data.DataConstants;
38 39 import org.thingsboard.server.common.data.Device;
  40 +import org.thingsboard.server.common.data.DeviceProfile;
39 41 import org.thingsboard.server.common.data.EntityType;
40 42 import org.thingsboard.server.common.data.EntityView;
41 43 import org.thingsboard.server.common.data.Tenant;
... ... @@ -45,6 +47,15 @@ import org.thingsboard.server.common.data.alarm.AlarmInfo;
45 47 import org.thingsboard.server.common.data.alarm.AlarmSeverity;
46 48 import org.thingsboard.server.common.data.alarm.AlarmStatus;
47 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 59 import org.thingsboard.server.common.data.edge.Edge;
49 60 import org.thingsboard.server.common.data.edge.EdgeEvent;
50 61 import org.thingsboard.server.common.data.edge.EdgeEventActionType;
... ... @@ -57,6 +68,9 @@ import org.thingsboard.server.common.data.id.TenantId;
57 68 import org.thingsboard.server.common.data.id.UserId;
58 69 import org.thingsboard.server.common.data.page.PageData;
59 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 74 import org.thingsboard.server.common.data.relation.EntityRelation;
61 75 import org.thingsboard.server.common.data.relation.RelationTypeGroup;
62 76 import org.thingsboard.server.common.data.rule.RuleChain;
... ... @@ -71,7 +85,6 @@ import org.thingsboard.server.common.data.widget.WidgetsBundle;
71 85 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
72 86 import org.thingsboard.server.controller.AbstractControllerTest;
73 87 import org.thingsboard.server.dao.edge.EdgeEventService;
74   -import org.thingsboard.common.util.JacksonUtil;
75 88 import org.thingsboard.server.edge.imitator.EdgeImitator;
76 89 import org.thingsboard.server.gen.edge.AlarmUpdateMsg;
77 90 import org.thingsboard.server.gen.edge.AssetUpdateMsg;
... ... @@ -81,6 +94,7 @@ import org.thingsboard.server.gen.edge.CustomerUpdateMsg;
81 94 import org.thingsboard.server.gen.edge.DashboardUpdateMsg;
82 95 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg;
83 96 import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg;
  97 +import org.thingsboard.server.gen.edge.DeviceProfileUpdateMsg;
84 98 import org.thingsboard.server.gen.edge.DeviceRpcCallMsg;
85 99 import org.thingsboard.server.gen.edge.DeviceUpdateMsg;
86 100 import org.thingsboard.server.gen.edge.EdgeConfiguration;
... ... @@ -106,6 +120,7 @@ import java.util.List;
106 120 import java.util.Map;
107 121 import java.util.Optional;
108 122 import java.util.Random;
  123 +import java.util.TreeMap;
109 124 import java.util.UUID;
110 125 import java.util.concurrent.TimeUnit;
111 126
... ... @@ -114,6 +129,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
114 129 @Slf4j
115 130 abstract public class BaseEdgeTest extends AbstractControllerTest {
116 131
  132 + private static final String CUSTOM_DEVICE_PROFILE_NAME = "Thermostat";
  133 +
117 134 private Tenant savedTenant;
118 135 private TenantId tenantId;
119 136 private User tenantAdmin;
... ... @@ -145,11 +162,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
145 162 tenantAdmin.setLastName("Downs");
146 163
147 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 170 installation();
149 171
150 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 176 edgeImitator.connect();
154 177 }
155 178
... ... @@ -163,23 +186,49 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
163 186 .andExpect(status().isOk());
164 187 }
165 188
166   -
167 189 @Test
168 190 public void test() throws Exception {
169 191 testReceivedInitialData();
  192 + Assert.assertEquals(10, edgeImitator.getDownlinkMsgs().size());
  193 +
170 194 testDevices();
  195 + Assert.assertEquals(14, edgeImitator.getDownlinkMsgs().size());
  196 +
171 197 testAssets();
  198 + Assert.assertEquals(18, edgeImitator.getDownlinkMsgs().size());
  199 +
172 200 testRuleChains();
  201 + Assert.assertEquals(21, edgeImitator.getDownlinkMsgs().size());
  202 +
173 203 testDashboards();
  204 + Assert.assertEquals(24, edgeImitator.getDownlinkMsgs().size());
  205 +
174 206 testRelations();
  207 + Assert.assertEquals(26, edgeImitator.getDownlinkMsgs().size());
  208 +
175 209 testAlarms();
  210 + Assert.assertEquals(29, edgeImitator.getDownlinkMsgs().size());
  211 +
176 212 testEntityView();
  213 + Assert.assertEquals(31, edgeImitator.getDownlinkMsgs().size());
  214 +
177 215 testCustomer();
  216 + Assert.assertEquals(33, edgeImitator.getDownlinkMsgs().size());
  217 +
178 218 testWidgetsBundleAndWidgetType();
  219 + Assert.assertEquals(37, edgeImitator.getDownlinkMsgs().size());
  220 +
179 221 testTimeseries();
  222 + Assert.assertEquals(38, edgeImitator.getDownlinkMsgs().size());
  223 +
180 224 testAttributes();
  225 + Assert.assertEquals(41, edgeImitator.getDownlinkMsgs().size());
  226 +
181 227 testSendMessagesToCloud();
  228 + Assert.assertEquals(50, edgeImitator.getDownlinkMsgs().size());
  229 +
182 230 testRpcCall();
  231 + Assert.assertEquals(51, edgeImitator.getDownlinkMsgs().size());
183 232 }
184 233
185 234 private Device findDeviceByName(String deviceName) throws Exception {
... ... @@ -204,10 +253,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
204 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 257 Device device = new Device();
209 258 device.setName(deviceName);
210   - device.setType("test");
  259 + device.setType(type);
211 260 return doPost("/api/device", device, Device.class);
212 261 }
213 262
... ... @@ -233,7 +282,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
233 282 edgeImitator.expectMessageAmount(1);
234 283 edgeEventService.saveAsync(edgeEvent);
235 284 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
236   - edgeImitator.waitForMessages();
  285 + Assert.assertTrue(edgeImitator.waitForMessages());
237 286
238 287 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
239 288 Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg);
... ... @@ -243,7 +292,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
243 292
244 293 private void testReceivedInitialData() throws Exception {
245 294 log.info("Checking received data");
246   - edgeImitator.waitForMessages();
  295 + Assert.assertTrue(edgeImitator.waitForMessages());
247 296
248 297 EdgeConfiguration configuration = edgeImitator.getConfiguration();
249 298 Assert.assertNotNull(configuration);
... ... @@ -253,9 +302,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
253 302 UserId userId = edgeImitator.getUserId();
254 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 308 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
260 309 UUID deviceUUID = new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB());
261 310 Device device = doGet("/api/device/" + deviceUUID.toString(), Device.class);
... ... @@ -264,9 +313,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
264 313 new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData();
265 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 335 Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
271 336 UUID assetUUID = new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB());
272 337 Asset asset = doGet("/api/asset/" + assetUUID.toString(), Asset.class);
... ... @@ -277,9 +342,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
277 342
278 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 348 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
284 349 UUID ruleChainUUID = new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB());
285 350 RuleChain ruleChain = doGet("/api/ruleChain/" + ruleChainUUID.toString(), RuleChain.class);
... ... @@ -296,13 +361,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
296 361 private void testDevices() throws Exception {
297 362 log.info("Testing devices");
298 363
299   - Device savedDevice = saveDevice("Edge Device 2");
300   -
  364 + // 1
301 365 edgeImitator.expectMessageAmount(1);
  366 + Device savedDevice = saveDevice("Edge Device 2", "Default");
302 367 doPost("/api/edge/" + edge.getId().getId().toString()
303 368 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
304   - edgeImitator.waitForMessages();
305   -
  369 + Assert.assertTrue(edgeImitator.waitForMessages());
306 370 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
307 371 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
308 372 DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
... ... @@ -312,11 +376,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
312 376 Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName());
313 377 Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType());
314 378
  379 + // 2
315 380 edgeImitator.expectMessageAmount(1);
316 381 doDelete("/api/edge/" + edge.getId().getId().toString()
317 382 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
318   - edgeImitator.waitForMessages();
319   -
  383 + Assert.assertTrue(edgeImitator.waitForMessages());
320 384 latestMessage = edgeImitator.getLatestMessage();
321 385 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
322 386 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
... ... @@ -324,11 +388,34 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
324 388 Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits());
325 389 Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits());
326 390
  391 + // 3
327 392 edgeImitator.expectMessageAmount(1);
328 393 doDelete("/api/device/" + savedDevice.getId().getId().toString())
329 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 419 latestMessage = edgeImitator.getLatestMessage();
333 420 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
334 421 deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
... ... @@ -342,13 +429,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
342 429
343 430 private void testAssets() throws Exception {
344 431 log.info("Testing assets");
345   - Asset savedAsset = saveAsset("Edge Asset 2");
346 432
  433 + // 1
347 434 edgeImitator.expectMessageAmount(1);
  435 + Asset savedAsset = saveAsset("Edge Asset 2");
348 436 doPost("/api/edge/" + edge.getId().getId().toString()
349 437 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
350   - edgeImitator.waitForMessages();
351   -
  438 + Assert.assertTrue(edgeImitator.waitForMessages());
352 439 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
353 440 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
354 441 AssetUpdateMsg assetUpdateMsg = (AssetUpdateMsg) latestMessage;
... ... @@ -358,11 +445,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
358 445 Assert.assertEquals(assetUpdateMsg.getName(), savedAsset.getName());
359 446 Assert.assertEquals(assetUpdateMsg.getType(), savedAsset.getType());
360 447
  448 + // 2
361 449 edgeImitator.expectMessageAmount(1);
362 450 doDelete("/api/edge/" + edge.getId().getId().toString()
363 451 + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
364   - edgeImitator.waitForMessages();
365   -
  452 + Assert.assertTrue(edgeImitator.waitForMessages());
366 453 latestMessage = edgeImitator.getLatestMessage();
367 454 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
368 455 assetUpdateMsg = (AssetUpdateMsg) latestMessage;
... ... @@ -370,11 +457,32 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
370 457 Assert.assertEquals(assetUpdateMsg.getIdMSB(), savedAsset.getUuidId().getMostSignificantBits());
371 458 Assert.assertEquals(assetUpdateMsg.getIdLSB(), savedAsset.getUuidId().getLeastSignificantBits());
372 459
  460 + // 3
373 461 edgeImitator.expectMessageAmount(1);
374 462 doDelete("/api/asset/" + savedAsset.getId().getId().toString())
375 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 486 latestMessage = edgeImitator.getLatestMessage();
379 487 Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
380 488 assetUpdateMsg = (AssetUpdateMsg) latestMessage;
... ... @@ -387,21 +495,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
387 495
388 496 private void testRuleChains() throws Exception {
389 497 log.info("Testing RuleChains");
  498 +
  499 + // 1
  500 + edgeImitator.expectMessageAmount(1);
390 501 RuleChain ruleChain = new RuleChain();
391 502 ruleChain.setName("Edge Test Rule Chain");
392 503 ruleChain.setType(RuleChainType.EDGE);
393 504 RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class);
394   -
395 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 509 Thread.sleep(1000);
399   -
400   - edgeImitator.expectMessageAmount(1);
401 510 doPost("/api/edge/" + edge.getId().getId().toString()
402 511 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
403   - edgeImitator.waitForMessages();
404   -
  512 + Assert.assertTrue(edgeImitator.waitForMessages());
405 513 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
406 514 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);
407 515 RuleChainUpdateMsg ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;
... ... @@ -410,13 +518,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
410 518 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
411 519 Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName());
412 520
  521 + // 2
413 522 testRuleChainMetadataRequestMsg(savedRuleChain.getId());
414 523
  524 + // 3
415 525 edgeImitator.expectMessageAmount(1);
416 526 doDelete("/api/edge/" + edge.getId().getId().toString()
417 527 + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
418   - edgeImitator.waitForMessages();
419   -
  528 + Assert.assertTrue(edgeImitator.waitForMessages());
420 529 latestMessage = edgeImitator.getLatestMessage();
421 530 Assert.assertTrue(latestMessage instanceof RuleChainUpdateMsg);
422 531 ruleChainUpdateMsg = (RuleChainUpdateMsg) latestMessage;
... ... @@ -424,17 +533,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
424 533 Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
425 534 Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
426 535
  536 + // 4
427 537 edgeImitator.expectMessageAmount(1);
428 538 doDelete("/api/ruleChain/" + savedRuleChain.getId().getId().toString())
429 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 542 log.info("RuleChains tested successfully");
440 543 }
... ... @@ -452,8 +555,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
452 555 edgeImitator.expectResponsesAmount(1);
453 556 edgeImitator.expectMessageAmount(1);
454 557 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
455   - edgeImitator.waitForResponses();
456   - edgeImitator.waitForMessages();
  558 + Assert.assertTrue(edgeImitator.waitForResponses());
  559 + Assert.assertTrue(edgeImitator.waitForMessages());
457 560
458 561 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
459 562 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
... ... @@ -502,15 +605,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
502 605
503 606 private void testDashboards() throws Exception {
504 607 log.info("Testing Dashboards");
  608 +
  609 + // 1
  610 + edgeImitator.expectMessageAmount(1);
505 611 Dashboard dashboard = new Dashboard();
506 612 dashboard.setTitle("Edge Test Dashboard");
507 613 Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class);
508   -
509   - edgeImitator.expectMessageAmount(1);
510 614 doPost("/api/edge/" + edge.getId().getId().toString()
511 615 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class);
512   - edgeImitator.waitForMessages();
513   -
  616 + Assert.assertTrue(edgeImitator.waitForMessages());
514 617 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
515 618 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
516 619 DashboardUpdateMsg dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
... ... @@ -518,25 +621,24 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
518 621 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits());
519 622 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits());
520 623 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName());
521   -
522 624 testAutoGeneratedCodeByProtobuf(dashboardUpdateMsg);
523 625
  626 + // 2
524 627 edgeImitator.expectMessageAmount(1);
525 628 savedDashboard.setTitle("Updated Edge Test Dashboard");
526 629 doPost("/api/dashboard", savedDashboard, Dashboard.class);
527   - edgeImitator.waitForMessages();
528   -
  630 + Assert.assertTrue(edgeImitator.waitForMessages());
529 631 latestMessage = edgeImitator.getLatestMessage();
530 632 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
531 633 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
532 634 Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());
533 635 Assert.assertEquals(dashboardUpdateMsg.getTitle(), savedDashboard.getName());
534 636
  637 + // 3
535 638 edgeImitator.expectMessageAmount(1);
536 639 doDelete("/api/edge/" + edge.getId().getId().toString()
537 640 + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class);
538   - edgeImitator.waitForMessages();
539   -
  641 + Assert.assertTrue(edgeImitator.waitForMessages());
540 642 latestMessage = edgeImitator.getLatestMessage();
541 643 Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
542 644 dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
... ... @@ -544,17 +646,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
544 646 Assert.assertEquals(dashboardUpdateMsg.getIdMSB(), savedDashboard.getUuidId().getMostSignificantBits());
545 647 Assert.assertEquals(dashboardUpdateMsg.getIdLSB(), savedDashboard.getUuidId().getLeastSignificantBits());
546 648
  649 + // 4
547 650 edgeImitator.expectMessageAmount(1);
548 651 doDelete("/api/dashboard/" + savedDashboard.getId().getId().toString())
549 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 655 log.info("Dashboards tested successfully");
560 656 }
... ... @@ -562,19 +658,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
562 658 private void testRelations() throws Exception {
563 659 log.info("Testing Relations");
564 660
  661 + // 1
  662 + edgeImitator.expectMessageAmount(1);
565 663 Device device = findDeviceByName("Edge Device 1");
566 664 Asset asset = findAssetByName("Edge Asset 1");
567   -
568 665 EntityRelation relation = new EntityRelation();
569 666 relation.setType("test");
570 667 relation.setFrom(device.getId());
571 668 relation.setTo(asset.getId());
572 669 relation.setTypeGroup(RelationTypeGroup.COMMON);
573   -
574   - edgeImitator.expectMessageAmount(1);
575 670 doPost("/api/relation", relation);
576   - edgeImitator.waitForMessages();
577   -
  671 + Assert.assertTrue(edgeImitator.waitForMessages());
578 672 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
579 673 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
580 674 RelationUpdateMsg relationUpdateMsg = (RelationUpdateMsg) latestMessage;
... ... @@ -588,6 +682,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
588 682 Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
589 683 Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name());
590 684
  685 + // 2
591 686 edgeImitator.expectMessageAmount(1);
592 687 doDelete("/api/relation?" +
593 688 "fromId=" + relation.getFrom().getId().toString() +
... ... @@ -597,8 +692,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
597 692 "&toId=" + relation.getTo().getId().toString() +
598 693 "&toType=" + relation.getTo().getEntityType().name())
599 694 .andExpect(status().isOk());
600   - edgeImitator.waitForMessages();
601   -
  695 + Assert.assertTrue(edgeImitator.waitForMessages());
602 696 latestMessage = edgeImitator.getLatestMessage();
603 697 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
604 698 relationUpdateMsg = (RelationUpdateMsg) latestMessage;
... ... @@ -617,18 +711,17 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
617 711
618 712 private void testAlarms() throws Exception {
619 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 718 Alarm alarm = new Alarm();
623 719 alarm.setOriginator(device.getId());
624 720 alarm.setStatus(AlarmStatus.ACTIVE_UNACK);
625 721 alarm.setType("alarm");
626 722 alarm.setSeverity(AlarmSeverity.CRITICAL);
627   -
628   - edgeImitator.expectMessageAmount(1);
629 723 Alarm savedAlarm = doPost("/api/alarm", alarm, Alarm.class);
630   - edgeImitator.waitForMessages();
631   -
  724 + Assert.assertTrue(edgeImitator.waitForMessages());
632 725 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
633 726 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
634 727 AlarmUpdateMsg alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
... ... @@ -639,10 +732,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
639 732 Assert.assertEquals(alarmUpdateMsg.getStatus(), savedAlarm.getStatus().name());
640 733 Assert.assertEquals(alarmUpdateMsg.getSeverity(), savedAlarm.getSeverity().name());
641 734
  735 + // 2
642 736 edgeImitator.expectMessageAmount(1);
643 737 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/ack");
644   - edgeImitator.waitForMessages();
645   -
  738 + Assert.assertTrue(edgeImitator.waitForMessages());
646 739 latestMessage = edgeImitator.getLatestMessage();
647 740 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
648 741 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
... ... @@ -652,10 +745,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
652 745 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName());
653 746 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.ACTIVE_ACK.name());
654 747
  748 + // 3
655 749 edgeImitator.expectMessageAmount(1);
656 750 doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/clear");
657   - edgeImitator.waitForMessages();
658   -
  751 + Assert.assertTrue(edgeImitator.waitForMessages());
659 752 latestMessage = edgeImitator.getLatestMessage();
660 753 Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
661 754 alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
... ... @@ -665,26 +758,29 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
665 758 Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName());
666 759 Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.CLEARED_ACK.name());
667 760
  761 + // 4
  762 + edgeImitator.expectMessageAmount(1);
668 763 doDelete("/api/alarm/" + savedAlarm.getId().getId().toString())
669 764 .andExpect(status().isOk());
  765 + Assert.assertFalse(edgeImitator.waitForMessages(1));
  766 +
670 767 log.info("Alarms tested successfully");
671 768 }
672 769
673 770 private void testEntityView() throws Exception {
674 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 776 EntityView entityView = new EntityView();
678 777 entityView.setName("Edge EntityView 1");
679 778 entityView.setType("test");
680 779 entityView.setEntityId(device.getId());
681 780 EntityView savedEntityView = doPost("/api/entityView", entityView, EntityView.class);
682   -
683   - edgeImitator.expectMessageAmount(1);
684 781 doPost("/api/edge/" + edge.getId().getId().toString()
685 782 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class);
686   - edgeImitator.waitForMessages();
687   -
  783 + Assert.assertTrue(edgeImitator.waitForMessages());
688 784 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
689 785 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
690 786 EntityViewUpdateMsg entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
... ... @@ -697,11 +793,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
697 793 Assert.assertEquals(entityViewUpdateMsg.getEntityIdLSB(), device.getUuidId().getLeastSignificantBits());
698 794 Assert.assertEquals(entityViewUpdateMsg.getEntityType().name(), device.getId().getEntityType().name());
699 795
  796 + // 2
700 797 edgeImitator.expectMessageAmount(1);
701 798 doDelete("/api/edge/" + edge.getId().getId().toString()
702 799 + "/entityView/" + savedEntityView.getId().getId().toString(), EntityView.class);
703   - edgeImitator.waitForMessages();
704   -
  800 + Assert.assertTrue(edgeImitator.waitForMessages());
705 801 latestMessage = edgeImitator.getLatestMessage();
706 802 Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
707 803 entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
... ... @@ -709,17 +805,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
709 805 Assert.assertEquals(entityViewUpdateMsg.getIdMSB(), savedEntityView.getUuidId().getMostSignificantBits());
710 806 Assert.assertEquals(entityViewUpdateMsg.getIdLSB(), savedEntityView.getUuidId().getLeastSignificantBits());
711 807
  808 + // 3
712 809 edgeImitator.expectMessageAmount(1);
713 810 doDelete("/api/entityView/" + savedEntityView.getId().getId().toString())
714 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 814 log.info("EntityView tested successfully");
725 815 }
... ... @@ -727,15 +817,14 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
727 817 private void testCustomer() throws Exception {
728 818 log.info("Testing Customer");
729 819
  820 + // 1
  821 + edgeImitator.expectMessageAmount(1);
730 822 Customer customer = new Customer();
731 823 customer.setTitle("Edge Customer 1");
732 824 Customer savedCustomer = doPost("/api/customer", customer, Customer.class);
733   -
734   - edgeImitator.expectMessageAmount(1);
735 825 doPost("/api/customer/" + savedCustomer.getId().getId().toString()
736 826 + "/edge/" + edge.getId().getId().toString(), Edge.class);
737   - edgeImitator.waitForMessages();
738   -
  827 + Assert.assertTrue(edgeImitator.waitForMessages());
739 828 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
740 829 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg);
741 830 CustomerUpdateMsg customerUpdateMsg = (CustomerUpdateMsg) latestMessage;
... ... @@ -743,13 +832,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
743 832 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits());
744 833 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits());
745 834 Assert.assertEquals(customerUpdateMsg.getTitle(), savedCustomer.getTitle());
746   -
747 835 testAutoGeneratedCodeByProtobuf(customerUpdateMsg);
748 836
  837 + // 2
749 838 edgeImitator.expectMessageAmount(1);
750 839 doDelete("/api/customer/edge/" + edge.getId().getId().toString(), Edge.class);
751   - edgeImitator.waitForMessages();
752   -
  840 + Assert.assertTrue(edgeImitator.waitForMessages());
753 841 latestMessage = edgeImitator.getLatestMessage();
754 842 Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg);
755 843 customerUpdateMsg = (CustomerUpdateMsg) latestMessage;
... ... @@ -757,17 +845,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
757 845 Assert.assertEquals(customerUpdateMsg.getIdMSB(), savedCustomer.getUuidId().getMostSignificantBits());
758 846 Assert.assertEquals(customerUpdateMsg.getIdLSB(), savedCustomer.getUuidId().getLeastSignificantBits());
759 847
  848 + // 3
760 849 edgeImitator.expectMessageAmount(1);
761 850 doDelete("/api/customer/" + savedCustomer.getId().getId().toString())
762 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 854 log.info("Customer tested successfully");
773 855 }
... ... @@ -775,13 +857,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
775 857 private void testWidgetsBundleAndWidgetType() throws Exception {
776 858 log.info("Testing WidgetsBundle and WidgetType");
777 859
  860 + // 1
  861 + edgeImitator.expectMessageAmount(1);
778 862 WidgetsBundle widgetsBundle = new WidgetsBundle();
779 863 widgetsBundle.setTitle("Test Widget Bundle");
780   -
781   - edgeImitator.expectMessageAmount(1);
782 864 WidgetsBundle savedWidgetsBundle = doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class);
783   - edgeImitator.waitForMessages();
784   -
  865 + Assert.assertTrue(edgeImitator.waitForMessages());
785 866 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
786 867 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg);
787 868 WidgetsBundleUpdateMsg widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage;
... ... @@ -790,20 +871,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
790 871 Assert.assertEquals(widgetsBundleUpdateMsg.getIdLSB(), savedWidgetsBundle.getUuidId().getLeastSignificantBits());
791 872 Assert.assertEquals(widgetsBundleUpdateMsg.getAlias(), savedWidgetsBundle.getAlias());
792 873 Assert.assertEquals(widgetsBundleUpdateMsg.getTitle(), savedWidgetsBundle.getTitle());
793   -
794 874 testAutoGeneratedCodeByProtobuf(widgetsBundleUpdateMsg);
795 875
  876 + // 2
  877 + edgeImitator.expectMessageAmount(1);
796 878 WidgetType widgetType = new WidgetType();
797 879 widgetType.setName("Test Widget Type");
798 880 widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
799 881 ObjectNode descriptor = mapper.createObjectNode();
800 882 descriptor.put("key", "value");
801 883 widgetType.setDescriptor(descriptor);
802   -
803   - edgeImitator.expectMessageAmount(1);
804 884 WidgetType savedWidgetType = doPost("/api/widgetType", widgetType, WidgetType.class);
805   - edgeImitator.waitForMessages();
806   -
  885 + Assert.assertTrue(edgeImitator.waitForMessages());
807 886 latestMessage = edgeImitator.getLatestMessage();
808 887 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg);
809 888 WidgetTypeUpdateMsg widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage;
... ... @@ -814,11 +893,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
814 893 Assert.assertEquals(widgetTypeUpdateMsg.getName(), savedWidgetType.getName());
815 894 Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson()), savedWidgetType.getDescriptor());
816 895
  896 + // 3
817 897 edgeImitator.expectMessageAmount(1);
818 898 doDelete("/api/widgetType/" + savedWidgetType.getId().getId().toString())
819 899 .andExpect(status().isOk());
820   - edgeImitator.waitForMessages();
821   -
  900 + Assert.assertTrue(edgeImitator.waitForMessages());
822 901 latestMessage = edgeImitator.getLatestMessage();
823 902 Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg);
824 903 widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage;
... ... @@ -826,11 +905,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
826 905 Assert.assertEquals(widgetTypeUpdateMsg.getIdMSB(), savedWidgetType.getUuidId().getMostSignificantBits());
827 906 Assert.assertEquals(widgetTypeUpdateMsg.getIdLSB(), savedWidgetType.getUuidId().getLeastSignificantBits());
828 907
  908 + // 4
829 909 edgeImitator.expectMessageAmount(1);
830 910 doDelete("/api/widgetsBundle/" + savedWidgetsBundle.getId().getId().toString())
831 911 .andExpect(status().isOk());
832   - edgeImitator.waitForMessages();
833   -
  912 + Assert.assertTrue(edgeImitator.waitForMessages());
834 913 latestMessage = edgeImitator.getLatestMessage();
835 914 Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg);
836 915 widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage;
... ... @@ -843,15 +922,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
843 922
844 923 private void testTimeseries() throws Exception {
845 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 928 String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}";
849 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 932 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
854   - edgeImitator.waitForMessages();
  933 + Assert.assertTrue(edgeImitator.waitForMessages());
855 934
856 935 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
857 936 Assert.assertTrue(latestMessage instanceof EntityDataProto);
... ... @@ -890,7 +969,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
890 969 edgeImitator.expectMessageAmount(1);
891 970 edgeEventService.saveAsync(edgeEvent);
892 971 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
893   - edgeImitator.waitForMessages();
  972 + Assert.assertTrue(edgeImitator.waitForMessages());
894 973
895 974 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
896 975 Assert.assertTrue(latestMessage instanceof EntityDataProto);
... ... @@ -916,7 +995,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
916 995 edgeImitator.expectMessageAmount(1);
917 996 edgeEventService.saveAsync(edgeEvent);
918 997 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
919   - edgeImitator.waitForMessages();
  998 + Assert.assertTrue(edgeImitator.waitForMessages());
920 999
921 1000 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
922 1001 Assert.assertTrue(latestMessage instanceof EntityDataProto);
... ... @@ -941,7 +1020,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
941 1020 edgeImitator.expectMessageAmount(1);
942 1021 edgeEventService.saveAsync(edgeEvent1);
943 1022 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
944   - edgeImitator.waitForMessages();
  1023 + Assert.assertTrue(edgeImitator.waitForMessages());
945 1024
946 1025 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
947 1026 Assert.assertTrue(latestMessage instanceof EntityDataProto);
... ... @@ -996,8 +1075,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
996 1075
997 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 1081 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1003 1082 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
... ... @@ -1013,7 +1092,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1013 1092
1014 1093 private void sendDeviceWithNameThatAlreadyExistsOnCloud() throws Exception {
1015 1094 String deviceOnCloudName = RandomStringUtils.randomAlphanumeric(15);
1016   - Device deviceOnCloud = saveDevice(deviceOnCloudName);
  1095 + Device deviceOnCloud = saveDevice(deviceOnCloudName, "Default");
1017 1096
1018 1097 UUID uuid = Uuids.timeBased();
1019 1098
... ... @@ -1033,8 +1112,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1033 1112
1034 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 1118 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1040 1119 Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
... ... @@ -1063,7 +1142,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1063 1142
1064 1143 edgeImitator.expectMessageAmount(1);
1065 1144 doPost("/api/relation", relation);
1066   - edgeImitator.waitForMessages();
  1145 + Assert.assertTrue(edgeImitator.waitForMessages());
1067 1146
1068 1147 UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
1069 1148 RelationRequestMsg.Builder relationRequestMsgBuilder = RelationRequestMsg.newBuilder();
... ... @@ -1078,8 +1157,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1078 1157 edgeImitator.expectResponsesAmount(1);
1079 1158 edgeImitator.expectMessageAmount(1);
1080 1159 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1081   - edgeImitator.waitForResponses();
1082   - edgeImitator.waitForMessages();
  1160 + Assert.assertTrue(edgeImitator.waitForResponses());
  1161 + Assert.assertTrue(edgeImitator.waitForMessages());
1083 1162
1084 1163 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1085 1164 Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
... ... @@ -1115,7 +1194,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1115 1194
1116 1195 edgeImitator.expectResponsesAmount(1);
1117 1196 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1118   - edgeImitator.waitForResponses();
  1197 + Assert.assertTrue(edgeImitator.waitForResponses());
1119 1198
1120 1199
1121 1200 List<AlarmInfo> alarms = doGetTypedWithPageLink("/api/alarm/{entityType}/{entityId}?",
... ... @@ -1158,7 +1237,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1158 1237
1159 1238 edgeImitator.expectResponsesAmount(1);
1160 1239 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1161   - edgeImitator.waitForResponses();
  1240 + Assert.assertTrue(edgeImitator.waitForResponses());
1162 1241
1163 1242 EntityRelation relation = doGet("/api/relation?" +
1164 1243 "&fromId=" + device2.getId().getId().toString() +
... ... @@ -1212,7 +1291,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1212 1291 testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder2);
1213 1292
1214 1293 edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build());
1215   - edgeImitator.waitForResponses();
  1294 + Assert.assertTrue(edgeImitator.waitForResponses());
1216 1295
1217 1296 // Wait before device attributes saved to database before requesting them from controller
1218 1297 Thread.sleep(1000);
... ... @@ -1243,8 +1322,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1243 1322 edgeImitator.expectResponsesAmount(1);
1244 1323 edgeImitator.expectMessageAmount(1);
1245 1324 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1246   - edgeImitator.waitForResponses();
1247   - edgeImitator.waitForMessages();
  1325 + Assert.assertTrue(edgeImitator.waitForResponses());
  1326 + Assert.assertTrue(edgeImitator.waitForMessages());;
1248 1327
1249 1328 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1250 1329 Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
... ... @@ -1270,8 +1349,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1270 1349 edgeImitator.expectResponsesAmount(1);
1271 1350 edgeImitator.expectMessageAmount(1);
1272 1351 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1273   - edgeImitator.waitForResponses();
1274   - edgeImitator.waitForMessages();
  1352 + Assert.assertTrue(edgeImitator.waitForResponses());
  1353 + Assert.assertTrue(edgeImitator.waitForMessages());
1275 1354
1276 1355 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1277 1356 Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
... ... @@ -1299,8 +1378,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1299 1378 edgeImitator.expectResponsesAmount(1);
1300 1379 edgeImitator.expectMessageAmount(1);
1301 1380 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1302   - edgeImitator.waitForResponses();
1303   - edgeImitator.waitForMessages();
  1381 + Assert.assertTrue(edgeImitator.waitForResponses());
  1382 + Assert.assertTrue(edgeImitator.waitForMessages());
1304 1383
1305 1384 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1306 1385 Assert.assertTrue(latestMessage instanceof DeviceCredentialsUpdateMsg);
... ... @@ -1327,7 +1406,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1327 1406
1328 1407 edgeImitator.expectResponsesAmount(1);
1329 1408 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1330   - edgeImitator.waitForResponses();
  1409 + Assert.assertTrue(edgeImitator.waitForResponses());
1331 1410 }
1332 1411
1333 1412 private void sendDeviceRpcResponse() throws Exception {
... ... @@ -1352,7 +1431,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1352 1431
1353 1432 edgeImitator.expectResponsesAmount(1);
1354 1433 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1355   - edgeImitator.waitForResponses();
  1434 + Assert.assertTrue(edgeImitator.waitForResponses());
1356 1435 }
1357 1436
1358 1437 private void sendAttributesRequest() throws Exception {
... ... @@ -1383,8 +1462,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1383 1462 edgeImitator.expectResponsesAmount(1);
1384 1463 edgeImitator.expectMessageAmount(1);
1385 1464 edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
1386   - edgeImitator.waitForResponses();
1387   - edgeImitator.waitForMessages();
  1465 + Assert.assertTrue(edgeImitator.waitForResponses());
  1466 + Assert.assertTrue(edgeImitator.waitForMessages());
1388 1467
1389 1468 AbstractMessage latestMessage = edgeImitator.getLatestMessage();
1390 1469 Assert.assertTrue(latestMessage instanceof EntityDataProto);
... ... @@ -1416,7 +1495,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1416 1495
1417 1496 edgeImitator.expectResponsesAmount(1);
1418 1497 edgeImitator.sendUplinkMsg(upLinkMsgBuilder.build());
1419   - edgeImitator.waitForResponses();
  1498 + Assert.assertTrue(edgeImitator.waitForResponses());
1420 1499 device = doGet("/api/device/" + device.getId().getId().toString(), Device.class);
1421 1500 Assert.assertNotNull(device);
1422 1501 List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
... ... @@ -1428,7 +1507,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1428 1507 private void installation() throws Exception {
1429 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 1515 doPost("/api/edge/" + edge.getId().getId().toString()
1433 1516 + "/device/" + savedDevice.getId().getId().toString(), Device.class);
1434 1517
... ... @@ -1437,6 +1520,35 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1437 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 1552 private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) {
1441 1553 EdgeEvent edgeEvent = new EdgeEvent();
1442 1554 edgeEvent.setEdgeId(edgeId);
... ...
... ... @@ -32,6 +32,7 @@ import org.thingsboard.server.gen.edge.CustomerUpdateMsg;
32 32 import org.thingsboard.server.gen.edge.DashboardUpdateMsg;
33 33 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg;
34 34 import org.thingsboard.server.gen.edge.DeviceCredentialsUpdateMsg;
  35 +import org.thingsboard.server.gen.edge.DeviceProfileUpdateMsg;
35 36 import org.thingsboard.server.gen.edge.DeviceRpcCallMsg;
36 37 import org.thingsboard.server.gen.edge.DeviceUpdateMsg;
37 38 import org.thingsboard.server.gen.edge.DownlinkMsg;
... ... @@ -58,6 +59,7 @@ import java.util.concurrent.CountDownLatch;
58 59 import java.util.concurrent.TimeUnit;
59 60 import java.util.concurrent.locks.Lock;
60 61 import java.util.concurrent.locks.ReentrantLock;
  62 +import java.util.stream.Collectors;
61 63
62 64 @Slf4j
63 65 public class EdgeImitator {
... ... @@ -154,88 +156,93 @@ public class EdgeImitator {
154 156
155 157 private ListenableFuture<List<Void>> processDownlinkMsg(DownlinkMsg downlinkMsg) {
156 158 List<ListenableFuture<Void>> result = new ArrayList<>();
157   - if (downlinkMsg.getDeviceUpdateMsgList() != null && !downlinkMsg.getDeviceUpdateMsgList().isEmpty()) {
  159 + if (downlinkMsg.getDeviceUpdateMsgCount() > 0) {
158 160 for (DeviceUpdateMsg deviceUpdateMsg: downlinkMsg.getDeviceUpdateMsgList()) {
159 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 170 for (DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg: downlinkMsg.getDeviceCredentialsUpdateMsgList()) {
164 171 result.add(saveDownlinkMsg(deviceCredentialsUpdateMsg));
165 172 }
166 173 }
167   - if (downlinkMsg.getAssetUpdateMsgList() != null && !downlinkMsg.getAssetUpdateMsgList().isEmpty()) {
  174 + if (downlinkMsg.getAssetUpdateMsgCount() > 0) {
168 175 for (AssetUpdateMsg assetUpdateMsg: downlinkMsg.getAssetUpdateMsgList()) {
169 176 result.add(saveDownlinkMsg(assetUpdateMsg));
170 177 }
171 178 }
172   - if (downlinkMsg.getRuleChainUpdateMsgList() != null && !downlinkMsg.getRuleChainUpdateMsgList().isEmpty()) {
  179 + if (downlinkMsg.getRuleChainUpdateMsgCount() > 0) {
173 180 for (RuleChainUpdateMsg ruleChainUpdateMsg: downlinkMsg.getRuleChainUpdateMsgList()) {
174 181 result.add(saveDownlinkMsg(ruleChainUpdateMsg));
175 182 }
176 183 }
177   - if (downlinkMsg.getRuleChainMetadataUpdateMsgList() != null && !downlinkMsg.getRuleChainMetadataUpdateMsgList().isEmpty()) {
  184 + if (downlinkMsg.getRuleChainMetadataUpdateMsgCount() > 0) {
178 185 for (RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg: downlinkMsg.getRuleChainMetadataUpdateMsgList()) {
179 186 result.add(saveDownlinkMsg(ruleChainMetadataUpdateMsg));
180 187 }
181 188 }
182   - if (downlinkMsg.getDashboardUpdateMsgList() != null && !downlinkMsg.getDashboardUpdateMsgList().isEmpty()) {
  189 + if (downlinkMsg.getDashboardUpdateMsgCount() > 0) {
183 190 for (DashboardUpdateMsg dashboardUpdateMsg: downlinkMsg.getDashboardUpdateMsgList()) {
184 191 result.add(saveDownlinkMsg(dashboardUpdateMsg));
185 192 }
186 193 }
187   - if (downlinkMsg.getRelationUpdateMsgList() != null && !downlinkMsg.getRelationUpdateMsgList().isEmpty()) {
  194 + if (downlinkMsg.getRelationUpdateMsgCount() > 0) {
188 195 for (RelationUpdateMsg relationUpdateMsg: downlinkMsg.getRelationUpdateMsgList()) {
189 196 result.add(saveDownlinkMsg(relationUpdateMsg));
190 197 }
191 198 }
192   - if (downlinkMsg.getAlarmUpdateMsgList() != null && !downlinkMsg.getAlarmUpdateMsgList().isEmpty()) {
  199 + if (downlinkMsg.getAlarmUpdateMsgCount() > 0) {
193 200 for (AlarmUpdateMsg alarmUpdateMsg: downlinkMsg.getAlarmUpdateMsgList()) {
194 201 result.add(saveDownlinkMsg(alarmUpdateMsg));
195 202 }
196 203 }
197   - if (downlinkMsg.getEntityDataList() != null && !downlinkMsg.getEntityDataList().isEmpty()) {
  204 + if (downlinkMsg.getEntityDataCount() > 0) {
198 205 for (EntityDataProto entityData: downlinkMsg.getEntityDataList()) {
199 206 result.add(saveDownlinkMsg(entityData));
200 207 }
201 208 }
202   - if (downlinkMsg.getEntityViewUpdateMsgList() != null && !downlinkMsg.getEntityViewUpdateMsgList().isEmpty()) {
  209 + if (downlinkMsg.getEntityViewUpdateMsgCount() > 0) {
203 210 for (EntityViewUpdateMsg entityViewUpdateMsg: downlinkMsg.getEntityViewUpdateMsgList()) {
204 211 result.add(saveDownlinkMsg(entityViewUpdateMsg));
205 212 }
206 213 }
207   - if (downlinkMsg.getCustomerUpdateMsgList() != null && !downlinkMsg.getCustomerUpdateMsgList().isEmpty()) {
  214 + if (downlinkMsg.getCustomerUpdateMsgCount() > 0) {
208 215 for (CustomerUpdateMsg customerUpdateMsg: downlinkMsg.getCustomerUpdateMsgList()) {
209 216 result.add(saveDownlinkMsg(customerUpdateMsg));
210 217 }
211 218 }
212   - if (downlinkMsg.getWidgetsBundleUpdateMsgList() != null && !downlinkMsg.getWidgetsBundleUpdateMsgList().isEmpty()) {
  219 + if (downlinkMsg.getWidgetsBundleUpdateMsgCount() > 0) {
213 220 for (WidgetsBundleUpdateMsg widgetsBundleUpdateMsg: downlinkMsg.getWidgetsBundleUpdateMsgList()) {
214 221 result.add(saveDownlinkMsg(widgetsBundleUpdateMsg));
215 222 }
216 223 }
217   - if (downlinkMsg.getWidgetTypeUpdateMsgList() != null && !downlinkMsg.getWidgetTypeUpdateMsgList().isEmpty()) {
  224 + if (downlinkMsg.getWidgetTypeUpdateMsgCount() > 0) {
218 225 for (WidgetTypeUpdateMsg widgetTypeUpdateMsg: downlinkMsg.getWidgetTypeUpdateMsgList()) {
219 226 result.add(saveDownlinkMsg(widgetTypeUpdateMsg));
220 227 }
221 228 }
222   - if (downlinkMsg.getUserUpdateMsgList() != null && !downlinkMsg.getUserUpdateMsgList().isEmpty()) {
  229 + if (downlinkMsg.getUserUpdateMsgCount() > 0) {
223 230 for (UserUpdateMsg userUpdateMsg: downlinkMsg.getUserUpdateMsgList()) {
224 231 onUserUpdate(userUpdateMsg);
225 232 result.add(saveDownlinkMsg(userUpdateMsg));
226 233 }
227 234 }
228   - if (downlinkMsg.getUserCredentialsUpdateMsgList() != null && !downlinkMsg.getUserCredentialsUpdateMsgList().isEmpty()) {
  235 + if (downlinkMsg.getUserCredentialsUpdateMsgCount() > 0) {
229 236 for (UserCredentialsUpdateMsg userCredentialsUpdateMsg: downlinkMsg.getUserCredentialsUpdateMsgList()) {
230 237 result.add(saveDownlinkMsg(userCredentialsUpdateMsg));
231 238 }
232 239 }
233   - if (downlinkMsg.getDeviceRpcCallMsgList() != null && !downlinkMsg.getDeviceRpcCallMsgList().isEmpty()) {
  240 + if (downlinkMsg.getDeviceRpcCallMsgCount() > 0) {
234 241 for (DeviceRpcCallMsg deviceRpcCallMsg: downlinkMsg.getDeviceRpcCallMsgList()) {
235 242 result.add(saveDownlinkMsg(deviceRpcCallMsg));
236 243 }
237 244 }
238   - if (downlinkMsg.getDeviceCredentialsRequestMsgList() != null && !downlinkMsg.getDeviceCredentialsRequestMsgList().isEmpty()) {
  245 + if (downlinkMsg.getDeviceCredentialsRequestMsgCount() > 0) {
239 246 for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg: downlinkMsg.getDeviceCredentialsRequestMsgList()) {
240 247 result.add(saveDownlinkMsg(deviceCredentialsRequestMsg));
241 248 }
... ... @@ -256,15 +263,21 @@ public class EdgeImitator {
256 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 274 public void expectMessageAmount(int messageAmount) {
264 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 282 public void expectResponsesAmount(int messageAmount) {
270 283 responsesLatch = new CountDownLatch(messageAmount);
... ... @@ -282,6 +295,18 @@ public class EdgeImitator {
282 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 310 public AbstractMessage getLatestMessage() {
286 311 return downlinkMsgs.get(downlinkMsgs.size() - 1);
287 312 }
... ...