|
|
@ -16,24 +16,42 @@ |
|
|
package org.thingsboard.server.transport.coap.attributes; |
|
|
package org.thingsboard.server.transport.coap.attributes; |
|
|
|
|
|
|
|
|
import com.fasterxml.jackson.core.type.TypeReference; |
|
|
import com.fasterxml.jackson.core.type.TypeReference; |
|
|
|
|
|
import com.github.os72.protobuf.dynamic.DynamicSchema; |
|
|
|
|
|
import com.google.protobuf.Descriptors; |
|
|
|
|
|
import com.google.protobuf.DynamicMessage; |
|
|
import com.google.protobuf.InvalidProtocolBufferException; |
|
|
import com.google.protobuf.InvalidProtocolBufferException; |
|
|
|
|
|
import com.squareup.wire.schema.internal.parser.ProtoFileElement; |
|
|
|
|
|
import io.netty.handler.codec.mqtt.MqttQoS; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import org.eclipse.californium.core.CoapResponse; |
|
|
import org.eclipse.californium.core.CoapResponse; |
|
|
import org.eclipse.californium.core.coap.CoAP; |
|
|
import org.eclipse.californium.core.coap.CoAP; |
|
|
import org.eclipse.californium.core.coap.MediaTypeRegistry; |
|
|
import org.eclipse.californium.core.coap.MediaTypeRegistry; |
|
|
import org.thingsboard.common.util.JacksonUtil; |
|
|
import org.thingsboard.common.util.JacksonUtil; |
|
|
|
|
|
import org.thingsboard.server.common.data.device.profile.*; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.DeviceTypeFilter; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityKey; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityKeyType; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.SingleEntityFilter; |
|
|
import org.thingsboard.server.common.msg.session.FeatureType; |
|
|
import org.thingsboard.server.common.msg.session.FeatureType; |
|
|
|
|
|
import org.thingsboard.server.gen.transport.TransportApiProtos; |
|
|
import org.thingsboard.server.gen.transport.TransportProtos; |
|
|
import org.thingsboard.server.gen.transport.TransportProtos; |
|
|
import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest; |
|
|
import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest; |
|
|
import org.thingsboard.server.transport.coap.CoapTestClient; |
|
|
import org.thingsboard.server.transport.coap.CoapTestClient; |
|
|
|
|
|
import org.thingsboard.server.transport.mqtt.MqttTestCallback; |
|
|
|
|
|
import org.thingsboard.server.transport.mqtt.MqttTestClient; |
|
|
|
|
|
|
|
|
import java.nio.charset.StandardCharsets; |
|
|
import java.nio.charset.StandardCharsets; |
|
|
import java.util.ArrayList; |
|
|
import java.util.ArrayList; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
import static org.junit.Assert.assertEquals; |
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
import static org.junit.Assert.assertNotNull; |
|
|
import static org.junit.Assert.*; |
|
|
|
|
|
import static org.junit.Assert.assertTrue; |
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
|
|
|
|
|
import static org.thingsboard.server.common.data.query.EntityKeyType.CLIENT_ATTRIBUTE; |
|
|
|
|
|
import static org.thingsboard.server.common.data.query.EntityKeyType.SHARED_ATTRIBUTE; |
|
|
|
|
|
|
|
|
@Slf4j |
|
|
@Slf4j |
|
|
public abstract class AbstractCoapAttributesIntegrationTest extends AbstractCoapIntegrationTest { |
|
|
public abstract class AbstractCoapAttributesIntegrationTest extends AbstractCoapIntegrationTest { |
|
|
@ -43,12 +61,54 @@ public abstract class AbstractCoapAttributesIntegrationTest extends AbstractCoap |
|
|
protected static final String POST_ATTRIBUTES_PAYLOAD = "{\"attribute1\":\"value1\",\"attribute2\":true,\"attribute3\":42.0,\"attribute4\":73," + |
|
|
protected static final String POST_ATTRIBUTES_PAYLOAD = "{\"attribute1\":\"value1\",\"attribute2\":true,\"attribute3\":42.0,\"attribute4\":73," + |
|
|
"\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}}"; |
|
|
"\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}}"; |
|
|
|
|
|
|
|
|
protected List<TransportProtos.TsKvProto> getTsKvProtoList() { |
|
|
public static final String ATTRIBUTES_SCHEMA_STR = "syntax =\"proto3\";\n" + |
|
|
TransportProtos.TsKvProto tsKvProtoAttribute1 = getTsKvProto("attribute1", "value1", TransportProtos.KeyValueType.STRING_V); |
|
|
"\n" + |
|
|
TransportProtos.TsKvProto tsKvProtoAttribute2 = getTsKvProto("attribute2", "true", TransportProtos.KeyValueType.BOOLEAN_V); |
|
|
"package test;\n" + |
|
|
TransportProtos.TsKvProto tsKvProtoAttribute3 = getTsKvProto("attribute3", "42.0", TransportProtos.KeyValueType.DOUBLE_V); |
|
|
"\n" + |
|
|
TransportProtos.TsKvProto tsKvProtoAttribute4 = getTsKvProto("attribute4", "73", TransportProtos.KeyValueType.LONG_V); |
|
|
"message PostAttributes {\n" + |
|
|
TransportProtos.TsKvProto tsKvProtoAttribute5 = getTsKvProto("attribute5", "{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}", TransportProtos.KeyValueType.JSON_V); |
|
|
" string clientStr = 1;\n" + |
|
|
|
|
|
" bool clientBool = 2;\n" + |
|
|
|
|
|
" double clientDbl = 3;\n" + |
|
|
|
|
|
" int32 clientLong = 4;\n" + |
|
|
|
|
|
" JsonObject clientJson = 5;\n" + |
|
|
|
|
|
"\n" + |
|
|
|
|
|
" message JsonObject {\n" + |
|
|
|
|
|
" int32 someNumber = 6;\n" + |
|
|
|
|
|
" repeated int32 someArray = 7;\n" + |
|
|
|
|
|
" NestedJsonObject someNestedObject = 8;\n" + |
|
|
|
|
|
" message NestedJsonObject {\n" + |
|
|
|
|
|
" string key = 9;\n" + |
|
|
|
|
|
" }\n" + |
|
|
|
|
|
" }\n" + |
|
|
|
|
|
"}"; |
|
|
|
|
|
|
|
|
|
|
|
private static final String CLIENT_ATTRIBUTES_PAYLOAD = "{\"clientStr\":\"value1\",\"clientBool\":true,\"clientDbl\":42.0,\"clientLong\":73," + |
|
|
|
|
|
"\"clientJson\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}}"; |
|
|
|
|
|
|
|
|
|
|
|
private static final String SHARED_ATTRIBUTES_PAYLOAD = "{\"sharedStr\":\"value1\",\"sharedBool\":true,\"sharedDbl\":42.0,\"sharedLong\":73," + |
|
|
|
|
|
"\"sharedJson\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}}"; |
|
|
|
|
|
|
|
|
|
|
|
private List<TransportProtos.TsKvProto> getTsKvProtoList(String attributePrefix) { |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute1 = getTsKvProto(attributePrefix + "Str", "value1", TransportProtos.KeyValueType.STRING_V); |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute2 = getTsKvProto(attributePrefix + "Bool", "true", TransportProtos.KeyValueType.BOOLEAN_V); |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute3 = getTsKvProto(attributePrefix + "Dbl", "42.0", TransportProtos.KeyValueType.DOUBLE_V); |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute4 = getTsKvProto(attributePrefix + "Long", "73", TransportProtos.KeyValueType.LONG_V); |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute5 = getTsKvProto(attributePrefix + "Json", "{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}", TransportProtos.KeyValueType.JSON_V); |
|
|
|
|
|
List<TransportProtos.TsKvProto> tsKvProtoList = new ArrayList<>(); |
|
|
|
|
|
tsKvProtoList.add(tsKvProtoAttribute1); |
|
|
|
|
|
tsKvProtoList.add(tsKvProtoAttribute2); |
|
|
|
|
|
tsKvProtoList.add(tsKvProtoAttribute3); |
|
|
|
|
|
tsKvProtoList.add(tsKvProtoAttribute4); |
|
|
|
|
|
tsKvProtoList.add(tsKvProtoAttribute5); |
|
|
|
|
|
return tsKvProtoList; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public List<TransportProtos.TsKvProto> getTsKvProtoList() { |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute1 = getTsKvProto("Str", "value1", TransportProtos.KeyValueType.STRING_V); |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute2 = getTsKvProto("Bool", "true", TransportProtos.KeyValueType.BOOLEAN_V); |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute3 = getTsKvProto("Dbl", "42.0", TransportProtos.KeyValueType.DOUBLE_V); |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute4 = getTsKvProto("Long", "73", TransportProtos.KeyValueType.LONG_V); |
|
|
|
|
|
TransportProtos.TsKvProto tsKvProtoAttribute5 = getTsKvProto("Json", "{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}", TransportProtos.KeyValueType.JSON_V); |
|
|
List<TransportProtos.TsKvProto> tsKvProtoList = new ArrayList<>(); |
|
|
List<TransportProtos.TsKvProto> tsKvProtoList = new ArrayList<>(); |
|
|
tsKvProtoList.add(tsKvProtoAttribute1); |
|
|
tsKvProtoList.add(tsKvProtoAttribute1); |
|
|
tsKvProtoList.add(tsKvProtoAttribute2); |
|
|
tsKvProtoList.add(tsKvProtoAttribute2); |
|
|
@ -65,52 +125,169 @@ public abstract class AbstractCoapAttributesIntegrationTest extends AbstractCoap |
|
|
return tsKvProtoBuilder.build(); |
|
|
return tsKvProtoBuilder.build(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
protected void processTestRequestAttributesValuesFromTheServer() throws Exception { |
|
|
private List<EntityKey> getEntityKeys(List<String> keys, EntityKeyType scope) { |
|
|
postAttributes(); |
|
|
return keys.stream().map(key -> new EntityKey(scope, key)).collect(Collectors.toList()); |
|
|
|
|
|
} |
|
|
long start = System.currentTimeMillis(); |
|
|
|
|
|
long end = System.currentTimeMillis() + 5000; |
|
|
|
|
|
|
|
|
|
|
|
List<String> savedAttributeKeys = null; |
|
|
private byte[] getAttributesProtoPayloadBytes() { |
|
|
while (start <= end) { |
|
|
|
|
|
savedAttributeKeys = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/keys/attributes/CLIENT_SCOPE", new TypeReference<>() {}); |
|
|
|
|
|
if (savedAttributeKeys.size() == 5) { |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
Thread.sleep(100); |
|
|
|
|
|
start += 100; |
|
|
|
|
|
} |
|
|
|
|
|
assertNotNull(savedAttributeKeys); |
|
|
|
|
|
|
|
|
|
|
|
String keys = "attribute1,attribute2,attribute3,attribute4,attribute5"; |
|
|
DeviceProfileTransportConfiguration transportConfiguration = deviceProfile.getProfileData().getTransportConfiguration(); |
|
|
//String featureTokenUrl = getFeatureTokenUrl(accessToken, FeatureType.ATTRIBUTES) + "?clientKeys=" + keys + "&sharedKeys=" + keys;
|
|
|
assertTrue(transportConfiguration instanceof CoapDeviceProfileTransportConfiguration); |
|
|
//client = getCoapClient(featureTokenUrl);
|
|
|
CoapDeviceProfileTransportConfiguration coapTransportConfiguration = (CoapDeviceProfileTransportConfiguration) transportConfiguration; |
|
|
|
|
|
CoapDeviceTypeConfiguration coapDeviceTypeConfiguration = coapTransportConfiguration.getCoapDeviceTypeConfiguration(); |
|
|
|
|
|
assertTrue(coapDeviceTypeConfiguration instanceof DefaultCoapDeviceTypeConfiguration); |
|
|
|
|
|
DefaultCoapDeviceTypeConfiguration defaultCoapDeviceTypeConfiguration = (DefaultCoapDeviceTypeConfiguration) coapDeviceTypeConfiguration; |
|
|
|
|
|
TransportPayloadTypeConfiguration transportPayloadTypeConfiguration = defaultCoapDeviceTypeConfiguration.getTransportPayloadTypeConfiguration(); |
|
|
|
|
|
assertTrue(transportPayloadTypeConfiguration instanceof ProtoTransportPayloadConfiguration); |
|
|
|
|
|
ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration; |
|
|
|
|
|
ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(ATTRIBUTES_SCHEMA_STR); |
|
|
|
|
|
DynamicSchema attributesSchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, ProtoTransportPayloadConfiguration.ATTRIBUTES_PROTO_SCHEMA); |
|
|
|
|
|
|
|
|
//CoapResponse getAttributesResponse = client.setTimeout(CLIENT_REQUEST_TIMEOUT).get();
|
|
|
DynamicMessage.Builder nestedJsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject.NestedJsonObject"); |
|
|
//validateResponse(getAttributesResponse);
|
|
|
Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType(); |
|
|
|
|
|
assertNotNull(nestedJsonObjectBuilderDescriptor); |
|
|
|
|
|
DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build(); |
|
|
|
|
|
|
|
|
//TODO - NEW -- YURIY
|
|
|
DynamicMessage.Builder jsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject"); |
|
|
String featureTokenUrl = CoapTestClient.getFeatureTokenUrl(accessToken, FeatureType.ATTRIBUTES) + "?clientKeys=" + keys + "&sharedKeys=" + keys; |
|
|
Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType(); |
|
|
CoapTestClient client = new CoapTestClient(featureTokenUrl); |
|
|
assertNotNull(jsonObjectBuilderDescriptor); |
|
|
|
|
|
DynamicMessage jsonObject = jsonObjectBuilder |
|
|
|
|
|
.setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42) |
|
|
|
|
|
.addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1) |
|
|
|
|
|
.addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2) |
|
|
|
|
|
.addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3) |
|
|
|
|
|
.setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject) |
|
|
|
|
|
.build(); |
|
|
|
|
|
|
|
|
validateResponse(client.GetMethod()); |
|
|
DynamicMessage.Builder postAttributesBuilder = attributesSchema.newMessageBuilder("PostAttributes"); |
|
|
|
|
|
Descriptors.Descriptor postAttributesMsgDescriptor = postAttributesBuilder.getDescriptorForType(); |
|
|
|
|
|
assertNotNull(postAttributesMsgDescriptor); |
|
|
|
|
|
DynamicMessage postAttributesMsg = postAttributesBuilder |
|
|
|
|
|
.setField(postAttributesMsgDescriptor.findFieldByName("clientStr"), "value1") |
|
|
|
|
|
.setField(postAttributesMsgDescriptor.findFieldByName("clientBool"), true) |
|
|
|
|
|
.setField(postAttributesMsgDescriptor.findFieldByName("clientDbl"), 42.0) |
|
|
|
|
|
.setField(postAttributesMsgDescriptor.findFieldByName("clientLong"), 73) |
|
|
|
|
|
.setField(postAttributesMsgDescriptor.findFieldByName("clientJson"), jsonObject) |
|
|
|
|
|
.build(); |
|
|
|
|
|
return postAttributesMsg.toByteArray(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
protected void postAttributes() throws Exception { |
|
|
protected void processJsonTestRequestAttributesValuesFromTheServer() throws Exception { |
|
|
doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", POST_ATTRIBUTES_PAYLOAD, String.class, status().isOk()); |
|
|
CoapTestClient client = new CoapTestClient(accessToken, FeatureType.ATTRIBUTES); |
|
|
|
|
|
SingleEntityFilter dtf = new SingleEntityFilter(); |
|
|
|
|
|
dtf.setSingleEntity(savedDevice.getId()); |
|
|
|
|
|
String clientKeysStr = "clientStr,clientBool,clientDbl,clientLong,clientJson"; |
|
|
|
|
|
String sharedKeysStr = "sharedStr,sharedBool,sharedDbl,sharedLong,sharedJson"; |
|
|
|
|
|
List<String> clientKeysList = List.of(clientKeysStr.split(",")); |
|
|
|
|
|
List<String> sharedKeysList = List.of(sharedKeysStr.split(",")); |
|
|
|
|
|
List<EntityKey> csKeys = getEntityKeys(clientKeysList, CLIENT_ATTRIBUTE); |
|
|
|
|
|
List<EntityKey> shKeys = getEntityKeys(sharedKeysList, SHARED_ATTRIBUTE); |
|
|
|
|
|
List<EntityKey> keys = new ArrayList<>(); |
|
|
|
|
|
keys.addAll(csKeys); |
|
|
|
|
|
keys.addAll(shKeys); |
|
|
|
|
|
getWsClient().subscribeLatestUpdate(keys, dtf); |
|
|
|
|
|
getWsClient().registerWaitForUpdate(2); |
|
|
|
|
|
|
|
|
|
|
|
doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", |
|
|
|
|
|
SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk()); |
|
|
|
|
|
|
|
|
//client = getCoapClient(FeatureType.ATTRIBUTES);
|
|
|
CoapResponse coapResponse = client.postMethod(CLIENT_ATTRIBUTES_PAYLOAD); |
|
|
//CoapResponse coapResponse = client.setTimeout(CLIENT_REQUEST_TIMEOUT).post(POST_ATTRIBUTES_PAYLOAD.getBytes(), MediaTypeRegistry.APPLICATION_JSON);
|
|
|
assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode()); |
|
|
|
|
|
|
|
|
|
|
|
String update = getWsClient().waitForUpdate(); |
|
|
|
|
|
assertThat(update).as("ws update received").isNotBlank(); |
|
|
|
|
|
|
|
|
|
|
|
String featureTokenUrl = CoapTestClient.getFeatureTokenUrl(accessToken, FeatureType.ATTRIBUTES) + "?clientKeys=" + clientKeysStr + "&sharedKeys=" + sharedKeysStr; |
|
|
|
|
|
client.setURI(featureTokenUrl); |
|
|
|
|
|
validateJsonResponse(client.getMethod()); |
|
|
|
|
|
client.disconnect(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected void processProtoTestRequestAttributesValuesFromTheServer() throws Exception { |
|
|
CoapTestClient client = new CoapTestClient(accessToken, FeatureType.ATTRIBUTES); |
|
|
CoapTestClient client = new CoapTestClient(accessToken, FeatureType.ATTRIBUTES); |
|
|
CoapResponse coapResponse = client.PostMethod(POST_ATTRIBUTES_PAYLOAD); |
|
|
SingleEntityFilter dtf = new SingleEntityFilter(); |
|
|
|
|
|
dtf.setSingleEntity(savedDevice.getId()); |
|
|
|
|
|
String clientKeysStr = "clientStr,clientBool,clientDbl,clientLong,clientJson"; |
|
|
|
|
|
String sharedKeysStr = "sharedStr,sharedBool,sharedDbl,sharedLong,sharedJson"; |
|
|
|
|
|
List<String> clientKeysList = List.of(clientKeysStr.split(",")); |
|
|
|
|
|
List<String> sharedKeysList = List.of(sharedKeysStr.split(",")); |
|
|
|
|
|
List<EntityKey> csKeys = getEntityKeys(clientKeysList, CLIENT_ATTRIBUTE); |
|
|
|
|
|
List<EntityKey> shKeys = getEntityKeys(sharedKeysList, SHARED_ATTRIBUTE); |
|
|
|
|
|
List<EntityKey> keys = new ArrayList<>(); |
|
|
|
|
|
keys.addAll(csKeys); |
|
|
|
|
|
keys.addAll(shKeys); |
|
|
|
|
|
getWsClient().subscribeLatestUpdate(keys, dtf); |
|
|
|
|
|
getWsClient().registerWaitForUpdate(2); |
|
|
|
|
|
|
|
|
|
|
|
doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", |
|
|
|
|
|
SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk()); |
|
|
|
|
|
|
|
|
|
|
|
CoapResponse coapResponse = client.postMethod(getAttributesProtoPayloadBytes()); |
|
|
assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode()); |
|
|
assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode()); |
|
|
|
|
|
|
|
|
|
|
|
//validateProtoResponse(callback, getExpectedAttributeResponseMsg());
|
|
|
|
|
|
|
|
|
|
|
|
// client.publishAndWait(attrPubTopic, getAttributesProtoPayloadBytes());
|
|
|
|
|
|
// client.subscribeAndWait(attrSubTopic, MqttQoS.AT_MOST_ONCE);
|
|
|
|
|
|
String update = getWsClient().waitForUpdate(); |
|
|
|
|
|
assertThat(update).as("ws update received").isNotBlank(); |
|
|
|
|
|
|
|
|
|
|
|
// MqttTestCallback callback = new MqttTestCallback(attrSubTopic.replace("+", "1"));
|
|
|
|
|
|
// client.setCallback(callback);
|
|
|
|
|
|
TransportApiProtos.AttributesRequest.Builder attributesRequestBuilder = TransportApiProtos.AttributesRequest.newBuilder(); |
|
|
|
|
|
attributesRequestBuilder.setClientKeys(clientKeysStr); |
|
|
|
|
|
attributesRequestBuilder.setSharedKeys(sharedKeysStr); |
|
|
|
|
|
TransportApiProtos.AttributesRequest attributesRequest = attributesRequestBuilder.build(); |
|
|
|
|
|
// client.publishAndWait(attrReqTopicPrefix + "1", attributesRequest.toByteArray());
|
|
|
|
|
|
|
|
|
|
|
|
String featureTokenUrl = CoapTestClient.getFeatureTokenUrl(accessToken, FeatureType.ATTRIBUTES) + "?clientKeys=" + clientKeysStr + "&sharedKeys=" + sharedKeysStr; |
|
|
|
|
|
client.setURI(featureTokenUrl); |
|
|
|
|
|
|
|
|
|
|
|
validateProtoResponse(client.getMethod()); |
|
|
|
|
|
client.disconnect(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
protected void validateResponse(CoapResponse getAttributesResponse) throws InvalidProtocolBufferException { |
|
|
protected void postAttributes() throws Exception { |
|
|
|
|
|
// //doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", POST_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
|
|
|
|
|
|
//
|
|
|
|
|
|
// doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE",
|
|
|
|
|
|
// SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
|
|
|
|
|
|
//
|
|
|
|
|
|
//
|
|
|
|
|
|
//
|
|
|
|
|
|
// //client = getCoapClient(FeatureType.ATTRIBUTES);
|
|
|
|
|
|
// //CoapResponse coapResponse = client.setTimeout(CLIENT_REQUEST_TIMEOUT).post(POST_ATTRIBUTES_PAYLOAD.getBytes(), MediaTypeRegistry.APPLICATION_JSON);
|
|
|
|
|
|
//
|
|
|
|
|
|
// CoapTestClient client = new CoapTestClient(accessToken, FeatureType.ATTRIBUTES);
|
|
|
|
|
|
// CoapResponse coapResponse = client.postMethod(CLIENT_ATTRIBUTES_PAYLOAD);
|
|
|
|
|
|
// assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode());
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected void validateJsonResponse(CoapResponse getAttributesResponse) throws InvalidProtocolBufferException { |
|
|
assertEquals(CoAP.ResponseCode.CONTENT, getAttributesResponse.getCode()); |
|
|
assertEquals(CoAP.ResponseCode.CONTENT, getAttributesResponse.getCode()); |
|
|
String expectedRequestPayload = "{\"client\":{\"attribute1\":\"value1\",\"attribute2\":true,\"attribute3\":42.0,\"attribute4\":73,\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}},\"shared\":{\"attribute1\":\"value1\",\"attribute2\":true,\"attribute3\":42.0,\"attribute4\":73,\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}}}"; |
|
|
String expectedResponse = "{\"client\":" + CLIENT_ATTRIBUTES_PAYLOAD + ",\"shared\":" + SHARED_ATTRIBUTES_PAYLOAD + "}"; |
|
|
assertEquals(JacksonUtil.toJsonNode(expectedRequestPayload), JacksonUtil.toJsonNode(new String(getAttributesResponse.getPayload(), StandardCharsets.UTF_8))); |
|
|
assertEquals(JacksonUtil.toJsonNode(expectedResponse), JacksonUtil.fromBytes(getAttributesResponse.getPayload())); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected void validateProtoResponse(CoapResponse getAttributesResponse) throws InterruptedException, InvalidProtocolBufferException { |
|
|
|
|
|
TransportProtos.GetAttributeResponseMsg expectedAttributesResponse = getExpectedAttributeResponseMsg(); |
|
|
|
|
|
TransportProtos.GetAttributeResponseMsg actualAttributesResponse = TransportProtos.GetAttributeResponseMsg.parseFrom(getAttributesResponse.getPayload()); |
|
|
|
|
|
assertEquals(expectedAttributesResponse.getRequestId(), actualAttributesResponse.getRequestId()); |
|
|
|
|
|
List<TransportProtos.KeyValueProto> expectedClientKeyValueProtos = expectedAttributesResponse.getClientAttributeListList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList()); |
|
|
|
|
|
List<TransportProtos.KeyValueProto> expectedSharedKeyValueProtos = expectedAttributesResponse.getSharedAttributeListList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList()); |
|
|
|
|
|
List<TransportProtos.KeyValueProto> actualClientKeyValueProtos = actualAttributesResponse.getClientAttributeListList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList()); |
|
|
|
|
|
List<TransportProtos.KeyValueProto> actualSharedKeyValueProtos = actualAttributesResponse.getSharedAttributeListList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList()); |
|
|
|
|
|
assertTrue(actualClientKeyValueProtos.containsAll(expectedClientKeyValueProtos)); |
|
|
|
|
|
assertTrue(actualSharedKeyValueProtos.containsAll(expectedSharedKeyValueProtos)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private TransportProtos.GetAttributeResponseMsg getExpectedAttributeResponseMsg() { |
|
|
|
|
|
TransportProtos.GetAttributeResponseMsg.Builder result = TransportProtos.GetAttributeResponseMsg.newBuilder(); |
|
|
|
|
|
List<TransportProtos.TsKvProto> csTsKvProtoList = getTsKvProtoList("client"); |
|
|
|
|
|
List<TransportProtos.TsKvProto> shTsKvProtoList = getTsKvProtoList("shared"); |
|
|
|
|
|
result.addAllClientAttributeList(csTsKvProtoList); |
|
|
|
|
|
result.addAllSharedAttributeList(shTsKvProtoList); |
|
|
|
|
|
result.setRequestId(0); |
|
|
|
|
|
return result.build(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|