@ -36,7 +36,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean ;
import org.springframework.context.annotation.Primary ;
import org.springframework.test.context.ContextConfiguration ;
import org.springframework.test.context.DynamicPropertyRegistry ;
import org.springframework.test.context.DynamicPropertySource ;
import org.springframework.test.context.TestPropertySource ;
import org.springframework.test.util.TestSocketUtils ;
import org.thingsboard.common.util.JacksonUtil ;
import org.thingsboard.common.util.ThingsBoardExecutors ;
import org.thingsboard.server.common.data.AdminSettings ;
@ -99,6 +102,7 @@ import org.thingsboard.server.service.edge.instructions.EdgeUpgradeInstructionsS
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.Deque ;
import java.util.HashMap ;
import java.util.List ;
import java.util.Map ;
@ -121,7 +125,12 @@ import static org.thingsboard.server.edge.AbstractEdgeTest.CONNECT_MESSAGE_COUNT
public class EdgeControllerTest extends AbstractControllerTest {
public static final String EDGE_HOST = "localhost" ;
public static final int EDGE_PORT = 7070 ;
public static final int EDGE_PORT = TestSocketUtils . findAvailableTcpPort ( ) ;
@DynamicPropertySource
static void props ( DynamicPropertyRegistry registry ) {
log . debug ( "edges.rpc.port = {}" , EDGE_PORT ) ;
registry . add ( "edges.rpc.port" , ( ) - > EDGE_PORT ) ;
}
private IdComparator < Edge > idComparator = new IdComparator < > ( ) ;
@ -916,11 +925,11 @@ public class EdgeControllerTest extends AbstractControllerTest {
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 , "default" ) ) ;
Assert . assertTrue ( popAssetMsg ( edgeImitator . getDownlinkMsgs ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Test Sync Edge Asset 1" ) ) ;
Assert . assertTrue ( popDeviceProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popDeviceMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Test Sync Edge Device 1" ) ) ;
Assert . assertTrue ( popDeviceCredentialsMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , savedDevice . getId ( ) ) ) ;
Assert . assertTrue ( popAssetProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popAssetMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Test Sync Edge Asset 1" ) ) ;
printQueueMsgsIfNotEmpty ( edgeImitator ) ;
// 17 connect messages
@ -1000,32 +1009,32 @@ public class EdgeControllerTest extends AbstractControllerTest {
}
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" ) ) ;
Assert . assertTrue ( popAdminSettingsMsg ( edgeImitator . getDownlinkMsgs ( ) , "jwt" ) ) ;
Assert . assertTrue ( popDeviceProfileMsg ( edgeImitator . getDownlinkMsgs ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popDeviceProfileMsg ( edgeImitator . getDownlinkMsgs ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popAssetProfileMsg ( edgeImitator . getDownlinkMsgs ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popDeviceProfileMsg ( edgeImitator . getDownlinkMsgs ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popAssetProfileMsg ( edgeImitator . getDownlinkMsgs ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popUserCredentialsMsg ( edgeImitator . getDownlinkMsgs ( ) , currentUserId ) ) ;
Assert . assertTrue ( popUserMsg ( edgeImitator . getDownlinkMsgs ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , TENANT_ADMIN_EMAIL , Authority . TENANT_ADMIN ) ) ;
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 , "default" ) ) ;
Assert . assertTrue ( popAssetMsg ( edgeImitator . getDownlinkMsgs ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Test Sync Edge Asset 1" ) ) ;
Assert . assertTrue ( popTenantMsg ( edgeImitator . getDownlinkMsgs ( ) , tenantId ) ) ;
Assert . assertTrue ( popTenantProfileMsg ( edgeImitator . getDownlinkMsgs ( ) , tenantProfileId ) ) ;
Assert . assertTrue ( popSyncCompletedMsg ( edgeImitator . getDownlinkMsgs ( ) ) ) ;
Assert . assertTrue ( popQueueMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Main" ) ) ;
Assert . assertTrue ( popRuleChainMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Edge Root Rule Chain" ) ) ;
Assert . assertTrue ( popRuleChainMetadataMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , getEdgeRootRuleChainId ( edgeImitator ) ) ) ;
Assert . assertTrue ( popAdminSettingsMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , "general" ) ) ;
Assert . assertTrue ( popAdminSettingsMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , "mail" ) ) ;
Assert . assertTrue ( popAdminSettingsMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , "connectivity" ) ) ;
Assert . assertTrue ( popAdminSettingsMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , "jwt" ) ) ;
Assert . assertTrue ( popDeviceProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popDeviceProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popAssetProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popDeviceProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popAssetProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popUserCredentialsMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , currentUserId ) ) ;
Assert . assertTrue ( popUserMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , TENANT_ADMIN_EMAIL , Authority . TENANT_ADMIN ) ) ;
Assert . assertTrue ( popCustomerMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Public" ) ) ;
Assert . assertTrue ( popDeviceProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popDeviceMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Test Sync Edge Device 1" ) ) ;
Assert . assertTrue ( popDeviceCredentialsMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , savedDevice . getId ( ) ) ) ;
Assert . assertTrue ( popAssetProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "default" ) ) ;
Assert . assertTrue ( popAssetMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , UpdateMsgType . ENTITY_CREATED_RPC_MESSAGE , "Test Sync Edge Asset 1" ) ) ;
Assert . assertTrue ( popTenantMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , tenantId ) ) ;
Assert . assertTrue ( popTenantProfileMsg ( edgeImitator . getDownlinkMsgsDeque ( ) , tenantProfileId ) ) ;
Assert . assertTrue ( popSyncCompletedMsg ( edgeImitator . getDownlinkMsgsDeque ( ) ) ) ;
}
private boolean popQueueMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
private boolean popQueueMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof QueueUpdateMsg queueUpdateMsg ) {
Queue queue = JacksonUtil . fromString ( queueUpdateMsg . getEntity ( ) , Queue . class , true ) ;
@ -1039,7 +1048,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popRuleChainMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
private boolean popRuleChainMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof RuleChainUpdateMsg ruleChainUpdateMsg ) {
RuleChain ruleChain = JacksonUtil . fromString ( ruleChainUpdateMsg . getEntity ( ) , RuleChain . class , true ) ;
@ -1055,7 +1064,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popRuleChainMetadataMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , RuleChainId ruleChainId ) {
private boolean popRuleChainMetadataMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , RuleChainId ruleChainId ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg ) {
RuleChainMetaData ruleChainMetaData = JacksonUtil . fromString ( ruleChainMetadataUpdateMsg . getEntity ( ) , RuleChainMetaData . class , true ) ;
@ -1070,7 +1079,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popAdminSettingsMsg ( List < AbstractMessage > messages , String key ) {
private boolean popAdminSettingsMsg ( Deque < AbstractMessage > messages , String key ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof AdminSettingsUpdateMsg adminSettingsUpdateMsg ) {
AdminSettings adminSettings = JacksonUtil . fromString ( adminSettingsUpdateMsg . getEntity ( ) , AdminSettings . class , true ) ;
@ -1084,7 +1093,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popDeviceProfileMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
private boolean popDeviceProfileMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof DeviceProfileUpdateMsg deviceProfileUpdateMsg ) {
DeviceProfile deviceProfile = JacksonUtil . fromString ( deviceProfileUpdateMsg . getEntity ( ) , DeviceProfile . class , true ) ;
@ -1099,7 +1108,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popDeviceMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
private boolean popDeviceMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof DeviceUpdateMsg deviceUpdateMsg ) {
Device device = JacksonUtil . fromString ( deviceUpdateMsg . getEntity ( ) , Device . class , true ) ;
@ -1114,7 +1123,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popDeviceCredentialsMsg ( List < AbstractMessage > messages , DeviceId deviceId ) {
private boolean popDeviceCredentialsMsg ( Deque < AbstractMessage > messages , DeviceId deviceId ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg ) {
DeviceCredentials deviceCredentials = JacksonUtil . fromString ( deviceCredentialsUpdateMsg . getEntity ( ) , DeviceCredentials . class , true ) ;
@ -1128,7 +1137,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popAssetProfileMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
private boolean popAssetProfileMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof AssetProfileUpdateMsg assetProfileUpdateMsg ) {
AssetProfile assetProfile = JacksonUtil . fromString ( assetProfileUpdateMsg . getEntity ( ) , AssetProfile . class , true ) ;
@ -1143,7 +1152,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popAssetMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
private boolean popAssetMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , String name ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof AssetUpdateMsg assetUpdateMsg ) {
Asset asset = JacksonUtil . fromString ( assetUpdateMsg . getEntity ( ) , Asset . class , true ) ;
@ -1158,7 +1167,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popUserCredentialsMsg ( List < AbstractMessage > messages , UserId userId ) {
private boolean popUserCredentialsMsg ( Deque < AbstractMessage > messages , UserId userId ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof UserCredentialsUpdateMsg userCredentialsUpdateMsg ) {
UserCredentials userCredentials = JacksonUtil . fromString ( userCredentialsUpdateMsg . getEntity ( ) , UserCredentials . class , true ) ;
@ -1172,7 +1181,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popUserMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , String email , Authority authority ) {
private boolean popUserMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , String email , Authority authority ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof UserUpdateMsg userUpdateMsg ) {
User user = JacksonUtil . fromString ( userUpdateMsg . getEntity ( ) , User . class , true ) ;
@ -1188,7 +1197,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popCustomerMsg ( List < AbstractMessage > messages , UpdateMsgType msgType , String title ) {
private boolean popCustomerMsg ( Deque < AbstractMessage > messages , UpdateMsgType msgType , String title ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof CustomerUpdateMsg customerUpdateMsg ) {
Customer customer = JacksonUtil . fromString ( customerUpdateMsg . getEntity ( ) , Customer . class , true ) ;
@ -1203,7 +1212,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popTenantMsg ( List < AbstractMessage > messages , TenantId tenantId1 ) {
private boolean popTenantMsg ( Deque < AbstractMessage > messages , TenantId tenantId1 ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof TenantUpdateMsg tenantUpdateMsg ) {
Tenant tenant = JacksonUtil . fromString ( tenantUpdateMsg . getEntity ( ) , Tenant . class , true ) ;
@ -1218,7 +1227,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popTenantProfileMsg ( List < AbstractMessage > messages , TenantProfileId tenantProfileId ) {
private boolean popTenantProfileMsg ( Deque < AbstractMessage > messages , TenantProfileId tenantProfileId ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof TenantProfileUpdateMsg tenantProfileUpdateMsg ) {
TenantProfile tenantProfile = JacksonUtil . fromString ( tenantProfileUpdateMsg . getEntity ( ) , TenantProfile . class , true ) ;
@ -1233,7 +1242,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
return false ;
}
private boolean popSyncCompletedMsg ( List < AbstractMessage > messages ) {
private boolean popSyncCompletedMsg ( Deque < AbstractMessage > messages ) {
for ( AbstractMessage message : messages ) {
if ( message instanceof SyncCompletedMsg ) {
messages . remove ( message ) ;