@ -62,6 +62,7 @@ import java.util.Set;
import java.util.concurrent.TimeUnit ;
import java.util.stream.Collectors ;
import static java.util.concurrent.TimeUnit.HOURS ;
import static java.util.concurrent.TimeUnit.MILLISECONDS ;
import static java.util.concurrent.TimeUnit.SECONDS ;
import static org.assertj.core.api.Assertions.assertThat ;
@ -368,7 +369,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
public void testTheCopyOfAttrsIntoTSForTheView ( ) throws Exception {
Set < String > expectedActualAttributesSet = Set . of ( "caKey1" , "caKey2" , "caKey3" , "caKey4" ) ;
Set < String > actualAttributesSet =
getAttributesByKeys ( "{\"caKey1\":\"value1\", \"caKey2\":true, \"caKey3\":42.0, \"caKey4\":73}" , expectedActualAttributesSet ) ;
putAttributesAndWait ( "{\"caKey1\":\"value1\", \"caKey2\":true, \"caKey3\":42.0, \"caKey4\":73}" , expectedActualAttributesSet ) ;
log . debug ( "got correct actualAttributesSet, saving new entity view..." ) ;
EntityView savedView = getNewSavedEntityView ( "Test entity view" ) ;
@ -389,13 +390,15 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
@Test
public void testTheCopyOfAttrsOutOfTSForTheView ( ) throws Exception {
long now = System . currentTimeMillis ( ) ;
Set < String > expectedActualAttributesSet = Set . of ( "caKey1" , "caKey2" , "caKey3" , "caKey4" ) ;
Set < String > actualAttributesSet =
getAttributesByKeys ( "{\"caKey1\":\"value1\", \"caKey2\":true, \"caKey3\":42.0, \"caKey4\":73}" , expectedActualAttributesSet ) ;
putAttributesAndWait ( "{\"caKey1\":\"value1\", \"caKey2\":true, \"caKey3\":42.0, \"caKey4\":73}" , expectedActualAttributesSet ) ;
List < Map < String , Object > > valueTelemetryOfDevice s = doGetAsyncTyped ( "/api/plugins/telemetry/DEVICE/" + testDevice . getId ( ) . getId ( ) . toString ( ) +
"/values/attributes?keys=" + String . join ( "," , a ctualAttributesSet) , new TypeReference < > ( ) {
List < Map < String , Object > > values = doGetAsyncTyped ( "/api/plugins/telemetry/DEVICE/" + testDevice . getId ( ) +
"/values/attributes?keys=" + String . join ( "," , expectedA ctualAttributesSet) , new TypeReference < > ( ) {
} ) ;
assertEquals ( expectedActualAttributesSet . size ( ) , values . size ( ) ) ;
EntityView view = new EntityView ( ) ;
view . setEntityId ( testDevice . getId ( ) ) ;
@ -403,12 +406,12 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
view . setName ( "Test entity view" ) ;
view . setType ( "default" ) ;
view . setKeys ( telemetry ) ;
view . setStartTimeMs ( ( long ) getValue ( valueTelemetryOfDevices , "lastActivityTime" ) * 10 ) ;
view . setEndTimeMs ( ( long ) getValue ( valueTelemetryOfDevices , "lastActivityTime" ) / 10 ) ;
view . setStartTimeMs ( now - HOURS . toMillis ( 1 ) ) ;
view . setEndTimeMs ( now - 1 ) ;
EntityView savedView = doPost ( "/api/entityView" , view , EntityView . class ) ;
List < Map < String , Object > > values = doGetAsyncTyped ( "/api/plugins/telemetry/ENTITY_VIEW/" + savedView . getId ( ) . getId ( ) . toString ( ) +
"/values/attributes?keys=" + String . join ( "," , a ctualAttributesSet) , new TypeReference < > ( ) {
values = doGetAsyncTyped ( "/api/plugins/telemetry/ENTITY_VIEW/" + savedView . getId ( ) . getId ( ) . toString ( ) +
"/values/attributes?keys=" + String . join ( "," , expectedA ctualAttributesSet) , new TypeReference < > ( ) {
} ) ;
assertEquals ( 0 , values . size ( ) ) ;
}
@ -431,19 +434,19 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
uploadTelemetry ( "{\"tsKey1\":\"value1\", \"tsKey2\":true, \"tsKey3\":40.0}" , accessToken ) ;
getWsClient ( ) . waitForUpdate ( ) ;
long startTimeMs = System . currentTimeMillis ( ) ;
long startTimeMs = getCurTsButNotPrevTs ( now ) ;
getWsClient ( ) . registerWaitForUpdate ( ) ;
uploadTelemetry ( "{\"tsKey1\":\"value2\", \"tsKey2\":false, \"tsKey3\":80.0}" , accessToken ) ;
getWsClient ( ) . waitForUpdate ( ) ;
Thread . sleep ( 3 ) ;
long middleOfTestMs = getCurTsButNotPrevTs ( startTimeMs ) ;
getWsClient ( ) . registerWaitForUpdate ( ) ;
uploadTelemetry ( "{\"tsKey1\":\"value3\", \"tsKey2\":false, \"tsKey3\":120.0}" , accessToken ) ;
getWsClient ( ) . waitForUpdate ( ) ;
long endTimeMs = System . currentTimeMillis ( ) ;
long endTimeMs = getCurTsButNotPrevTs ( middleOfTestMs ) ;
getWsClient ( ) . registerWaitForUpdate ( ) ;
uploadTelemetry ( "{\"tsKey1\":\"value4\", \"tsKey2\":true, \"tsKey3\":160.0}" , accessToken ) ;
getWsClient ( ) . waitForUpdate ( ) ;
@ -455,15 +458,25 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
EntityView savedView = doPost ( "/api/entityView" , view , EntityView . class ) ;
String entityViewId = savedView . getId ( ) . getId ( ) . toString ( ) ;
Map < String , List < Map < String , String > > > expectedValues = getTelemetryValues ( "DEVICE" , deviceId , keys , 0L , ( startTimeMs + endTimeMs ) / 2 ) ;
Assert . assertEquals ( 2 , expectedValues . get ( "tsKey1" ) . size ( ) ) ;
Assert . assertEquals ( 2 , expectedValues . get ( "tsKey2" ) . size ( ) ) ;
Assert . assertEquals ( 2 , expectedValues . get ( "tsKey3" ) . size ( ) ) ;
Map < String , List < Map < String , String > > > actualDeviceValues = getTelemetryValues ( "DEVICE" , deviceId , keys , 0L , middleOfTestMs ) ;
Assert . assertEquals ( 2 , actualDeviceValues . get ( "tsKey1" ) . size ( ) ) ;
Assert . assertEquals ( 2 , actualDeviceValues . get ( "tsKey2" ) . size ( ) ) ;
Assert . assertEquals ( 2 , actualDeviceValues . get ( "tsKey3" ) . size ( ) ) ;
Map < String , List < Map < String , String > > > actualEntityViewValues = getTelemetryValues ( "ENTITY_VIEW" , entityViewId , keys , 0L , middleOfTestMs ) ;
Assert . assertEquals ( 1 , actualEntityViewValues . get ( "tsKey1" ) . size ( ) ) ;
Assert . assertEquals ( 1 , actualEntityViewValues . get ( "tsKey2" ) . size ( ) ) ;
Assert . assertEquals ( 1 , actualEntityViewValues . get ( "tsKey3" ) . size ( ) ) ;
}
Map < String , List < Map < String , String > > > actualValues = getTelemetryValues ( "ENTITY_VIEW" , entityViewId , keys , 0L , ( startTimeMs + endTimeMs ) / 2 ) ;
Assert . assertEquals ( 1 , actualValues . get ( "tsKey1" ) . size ( ) ) ;
Assert . assertEquals ( 1 , actualValues . get ( "tsKey2" ) . size ( ) ) ;
Assert . assertEquals ( 1 , actualValues . get ( "tsKey3" ) . size ( ) ) ;
private static long getCurTsButNotPrevTs ( long prevTs ) throws InterruptedException {
long result = System . currentTimeMillis ( ) ;
if ( prevTs = = result ) {
Thread . sleep ( 1 ) ;
return getCurTsButNotPrevTs ( prevTs ) ;
} else {
return result ;
}
}
private void uploadTelemetry ( String strKvs , String accessToken ) throws Exception {
@ -504,7 +517,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
} ) ;
}
private Set < String > getAttributesByKeys ( String stringKV , Set < String > expectedKeySet ) throws Exception {
private Set < String > putAttributesAndWait ( String stringKV , Set < String > expectedKeySet ) throws Exception {
DeviceTypeFilter dtf = new DeviceTypeFilter ( testDevice . getType ( ) , testDevice . getName ( ) ) ;
List < EntityKey > keysToSubscribe = expectedKeySet . stream ( )
. map ( key - > new EntityKey ( EntityKeyType . CLIENT_ATTRIBUTE , key ) )