|
|
|
@ -65,6 +65,7 @@ import org.thingsboard.server.common.data.page.PageLink; |
|
|
|
import org.thingsboard.server.common.data.query.EntityKeyValueType; |
|
|
|
import org.thingsboard.server.common.data.query.FilterPredicateValue; |
|
|
|
import org.thingsboard.server.common.data.query.NumericFilterPredicate; |
|
|
|
import org.thingsboard.server.common.data.queue.Queue; |
|
|
|
import org.thingsboard.server.common.data.rule.RuleChain; |
|
|
|
import org.thingsboard.server.common.data.security.Authority; |
|
|
|
import org.thingsboard.server.controller.AbstractControllerTest; |
|
|
|
@ -76,11 +77,13 @@ import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.EdgeConfiguration; |
|
|
|
import org.thingsboard.server.gen.edge.v1.QueueUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataRequestMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType; |
|
|
|
import org.thingsboard.server.gen.edge.v1.UplinkMsg; |
|
|
|
import org.thingsboard.server.gen.edge.v1.UserUpdateMsg; |
|
|
|
import org.thingsboard.server.queue.util.DataDecodingEncodingService; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
@ -185,7 +188,7 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { |
|
|
|
.andExpect(status().isOk()); |
|
|
|
} |
|
|
|
|
|
|
|
private void installation() throws Exception { |
|
|
|
private void installation() { |
|
|
|
edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class); |
|
|
|
|
|
|
|
thermostatDeviceProfile = this.createDeviceProfile(THERMOSTAT_DEVICE_PROFILE_NAME, |
|
|
|
@ -235,11 +238,64 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { |
|
|
|
private void verifyEdgeConnectionAndInitialData() throws Exception { |
|
|
|
Assert.assertTrue(edgeImitator.waitForMessages()); |
|
|
|
|
|
|
|
validateEdgeConfiguration(); |
|
|
|
|
|
|
|
// 3 messages - 2 from device profile fetcher (default and thermostat), 1 from device profile controller (thermostat)
|
|
|
|
validateDeviceProfiles(); |
|
|
|
|
|
|
|
// 1 message from device controller
|
|
|
|
validateDevices(); |
|
|
|
|
|
|
|
// 2 messages - 1 from asset fetcher and 1 from asset controller
|
|
|
|
validateAssets(); |
|
|
|
|
|
|
|
// 2 messages - 1 from rule chain fetcher and 1 from rule chain controller
|
|
|
|
UUID ruleChainUUID = validateRuleChains(); |
|
|
|
|
|
|
|
// 1 from request message
|
|
|
|
validateRuleChainMetadataUpdates(ruleChainUUID); |
|
|
|
|
|
|
|
// 4 messages - 4 messages from fetcher - 2 from system level ('mail', 'mailTemplates') and 2 from admin level ('mail', 'mailTemplates')
|
|
|
|
validateAdminSettings(); |
|
|
|
|
|
|
|
// 1 message from asset profile fetcher
|
|
|
|
validateAssetProfiles(); |
|
|
|
|
|
|
|
// 1 message from queue fetcher
|
|
|
|
validateQueues(); |
|
|
|
|
|
|
|
// 1 message from user fetcher
|
|
|
|
validateUsers(); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateEdgeConfiguration() throws Exception { |
|
|
|
EdgeConfiguration configuration = edgeImitator.getConfiguration(); |
|
|
|
Assert.assertNotNull(configuration); |
|
|
|
|
|
|
|
testAutoGeneratedCodeByProtobuf(configuration); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateDeviceProfiles() throws Exception { |
|
|
|
List<DeviceProfileUpdateMsg> deviceProfileUpdateMsgList = edgeImitator.findAllMessagesByType(DeviceProfileUpdateMsg.class); |
|
|
|
// default msg
|
|
|
|
// thermostat msg from fetcher
|
|
|
|
// thermostat msg from contoller
|
|
|
|
Assert.assertEquals(3, deviceProfileUpdateMsgList.size()); |
|
|
|
Optional<DeviceProfileUpdateMsg> thermostatProfileUpdateMsgOpt = |
|
|
|
deviceProfileUpdateMsgList.stream().filter(dfum -> THERMOSTAT_DEVICE_PROFILE_NAME.equals(dfum.getName())).findAny(); |
|
|
|
Assert.assertTrue(thermostatProfileUpdateMsgOpt.isPresent()); |
|
|
|
DeviceProfileUpdateMsg thermostatProfileUpdateMsg = thermostatProfileUpdateMsgOpt.get(); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, thermostatProfileUpdateMsg.getMsgType()); |
|
|
|
UUID deviceProfileUUID = new UUID(thermostatProfileUpdateMsg.getIdMSB(), thermostatProfileUpdateMsg.getIdLSB()); |
|
|
|
DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + deviceProfileUUID, DeviceProfile.class); |
|
|
|
Assert.assertNotNull(deviceProfile); |
|
|
|
Assert.assertNotNull(deviceProfile.getProfileData()); |
|
|
|
Assert.assertNotNull(deviceProfile.getProfileData().getAlarms()); |
|
|
|
Assert.assertNotNull(deviceProfile.getProfileData().getAlarms().get(0).getClearRule()); |
|
|
|
|
|
|
|
testAutoGeneratedCodeByProtobuf(thermostatProfileUpdateMsg); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateDevices() throws Exception { |
|
|
|
Optional<DeviceUpdateMsg> deviceUpdateMsgOpt = edgeImitator.findMessageByType(DeviceUpdateMsg.class); |
|
|
|
Assert.assertTrue(deviceUpdateMsgOpt.isPresent()); |
|
|
|
DeviceUpdateMsg deviceUpdateMsg = deviceUpdateMsgOpt.get(); |
|
|
|
@ -250,69 +306,56 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { |
|
|
|
List<Device> edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getUuidId() + "/devices?", |
|
|
|
new TypeReference<PageData<Device>>() {}, new PageLink(100)).getData(); |
|
|
|
Assert.assertTrue(edgeDevices.contains(device)); |
|
|
|
} |
|
|
|
|
|
|
|
List<DeviceProfileUpdateMsg> deviceProfileUpdateMsgList = edgeImitator.findAllMessagesByType(DeviceProfileUpdateMsg.class); |
|
|
|
Assert.assertEquals(3, deviceProfileUpdateMsgList.size()); |
|
|
|
Optional<DeviceProfileUpdateMsg> deviceProfileUpdateMsgOpt = |
|
|
|
deviceProfileUpdateMsgList.stream().filter(dfum -> THERMOSTAT_DEVICE_PROFILE_NAME.equals(dfum.getName())).findAny(); |
|
|
|
Assert.assertTrue(deviceProfileUpdateMsgOpt.isPresent()); |
|
|
|
DeviceProfileUpdateMsg deviceProfileUpdateMsg = deviceProfileUpdateMsgOpt.get(); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType()); |
|
|
|
UUID deviceProfileUUID = new UUID(deviceProfileUpdateMsg.getIdMSB(), deviceProfileUpdateMsg.getIdLSB()); |
|
|
|
DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + deviceProfileUUID, DeviceProfile.class); |
|
|
|
Assert.assertNotNull(deviceProfile); |
|
|
|
Assert.assertNotNull(deviceProfile.getProfileData()); |
|
|
|
Assert.assertNotNull(deviceProfile.getProfileData().getAlarms()); |
|
|
|
Assert.assertNotNull(deviceProfile.getProfileData().getAlarms().get(0).getClearRule()); |
|
|
|
|
|
|
|
testAutoGeneratedCodeByProtobuf(deviceProfileUpdateMsg); |
|
|
|
private void validateAssets() throws Exception { |
|
|
|
List<AssetUpdateMsg> assetUpdateMsgs = edgeImitator.findAllMessagesByType(AssetUpdateMsg.class); |
|
|
|
Assert.assertEquals(2, assetUpdateMsgs.size()); |
|
|
|
validateAsset(assetUpdateMsgs.get(0)); |
|
|
|
validateAsset(assetUpdateMsgs.get(1)); |
|
|
|
} |
|
|
|
|
|
|
|
Optional<AssetUpdateMsg> assetUpdateMsgOpt = edgeImitator.findMessageByType(AssetUpdateMsg.class); |
|
|
|
Assert.assertTrue(assetUpdateMsgOpt.isPresent()); |
|
|
|
AssetUpdateMsg assetUpdateMsg = assetUpdateMsgOpt.get(); |
|
|
|
private void validateAsset(AssetUpdateMsg assetUpdateMsg) throws Exception { |
|
|
|
Assert.assertNotNull(assetUpdateMsg); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType()); |
|
|
|
UUID assetUUID = new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB()); |
|
|
|
Asset asset = doGet("/api/asset/" + assetUUID.toString(), Asset.class); |
|
|
|
Asset asset = doGet("/api/asset/" + assetUUID, Asset.class); |
|
|
|
Assert.assertNotNull(asset); |
|
|
|
List<Asset> edgeAssets = doGetTypedWithPageLink("/api/edge/" + edge.getUuidId() + "/assets?", |
|
|
|
new TypeReference<PageData<Asset>>() {}, new PageLink(100)).getData(); |
|
|
|
Assert.assertTrue(edgeAssets.contains(asset)); |
|
|
|
|
|
|
|
testAutoGeneratedCodeByProtobuf(assetUpdateMsg); |
|
|
|
} |
|
|
|
|
|
|
|
private UUID validateRuleChains() throws Exception { |
|
|
|
List<RuleChainUpdateMsg> ruleChainUpdateMsgs = edgeImitator.findAllMessagesByType(RuleChainUpdateMsg.class); |
|
|
|
Assert.assertEquals(2, ruleChainUpdateMsgs.size()); |
|
|
|
RuleChainUpdateMsg ruleChainCreateMsg = ruleChainUpdateMsgs.get(0); |
|
|
|
RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgs.get(1); |
|
|
|
validateRuleChain(ruleChainCreateMsg, UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE); |
|
|
|
validateRuleChain(ruleChainUpdateMsg, UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE); |
|
|
|
return new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB()); |
|
|
|
} |
|
|
|
|
|
|
|
Optional<RuleChainUpdateMsg> ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class); |
|
|
|
Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent()); |
|
|
|
RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get(); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType()); |
|
|
|
private void validateRuleChain(RuleChainUpdateMsg ruleChainUpdateMsg, UpdateMsgType expectedMsgType) throws Exception { |
|
|
|
Assert.assertEquals(expectedMsgType, ruleChainUpdateMsg.getMsgType()); |
|
|
|
UUID ruleChainUUID = new UUID(ruleChainUpdateMsg.getIdMSB(), ruleChainUpdateMsg.getIdLSB()); |
|
|
|
RuleChain ruleChain = doGet("/api/ruleChain/" + ruleChainUUID, RuleChain.class); |
|
|
|
Assert.assertNotNull(ruleChain); |
|
|
|
List<RuleChain> edgeRuleChains = doGetTypedWithPageLink("/api/edge/" + edge.getUuidId() + "/ruleChains?", |
|
|
|
new TypeReference<PageData<RuleChain>>() {}, new PageLink(100)).getData(); |
|
|
|
Assert.assertTrue(edgeRuleChains.contains(ruleChain)); |
|
|
|
|
|
|
|
testAutoGeneratedCodeByProtobuf(ruleChainUpdateMsg); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateRuleChainMetadataUpdates(UUID expectedRuleChainUUID) { |
|
|
|
Optional<RuleChainMetadataUpdateMsg> ruleChainMetadataUpdateOpt = edgeImitator.findMessageByType(RuleChainMetadataUpdateMsg.class); |
|
|
|
Assert.assertTrue(ruleChainMetadataUpdateOpt.isPresent()); |
|
|
|
RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = ruleChainMetadataUpdateOpt.get(); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, ruleChainMetadataUpdateMsg.getMsgType()); |
|
|
|
Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), ruleChainMetadataUpdateMsg.getRuleChainIdMSB()); |
|
|
|
Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), ruleChainMetadataUpdateMsg.getRuleChainIdLSB()); |
|
|
|
|
|
|
|
validateAdminSettings(); |
|
|
|
|
|
|
|
Optional<AssetProfileUpdateMsg> assetProfileUpdateMsgOpt = edgeImitator.findMessageByType(AssetProfileUpdateMsg.class); |
|
|
|
Assert.assertTrue(assetProfileUpdateMsgOpt.isPresent()); |
|
|
|
AssetProfileUpdateMsg assetProfileUpdateMsg = assetProfileUpdateMsgOpt.get(); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetProfileUpdateMsg.getMsgType()); |
|
|
|
UUID assetProfileUUID = new UUID(assetProfileUpdateMsg.getIdMSB(), assetProfileUpdateMsg.getIdLSB()); |
|
|
|
AssetProfile assetProfile = doGet("/api/assetProfile/" + assetProfileUUID, AssetProfile.class); |
|
|
|
Assert.assertNotNull(assetProfile); |
|
|
|
Assert.assertEquals("default", assetProfile.getName()); |
|
|
|
Assert.assertTrue(assetProfile.isDefault()); |
|
|
|
|
|
|
|
testAutoGeneratedCodeByProtobuf(assetProfileUpdateMsg); |
|
|
|
UUID ruleChainUUID = new UUID(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), ruleChainMetadataUpdateMsg.getRuleChainIdLSB()); |
|
|
|
Assert.assertEquals(expectedRuleChainUUID, ruleChainUUID); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateAdminSettings() throws JsonProcessingException { |
|
|
|
@ -348,6 +391,46 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { |
|
|
|
Assert.assertNotNull(jsonNode.get("test")); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateAssetProfiles() throws Exception { |
|
|
|
Optional<AssetProfileUpdateMsg> assetProfileUpdateMsgOpt = edgeImitator.findMessageByType(AssetProfileUpdateMsg.class); |
|
|
|
Assert.assertTrue(assetProfileUpdateMsgOpt.isPresent()); |
|
|
|
AssetProfileUpdateMsg assetProfileUpdateMsg = assetProfileUpdateMsgOpt.get(); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetProfileUpdateMsg.getMsgType()); |
|
|
|
UUID assetProfileUUID = new UUID(assetProfileUpdateMsg.getIdMSB(), assetProfileUpdateMsg.getIdLSB()); |
|
|
|
AssetProfile assetProfile = doGet("/api/assetProfile/" + assetProfileUUID, AssetProfile.class); |
|
|
|
Assert.assertNotNull(assetProfile); |
|
|
|
Assert.assertEquals("default", assetProfile.getName()); |
|
|
|
Assert.assertTrue(assetProfile.isDefault()); |
|
|
|
testAutoGeneratedCodeByProtobuf(assetProfileUpdateMsg); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateQueues() throws Exception { |
|
|
|
Optional<QueueUpdateMsg> queueUpdateMsgOpt = edgeImitator.findMessageByType(QueueUpdateMsg.class); |
|
|
|
Assert.assertTrue(queueUpdateMsgOpt.isPresent()); |
|
|
|
QueueUpdateMsg queueUpdateMsg = queueUpdateMsgOpt.get(); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, queueUpdateMsg.getMsgType()); |
|
|
|
UUID queueUUID = new UUID(queueUpdateMsg.getIdMSB(), queueUpdateMsg.getIdLSB()); |
|
|
|
Queue queue = doGet("/api/queues/" + queueUUID, Queue.class); |
|
|
|
Assert.assertNotNull(queue); |
|
|
|
Assert.assertEquals("Main", queueUpdateMsg.getName()); |
|
|
|
Assert.assertEquals("tb_rule_engine.main", queueUpdateMsg.getTopic()); |
|
|
|
Assert.assertEquals(10, queueUpdateMsg.getPartitions()); |
|
|
|
Assert.assertEquals(25, queueUpdateMsg.getPollInterval()); |
|
|
|
testAutoGeneratedCodeByProtobuf(queueUpdateMsg); |
|
|
|
} |
|
|
|
|
|
|
|
private void validateUsers() throws Exception { |
|
|
|
Optional<UserUpdateMsg> userUpdateMsgOpt = edgeImitator.findMessageByType(UserUpdateMsg.class); |
|
|
|
Assert.assertTrue(userUpdateMsgOpt.isPresent()); |
|
|
|
UserUpdateMsg userUpdateMsg = userUpdateMsgOpt.get(); |
|
|
|
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, userUpdateMsg.getMsgType()); |
|
|
|
UUID userUUID = new UUID(userUpdateMsg.getIdMSB(), userUpdateMsg.getIdLSB()); |
|
|
|
User user = doGet("/api/user/" + userUUID, User.class); |
|
|
|
Assert.assertNotNull(user); |
|
|
|
Assert.assertEquals("tenant2@thingsboard.org", userUpdateMsg.getEmail()); |
|
|
|
testAutoGeneratedCodeByProtobuf(userUpdateMsg); |
|
|
|
} |
|
|
|
|
|
|
|
protected Device saveDeviceOnCloudAndVerifyDeliveryToEdge() throws Exception { |
|
|
|
// create ota package
|
|
|
|
edgeImitator.expectMessageAmount(1); |
|
|
|
|