Commit eb16527e4dc6017038c5f3dc93e04a953b19299a

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

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

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