|
|
|
@ -55,14 +55,18 @@ import org.thingsboard.server.common.data.asset.AssetProfile; |
|
|
|
import org.thingsboard.server.common.data.audit.ActionType; |
|
|
|
import org.thingsboard.server.common.data.edge.Edge; |
|
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
|
import org.thingsboard.server.common.data.id.EdgeId; |
|
|
|
import org.thingsboard.server.common.data.id.RuleChainId; |
|
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
|
import org.thingsboard.server.common.data.id.TenantProfileId; |
|
|
|
import org.thingsboard.server.common.data.page.PageData; |
|
|
|
import org.thingsboard.server.common.data.page.PageLink; |
|
|
|
import org.thingsboard.server.common.data.queue.Queue; |
|
|
|
import org.thingsboard.server.common.data.rule.RuleChain; |
|
|
|
import org.thingsboard.server.common.data.rule.RuleChainMetaData; |
|
|
|
import org.thingsboard.server.common.data.security.Authority; |
|
|
|
import org.thingsboard.server.common.data.security.DeviceCredentials; |
|
|
|
import org.thingsboard.server.common.data.security.model.JwtSettings; |
|
|
|
import org.thingsboard.server.dao.edge.EdgeDao; |
|
|
|
import org.thingsboard.server.dao.exception.DataValidationException; |
|
|
|
@ -73,11 +77,13 @@ import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.EdgeVersion; |
|
|
|
import org.thingsboard.server.gen.edge.v1.OAuth2UpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.QueueUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.SyncCompletedMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg; |
|
|
|
@ -93,6 +99,7 @@ import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Optional; |
|
|
|
import java.util.UUID; |
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
|
|
|
|
import static org.hamcrest.Matchers.containsString; |
|
|
|
@ -887,23 +894,24 @@ public class EdgeControllerTest extends AbstractControllerTest { |
|
|
|
edgeImitator.ignoreType(UserCredentialsUpdateMsg.class); |
|
|
|
edgeImitator.ignoreType(OAuth2UpdateMsg.class); |
|
|
|
|
|
|
|
edgeImitator.expectMessageAmount(24); |
|
|
|
edgeImitator.expectMessageAmount(27); |
|
|
|
edgeImitator.connect(); |
|
|
|
waitForMessages(edgeImitator); |
|
|
|
|
|
|
|
verifyFetchersMsgs(edgeImitator); |
|
|
|
verifyFetchersMsgs(edgeImitator, savedDevice); |
|
|
|
// verify queue msgs
|
|
|
|
Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); |
|
|
|
Assert.assertTrue(popDeviceMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Device 1")); |
|
|
|
Assert.assertTrue(popDeviceCredentialsMsg(edgeImitator.getDownlinkMsgs(), savedDevice.getId())); |
|
|
|
Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "test")); |
|
|
|
Assert.assertTrue(popAssetMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Asset 1")); |
|
|
|
Assert.assertTrue(edgeImitator.getDownlinkMsgs().isEmpty()); |
|
|
|
|
|
|
|
edgeImitator.expectMessageAmount(20); |
|
|
|
edgeImitator.expectMessageAmount(22); |
|
|
|
doPost("/api/edge/sync/" + edge.getId()); |
|
|
|
waitForMessages(edgeImitator); |
|
|
|
|
|
|
|
verifyFetchersMsgs(edgeImitator); |
|
|
|
verifyFetchersMsgs(edgeImitator, savedDevice); |
|
|
|
Assert.assertTrue(edgeImitator.getDownlinkMsgs().isEmpty()); |
|
|
|
|
|
|
|
edgeImitator.allowIgnoredTypes(); |
|
|
|
@ -920,6 +928,23 @@ public class EdgeControllerTest extends AbstractControllerTest { |
|
|
|
.andExpect(status().isOk()); |
|
|
|
} |
|
|
|
|
|
|
|
private RuleChainId getEdgeRootRuleChainId(EdgeImitator edgeImitator) { |
|
|
|
try { |
|
|
|
EdgeId edgeId = new EdgeId(new UUID(edgeImitator.getConfiguration().getEdgeIdMSB(), edgeImitator.getConfiguration().getEdgeIdLSB())); |
|
|
|
List<RuleChain> edgeRuleChains = doGetTypedWithPageLink("/api/edge/" + edgeId.getId() + "/ruleChains?", |
|
|
|
new TypeReference<PageData<RuleChain>>() { |
|
|
|
}, new PageLink(100)).getData(); |
|
|
|
for (RuleChain edgeRuleChain : edgeRuleChains) { |
|
|
|
if (edgeRuleChain.isRoot()) { |
|
|
|
return edgeRuleChain.getId(); |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
throw new RuntimeException(e); |
|
|
|
} |
|
|
|
throw new RuntimeException("Root rule chain not found"); |
|
|
|
} |
|
|
|
|
|
|
|
private void simulateEdgeActivation(Edge edge) throws Exception { |
|
|
|
ObjectNode attributes = JacksonUtil.newObjectNode(); |
|
|
|
attributes.put("active", true); |
|
|
|
@ -949,9 +974,10 @@ public class EdgeControllerTest extends AbstractControllerTest { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void verifyFetchersMsgs(EdgeImitator edgeImitator) { |
|
|
|
private void verifyFetchersMsgs(EdgeImitator edgeImitator, Device savedDevice) { |
|
|
|
Assert.assertTrue(popQueueMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Main")); |
|
|
|
Assert.assertTrue(popRuleChainMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Edge Root Rule Chain")); |
|
|
|
Assert.assertTrue(popRuleChainMetadataMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, getEdgeRootRuleChainId(edgeImitator))); |
|
|
|
Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgs(), "general")); |
|
|
|
Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgs(), "mail")); |
|
|
|
Assert.assertTrue(popAdminSettingsMsg(edgeImitator.getDownlinkMsgs(), "connectivity")); |
|
|
|
@ -965,6 +991,7 @@ public class EdgeControllerTest extends AbstractControllerTest { |
|
|
|
Assert.assertTrue(popCustomerMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Public")); |
|
|
|
Assert.assertTrue(popDeviceProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "default")); |
|
|
|
Assert.assertTrue(popDeviceMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Device 1")); |
|
|
|
Assert.assertTrue(popDeviceCredentialsMsg(edgeImitator.getDownlinkMsgs(), savedDevice.getId())); |
|
|
|
Assert.assertTrue(popAssetProfileMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "test")); |
|
|
|
Assert.assertTrue(popAssetMsg(edgeImitator.getDownlinkMsgs(), UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, "Test Sync Edge Asset 1")); |
|
|
|
Assert.assertTrue(popTenantMsg(edgeImitator.getDownlinkMsgs(), tenantId)); |
|
|
|
@ -1002,6 +1029,21 @@ public class EdgeControllerTest extends AbstractControllerTest { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
private boolean popRuleChainMetadataMsg(List<AbstractMessage> messages, UpdateMsgType msgType, RuleChainId ruleChainId) { |
|
|
|
for (AbstractMessage message : messages) { |
|
|
|
if (message instanceof RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg) { |
|
|
|
RuleChainMetaData ruleChainMetaData = JacksonUtil.fromString(ruleChainMetadataUpdateMsg.getEntity(), RuleChainMetaData.class, true); |
|
|
|
Assert.assertNotNull(ruleChainMetaData); |
|
|
|
if (msgType.equals(ruleChainMetadataUpdateMsg.getMsgType()) |
|
|
|
&& ruleChainId.equals(ruleChainMetaData.getRuleChainId())) { |
|
|
|
messages.remove(message); |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
private boolean popAdminSettingsMsg(List<AbstractMessage> messages, String key) { |
|
|
|
for (AbstractMessage message : messages) { |
|
|
|
if (message instanceof AdminSettingsUpdateMsg adminSettingsUpdateMsg) { |
|
|
|
@ -1046,6 +1088,20 @@ public class EdgeControllerTest extends AbstractControllerTest { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
private boolean popDeviceCredentialsMsg(List<AbstractMessage> messages, DeviceId deviceId) { |
|
|
|
for (AbstractMessage message : messages) { |
|
|
|
if (message instanceof DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg) { |
|
|
|
DeviceCredentials deviceCredentials = JacksonUtil.fromString(deviceCredentialsUpdateMsg.getEntity(), DeviceCredentials.class, true); |
|
|
|
Assert.assertNotNull(deviceCredentials); |
|
|
|
if (deviceId.equals(deviceCredentials.getDeviceId())) { |
|
|
|
messages.remove(message); |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
private boolean popAssetProfileMsg(List<AbstractMessage> messages, UpdateMsgType msgType, String name) { |
|
|
|
for (AbstractMessage message : messages) { |
|
|
|
if (message instanceof AssetProfileUpdateMsg assetProfileUpdateMsg) { |
|
|
|
|