@ -25,7 +25,6 @@ import com.google.gson.JsonObject;
import com.google.protobuf.AbstractMessage ;
import com.google.protobuf.AbstractMessage ;
import com.google.protobuf.InvalidProtocolBufferException ;
import com.google.protobuf.InvalidProtocolBufferException ;
import com.google.protobuf.MessageLite ;
import com.google.protobuf.MessageLite ;
import lombok.extern.slf4j.Slf4j ;
import org.apache.commons.lang3.RandomStringUtils ;
import org.apache.commons.lang3.RandomStringUtils ;
import org.awaitility.Awaitility ;
import org.awaitility.Awaitility ;
import org.junit.After ;
import org.junit.After ;
@ -34,6 +33,7 @@ import org.junit.Before;
import org.junit.Test ;
import org.junit.Test ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.thingsboard.common.util.JacksonUtil ;
import org.thingsboard.common.util.JacksonUtil ;
import org.thingsboard.server.cluster.TbClusterService ;
import org.thingsboard.server.common.data.Customer ;
import org.thingsboard.server.common.data.Customer ;
import org.thingsboard.server.common.data.Dashboard ;
import org.thingsboard.server.common.data.Dashboard ;
import org.thingsboard.server.common.data.DataConstants ;
import org.thingsboard.server.common.data.DataConstants ;
@ -42,6 +42,7 @@ import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.EntityType ;
import org.thingsboard.server.common.data.EntityType ;
import org.thingsboard.server.common.data.EntityView ;
import org.thingsboard.server.common.data.EntityView ;
import org.thingsboard.server.common.data.Tenant ;
import org.thingsboard.server.common.data.Tenant ;
import org.thingsboard.server.common.data.TenantProfile ;
import org.thingsboard.server.common.data.User ;
import org.thingsboard.server.common.data.User ;
import org.thingsboard.server.common.data.alarm.Alarm ;
import org.thingsboard.server.common.data.alarm.Alarm ;
import org.thingsboard.server.common.data.alarm.AlarmInfo ;
import org.thingsboard.server.common.data.alarm.AlarmInfo ;
@ -80,6 +81,7 @@ import org.thingsboard.server.common.data.rule.RuleNode;
import org.thingsboard.server.common.data.security.Authority ;
import org.thingsboard.server.common.data.security.Authority ;
import org.thingsboard.server.common.data.security.DeviceCredentials ;
import org.thingsboard.server.common.data.security.DeviceCredentials ;
import org.thingsboard.server.common.data.security.DeviceCredentialsType ;
import org.thingsboard.server.common.data.security.DeviceCredentialsType ;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration ;
import org.thingsboard.server.common.data.widget.WidgetType ;
import org.thingsboard.server.common.data.widget.WidgetType ;
import org.thingsboard.server.common.data.widget.WidgetsBundle ;
import org.thingsboard.server.common.data.widget.WidgetsBundle ;
import org.thingsboard.server.common.transport.adaptor.JsonConverter ;
import org.thingsboard.server.common.transport.adaptor.JsonConverter ;
@ -110,13 +112,13 @@ import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType ;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType ;
import org.thingsboard.server.gen.edge.v1.UplinkMsg ;
import org.thingsboard.server.gen.edge.v1.UplinkMsg ;
import org.thingsboard.server.gen.edge.v1.UplinkResponseMsg ;
import org.thingsboard.server.gen.edge.v1.UserCredentialsRequestMsg ;
import org.thingsboard.server.gen.edge.v1.UserCredentialsRequestMsg ;
import org.thingsboard.server.gen.edge.v1.UserCredentialsUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.UserCredentialsUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.UserUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.UserUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg ;
import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg ;
import org.thingsboard.server.gen.transport.TransportProtos ;
import org.thingsboard.server.gen.transport.TransportProtos ;
import org.thingsboard.server.cluster.TbClusterService ;
import java.util.ArrayList ;
import java.util.ArrayList ;
import java.util.List ;
import java.util.List ;
@ -129,7 +131,6 @@ import java.util.concurrent.TimeUnit;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status ;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status ;
@Slf4j
abstract public class BaseEdgeTest extends AbstractControllerTest {
abstract public class BaseEdgeTest extends AbstractControllerTest {
private static final String CUSTOM_DEVICE_PROFILE_NAME = "Thermostat" ;
private static final String CUSTOM_DEVICE_PROFILE_NAME = "Thermostat" ;
@ -165,7 +166,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
tenantAdmin . setLastName ( "Downs" ) ;
tenantAdmin . setLastName ( "Downs" ) ;
tenantAdmin = createUserAndLogin ( tenantAdmin , "testPassword1" ) ;
tenantAdmin = createUserAndLogin ( tenantAdmin , "testPassword1" ) ;
// sleep 1 seconds to avoid CREDENTIALS updated message for the user
// sleep 0.5 second to avoid CREDENTIALS updated message for the user
// user credentials is going to be stored and updated event pushed to edge notification service
// user credentials is going to be stored and updated event pushed to edge notification service
// while service will be processing this event edge could be already added and additional message will be pushed
// while service will be processing this event edge could be already added and additional message will be pushed
Thread . sleep ( 500 ) ;
Thread . sleep ( 500 ) ;
@ -176,7 +177,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
edgeImitator . expectMessageAmount ( 13 ) ;
edgeImitator . expectMessageAmount ( 13 ) ;
edgeImitator . connect ( ) ;
edgeImitator . connect ( ) ;
testReceive dInitialData( ) ;
verifyEdgeConnectionAn dInitialData( ) ;
}
}
@After
@After
@ -187,41 +188,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
loginSysAdmin ( ) ;
loginSysAdmin ( ) ;
doDelete ( "/api/tenant/" + savedTenant . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/tenant/" + savedTenant . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
}
}
@Test
public void test ( ) throws Exception {
testDevices ( ) ;
testAssets ( ) ;
testRuleChains ( ) ;
testDashboards ( ) ;
testRelations ( ) ;
testAlarms ( ) ;
testEntityView ( ) ;
testCustomerAndNewUser ( ) ;
testWidgetsBundleAndWidgetType ( ) ;
testTimeseries ( ) ;
testAttributes ( ) ;
testRpcCall ( ) ;
testTimeseriesWithFailures ( ) ;
testSendMessagesToCloud ( ) ;
}
private void installation ( ) throws Exception {
private void installation ( ) throws Exception {
edge = doPost ( "/api/edge" , constructEdge ( "Test Edge" , "test" ) , Edge . class ) ;
edge = doPost ( "/api/edge" , constructEdge ( "Test Edge" , "test" ) , Edge . class ) ;
@ -230,12 +200,12 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
doPost ( "/api/deviceProfile" , deviceProfile , DeviceProfile . class ) ;
doPost ( "/api/deviceProfile" , deviceProfile , DeviceProfile . class ) ;
Device savedDevice = saveDevice ( "Edge Device 1" , CUSTOM_DEVICE_PROFILE_NAME ) ;
Device savedDevice = saveDevice ( "Edge Device 1" , CUSTOM_DEVICE_PROFILE_NAME ) ;
doPost ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doPost ( "/api/edge/" + edge . getUuid Id ( )
+ "/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
+ "/device/" + savedDevice . getUuidId ( ) , Device . class ) ;
Asset savedAsset = saveAsset ( "Edge Asset 1" ) ;
Asset savedAsset = saveAsset ( "Edge Asset 1" ) ;
doPost ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doPost ( "/api/edge/" + edge . getUuid Id ( )
+ "/asset/" + savedAsset . getId ( ) . getId ( ) . toString ( ) , Asset . class ) ;
+ "/asset/" + savedAsset . getUuidId ( ) , Asset . class ) ;
}
}
private void extendDeviceProfileData ( DeviceProfile deviceProfile ) {
private void extendDeviceProfileData ( DeviceProfile deviceProfile ) {
@ -267,8 +237,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
profileData . setProvisionConfiguration ( new AllowCreateNewDevicesDeviceProfileProvisionConfiguration ( "123" ) ) ;
profileData . setProvisionConfiguration ( new AllowCreateNewDevicesDeviceProfileProvisionConfiguration ( "123" ) ) ;
}
}
private void testReceivedInitialData ( ) throws Exception {
private void verifyEdgeConnectionAndInitialData ( ) throws Exception {
log . info ( "Checking received data" ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
EdgeConfiguration configuration = edgeImitator . getConfiguration ( ) ;
EdgeConfiguration configuration = edgeImitator . getConfiguration ( ) ;
@ -283,7 +252,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
UUID deviceUUID = new UUID ( deviceUpdateMsg . getIdMSB ( ) , deviceUpdateMsg . getIdLSB ( ) ) ;
UUID deviceUUID = new UUID ( deviceUpdateMsg . getIdMSB ( ) , deviceUpdateMsg . getIdLSB ( ) ) ;
Device device = doGet ( "/api/device/" + deviceUUID . toString ( ) , Device . class ) ;
Device device = doGet ( "/api/device/" + deviceUUID . toString ( ) , Device . class ) ;
Assert . assertNotNull ( device ) ;
Assert . assertNotNull ( device ) ;
List < Device > edgeDevices = doGetTypedWithPageLink ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( ) + "/devices?" ,
List < Device > edgeDevices = doGetTypedWithPageLink ( "/api/edge/" + edge . getUuidId ( ) + "/devices?" ,
new TypeReference < PageData < Device > > ( ) { } , new PageLink ( 100 ) ) . getData ( ) ;
new TypeReference < PageData < Device > > ( ) { } , new PageLink ( 100 ) ) . getData ( ) ;
Assert . assertTrue ( edgeDevices . contains ( device ) ) ;
Assert . assertTrue ( edgeDevices . contains ( device ) ) ;
@ -310,7 +279,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
UUID assetUUID = new UUID ( assetUpdateMsg . getIdMSB ( ) , assetUpdateMsg . getIdLSB ( ) ) ;
UUID assetUUID = new UUID ( assetUpdateMsg . getIdMSB ( ) , assetUpdateMsg . getIdLSB ( ) ) ;
Asset asset = doGet ( "/api/asset/" + assetUUID . toString ( ) , Asset . class ) ;
Asset asset = doGet ( "/api/asset/" + assetUUID . toString ( ) , Asset . class ) ;
Assert . assertNotNull ( asset ) ;
Assert . assertNotNull ( asset ) ;
List < Asset > edgeAssets = doGetTypedWithPageLink ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( ) + "/assets?" ,
List < Asset > edgeAssets = doGetTypedWithPageLink ( "/api/edge/" + edge . getUuidId ( ) + "/assets?" ,
new TypeReference < PageData < Asset > > ( ) { } , new PageLink ( 100 ) ) . getData ( ) ;
new TypeReference < PageData < Asset > > ( ) { } , new PageLink ( 100 ) ) . getData ( ) ;
Assert . assertTrue ( edgeAssets . contains ( asset ) ) ;
Assert . assertTrue ( edgeAssets . contains ( asset ) ) ;
@ -323,15 +292,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
UUID ruleChainUUID = new UUID ( ruleChainUpdateMsg . getIdMSB ( ) , ruleChainUpdateMsg . getIdLSB ( ) ) ;
UUID ruleChainUUID = new UUID ( ruleChainUpdateMsg . getIdMSB ( ) , ruleChainUpdateMsg . getIdLSB ( ) ) ;
RuleChain ruleChain = doGet ( "/api/ruleChain/" + ruleChainUUID . toString ( ) , RuleChain . class ) ;
RuleChain ruleChain = doGet ( "/api/ruleChain/" + ruleChainUUID . toString ( ) , RuleChain . class ) ;
Assert . assertNotNull ( ruleChain ) ;
Assert . assertNotNull ( ruleChain ) ;
List < RuleChain > edgeRuleChains = doGetTypedWithPageLink ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( ) + "/ruleChains?" ,
List < RuleChain > edgeRuleChains = doGetTypedWithPageLink ( "/api/edge/" + edge . getUuidId ( ) + "/ruleChains?" ,
new TypeReference < PageData < RuleChain > > ( ) { } , new PageLink ( 100 ) ) . getData ( ) ;
new TypeReference < PageData < RuleChain > > ( ) { } , new PageLink ( 100 ) ) . getData ( ) ;
Assert . assertTrue ( edgeRuleChains . contains ( ruleChain ) ) ;
Assert . assertTrue ( edgeRuleChains . contains ( ruleChain ) ) ;
testAutoGeneratedCodeByProtobuf ( ruleChainUpdateMsg ) ;
testAutoGeneratedCodeByProtobuf ( ruleChainUpdateMsg ) ;
validateAdminSettings ( ) ;
validateAdminSettings ( ) ;
log . info ( "Received data checked" ) ;
}
}
private void validateAdminSettings ( ) throws JsonProcessingException {
private void validateAdminSettings ( ) throws JsonProcessingException {
@ -367,39 +334,54 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertNotNull ( jsonNode . get ( "test" ) ) ;
Assert . assertNotNull ( jsonNode . get ( "test" ) ) ;
}
}
private void testDevices ( ) throws Exception {
@Test
log . info ( "Testing devices" ) ;
public void testDeviceProfiles ( ) throws Exception {
// 1
// 1
DeviceProfile deviceProfile = this . createDeviceProfile ( "ONE_MORE_DEVICE_PROFILE" , null ) ;
extendDeviceProfileData ( deviceProfile ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
Device savedDevice = saveDevice ( "Edge Device 2" , "Default" ) ;
deviceProfile = doPost ( "/api/deviceProfile" , deviceProfile , DeviceProfile . class ) ;
doPost ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( )
+ "/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof DeviceUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof DeviceProfileUpdateMsg ) ;
DeviceUpdateMsg deviceUpdateMsg = ( DeviceUpdateMsg ) latestMessage ;
DeviceProfileUpdateMsg deviceProfileUpdateMsg = ( DeviceProfileUpdateMsg ) latestMessage ;
Assert . assertEquals ( UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , deviceUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , deviceProfileUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdMSB ( ) , savedDevice . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( deviceProfileUpdateMsg . getIdMSB ( ) , deviceProfile . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdLSB ( ) , savedDevice . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( deviceProfileUpdateMsg . getIdLSB ( ) , deviceProfile . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getName ( ) , savedDevice . getName ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getType ( ) , savedDevice . getType ( ) ) ;
// 2
// 2
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( )
doDelete ( "/api/deviceProfile/" + deviceProfile . getUuid Id ( ) )
+ "/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof DeviceProfileUpdateMsg ) ;
deviceProfileUpdateMsg = ( DeviceProfileUpdateMsg ) latestMessage ;
Assert . assertEquals ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE , deviceProfileUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( deviceProfileUpdateMsg . getIdMSB ( ) , deviceProfile . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( deviceProfileUpdateMsg . getIdLSB ( ) , deviceProfile . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
}
@Test
public void testDevices ( ) throws Exception {
// 1
Device savedDevice = saveDeviceOnCloudAndVerifyDeliveryToEdge ( ) ;
// 2
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/edge/" + edge . getUuidId ( )
+ "/device/" + savedDevice . getUuidId ( ) , Device . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof DeviceUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof DeviceUpdateMsg ) ;
deviceUpdateMsg = ( DeviceUpdateMsg ) latestMessage ;
DeviceUpdateMsg deviceUpdateMsg = ( DeviceUpdateMsg ) latestMessage ;
Assert . assertEquals ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE , deviceUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE , deviceUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdMSB ( ) , savedDevice . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdMSB ( ) , savedDevice . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdLSB ( ) , savedDevice . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdLSB ( ) , savedDevice . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
// 3
// 3
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/device/" + savedDevice . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
// we should not get any message because device is not assigned to edge any more
// we should not get any message because device is not assigned to edge any more
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
@ -407,8 +389,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 4
// 4
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
savedDevice = saveDevice ( "Edge Device 3" , "Default" ) ;
savedDevice = saveDevice ( "Edge Device 3" , "Default" ) ;
doPost ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doPost ( "/api/edge/" + edge . getUuid Id ( )
+ "/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
+ "/device/" + savedDevice . getUuidId ( ) , Device . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof DeviceUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof DeviceUpdateMsg ) ;
@ -421,7 +403,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 5
// 5
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/device/" + savedDevice . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/device/" + savedDevice . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
// in this case we should get messages because device was assigned to edge
// in this case we should get messages because device was assigned to edge
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
@ -432,17 +414,49 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( deviceUpdateMsg . getIdMSB ( ) , savedDevice . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdMSB ( ) , savedDevice . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdLSB ( ) , savedDevice . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdLSB ( ) , savedDevice . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
log . info ( "Devices tested successfully" ) ;
}
}
private void testAssets ( ) throws Exception {
@Test
log . info ( "Testing assets" ) ;
public void testDeviceReachedMaximumAllowedOnCloud ( ) throws Exception {
// update tenant profile configuration
loginSysAdmin ( ) ;
TenantProfile tenantProfile = doGet ( "/api/tenantProfile/" + savedTenant . getTenantProfileId ( ) . getId ( ) , TenantProfile . class ) ;
DefaultTenantProfileConfiguration profileConfiguration =
( DefaultTenantProfileConfiguration ) tenantProfile . getProfileData ( ) . getConfiguration ( ) ;
profileConfiguration . setMaxDevices ( 1 ) ;
tenantProfile . getProfileData ( ) . setConfiguration ( profileConfiguration ) ;
doPost ( "/api/tenantProfile/" , tenantProfile , TenantProfile . class ) ;
loginTenantAdmin ( ) ;
UUID uuid = Uuids . timeBased ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
DeviceUpdateMsg . Builder deviceUpdateMsgBuilder = DeviceUpdateMsg . newBuilder ( ) ;
deviceUpdateMsgBuilder . setIdMSB ( uuid . getMostSignificantBits ( ) ) ;
deviceUpdateMsgBuilder . setIdLSB ( uuid . getLeastSignificantBits ( ) ) ;
deviceUpdateMsgBuilder . setName ( "Edge Device" ) ;
deviceUpdateMsgBuilder . setType ( "default" ) ;
deviceUpdateMsgBuilder . setMsgType ( UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE ) ;
uplinkMsgBuilder . addDeviceUpdateMsg ( deviceUpdateMsgBuilder . build ( ) ) ;
edgeImitator . expectResponsesAmount ( 1 ) ;
edgeImitator . sendUplinkMsg ( uplinkMsgBuilder . build ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
UplinkResponseMsg latestResponseMsg = edgeImitator . getLatestResponseMsg ( ) ;
Assert . assertTrue ( latestResponseMsg . getSuccess ( ) ) ;
}
@Test
public void testAssets ( ) throws Exception {
// 1
// 1
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
Asset savedAsset = saveAsset ( "Edge Asset 2" ) ;
Asset savedAsset = saveAsset ( "Edge Asset 2" ) ;
doPost ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( )
doPost ( "/api/edge/" + edge . getUuid Id ( )
+ "/asset/" + savedAsset . getId ( ) . getId ( ) . toString ( ) , Asset . class ) ;
+ "/asset/" + savedAsset . getUuidId ( ) , Asset . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof AssetUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof AssetUpdateMsg ) ;
@ -455,8 +469,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 2
// 2
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doDelete ( "/api/edge/" + edge . getUuid Id ( )
+ "/asset/" + savedAsset . getId ( ) . getId ( ) . toString ( ) , Asset . class ) ;
+ "/asset/" + savedAsset . getUuidId ( ) , Asset . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof AssetUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof AssetUpdateMsg ) ;
@ -467,15 +481,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 3
// 3
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/asset/" + savedAsset . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/asset/" + savedAsset . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
// 4
// 4
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
savedAsset = saveAsset ( "Edge Asset 3" ) ;
savedAsset = saveAsset ( "Edge Asset 3" ) ;
doPost ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doPost ( "/api/edge/" + edge . getUuid Id ( )
+ "/asset/" + savedAsset . getId ( ) . getId ( ) . toString ( ) , Asset . class ) ;
+ "/asset/" + savedAsset . getUuidId ( ) , Asset . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof AssetUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof AssetUpdateMsg ) ;
@ -488,7 +502,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 5
// 5
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/asset/" + savedAsset . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/asset/" + savedAsset . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
@ -497,21 +511,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE , assetUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE , assetUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( assetUpdateMsg . getIdMSB ( ) , savedAsset . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( assetUpdateMsg . getIdMSB ( ) , savedAsset . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( assetUpdateMsg . getIdLSB ( ) , savedAsset . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( assetUpdateMsg . getIdLSB ( ) , savedAsset . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
log . info ( "Assets tested successfully" ) ;
}
}
private void testRuleChains ( ) throws Exception {
@Test
log . info ( "Testing RuleChains" ) ;
public void testRuleChains ( ) throws Exception {
// 1
// 1
edgeImitator . expectMessageAmount ( 2 ) ;
edgeImitator . expectMessageAmount ( 2 ) ;
RuleChain ruleChain = new RuleChain ( ) ;
RuleChain ruleChain = new RuleChain ( ) ;
ruleChain . setName ( "Edge Test Rule Chain" ) ;
ruleChain . setName ( "Edge Test Rule Chain" ) ;
ruleChain . setType ( RuleChainType . EDGE ) ;
ruleChain . setType ( RuleChainType . EDGE ) ;
RuleChain savedRuleChain = doPost ( "/api/ruleChain" , ruleChain , RuleChain . class ) ;
RuleChain savedRuleChain = doPost ( "/api/ruleChain" , ruleChain , RuleChain . class ) ;
doPost ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doPost ( "/api/edge/" + edge . getUuid Id ( )
+ "/ruleChain/" + savedRuleChain . getId ( ) . getId ( ) . toString ( ) , RuleChain . class ) ;
+ "/ruleChain/" + savedRuleChain . getUuidId ( ) , RuleChain . class ) ;
createRuleChainMetadata ( savedRuleChain ) ;
createRuleChainMetadata ( savedRuleChain ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Optional < RuleChainUpdateMsg > ruleChainUpdateMsgOpt = edgeImitator . findMessageByType ( RuleChainUpdateMsg . class ) ;
Optional < RuleChainUpdateMsg > ruleChainUpdateMsgOpt = edgeImitator . findMessageByType ( RuleChainUpdateMsg . class ) ;
@ -528,8 +539,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 3
// 3
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doDelete ( "/api/edge/" + edge . getUuid Id ( )
+ "/ruleChain/" + savedRuleChain . getId ( ) . getId ( ) . toString ( ) , RuleChain . class ) ;
+ "/ruleChain/" + savedRuleChain . getUuidId ( ) , RuleChain . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
ruleChainUpdateMsgOpt = edgeImitator . findMessageByType ( RuleChainUpdateMsg . class ) ;
ruleChainUpdateMsgOpt = edgeImitator . findMessageByType ( RuleChainUpdateMsg . class ) ;
Assert . assertTrue ( ruleChainUpdateMsgOpt . isPresent ( ) ) ;
Assert . assertTrue ( ruleChainUpdateMsgOpt . isPresent ( ) ) ;
@ -540,11 +551,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 4
// 4
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/ruleChain/" + savedRuleChain . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/ruleChain/" + savedRuleChain . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
log . info ( "RuleChains tested successfully" ) ;
}
}
private void testRuleChainMetadataRequestMsg ( RuleChainId ruleChainId ) throws Exception {
private void testRuleChainMetadataRequestMsg ( RuleChainId ruleChainId ) throws Exception {
@ -603,21 +612,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
ruleChainMetaData . addConnectionInfo ( 0 , 2 , "fail" ) ;
ruleChainMetaData . addConnectionInfo ( 0 , 2 , "fail" ) ;
ruleChainMetaData . addConnectionInfo ( 1 , 2 , "success" ) ;
ruleChainMetaData . addConnectionInfo ( 1 , 2 , "success" ) ;
ruleChainMetaData . addRuleChainConnectionInfo ( 2 , edge . getRootRuleChainId ( ) , "success" , mapper . createObjectNode ( ) ) ;
doPost ( "/api/ruleChain/metadata" , ruleChainMetaData , RuleChainMetaData . class ) ;
doPost ( "/api/ruleChain/metadata" , ruleChainMetaData , RuleChainMetaData . class ) ;
}
}
private void testDashboards ( ) throws Exception {
@Test
log . info ( "Testing Dashboards" ) ;
public void testDashboards ( ) throws Exception {
// 1
// 1
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
Dashboard dashboard = new Dashboard ( ) ;
Dashboard dashboard = new Dashboard ( ) ;
dashboard . setTitle ( "Edge Test Dashboard" ) ;
dashboard . setTitle ( "Edge Test Dashboard" ) ;
Dashboard savedDashboard = doPost ( "/api/dashboard" , dashboard , Dashboard . class ) ;
Dashboard savedDashboard = doPost ( "/api/dashboard" , dashboard , Dashboard . class ) ;
doPost ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doPost ( "/api/edge/" + edge . getUuid Id ( )
+ "/dashboard/" + savedDashboard . getId ( ) . getId ( ) . toString ( ) , Dashboard . class ) ;
+ "/dashboard/" + savedDashboard . getUuidId ( ) , Dashboard . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof DashboardUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof DashboardUpdateMsg ) ;
@ -641,8 +647,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 3
// 3
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doDelete ( "/api/edge/" + edge . getUuid Id ( )
+ "/dashboard/" + savedDashboard . getId ( ) . getId ( ) . toString ( ) , Dashboard . class ) ;
+ "/dashboard/" + savedDashboard . getUuidId ( ) , Dashboard . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof DashboardUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof DashboardUpdateMsg ) ;
@ -653,16 +659,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 4
// 4
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/dashboard/" + savedDashboard . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/dashboard/" + savedDashboard . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
log . info ( "Dashboards tested successfully" ) ;
}
}
private void testRelations ( ) throws Exception {
@Test
log . info ( "Testing Relations" ) ;
public void testRelations ( ) throws Exception {
// 1
// 1
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
@ -710,13 +713,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( relationUpdateMsg . getToIdLSB ( ) , relation . getTo ( ) . getId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( relationUpdateMsg . getToIdLSB ( ) , relation . getTo ( ) . getId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( relationUpdateMsg . getToEntityType ( ) , relation . getTo ( ) . getEntityType ( ) . name ( ) ) ;
Assert . assertEquals ( relationUpdateMsg . getToEntityType ( ) , relation . getTo ( ) . getEntityType ( ) . name ( ) ) ;
Assert . assertEquals ( relationUpdateMsg . getTypeGroup ( ) , relation . getTypeGroup ( ) . name ( ) ) ;
Assert . assertEquals ( relationUpdateMsg . getTypeGroup ( ) , relation . getTypeGroup ( ) . name ( ) ) ;
log . info ( "Relations tested successfully" ) ;
}
}
private void testAlarms ( ) throws Exception {
@Test
log . info ( "Testing Alarms" ) ;
public void testAlarms ( ) throws Exception {
// 1
// 1
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
@ -739,7 +739,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 2
// 2
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doPost ( "/api/alarm/" + savedAlarm . getId ( ) . getId ( ) . toString ( ) + "/ack" ) ;
doPost ( "/api/alarm/" + savedAlarm . getUuidId ( ) + "/ack" ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof AlarmUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof AlarmUpdateMsg ) ;
@ -752,7 +752,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 3
// 3
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doPost ( "/api/alarm/" + savedAlarm . getId ( ) . getId ( ) . toString ( ) + "/clear" ) ;
doPost ( "/api/alarm/" + savedAlarm . getUuidId ( ) + "/clear" ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof AlarmUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof AlarmUpdateMsg ) ;
@ -765,7 +765,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 4
// 4
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/alarm/" + savedAlarm . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/alarm/" + savedAlarm . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
@ -776,13 +776,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( alarmUpdateMsg . getName ( ) , savedAlarm . getName ( ) ) ;
Assert . assertEquals ( alarmUpdateMsg . getName ( ) , savedAlarm . getName ( ) ) ;
Assert . assertEquals ( alarmUpdateMsg . getOriginatorName ( ) , device . getName ( ) ) ;
Assert . assertEquals ( alarmUpdateMsg . getOriginatorName ( ) , device . getName ( ) ) ;
Assert . assertEquals ( alarmUpdateMsg . getStatus ( ) , AlarmStatus . CLEARED_ACK . name ( ) ) ;
Assert . assertEquals ( alarmUpdateMsg . getStatus ( ) , AlarmStatus . CLEARED_ACK . name ( ) ) ;
log . info ( "Alarms tested successfully" ) ;
}
}
private void testEntityView ( ) throws Exception {
@Test
log . info ( "Testing EntityView" ) ;
public void testEntityView ( ) throws Exception {
// 1
// 1
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
@ -791,8 +788,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
entityView . setType ( "test" ) ;
entityView . setType ( "test" ) ;
entityView . setEntityId ( device . getId ( ) ) ;
entityView . setEntityId ( device . getId ( ) ) ;
EntityView savedEntityView = doPost ( "/api/entityView" , entityView , EntityView . class ) ;
EntityView savedEntityView = doPost ( "/api/entityView" , entityView , EntityView . class ) ;
doPost ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doPost ( "/api/edge/" + edge . getUuid Id ( )
+ "/entityView/" + savedEntityView . getId ( ) . getId ( ) . toString ( ) , EntityView . class ) ;
+ "/entityView/" + savedEntityView . getUuidId ( ) , EntityView . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
verifyEntityViewUpdateMsg ( savedEntityView , device ) ;
verifyEntityViewUpdateMsg ( savedEntityView , device ) ;
@ -818,8 +815,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 3
// 3
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/edge/" + edge . getId ( ) . get Id ( ) . toString ( )
doDelete ( "/api/edge/" + edge . getUuid Id ( )
+ "/entityView/" + savedEntityView . getId ( ) . getId ( ) . toString ( ) , EntityView . class ) ;
+ "/entityView/" + savedEntityView . getUuidId ( ) , EntityView . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof EntityViewUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof EntityViewUpdateMsg ) ;
@ -830,11 +827,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/entityView/" + savedEntityView . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/entityView/" + savedEntityView . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
log . info ( "EntityView tested successfully" ) ;
}
}
private void verifyEntityViewUpdateMsg ( EntityView entityView , Device device ) {
private void verifyEntityViewUpdateMsg ( EntityView entityView , Device device ) {
@ -851,16 +846,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( entityViewUpdateMsg . getEntityType ( ) . name ( ) , device . getId ( ) . getEntityType ( ) . name ( ) ) ;
Assert . assertEquals ( entityViewUpdateMsg . getEntityType ( ) . name ( ) , device . getId ( ) . getEntityType ( ) . name ( ) ) ;
}
}
private void testCustomerAndNewUser ( ) throws Exception {
@Test
log . info ( "Testing Customer" ) ;
public void testCustomerAndNewUser ( ) throws Exception {
// 1
// 1
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
Customer customer = new Customer ( ) ;
Customer customer = new Customer ( ) ;
customer . setTitle ( "Edge Customer 1" ) ;
customer . setTitle ( "Edge Customer 1" ) ;
Customer savedCustomer = doPost ( "/api/customer" , customer , Customer . class ) ;
Customer savedCustomer = doPost ( "/api/customer" , customer , Customer . class ) ;
doPost ( "/api/customer/" + savedCustomer . getId ( ) . get Id ( ) . toString ( )
doPost ( "/api/customer/" + savedCustomer . getUuid Id ( )
+ "/edge/" + edge . getId ( ) . getId ( ) . toString ( ) , Edge . class ) ;
+ "/edge/" + edge . getUuidId ( ) , Edge . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof CustomerUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof CustomerUpdateMsg ) ;
@ -893,7 +887,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 3
// 3
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/customer/edge/" + edge . getId ( ) . getId ( ) . toString ( ) , Edge . class ) ;
doDelete ( "/api/customer/edge/" + edge . getUuidId ( ) , Edge . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof CustomerUpdateMsg ) ;
Assert . assertTrue ( latestMessage instanceof CustomerUpdateMsg ) ;
@ -903,16 +897,13 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( customerUpdateMsg . getIdLSB ( ) , savedCustomer . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( customerUpdateMsg . getIdLSB ( ) , savedCustomer . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/customer/" + savedCustomer . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/customer/" + savedCustomer . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
Assert . assertFalse ( edgeImitator . waitForMessages ( 1 ) ) ;
log . info ( "Customer tested successfully" ) ;
}
}
private void testWidgetsBundleAndWidgetType ( ) throws Exception {
@Test
log . info ( "Testing WidgetsBundle and WidgetType" ) ;
public void testWidgetsBundleAndWidgetType ( ) throws Exception {
// 1
// 1
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
WidgetsBundle widgetsBundle = new WidgetsBundle ( ) ;
WidgetsBundle widgetsBundle = new WidgetsBundle ( ) ;
@ -951,7 +942,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 3
// 3
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/widgetType/" + savedWidgetType . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/widgetType/" + savedWidgetType . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
@ -963,7 +954,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
// 4
// 4
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
doDelete ( "/api/widgetsBundle/" + savedWidgetsBundle . getId ( ) . getId ( ) . toString ( ) )
doDelete ( "/api/widgetsBundle/" + savedWidgetsBundle . getUuidId ( ) )
. andExpect ( status ( ) . isOk ( ) ) ;
. andExpect ( status ( ) . isOk ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
latestMessage = edgeImitator . getLatestMessage ( ) ;
@ -972,13 +963,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE , widgetsBundleUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE , widgetsBundleUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( widgetsBundleUpdateMsg . getIdMSB ( ) , savedWidgetsBundle . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( widgetsBundleUpdateMsg . getIdMSB ( ) , savedWidgetsBundle . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( widgetsBundleUpdateMsg . getIdLSB ( ) , savedWidgetsBundle . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( widgetsBundleUpdateMsg . getIdLSB ( ) , savedWidgetsBundle . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
log . info ( "WidgetsBundle and WidgetType tested successfully" ) ;
}
}
private void testTimeseries ( ) throws Exception {
@Test
log . info ( "Testing timeseries" ) ;
public void testTimeseries ( ) throws Exception {
edgeImitator . expectMessageAmount ( 1 ) ;
edgeImitator . expectMessageAmount ( 1 ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System . currentTimeMillis ( ) + "}" ;
String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System . currentTimeMillis ( ) + "}" ;
@ -1004,18 +992,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
TransportProtos . KeyValueProto keyValueProto = tsKvListProto . getKv ( 0 ) ;
TransportProtos . KeyValueProto keyValueProto = tsKvListProto . getKv ( 0 ) ;
Assert . assertEquals ( "temperature" , keyValueProto . getKey ( ) ) ;
Assert . assertEquals ( "temperature" , keyValueProto . getKey ( ) ) ;
Assert . assertEquals ( 25 , keyValueProto . getLongV ( ) ) ;
Assert . assertEquals ( 25 , keyValueProto . getLongV ( ) ) ;
log . info ( "Timeseries tested successfully" ) ;
}
}
private void testAttributes ( ) throws Exception {
@Test
log . info ( "Testing attributes" ) ;
public void testAttributes ( ) throws Exception {
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
testAttributesUpdatedMsg ( device ) ;
testAttributesUpdatedMsg ( device ) ;
testPostAttributesMsg ( device ) ;
testPostAttributesMsg ( device ) ;
testAttributesDeleteMsg ( device ) ;
testAttributesDeleteMsg ( device ) ;
log . info ( "Attributes tested successfully" ) ;
}
}
private void testAttributesUpdatedMsg ( Device device ) throws JsonProcessingException , InterruptedException {
private void testAttributesUpdatedMsg ( Device device ) throws JsonProcessingException , InterruptedException {
@ -1094,7 +1079,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( "key2" , attributeDeleteMsg . getAttributeNames ( 1 ) ) ;
Assert . assertEquals ( "key2" , attributeDeleteMsg . getAttributeNames ( 1 ) ) ;
}
}
private void testRpcCall ( ) throws Exception {
@Test
public void testRpcCall ( ) throws Exception {
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
ObjectNode body = mapper . createObjectNode ( ) ;
ObjectNode body = mapper . createObjectNode ( ) ;
@ -1117,9 +1103,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( "test_method" , latestDeviceRpcCallMsg . getRequestMsg ( ) . getMethod ( ) ) ;
Assert . assertEquals ( "test_method" , latestDeviceRpcCallMsg . getRequestMsg ( ) . getMethod ( ) ) ;
}
}
private void testTimeseriesWithFailures ( ) throws Exception {
@Test
log . info ( "Testing timeseries with failures" ) ;
public void testTimeseriesWithFailures ( ) throws Exception {
int numberOfTimeseriesToSend = 1000 ;
int numberOfTimeseriesToSend = 1000 ;
edgeImitator . setRandomFailuresOnTimeseriesDownlink ( true ) ;
edgeImitator . setRandomFailuresOnTimeseriesDownlink ( true ) ;
@ -1147,7 +1132,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
}
}
edgeImitator . setRandomFailuresOnTimeseriesDownlink ( false ) ;
edgeImitator . setRandomFailuresOnTimeseriesDownlink ( false ) ;
log . info ( "Timeseries with failures tested successfully" ) ;
}
}
private boolean isIdxExistsInTheDownlinkList ( int idx , List < EntityDataProto > allTelemetryMsgs ) {
private boolean isIdxExistsInTheDownlinkList ( int idx , List < EntityDataProto > allTelemetryMsgs ) {
@ -1165,25 +1149,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
return false ;
return false ;
}
}
private void testSendMessagesToCloud ( ) throws Exception {
@Test
log . info ( "Sending messages to cloud" ) ;
public void testSendDeviceToCloud ( ) throws Exception {
sendDevice ( ) ;
sendDeviceWithNameThatAlreadyExistsOnCloud ( ) ;
sendRelationRequest ( ) ;
sendAlarm ( ) ;
sendTelemetry ( ) ;
sendRelation ( ) ;
sendDeleteDeviceOnEdge ( ) ;
sendRuleChainMetadataRequest ( ) ;
sendUserCredentialsRequest ( ) ;
sendDeviceCredentialsRequest ( ) ;
sendDeviceRpcResponse ( ) ;
sendDeviceCredentialsUpdate ( ) ;
sendAttributesRequest ( ) ;
log . info ( "Messages were sent successfully" ) ;
}
private void sendDevice ( ) throws Exception {
UUID uuid = Uuids . timeBased ( ) ;
UUID uuid = Uuids . timeBased ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
@ -1218,7 +1185,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( "Edge Device 2" , device . getName ( ) ) ;
Assert . assertEquals ( "Edge Device 2" , device . getName ( ) ) ;
}
}
private void sendDeviceWithNameThatAlreadyExistsOnCloud ( ) throws Exception {
@Test
public void testSendDeviceToCloudWithNameThatAlreadyExistsOnCloud ( ) throws Exception {
String deviceOnCloudName = RandomStringUtils . randomAlphanumeric ( 15 ) ;
String deviceOnCloudName = RandomStringUtils . randomAlphanumeric ( 15 ) ;
Device deviceOnCloud = saveDevice ( deviceOnCloudName , "Default" ) ;
Device deviceOnCloud = saveDevice ( deviceOnCloudName , "Default" ) ;
@ -1270,7 +1238,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertNotEquals ( deviceOnCloudName , device . getName ( ) ) ;
Assert . assertNotEquals ( deviceOnCloudName , device . getName ( ) ) ;
}
}
private void sendRelationRequest ( ) throws Exception {
@Test
public void testSendRelationRequestToCloud ( ) throws Exception {
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
Asset asset = findAssetByName ( "Edge Asset 1" ) ;
Asset asset = findAssetByName ( "Edge Asset 1" ) ;
@ -1317,8 +1286,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( relation . getTypeGroup ( ) . name ( ) , relationUpdateMsg . getTypeGroup ( ) ) ;
Assert . assertEquals ( relation . getTypeGroup ( ) . name ( ) , relationUpdateMsg . getTypeGroup ( ) ) ;
}
}
private void sendAlarm ( ) throws Exception {
@Test
Device device = findDeviceByName ( "Edge Device 2" ) ;
public void testSendAlarmToCloud ( ) throws Exception {
Device device = saveDeviceOnCloudAndVerifyDeliveryToEdge ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
AlarmUpdateMsg . Builder alarmUpdateMgBuilder = AlarmUpdateMsg . newBuilder ( ) ;
AlarmUpdateMsg . Builder alarmUpdateMgBuilder = AlarmUpdateMsg . newBuilder ( ) ;
@ -1339,7 +1309,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
List < AlarmInfo > alarms = doGetTypedWithPageLink ( "/api/alarm/{entityType}/{entityId}?" ,
List < AlarmInfo > alarms = doGetTypedWithPageLink ( "/api/alarm/{entityType}/{entityId}?" ,
new TypeReference < PageData < AlarmInfo > > ( ) { } ,
new TypeReference < PageData < AlarmInfo > > ( ) { } ,
new PageLink ( 100 ) , device . getId ( ) . getEntityType ( ) . name ( ) , device . getId ( ) . getId ( ) . toString ( ) )
new PageLink ( 100 ) , device . getId ( ) . getEntityType ( ) . name ( ) , device . getUuidId ( ) )
. getData ( ) ;
. getData ( ) ;
Optional < AlarmInfo > foundAlarm = alarms . stream ( ) . filter ( alarm - > alarm . getType ( ) . equals ( "alarm from edge" ) ) . findAny ( ) ;
Optional < AlarmInfo > foundAlarm = alarms . stream ( ) . filter ( alarm - > alarm . getType ( ) . equals ( "alarm from edge" ) ) . findAny ( ) ;
Assert . assertTrue ( foundAlarm . isPresent ( ) ) ;
Assert . assertTrue ( foundAlarm . isPresent ( ) ) ;
@ -1349,12 +1319,9 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( AlarmSeverity . CRITICAL , alarmInfo . getSeverity ( ) ) ;
Assert . assertEquals ( AlarmSeverity . CRITICAL , alarmInfo . getSeverity ( ) ) ;
}
}
private void sendTelemetry ( ) throws Exception {
@Test
List < Device > edgeDevices = doGetTypedWithPageLink ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( ) + "/devices?" ,
public void testSendTelemetryToCloud ( ) throws Exception {
new TypeReference < PageData < Device > > ( ) { } , new PageLink ( 100 ) ) . getData ( ) ;
Device device = saveDeviceOnCloudAndVerifyDeliveryToEdge ( ) ;
Optional < Device > foundDevice = edgeDevices . stream ( ) . filter ( device1 - > device1 . getName ( ) . equals ( "Edge Device 2" ) ) . findAny ( ) ;
Assert . assertTrue ( foundDevice . isPresent ( ) ) ;
Device device = foundDevice . get ( ) ;
edgeImitator . expectResponsesAmount ( 2 ) ;
edgeImitator . expectResponsesAmount ( 2 ) ;
@ -1402,7 +1369,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( 1 , timeseries . get ( timeseriesKey ) . size ( ) ) ;
Assert . assertEquals ( 1 , timeseries . get ( timeseriesKey ) . size ( ) ) ;
Assert . assertEquals ( timeseriesValue , timeseries . get ( timeseriesKey ) . get ( 0 ) . get ( "value" ) ) ;
Assert . assertEquals ( timeseriesValue , timeseries . get ( timeseriesKey ) . get ( 0 ) . get ( "value" ) ) ;
List < Map < String , String > > attributes = doGetAsyncTyped ( "/api/plugins/telemetry/DEVICE/" + device . getId ( ) + "/values/attributes/" + DataConstants . SERVER_SCOPE , new TypeReference < > ( ) { } ) ;
String attributeValuesUrl = "/api/plugins/telemetry/DEVICE/" + device . getId ( ) + "/values/attributes/" + DataConstants . SERVER_SCOPE ;
List < Map < String , String > > attributes = doGetAsyncTyped ( attributeValuesUrl , new TypeReference < > ( ) { } ) ;
Assert . assertEquals ( 2 , attributes . size ( ) ) ;
Assert . assertEquals ( 2 , attributes . size ( ) ) ;
var result = attributes . stream ( ) . filter ( kv - > kv . get ( "key" ) . equals ( attributesKey ) ) . filter ( kv - > kv . get ( "value" ) . equals ( attributesValue ) ) . findFirst ( ) ;
var result = attributes . stream ( ) . filter ( kv - > kv . get ( "key" ) . equals ( attributesKey ) ) . filter ( kv - > kv . get ( "value" ) . equals ( attributesValue ) ) . findFirst ( ) ;
Assert . assertTrue ( result . isPresent ( ) ) ;
Assert . assertTrue ( result . isPresent ( ) ) ;
@ -1413,15 +1381,10 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
new TypeReference < > ( ) { } ) ;
new TypeReference < > ( ) { } ) ;
}
}
private void sendRelation ( ) throws Exception {
@Test
List < Device > edgeDevices = doGetTypedWithPageLink ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( ) + "/devices?" ,
public void testSendRelationToCloud ( ) throws Exception {
new TypeReference < PageData < Device > > ( ) { } , new PageLink ( 100 ) ) . getData ( ) ;
Device device1 = saveDeviceOnCloudAndVerifyDeliveryToEdge ( ) ;
Optional < Device > foundDevice1 = edgeDevices . stream ( ) . filter ( device1 - > device1 . getName ( ) . equals ( "Edge Device 1" ) ) . findAny ( ) ;
Device device2 = saveDeviceOnCloudAndVerifyDeliveryToEdge ( ) ;
Assert . assertTrue ( foundDevice1 . isPresent ( ) ) ;
Device device1 = foundDevice1 . get ( ) ;
Optional < Device > foundDevice2 = edgeDevices . stream ( ) . filter ( device2 - > device2 . getName ( ) . equals ( "Edge Device 2" ) ) . findAny ( ) ;
Assert . assertTrue ( foundDevice2 . isPresent ( ) ) ;
Device device2 = foundDevice2 . get ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
RelationUpdateMsg . Builder relationUpdateMsgBuilder = RelationUpdateMsg . newBuilder ( ) ;
RelationUpdateMsg . Builder relationUpdateMsgBuilder = RelationUpdateMsg . newBuilder ( ) ;
@ -1444,17 +1407,18 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
EntityRelation relation = doGet ( "/api/relation?" +
EntityRelation relation = doGet ( "/api/relation?" +
"&fromId=" + device2 . getId ( ) . getId ( ) . toString ( ) +
"&fromId=" + device2 . getUuidId ( ) +
"&fromType=" + device2 . getId ( ) . getEntityType ( ) . name ( ) +
"&fromType=" + device2 . getId ( ) . getEntityType ( ) . name ( ) +
"&relationType=" + "test" +
"&relationType=" + "test" +
"&relationTypeGroup=" + RelationTypeGroup . COMMON . name ( ) +
"&relationTypeGroup=" + RelationTypeGroup . COMMON . name ( ) +
"&toId=" + device1 . getId ( ) . getId ( ) . toString ( ) +
"&toId=" + device1 . getUuidId ( ) +
"&toType=" + device1 . getId ( ) . getEntityType ( ) . name ( ) , EntityRelation . class ) ;
"&toType=" + device1 . getId ( ) . getEntityType ( ) . name ( ) , EntityRelation . class ) ;
Assert . assertNotNull ( relation ) ;
Assert . assertNotNull ( relation ) ;
}
}
private void sendDeleteDeviceOnEdge ( ) throws Exception {
@Test
Device device = findDeviceByName ( "Edge Device 2" ) ;
public void testSendDeleteDeviceOnEdgeToCloud ( ) throws Exception {
Device device = saveDeviceOnCloudAndVerifyDeliveryToEdge ( ) ;
UplinkMsg . Builder upLinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder upLinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
DeviceUpdateMsg . Builder deviceDeleteMsgBuilder = DeviceUpdateMsg . newBuilder ( ) ;
DeviceUpdateMsg . Builder deviceDeleteMsgBuilder = DeviceUpdateMsg . newBuilder ( ) ;
deviceDeleteMsgBuilder . setMsgType ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE ) ;
deviceDeleteMsgBuilder . setMsgType ( UpdateMsgType . ENTITY_DELETED_RPC_MESSAGE ) ;
@ -1468,15 +1432,16 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
edgeImitator . expectResponsesAmount ( 1 ) ;
edgeImitator . expectResponsesAmount ( 1 ) ;
edgeImitator . sendUplinkMsg ( upLinkMsgBuilder . build ( ) ) ;
edgeImitator . sendUplinkMsg ( upLinkMsgBuilder . build ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
device = doGet ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) , Device . class ) ;
device = doGet ( "/api/device/" + device . getUuidId ( ) , Device . class ) ;
Assert . assertNotNull ( device ) ;
Assert . assertNotNull ( device ) ;
List < Device > edgeDevices = doGetTypedWithPageLink ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( ) + "/devices?" ,
List < Device > edgeDevices = doGetTypedWithPageLink ( "/api/edge/" + edge . getUuidId ( ) + "/devices?" ,
new TypeReference < PageData < Device > > ( ) {
new TypeReference < PageData < Device > > ( ) {
} , new PageLink ( 100 ) ) . getData ( ) ;
} , new PageLink ( 100 ) ) . getData ( ) ;
Assert . assertFalse ( edgeDevices . contains ( device ) ) ;
Assert . assertFalse ( edgeDevices . contains ( device ) ) ;
}
}
private void sendRuleChainMetadataRequest ( ) throws Exception {
@Test
public void testSendRuleChainMetadataRequestToCloud ( ) throws Exception {
RuleChainId edgeRootRuleChainId = edge . getRootRuleChainId ( ) ;
RuleChainId edgeRootRuleChainId = edge . getRootRuleChainId ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
@ -1503,7 +1468,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
testAutoGeneratedCodeByProtobuf ( ruleChainMetadataUpdateMsg ) ;
testAutoGeneratedCodeByProtobuf ( ruleChainMetadataUpdateMsg ) ;
}
}
private void sendUserCredentialsRequest ( ) throws Exception {
@Test
public void testSendUserCredentialsRequestToCloud ( ) throws Exception {
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UserCredentialsRequestMsg . Builder userCredentialsRequestMsgBuilder = UserCredentialsRequestMsg . newBuilder ( ) ;
UserCredentialsRequestMsg . Builder userCredentialsRequestMsgBuilder = UserCredentialsRequestMsg . newBuilder ( ) ;
userCredentialsRequestMsgBuilder . setUserIdMSB ( tenantAdmin . getId ( ) . getId ( ) . getMostSignificantBits ( ) ) ;
userCredentialsRequestMsgBuilder . setUserIdMSB ( tenantAdmin . getId ( ) . getId ( ) . getMostSignificantBits ( ) ) ;
@ -1528,10 +1494,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
testAutoGeneratedCodeByProtobuf ( userCredentialsUpdateMsg ) ;
testAutoGeneratedCodeByProtobuf ( userCredentialsUpdateMsg ) ;
}
}
private void sendDeviceCredentialsRequest ( ) throws Exception {
@Test
public void testSendDeviceCredentialsRequestToCloud ( ) throws Exception {
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
DeviceCredentials deviceCredentials = doGet ( "/api/device/" + device . getId ( ) . getId ( ) . toString ( ) + "/credentials" , DeviceCredentials . class ) ;
DeviceCredentials deviceCredentials = doGet ( "/api/device/" + device . getUuidId ( ) + "/credentials" , DeviceCredentials . class ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
DeviceCredentialsRequestMsg . Builder deviceCredentialsRequestMsgBuilder = DeviceCredentialsRequestMsg . newBuilder ( ) ;
DeviceCredentialsRequestMsg . Builder deviceCredentialsRequestMsgBuilder = DeviceCredentialsRequestMsg . newBuilder ( ) ;
@ -1557,7 +1524,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertEquals ( deviceCredentialsUpdateMsg . getCredentialsId ( ) , deviceCredentials . getCredentialsId ( ) ) ;
Assert . assertEquals ( deviceCredentialsUpdateMsg . getCredentialsId ( ) , deviceCredentials . getCredentialsId ( ) ) ;
}
}
private void sendDeviceRpcResponse ( ) throws Exception {
@Test
public void testSendDeviceRpcResponseToCloud ( ) throws Exception {
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
@ -1582,7 +1550,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
}
}
private void sendDeviceCredentialsUpdate ( ) throws Exception {
@Test
public void testSendDeviceCredentialsUpdateToCloud ( ) throws Exception {
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
@ -1601,24 +1570,30 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
Assert . assertTrue ( edgeImitator . waitForResponses ( ) ) ;
}
}
private void sendAttributesRequest ( ) throws Exception {
@Test
public void testSendAttributesRequestToCloud ( ) throws Exception {
Device device = findDeviceByName ( "Edge Device 1" ) ;
Device device = findDeviceByName ( "Edge Device 1" ) ;
sendAttributesRequest ( device , DataConstants . SERVER_SCOPE , "{\"key1\":\"value1\"}" ,
sendAttributesRequestAndVerify ( device , DataConstants . SERVER_SCOPE , "{\"key1\":\"value1\"}" ,
"key1" , "value1" , 2 ) ;
"key1" , "value1" ) ;
sendAttributesRequest ( device , DataConstants . SHARED_SCOPE , "{\"key2\":\"value2\"}" ,
sendAttributesRequestAndVerify ( device , DataConstants . SHARED_SCOPE , "{\"key2\":\"value2\"}" ,
"key2" , "value2" , 1 ) ;
"key2" , "value2" ) ;
}
}
private void sendAttributesRequest ( Device device , String scope , String attributesDataStr , String expectedKey ,
private void sendAttributesRequestAndVerify ( Device device , String scope , String attributesDataStr , String expectedKey ,
String expectedValue , int expectedSiz e ) throws Exception {
String expectedValue ) throws Exception {
JsonNode attributesData = mapper . readTree ( attributesDataStr ) ;
JsonNode attributesData = mapper . readTree ( attributesDataStr ) ;
doPost ( "/api/plugins/telemetry/DEVICE/" + device . getId ( ) . getId ( ) . toString ( ) + "/attributes/" + scope ,
doPost ( "/api/plugins/telemetry/DEVICE/" + device . getUuidId ( ) + "/attributes/" + scope ,
attributesData ) ;
attributesData ) ;
// Wait before device attributes saved to database before requesting them from edge
// Wait before device attributes saved to database before requesting them from edge
// queue used to save attributes to database
Awaitility . await ( )
Thread . sleep ( 500 ) ;
. atMost ( 10 , TimeUnit . SECONDS )
. until ( ( ) - > {
String urlTemplate = "/api/plugins/telemetry/DEVICE/" + device . getId ( ) + "/keys/attributes/" + scope ;
List < String > actualKeys = doGetAsyncTyped ( urlTemplate , new TypeReference < > ( ) { } ) ;
return actualKeys ! = null & & ! actualKeys . isEmpty ( ) & & actualKeys . contains ( expectedKey ) ;
} ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
UplinkMsg . Builder uplinkMsgBuilder = UplinkMsg . newBuilder ( ) ;
AttributesRequestMsg . Builder attributesRequestMsgBuilder = AttributesRequestMsg . newBuilder ( ) ;
AttributesRequestMsg . Builder attributesRequestMsgBuilder = AttributesRequestMsg . newBuilder ( ) ;
@ -1646,19 +1621,39 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
Assert . assertTrue ( latestEntityDataMsg . hasAttributesUpdatedMsg ( ) ) ;
Assert . assertTrue ( latestEntityDataMsg . hasAttributesUpdatedMsg ( ) ) ;
TransportProtos . PostAttributeMsg attributesUpdatedMsg = latestEntityDataMsg . getAttributesUpdatedMsg ( ) ;
TransportProtos . PostAttributeMsg attributesUpdatedMsg = latestEntityDataMsg . getAttributesUpdatedMsg ( ) ;
Assert . assertEquals ( expectedSize , attributesUpdatedMsg . getKvList ( ) . size ( ) ) ;
boolean found = false ;
for ( TransportProtos . KeyValueProto keyValueProto : attributesUpdatedMsg . getKvList ( ) ) {
for ( TransportProtos . KeyValueProto keyValueProto : attributesUpdatedMsg . getKvList ( ) ) {
if ( keyValueProto . getKey ( ) . equals ( expectedKey ) ) {
if ( keyValueProto . getKey ( ) . equals ( expectedKey ) ) {
Assert . assertEquals ( expectedKey , keyValueProto . getKey ( ) ) ;
Assert . assertEquals ( expectedKey , keyValueProto . getKey ( ) ) ;
Assert . assertEquals ( expectedValue , keyValueProto . getStringV ( ) ) ;
Assert . assertEquals ( expectedValue , keyValueProto . getStringV ( ) ) ;
found = true ;
}
}
}
}
Assert . assertTrue ( "Expected key and value must be found" , found ) ;
}
}
// Utility methods
// Utility methods
private Device saveDeviceOnCloudAndVerifyDeliveryToEdge ( ) throws Exception {
edgeImitator . expectMessageAmount ( 1 ) ;
Device savedDevice = saveDevice ( RandomStringUtils . randomAlphanumeric ( 15 ) , "Default" ) ;
doPost ( "/api/edge/" + edge . getUuidId ( )
+ "/device/" + savedDevice . getUuidId ( ) , Device . class ) ;
Assert . assertTrue ( edgeImitator . waitForMessages ( ) ) ;
AbstractMessage latestMessage = edgeImitator . getLatestMessage ( ) ;
Assert . assertTrue ( latestMessage instanceof DeviceUpdateMsg ) ;
DeviceUpdateMsg deviceUpdateMsg = ( DeviceUpdateMsg ) latestMessage ;
Assert . assertEquals ( UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , deviceUpdateMsg . getMsgType ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdMSB ( ) , savedDevice . getUuidId ( ) . getMostSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getIdLSB ( ) , savedDevice . getUuidId ( ) . getLeastSignificantBits ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getName ( ) , savedDevice . getName ( ) ) ;
Assert . assertEquals ( deviceUpdateMsg . getType ( ) , savedDevice . getType ( ) ) ;
return savedDevice ;
}
private Device findDeviceByName ( String deviceName ) throws Exception {
private Device findDeviceByName ( String deviceName ) throws Exception {
List < Device > edgeDevices = doGetTypedWithPageLink ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( ) + "/devices?" ,
List < Device > edgeDevices = doGetTypedWithPageLink ( "/api/edge/" + edge . getUuidId ( ) + "/devices?" ,
new TypeReference < PageData < Device > > ( ) {
new TypeReference < PageData < Device > > ( ) {
} , new PageLink ( 100 ) ) . getData ( ) ;
} , new PageLink ( 100 ) ) . getData ( ) ;
Optional < Device > foundDevice = edgeDevices . stream ( ) . filter ( d - > d . getName ( ) . equals ( deviceName ) ) . findAny ( ) ;
Optional < Device > foundDevice = edgeDevices . stream ( ) . filter ( d - > d . getName ( ) . equals ( deviceName ) ) . findAny ( ) ;
@ -1669,7 +1664,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
}
}
private Asset findAssetByName ( String assetName ) throws Exception {
private Asset findAssetByName ( String assetName ) throws Exception {
List < Asset > edgeAssets = doGetTypedWithPageLink ( "/api/edge/" + edge . getId ( ) . getId ( ) . toString ( ) + "/assets?" ,
List < Asset > edgeAssets = doGetTypedWithPageLink ( "/api/edge/" + edge . getUuidId ( ) + "/assets?" ,
new TypeReference < PageData < Asset > > ( ) {
new TypeReference < PageData < Asset > > ( ) {
} , new PageLink ( 100 ) ) . getData ( ) ;
} , new PageLink ( 100 ) ) . getData ( ) ;