web socket test and client refactored to simplify usage
This commit is contained in:
parent
7cdce3d9f8
commit
96eff9cf1a
@ -18,12 +18,12 @@ package org.thingsboard.server.controller;
|
||||
import com.google.common.util.concurrent.FutureCallback;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.kv.Aggregation;
|
||||
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
|
||||
import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry;
|
||||
import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
|
||||
@ -44,63 +44,51 @@ import org.thingsboard.server.common.data.query.NumericFilterPredicate;
|
||||
import org.thingsboard.server.common.data.query.TsValue;
|
||||
import org.thingsboard.server.service.subscription.TbAttributeSubscriptionScope;
|
||||
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
|
||||
import org.thingsboard.server.service.telemetry.cmd.TelemetryPluginCmdsWrapper;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityCountCmd;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityCountUpdate;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataCmd;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataUpdate;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityHistoryCmd;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.LatestValueCmd;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.TimeSeriesCmd;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
@Slf4j
|
||||
public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
@Autowired
|
||||
private TelemetrySubscriptionService tsService;
|
||||
|
||||
Device device;
|
||||
DeviceTypeFilter dtf;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
loginTenantAdmin();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEntityDataHistoryWsCmd() throws Exception {
|
||||
Device device = new Device();
|
||||
device = new Device();
|
||||
device.setName("Device");
|
||||
device.setType("default");
|
||||
device.setLabel("testLabel" + (int) (Math.random() * 1000));
|
||||
device = doPost("/api/device", device, Device.class);
|
||||
dtf = new DeviceTypeFilter(device.getType(), device.getName());
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
doDelete("/api/device/" + device.getId().getId())
|
||||
.andExpect(status().isOk());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEntityDataHistoryWsCmd() throws Exception {
|
||||
List<String> keys = List.of("temperature");
|
||||
long now = System.currentTimeMillis();
|
||||
|
||||
DeviceTypeFilter dtf = new DeviceTypeFilter();
|
||||
dtf.setDeviceNameFilter("D");
|
||||
dtf.setDeviceType("default");
|
||||
EntityDataQuery edq = new EntityDataQuery(dtf,
|
||||
new EntityDataPageLink(1, 0, null, null),
|
||||
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
||||
EntityDataUpdate update = getWsClient().sendHistoryCmd(keys, now, TimeUnit.HOURS.toMillis(1), dtf);
|
||||
|
||||
EntityHistoryCmd historyCmd = new EntityHistoryCmd();
|
||||
historyCmd.setKeys(Arrays.asList("temperature"));
|
||||
historyCmd.setAgg(Aggregation.NONE);
|
||||
historyCmd.setLimit(1000);
|
||||
historyCmd.setStartTs(now - TimeUnit.HOURS.toMillis(1));
|
||||
historyCmd.setEndTs(now);
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, historyCmd, null, null);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
String msg = getWsClient().waitForReply();
|
||||
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
PageData<EntityData> pageData = update.getData();
|
||||
Assert.assertNotNull(pageData);
|
||||
@ -116,9 +104,8 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
sendTelemetry(device, tsData);
|
||||
Thread.sleep(100);
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
msg = getWsClient().waitForReply();
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
update = getWsClient().sendHistoryCmd(keys, now, TimeUnit.HOURS.toMillis(1), dtf);
|
||||
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
List<EntityData> dataList = update.getUpdate();
|
||||
Assert.assertNotNull(dataList);
|
||||
@ -133,41 +120,16 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
@Test
|
||||
public void testEntityDataTimeSeriesWsCmd() throws Exception {
|
||||
Device device = new Device();
|
||||
device.setName("Device");
|
||||
device.setType("default");
|
||||
device.setLabel("testLabel" + (int) (Math.random() * 1000));
|
||||
device = doPost("/api/device", device, Device.class);
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
|
||||
DeviceTypeFilter dtf = new DeviceTypeFilter();
|
||||
dtf.setDeviceNameFilter("D");
|
||||
dtf.setDeviceType("default");
|
||||
EntityDataQuery edq = new EntityDataQuery(dtf, new EntityDataPageLink(1, 0, null, null),
|
||||
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
||||
EntityDataUpdate update = getWsClient().sendEntityDataQuery(dtf);
|
||||
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, null, null);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
String msg = getWsClient().waitForReply();
|
||||
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
PageData<EntityData> pageData = update.getData();
|
||||
Assert.assertNotNull(pageData);
|
||||
Assert.assertEquals(1, pageData.getData().size());
|
||||
Assert.assertEquals(device.getId(), pageData.getData().get(0).getEntityId());
|
||||
|
||||
TimeSeriesCmd tsCmd = new TimeSeriesCmd();
|
||||
tsCmd.setKeys(Arrays.asList("temperature"));
|
||||
tsCmd.setAgg(Aggregation.NONE);
|
||||
tsCmd.setLimit(1000);
|
||||
tsCmd.setStartTs(now - TimeUnit.HOURS.toMillis(1));
|
||||
tsCmd.setTimeWindow(TimeUnit.HOURS.toMillis(1));
|
||||
|
||||
TsKvEntry dataPoint1 = new BasicTsKvEntry(now - TimeUnit.MINUTES.toMillis(1), new LongDataEntry("temperature", 42L));
|
||||
TsKvEntry dataPoint2 = new BasicTsKvEntry(now - TimeUnit.MINUTES.toMillis(2), new LongDataEntry("temperature", 43L));
|
||||
TsKvEntry dataPoint3 = new BasicTsKvEntry(now - TimeUnit.MINUTES.toMillis(3), new LongDataEntry("temperature", 44L));
|
||||
@ -176,12 +138,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
sendTelemetry(device, tsData);
|
||||
Thread.sleep(100);
|
||||
|
||||
cmd = new EntityDataCmd(1, null, null, null, tsCmd);
|
||||
wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
msg = getWsClient().waitForReply();
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
update = getWsClient().subscribeTsUpdate(List.of("temperature"), now, TimeUnit.HOURS.toMillis(1));
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
List<EntityData> listData = update.getUpdate();
|
||||
Assert.assertNotNull(listData);
|
||||
@ -198,7 +155,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
getWsClient().registerWaitForUpdate();
|
||||
Thread.sleep(100);
|
||||
sendTelemetry(device, Arrays.asList(dataPoint4));
|
||||
msg = getWsClient().waitForUpdate();
|
||||
String msg = getWsClient().waitForUpdate();
|
||||
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
@ -214,44 +171,26 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
@Test
|
||||
public void testEntityCountWsCmd() throws Exception {
|
||||
Device device = new Device();
|
||||
device.setName("Device");
|
||||
device.setType("default");
|
||||
device.setLabel("testLabel" + (int) (Math.random() * 1000));
|
||||
device = doPost("/api/device", device, Device.class);
|
||||
|
||||
AttributeKvEntry dataPoint1 = new BaseAttributeKvEntry(System.currentTimeMillis(), new LongDataEntry("temperature", 42L));
|
||||
sendAttributes(device, TbAttributeSubscriptionScope.SERVER_SCOPE, Collections.singletonList(dataPoint1));
|
||||
|
||||
DeviceTypeFilter dtf1 = new DeviceTypeFilter();
|
||||
dtf1.setDeviceNameFilter("D");
|
||||
dtf1.setDeviceType("default");
|
||||
EntityCountQuery edq1 = new EntityCountQuery(dtf1, Collections.emptyList());
|
||||
|
||||
EntityCountQuery edq1 = new EntityCountQuery(dtf, Collections.emptyList());
|
||||
EntityCountCmd cmd1 = new EntityCountCmd(1, edq1);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper1 = new TelemetryPluginCmdsWrapper();
|
||||
wrapper1.setEntityCountCmds(Collections.singletonList(cmd1));
|
||||
getWsClient().send(cmd1);
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper1));
|
||||
String msg1 = getWsClient().waitForReply();
|
||||
EntityCountUpdate update1 = mapper.readValue(msg1, EntityCountUpdate.class);
|
||||
EntityCountUpdate update1 = getWsClient().parseCountReply(getWsClient().waitForReply());
|
||||
Assert.assertEquals(1, update1.getCmdId());
|
||||
Assert.assertEquals(1, update1.getCount());
|
||||
|
||||
DeviceTypeFilter dtf2 = new DeviceTypeFilter();
|
||||
dtf2.setDeviceNameFilter("D");
|
||||
dtf2.setDeviceType("non-existing-device-type");
|
||||
DeviceTypeFilter dtf2 = new DeviceTypeFilter("non-existing-device-type", "D");
|
||||
EntityCountQuery edq2 = new EntityCountQuery(dtf2, Collections.emptyList());
|
||||
|
||||
EntityCountCmd cmd2 = new EntityCountCmd(2, edq2);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper2 = new TelemetryPluginCmdsWrapper();
|
||||
wrapper2.setEntityCountCmds(Collections.singletonList(cmd2));
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper2));
|
||||
getWsClient().send(cmd2);
|
||||
|
||||
String msg2 = getWsClient().waitForReply();
|
||||
EntityCountUpdate update2 = mapper.readValue(msg2, EntityCountUpdate.class);
|
||||
EntityCountUpdate update2 = getWsClient().parseCountReply(getWsClient().waitForReply());
|
||||
Assert.assertEquals(2, update2.getCmdId());
|
||||
Assert.assertEquals(0, update2.getCount());
|
||||
|
||||
@ -263,19 +202,12 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
highTemperatureFilter.setPredicate(predicate);
|
||||
highTemperatureFilter.setValueType(EntityKeyValueType.NUMERIC);
|
||||
|
||||
DeviceTypeFilter dtf3 = new DeviceTypeFilter();
|
||||
dtf3.setDeviceNameFilter("D");
|
||||
dtf3.setDeviceType("default");
|
||||
DeviceTypeFilter dtf3 = new DeviceTypeFilter("default", "D");
|
||||
EntityCountQuery edq3 = new EntityCountQuery(dtf3, Collections.singletonList(highTemperatureFilter));
|
||||
|
||||
EntityCountCmd cmd3 = new EntityCountCmd(3, edq3);
|
||||
getWsClient().send(cmd3);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper3 = new TelemetryPluginCmdsWrapper();
|
||||
wrapper3.setEntityCountCmds(Collections.singletonList(cmd3));
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper3));
|
||||
|
||||
String msg3 = getWsClient().waitForReply();
|
||||
EntityCountUpdate update3 = mapper.readValue(msg3, EntityCountUpdate.class);
|
||||
EntityCountUpdate update3 = getWsClient().parseCountReply(getWsClient().waitForReply());
|
||||
Assert.assertEquals(3, update3.getCmdId());
|
||||
Assert.assertEquals(1, update3.getCount());
|
||||
|
||||
@ -287,47 +219,26 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
highTemperatureFilter2.setPredicate(predicate2);
|
||||
highTemperatureFilter2.setValueType(EntityKeyValueType.NUMERIC);
|
||||
|
||||
DeviceTypeFilter dtf4 = new DeviceTypeFilter();
|
||||
dtf4.setDeviceNameFilter("D");
|
||||
dtf4.setDeviceType("default");
|
||||
DeviceTypeFilter dtf4 = new DeviceTypeFilter("default", "D");
|
||||
EntityCountQuery edq4 = new EntityCountQuery(dtf4, Collections.singletonList(highTemperatureFilter2));
|
||||
|
||||
EntityCountCmd cmd4 = new EntityCountCmd(4, edq4);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper4 = new TelemetryPluginCmdsWrapper();
|
||||
wrapper4.setEntityCountCmds(Collections.singletonList(cmd4));
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper4));
|
||||
getWsClient().send(cmd4);
|
||||
|
||||
String msg4 = getWsClient().waitForReply();
|
||||
EntityCountUpdate update4 = mapper.readValue(msg4, EntityCountUpdate.class);
|
||||
EntityCountUpdate update4 = getWsClient().parseCountReply(getWsClient().waitForReply());
|
||||
Assert.assertEquals(4, update4.getCmdId());
|
||||
Assert.assertEquals(0, update4.getCount());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEntityDataLatestWidgetFlow() throws Exception {
|
||||
Device device = new Device();
|
||||
device.setName("Device");
|
||||
device.setType("default");
|
||||
device.setLabel("testLabel" + (int) (Math.random() * 1000));
|
||||
device = doPost("/api/device", device, Device.class);
|
||||
List<EntityKey> keys = List.of(new EntityKey(EntityKeyType.TIME_SERIES, "temperature"));
|
||||
long now = System.currentTimeMillis() - 100;
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
EntityDataQuery edq = new EntityDataQuery(dtf, new EntityDataPageLink(1, 0, null, null),
|
||||
Collections.emptyList(), keys, Collections.emptyList());
|
||||
|
||||
DeviceTypeFilter dtf = new DeviceTypeFilter();
|
||||
dtf.setDeviceNameFilter("D");
|
||||
dtf.setDeviceType("default");
|
||||
EntityDataQuery edq = new EntityDataQuery(dtf, new EntityDataPageLink(1, 0, null, null), Collections.emptyList(),
|
||||
Collections.singletonList(new EntityKey(EntityKeyType.TIME_SERIES, "temperature")), Collections.emptyList());
|
||||
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, null, null);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
String msg = getWsClient().waitForReply();
|
||||
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
EntityDataUpdate update = getWsClient().sendEntityDataQuery(edq);
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
PageData<EntityData> pageData = update.getData();
|
||||
Assert.assertNotNull(pageData);
|
||||
@ -341,17 +252,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
List<TsKvEntry> tsData = Arrays.asList(dataPoint1);
|
||||
sendTelemetry(device, tsData);
|
||||
|
||||
Thread.sleep(100);
|
||||
|
||||
LatestValueCmd latestCmd = new LatestValueCmd();
|
||||
latestCmd.setKeys(Collections.singletonList(new EntityKey(EntityKeyType.TIME_SERIES, "temperature")));
|
||||
cmd = new EntityDataCmd(1, null, null, latestCmd, null);
|
||||
wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
msg = getWsClient().waitForReply();
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
update = getWsClient().subscribeLatestUpdate(keys);
|
||||
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
|
||||
@ -368,9 +269,8 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
getWsClient().registerWaitForUpdate();
|
||||
sendTelemetry(device, Arrays.asList(dataPoint2));
|
||||
msg = getWsClient().waitForUpdate();
|
||||
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
update = getWsClient().parseDataReply(getWsClient().waitForUpdate());
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
List<EntityData> eData = update.getUpdate();
|
||||
Assert.assertNotNull(eData);
|
||||
@ -383,7 +283,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
//Sending update from the past, while latest value has new timestamp;
|
||||
getWsClient().registerWaitForUpdate();
|
||||
sendTelemetry(device, Arrays.asList(dataPoint1));
|
||||
msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1));
|
||||
String msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1));
|
||||
Assert.assertNull(msg);
|
||||
|
||||
//Sending duplicate update again
|
||||
@ -395,29 +295,11 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
@Test
|
||||
public void testEntityDataLatestTsWsCmd() throws Exception {
|
||||
Device device = new Device();
|
||||
device.setName("Device");
|
||||
device.setType("default");
|
||||
device.setLabel("testLabel" + (int) (Math.random() * 1000));
|
||||
device = doPost("/api/device", device, Device.class);
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
List<EntityKey> keys = List.of(new EntityKey(EntityKeyType.TIME_SERIES, "temperature"));
|
||||
|
||||
DeviceTypeFilter dtf = new DeviceTypeFilter();
|
||||
dtf.setDeviceNameFilter("D");
|
||||
dtf.setDeviceType("default");
|
||||
EntityDataQuery edq = new EntityDataQuery(dtf, new EntityDataPageLink(1, 0, null, null), Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
||||
EntityDataUpdate update = getWsClient().subscribeLatestUpdate(keys, dtf);
|
||||
|
||||
LatestValueCmd latestCmd = new LatestValueCmd();
|
||||
latestCmd.setKeys(Collections.singletonList(new EntityKey(EntityKeyType.TIME_SERIES, "temperature")));
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, latestCmd, null);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
String msg = getWsClient().waitForReply();
|
||||
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
PageData<EntityData> pageData = update.getData();
|
||||
Assert.assertNotNull(pageData);
|
||||
@ -433,13 +315,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
Thread.sleep(100);
|
||||
|
||||
cmd = new EntityDataCmd(1, edq, null, latestCmd, null);
|
||||
wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
msg = getWsClient().waitForReply();
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
update = getWsClient().subscribeLatestUpdate(keys, dtf);
|
||||
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
|
||||
@ -456,9 +332,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
getWsClient().registerWaitForUpdate();
|
||||
sendTelemetry(device, Arrays.asList(dataPoint2));
|
||||
msg = getWsClient().waitForUpdate();
|
||||
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
update = getWsClient().parseDataReply(getWsClient().waitForUpdate());
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
List<EntityData> eData = update.getUpdate();
|
||||
Assert.assertNotNull(eData);
|
||||
@ -471,7 +345,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
//Sending update from the past, while latest value has new timestamp;
|
||||
getWsClient().registerWaitForUpdate();
|
||||
sendTelemetry(device, Arrays.asList(dataPoint1));
|
||||
msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1));
|
||||
String msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1));
|
||||
Assert.assertNull(msg);
|
||||
|
||||
//Sending duplicate update again
|
||||
@ -483,31 +357,10 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
@Test
|
||||
public void testEntityDataLatestAttrWsCmd() throws Exception {
|
||||
Device device = new Device();
|
||||
device.setName("Device");
|
||||
device.setType("default");
|
||||
device.setLabel("testLabel" + (int) (Math.random() * 1000));
|
||||
device = doPost("/api/device", device, Device.class);
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
List<EntityKey> keys = List.of(new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, "serverAttributeKey"));
|
||||
|
||||
DeviceTypeFilter dtf = new DeviceTypeFilter();
|
||||
dtf.setDeviceNameFilter("D");
|
||||
dtf.setDeviceType("default");
|
||||
EntityDataQuery edq = new EntityDataQuery(dtf, new EntityDataPageLink(1, 0, null, null),
|
||||
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
||||
|
||||
LatestValueCmd latestCmd = new LatestValueCmd();
|
||||
latestCmd.setKeys(Collections.singletonList(new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, "serverAttributeKey")));
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, latestCmd, null);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
String msg = getWsClient().waitForReply();
|
||||
Assert.assertNotNull(msg);
|
||||
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
EntityDataUpdate update = getWsClient().subscribeLatestUpdate(keys, dtf);
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
PageData<EntityData> pageData = update.getData();
|
||||
Assert.assertNotNull(pageData);
|
||||
@ -517,7 +370,6 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
Assert.assertEquals(0, pageData.getData().get(0).getLatest().get(EntityKeyType.SERVER_ATTRIBUTE).get("serverAttributeKey").getTs());
|
||||
Assert.assertEquals("", pageData.getData().get(0).getLatest().get(EntityKeyType.SERVER_ATTRIBUTE).get("serverAttributeKey").getValue());
|
||||
|
||||
|
||||
getWsClient().registerWaitForUpdate();
|
||||
Thread.sleep(500);
|
||||
|
||||
@ -525,7 +377,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
List<AttributeKvEntry> tsData = Arrays.asList(dataPoint1);
|
||||
sendAttributes(device, TbAttributeSubscriptionScope.SERVER_SCOPE, tsData);
|
||||
|
||||
msg = getWsClient().waitForUpdate();
|
||||
String msg = getWsClient().waitForUpdate();
|
||||
Assert.assertNotNull(msg);
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
|
||||
@ -574,35 +426,15 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
@Test
|
||||
public void testEntityDataLatestAttrTypesWsCmd() throws Exception {
|
||||
Device device = new Device();
|
||||
device.setName("Device");
|
||||
device.setType("default");
|
||||
device.setLabel("testLabel" + (int) (Math.random() * 1000));
|
||||
device = doPost("/api/device", device, Device.class);
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
List<EntityKey> keys = List.of(
|
||||
new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, "serverAttributeKey"),
|
||||
new EntityKey(EntityKeyType.CLIENT_ATTRIBUTE, "clientAttributeKey"),
|
||||
new EntityKey(EntityKeyType.SHARED_ATTRIBUTE, "sharedAttributeKey"),
|
||||
new EntityKey(EntityKeyType.ATTRIBUTE, "anyAttributeKey"));
|
||||
|
||||
DeviceTypeFilter dtf = new DeviceTypeFilter();
|
||||
dtf.setDeviceNameFilter("D");
|
||||
dtf.setDeviceType("default");
|
||||
EntityDataQuery edq = new EntityDataQuery(dtf, new EntityDataPageLink(1, 0, null, null),
|
||||
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
||||
EntityDataUpdate update = getWsClient().subscribeLatestUpdate(keys, dtf);
|
||||
|
||||
LatestValueCmd latestCmd = new LatestValueCmd();
|
||||
List<EntityKey> keys = new ArrayList<>();
|
||||
keys.add(new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, "serverAttributeKey"));
|
||||
keys.add(new EntityKey(EntityKeyType.CLIENT_ATTRIBUTE, "clientAttributeKey"));
|
||||
keys.add(new EntityKey(EntityKeyType.SHARED_ATTRIBUTE, "sharedAttributeKey"));
|
||||
keys.add(new EntityKey(EntityKeyType.ATTRIBUTE, "anyAttributeKey"));
|
||||
latestCmd.setKeys(keys);
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, latestCmd, null);
|
||||
|
||||
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
|
||||
getWsClient().send(mapper.writeValueAsString(wrapper));
|
||||
String msg = getWsClient().waitForReply();
|
||||
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
PageData<EntityData> pageData = update.getData();
|
||||
Assert.assertNotNull(pageData);
|
||||
@ -628,7 +460,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
|
||||
|
||||
sendAttributes(device, TbAttributeSubscriptionScope.SERVER_SCOPE, tsData);
|
||||
|
||||
msg = getWsClient().waitForUpdate();
|
||||
String msg = getWsClient().waitForUpdate();
|
||||
Assert.assertNotNull(msg);
|
||||
update = mapper.readValue(msg, EntityDataUpdate.class);
|
||||
Assert.assertEquals(1, update.getCmdId());
|
||||
|
||||
@ -18,9 +18,25 @@ package org.thingsboard.server.controller;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
import org.thingsboard.common.util.JacksonUtil;
|
||||
import org.thingsboard.server.common.data.kv.Aggregation;
|
||||
import org.thingsboard.server.common.data.query.EntityDataPageLink;
|
||||
import org.thingsboard.server.common.data.query.EntityDataQuery;
|
||||
import org.thingsboard.server.common.data.query.EntityFilter;
|
||||
import org.thingsboard.server.common.data.query.EntityKey;
|
||||
import org.thingsboard.server.service.telemetry.cmd.TelemetryPluginCmdsWrapper;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityCountCmd;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityCountUpdate;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataCmd;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataUpdate;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.EntityHistoryCmd;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.LatestValueCmd;
|
||||
import org.thingsboard.server.service.telemetry.cmd.v2.TimeSeriesCmd;
|
||||
|
||||
import java.net.URI;
|
||||
import java.nio.channels.NotYetConnectedException;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@ -73,6 +89,18 @@ public class TbTestWebSocketClient extends WebSocketClient {
|
||||
super.send(text);
|
||||
}
|
||||
|
||||
public void send(EntityDataCmd cmd) throws NotYetConnectedException {
|
||||
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
|
||||
this.send(JacksonUtil.toString(wrapper));
|
||||
}
|
||||
|
||||
public void send(EntityCountCmd cmd) throws NotYetConnectedException {
|
||||
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
|
||||
wrapper.setEntityCountCmds(Collections.singletonList(cmd));
|
||||
this.send(JacksonUtil.toString(wrapper));
|
||||
}
|
||||
|
||||
public String waitForUpdate() {
|
||||
return waitForUpdate(TimeUnit.SECONDS.toMillis(3));
|
||||
}
|
||||
@ -94,4 +122,89 @@ public class TbTestWebSocketClient extends WebSocketClient {
|
||||
}
|
||||
return lastMsg;
|
||||
}
|
||||
|
||||
public EntityDataUpdate parseDataReply(String msg) {
|
||||
return JacksonUtil.fromString(msg, EntityDataUpdate.class);
|
||||
}
|
||||
|
||||
public EntityCountUpdate parseCountReply(String msg) {
|
||||
return JacksonUtil.fromString(msg, EntityCountUpdate.class);
|
||||
}
|
||||
|
||||
public EntityDataUpdate subscribeLatestUpdate(List<EntityKey> keys, EntityFilter entityFilter) {
|
||||
EntityDataQuery edq = new EntityDataQuery(entityFilter, new EntityDataPageLink(1, 0, null, null),
|
||||
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
||||
return subscribeLatestUpdate(keys, edq);
|
||||
}
|
||||
|
||||
public EntityDataUpdate subscribeLatestUpdate(List<EntityKey> keys) {
|
||||
return subscribeLatestUpdate(keys, (EntityDataQuery) null);
|
||||
}
|
||||
|
||||
public EntityDataUpdate subscribeLatestUpdate(List<EntityKey> keys, EntityDataQuery edq) {
|
||||
LatestValueCmd latestCmd = new LatestValueCmd();
|
||||
latestCmd.setKeys(keys);
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, latestCmd, null);
|
||||
send(cmd);
|
||||
return parseDataReply(waitForReply());
|
||||
}
|
||||
|
||||
public EntityDataUpdate subscribeTsUpdate(List<String> keys, long startTs, long timeWindow) {
|
||||
return subscribeTsUpdate(keys, startTs, timeWindow, null);
|
||||
}
|
||||
|
||||
public EntityDataUpdate subscribeTsUpdate(List<String> keys, long startTs, long timeWindow, EntityDataQuery edq) {
|
||||
TimeSeriesCmd tsCmd = new TimeSeriesCmd();
|
||||
tsCmd.setKeys(keys);
|
||||
tsCmd.setAgg(Aggregation.NONE);
|
||||
tsCmd.setLimit(1000);
|
||||
tsCmd.setStartTs(startTs - timeWindow);
|
||||
tsCmd.setTimeWindow(timeWindow);
|
||||
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, null, tsCmd);
|
||||
|
||||
send(cmd);
|
||||
return parseDataReply(waitForReply());
|
||||
}
|
||||
|
||||
public EntityDataUpdate sendHistoryCmd(List<String> keys, long startTs, long timeWindow) {
|
||||
return sendHistoryCmd(keys, startTs, timeWindow, (EntityDataQuery) null);
|
||||
}
|
||||
|
||||
public EntityDataUpdate sendHistoryCmd(List<String> keys, long startTs, long timeWindow, EntityFilter entityFilter) {
|
||||
EntityDataQuery edq = new EntityDataQuery(entityFilter,
|
||||
new EntityDataPageLink(1, 0, null, null),
|
||||
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
||||
return sendHistoryCmd(keys, startTs, timeWindow, edq);
|
||||
}
|
||||
|
||||
public EntityDataUpdate sendHistoryCmd(List<String> keys, long startTs, long timeWindow, EntityDataQuery edq) {
|
||||
EntityHistoryCmd historyCmd = new EntityHistoryCmd();
|
||||
historyCmd.setKeys(keys);
|
||||
historyCmd.setAgg(Aggregation.NONE);
|
||||
historyCmd.setLimit(1000);
|
||||
historyCmd.setStartTs(startTs - timeWindow);
|
||||
historyCmd.setEndTs(startTs);
|
||||
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, historyCmd, null, null);
|
||||
|
||||
send(cmd);
|
||||
return parseDataReply(this.waitForReply());
|
||||
}
|
||||
|
||||
public EntityDataUpdate sendEntityDataQuery(EntityDataQuery edq) {
|
||||
log.warn("sendEntityDataQuery {}", edq);
|
||||
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, null, null);
|
||||
send(cmd);
|
||||
String msg = this.waitForReply();
|
||||
return parseDataReply(msg);
|
||||
}
|
||||
|
||||
public EntityDataUpdate sendEntityDataQuery(EntityFilter entityFilter) {
|
||||
log.warn("sendEntityDataQuery {}", entityFilter);
|
||||
EntityDataQuery edq = new EntityDataQuery(entityFilter, new EntityDataPageLink(1, 0, null, null),
|
||||
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
||||
return sendEntityDataQuery(edq);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user