@ -26,6 +26,8 @@ import org.junit.Assert;
import org.junit.Before ;
import org.junit.Test ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.test.context.TestPropertySource ;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils ;
import org.thingsboard.common.util.JacksonUtil ;
import org.thingsboard.server.common.data.Device ;
import org.thingsboard.server.common.data.alarm.Alarm ;
@ -59,10 +61,13 @@ import org.thingsboard.server.service.subscription.TbAttributeSubscriptionScope;
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService ;
import org.thingsboard.server.service.ws.telemetry.cmd.v2.AlarmCountCmd ;
import org.thingsboard.server.service.ws.telemetry.cmd.v2.AlarmCountUpdate ;
import org.thingsboard.server.service.ws.telemetry.cmd.v2.AlarmStatusCmd ;
import org.thingsboard.server.service.ws.telemetry.cmd.v2.AlarmStatusUpdate ;
import org.thingsboard.server.service.ws.telemetry.cmd.v2.EntityCountCmd ;
import org.thingsboard.server.service.ws.telemetry.cmd.v2.EntityCountUpdate ;
import org.thingsboard.server.service.ws.telemetry.cmd.v2.EntityDataUpdate ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Collections ;
import java.util.List ;
@ -75,6 +80,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@Slf4j
@DaoSqlTest
@TestPropertySource ( properties = {
"server.ws.alarms_per_alarm_status_subscription_cache_size=5"
} )
public class WebsocketApiTest extends AbstractControllerTest {
@Autowired
private TelemetrySubscriptionService tsService ;
@ -314,6 +322,124 @@ public class WebsocketApiTest extends AbstractControllerTest {
Assert . assertEquals ( 1 , update . getCount ( ) ) ;
}
@Test
public void testAlarmStatusWsCmd ( ) throws Exception {
loginTenantAdmin ( ) ;
AlarmStatusCmd cmd = new AlarmStatusCmd ( 1 , device . getId ( ) , List . of ( "TEST ALARM" , "TEST ALARM 2" ) , List . of ( AlarmSeverity . WARNING ) ) ;
getWsClient ( ) . send ( cmd ) ;
AlarmStatusUpdate update = JacksonUtil . fromString ( getWsClient ( ) . waitForReply ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 1 , update . getCmdId ( ) ) ;
Assert . assertFalse ( update . isActive ( ) ) ;
//create alarm
getWsClient ( ) . registerWaitForUpdate ( ) ;
Alarm alarm = new Alarm ( ) ;
alarm . setOriginator ( device . getId ( ) ) ;
alarm . setType ( "TEST ALARM" ) ;
alarm . setSeverity ( AlarmSeverity . WARNING ) ;
alarm = doPost ( "/api/alarm" , alarm , Alarm . class ) ;
AlarmStatusUpdate alarmStatusUpdate = JacksonUtil . fromString ( getWsClient ( ) . waitForUpdate ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 1 , update . getCmdId ( ) ) ;
Assert . assertTrue ( alarmStatusUpdate . isActive ( ) ) ;
//clear alarm
getWsClient ( ) . registerWaitForUpdate ( ) ;
String alarmId = alarm . getId ( ) . getId ( ) . toString ( ) ;
Alarm clearedAlarm = doPost ( "/api/alarm/" + alarmId + "/clear" , Alarm . class ) ;
Assert . assertNotNull ( clearedAlarm ) ;
Assert . assertTrue ( clearedAlarm . isCleared ( ) ) ;
AlarmStatusUpdate alarmStatusUpdate2 = JacksonUtil . fromString ( getWsClient ( ) . waitForUpdate ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 1 , alarmStatusUpdate2 . getCmdId ( ) ) ;
Assert . assertFalse ( alarmStatusUpdate2 . isActive ( ) ) ;
// add second type alarm
getWsClient ( ) . registerWaitForUpdate ( ) ;
Alarm alarm2 = new Alarm ( ) ;
alarm2 . setOriginator ( device . getId ( ) ) ;
alarm2 . setType ( "TEST ALARM 2" ) ;
alarm2 . setSeverity ( AlarmSeverity . WARNING ) ;
doPost ( "/api/alarm" , alarm2 , Alarm . class ) ;
AlarmStatusUpdate alarmStatusUpdate3 = JacksonUtil . fromString ( getWsClient ( ) . waitForReply ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 1 , alarmStatusUpdate3 . getCmdId ( ) ) ;
Assert . assertTrue ( alarmStatusUpdate3 . isActive ( ) ) ;
//change severity
alarm2 . setSeverity ( AlarmSeverity . MAJOR ) ;
Alarm updatedAlarm = doPost ( "/api/alarm" , alarm2 , Alarm . class ) ;
Assert . assertNotNull ( updatedAlarm ) ;
Assert . assertEquals ( AlarmSeverity . MAJOR , updatedAlarm . getSeverity ( ) ) ;
AlarmStatusUpdate alarmStatusUpdate4 = JacksonUtil . fromString ( getWsClient ( ) . waitForReply ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 1 , alarmStatusUpdate4 . getCmdId ( ) ) ;
Assert . assertFalse ( alarmStatusUpdate4 . isActive ( ) ) ;
//subscribe for critical alarms
AlarmStatusCmd cmd3 = new AlarmStatusCmd ( 2 , device . getId ( ) , List . of ( "TEST ALARM" ) , List . of ( AlarmSeverity . CRITICAL ) ) ;
getWsClient ( ) . send ( cmd3 ) ;
AlarmStatusUpdate alarmStatusUpdate5 = JacksonUtil . fromString ( getWsClient ( ) . waitForReply ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 2 , alarmStatusUpdate5 . getCmdId ( ) ) ;
Assert . assertFalse ( alarmStatusUpdate5 . isActive ( ) ) ;
}
@Test
public void testAlarmStatusWsCmdWithMaxAlarmsCacheSize ( ) throws Exception {
loginTenantAdmin ( ) ;
AlarmStatusCmd cmd = new AlarmStatusCmd ( 1 , device . getId ( ) , null , List . of ( AlarmSeverity . CRITICAL ) ) ;
getWsClient ( ) . send ( cmd ) ;
AlarmStatusUpdate update = JacksonUtil . fromString ( getWsClient ( ) . waitForReply ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 1 , update . getCmdId ( ) ) ;
Assert . assertFalse ( update . isActive ( ) ) ;
getWsClient ( ) . registerWaitForUpdate ( ) ;
//create 5+1 alarms
List < Alarm > alarms = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 6 ; i + + ) {
Alarm alarm = new Alarm ( ) ;
alarm . setOriginator ( device . getId ( ) ) ;
alarm . setType ( RandomStringUtils . randomAlphabetic ( 10 ) ) ;
alarm . setSeverity ( AlarmSeverity . CRITICAL ) ;
alarm = doPost ( "/api/alarm" , alarm , Alarm . class ) ;
alarms . add ( alarm ) ;
}
AlarmStatusUpdate updateAfterAlarmsAdded = JacksonUtil . fromString ( getWsClient ( ) . waitForReply ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 1 , updateAfterAlarmsAdded . getCmdId ( ) ) ;
Assert . assertTrue ( updateAfterAlarmsAdded . isActive ( ) ) ;
getWsClient ( ) . registerWaitForUpdate ( ) ;
//clear first 5 alarms
for ( int i = 0 ; i < 5 ; i + + ) {
String alarmId = alarms . get ( i ) . getId ( ) . getId ( ) . toString ( ) ;
doPost ( "/api/alarm/" + alarmId + "/clear" , Alarm . class ) ;
}
AlarmStatusUpdate alarmStatusUpdate = JacksonUtil . fromString ( getWsClient ( ) . waitForUpdate ( ) , AlarmStatusUpdate . class ) ;
Assert . assertNull ( alarmStatusUpdate ) ;
//clear 6-th alarm should send update
String alarmId6 = alarms . get ( 5 ) . getId ( ) . getId ( ) . toString ( ) ;
doPost ( "/api/alarm/" + alarmId6 + "/clear" , Alarm . class ) ;
AlarmStatusUpdate alarmStatusUpdate2 = JacksonUtil . fromString ( getWsClient ( ) . waitForUpdate ( ) , AlarmStatusUpdate . class ) ;
Assert . assertEquals ( 1 , alarmStatusUpdate2 . getCmdId ( ) ) ;
Assert . assertFalse ( alarmStatusUpdate2 . isActive ( ) ) ;
}
@Test
public void testEntityDataLatestWidgetFlow ( ) throws Exception {
List < EntityKey > keys = List . of ( new EntityKey ( EntityKeyType . TIME_SERIES , "temperature" ) ) ;