Commit 43b913ffdb45b14f9a2e6cdc0b2ac1b44be37ee5

Authored by Bohdan Smetaniuk
1 parent a6ae072b

edge services test

  1 +/**
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.edge;
  17 +
  18 +import com.fasterxml.jackson.core.type.TypeReference;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.junit.After;
  21 +import org.junit.Assert;
  22 +import org.junit.Before;
  23 +import org.junit.Test;
  24 +import org.springframework.beans.factory.annotation.Autowired;
  25 +import org.thingsboard.server.common.data.Dashboard;
  26 +import org.thingsboard.server.common.data.DashboardInfo;
  27 +import org.thingsboard.server.common.data.Device;
  28 +import org.thingsboard.server.common.data.EntityType;
  29 +import org.thingsboard.server.common.data.Tenant;
  30 +import org.thingsboard.server.common.data.User;
  31 +import org.thingsboard.server.common.data.alarm.Alarm;
  32 +import org.thingsboard.server.common.data.alarm.AlarmInfo;
  33 +import org.thingsboard.server.common.data.alarm.AlarmSeverity;
  34 +import org.thingsboard.server.common.data.alarm.AlarmStatus;
  35 +import org.thingsboard.server.common.data.asset.Asset;
  36 +import org.thingsboard.server.common.data.edge.Edge;
  37 +import org.thingsboard.server.common.data.id.TenantId;
  38 +import org.thingsboard.server.common.data.page.TextPageLink;
  39 +import org.thingsboard.server.common.data.page.TimePageData;
  40 +import org.thingsboard.server.common.data.relation.EntityRelation;
  41 +import org.thingsboard.server.common.data.relation.RelationTypeGroup;
  42 +import org.thingsboard.server.common.data.rule.RuleChain;
  43 +import org.thingsboard.server.common.data.rule.RuleChainType;
  44 +import org.thingsboard.server.common.data.security.Authority;
  45 +import org.thingsboard.server.controller.AbstractControllerTest;
  46 +import org.thingsboard.server.dao.rule.RuleChainService;
  47 +import org.thingsboard.server.edge.imitator.EdgeImitator;
  48 +import org.thingsboard.server.gen.edge.EdgeConfiguration;
  49 +
  50 +import java.util.List;
  51 +import java.util.Map;
  52 +import java.util.Set;
  53 +import java.util.UUID;
  54 +
  55 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  56 +
  57 +
  58 +@Slf4j
  59 +abstract public class BaseEdgeTest extends AbstractControllerTest {
  60 +
  61 + private Tenant savedTenant;
  62 + private TenantId tenantId;
  63 + private User tenantAdmin;
  64 +
  65 + private EdgeImitator edgeImitator;
  66 + private Edge edge;
  67 +
  68 + @Autowired
  69 + RuleChainService ruleChainService;
  70 +
  71 + @Before
  72 + public void beforeTest() throws Exception {
  73 + loginSysAdmin();
  74 +
  75 + Tenant tenant = new Tenant();
  76 + tenant.setTitle("My tenant");
  77 + savedTenant = doPost("/api/tenant", tenant, Tenant.class);
  78 + tenantId = savedTenant.getId();
  79 + Assert.assertNotNull(savedTenant);
  80 +
  81 + tenantAdmin = new User();
  82 + tenantAdmin.setAuthority(Authority.TENANT_ADMIN);
  83 + tenantAdmin.setTenantId(savedTenant.getId());
  84 + tenantAdmin.setEmail("tenant2@thingsboard.org");
  85 + tenantAdmin.setFirstName("Joe");
  86 + tenantAdmin.setLastName("Downs");
  87 +
  88 + tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1");
  89 +
  90 + installation();
  91 +
  92 + edgeImitator = new EdgeImitator("localhost", 7070, edge.getRoutingKey(), edge.getSecret());
  93 + edgeImitator.connect();
  94 + Thread.sleep(5000);
  95 + }
  96 +
  97 + @After
  98 + public void afterTest() throws Exception {
  99 + edgeImitator.disconnect();
  100 + uninstallation();
  101 +
  102 + loginSysAdmin();
  103 +
  104 + doDelete("/api/tenant/" + savedTenant.getId().getId().toString())
  105 + .andExpect(status().isOk());
  106 + }
  107 +
  108 +
  109 + @Test
  110 + public void test() throws Exception {
  111 + testReceivedData();
  112 + testDevices();
  113 + testAssets();
  114 + testRuleChains();
  115 + testDashboards();
  116 + testRelations();
  117 + testAlarms();
  118 + }
  119 +
  120 + private void testReceivedData() throws Exception {
  121 + log.info("Checking received data");
  122 + EdgeConfiguration configuration = edgeImitator.getStorage().getConfiguration();
  123 + Assert.assertNotNull(configuration);
  124 +
  125 + Map<UUID, EntityType> entities = edgeImitator.getStorage().getEntities();
  126 + Assert.assertFalse(entities.isEmpty());
  127 +
  128 + Set<UUID> devices = edgeImitator.getStorage().getEntitiesByType(EntityType.DEVICE);
  129 + Assert.assertEquals(1, devices.size());
  130 + TimePageData<Device> pageDataDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  131 + new TypeReference<TimePageData<Device>>() {}, new TextPageLink(100));
  132 + for (Device device: pageDataDevices.getData()) {
  133 + Assert.assertTrue(devices.contains(device.getUuidId()));
  134 + }
  135 +
  136 + Set<UUID> assets = edgeImitator.getStorage().getEntitiesByType(EntityType.ASSET);
  137 + Assert.assertEquals(1, assets.size());
  138 + TimePageData<Asset> pageDataAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
  139 + new TypeReference<TimePageData<Asset>>() {}, new TextPageLink(100));
  140 + for (Asset asset: pageDataAssets.getData()) {
  141 + Assert.assertTrue(assets.contains(asset.getUuidId()));
  142 + }
  143 +
  144 + Set<UUID> ruleChains = edgeImitator.getStorage().getEntitiesByType(EntityType.RULE_CHAIN);
  145 + Assert.assertEquals(1, ruleChains.size());
  146 + TimePageData<RuleChain> pageDataRuleChains = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/ruleChains?",
  147 + new TypeReference<TimePageData<RuleChain>>() {}, new TextPageLink(100));
  148 + for (RuleChain ruleChain: pageDataRuleChains.getData()) {
  149 + Assert.assertTrue(ruleChains.contains(ruleChain.getUuidId()));
  150 + }
  151 + log.info("Received data checked");
  152 + }
  153 +
  154 + private void testDevices() throws Exception {
  155 + log.info("Testing devices");
  156 + Device device = new Device();
  157 + device.setName("Edge Device 2");
  158 + device.setType("test");
  159 + Device savedDevice = doPost("/api/device", device, Device.class);
  160 + doPost("/api/edge/" + edge.getId().getId().toString()
  161 + + "/device/" + savedDevice.getId().getId().toString(), Device.class);
  162 +
  163 + TimePageData<Device> pageDataDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  164 + new TypeReference<TimePageData<Device>>() {}, new TextPageLink(100));
  165 + Assert.assertTrue(pageDataDevices.getData().contains(savedDevice));
  166 + Thread.sleep(1000);
  167 + Set<UUID> devices = edgeImitator.getStorage().getEntitiesByType(EntityType.DEVICE);
  168 + Assert.assertEquals(2, devices.size());
  169 + Assert.assertTrue(devices.contains(savedDevice.getUuidId()));
  170 +
  171 + doDelete("/api/edge/" + edge.getId().getId().toString()
  172 + + "/device/" + savedDevice.getId().getId().toString(), Device.class);
  173 + pageDataDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  174 + new TypeReference<TimePageData<Device>>() {}, new TextPageLink(100));
  175 + Assert.assertFalse(pageDataDevices.getData().contains(savedDevice));
  176 + Thread.sleep(1000);
  177 + devices = edgeImitator.getStorage().getEntitiesByType(EntityType.DEVICE);
  178 + Assert.assertEquals(1, devices.size());
  179 + Assert.assertFalse(devices.contains(savedDevice.getUuidId()));
  180 +
  181 + doDelete("/api/device/" + savedDevice.getId().getId().toString())
  182 + .andExpect(status().isOk());
  183 + log.info("Devices tested successfully");
  184 + }
  185 +
  186 + private void testAssets() throws Exception {
  187 + log.info("Testing assets");
  188 + Asset asset = new Asset();
  189 + asset.setName("Edge Asset 2");
  190 + asset.setType("test");
  191 + Asset savedAsset = doPost("/api/asset", asset, Asset.class);
  192 + doPost("/api/edge/" + edge.getId().getId().toString()
  193 + + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
  194 +
  195 + TimePageData<Asset> pageDataAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
  196 + new TypeReference<TimePageData<Asset>>() {}, new TextPageLink(100));
  197 + Assert.assertTrue(pageDataAssets.getData().contains(savedAsset));
  198 + Thread.sleep(1000);
  199 + Set<UUID> assets = edgeImitator.getStorage().getEntitiesByType(EntityType.ASSET);
  200 + Assert.assertEquals(2, assets.size());
  201 + Assert.assertTrue(assets.contains(savedAsset.getUuidId()));
  202 +
  203 + doDelete("/api/edge/" + edge.getId().getId().toString()
  204 + + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
  205 + pageDataAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
  206 + new TypeReference<TimePageData<Asset>>() {}, new TextPageLink(100));
  207 + Assert.assertFalse(pageDataAssets.getData().contains(savedAsset));
  208 + Thread.sleep(1000);
  209 + assets = edgeImitator.getStorage().getEntitiesByType(EntityType.ASSET);
  210 + Assert.assertEquals(1, assets.size());
  211 + Assert.assertFalse(assets.contains(savedAsset.getUuidId()));
  212 +
  213 + doDelete("/api/asset/" + savedAsset.getId().getId().toString())
  214 + .andExpect(status().isOk());
  215 + log.info("Assets tested successfully");
  216 + }
  217 +
  218 + private void testRuleChains() throws Exception {
  219 + log.info("Testing RuleChains");
  220 + RuleChain ruleChain = new RuleChain();
  221 + ruleChain.setName("Edge Test Rule Chain");
  222 + ruleChain.setType(RuleChainType.EDGE);
  223 + RuleChain savedRuleChain = doPost("/api/ruleChain", ruleChain, RuleChain.class);
  224 + doPost("/api/edge/" + edge.getId().getId().toString()
  225 + + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
  226 +
  227 + TimePageData<RuleChain> pageDataRuleChain = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/ruleChains?",
  228 + new TypeReference<TimePageData<RuleChain>>() {}, new TextPageLink(100));
  229 + Assert.assertTrue(pageDataRuleChain.getData().contains(savedRuleChain));
  230 + Thread.sleep(1000);
  231 + Set<UUID> ruleChains = edgeImitator.getStorage().getEntitiesByType(EntityType.RULE_CHAIN);
  232 + Assert.assertEquals(2, ruleChains.size());
  233 + Assert.assertTrue(ruleChains.contains(savedRuleChain.getUuidId()));
  234 +
  235 + doDelete("/api/edge/" + edge.getId().getId().toString()
  236 + + "/ruleChain/" + savedRuleChain.getId().getId().toString(), RuleChain.class);
  237 + pageDataRuleChain = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/ruleChains?",
  238 + new TypeReference<TimePageData<RuleChain>>() {}, new TextPageLink(100));
  239 + Assert.assertFalse(pageDataRuleChain.getData().contains(savedRuleChain));
  240 + Thread.sleep(1000);
  241 + ruleChains = edgeImitator.getStorage().getEntitiesByType(EntityType.RULE_CHAIN);
  242 + Assert.assertEquals(1, ruleChains.size());
  243 + Assert.assertFalse(ruleChains.contains(savedRuleChain.getUuidId()));
  244 +
  245 + doDelete("/api/ruleChain/" + savedRuleChain.getId().getId().toString())
  246 + .andExpect(status().isOk());
  247 + log.info("RuleChains tested successfully");
  248 +
  249 + }
  250 +
  251 + private void testDashboards() throws Exception {
  252 + log.info("Testing Dashboards");
  253 + Dashboard dashboard = new Dashboard();
  254 + dashboard.setTitle("Edge Test Dashboard");
  255 + Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class);
  256 + doPost("/api/edge/" + edge.getId().getId().toString()
  257 + + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class);
  258 +
  259 + TimePageData<DashboardInfo> pageDataDashboard = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/dashboards?",
  260 + new TypeReference<TimePageData<DashboardInfo>>() {}, new TextPageLink(100));
  261 + Assert.assertTrue(pageDataDashboard.getData().stream().allMatch(dashboardInfo -> dashboardInfo.getUuidId().equals(savedDashboard.getUuidId())));
  262 + Thread.sleep(1000);
  263 + Set<UUID> dashboards = edgeImitator.getStorage().getEntitiesByType(EntityType.DASHBOARD);
  264 + Assert.assertEquals(1, dashboards.size());
  265 + Assert.assertTrue(dashboards.contains(savedDashboard.getUuidId()));
  266 +
  267 + doDelete("/api/edge/" + edge.getId().getId().toString()
  268 + + "/dashboard/" + savedDashboard.getId().getId().toString(), Dashboard.class);
  269 + pageDataDashboard = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/dashboards?",
  270 + new TypeReference<TimePageData<DashboardInfo>>() {}, new TextPageLink(100));
  271 + Assert.assertFalse(pageDataDashboard.getData().stream().anyMatch(dashboardInfo -> dashboardInfo.getUuidId().equals(savedDashboard.getUuidId())));
  272 + Thread.sleep(1000);
  273 + dashboards = edgeImitator.getStorage().getEntitiesByType(EntityType.DASHBOARD);
  274 + Assert.assertEquals(0, dashboards.size());
  275 + Assert.assertFalse(dashboards.contains(savedDashboard.getUuidId()));
  276 +
  277 + doDelete("/api/dashboard/" + savedDashboard.getId().getId().toString())
  278 + .andExpect(status().isOk());
  279 + log.info("Dashboards tested successfully");
  280 +
  281 + }
  282 +
  283 + private void installation() throws Exception {
  284 + edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class);
  285 +
  286 + Device device = new Device();
  287 + device.setName("Edge Device 1");
  288 + device.setType("test");
  289 + Device savedDevice = doPost("/api/device", device, Device.class);
  290 + doPost("/api/edge/" + edge.getId().getId().toString()
  291 + + "/device/" + savedDevice.getId().getId().toString(), Device.class);
  292 +
  293 + Asset asset = new Asset();
  294 + asset.setName("Edge Asset 1");
  295 + asset.setType("test");
  296 + Asset savedAsset = doPost("/api/asset", asset, Asset.class);
  297 + doPost("/api/edge/" + edge.getId().getId().toString()
  298 + + "/asset/" + savedAsset.getId().getId().toString(), Asset.class);
  299 + }
  300 +
  301 + private void uninstallation() throws Exception {
  302 +
  303 + TimePageData<Device> pageDataDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  304 + new TypeReference<TimePageData<Device>>() {}, new TextPageLink(100));
  305 + for (Device device: pageDataDevices.getData()) {
  306 + doDelete("/api/device/" + device.getId().getId().toString())
  307 + .andExpect(status().isOk());
  308 + }
  309 +
  310 + TimePageData<Asset> pageDataAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
  311 + new TypeReference<TimePageData<Asset>>() {}, new TextPageLink(100));
  312 + for (Asset asset: pageDataAssets.getData()) {
  313 + doDelete("/api/asset/" + asset.getId().getId().toString())
  314 + .andExpect(status().isOk());
  315 + }
  316 +
  317 + doDelete("/api/edge/" + edge.getId().getId().toString())
  318 + .andExpect(status().isOk());
  319 + }
  320 +
  321 + private void testRelations() throws Exception {
  322 + log.info("Testing Relations");
  323 + List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  324 + new TypeReference<TimePageData<Device>>() {}, new TextPageLink(100)).getData();
  325 + List<Asset> edgeAssets = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/assets?",
  326 + new TypeReference<TimePageData<Asset>>() {}, new TextPageLink(100)).getData();
  327 +
  328 + Assert.assertEquals(1, edgeDevices.size());
  329 + Assert.assertEquals(1, edgeAssets.size());
  330 + Device device = edgeDevices.get(0);
  331 + Asset asset = edgeAssets.get(0);
  332 + Assert.assertEquals("Edge Device 1", device.getName());
  333 + Assert.assertEquals("Edge Asset 1", asset.getName());
  334 +
  335 + EntityRelation relation = new EntityRelation();
  336 + relation.setType("test");
  337 + relation.setFrom(device.getId());
  338 + relation.setTo(asset.getId());
  339 + relation.setTypeGroup(RelationTypeGroup.COMMON);
  340 + doPost("/api/relation", relation);
  341 +
  342 + Thread.sleep(1000);
  343 + List<EntityRelation> relations = edgeImitator.getStorage().getRelations();
  344 + Assert.assertEquals(1, relations.size());
  345 + Assert.assertTrue(relations.contains(relation));
  346 + doDelete("/api/relation?" +
  347 + "fromId=" + relation.getFrom().getId().toString() +
  348 + "&fromType=" + relation.getFrom().getEntityType().name() +
  349 + "&relationType=" + relation.getType() +
  350 + "&relationTypeGroup=" + relation.getTypeGroup().name() +
  351 + "&toId=" + relation.getTo().getId().toString() +
  352 + "&toType=" + relation.getTo().getEntityType().name())
  353 + .andExpect(status().isOk());
  354 +
  355 + Thread.sleep(1000);
  356 + relations = edgeImitator.getStorage().getRelations();
  357 + Assert.assertEquals(0, relations.size());
  358 + Assert.assertFalse(relations.contains(relation));
  359 + log.info("Relations tested successfully");
  360 + }
  361 +
  362 +
  363 + private void testAlarms() throws Exception {
  364 + log.info("Testing Alarms");
  365 + List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?",
  366 + new TypeReference<TimePageData<Device>>() {}, new TextPageLink(100)).getData();
  367 + Assert.assertEquals(1, edgeDevices.size());
  368 + Device device = edgeDevices.get(0);
  369 + Assert.assertEquals("Edge Device 1", device.getName());
  370 +
  371 + Alarm alarm = new Alarm();
  372 + alarm.setOriginator(device.getId());
  373 + alarm.setStatus(AlarmStatus.ACTIVE_UNACK);
  374 + alarm.setType("alarm");
  375 + alarm.setSeverity(AlarmSeverity.CRITICAL);
  376 +
  377 + Alarm savedAlarm = doPost("/api/alarm", alarm, Alarm.class);
  378 + AlarmInfo alarmInfo = doGet("/api/alarm/info/" + savedAlarm.getId().getId().toString(), AlarmInfo.class);
  379 + Thread.sleep(1000);
  380 +
  381 + Assert.assertEquals(1, edgeImitator.getStorage().getAlarms().size());
  382 + Assert.assertTrue(edgeImitator.getStorage().getAlarms().containsKey(alarmInfo.getType()));
  383 + Assert.assertEquals(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()), alarmInfo.getStatus());
  384 + doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/ack");
  385 +
  386 + Thread.sleep(1000);
  387 + alarmInfo = doGet("/api/alarm/info/" + savedAlarm.getId().getId().toString(), AlarmInfo.class);
  388 + Assert.assertTrue(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()).isAck());
  389 + Assert.assertEquals(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()), alarmInfo.getStatus());
  390 + doPost("/api/alarm/" + savedAlarm.getId().getId().toString() + "/clear");
  391 +
  392 + Thread.sleep(1000);
  393 + alarmInfo = doGet("/api/alarm/info/" + savedAlarm.getId().getId().toString(), AlarmInfo.class);
  394 + Assert.assertTrue(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()).isAck());
  395 + Assert.assertTrue(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()).isCleared());
  396 + Assert.assertEquals(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()), alarmInfo.getStatus());
  397 +
  398 + doDelete("/api/alarm/" + savedAlarm.getId().getId().toString())
  399 + .andExpect(status().isOk());
  400 + log.info("Alarms tested successfully");
  401 + }
  402 +
  403 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.edge;
  17 +
  18 +import org.cassandraunit.dataset.cql.ClassPathCQLDataSet;
  19 +import org.junit.BeforeClass;
  20 +import org.junit.ClassRule;
  21 +import org.junit.extensions.cpsuite.ClasspathSuite;
  22 +import org.junit.runner.RunWith;
  23 +import org.thingsboard.server.dao.CustomCassandraCQLUnit;
  24 +import org.thingsboard.server.queue.memory.InMemoryStorage;
  25 +
  26 +import java.util.Arrays;
  27 +
  28 +@RunWith(ClasspathSuite.class)
  29 +@ClasspathSuite.ClassnameFilters({
  30 + "org.thingsboard.server.edge.nosql.*Test"})
  31 +public class EdgeNoSqlTestSuite {
  32 +
  33 + @ClassRule
  34 + public static CustomCassandraCQLUnit cassandraUnit =
  35 + new CustomCassandraCQLUnit(
  36 + Arrays.asList(
  37 + new ClassPathCQLDataSet("cassandra/schema-ts.cql", false, false),
  38 + new ClassPathCQLDataSet("cassandra/schema-entities.cql", false, false),
  39 + new ClassPathCQLDataSet("cassandra/system-data.cql", false, false),
  40 + new ClassPathCQLDataSet("cassandra/system-test.cql", false, false)),
  41 + "cassandra-test.yaml", 30000l);
  42 +
  43 + @BeforeClass
  44 + public static void cleanupInMemStorage(){
  45 + InMemoryStorage.getInstance().cleanup();
  46 + }
  47 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.edge;
  17 +
  18 +import org.junit.BeforeClass;
  19 +import org.junit.ClassRule;
  20 +import org.junit.extensions.cpsuite.ClasspathSuite;
  21 +import org.junit.runner.RunWith;
  22 +import org.thingsboard.server.dao.CustomSqlUnit;
  23 +import org.thingsboard.server.queue.memory.InMemoryStorage;
  24 +
  25 +import java.util.Arrays;
  26 +
  27 +@RunWith(ClasspathSuite.class)
  28 +@ClasspathSuite.ClassnameFilters({"org.thingsboard.server.edge.sql.*Test"})
  29 +public class EdgeSqlTestSuite {
  30 +
  31 + @ClassRule
  32 + public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
  33 + Arrays.asList("sql/schema-ts-hsql.sql", "sql/schema-entities-hsql.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql"),
  34 + "sql/hsql/drop-all-tables.sql",
  35 + "sql-test.properties");
  36 +
  37 + @BeforeClass
  38 + public static void cleanupInMemStorage(){
  39 + InMemoryStorage.getInstance().cleanup();
  40 + }
  41 +}
... ...
application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java renamed from msa/black-box-tests/src/test/java/org/thingsboard/server/msa/edge/EdgeImitator.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.msa.edge;
  16 +package org.thingsboard.server.edge.imitator;
17 17
18 18 import com.google.common.util.concurrent.FutureCallback;
19 19 import com.google.common.util.concurrent.Futures;
... ... @@ -24,7 +24,7 @@ import lombok.extern.slf4j.Slf4j;
24 24 import org.checkerframework.checker.nullness.qual.Nullable;
25 25 import org.thingsboard.edge.rpc.EdgeGrpcClient;
26 26 import org.thingsboard.edge.rpc.EdgeRpcClient;
27   -import org.thingsboard.server.common.data.edge.EdgeEventType;
  27 +import org.thingsboard.server.common.data.EntityType;
28 28 import org.thingsboard.server.gen.edge.AlarmUpdateMsg;
29 29 import org.thingsboard.server.gen.edge.AssetUpdateMsg;
30 30 import org.thingsboard.server.gen.edge.DashboardUpdateMsg;
... ... @@ -32,7 +32,6 @@ import org.thingsboard.server.gen.edge.DeviceUpdateMsg;
32 32 import org.thingsboard.server.gen.edge.DownlinkMsg;
33 33 import org.thingsboard.server.gen.edge.DownlinkResponseMsg;
34 34 import org.thingsboard.server.gen.edge.EdgeConfiguration;
35   -import org.thingsboard.server.gen.edge.EntityDataProto;
36 35 import org.thingsboard.server.gen.edge.RelationUpdateMsg;
37 36 import org.thingsboard.server.gen.edge.RuleChainUpdateMsg;
38 37 import org.thingsboard.server.gen.edge.UplinkResponseMsg;
... ... @@ -75,7 +74,7 @@ public class EdgeImitator {
75 74 this::onUplinkResponse,
76 75 this::onEdgeUpdate,
77 76 this::onDownlink,
78   - this::onError);
  77 + this::onClose);
79 78 }
80 79
81 80 public void disconnect() throws InterruptedException {
... ... @@ -107,30 +106,30 @@ public class EdgeImitator {
107 106 }, MoreExecutors.directExecutor());
108 107 }
109 108
110   - private void onError(Exception e) {
111   - log.error("Error during Edge lifecycle: ", e);
  109 + private void onClose(Exception e) {
  110 + log.info("onClose: {}", e.getMessage());
112 111 }
113 112
114 113 private ListenableFuture<List<Void>> processDownlinkMsg(DownlinkMsg downlinkMsg) {
115 114 List<ListenableFuture<Void>> result = new ArrayList<>();
116 115 if (downlinkMsg.getDeviceUpdateMsgList() != null && !downlinkMsg.getDeviceUpdateMsgList().isEmpty()) {
117 116 for (DeviceUpdateMsg deviceUpdateMsg: downlinkMsg.getDeviceUpdateMsgList()) {
118   - result.add(storage.processEntity(deviceUpdateMsg.getMsgType(), EdgeEventType.DEVICE, new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB())));
  117 + result.add(storage.processEntity(deviceUpdateMsg.getMsgType(), EntityType.DEVICE, new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB())));
119 118 }
120 119 }
121 120 if (downlinkMsg.getAssetUpdateMsgList() != null && !downlinkMsg.getAssetUpdateMsgList().isEmpty()) {
122 121 for (AssetUpdateMsg assetUpdateMsg: downlinkMsg.getAssetUpdateMsgList()) {
123   - result.add(storage.processEntity(assetUpdateMsg.getMsgType(), EdgeEventType.ASSET, new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB())));
  122 + result.add(storage.processEntity(assetUpdateMsg.getMsgType(), EntityType.ASSET, new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB())));
124 123 }
125 124 }
126 125 if (downlinkMsg.getRuleChainUpdateMsgList() != null && !downlinkMsg.getRuleChainUpdateMsgList().isEmpty()) {
127 126 for (RuleChainUpdateMsg ruleChainUpdateMsg: downlinkMsg.getRuleChainUpdateMsgList()) {
128   - result.add(storage.processEntity(ruleChainUpdateMsg.getMsgType(), EdgeEventType.RULE_CHAIN, new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB())));
  127 + result.add(storage.processEntity(ruleChainUpdateMsg.getMsgType(), EntityType.RULE_CHAIN, new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB())));
129 128 }
130 129 }
131 130 if (downlinkMsg.getDashboardUpdateMsgList() != null && !downlinkMsg.getDashboardUpdateMsgList().isEmpty()) {
132 131 for (DashboardUpdateMsg dashboardUpdateMsg: downlinkMsg.getDashboardUpdateMsgList()) {
133   - result.add(storage.processEntity(dashboardUpdateMsg.getMsgType(), EdgeEventType.DASHBOARD, new UUID(dashboardUpdateMsg.getIdMSB(), dashboardUpdateMsg.getIdLSB())));
  132 + result.add(storage.processEntity(dashboardUpdateMsg.getMsgType(), EntityType.DASHBOARD, new UUID(dashboardUpdateMsg.getIdMSB(), dashboardUpdateMsg.getIdLSB())));
134 133 }
135 134 }
136 135 if (downlinkMsg.getRelationUpdateMsgList() != null && !downlinkMsg.getRelationUpdateMsgList().isEmpty()) {
... ... @@ -143,13 +142,6 @@ public class EdgeImitator {
143 142 result.add(storage.processAlarm(alarmUpdateMsg));
144 143 }
145 144 }
146   - if (downlinkMsg.getEntityDataList() != null && !downlinkMsg.getEntityDataList().isEmpty()) {
147   - for (EntityDataProto entityDataProto: downlinkMsg.getEntityDataList()) {
148   - if (entityDataProto.hasPostTelemetryMsg()) {
149   - result.add(storage.processTelemetry(new UUID(entityDataProto.getEntityIdMSB(), entityDataProto.getEntityIdLSB()), entityDataProto.getPostTelemetryMsg()));
150   - }
151   - }
152   - }
153 145 return Futures.allAsList(result);
154 146 }
155 147
... ...
application/src/test/java/org/thingsboard/server/edge/imitator/EdgeStorage.java renamed from msa/black-box-tests/src/test/java/org/thingsboard/server/msa/edge/EdgeStorage.java
... ... @@ -13,15 +13,15 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.msa.edge;
  16 +package org.thingsboard.server.edge.imitator;
17 17
18 18 import com.google.common.util.concurrent.Futures;
19 19 import com.google.common.util.concurrent.ListenableFuture;
20 20 import lombok.Getter;
21 21 import lombok.Setter;
22 22 import lombok.extern.slf4j.Slf4j;
  23 +import org.thingsboard.server.common.data.EntityType;
23 24 import org.thingsboard.server.common.data.alarm.AlarmStatus;
24   -import org.thingsboard.server.common.data.edge.EdgeEventType;
25 25 import org.thingsboard.server.common.data.id.EntityIdFactory;
26 26 import org.thingsboard.server.common.data.relation.EntityRelation;
27 27 import org.thingsboard.server.common.data.relation.RelationTypeGroup;
... ... @@ -29,7 +29,6 @@ import org.thingsboard.server.gen.edge.AlarmUpdateMsg;
29 29 import org.thingsboard.server.gen.edge.EdgeConfiguration;
30 30 import org.thingsboard.server.gen.edge.RelationUpdateMsg;
31 31 import org.thingsboard.server.gen.edge.UpdateMsgType;
32   -import org.thingsboard.server.gen.transport.TransportProtos;
33 32
34 33 import java.util.ArrayList;
35 34 import java.util.HashMap;
... ... @@ -46,20 +45,17 @@ public class EdgeStorage {
46 45
47 46 private EdgeConfiguration configuration;
48 47
49   - private Map<UUID, EdgeEventType> entities;
  48 + private Map<UUID, EntityType> entities;
50 49 private Map<String, AlarmStatus> alarms;
51 50 private List<EntityRelation> relations;
52   - private Map<UUID, TransportProtos.PostTelemetryMsg> latestTelemetry;
53   -
54 51
55 52 public EdgeStorage() {
56 53 entities = new HashMap<>();
57 54 alarms = new HashMap<>();
58 55 relations = new ArrayList<>();
59   - latestTelemetry = new HashMap<>();
60 56 }
61 57
62   - public ListenableFuture<Void> processEntity(UpdateMsgType msgType, EdgeEventType type, UUID uuid) {
  58 + public ListenableFuture<Void> processEntity(UpdateMsgType msgType, EntityType type, UUID uuid) {
63 59 switch (msgType) {
64 60 case ENTITY_CREATED_RPC_MESSAGE:
65 61 case ENTITY_UPDATED_RPC_MESSAGE:
... ... @@ -105,16 +101,10 @@ public class EdgeStorage {
105 101 return Futures.immediateFuture(null);
106 102 }
107 103
108   - public ListenableFuture<Void> processTelemetry(UUID uuid, TransportProtos.PostTelemetryMsg telemetryMsg) {
109   - latestTelemetry.put(uuid, telemetryMsg);
110   - return Futures.immediateFuture(null);
111   - }
112   -
113   - public Set<UUID> getEntitiesByType(EdgeEventType type) {
114   - Map<UUID, EdgeEventType> filtered = entities.entrySet().stream()
  104 + public Set<UUID> getEntitiesByType(EntityType type) {
  105 + return entities.entrySet().stream()
115 106 .filter(entry -> entry.getValue().equals(type))
116   - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
117   - return filtered.keySet();
  107 + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)).keySet();
118 108 }
119 109
120 110 }
... ...
  1 +/**
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.edge.nosql;
  17 +
  18 +import org.thingsboard.server.dao.service.DaoNoSqlTest;
  19 +import org.thingsboard.server.edge.BaseEdgeTest;
  20 +
  21 +@DaoNoSqlTest
  22 +public class EdgeNoSqlTest extends BaseEdgeTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.edge.sql;
  17 +
  18 +import org.thingsboard.server.dao.service.DaoSqlTest;
  19 +import org.thingsboard.server.edge.BaseEdgeTest;
  20 +
  21 +@DaoSqlTest
  22 +public class EdgeSqlTest extends BaseEdgeTest {
  23 +}
... ...
... ... @@ -94,11 +94,6 @@
94 94 <groupId>org.thingsboard</groupId>
95 95 <artifactId>rest-client</artifactId>
96 96 </dependency>
97   - <dependency>
98   - <groupId>org.thingsboard.common</groupId>
99   - <artifactId>edge-api</artifactId>
100   - <scope>test</scope>
101   - </dependency>
102 97 </dependencies>
103 98
104 99 <build>
... ...
... ... @@ -31,7 +31,7 @@ import java.util.List;
31 31 import java.util.Map;
32 32
33 33 @RunWith(ClasspathSuite.class)
34   -@ClasspathSuite.ClassnameFilters({"org.thingsboard.server.msa.*EdgeTest"})
  34 +@ClasspathSuite.ClassnameFilters({"org.thingsboard.server.msa.*Test"})
35 35 public class ContainerTestSuite {
36 36
37 37 private static DockerComposeContainer testContainer;
... ...
1   -/**
2   - * Copyright © 2016-2020 The Thingsboard Authors
3   - *
4   - * Licensed under the Apache License, Version 2.0 (the "License");
5   - * you may not use this file except in compliance with the License.
6   - * You may obtain a copy of the License at
7   - *
8   - * http://www.apache.org/licenses/LICENSE-2.0
9   - *
10   - * Unless required by applicable law or agreed to in writing, software
11   - * distributed under the License is distributed on an "AS IS" BASIS,
12   - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   - * See the License for the specific language governing permissions and
14   - * limitations under the License.
15   - */
16   -package org.thingsboard.server.msa.edge;
17   -
18   -import com.fasterxml.jackson.databind.JsonNode;
19   -import com.fasterxml.jackson.databind.ObjectMapper;
20   -import lombok.extern.slf4j.Slf4j;
21   -import org.junit.*;
22   -import org.springframework.http.HttpStatus;
23   -import org.springframework.http.ResponseEntity;
24   -import org.thingsboard.server.common.data.Dashboard;
25   -import org.thingsboard.server.common.data.Device;
26   -import org.thingsboard.server.common.data.alarm.Alarm;
27   -import org.thingsboard.server.common.data.alarm.AlarmInfo;
28   -import org.thingsboard.server.common.data.alarm.AlarmSeverity;
29   -import org.thingsboard.server.common.data.alarm.AlarmStatus;
30   -import org.thingsboard.server.common.data.asset.Asset;
31   -import org.thingsboard.server.common.data.edge.Edge;
32   -import org.thingsboard.server.common.data.edge.EdgeEventType;
33   -import org.thingsboard.server.common.data.kv.TsKvEntry;
34   -import org.thingsboard.server.common.data.page.TextPageLink;
35   -import org.thingsboard.server.common.data.page.TimePageLink;
36   -import org.thingsboard.server.common.data.relation.EntityRelation;
37   -import org.thingsboard.server.common.data.relation.RelationTypeGroup;
38   -import org.thingsboard.server.common.data.rule.RuleChain;
39   -import org.thingsboard.server.common.data.rule.RuleChainMetaData;
40   -import org.thingsboard.server.common.data.rule.RuleChainType;
41   -import org.thingsboard.server.common.data.security.DeviceCredentials;
42   -import org.thingsboard.server.gen.edge.EdgeConfiguration;
43   -import org.thingsboard.server.gen.transport.TransportProtos;
44   -import org.thingsboard.server.msa.AbstractContainerTest;
45   -
46   -import java.io.IOException;
47   -import java.util.List;
48   -import java.util.Map;
49   -import java.util.Set;
50   -import java.util.UUID;
51   -
52   -@Slf4j
53   -public class EdgeTest extends AbstractContainerTest {
54   -
55   - private static EdgeImitator edgeImitator;
56   -
57   - @BeforeClass
58   - public static void init() throws NoSuchFieldException, IllegalAccessException, InterruptedException, IOException {
59   - restClient.login("tenant@thingsboard.org", "tenant");
60   - installation();
61   - edgeImitator = new EdgeImitator("localhost", 7070, "routing", "secret");
62   - edgeImitator.connect();
63   - Thread.sleep(10000);
64   - }
65   -
66   - @Test
67   - public void testReceivedData() {
68   - Edge edge = restClient.getTenantEdge("Edge1").get();
69   -
70   - EdgeConfiguration configuration = edgeImitator.getStorage().getConfiguration();
71   - Assert.assertNotNull(configuration);
72   -
73   - Map<UUID, EdgeEventType> entities = edgeImitator.getStorage().getEntities();
74   - Assert.assertFalse(entities.isEmpty());
75   -
76   - Set<UUID> devices = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.DEVICE);
77   - Assert.assertEquals(1, devices.size());
78   - for (Device device: restClient.getEdgeDevices(edge.getId(), new TextPageLink(1)).getData()) {
79   - Assert.assertTrue(devices.contains(device.getUuidId()));
80   - }
81   -
82   - Set<UUID> ruleChains = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.RULE_CHAIN);
83   - Assert.assertEquals(1, ruleChains.size());
84   - for (RuleChain ruleChain: restClient.getEdgeRuleChains(edge.getId(), new TimePageLink(1)).getData()) {
85   - Assert.assertTrue(ruleChains.contains(ruleChain.getUuidId()));
86   - }
87   -
88   - Set<UUID> assets = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.ASSET);
89   - Assert.assertEquals(1, assets.size());
90   - for (Asset asset: restClient.getEdgeAssets(edge.getId(), new TextPageLink(1)).getData()) {
91   - Assert.assertTrue(assets.contains(asset.getUuidId()));
92   - }
93   - }
94   -
95   - @Test
96   - public void testDevices() throws Exception {
97   - Edge edge = restClient.getTenantEdge("Edge1").get();
98   -
99   - Device device = new Device();
100   - device.setName("Edge Device 2");
101   - device.setType("test");
102   - Device savedDevice = restClient.saveDevice(device);
103   - restClient.assignDeviceToEdge(edge.getId(), savedDevice.getId());
104   -
105   - Thread.sleep(1000);
106   - Assert.assertTrue(restClient.getEdgeDevices(edge.getId(), new TextPageLink(2)).getData().contains(savedDevice));
107   - Set<UUID> devices = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.DEVICE);
108   - Assert.assertEquals(2, devices.size());
109   - Assert.assertTrue(devices.contains(savedDevice.getUuidId()));
110   -
111   - restClient.unassignDeviceFromEdge(edge.getId(), savedDevice.getId());
112   - Thread.sleep(1000);
113   - Assert.assertFalse(restClient.getEdgeDevices(edge.getId(), new TextPageLink(2)).getData().contains(savedDevice));
114   - devices = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.DEVICE);
115   - Assert.assertEquals(1, devices.size());
116   - Assert.assertFalse(devices.contains(savedDevice.getUuidId()));
117   -
118   - restClient.deleteDevice(savedDevice.getId());
119   - }
120   -
121   - @Test
122   - public void testAssets() throws Exception {
123   - Edge edge = restClient.getTenantEdge("Edge1").get();
124   -
125   - Asset asset = new Asset();
126   - asset.setName("Edge Asset 2");
127   - asset.setType("test");
128   - Asset savedAsset = restClient.saveAsset(asset);
129   - restClient.assignAssetToEdge(edge.getId(), savedAsset.getId());
130   -
131   - Thread.sleep(1000);
132   - Assert.assertTrue(restClient.getEdgeAssets(edge.getId(), new TextPageLink(2)).getData().contains(savedAsset));
133   - Set<UUID> assets = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.ASSET);
134   - Assert.assertEquals(2, assets.size());
135   - Assert.assertTrue(assets.contains(savedAsset.getUuidId()));
136   -
137   - restClient.unassignAssetFromEdge(edge.getId(), savedAsset.getId());
138   - Thread.sleep(1000);
139   - Assert.assertFalse(restClient.getEdgeAssets(edge.getId(), new TextPageLink(2)).getData().contains(savedAsset));
140   - assets = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.ASSET);
141   - Assert.assertEquals(1, assets.size());
142   - Assert.assertFalse(assets.contains(savedAsset.getUuidId()));
143   -
144   - restClient.deleteAsset(savedAsset.getId());
145   - }
146   -
147   - @Test
148   - public void testRuleChains() throws Exception {
149   - Edge edge = restClient.getTenantEdge("Edge1").get();
150   -
151   - RuleChain ruleChain = new RuleChain();
152   - ruleChain.setName("Edge Test Rule Chain");
153   - ruleChain.setType(RuleChainType.EDGE);
154   - RuleChain savedRuleChain = restClient.saveRuleChain(ruleChain);
155   - restClient.assignRuleChainToEdge(edge.getId(), savedRuleChain.getId());
156   -
157   - Thread.sleep(1000);
158   - Assert.assertTrue(restClient.getEdgeRuleChains(edge.getId(), new TimePageLink(2)).getData().contains(savedRuleChain));
159   - Set<UUID> ruleChains = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.RULE_CHAIN);
160   - Assert.assertEquals(2, ruleChains.size());
161   - Assert.assertTrue(ruleChains.contains(savedRuleChain.getUuidId()));
162   -
163   - restClient.unassignRuleChainFromEdge(edge.getId(), savedRuleChain.getId());
164   - Thread.sleep(1000);
165   - Assert.assertFalse(restClient.getEdgeRuleChains(edge.getId(), new TimePageLink(2)).getData().contains(savedRuleChain));
166   - ruleChains = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.RULE_CHAIN);
167   - Assert.assertEquals(1, ruleChains.size());
168   - Assert.assertFalse(ruleChains.contains(savedRuleChain.getUuidId()));
169   -
170   - restClient.deleteRuleChain(savedRuleChain.getId());
171   -
172   - }
173   -
174   - @Test
175   - public void testDashboards() throws Exception {
176   - Edge edge = restClient.getTenantEdge("Edge1").get();
177   -
178   - Dashboard dashboard = new Dashboard();
179   - dashboard.setTitle("Edge Test Dashboard");
180   - Dashboard savedDashboard = restClient.saveDashboard(dashboard);
181   - restClient.assignDashboardToEdge(edge.getId(), savedDashboard.getId());
182   -
183   - Thread.sleep(1000);
184   - Assert.assertTrue(restClient.getEdgeDashboards(edge.getId(), new TimePageLink(2)).getData().stream().allMatch(dashboardInfo -> dashboardInfo.getUuidId().equals(savedDashboard.getUuidId())));
185   - Set<UUID> dashboards = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.DASHBOARD);
186   - Assert.assertEquals(1, dashboards.size());
187   - Assert.assertTrue(dashboards.contains(savedDashboard.getUuidId()));
188   -
189   - restClient.unassignDashboardFromEdge(edge.getId(), savedDashboard.getId());
190   - Thread.sleep(1000);
191   - Assert.assertFalse(restClient.getEdgeDashboards(edge.getId(), new TimePageLink(2)).getData().stream().anyMatch(dashboardInfo -> dashboardInfo.getUuidId().equals(savedDashboard.getUuidId())));
192   - dashboards = edgeImitator.getStorage().getEntitiesByType(EdgeEventType.DASHBOARD);
193   - Assert.assertEquals(0, dashboards.size());
194   - Assert.assertFalse(dashboards.contains(savedDashboard.getUuidId()));
195   -
196   - restClient.deleteDashboard(savedDashboard.getId());
197   -
198   - }
199   -
200   - @Test
201   - public void testRelations() throws InterruptedException {
202   - Device device = restClient.getTenantDevice("Edge Device 1").get();
203   - Asset asset = restClient.getTenantAsset("Edge Asset 1").get();
204   -
205   - EntityRelation relation = new EntityRelation();
206   - relation.setType("test");
207   - relation.setFrom(device.getId());
208   - relation.setTo(asset.getId());
209   - relation.setTypeGroup(RelationTypeGroup.COMMON);
210   - restClient.saveRelation(relation);
211   -
212   - Thread.sleep(1000);
213   - List<EntityRelation> relations = edgeImitator.getStorage().getRelations();
214   - Assert.assertEquals(1, relations.size());
215   - Assert.assertTrue(relations.contains(relation));
216   - restClient.deleteRelation(relation.getFrom(), relation.getType(), relation.getTypeGroup(), relation.getTo());
217   -
218   - Thread.sleep(1000);
219   - relations = edgeImitator.getStorage().getRelations();
220   - Assert.assertEquals(0, relations.size());
221   - Assert.assertFalse(relations.contains(relation));
222   - }
223   -
224   - @Test
225   - public void testAlarms() throws Exception {
226   - Device device = restClient.getTenantDevice("Edge Device 1").get();
227   - Alarm alarm = new Alarm();
228   - alarm.setOriginator(device.getId());
229   - alarm.setStatus(AlarmStatus.ACTIVE_UNACK);
230   - alarm.setType("alarm");
231   - alarm.setSeverity(AlarmSeverity.CRITICAL);
232   -
233   - Alarm savedAlarm = restClient.saveAlarm(alarm);
234   - AlarmInfo alarmInfo = restClient.getAlarmInfoById(savedAlarm.getId()).get();
235   - Thread.sleep(1000);
236   -
237   - Assert.assertEquals(1, edgeImitator.getStorage().getAlarms().size());
238   - Assert.assertTrue(edgeImitator.getStorage().getAlarms().containsKey(alarmInfo.getType()));
239   - Assert.assertEquals(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()), alarmInfo.getStatus());
240   - restClient.ackAlarm(savedAlarm.getId());
241   -
242   - Thread.sleep(1000);
243   - alarmInfo = restClient.getAlarmInfoById(savedAlarm.getId()).get();
244   - Assert.assertTrue(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()).isAck());
245   - Assert.assertEquals(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()), alarmInfo.getStatus());
246   - restClient.clearAlarm(savedAlarm.getId());
247   -
248   - Thread.sleep(1000);
249   - alarmInfo = restClient.getAlarmInfoById(savedAlarm.getId()).get();
250   - Assert.assertTrue(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()).isAck());
251   - Assert.assertTrue(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()).isCleared());
252   - Assert.assertEquals(edgeImitator.getStorage().getAlarms().get(alarmInfo.getType()), alarmInfo.getStatus());
253   -
254   - restClient.deleteAlarm(savedAlarm.getId());
255   -
256   - }
257   -
258   - @Ignore
259   - @Test
260   - public void testTelemetry() throws Exception {
261   - Device device = restClient.getTenantDevice("Edge Device 1").get();
262   - DeviceCredentials deviceCredentials = restClient.getDeviceCredentialsByDeviceId(device.getId()).get();
263   - ResponseEntity response = restClient.getRestTemplate()
264   - .postForEntity(HTTPS_URL + "/api/v1/{credentialsId}/telemetry",
265   - "{'test': 25}",
266   - ResponseEntity.class,
267   - deviceCredentials.getCredentialsId());
268   - Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
269   - Thread.sleep(1000);
270   - List<String> keys = restClient.getTimeseriesKeys(device.getId());
271   - List<TsKvEntry> latestTimeseries = restClient.getLatestTimeseries(device.getId(), keys);
272   - Assert.assertEquals(1, latestTimeseries.size());
273   - TsKvEntry tsKvEntry = latestTimeseries.get(0);
274   - Map<UUID, TransportProtos.PostTelemetryMsg> telemetry = edgeImitator.getStorage().getLatestTelemetry();
275   - Assert.assertEquals(1, telemetry.size());
276   - Assert.assertTrue(telemetry.containsKey(device.getUuidId()));
277   - TransportProtos.PostTelemetryMsg telemetryMsg = telemetry.get(device.getUuidId());
278   - Assert.assertEquals(1, telemetryMsg.getTsKvListCount());
279   - TransportProtos.TsKvListProto tsKv = telemetryMsg.getTsKvListList().get(0);
280   - Assert.assertEquals(tsKvEntry.getTs(), tsKv.getTs());
281   - Assert.assertEquals(1, tsKv.getKvCount());
282   - TransportProtos.KeyValueProto keyValue = tsKv.getKvList().get(0);
283   - Assert.assertEquals(tsKvEntry.getKey(), keyValue.getKey());
284   - Assert.assertEquals(tsKvEntry.getValueAsString(), Long.toString(keyValue.getLongV()));
285   - }
286   -
287   - @AfterClass
288   - public static void destroy() throws InterruptedException {
289   - uninstallation();
290   - edgeImitator.disconnect();
291   - }
292   -
293   - private static void installation() throws IOException {
294   - Edge edge = new Edge();
295   - edge.setName("Edge1");
296   - edge.setType("test");
297   - edge.setRoutingKey("routing");
298   - edge.setSecret("secret");
299   - Edge savedEdge = restClient.saveEdge(edge);
300   -
301   - Device device = new Device();
302   - device.setName("Edge Device 1");
303   - device.setType("test");
304   - Device savedDevice = restClient.saveDevice(device);
305   - restClient.assignDeviceToEdge(savedEdge.getId(), savedDevice.getId());
306   -
307   - Asset asset = new Asset();
308   - asset.setName("Edge Asset 1");
309   - asset.setType("test");
310   - Asset savedAsset = restClient.saveAsset(asset);
311   - restClient.assignAssetToEdge(savedEdge.getId(), savedAsset.getId());
312   -
313   - ObjectMapper mapper = new ObjectMapper();
314   - Class edgeTestClass = EdgeTest.class;
315   - JsonNode configuration = mapper.readTree(edgeTestClass.getClassLoader().getResourceAsStream("RootRuleChain.json"));
316   - RuleChain ruleChain = mapper.treeToValue(configuration.get("ruleChain"), RuleChain.class);
317   - RuleChainMetaData ruleChainMetaData = mapper.treeToValue(configuration.get("metadata"), RuleChainMetaData.class);
318   - RuleChain savedRuleChain = restClient.saveRuleChain(ruleChain);
319   - ruleChainMetaData.setRuleChainId(savedRuleChain.getId());
320   - restClient.saveRuleChainMetaData(ruleChainMetaData);
321   - restClient.setRootRuleChain(savedRuleChain.getId());
322   - }
323   -
324   - private static void uninstallation() {
325   - Device device = restClient.getTenantDevice("Edge Device 1").get();
326   - restClient.deleteDevice(device.getId());
327   -
328   - Asset asset = restClient.getTenantAsset("Edge Asset 1").get();
329   - restClient.deleteAsset(asset.getId());
330   -
331   - Edge edge = restClient.getTenantEdge("Edge1").get();
332   - restClient.deleteEdge(edge.getId());
333   -
334   - List<RuleChain> ruleChains = restClient.getRuleChains(new TextPageLink(3)).getData();
335   - RuleChain oldRoot = ruleChains.stream().filter(ruleChain -> ruleChain.getName().equals("Root Rule Chain")).findAny().get();
336   - RuleChain newRoot = ruleChains.stream().filter(ruleChain -> ruleChain.getName().equals("Test Root Rule Chain")).findAny().get();
337   - restClient.setRootRuleChain(oldRoot.getId());
338   - restClient.deleteRuleChain(newRoot.getId());
339   - }
340   -
341   -}
1   -{
2   - "ruleChain": {
3   - "additionalInfo": null,
4   - "name": "Test Root Rule Chain",
5   - "type": "CORE",
6   - "firstRuleNodeId": null,
7   - "root": false,
8   - "debugMode": false,
9   - "configuration": null
10   - },
11   - "metadata": {
12   - "firstNodeIndex": 4,
13   - "nodes": [
14   - {
15   - "additionalInfo": {
16   - "layoutX": 1117,
17   - "layoutY": 156
18   - },
19   - "type": "org.thingsboard.rule.engine.edge.TbMsgPushToEdgeNode",
20   - "name": "Push to edge",
21   - "debugMode": false,
22   - "configuration": {
23   - "version": 0
24   - }
25   - },
26   - {
27   - "additionalInfo": {
28   - "layoutX": 825,
29   - "layoutY": 407
30   - },
31   - "type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
32   - "name": "RPC Call Request",
33   - "debugMode": false,
34   - "configuration": {
35   - "timeoutInSeconds": 60
36   - }
37   - },
38   - {
39   - "additionalInfo": {
40   - "layoutX": 826,
41   - "layoutY": 327
42   - },
43   - "type": "org.thingsboard.rule.engine.action.TbLogNode",
44   - "name": "Log Other",
45   - "debugMode": false,
46   - "configuration": {
47   - "jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"
48   - }
49   - },
50   - {
51   - "additionalInfo": {
52   - "layoutX": 827,
53   - "layoutY": 244
54   - },
55   - "type": "org.thingsboard.rule.engine.action.TbLogNode",
56   - "name": "Log RPC from Device",
57   - "debugMode": false,
58   - "configuration": {
59   - "jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"
60   - }
61   - },
62   - {
63   - "additionalInfo": {
64   - "layoutX": 347,
65   - "layoutY": 149
66   - },
67   - "type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
68   - "name": "Message Type Switch",
69   - "debugMode": false,
70   - "configuration": {
71   - "version": 0
72   - }
73   - },
74   - {
75   - "additionalInfo": {
76   - "layoutX": 821,
77   - "layoutY": 72
78   - },
79   - "type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
80   - "name": "Save Client Attributes",
81   - "debugMode": false,
82   - "configuration": {
83   - "scope": "CLIENT_SCOPE"
84   - }
85   - },
86   - {
87   - "additionalInfo": {
88   - "layoutX": 824,
89   - "layoutY": 156
90   - },
91   - "type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
92   - "name": "Save Timeseries",
93   - "debugMode": false,
94   - "configuration": {
95   - "defaultTTL": 0
96   - }
97   - }
98   - ],
99   - "connections": [
100   - {
101   - "fromIndex": 4,
102   - "toIndex": 1,
103   - "type": "RPC Request to Device"
104   - },
105   - {
106   - "fromIndex": 4,
107   - "toIndex": 3,
108   - "type": "RPC Request from Device"
109   - },
110   - {
111   - "fromIndex": 4,
112   - "toIndex": 6,
113   - "type": "Post telemetry"
114   - },
115   - {
116   - "fromIndex": 4,
117   - "toIndex": 5,
118   - "type": "Post attributes"
119   - },
120   - {
121   - "fromIndex": 4,
122   - "toIndex": 2,
123   - "type": "Other"
124   - },
125   - {
126   - "fromIndex": 6,
127   - "toIndex": 0,
128   - "type": "Success"
129   - }
130   - ],
131   - "ruleChainConnections": null
132   - }
133   -}
\ No newline at end of file