Commit c5c8fbd3f73e5def00efd4390449ca99acaf080f

Authored by ShvaykaD
Committed by GitHub
1 parent dff593a3

[3.2.2] [WIP] coap transport (#4239)

* init CoapDeviceProfile & added ui components

* added transport payload type configuration for default coap device type

* added AbstractCoapTransportResource & updated efento resource

* fixed coap device profile save & update

* fixed Attribute Updates notifications

* revert CoapOkCallback onSuccess changes

* updated provision request to handle proto payload type

* fix license

* updated Rpc subscribe/unsubscribe action

* add more device emulator clients

* added fix for Coap Transport: ability to handle requests with oneElementUriPaths and MultiElementUriPaths

* fix TbCoapServer implementation

* changed response type to CREATED in POST requests

* improved implementation

* fix typos

* minor bug-fixes & improvements

* fix TbCoapServerMessageDeliverer class

* improved relay sensor implementation

* added tests for CoAP transport\

* fix typo

* removed nosql tests

* fix coap endpoint creation & improved getAttributes tests

* transport tests refactoring
Showing 100 changed files with 3371 additions and 290 deletions

Too many changes to show.

To preserve performance only 100 of 137 files are displayed.

application/src/test/java/org/thingsboard/server/transport/AbstractTransportIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/AbstractMqttIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt;
  16 +package org.thingsboard.server.transport;
17 17
18 18 import com.fasterxml.jackson.databind.node.ObjectNode;
19 19 import lombok.extern.slf4j.Slf4j;
... ... @@ -56,13 +56,14 @@ import static org.junit.Assert.assertNotNull;
56 56 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
57 57
58 58 @Slf4j
59   -public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest {
  59 +public abstract class AbstractTransportIntegrationTest extends AbstractControllerTest {
60 60
61 61 protected static final String MQTT_URL = "tcp://localhost:1883";
  62 + protected static final String COAP_BASE_URL = "coap://localhost:5683/api/v1/";
62 63
63   - private static final AtomicInteger atomicInteger = new AtomicInteger(2);
  64 + protected static final AtomicInteger atomicInteger = new AtomicInteger(2);
64 65
65   - public static final String DEVICE_TELEMETRY_PROTO_SCHEMA = "syntax =\"proto3\";\n" +
  66 + protected static final String DEVICE_TELEMETRY_PROTO_SCHEMA = "syntax =\"proto3\";\n" +
66 67 "\n" +
67 68 "package test;\n" +
68 69 "\n" +
... ... @@ -83,7 +84,7 @@ public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest
83 84 " }\n" +
84 85 "}";
85 86
86   - public static final String DEVICE_ATTRIBUTES_PROTO_SCHEMA = "syntax =\"proto3\";\n" +
  87 + protected static final String DEVICE_ATTRIBUTES_PROTO_SCHEMA = "syntax =\"proto3\";\n" +
87 88 "\n" +
88 89 "package test;\n" +
89 90 "\n" +
... ... @@ -110,81 +111,8 @@ public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest
110 111 protected Device savedDevice;
111 112 protected String accessToken;
112 113
113   - protected Device savedGateway;
114   - protected String gatewayAccessToken;
115   -
116 114 protected DeviceProfile deviceProfile;
117 115
118   - protected void processBeforeTest (String deviceName, String gatewayName, TransportPayloadType payloadType, String telemetryTopic, String attributesTopic) throws Exception {
119   - this.processBeforeTest(deviceName, gatewayName, payloadType, telemetryTopic, attributesTopic, null, null, DeviceProfileProvisionType.DISABLED, null, null);
120   - }
121   -
122   - protected void processBeforeTest(String deviceName,
123   - String gatewayName,
124   - TransportPayloadType payloadType,
125   - String telemetryTopic,
126   - String attributesTopic,
127   - String telemetryProtoSchema,
128   - String attributesProtoSchema,
129   - DeviceProfileProvisionType provisionType,
130   - String provisionKey, String provisionSecret
131   - ) throws Exception {
132   - loginSysAdmin();
133   -
134   - Tenant tenant = new Tenant();
135   - tenant.setTitle("My tenant");
136   - savedTenant = doPost("/api/tenant", tenant, Tenant.class);
137   - Assert.assertNotNull(savedTenant);
138   -
139   - tenantAdmin = new User();
140   - tenantAdmin.setAuthority(Authority.TENANT_ADMIN);
141   - tenantAdmin.setTenantId(savedTenant.getId());
142   - tenantAdmin.setEmail("tenant" + atomicInteger.getAndIncrement() + "@thingsboard.org");
143   - tenantAdmin.setFirstName("Joe");
144   - tenantAdmin.setLastName("Downs");
145   -
146   - tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1");
147   -
148   - Device device = new Device();
149   - device.setName(deviceName);
150   - device.setType("default");
151   -
152   - Device gateway = new Device();
153   - gateway.setName(gatewayName);
154   - gateway.setType("default");
155   - ObjectNode additionalInfo = mapper.createObjectNode();
156   - additionalInfo.put("gateway", true);
157   - gateway.setAdditionalInfo(additionalInfo);
158   -
159   - if (payloadType != null) {
160   - DeviceProfile mqttDeviceProfile = createMqttDeviceProfile(payloadType, telemetryTopic, attributesTopic, telemetryProtoSchema, attributesProtoSchema, provisionType, provisionKey, provisionSecret);
161   - deviceProfile = doPost("/api/deviceProfile", mqttDeviceProfile, DeviceProfile.class);
162   - device.setType(deviceProfile.getName());
163   - device.setDeviceProfileId(deviceProfile.getId());
164   - gateway.setType(deviceProfile.getName());
165   - gateway.setDeviceProfileId(deviceProfile.getId());
166   - }
167   -
168   - savedDevice = doPost("/api/device", device, Device.class);
169   -
170   - DeviceCredentials deviceCredentials =
171   - doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class);
172   -
173   - savedGateway = doPost("/api/device", gateway, Device.class);
174   -
175   - DeviceCredentials gatewayCredentials =
176   - doGet("/api/device/" + savedGateway.getId().getId().toString() + "/credentials", DeviceCredentials.class);
177   -
178   - assertEquals(savedDevice.getId(), deviceCredentials.getDeviceId());
179   - accessToken = deviceCredentials.getCredentialsId();
180   - assertNotNull(accessToken);
181   -
182   - assertEquals(savedGateway.getId(), gatewayCredentials.getDeviceId());
183   - gatewayAccessToken = gatewayCredentials.getCredentialsId();
184   - assertNotNull(gatewayAccessToken);
185   -
186   - }
187   -
188 116 protected void processAfterTest() throws Exception {
189 117 loginSysAdmin();
190 118 if (savedTenant != null) {
... ... @@ -192,22 +120,6 @@ public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest
192 120 }
193 121 }
194 122
195   - protected MqttAsyncClient getMqttAsyncClient(String accessToken) throws MqttException {
196   - String clientId = MqttAsyncClient.generateClientId();
197   - MqttAsyncClient client = new MqttAsyncClient(MQTT_URL, clientId, new MemoryPersistence());
198   -
199   - MqttConnectOptions options = new MqttConnectOptions();
200   - options.setUserName(accessToken);
201   - client.connect(options).waitForCompletion();
202   - return client;
203   - }
204   -
205   - protected void publishMqttMsg(MqttAsyncClient client, byte[] payload, String topic) throws MqttException {
206   - MqttMessage message = new MqttMessage();
207   - message.setPayload(payload);
208   - client.publish(topic, message);
209   - }
210   -
211 123 protected List<TransportProtos.KeyValueProto> getKvProtos(List<String> expectedKeys) {
212 124 List<TransportProtos.KeyValueProto> keyValueProtos = new ArrayList<>();
213 125 TransportProtos.KeyValueProto strKeyValueProto = getKeyValueProto(expectedKeys.get(0), "value1", TransportProtos.KeyValueType.STRING_V);
... ... @@ -247,72 +159,6 @@ public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest
247 159 return keyValueProtoBuilder.build();
248 160 }
249 161
250   - protected DeviceProfile createMqttDeviceProfile(TransportPayloadType transportPayloadType,
251   - String telemetryTopic, String attributesTopic,
252   - String telemetryProtoSchema, String attributesProtoSchema,
253   - DeviceProfileProvisionType provisionType,
254   - String provisionKey, String provisionSecret) {
255   - DeviceProfile deviceProfile = new DeviceProfile();
256   - deviceProfile.setName(transportPayloadType.name());
257   - deviceProfile.setType(DeviceProfileType.DEFAULT);
258   - deviceProfile.setTransportType(DeviceTransportType.MQTT);
259   - deviceProfile.setProvisionType(provisionType);
260   - deviceProfile.setProvisionDeviceKey(provisionKey);
261   - deviceProfile.setDescription(transportPayloadType.name() + " Test");
262   - DeviceProfileData deviceProfileData = new DeviceProfileData();
263   - DefaultDeviceProfileConfiguration configuration = new DefaultDeviceProfileConfiguration();
264   - MqttDeviceProfileTransportConfiguration mqttDeviceProfileTransportConfiguration = new MqttDeviceProfileTransportConfiguration();
265   - if (!StringUtils.isEmpty(telemetryTopic)) {
266   - mqttDeviceProfileTransportConfiguration.setDeviceTelemetryTopic(telemetryTopic);
267   - }
268   - if (!StringUtils.isEmpty(attributesTopic)) {
269   - mqttDeviceProfileTransportConfiguration.setDeviceAttributesTopic(attributesTopic);
270   - }
271   - TransportPayloadTypeConfiguration transportPayloadTypeConfiguration;
272   - if (TransportPayloadType.JSON.equals(transportPayloadType)) {
273   - transportPayloadTypeConfiguration = new JsonTransportPayloadConfiguration();
274   - } else {
275   - ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = new ProtoTransportPayloadConfiguration();
276   - if (StringUtils.isEmpty(telemetryProtoSchema)) {
277   - telemetryProtoSchema = DEVICE_TELEMETRY_PROTO_SCHEMA;
278   - }
279   - if (StringUtils.isEmpty(attributesProtoSchema)) {
280   - attributesProtoSchema = DEVICE_ATTRIBUTES_PROTO_SCHEMA;
281   - }
282   - protoTransportPayloadConfiguration.setDeviceTelemetryProtoSchema(telemetryProtoSchema);
283   - protoTransportPayloadConfiguration.setDeviceAttributesProtoSchema(attributesProtoSchema);
284   - transportPayloadTypeConfiguration = protoTransportPayloadConfiguration;
285   - }
286   - mqttDeviceProfileTransportConfiguration.setTransportPayloadTypeConfiguration(transportPayloadTypeConfiguration);
287   - deviceProfileData.setTransportConfiguration(mqttDeviceProfileTransportConfiguration);
288   - DeviceProfileProvisionConfiguration provisionConfiguration;
289   - switch (provisionType) {
290   - case ALLOW_CREATE_NEW_DEVICES:
291   - provisionConfiguration = new AllowCreateNewDevicesDeviceProfileProvisionConfiguration(provisionSecret);
292   - break;
293   - case CHECK_PRE_PROVISIONED_DEVICES:
294   - provisionConfiguration = new CheckPreProvisionedDevicesDeviceProfileProvisionConfiguration(provisionSecret);
295   - break;
296   - case DISABLED:
297   - default:
298   - provisionConfiguration = new DisabledDeviceProfileProvisionConfiguration(provisionSecret);
299   - break;
300   - }
301   - deviceProfileData.setProvisionConfiguration(provisionConfiguration);
302   - deviceProfileData.setConfiguration(configuration);
303   - deviceProfile.setProfileData(deviceProfileData);
304   - deviceProfile.setDefault(false);
305   - deviceProfile.setDefaultRuleChainId(null);
306   - return deviceProfile;
307   - }
308   -
309   - protected TransportProtos.PostAttributeMsg getPostAttributeMsg(List<String> expectedKeys) {
310   - List<TransportProtos.KeyValueProto> kvProtos = getKvProtos(expectedKeys);
311   - TransportProtos.PostAttributeMsg.Builder builder = TransportProtos.PostAttributeMsg.newBuilder();
312   - builder.addAllKv(kvProtos);
313   - return builder.build();
314   - }
315   -
316 162 protected <T> T doExecuteWithRetriesAndInterval(SupplierWithThrowable<T> supplier, int retries, int intervalMs) throws Exception {
317 163 int count = 0;
318 164 T result = null;
... ...
application/src/test/java/org/thingsboard/server/transport/TransportNoSqlTestSuite.java renamed from application/src/test/java/org/thingsboard/server/mqtt/MqttNoSqlTestSuite.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt;
  16 +package org.thingsboard.server.transport;
17 17
18 18 import org.cassandraunit.dataset.cql.ClassPathCQLDataSet;
19 19 import org.junit.BeforeClass;
... ... @@ -28,8 +28,8 @@ import java.util.Arrays;
28 28
29 29 @RunWith(ClasspathSuite.class)
30 30 @ClasspathSuite.ClassnameFilters({
31   - "org.thingsboard.server.mqtt.*.nosql.*Test"})
32   -public class MqttNoSqlTestSuite {
  31 + "org.thingsboard.server.transport.*.telemetry.timeseries.nosql.*Test"})
  32 +public class TransportNoSqlTestSuite {
33 33
34 34 @ClassRule
35 35 public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
... ...
application/src/test/java/org/thingsboard/server/transport/TransportSqlTestSuite.java renamed from application/src/test/java/org/thingsboard/server/mqtt/MqttSqlTestSuite.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt;
  16 +package org.thingsboard.server.transport;
17 17
18 18 import org.junit.BeforeClass;
19 19 import org.junit.ClassRule;
... ... @@ -26,15 +26,15 @@ import java.util.Arrays;
26 26
27 27 @RunWith(ClasspathSuite.class)
28 28 @ClasspathSuite.ClassnameFilters({
29   - "org.thingsboard.server.mqtt.rpc.sql.*Test",
30   - "org.thingsboard.server.mqtt.telemetry.timeseries.sql.*Test",
31   - "org.thingsboard.server.mqtt.telemetry.attributes.sql.*Test",
32   - "org.thingsboard.server.mqtt.attributes.updates.sql.*Test",
33   - "org.thingsboard.server.mqtt.attributes.request.sql.*Test",
34   - "org.thingsboard.server.mqtt.claim.sql.*Test",
35   - "org.thingsboard.server.mqtt.provision.sql.*Test"
  29 + "org.thingsboard.server.transport.*.rpc.sql.*Test",
  30 + "org.thingsboard.server.transport.*.telemetry.timeseries.sql.*Test",
  31 + "org.thingsboard.server.transport.*.telemetry.attributes.sql.*Test",
  32 + "org.thingsboard.server.transport.*.attributes.updates.sql.*Test",
  33 + "org.thingsboard.server.transport.*.attributes.request.sql.*Test",
  34 + "org.thingsboard.server.transport.*.claim.sql.*Test",
  35 + "org.thingsboard.server.transport.*.provision.sql.*Test"
36 36 })
37   -public class MqttSqlTestSuite {
  37 +public class TransportSqlTestSuite {
38 38
39 39 @ClassRule
40 40 public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.eclipse.californium.core.CoapClient;
  20 +import org.junit.Assert;
  21 +import org.springframework.util.StringUtils;
  22 +import org.thingsboard.server.common.data.CoapDeviceType;
  23 +import org.thingsboard.server.common.data.Device;
  24 +import org.thingsboard.server.common.data.DeviceProfile;
  25 +import org.thingsboard.server.common.data.DeviceProfileProvisionType;
  26 +import org.thingsboard.server.common.data.DeviceProfileType;
  27 +import org.thingsboard.server.common.data.DeviceTransportType;
  28 +import org.thingsboard.server.common.data.Tenant;
  29 +import org.thingsboard.server.common.data.TransportPayloadType;
  30 +import org.thingsboard.server.common.data.User;
  31 +import org.thingsboard.server.common.data.device.profile.AllowCreateNewDevicesDeviceProfileProvisionConfiguration;
  32 +import org.thingsboard.server.common.data.device.profile.CheckPreProvisionedDevicesDeviceProfileProvisionConfiguration;
  33 +import org.thingsboard.server.common.data.device.profile.CoapDeviceProfileTransportConfiguration;
  34 +import org.thingsboard.server.common.data.device.profile.CoapDeviceTypeConfiguration;
  35 +import org.thingsboard.server.common.data.device.profile.DefaultCoapDeviceTypeConfiguration;
  36 +import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileConfiguration;
  37 +import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
  38 +import org.thingsboard.server.common.data.device.profile.DeviceProfileProvisionConfiguration;
  39 +import org.thingsboard.server.common.data.device.profile.DisabledDeviceProfileProvisionConfiguration;
  40 +import org.thingsboard.server.common.data.device.profile.EfentoCoapDeviceTypeConfiguration;
  41 +import org.thingsboard.server.common.data.device.profile.JsonTransportPayloadConfiguration;
  42 +import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
  43 +import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
  44 +import org.thingsboard.server.common.data.security.Authority;
  45 +import org.thingsboard.server.common.data.security.DeviceCredentials;
  46 +import org.thingsboard.server.common.msg.session.FeatureType;
  47 +import org.thingsboard.server.transport.AbstractTransportIntegrationTest;
  48 +
  49 +import static org.junit.Assert.assertEquals;
  50 +import static org.junit.Assert.assertNotNull;
  51 +
  52 +@Slf4j
  53 +public abstract class AbstractCoapIntegrationTest extends AbstractTransportIntegrationTest {
  54 +
  55 + protected void processBeforeTest(String deviceName, CoapDeviceType coapDeviceType, TransportPayloadType payloadType) throws Exception {
  56 + this.processBeforeTest(deviceName, coapDeviceType, payloadType, null, null, DeviceProfileProvisionType.DISABLED, null, null);
  57 + }
  58 +
  59 + protected void processBeforeTest(String deviceName,
  60 + CoapDeviceType coapDeviceType,
  61 + TransportPayloadType payloadType,
  62 + String telemetryProtoSchema,
  63 + String attributesProtoSchema,
  64 + DeviceProfileProvisionType provisionType,
  65 + String provisionKey, String provisionSecret
  66 + ) throws Exception {
  67 + loginSysAdmin();
  68 +
  69 + Tenant tenant = new Tenant();
  70 + tenant.setTitle("My tenant");
  71 + savedTenant = doPost("/api/tenant", tenant, Tenant.class);
  72 + Assert.assertNotNull(savedTenant);
  73 +
  74 + tenantAdmin = new User();
  75 + tenantAdmin.setAuthority(Authority.TENANT_ADMIN);
  76 + tenantAdmin.setTenantId(savedTenant.getId());
  77 + tenantAdmin.setEmail("tenant" + atomicInteger.getAndIncrement() + "@thingsboard.org");
  78 + tenantAdmin.setFirstName("Joe");
  79 + tenantAdmin.setLastName("Downs");
  80 +
  81 + tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1");
  82 +
  83 + Device device = new Device();
  84 + device.setName(deviceName);
  85 + device.setType("default");
  86 +
  87 + if (coapDeviceType != null) {
  88 + DeviceProfile coapDeviceProfile = createCoapDeviceProfile(payloadType, coapDeviceType, attributesProtoSchema, provisionType, provisionKey, provisionSecret, telemetryProtoSchema);
  89 + deviceProfile = doPost("/api/deviceProfile", coapDeviceProfile, DeviceProfile.class);
  90 + device.setType(deviceProfile.getName());
  91 + device.setDeviceProfileId(deviceProfile.getId());
  92 + }
  93 +
  94 + savedDevice = doPost("/api/device", device, Device.class);
  95 +
  96 + DeviceCredentials deviceCredentials =
  97 + doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class);
  98 +
  99 + assertEquals(savedDevice.getId(), deviceCredentials.getDeviceId());
  100 + accessToken = deviceCredentials.getCredentialsId();
  101 + assertNotNull(accessToken);
  102 +
  103 + }
  104 +
  105 + protected DeviceProfile createCoapDeviceProfile(TransportPayloadType transportPayloadType, CoapDeviceType coapDeviceType,
  106 + String attributesProtoSchema, DeviceProfileProvisionType provisionType,
  107 + String provisionKey, String provisionSecret, String telemetryProtoSchema) {
  108 + DeviceProfile deviceProfile = new DeviceProfile();
  109 + deviceProfile.setName(transportPayloadType.name());
  110 + deviceProfile.setType(DeviceProfileType.DEFAULT);
  111 + deviceProfile.setProvisionType(provisionType);
  112 + deviceProfile.setProvisionDeviceKey(provisionKey);
  113 + deviceProfile.setDescription(transportPayloadType.name() + " Test");
  114 + DeviceProfileData deviceProfileData = new DeviceProfileData();
  115 + DefaultDeviceProfileConfiguration configuration = new DefaultDeviceProfileConfiguration();
  116 + deviceProfile.setTransportType(DeviceTransportType.COAP);
  117 + CoapDeviceProfileTransportConfiguration coapDeviceProfileTransportConfiguration = new CoapDeviceProfileTransportConfiguration();
  118 + CoapDeviceTypeConfiguration coapDeviceTypeConfiguration;
  119 + if (CoapDeviceType.DEFAULT.equals(coapDeviceType)) {
  120 + DefaultCoapDeviceTypeConfiguration defaultCoapDeviceTypeConfiguration = new DefaultCoapDeviceTypeConfiguration();
  121 + TransportPayloadTypeConfiguration transportPayloadTypeConfiguration;
  122 + if (TransportPayloadType.PROTOBUF.equals(transportPayloadType)) {
  123 + ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = new ProtoTransportPayloadConfiguration();
  124 + if (StringUtils.isEmpty(telemetryProtoSchema)) {
  125 + telemetryProtoSchema = DEVICE_TELEMETRY_PROTO_SCHEMA;
  126 + }
  127 + if (StringUtils.isEmpty(attributesProtoSchema)) {
  128 + attributesProtoSchema = DEVICE_ATTRIBUTES_PROTO_SCHEMA;
  129 + }
  130 + protoTransportPayloadConfiguration.setDeviceTelemetryProtoSchema(telemetryProtoSchema);
  131 + protoTransportPayloadConfiguration.setDeviceAttributesProtoSchema(attributesProtoSchema);
  132 + transportPayloadTypeConfiguration = protoTransportPayloadConfiguration;
  133 + } else {
  134 + transportPayloadTypeConfiguration = new JsonTransportPayloadConfiguration();
  135 + }
  136 + defaultCoapDeviceTypeConfiguration.setTransportPayloadTypeConfiguration(transportPayloadTypeConfiguration);
  137 + coapDeviceTypeConfiguration = defaultCoapDeviceTypeConfiguration;
  138 + } else {
  139 + coapDeviceTypeConfiguration = new EfentoCoapDeviceTypeConfiguration();
  140 + }
  141 + coapDeviceProfileTransportConfiguration.setCoapDeviceTypeConfiguration(coapDeviceTypeConfiguration);
  142 + deviceProfileData.setTransportConfiguration(coapDeviceProfileTransportConfiguration);
  143 + DeviceProfileProvisionConfiguration provisionConfiguration;
  144 + switch (provisionType) {
  145 + case ALLOW_CREATE_NEW_DEVICES:
  146 + provisionConfiguration = new AllowCreateNewDevicesDeviceProfileProvisionConfiguration(provisionSecret);
  147 + break;
  148 + case CHECK_PRE_PROVISIONED_DEVICES:
  149 + provisionConfiguration = new CheckPreProvisionedDevicesDeviceProfileProvisionConfiguration(provisionSecret);
  150 + break;
  151 + case DISABLED:
  152 + default:
  153 + provisionConfiguration = new DisabledDeviceProfileProvisionConfiguration(provisionSecret);
  154 + break;
  155 + }
  156 + deviceProfileData.setProvisionConfiguration(provisionConfiguration);
  157 + deviceProfileData.setConfiguration(configuration);
  158 + deviceProfile.setProfileData(deviceProfileData);
  159 + deviceProfile.setDefault(false);
  160 + deviceProfile.setDefaultRuleChainId(null);
  161 + return deviceProfile;
  162 + }
  163 +
  164 + protected CoapClient getCoapClient(FeatureType featureType) {
  165 + return new CoapClient(getFeatureTokenUrl(accessToken, featureType));
  166 + }
  167 +
  168 + protected CoapClient getCoapClient(String featureTokenUrl) {
  169 + return new CoapClient(featureTokenUrl);
  170 + }
  171 +
  172 + protected String getFeatureTokenUrl(String token, FeatureType featureType) {
  173 + return COAP_BASE_URL + token + "/" + featureType.name().toLowerCase();
  174 + }
  175 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest;
  20 +import org.thingsboard.server.common.data.CoapDeviceType;
  21 +import org.thingsboard.server.common.data.TransportPayloadType;
  22 +import org.thingsboard.server.gen.transport.TransportProtos;
  23 +
  24 +import java.util.ArrayList;
  25 +import java.util.List;
  26 +
  27 +@Slf4j
  28 +public abstract class AbstractCoapAttributesIntegrationTest extends AbstractCoapIntegrationTest {
  29 +
  30 + protected static final String POST_ATTRIBUTES_PAYLOAD = "{\"attribute1\":\"value1\",\"attribute2\":true,\"attribute3\":42.0,\"attribute4\":73," +
  31 + "\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}}";
  32 +
  33 + protected void processBeforeTest(String deviceName, CoapDeviceType coapDeviceType, TransportPayloadType payloadType) throws Exception {
  34 + super.processBeforeTest(deviceName, coapDeviceType, payloadType);
  35 + }
  36 +
  37 + protected void processAfterTest() throws Exception {
  38 + super.processAfterTest();
  39 + }
  40 +
  41 + protected List<TransportProtos.TsKvProto> getTsKvProtoList() {
  42 + TransportProtos.TsKvProto tsKvProtoAttribute1 = getTsKvProto("attribute1", "value1", TransportProtos.KeyValueType.STRING_V);
  43 + TransportProtos.TsKvProto tsKvProtoAttribute2 = getTsKvProto("attribute2", "true", TransportProtos.KeyValueType.BOOLEAN_V);
  44 + TransportProtos.TsKvProto tsKvProtoAttribute3 = getTsKvProto("attribute3", "42.0", TransportProtos.KeyValueType.DOUBLE_V);
  45 + TransportProtos.TsKvProto tsKvProtoAttribute4 = getTsKvProto("attribute4", "73", TransportProtos.KeyValueType.LONG_V);
  46 + TransportProtos.TsKvProto tsKvProtoAttribute5 = getTsKvProto("attribute5", "{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}", TransportProtos.KeyValueType.JSON_V);
  47 + List<TransportProtos.TsKvProto> tsKvProtoList = new ArrayList<>();
  48 + tsKvProtoList.add(tsKvProtoAttribute1);
  49 + tsKvProtoList.add(tsKvProtoAttribute2);
  50 + tsKvProtoList.add(tsKvProtoAttribute3);
  51 + tsKvProtoList.add(tsKvProtoAttribute4);
  52 + tsKvProtoList.add(tsKvProtoAttribute5);
  53 + return tsKvProtoList;
  54 + }
  55 +
  56 + protected TransportProtos.TsKvProto getTsKvProto(String key, String value, TransportProtos.KeyValueType keyValueType) {
  57 + TransportProtos.TsKvProto.Builder tsKvProtoBuilder = TransportProtos.TsKvProto.newBuilder();
  58 + TransportProtos.KeyValueProto keyValueProto = getKeyValueProto(key, value, keyValueType);
  59 + tsKvProtoBuilder.setKv(keyValueProto);
  60 + return tsKvProtoBuilder.build();
  61 + }
  62 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.request;
  17 +
  18 +import com.fasterxml.jackson.core.type.TypeReference;
  19 +import com.google.protobuf.InvalidProtocolBufferException;
  20 +import lombok.extern.slf4j.Slf4j;
  21 +import org.eclipse.californium.core.CoapClient;
  22 +import org.eclipse.californium.core.CoapResponse;
  23 +import org.eclipse.californium.core.coap.CoAP;
  24 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  25 +import org.junit.After;
  26 +import org.junit.Before;
  27 +import org.junit.Test;
  28 +import org.thingsboard.server.transport.coap.attributes.AbstractCoapAttributesIntegrationTest;
  29 +import org.thingsboard.server.common.msg.session.FeatureType;
  30 +import org.thingsboard.server.dao.util.mapping.JacksonUtil;
  31 +
  32 +import java.nio.charset.StandardCharsets;
  33 +import java.util.List;
  34 +
  35 +import static org.junit.Assert.assertEquals;
  36 +import static org.junit.Assert.assertNotNull;
  37 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  38 +
  39 +@Slf4j
  40 +public abstract class AbstractCoapAttributesRequestIntegrationTest extends AbstractCoapAttributesIntegrationTest {
  41 +
  42 + protected static final long CLIENT_REQUEST_TIMEOUT = 60000L;
  43 +
  44 + @Before
  45 + public void beforeTest() throws Exception {
  46 + processBeforeTest("Test Request attribute values from the server", null, null);
  47 + }
  48 +
  49 + @After
  50 + public void afterTest() throws Exception {
  51 + processAfterTest();
  52 + }
  53 +
  54 + @Test
  55 + public void testRequestAttributesValuesFromTheServer() throws Exception {
  56 + processTestRequestAttributesValuesFromTheServer();
  57 + }
  58 +
  59 + protected void processTestRequestAttributesValuesFromTheServer() throws Exception {
  60 + postAttributes();
  61 +
  62 + long start = System.currentTimeMillis();
  63 + long end = System.currentTimeMillis() + 5000;
  64 +
  65 + List<String> savedAttributeKeys = null;
  66 + while (start <= end) {
  67 + savedAttributeKeys = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/keys/attributes/CLIENT_SCOPE", new TypeReference<>() {});
  68 + if (savedAttributeKeys.size() == 5) {
  69 + break;
  70 + }
  71 + Thread.sleep(100);
  72 + start += 100;
  73 + }
  74 + assertNotNull(savedAttributeKeys);
  75 +
  76 + String keys = "attribute1,attribute2,attribute3,attribute4,attribute5";
  77 + String featureTokenUrl = getFeatureTokenUrl(accessToken, FeatureType.ATTRIBUTES) + "?clientKeys=" + keys + "&sharedKeys=" + keys;
  78 + CoapClient client = getCoapClient(featureTokenUrl);
  79 +
  80 + CoapResponse getAttributesResponse = client.setTimeout(CLIENT_REQUEST_TIMEOUT).get();
  81 + validateResponse(getAttributesResponse);
  82 + }
  83 +
  84 + protected void postAttributes() throws Exception {
  85 + doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", POST_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
  86 + CoapClient client = getCoapClient(FeatureType.ATTRIBUTES);
  87 + CoapResponse coapResponse = client.setTimeout(CLIENT_REQUEST_TIMEOUT).post(POST_ATTRIBUTES_PAYLOAD.getBytes(), MediaTypeRegistry.APPLICATION_JSON);
  88 + assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode());
  89 + }
  90 +
  91 + protected void validateResponse(CoapResponse getAttributesResponse) throws InvalidProtocolBufferException {
  92 + assertEquals(CoAP.ResponseCode.CONTENT, getAttributesResponse.getCode());
  93 + 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\"}}}}";
  94 + assertEquals(JacksonUtil.toJsonNode(expectedRequestPayload), JacksonUtil.toJsonNode(new String(getAttributesResponse.getPayload(), StandardCharsets.UTF_8)));
  95 + }
  96 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.request;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.junit.After;
  20 +import org.junit.Before;
  21 +import org.junit.Test;
  22 +import org.thingsboard.server.common.data.CoapDeviceType;
  23 +import org.thingsboard.server.common.data.TransportPayloadType;
  24 +
  25 +@Slf4j
  26 +public abstract class AbstractCoapAttributesRequestJsonIntegrationTest extends AbstractCoapAttributesRequestIntegrationTest {
  27 +
  28 + @Before
  29 + public void beforeTest() throws Exception {
  30 + processBeforeTest("Test Request attribute values from the server json", CoapDeviceType.DEFAULT, TransportPayloadType.JSON);
  31 + }
  32 +
  33 + @After
  34 + public void afterTest() throws Exception {
  35 + processAfterTest();
  36 + }
  37 +
  38 + @Test
  39 + public void testRequestAttributesValuesFromTheServer() throws Exception {
  40 + super.testRequestAttributesValuesFromTheServer();
  41 + }
  42 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.request;
  17 +
  18 +import com.github.os72.protobuf.dynamic.DynamicSchema;
  19 +import com.google.protobuf.Descriptors;
  20 +import com.google.protobuf.DynamicMessage;
  21 +import com.google.protobuf.InvalidProtocolBufferException;
  22 +import com.squareup.wire.schema.internal.parser.ProtoFileElement;
  23 +import lombok.extern.slf4j.Slf4j;
  24 +import org.eclipse.californium.core.CoapClient;
  25 +import org.eclipse.californium.core.CoapResponse;
  26 +import org.eclipse.californium.core.coap.CoAP;
  27 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  28 +import org.junit.After;
  29 +import org.junit.Test;
  30 +import org.thingsboard.server.common.data.CoapDeviceType;
  31 +import org.thingsboard.server.common.data.DeviceProfileProvisionType;
  32 +import org.thingsboard.server.common.data.TransportPayloadType;
  33 +import org.thingsboard.server.common.data.device.profile.CoapDeviceProfileTransportConfiguration;
  34 +import org.thingsboard.server.common.data.device.profile.CoapDeviceTypeConfiguration;
  35 +import org.thingsboard.server.common.data.device.profile.DefaultCoapDeviceTypeConfiguration;
  36 +import org.thingsboard.server.common.data.device.profile.DeviceProfileTransportConfiguration;
  37 +import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
  38 +import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
  39 +import org.thingsboard.server.common.msg.session.FeatureType;
  40 +import org.thingsboard.server.gen.transport.TransportProtos;
  41 +
  42 +import java.util.List;
  43 +import java.util.stream.Collectors;
  44 +
  45 +import static org.junit.Assert.assertEquals;
  46 +import static org.junit.Assert.assertNotNull;
  47 +import static org.junit.Assert.assertTrue;
  48 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  49 +
  50 +@Slf4j
  51 +public abstract class AbstractCoapAttributesRequestProtoIntegrationTest extends AbstractCoapAttributesRequestIntegrationTest {
  52 +
  53 + public static final String ATTRIBUTES_SCHEMA_STR = "syntax =\"proto3\";\n" +
  54 + "\n" +
  55 + "package test;\n" +
  56 + "\n" +
  57 + "message PostAttributes {\n" +
  58 + " string attribute1 = 1;\n" +
  59 + " bool attribute2 = 2;\n" +
  60 + " double attribute3 = 3;\n" +
  61 + " int32 attribute4 = 4;\n" +
  62 + " JsonObject attribute5 = 5;\n" +
  63 + "\n" +
  64 + " message JsonObject {\n" +
  65 + " int32 someNumber = 6;\n" +
  66 + " repeated int32 someArray = 7;\n" +
  67 + " NestedJsonObject someNestedObject = 8;\n" +
  68 + " message NestedJsonObject {\n" +
  69 + " string key = 9;\n" +
  70 + " }\n" +
  71 + " }\n" +
  72 + "}";
  73 +
  74 + @After
  75 + public void afterTest() throws Exception {
  76 + processAfterTest();
  77 + }
  78 +
  79 + @Test
  80 + public void testRequestAttributesValuesFromTheServer() throws Exception {
  81 + super.processBeforeTest("Test Request attribute values from the server proto", CoapDeviceType.DEFAULT,
  82 + TransportPayloadType.PROTOBUF, null, ATTRIBUTES_SCHEMA_STR, DeviceProfileProvisionType.DISABLED, null, null);
  83 + processTestRequestAttributesValuesFromTheServer();
  84 + }
  85 +
  86 + protected void postAttributes() throws Exception {
  87 + doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", POST_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
  88 + DeviceProfileTransportConfiguration transportConfiguration = deviceProfile.getProfileData().getTransportConfiguration();
  89 + assertTrue(transportConfiguration instanceof CoapDeviceProfileTransportConfiguration);
  90 + CoapDeviceProfileTransportConfiguration coapTransportConfiguration = (CoapDeviceProfileTransportConfiguration) transportConfiguration;
  91 + CoapDeviceTypeConfiguration coapDeviceTypeConfiguration = coapTransportConfiguration.getCoapDeviceTypeConfiguration();
  92 + assertTrue(coapDeviceTypeConfiguration instanceof DefaultCoapDeviceTypeConfiguration);
  93 + DefaultCoapDeviceTypeConfiguration defaultCoapDeviceTypeConfiguration = (DefaultCoapDeviceTypeConfiguration) coapDeviceTypeConfiguration;
  94 + TransportPayloadTypeConfiguration transportPayloadTypeConfiguration = defaultCoapDeviceTypeConfiguration.getTransportPayloadTypeConfiguration();
  95 + assertTrue(transportPayloadTypeConfiguration instanceof ProtoTransportPayloadConfiguration);
  96 + ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration;
  97 + ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(ATTRIBUTES_SCHEMA_STR);
  98 + DynamicSchema attributesSchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, ProtoTransportPayloadConfiguration.ATTRIBUTES_PROTO_SCHEMA);
  99 +
  100 + DynamicMessage.Builder nestedJsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject.NestedJsonObject");
  101 + Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType();
  102 + assertNotNull(nestedJsonObjectBuilderDescriptor);
  103 + DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build();
  104 +
  105 + DynamicMessage.Builder jsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject");
  106 + Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType();
  107 + assertNotNull(jsonObjectBuilderDescriptor);
  108 + DynamicMessage jsonObject = jsonObjectBuilder
  109 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42)
  110 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1)
  111 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2)
  112 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3)
  113 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject)
  114 + .build();
  115 +
  116 + DynamicMessage.Builder postAttributesBuilder = attributesSchema.newMessageBuilder("PostAttributes");
  117 + Descriptors.Descriptor postAttributesMsgDescriptor = postAttributesBuilder.getDescriptorForType();
  118 + assertNotNull(postAttributesMsgDescriptor);
  119 + DynamicMessage postAttributesMsg = postAttributesBuilder
  120 + .setField(postAttributesMsgDescriptor.findFieldByName("attribute1"), "value1")
  121 + .setField(postAttributesMsgDescriptor.findFieldByName("attribute2"), true)
  122 + .setField(postAttributesMsgDescriptor.findFieldByName("attribute3"), 42.0)
  123 + .setField(postAttributesMsgDescriptor.findFieldByName("attribute4"), 73)
  124 + .setField(postAttributesMsgDescriptor.findFieldByName("attribute5"), jsonObject)
  125 + .build();
  126 + byte[] payload = postAttributesMsg.toByteArray();
  127 + CoapClient client = getCoapClient(FeatureType.ATTRIBUTES);
  128 + CoapResponse coapResponse = client.setTimeout(CLIENT_REQUEST_TIMEOUT).post(payload, MediaTypeRegistry.APPLICATION_JSON);
  129 + assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode());
  130 + }
  131 +
  132 + protected void validateResponse(CoapResponse getAttributesResponse) throws InvalidProtocolBufferException {
  133 + TransportProtos.GetAttributeResponseMsg expectedAttributesResponse = getExpectedAttributeResponseMsg();
  134 + TransportProtos.GetAttributeResponseMsg actualAttributesResponse = TransportProtos.GetAttributeResponseMsg.parseFrom(getAttributesResponse.getPayload());
  135 + assertEquals(expectedAttributesResponse.getRequestId(), actualAttributesResponse.getRequestId());
  136 + List<TransportProtos.KeyValueProto> expectedClientKeyValueProtos = expectedAttributesResponse.getClientAttributeListList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList());
  137 + List<TransportProtos.KeyValueProto> expectedSharedKeyValueProtos = expectedAttributesResponse.getSharedAttributeListList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList());
  138 + List<TransportProtos.KeyValueProto> actualClientKeyValueProtos = actualAttributesResponse.getClientAttributeListList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList());
  139 + List<TransportProtos.KeyValueProto> actualSharedKeyValueProtos = actualAttributesResponse.getSharedAttributeListList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList());
  140 + assertTrue(actualClientKeyValueProtos.containsAll(expectedClientKeyValueProtos));
  141 + assertTrue(actualSharedKeyValueProtos.containsAll(expectedSharedKeyValueProtos));
  142 + }
  143 +
  144 + private TransportProtos.GetAttributeResponseMsg getExpectedAttributeResponseMsg() {
  145 + TransportProtos.GetAttributeResponseMsg.Builder result = TransportProtos.GetAttributeResponseMsg.newBuilder();
  146 + List<TransportProtos.TsKvProto> tsKvProtoList = getTsKvProtoList();
  147 + result.addAllClientAttributeList(tsKvProtoList);
  148 + result.addAllSharedAttributeList(tsKvProtoList);
  149 + result.setRequestId(0);
  150 + return result.build();
  151 + }
  152 +
  153 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.request.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.attributes.request.AbstractCoapAttributesRequestJsonIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapAttributesRequestJsonSqlIntegrationTest extends AbstractCoapAttributesRequestJsonIntegrationTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.request.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.attributes.request.AbstractCoapAttributesRequestProtoIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapAttributesRequestProtoSqlIntegrationTest extends AbstractCoapAttributesRequestProtoIntegrationTest {
  23 +}
... ...
application/src/test/java/org/thingsboard/server/transport/coap/attributes/request/sql/CoapAttributesRequestSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/nosql/MqttAttributesNoSqlProtoIntegrationTest.java
... ... @@ -13,11 +13,11 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes.nosql;
  16 +package org.thingsboard.server.transport.coap.attributes.request.sql;
17 17
18   -import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.attributes.AbstractMqttAttributesProtoIntegrationTest;
  18 +import org.thingsboard.server.transport.coap.attributes.request.AbstractCoapAttributesRequestIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
20 20
21   -@DaoNoSqlTest
22   -public class MqttAttributesNoSqlProtoIntegrationTest extends AbstractMqttAttributesProtoIntegrationTest {
  21 +@DaoSqlTest
  22 +public class CoapAttributesRequestSqlIntegrationTest extends AbstractCoapAttributesRequestIntegrationTest {
23 23 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.updates;
  17 +
  18 +import com.google.protobuf.InvalidProtocolBufferException;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.eclipse.californium.core.CoapClient;
  21 +import org.eclipse.californium.core.CoapHandler;
  22 +import org.eclipse.californium.core.CoapObserveRelation;
  23 +import org.eclipse.californium.core.CoapResponse;
  24 +import org.eclipse.californium.core.coap.CoAP;
  25 +import org.eclipse.californium.core.coap.Request;
  26 +import org.junit.After;
  27 +import org.junit.Before;
  28 +import org.junit.Test;
  29 +import org.thingsboard.server.transport.coap.attributes.AbstractCoapAttributesIntegrationTest;
  30 +import org.thingsboard.server.common.msg.session.FeatureType;
  31 +import org.thingsboard.server.dao.util.mapping.JacksonUtil;
  32 +
  33 +import java.nio.charset.StandardCharsets;
  34 +import java.util.concurrent.CountDownLatch;
  35 +import java.util.concurrent.TimeUnit;
  36 +
  37 +import static org.junit.Assert.assertEquals;
  38 +import static org.junit.Assert.assertNotNull;
  39 +import static org.junit.Assert.assertTrue;
  40 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  41 +
  42 +@Slf4j
  43 +public abstract class AbstractCoapAttributesUpdatesIntegrationTest extends AbstractCoapAttributesIntegrationTest {
  44 +
  45 + private static final String RESPONSE_ATTRIBUTES_PAYLOAD_DELETED = "{\"deleted\":[\"attribute5\"]}";
  46 +
  47 + @Before
  48 + public void beforeTest() throws Exception {
  49 + processBeforeTest("Test Subscribe to attribute updates", null, null);
  50 + }
  51 +
  52 + @After
  53 + public void afterTest() throws Exception {
  54 + processAfterTest();
  55 + }
  56 +
  57 + @Test
  58 + public void testSubscribeToAttributesUpdatesFromTheServer() throws Exception {
  59 + processTestSubscribeToAttributesUpdates();
  60 + }
  61 +
  62 + protected void processTestSubscribeToAttributesUpdates() throws Exception {
  63 +
  64 + CoapClient client = getCoapClient(FeatureType.ATTRIBUTES);
  65 +
  66 + CountDownLatch latch = new CountDownLatch(1);
  67 + TestCoapCallback testCoapCallback = new TestCoapCallback(latch);
  68 +
  69 + Request request = Request.newGet().setObserve();
  70 + request.setType(CoAP.Type.CON);
  71 + CoapObserveRelation observeRelation = client.observe(request, testCoapCallback);
  72 +
  73 + Thread.sleep(1000);
  74 +
  75 + doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", POST_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
  76 + latch.await(3, TimeUnit.SECONDS);
  77 +
  78 + validateUpdateAttributesResponse(testCoapCallback);
  79 +
  80 + latch = new CountDownLatch(1);
  81 +
  82 + doDelete("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/SHARED_SCOPE?keys=attribute5", String.class);
  83 + latch.await(3, TimeUnit.SECONDS);
  84 +
  85 + validateDeleteAttributesResponse(testCoapCallback);
  86 +
  87 + observeRelation.proactiveCancel();
  88 + assertTrue(observeRelation.isCanceled());
  89 + }
  90 +
  91 + protected void validateUpdateAttributesResponse(TestCoapCallback callback) throws InvalidProtocolBufferException {
  92 + assertNotNull(callback.getPayloadBytes());
  93 + assertNotNull(callback.getObserve());
  94 + assertEquals(0, callback.getObserve().intValue());
  95 + String response = new String(callback.getPayloadBytes(), StandardCharsets.UTF_8);
  96 + assertEquals(JacksonUtil.toJsonNode(POST_ATTRIBUTES_PAYLOAD), JacksonUtil.toJsonNode(response));
  97 + }
  98 +
  99 + protected void validateDeleteAttributesResponse(TestCoapCallback callback) throws InvalidProtocolBufferException {
  100 + assertNotNull(callback.getPayloadBytes());
  101 + assertNotNull(callback.getObserve());
  102 + assertEquals(1, callback.getObserve().intValue());
  103 + String response = new String(callback.getPayloadBytes(), StandardCharsets.UTF_8);
  104 + assertEquals(JacksonUtil.toJsonNode(RESPONSE_ATTRIBUTES_PAYLOAD_DELETED), JacksonUtil.toJsonNode(response));
  105 + }
  106 +
  107 + protected static class TestCoapCallback implements CoapHandler {
  108 +
  109 + private final CountDownLatch latch;
  110 +
  111 + private Integer observe;
  112 + private byte[] payloadBytes;
  113 +
  114 + public byte[] getPayloadBytes() {
  115 + return payloadBytes;
  116 + }
  117 +
  118 + public Integer getObserve() {
  119 + return observe;
  120 + }
  121 +
  122 + private TestCoapCallback(CountDownLatch latch) {
  123 + this.latch = latch;
  124 + }
  125 +
  126 + @Override
  127 + public void onLoad(CoapResponse response) {
  128 + assertNotNull(response.getPayload());
  129 + assertEquals(response.getCode(), CoAP.ResponseCode.CONTENT);
  130 + observe = response.getOptions().getObserve();
  131 + payloadBytes = response.getPayload();
  132 + latch.countDown();
  133 + }
  134 +
  135 + @Override
  136 + public void onError() {
  137 + log.warn("Command Response Ack Error, No connect");
  138 + }
  139 +
  140 + }
  141 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.updates;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.junit.After;
  20 +import org.junit.Before;
  21 +import org.junit.Test;
  22 +import org.thingsboard.server.common.data.CoapDeviceType;
  23 +import org.thingsboard.server.common.data.TransportPayloadType;
  24 +
  25 +@Slf4j
  26 +public abstract class AbstractCoapAttributesUpdatesJsonIntegrationTest extends AbstractCoapAttributesUpdatesIntegrationTest {
  27 +
  28 + @Before
  29 + public void beforeTest() throws Exception {
  30 + processBeforeTest("Test Subscribe to attribute updates", CoapDeviceType.DEFAULT, TransportPayloadType.JSON);
  31 + }
  32 +
  33 + @After
  34 + public void afterTest() throws Exception {
  35 + processAfterTest();
  36 + }
  37 +
  38 + @Test
  39 + public void testSubscribeToAttributesUpdatesFromTheServer() throws Exception {
  40 + super.testSubscribeToAttributesUpdatesFromTheServer();
  41 + }
  42 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.updates;
  17 +
  18 +import com.google.protobuf.InvalidProtocolBufferException;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.junit.After;
  21 +import org.junit.Before;
  22 +import org.junit.Test;
  23 +import org.thingsboard.server.common.data.CoapDeviceType;
  24 +import org.thingsboard.server.common.data.TransportPayloadType;
  25 +import org.thingsboard.server.gen.transport.TransportProtos;
  26 +
  27 +import java.util.List;
  28 +import java.util.stream.Collectors;
  29 +
  30 +import static org.junit.Assert.assertEquals;
  31 +import static org.junit.Assert.assertNotNull;
  32 +import static org.junit.Assert.assertTrue;
  33 +
  34 +@Slf4j
  35 +public abstract class AbstractCoapAttributesUpdatesProtoIntegrationTest extends AbstractCoapAttributesUpdatesIntegrationTest {
  36 +
  37 + @Before
  38 + public void beforeTest() throws Exception {
  39 + processBeforeTest("Test Subscribe to attribute updates", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF);
  40 + }
  41 +
  42 + @After
  43 + public void afterTest() throws Exception {
  44 + processAfterTest();
  45 + }
  46 +
  47 + @Test
  48 + public void testSubscribeToAttributesUpdatesFromTheServer() throws Exception {
  49 + processTestSubscribeToAttributesUpdates();
  50 + }
  51 +
  52 + protected void validateUpdateAttributesResponse(TestCoapCallback callback) throws InvalidProtocolBufferException {
  53 + assertNotNull(callback.getPayloadBytes());
  54 + TransportProtos.AttributeUpdateNotificationMsg.Builder attributeUpdateNotificationMsgBuilder = TransportProtos.AttributeUpdateNotificationMsg.newBuilder();
  55 + List<TransportProtos.TsKvProto> tsKvProtoList = getTsKvProtoList();
  56 + attributeUpdateNotificationMsgBuilder.addAllSharedUpdated(tsKvProtoList);
  57 +
  58 + TransportProtos.AttributeUpdateNotificationMsg expectedAttributeUpdateNotificationMsg = attributeUpdateNotificationMsgBuilder.build();
  59 + TransportProtos.AttributeUpdateNotificationMsg actualAttributeUpdateNotificationMsg = TransportProtos.AttributeUpdateNotificationMsg.parseFrom(callback.getPayloadBytes());
  60 +
  61 + List<TransportProtos.KeyValueProto> actualSharedUpdatedList = actualAttributeUpdateNotificationMsg.getSharedUpdatedList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList());
  62 + List<TransportProtos.KeyValueProto> expectedSharedUpdatedList = expectedAttributeUpdateNotificationMsg.getSharedUpdatedList().stream().map(TransportProtos.TsKvProto::getKv).collect(Collectors.toList());
  63 +
  64 + assertEquals(expectedSharedUpdatedList.size(), actualSharedUpdatedList.size());
  65 + assertTrue(actualSharedUpdatedList.containsAll(expectedSharedUpdatedList));
  66 +
  67 + }
  68 +
  69 + protected void validateDeleteAttributesResponse(TestCoapCallback callback) throws InvalidProtocolBufferException {
  70 + assertNotNull(callback.getPayloadBytes());
  71 + TransportProtos.AttributeUpdateNotificationMsg.Builder attributeUpdateNotificationMsgBuilder = TransportProtos.AttributeUpdateNotificationMsg.newBuilder();
  72 + attributeUpdateNotificationMsgBuilder.addSharedDeleted("attribute5");
  73 +
  74 + TransportProtos.AttributeUpdateNotificationMsg expectedAttributeUpdateNotificationMsg = attributeUpdateNotificationMsgBuilder.build();
  75 + TransportProtos.AttributeUpdateNotificationMsg actualAttributeUpdateNotificationMsg = TransportProtos.AttributeUpdateNotificationMsg.parseFrom(callback.getPayloadBytes());
  76 +
  77 + assertEquals(expectedAttributeUpdateNotificationMsg.getSharedDeletedList().size(), actualAttributeUpdateNotificationMsg.getSharedDeletedList().size());
  78 + assertEquals("attribute5", actualAttributeUpdateNotificationMsg.getSharedDeletedList().get(0));
  79 +
  80 + }
  81 +
  82 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.updates.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.attributes.updates.AbstractCoapAttributesUpdatesIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapAttributesUpdatesSqlIntegrationTest extends AbstractCoapAttributesUpdatesIntegrationTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.updates.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.attributes.updates.AbstractCoapAttributesUpdatesJsonIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapAttributesUpdatesSqlJsonIntegrationTest extends AbstractCoapAttributesUpdatesJsonIntegrationTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.attributes.updates.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.attributes.updates.AbstractCoapAttributesUpdatesProtoIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapAttributesUpdatesSqlProtoIntegrationTest extends AbstractCoapAttributesUpdatesProtoIntegrationTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.claim;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.eclipse.californium.core.CoapClient;
  20 +import org.eclipse.californium.core.CoapResponse;
  21 +import org.eclipse.californium.core.coap.CoAP;
  22 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  23 +import org.eclipse.californium.elements.exception.ConnectorException;
  24 +import org.junit.After;
  25 +import org.junit.Before;
  26 +import org.junit.Test;
  27 +import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest;
  28 +import org.thingsboard.server.common.data.ClaimRequest;
  29 +import org.thingsboard.server.common.data.Customer;
  30 +import org.thingsboard.server.common.data.Device;
  31 +import org.thingsboard.server.common.data.User;
  32 +import org.thingsboard.server.common.data.security.Authority;
  33 +import org.thingsboard.server.common.msg.session.FeatureType;
  34 +import org.thingsboard.server.dao.device.claim.ClaimResponse;
  35 +import org.thingsboard.server.dao.device.claim.ClaimResult;
  36 +
  37 +import java.io.IOException;
  38 +
  39 +import static org.junit.Assert.assertEquals;
  40 +import static org.junit.Assert.assertNotNull;
  41 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  42 +
  43 +@Slf4j
  44 +public abstract class AbstractCoapClaimDeviceTest extends AbstractCoapIntegrationTest {
  45 +
  46 + protected static final String CUSTOMER_USER_PASSWORD = "customerUser123!";
  47 +
  48 + protected User customerAdmin;
  49 + protected Customer savedCustomer;
  50 +
  51 + @Before
  52 + public void beforeTest() throws Exception {
  53 + super.processBeforeTest("Test Claim device", null, null);
  54 + createCustomerAndUser();
  55 + }
  56 +
  57 + protected void createCustomerAndUser() throws Exception {
  58 + Customer customer = new Customer();
  59 + customer.setTenantId(savedTenant.getId());
  60 + customer.setTitle("Test Claiming Customer");
  61 + savedCustomer = doPost("/api/customer", customer, Customer.class);
  62 + assertNotNull(savedCustomer);
  63 + assertEquals(savedTenant.getId(), savedCustomer.getTenantId());
  64 +
  65 + User user = new User();
  66 + user.setAuthority(Authority.CUSTOMER_USER);
  67 + user.setTenantId(savedTenant.getId());
  68 + user.setCustomerId(savedCustomer.getId());
  69 + user.setEmail("customer@thingsboard.org");
  70 +
  71 + customerAdmin = createUser(user, CUSTOMER_USER_PASSWORD);
  72 + assertNotNull(customerAdmin);
  73 + assertEquals(customerAdmin.getCustomerId(), savedCustomer.getId());
  74 + }
  75 +
  76 + @After
  77 + public void afterTest() throws Exception {
  78 + super.processAfterTest();
  79 + }
  80 +
  81 + @Test
  82 + public void testClaimingDevice() throws Exception {
  83 + processTestClaimingDevice(false);
  84 + }
  85 +
  86 + @Test
  87 + public void testClaimingDeviceWithoutSecretAndDuration() throws Exception {
  88 + processTestClaimingDevice(true);
  89 + }
  90 +
  91 + protected void processTestClaimingDevice(boolean emptyPayload) throws Exception {
  92 + log.warn("[testClaimingDevice] Device: {}, Transport type: {}", savedDevice.getName(), savedDevice.getType());
  93 + CoapClient client = getCoapClient(FeatureType.CLAIM);
  94 + byte[] payloadBytes;
  95 + byte[] failurePayloadBytes;
  96 + if (emptyPayload) {
  97 + payloadBytes = "{}".getBytes();
  98 + failurePayloadBytes = "{\"durationMs\":1}".getBytes();
  99 + } else {
  100 + payloadBytes = "{\"secretKey\":\"value\", \"durationMs\":60000}".getBytes();
  101 + failurePayloadBytes = "{\"secretKey\":\"value\", \"durationMs\":1}".getBytes();
  102 + }
  103 + validateClaimResponse(emptyPayload, client, payloadBytes, failurePayloadBytes);
  104 + }
  105 +
  106 + protected void validateClaimResponse(boolean emptyPayload, CoapClient client, byte[] payloadBytes, byte[] failurePayloadBytes) throws Exception {
  107 + postClaimRequest(client, failurePayloadBytes);
  108 +
  109 + loginUser(customerAdmin.getName(), CUSTOMER_USER_PASSWORD);
  110 + ClaimRequest claimRequest;
  111 + if (!emptyPayload) {
  112 + claimRequest = new ClaimRequest("value");
  113 + } else {
  114 + claimRequest = new ClaimRequest(null);
  115 + }
  116 +
  117 + ClaimResponse claimResponse = doExecuteWithRetriesAndInterval(
  118 + () -> doPostClaimAsync("/api/customer/device/" + savedDevice.getName() + "/claim", claimRequest, ClaimResponse.class, status().isBadRequest()),
  119 + 20,
  120 + 100
  121 + );
  122 +
  123 + assertEquals(claimResponse, ClaimResponse.FAILURE);
  124 +
  125 + postClaimRequest(client, payloadBytes);
  126 +
  127 + ClaimResult claimResult = doExecuteWithRetriesAndInterval(
  128 + () -> doPostClaimAsync("/api/customer/device/" + savedDevice.getName() + "/claim", claimRequest, ClaimResult.class, status().isOk()),
  129 + 20,
  130 + 100
  131 + );
  132 + assertEquals(claimResult.getResponse(), ClaimResponse.SUCCESS);
  133 + Device claimedDevice = claimResult.getDevice();
  134 + assertNotNull(claimedDevice);
  135 + assertNotNull(claimedDevice.getCustomerId());
  136 + assertEquals(customerAdmin.getCustomerId(), claimedDevice.getCustomerId());
  137 +
  138 + claimResponse = doPostClaimAsync("/api/customer/device/" + savedDevice.getName() + "/claim", claimRequest, ClaimResponse.class, status().isBadRequest());
  139 + assertEquals(claimResponse, ClaimResponse.CLAIMED);
  140 + }
  141 +
  142 + private void postClaimRequest(CoapClient client, byte[] payload) throws IOException, ConnectorException {
  143 + CoapResponse coapResponse = client.setTimeout((long) 60000).post(payload, MediaTypeRegistry.APPLICATION_JSON);
  144 + assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode());
  145 + }
  146 +
  147 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.claim;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.junit.After;
  20 +import org.junit.Before;
  21 +import org.junit.Test;
  22 +import org.thingsboard.server.common.data.CoapDeviceType;
  23 +import org.thingsboard.server.common.data.TransportPayloadType;
  24 +
  25 +@Slf4j
  26 +public abstract class AbstractCoapClaimJsonDeviceTest extends AbstractCoapClaimDeviceTest {
  27 +
  28 + @Before
  29 + public void beforeTest() throws Exception {
  30 + super.processBeforeTest("Test Claim device Json", CoapDeviceType.DEFAULT, TransportPayloadType.JSON);
  31 + createCustomerAndUser();
  32 + }
  33 +
  34 + @After
  35 + public void afterTest() throws Exception {
  36 + super.afterTest();
  37 + }
  38 +
  39 + @Test
  40 + public void testClaimingDevice() throws Exception {
  41 + super.testClaimingDevice();
  42 + }
  43 +
  44 + @Test
  45 + public void testClaimingDeviceWithoutSecretAndDuration() throws Exception {
  46 + super.testClaimingDeviceWithoutSecretAndDuration();
  47 + }
  48 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.claim;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.eclipse.californium.core.CoapClient;
  20 +import org.junit.After;
  21 +import org.junit.Before;
  22 +import org.junit.Test;
  23 +import org.thingsboard.server.common.data.CoapDeviceType;
  24 +import org.thingsboard.server.common.data.TransportPayloadType;
  25 +import org.thingsboard.server.common.msg.session.FeatureType;
  26 +import org.thingsboard.server.gen.transport.TransportApiProtos;
  27 +
  28 +@Slf4j
  29 +public abstract class AbstractCoapClaimProtoDeviceTest extends AbstractCoapClaimDeviceTest {
  30 +
  31 + @Before
  32 + public void beforeTest() throws Exception {
  33 + processBeforeTest("Test Claim device Proto", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF);
  34 + createCustomerAndUser();
  35 + }
  36 +
  37 + @After
  38 + public void afterTest() throws Exception { super.afterTest(); }
  39 +
  40 + @Test
  41 + public void testClaimingDevice() throws Exception {
  42 + processTestClaimingDevice(false);
  43 + }
  44 +
  45 + @Test
  46 + public void testClaimingDeviceWithoutSecretAndDuration() throws Exception {
  47 + processTestClaimingDevice(true);
  48 + }
  49 +
  50 + @Override
  51 + protected void processTestClaimingDevice(boolean emptyPayload) throws Exception {
  52 + CoapClient client = getCoapClient(FeatureType.CLAIM);
  53 + byte[] payloadBytes;
  54 + if (emptyPayload) {
  55 + TransportApiProtos.ClaimDevice claimDevice = getClaimDevice(0, emptyPayload);
  56 + payloadBytes = claimDevice.toByteArray();
  57 + } else {
  58 + TransportApiProtos.ClaimDevice claimDevice = getClaimDevice(60000, emptyPayload);
  59 + payloadBytes = claimDevice.toByteArray();
  60 + }
  61 + TransportApiProtos.ClaimDevice claimDevice = getClaimDevice(1, emptyPayload);
  62 + byte[] failurePayloadBytes = claimDevice.toByteArray();
  63 + validateClaimResponse(emptyPayload, client, payloadBytes, failurePayloadBytes);
  64 + }
  65 +
  66 + private TransportApiProtos.ClaimDevice getClaimDevice(long duration, boolean emptyPayload) {
  67 + TransportApiProtos.ClaimDevice.Builder claimDeviceBuilder = TransportApiProtos.ClaimDevice.newBuilder();
  68 + if (!emptyPayload) {
  69 + claimDeviceBuilder.setSecretKey("value");
  70 + }
  71 + if (duration > 0) {
  72 + claimDeviceBuilder.setSecretKey("value");
  73 + claimDeviceBuilder.setDurationMs(duration);
  74 + } else {
  75 + claimDeviceBuilder.setDurationMs(0);
  76 + }
  77 + return claimDeviceBuilder.build();
  78 + }
  79 +
  80 +
  81 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.claim.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.claim.AbstractCoapClaimJsonDeviceTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapClaimDeviceJsonSqlTest extends AbstractCoapClaimJsonDeviceTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.claim.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.claim.AbstractCoapClaimProtoDeviceTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapClaimDeviceProtoSqlTest extends AbstractCoapClaimProtoDeviceTest {
  23 +}
... ...
application/src/test/java/org/thingsboard/server/transport/coap/claim/sql/CoapClaimDeviceSqlTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/updates/nosql/MqttAttributesUpdatesNoSqlIntegrationTest.java
... ... @@ -13,12 +13,11 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.updates.nosql;
  16 +package org.thingsboard.server.transport.coap.claim.sql;
17 17
18   -import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.attributes.updates.AbstractMqttAttributesUpdatesJsonIntegrationTest;
  18 +import org.thingsboard.server.transport.coap.claim.AbstractCoapClaimDeviceTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
20 20
21   -
22   -@DaoNoSqlTest
23   -public class MqttAttributesUpdatesNoSqlIntegrationTest extends AbstractMqttAttributesUpdatesJsonIntegrationTest {
  21 +@DaoSqlTest
  22 +public class CoapClaimDeviceSqlTest extends AbstractCoapClaimDeviceTest {
24 23 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.provision;
  17 +
  18 +import com.google.gson.JsonObject;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.eclipse.californium.core.CoapClient;
  21 +import org.eclipse.californium.core.CoapResponse;
  22 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  23 +import org.eclipse.californium.elements.exception.ConnectorException;
  24 +import org.junit.After;
  25 +import org.junit.Assert;
  26 +import org.junit.Test;
  27 +import org.springframework.beans.factory.annotation.Autowired;
  28 +import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest;
  29 +import org.thingsboard.server.common.data.CoapDeviceType;
  30 +import org.thingsboard.server.common.data.Device;
  31 +import org.thingsboard.server.common.data.DeviceProfileProvisionType;
  32 +import org.thingsboard.server.common.data.TransportPayloadType;
  33 +import org.thingsboard.server.common.data.security.DeviceCredentials;
  34 +import org.thingsboard.server.common.msg.EncryptionUtil;
  35 +import org.thingsboard.server.common.msg.session.FeatureType;
  36 +import org.thingsboard.server.common.transport.util.JsonUtils;
  37 +import org.thingsboard.server.dao.device.DeviceCredentialsService;
  38 +import org.thingsboard.server.dao.device.DeviceService;
  39 +import org.thingsboard.server.dao.device.provision.ProvisionResponseStatus;
  40 +
  41 +import java.io.IOException;
  42 +
  43 +import static org.junit.Assert.assertEquals;
  44 +
  45 +@Slf4j
  46 +public abstract class AbstractCoapProvisionJsonDeviceTest extends AbstractCoapIntegrationTest {
  47 +
  48 + @Autowired
  49 + DeviceCredentialsService deviceCredentialsService;
  50 +
  51 + @Autowired
  52 + DeviceService deviceService;
  53 +
  54 + @After
  55 + public void afterTest() throws Exception {
  56 + super.processAfterTest();
  57 + }
  58 +
  59 + @Test
  60 + public void testProvisioningDisabledDevice() throws Exception {
  61 + processTestProvisioningDisabledDevice();
  62 + }
  63 +
  64 + @Test
  65 + public void testProvisioningCheckPreProvisionedDevice() throws Exception {
  66 + processTestProvisioningCheckPreProvisionedDevice();
  67 + }
  68 +
  69 + @Test
  70 + public void testProvisioningCreateNewDeviceWithoutCredentials() throws Exception {
  71 + processTestProvisioningCreateNewDeviceWithoutCredentials();
  72 + }
  73 +
  74 + @Test
  75 + public void testProvisioningCreateNewDeviceWithAccessToken() throws Exception {
  76 + processTestProvisioningCreateNewDeviceWithAccessToken();
  77 + }
  78 +
  79 + @Test
  80 + public void testProvisioningCreateNewDeviceWithCert() throws Exception {
  81 + processTestProvisioningCreateNewDeviceWithCert();
  82 + }
  83 +
  84 + @Test
  85 + public void testProvisioningWithBadKeyDevice() throws Exception {
  86 + processTestProvisioningWithBadKeyDevice();
  87 + }
  88 +
  89 +
  90 + private void processTestProvisioningDisabledDevice() throws Exception {
  91 + super.processBeforeTest("Test Provision device", CoapDeviceType.DEFAULT, TransportPayloadType.JSON, null, null, DeviceProfileProvisionType.DISABLED, null, null);
  92 + byte[] result = createCoapClientAndPublish().getPayload();
  93 + JsonObject response = JsonUtils.parse(new String(result)).getAsJsonObject();
  94 + Assert.assertEquals("Provision data was not found!", response.get("errorMsg").getAsString());
  95 + Assert.assertEquals(ProvisionResponseStatus.NOT_FOUND.name(), response.get("status").getAsString());
  96 + }
  97 +
  98 +
  99 + private void processTestProvisioningCreateNewDeviceWithoutCredentials() throws Exception {
  100 + super.processBeforeTest("Test Provision device3", CoapDeviceType.DEFAULT, TransportPayloadType.JSON, null, null, DeviceProfileProvisionType.ALLOW_CREATE_NEW_DEVICES, "testProvisionKey", "testProvisionSecret");
  101 + byte[] result = createCoapClientAndPublish().getPayload();
  102 + JsonObject response = JsonUtils.parse(new String(result)).getAsJsonObject();
  103 +
  104 + Device createdDevice = deviceService.findDeviceByTenantIdAndName(savedTenant.getTenantId(), "Test Provision device");
  105 +
  106 + Assert.assertNotNull(createdDevice);
  107 +
  108 + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(savedTenant.getTenantId(), createdDevice.getId());
  109 +
  110 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), response.get("credentialsType").getAsString());
  111 + Assert.assertEquals(ProvisionResponseStatus.SUCCESS.name(), response.get("status").getAsString());
  112 + }
  113 +
  114 +
  115 + private void processTestProvisioningCreateNewDeviceWithAccessToken() throws Exception {
  116 + super.processBeforeTest("Test Provision device3", CoapDeviceType.DEFAULT, TransportPayloadType.JSON, null, null, DeviceProfileProvisionType.ALLOW_CREATE_NEW_DEVICES, "testProvisionKey", "testProvisionSecret");
  117 + String requestCredentials = ",\"credentialsType\": \"ACCESS_TOKEN\",\"token\": \"test_token\"";
  118 + byte[] result = createCoapClientAndPublish(requestCredentials).getPayload();
  119 + JsonObject response = JsonUtils.parse(new String(result)).getAsJsonObject();
  120 +
  121 + Device createdDevice = deviceService.findDeviceByTenantIdAndName(savedTenant.getTenantId(), "Test Provision device");
  122 +
  123 + Assert.assertNotNull(createdDevice);
  124 +
  125 + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(savedTenant.getTenantId(), createdDevice.getId());
  126 +
  127 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), response.get("credentialsType").getAsString());
  128 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), "ACCESS_TOKEN");
  129 + Assert.assertEquals(deviceCredentials.getCredentialsId(), "test_token");
  130 + Assert.assertEquals(ProvisionResponseStatus.SUCCESS.name(), response.get("status").getAsString());
  131 + }
  132 +
  133 +
  134 + private void processTestProvisioningCreateNewDeviceWithCert() throws Exception {
  135 + super.processBeforeTest("Test Provision device3", CoapDeviceType.DEFAULT, TransportPayloadType.JSON, null, null, DeviceProfileProvisionType.ALLOW_CREATE_NEW_DEVICES, "testProvisionKey", "testProvisionSecret");
  136 + String requestCredentials = ",\"credentialsType\": \"X509_CERTIFICATE\",\"hash\": \"testHash\"";
  137 + byte[] result = createCoapClientAndPublish(requestCredentials).getPayload();
  138 + JsonObject response = JsonUtils.parse(new String(result)).getAsJsonObject();
  139 +
  140 + Device createdDevice = deviceService.findDeviceByTenantIdAndName(savedTenant.getTenantId(), "Test Provision device");
  141 +
  142 + Assert.assertNotNull(createdDevice);
  143 +
  144 + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(savedTenant.getTenantId(), createdDevice.getId());
  145 +
  146 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), response.get("credentialsType").getAsString());
  147 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), "X509_CERTIFICATE");
  148 +
  149 + String cert = EncryptionUtil.trimNewLines(deviceCredentials.getCredentialsValue());
  150 + String sha3Hash = EncryptionUtil.getSha3Hash(cert);
  151 +
  152 + Assert.assertEquals(deviceCredentials.getCredentialsId(), sha3Hash);
  153 +
  154 + Assert.assertEquals(deviceCredentials.getCredentialsValue(), "testHash");
  155 + Assert.assertEquals(ProvisionResponseStatus.SUCCESS.name(), response.get("status").getAsString());
  156 + }
  157 +
  158 + private void processTestProvisioningCheckPreProvisionedDevice() throws Exception {
  159 + super.processBeforeTest("Test Provision device", CoapDeviceType.DEFAULT, TransportPayloadType.JSON, null, null, DeviceProfileProvisionType.CHECK_PRE_PROVISIONED_DEVICES, "testProvisionKey", "testProvisionSecret");
  160 + byte[] result = createCoapClientAndPublish().getPayload();
  161 + JsonObject response = JsonUtils.parse(new String(result)).getAsJsonObject();
  162 +
  163 + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(savedTenant.getTenantId(), savedDevice.getId());
  164 +
  165 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), response.get("credentialsType").getAsString());
  166 + Assert.assertEquals(ProvisionResponseStatus.SUCCESS.name(), response.get("status").getAsString());
  167 + }
  168 +
  169 + private void processTestProvisioningWithBadKeyDevice() throws Exception {
  170 + super.processBeforeTest("Test Provision device", CoapDeviceType.DEFAULT, TransportPayloadType.JSON, null, null, DeviceProfileProvisionType.CHECK_PRE_PROVISIONED_DEVICES, "testProvisionKeyOrig", "testProvisionSecret");
  171 + byte[] result = createCoapClientAndPublish().getPayload();
  172 + JsonObject response = JsonUtils.parse(new String(result)).getAsJsonObject();
  173 + Assert.assertEquals("Provision data was not found!", response.get("errorMsg").getAsString());
  174 + Assert.assertEquals(ProvisionResponseStatus.NOT_FOUND.name(), response.get("status").getAsString());
  175 + }
  176 +
  177 + private CoapResponse createCoapClientAndPublish() throws Exception {
  178 + return createCoapClientAndPublish("");
  179 + }
  180 +
  181 + private CoapResponse createCoapClientAndPublish(String deviceCredentials) throws Exception {
  182 + String provisionRequestMsg = createTestProvisionMessage(deviceCredentials);
  183 + CoapClient client = getCoapClient(FeatureType.PROVISION);
  184 + return postProvision(client, provisionRequestMsg.getBytes());
  185 + }
  186 +
  187 +
  188 + private CoapResponse postProvision(CoapClient client, byte[] payload) throws IOException, ConnectorException {
  189 + return client.setTimeout((long) 60000).post(payload, MediaTypeRegistry.APPLICATION_JSON);
  190 + }
  191 +
  192 + private String createTestProvisionMessage(String deviceCredentials) {
  193 + return "{\"deviceName\":\"Test Provision device\",\"provisionDeviceKey\":\"testProvisionKey\", \"provisionDeviceSecret\":\"testProvisionSecret\"" + deviceCredentials + "}";
  194 + }
  195 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.provision;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.eclipse.californium.core.CoapClient;
  20 +import org.eclipse.californium.core.CoapResponse;
  21 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  22 +import org.eclipse.californium.elements.exception.ConnectorException;
  23 +import org.junit.After;
  24 +import org.junit.Assert;
  25 +import org.junit.Test;
  26 +import org.springframework.beans.factory.annotation.Autowired;
  27 +import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest;
  28 +import org.thingsboard.server.common.data.CoapDeviceType;
  29 +import org.thingsboard.server.common.data.Device;
  30 +import org.thingsboard.server.common.data.DeviceProfileProvisionType;
  31 +import org.thingsboard.server.common.data.TransportPayloadType;
  32 +import org.thingsboard.server.common.data.security.DeviceCredentials;
  33 +import org.thingsboard.server.common.data.security.DeviceCredentialsType;
  34 +import org.thingsboard.server.common.msg.EncryptionUtil;
  35 +import org.thingsboard.server.common.msg.session.FeatureType;
  36 +import org.thingsboard.server.dao.device.DeviceCredentialsService;
  37 +import org.thingsboard.server.dao.device.DeviceService;
  38 +import org.thingsboard.server.dao.device.provision.ProvisionResponseStatus;
  39 +import org.thingsboard.server.gen.transport.TransportProtos.CredentialsDataProto;
  40 +import org.thingsboard.server.gen.transport.TransportProtos.CredentialsType;
  41 +import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceCredentialsMsg;
  42 +import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRequestMsg;
  43 +import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceResponseMsg;
  44 +import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg;
  45 +import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceX509CertRequestMsg;
  46 +
  47 +import java.io.IOException;
  48 +
  49 +@Slf4j
  50 +public abstract class AbstractCoapProvisionProtoDeviceTest extends AbstractCoapIntegrationTest {
  51 +
  52 + @Autowired
  53 + DeviceCredentialsService deviceCredentialsService;
  54 +
  55 + @Autowired
  56 + DeviceService deviceService;
  57 +
  58 + @After
  59 + public void afterTest() throws Exception {
  60 + super.processAfterTest();
  61 + }
  62 +
  63 + @Test
  64 + public void testProvisioningDisabledDevice() throws Exception {
  65 + processTestProvisioningDisabledDevice();
  66 + }
  67 +
  68 + @Test
  69 + public void testProvisioningCheckPreProvisionedDevice() throws Exception {
  70 + processTestProvisioningCheckPreProvisionedDevice();
  71 + }
  72 +
  73 + @Test
  74 + public void testProvisioningCreateNewDeviceWithoutCredentials() throws Exception {
  75 + processTestProvisioningCreateNewDeviceWithoutCredentials();
  76 + }
  77 +
  78 + @Test
  79 + public void testProvisioningCreateNewDeviceWithAccessToken() throws Exception {
  80 + processTestProvisioningCreateNewDeviceWithAccessToken();
  81 + }
  82 +
  83 + @Test
  84 + public void testProvisioningCreateNewDeviceWithCert() throws Exception {
  85 + processTestProvisioningCreateNewDeviceWithCert();
  86 + }
  87 +
  88 + @Test
  89 + public void testProvisioningWithBadKeyDevice() throws Exception {
  90 + processTestProvisioningWithBadKeyDevice();
  91 + }
  92 +
  93 +
  94 + private void processTestProvisioningDisabledDevice() throws Exception {
  95 + super.processBeforeTest("Test Provision device", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF, null, null, DeviceProfileProvisionType.DISABLED, null, null);
  96 + ProvisionDeviceResponseMsg result = ProvisionDeviceResponseMsg.parseFrom(createCoapClientAndPublish().getPayload());
  97 + Assert.assertNotNull(result);
  98 + Assert.assertEquals(ProvisionResponseStatus.NOT_FOUND.name(), result.getStatus().toString());
  99 + }
  100 +
  101 + private void processTestProvisioningCreateNewDeviceWithoutCredentials() throws Exception {
  102 + super.processBeforeTest("Test Provision device3", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF, null, null, DeviceProfileProvisionType.ALLOW_CREATE_NEW_DEVICES, "testProvisionKey", "testProvisionSecret");
  103 + ProvisionDeviceResponseMsg response = ProvisionDeviceResponseMsg.parseFrom(createCoapClientAndPublish().getPayload());
  104 +
  105 + Device createdDevice = deviceService.findDeviceByTenantIdAndName(savedTenant.getTenantId(), "Test Provision device");
  106 +
  107 + Assert.assertNotNull(createdDevice);
  108 +
  109 + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(savedTenant.getTenantId(), createdDevice.getId());
  110 +
  111 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), response.getCredentialsType().toString());
  112 + Assert.assertEquals(ProvisionResponseStatus.SUCCESS.name(), response.getStatus().toString());
  113 + }
  114 +
  115 + private void processTestProvisioningCreateNewDeviceWithAccessToken() throws Exception {
  116 + super.processBeforeTest("Test Provision device3", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF, null, null, DeviceProfileProvisionType.ALLOW_CREATE_NEW_DEVICES, "testProvisionKey", "testProvisionSecret");
  117 + CredentialsDataProto requestCredentials = CredentialsDataProto.newBuilder().setValidateDeviceTokenRequestMsg(ValidateDeviceTokenRequestMsg.newBuilder().setToken("test_token").build()).build();
  118 +
  119 + ProvisionDeviceResponseMsg response = ProvisionDeviceResponseMsg.parseFrom(createCoapClientAndPublish(createTestsProvisionMessage(CredentialsType.ACCESS_TOKEN, requestCredentials)).getPayload());
  120 +
  121 + Device createdDevice = deviceService.findDeviceByTenantIdAndName(savedTenant.getTenantId(), "Test Provision device");
  122 +
  123 + Assert.assertNotNull(createdDevice);
  124 +
  125 + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(savedTenant.getTenantId(), createdDevice.getId());
  126 +
  127 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), response.getCredentialsType().toString());
  128 + Assert.assertEquals(deviceCredentials.getCredentialsType(), DeviceCredentialsType.ACCESS_TOKEN);
  129 + Assert.assertEquals(deviceCredentials.getCredentialsId(), "test_token");
  130 + Assert.assertEquals(ProvisionResponseStatus.SUCCESS.name(), response.getStatus().toString());
  131 + }
  132 +
  133 + private void processTestProvisioningCreateNewDeviceWithCert() throws Exception {
  134 + super.processBeforeTest("Test Provision device3", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF, null, null, DeviceProfileProvisionType.ALLOW_CREATE_NEW_DEVICES, "testProvisionKey", "testProvisionSecret");
  135 + CredentialsDataProto requestCredentials = CredentialsDataProto.newBuilder().setValidateDeviceX509CertRequestMsg(ValidateDeviceX509CertRequestMsg.newBuilder().setHash("testHash").build()).build();
  136 +
  137 + ProvisionDeviceResponseMsg response = ProvisionDeviceResponseMsg.parseFrom(createCoapClientAndPublish(createTestsProvisionMessage(CredentialsType.X509_CERTIFICATE, requestCredentials)).getPayload());
  138 +
  139 + Device createdDevice = deviceService.findDeviceByTenantIdAndName(savedTenant.getTenantId(), "Test Provision device");
  140 +
  141 + Assert.assertNotNull(createdDevice);
  142 +
  143 + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(savedTenant.getTenantId(), createdDevice.getId());
  144 +
  145 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), response.getCredentialsType().toString());
  146 + Assert.assertEquals(deviceCredentials.getCredentialsType(), DeviceCredentialsType.X509_CERTIFICATE);
  147 +
  148 + String cert = EncryptionUtil.trimNewLines(deviceCredentials.getCredentialsValue());
  149 + String sha3Hash = EncryptionUtil.getSha3Hash(cert);
  150 +
  151 + Assert.assertEquals(deviceCredentials.getCredentialsId(), sha3Hash);
  152 +
  153 + Assert.assertEquals(deviceCredentials.getCredentialsValue(), "testHash");
  154 + Assert.assertEquals(ProvisionResponseStatus.SUCCESS.name(), response.getStatus().toString());
  155 + }
  156 +
  157 + private void processTestProvisioningCheckPreProvisionedDevice() throws Exception {
  158 + super.processBeforeTest("Test Provision device", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF, null, null, DeviceProfileProvisionType.CHECK_PRE_PROVISIONED_DEVICES, "testProvisionKey", "testProvisionSecret");
  159 + ProvisionDeviceResponseMsg response = ProvisionDeviceResponseMsg.parseFrom(createCoapClientAndPublish().getPayload());
  160 +
  161 + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(savedTenant.getTenantId(), savedDevice.getId());
  162 +
  163 + Assert.assertEquals(deviceCredentials.getCredentialsType().name(), response.getCredentialsType().toString());
  164 + Assert.assertEquals(ProvisionResponseStatus.SUCCESS.name(), response.getStatus().toString());
  165 + }
  166 +
  167 + private void processTestProvisioningWithBadKeyDevice() throws Exception {
  168 + super.processBeforeTest("Test Provision device", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF, null, null, DeviceProfileProvisionType.CHECK_PRE_PROVISIONED_DEVICES, "testProvisionKeyOrig", "testProvisionSecret");
  169 + ProvisionDeviceResponseMsg response = ProvisionDeviceResponseMsg.parseFrom(createCoapClientAndPublish().getPayload());
  170 + Assert.assertEquals(ProvisionResponseStatus.NOT_FOUND.name(), response.getStatus().toString());
  171 + }
  172 +
  173 + private CoapResponse createCoapClientAndPublish() throws Exception {
  174 + byte[] provisionRequestMsg = createTestProvisionMessage();
  175 + return createCoapClientAndPublish(provisionRequestMsg);
  176 + }
  177 +
  178 + private CoapResponse createCoapClientAndPublish(byte[] provisionRequestMsg) throws Exception {
  179 + CoapClient client = getCoapClient(FeatureType.PROVISION);
  180 + return postProvision(client, provisionRequestMsg);
  181 + }
  182 +
  183 + private CoapResponse postProvision(CoapClient client, byte[] payload) throws IOException, ConnectorException {
  184 + return client.setTimeout((long) 60000).post(payload, MediaTypeRegistry.APPLICATION_JSON);
  185 + }
  186 +
  187 + private byte[] createTestsProvisionMessage(CredentialsType credentialsType, CredentialsDataProto credentialsData) throws Exception {
  188 + return ProvisionDeviceRequestMsg.newBuilder()
  189 + .setDeviceName("Test Provision device")
  190 + .setCredentialsType(credentialsType != null ? credentialsType : CredentialsType.ACCESS_TOKEN)
  191 + .setCredentialsDataProto(credentialsData != null ? credentialsData: CredentialsDataProto.newBuilder().build())
  192 + .setProvisionDeviceCredentialsMsg(
  193 + ProvisionDeviceCredentialsMsg.newBuilder()
  194 + .setProvisionDeviceKey("testProvisionKey")
  195 + .setProvisionDeviceSecret("testProvisionSecret")
  196 + ).build()
  197 + .toByteArray();
  198 + }
  199 +
  200 +
  201 + private byte[] createTestProvisionMessage() throws Exception {
  202 + return createTestsProvisionMessage(null, null);
  203 + }
  204 +
  205 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.provision.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.provision.AbstractCoapProvisionJsonDeviceTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapProvisionDeviceJsonSqlTest extends AbstractCoapProvisionJsonDeviceTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.provision.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.provision.AbstractCoapProvisionProtoDeviceTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapProvisionDeviceProtoSqlTest extends AbstractCoapProvisionProtoDeviceTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.rpc;
  17 +
  18 +import com.datastax.oss.driver.api.core.uuid.Uuids;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.junit.After;
  21 +import org.junit.Assert;
  22 +import org.junit.Before;
  23 +import org.junit.Test;
  24 +import org.thingsboard.server.service.security.AccessValidator;
  25 +
  26 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  27 +
  28 +@Slf4j
  29 +public abstract class AbstractCoapServerSideRpcDefaultIntegrationTest extends AbstractCoapServerSideRpcIntegrationTest {
  30 +
  31 + @Before
  32 + public void beforeTest() throws Exception {
  33 + processBeforeTest("RPC test device", null, null);
  34 + }
  35 +
  36 + @After
  37 + public void afterTest() throws Exception {
  38 + super.processAfterTest();
  39 + }
  40 +
  41 + @Test
  42 + public void testServerCoapOneWayRpcDeviceOffline() throws Exception {
  43 + String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"24\",\"value\": 1},\"timeout\": 6000}";
  44 + String deviceId = savedDevice.getId().getId().toString();
  45 +
  46 + doPostAsync("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().is(409),
  47 + asyncContextTimeoutToUseRpcPlugin);
  48 + }
  49 +
  50 + @Test
  51 + public void testServerCoapOneWayRpcDeviceDoesNotExist() throws Exception {
  52 + String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"25\",\"value\": 1}}";
  53 + String nonExistentDeviceId = Uuids.timeBased().toString();
  54 +
  55 + String result = doPostAsync("/api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class,
  56 + status().isNotFound());
  57 + Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
  58 + }
  59 +
  60 + @Test
  61 + public void testServerCoapTwoWayRpcDeviceOffline() throws Exception {
  62 + String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"27\",\"value\": 1},\"timeout\": 6000}";
  63 + String deviceId = savedDevice.getId().getId().toString();
  64 +
  65 + doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().is(409),
  66 + asyncContextTimeoutToUseRpcPlugin);
  67 + }
  68 +
  69 + @Test
  70 + public void testServerCoapTwoWayRpcDeviceDoesNotExist() throws Exception {
  71 + String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"28\",\"value\": 1}}";
  72 + String nonExistentDeviceId = Uuids.timeBased().toString();
  73 +
  74 + String result = doPostAsync("/api/plugins/rpc/twoway/" + nonExistentDeviceId, setGpioRequest, String.class,
  75 + status().isNotFound());
  76 + Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
  77 + }
  78 +
  79 + @Test
  80 + public void testServerCoapOneWayRpc() throws Exception {
  81 + processOneWayRpcTest();
  82 + }
  83 +
  84 + @Test
  85 + public void testServerCoapTwoWayRpc() throws Exception {
  86 + processTwoWayRpcTest();
  87 + }
  88 +
  89 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.rpc;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.apache.commons.lang3.StringUtils;
  20 +import org.eclipse.californium.core.CoapClient;
  21 +import org.eclipse.californium.core.CoapHandler;
  22 +import org.eclipse.californium.core.CoapObserveRelation;
  23 +import org.eclipse.californium.core.CoapResponse;
  24 +import org.eclipse.californium.core.coap.CoAP;
  25 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  26 +import org.eclipse.californium.core.coap.Request;
  27 +import org.junit.Assert;
  28 +import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest;
  29 +import org.thingsboard.server.common.data.CoapDeviceType;
  30 +import org.thingsboard.server.common.data.TransportPayloadType;
  31 +import org.thingsboard.server.common.msg.session.FeatureType;
  32 +
  33 +import java.util.concurrent.CountDownLatch;
  34 +import java.util.concurrent.TimeUnit;
  35 +
  36 +import static org.junit.Assert.assertEquals;
  37 +import static org.junit.Assert.assertNotNull;
  38 +import static org.junit.Assert.assertTrue;
  39 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  40 +
  41 +@Slf4j
  42 +public abstract class AbstractCoapServerSideRpcIntegrationTest extends AbstractCoapIntegrationTest {
  43 +
  44 + protected static final String DEVICE_RESPONSE = "{\"value1\":\"A\",\"value2\":\"B\"}";
  45 +
  46 + protected Long asyncContextTimeoutToUseRpcPlugin;
  47 +
  48 + protected void processBeforeTest(String deviceName, CoapDeviceType coapDeviceType, TransportPayloadType payloadType) throws Exception {
  49 + super.processBeforeTest(deviceName, coapDeviceType, payloadType);
  50 + asyncContextTimeoutToUseRpcPlugin = 10000L;
  51 + }
  52 +
  53 + protected void processOneWayRpcTest() throws Exception {
  54 + CoapClient client = getCoapClient(FeatureType.RPC);
  55 + client.useCONs();
  56 +
  57 + CountDownLatch latch = new CountDownLatch(1);
  58 + TestCoapCallback testCoapCallback = new TestCoapCallback(client, latch, true);
  59 +
  60 + Request request = Request.newGet().setObserve();
  61 + CoapObserveRelation observeRelation = client.observe(request, testCoapCallback);
  62 +
  63 + String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}";
  64 + String deviceId = savedDevice.getId().getId().toString();
  65 + String result = doPostAsync("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().isOk());
  66 + Assert.assertTrue(StringUtils.isEmpty(result));
  67 + latch.await(3, TimeUnit.SECONDS);
  68 + assertEquals(0, testCoapCallback.getObserve().intValue());
  69 + observeRelation.proactiveCancel();
  70 + assertTrue(observeRelation.isCanceled());
  71 + }
  72 +
  73 + protected void processTwoWayRpcTest() throws Exception {
  74 + CoapClient client = getCoapClient(FeatureType.RPC);
  75 + client.useCONs();
  76 +
  77 + CountDownLatch latch = new CountDownLatch(1);
  78 + TestCoapCallback testCoapCallback = new TestCoapCallback(client, latch, false);
  79 +
  80 + Request request = Request.newGet().setObserve();
  81 + request.setType(CoAP.Type.CON);
  82 + CoapObserveRelation observeRelation = client.observe(request, testCoapCallback);
  83 +
  84 + String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}";
  85 + String deviceId = savedDevice.getId().getId().toString();
  86 +
  87 + String expected = "{\"value1\":\"A\",\"value2\":\"B\"}";
  88 +
  89 + String result = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
  90 + latch.await(3, TimeUnit.SECONDS);
  91 +
  92 + assertEquals(expected, result);
  93 + assertEquals(0, testCoapCallback.getObserve().intValue());
  94 + observeRelation.proactiveCancel();
  95 + assertTrue(observeRelation.isCanceled());
  96 +
  97 +// // TODO: 3/11/21 Fix test to validate next RPC
  98 +// latch = new CountDownLatch(1);
  99 +//
  100 +// result = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
  101 +// latch.await(3, TimeUnit.SECONDS);
  102 +//
  103 +// assertEquals(expected, result);
  104 +// assertEquals(1, testCoapCallback.getObserve().intValue());
  105 + }
  106 +
  107 + protected void processOnLoadResponse(CoapResponse response, CoapClient client, Integer observe, CountDownLatch latch) {
  108 + client.setURI(getRpcResponseFeatureTokenUrl(accessToken, observe));
  109 + client.post(new CoapHandler() {
  110 + @Override
  111 + public void onLoad(CoapResponse response) {
  112 + log.warn("Command Response Ack: {}, {}", response.getCode(), response.getResponseText());
  113 + latch.countDown();
  114 + }
  115 +
  116 + @Override
  117 + public void onError() {
  118 + log.warn("Command Response Ack Error, No connect");
  119 + }
  120 + }, DEVICE_RESPONSE, MediaTypeRegistry.APPLICATION_JSON);
  121 + }
  122 +
  123 + protected String getRpcResponseFeatureTokenUrl(String token, int requestId) {
  124 + return COAP_BASE_URL + token + "/" + FeatureType.RPC.name().toLowerCase() + "/" + requestId;
  125 + }
  126 +
  127 + private class TestCoapCallback implements CoapHandler {
  128 +
  129 + private final CoapClient client;
  130 + private final CountDownLatch latch;
  131 + private final boolean isOneWayRpc;
  132 +
  133 + public Integer getObserve() {
  134 + return observe;
  135 + }
  136 +
  137 + private Integer observe;
  138 +
  139 + private TestCoapCallback(CoapClient client, CountDownLatch latch, boolean isOneWayRpc) {
  140 + this.client = client;
  141 + this.latch = latch;
  142 + this.isOneWayRpc = isOneWayRpc;
  143 + }
  144 +
  145 + @Override
  146 + public void onLoad(CoapResponse response) {
  147 + log.warn("coap response: {}, {}", response, response.getCode());
  148 + assertNotNull(response.getPayload());
  149 + assertEquals(response.getCode(), CoAP.ResponseCode.CONTENT);
  150 + observe = response.getOptions().getObserve();
  151 + if (!isOneWayRpc) {
  152 + processOnLoadResponse(response, client, observe, latch);
  153 + } else {
  154 + latch.countDown();
  155 + }
  156 + }
  157 +
  158 + @Override
  159 + public void onError() {
  160 + log.warn("Command Response Ack Error, No connect");
  161 + }
  162 +
  163 + }
  164 +
  165 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.rpc;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.junit.After;
  20 +import org.junit.Before;
  21 +import org.junit.Test;
  22 +import org.thingsboard.server.common.data.CoapDeviceType;
  23 +import org.thingsboard.server.common.data.TransportPayloadType;
  24 +
  25 +@Slf4j
  26 +public abstract class AbstractCoapServerSideRpcJsonIntegrationTest extends AbstractCoapServerSideRpcIntegrationTest {
  27 +
  28 + @Before
  29 + public void beforeTest() throws Exception {
  30 + processBeforeTest("RPC test device", CoapDeviceType.DEFAULT, TransportPayloadType.JSON);
  31 + }
  32 +
  33 + @After
  34 + public void afterTest() throws Exception {
  35 + super.processAfterTest();
  36 + }
  37 +
  38 + @Test
  39 + public void testServerMqttOneWayRpc() throws Exception {
  40 + processOneWayRpcTest();
  41 + }
  42 +
  43 + @Test
  44 + public void testServerMqttTwoWayRpc() throws Exception {
  45 + processTwoWayRpcTest();
  46 + }
  47 +
  48 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.rpc;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.eclipse.californium.core.CoapClient;
  20 +import org.eclipse.californium.core.CoapHandler;
  21 +import org.eclipse.californium.core.CoapResponse;
  22 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  23 +import org.junit.After;
  24 +import org.junit.Before;
  25 +import org.junit.Test;
  26 +import org.thingsboard.server.common.data.CoapDeviceType;
  27 +import org.thingsboard.server.common.data.TransportPayloadType;
  28 +import org.thingsboard.server.gen.transport.TransportProtos;
  29 +
  30 +import java.util.concurrent.CountDownLatch;
  31 +
  32 +@Slf4j
  33 +public abstract class AbstractCoapServerSideRpcProtoIntegrationTest extends AbstractCoapServerSideRpcIntegrationTest {
  34 +
  35 + @Before
  36 + public void beforeTest() throws Exception {
  37 + processBeforeTest("RPC test device", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF);
  38 + }
  39 +
  40 + @After
  41 + public void afterTest() throws Exception {
  42 + super.processAfterTest();
  43 + }
  44 +
  45 + @Test
  46 + public void testServerMqttOneWayRpc() throws Exception {
  47 + processOneWayRpcTest();
  48 + }
  49 +
  50 + @Test
  51 + public void testServerMqttTwoWayRpc() throws Exception {
  52 + processTwoWayRpcTest();
  53 + }
  54 +
  55 + @Override
  56 + protected void processOnLoadResponse(CoapResponse response, CoapClient client, Integer observe, CountDownLatch latch) {
  57 + client.setURI(getRpcResponseFeatureTokenUrl(accessToken, observe));
  58 + TransportProtos.ToDeviceRpcResponseMsg toDeviceRpcResponseMsg = TransportProtos.ToDeviceRpcResponseMsg.newBuilder()
  59 + .setPayload(DEVICE_RESPONSE)
  60 + .setRequestId(observe)
  61 + .build();
  62 + client.post(new CoapHandler() {
  63 + @Override
  64 + public void onLoad(CoapResponse response) {
  65 + log.warn("Command Response Ack: {}, {}", response.getCode(), response.getResponseText());
  66 + latch.countDown();
  67 + }
  68 +
  69 + @Override
  70 + public void onError() {
  71 + log.warn("Command Response Ack Error, No connect");
  72 + }
  73 + }, toDeviceRpcResponseMsg.toByteArray(), MediaTypeRegistry.APPLICATION_JSON);
  74 + }
  75 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.rpc.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.rpc.AbstractCoapServerSideRpcJsonIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapServerSideRpcJsonSqlIntegrationTest extends AbstractCoapServerSideRpcJsonIntegrationTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.rpc.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.rpc.AbstractCoapServerSideRpcProtoIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +
  22 +@DaoSqlTest
  23 +public class CoapServerSideRpcProtoSqlIntegrationTest extends AbstractCoapServerSideRpcProtoIntegrationTest {
  24 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.rpc.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.rpc.AbstractCoapServerSideRpcDefaultIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +@DaoSqlTest
  22 +public class CoapServerSideRpcSqlIntegrationTest extends AbstractCoapServerSideRpcDefaultIntegrationTest {
  23 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.attributes;
  17 +
  18 +import com.fasterxml.jackson.core.JsonProcessingException;
  19 +import com.fasterxml.jackson.core.type.TypeReference;
  20 +import lombok.extern.slf4j.Slf4j;
  21 +import org.eclipse.californium.core.CoapClient;
  22 +import org.eclipse.californium.core.CoapResponse;
  23 +import org.eclipse.californium.core.coap.CoAP;
  24 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  25 +import org.eclipse.californium.elements.exception.ConnectorException;
  26 +import org.junit.After;
  27 +import org.junit.Before;
  28 +import org.junit.Test;
  29 +import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest;
  30 +import org.thingsboard.server.common.data.id.DeviceId;
  31 +import org.thingsboard.server.common.msg.session.FeatureType;
  32 +
  33 +import java.io.IOException;
  34 +import java.util.Arrays;
  35 +import java.util.HashSet;
  36 +import java.util.LinkedHashMap;
  37 +import java.util.List;
  38 +import java.util.Map;
  39 +import java.util.Set;
  40 +
  41 +import static org.junit.Assert.assertEquals;
  42 +import static org.junit.Assert.assertNotNull;
  43 +import static org.junit.Assert.assertTrue;
  44 +
  45 +@Slf4j
  46 +public abstract class AbstractCoapAttributesIntegrationTest extends AbstractCoapIntegrationTest {
  47 +
  48 + private static final String PAYLOAD_VALUES_STR = "{\"key1\":\"value1\", \"key2\":true, \"key3\": 3.0, \"key4\": 4," +
  49 + " \"key5\": {\"someNumber\": 42, \"someArray\": [1,2,3], \"someNestedObject\": {\"key\": \"value\"}}}";
  50 +
  51 + @Before
  52 + public void beforeTest() throws Exception {
  53 + processBeforeTest("Test Post Attributes device", null, null);
  54 + }
  55 +
  56 + @After
  57 + public void afterTest() throws Exception {
  58 + processAfterTest();
  59 + }
  60 +
  61 + @Test
  62 + public void testPushAttributes() throws Exception {
  63 + List<String> expectedKeys = Arrays.asList("key1", "key2", "key3", "key4", "key5");
  64 + processAttributesTest(expectedKeys, PAYLOAD_VALUES_STR.getBytes());
  65 + }
  66 +
  67 + protected void processAttributesTest(List<String> expectedKeys, byte[] payload) throws Exception {
  68 + log.warn("[testPushAttributes] Device: {}, Transport type: {}", savedDevice.getName(), savedDevice.getType());
  69 + CoapClient client = getCoapClient(FeatureType.ATTRIBUTES);
  70 +
  71 + postAttributes(client, payload);
  72 +
  73 + DeviceId deviceId = savedDevice.getId();
  74 +
  75 + long start = System.currentTimeMillis();
  76 + long end = System.currentTimeMillis() + 5000;
  77 +
  78 + List<String> actualKeys = null;
  79 + while (start <= end) {
  80 + actualKeys = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + deviceId + "/keys/attributes/CLIENT_SCOPE", new TypeReference<>() {});
  81 + if (actualKeys.size() == expectedKeys.size()) {
  82 + break;
  83 + }
  84 + Thread.sleep(100);
  85 + start += 100;
  86 + }
  87 + assertNotNull(actualKeys);
  88 +
  89 + Set<String> actualKeySet = new HashSet<>(actualKeys);
  90 +
  91 + Set<String> expectedKeySet = new HashSet<>(expectedKeys);
  92 +
  93 + assertEquals(expectedKeySet, actualKeySet);
  94 +
  95 + String getAttributesValuesUrl = getAttributesValuesUrl(deviceId, actualKeySet);
  96 + List<Map<String, Object>> values = doGetAsyncTyped(getAttributesValuesUrl, new TypeReference<>() {});
  97 + assertAttributesValues(values, expectedKeySet);
  98 + String deleteAttributesUrl = "/api/plugins/telemetry/DEVICE/" + deviceId + "/CLIENT_SCOPE?keys=" + String.join(",", actualKeySet);
  99 + doDelete(deleteAttributesUrl);
  100 + }
  101 +
  102 + private void postAttributes(CoapClient client, byte[] payload) throws IOException, ConnectorException {
  103 + if (payload == null) {
  104 + payload = PAYLOAD_VALUES_STR.getBytes();
  105 + }
  106 + CoapResponse coapResponse = client.setTimeout((long) 60000).post(payload, MediaTypeRegistry.APPLICATION_JSON);
  107 + assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode());
  108 + }
  109 +
  110 + @SuppressWarnings("unchecked")
  111 + protected void assertAttributesValues(List<Map<String, Object>> deviceValues, Set<String> expectedKeySet) throws JsonProcessingException {
  112 + for (Map<String, Object> map : deviceValues) {
  113 + String key = (String) map.get("key");
  114 + Object value = map.get("value");
  115 + assertTrue(expectedKeySet.contains(key));
  116 + switch (key) {
  117 + case "key1":
  118 + assertEquals("value1", value);
  119 + break;
  120 + case "key2":
  121 + assertEquals(true, value);
  122 + break;
  123 + case "key3":
  124 + assertEquals(3.0, value);
  125 + break;
  126 + case "key4":
  127 + assertEquals(4, value);
  128 + break;
  129 + case "key5":
  130 + assertNotNull(value);
  131 + assertEquals(3, ((LinkedHashMap) value).size());
  132 + assertEquals(42, ((LinkedHashMap) value).get("someNumber"));
  133 + assertEquals(Arrays.asList(1, 2, 3), ((LinkedHashMap) value).get("someArray"));
  134 + LinkedHashMap<String, String> someNestedObject = (LinkedHashMap) ((LinkedHashMap) value).get("someNestedObject");
  135 + assertEquals("value", someNestedObject.get("key"));
  136 + break;
  137 + }
  138 + }
  139 + }
  140 +
  141 + private String getAttributesValuesUrl(DeviceId deviceId, Set<String> actualKeySet) {
  142 + return "/api/plugins/telemetry/DEVICE/" + deviceId + "/values/attributes/CLIENT_SCOPE?keys=" + String.join(",", actualKeySet);
  143 + }
  144 +
  145 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.attributes;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.junit.After;
  20 +import org.junit.Before;
  21 +import org.junit.Test;
  22 +import org.thingsboard.server.common.data.CoapDeviceType;
  23 +import org.thingsboard.server.common.data.TransportPayloadType;
  24 +
  25 +@Slf4j
  26 +public abstract class AbstractCoapAttributesJsonIntegrationTest extends AbstractCoapAttributesIntegrationTest {
  27 +
  28 + @Before
  29 + public void beforeTest() throws Exception {
  30 + processBeforeTest("Test Post Attributes device Json", CoapDeviceType.DEFAULT, TransportPayloadType.JSON);
  31 + }
  32 +
  33 + @After
  34 + public void afterTest() throws Exception {
  35 + processAfterTest();
  36 + }
  37 +
  38 + @Test
  39 + public void testPushAttributes() throws Exception {
  40 + super.testPushAttributes();
  41 + }
  42 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.attributes;
  17 +
  18 +import com.github.os72.protobuf.dynamic.DynamicSchema;
  19 +import com.google.protobuf.Descriptors;
  20 +import com.google.protobuf.DynamicMessage;
  21 +import com.squareup.wire.schema.internal.parser.ProtoFileElement;
  22 +import lombok.extern.slf4j.Slf4j;
  23 +import org.junit.After;
  24 +import org.junit.Test;
  25 +import org.thingsboard.server.common.data.CoapDeviceType;
  26 +import org.thingsboard.server.common.data.TransportPayloadType;
  27 +import org.thingsboard.server.common.data.device.profile.CoapDeviceProfileTransportConfiguration;
  28 +import org.thingsboard.server.common.data.device.profile.CoapDeviceTypeConfiguration;
  29 +import org.thingsboard.server.common.data.device.profile.DefaultCoapDeviceTypeConfiguration;
  30 +import org.thingsboard.server.common.data.device.profile.DeviceProfileTransportConfiguration;
  31 +import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
  32 +import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
  33 +
  34 +import java.util.Arrays;
  35 +import java.util.List;
  36 +
  37 +import static org.junit.Assert.assertNotNull;
  38 +import static org.junit.Assert.assertTrue;
  39 +
  40 +@Slf4j
  41 +public abstract class AbstractCoapAttributesProtoIntegrationTest extends AbstractCoapAttributesIntegrationTest {
  42 +
  43 + @After
  44 + public void afterTest() throws Exception {
  45 + processAfterTest();
  46 + }
  47 +
  48 + @Test
  49 + public void testPushAttributes() throws Exception {
  50 + super.processBeforeTest("Test Post Attributes device Proto", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF);
  51 + List<String> expectedKeys = Arrays.asList("key1", "key2", "key3", "key4", "key5");
  52 + DeviceProfileTransportConfiguration transportConfiguration = deviceProfile.getProfileData().getTransportConfiguration();
  53 + assertTrue(transportConfiguration instanceof CoapDeviceProfileTransportConfiguration);
  54 + CoapDeviceProfileTransportConfiguration coapTransportConfiguration = (CoapDeviceProfileTransportConfiguration) transportConfiguration;
  55 + CoapDeviceTypeConfiguration coapDeviceTypeConfiguration = coapTransportConfiguration.getCoapDeviceTypeConfiguration();
  56 + assertTrue(coapDeviceTypeConfiguration instanceof DefaultCoapDeviceTypeConfiguration);
  57 + DefaultCoapDeviceTypeConfiguration defaultCoapDeviceTypeConfiguration = (DefaultCoapDeviceTypeConfiguration) coapDeviceTypeConfiguration;
  58 + TransportPayloadTypeConfiguration transportPayloadTypeConfiguration = defaultCoapDeviceTypeConfiguration.getTransportPayloadTypeConfiguration();
  59 + assertTrue(transportPayloadTypeConfiguration instanceof ProtoTransportPayloadConfiguration);
  60 + ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration;
  61 + ProtoFileElement transportProtoSchemaFile = protoTransportPayloadConfiguration.getTransportProtoSchema(DEVICE_ATTRIBUTES_PROTO_SCHEMA);
  62 + DynamicSchema attributesSchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchemaFile, ProtoTransportPayloadConfiguration.ATTRIBUTES_PROTO_SCHEMA);
  63 +
  64 + DynamicMessage.Builder nestedJsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject.NestedJsonObject");
  65 + Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType();
  66 + assertNotNull(nestedJsonObjectBuilderDescriptor);
  67 + DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build();
  68 +
  69 + DynamicMessage.Builder jsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject");
  70 + Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType();
  71 + assertNotNull(jsonObjectBuilderDescriptor);
  72 + DynamicMessage jsonObject = jsonObjectBuilder
  73 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42)
  74 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1)
  75 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2)
  76 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3)
  77 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject)
  78 + .build();
  79 +
  80 + DynamicMessage.Builder postAttributesBuilder = attributesSchema.newMessageBuilder("PostAttributes");
  81 + Descriptors.Descriptor postAttributesMsgDescriptor = postAttributesBuilder.getDescriptorForType();
  82 + assertNotNull(postAttributesMsgDescriptor);
  83 + DynamicMessage postAttributesMsg = postAttributesBuilder
  84 + .setField(postAttributesMsgDescriptor.findFieldByName("key1"), "value1")
  85 + .setField(postAttributesMsgDescriptor.findFieldByName("key2"), true)
  86 + .setField(postAttributesMsgDescriptor.findFieldByName("key3"), 3.0)
  87 + .setField(postAttributesMsgDescriptor.findFieldByName("key4"), 4)
  88 + .setField(postAttributesMsgDescriptor.findFieldByName("key5"), jsonObject)
  89 + .build();
  90 + processAttributesTest(expectedKeys, postAttributesMsg.toByteArray());
  91 + }
  92 +
  93 +}
... ...
application/src/test/java/org/thingsboard/server/transport/coap/telemetry/attributes/sql/CoapAttributesSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/rpc/nosql/MqttServerSideRpcNoSqlIntegrationTest.java
... ... @@ -13,14 +13,14 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.rpc.nosql;
  16 +package org.thingsboard.server.transport.coap.telemetry.attributes.sql;
17 17
18   -import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.rpc.AbstractMqttServerSideRpcDefaultIntegrationTest;
  18 +import org.thingsboard.server.transport.coap.telemetry.attributes.AbstractCoapAttributesIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
20 20
21 21 /**
22 22 * Created by Valerii Sosliuk on 8/22/2017.
23 23 */
24   -@DaoNoSqlTest
25   -public class MqttServerSideRpcNoSqlIntegrationTest extends AbstractMqttServerSideRpcDefaultIntegrationTest {
  24 +@DaoSqlTest
  25 +public class CoapAttributesSqlIntegrationTest extends AbstractCoapAttributesIntegrationTest {
26 26 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.attributes.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.telemetry.attributes.AbstractCoapAttributesJsonIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +/**
  22 + * Created by Valerii Sosliuk on 8/22/2017.
  23 + */
  24 +@DaoSqlTest
  25 +public class CoapAttributesSqlJsonIntegrationTest extends AbstractCoapAttributesJsonIntegrationTest {
  26 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.attributes.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.telemetry.attributes.AbstractCoapAttributesProtoIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +/**
  22 + * Created by Valerii Sosliuk on 8/22/2017.
  23 + */
  24 +@DaoSqlTest
  25 +public class CoapAttributesSqlProtoIntegrationTest extends AbstractCoapAttributesProtoIntegrationTest {
  26 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries;
  17 +
  18 +import com.fasterxml.jackson.core.type.TypeReference;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.eclipse.californium.core.CoapClient;
  21 +import org.eclipse.californium.core.CoapResponse;
  22 +import org.eclipse.californium.core.coap.CoAP;
  23 +import org.eclipse.californium.core.coap.MediaTypeRegistry;
  24 +import org.eclipse.californium.elements.exception.ConnectorException;
  25 +import org.junit.After;
  26 +import org.junit.Before;
  27 +import org.junit.Test;
  28 +import org.thingsboard.server.transport.coap.AbstractCoapIntegrationTest;
  29 +import org.thingsboard.server.common.msg.session.FeatureType;
  30 +
  31 +import java.io.IOException;
  32 +import java.util.Arrays;
  33 +import java.util.HashSet;
  34 +import java.util.List;
  35 +import java.util.Map;
  36 +import java.util.Set;
  37 +
  38 +import static org.junit.Assert.assertEquals;
  39 +import static org.junit.Assert.assertNotNull;
  40 +
  41 +@Slf4j
  42 +public abstract class AbstractCoapTimeseriesIntegrationTest extends AbstractCoapIntegrationTest {
  43 +
  44 + private static final String PAYLOAD_VALUES_STR = "{\"key1\":\"value1\", \"key2\":true, \"key3\": 3.0, \"key4\": 4," +
  45 + " \"key5\": {\"someNumber\": 42, \"someArray\": [1,2,3], \"someNestedObject\": {\"key\": \"value\"}}}";
  46 +
  47 + @Before
  48 + public void beforeTest() throws Exception {
  49 + processBeforeTest("Test Post Telemetry device", null, null);
  50 + }
  51 +
  52 + @After
  53 + public void afterTest() throws Exception {
  54 + processAfterTest();
  55 + }
  56 +
  57 + @Test
  58 + public void testPushTelemetry() throws Exception {
  59 + processTestPostTelemetry(null, false);
  60 + }
  61 +
  62 + @Test
  63 + public void testPushTelemetryWithTs() throws Exception {
  64 + String payloadStr = "{\"ts\": 10000, \"values\": " + PAYLOAD_VALUES_STR + "}";
  65 + processTestPostTelemetry(payloadStr.getBytes(), true);
  66 + }
  67 +
  68 + protected void processTestPostTelemetry(byte[] payloadBytes, boolean withTs) throws Exception {
  69 + log.warn("[testPushTelemetry] Device: {}, Transport type: {}", savedDevice.getName(), savedDevice.getType());
  70 + List<String> expectedKeys = Arrays.asList("key1", "key2", "key3", "key4", "key5");
  71 + CoapClient coapClient = getCoapClient(FeatureType.TELEMETRY);
  72 + postTelemetry(coapClient, payloadBytes);
  73 +
  74 + String deviceId = savedDevice.getId().getId().toString();
  75 +
  76 + long start = System.currentTimeMillis();
  77 + long end = System.currentTimeMillis() + 5000;
  78 +
  79 + List<String> actualKeys = null;
  80 + while (start <= end) {
  81 + actualKeys = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + deviceId + "/keys/timeseries", new TypeReference<>() {});
  82 + if (actualKeys.size() == expectedKeys.size()) {
  83 + break;
  84 + }
  85 + Thread.sleep(100);
  86 + start += 100;
  87 + }
  88 + assertNotNull(actualKeys);
  89 +
  90 + Set<String> actualKeySet = new HashSet<>(actualKeys);
  91 + Set<String> expectedKeySet = new HashSet<>(expectedKeys);
  92 +
  93 + assertEquals(expectedKeySet, actualKeySet);
  94 +
  95 + String getTelemetryValuesUrl;
  96 + if (withTs) {
  97 + getTelemetryValuesUrl = "/api/plugins/telemetry/DEVICE/" + deviceId + "/values/timeseries?startTs=0&endTs=15000&keys=" + String.join(",", actualKeySet);
  98 + } else {
  99 + getTelemetryValuesUrl = "/api/plugins/telemetry/DEVICE/" + deviceId + "/values/timeseries?keys=" + String.join(",", actualKeySet);
  100 + }
  101 + start = System.currentTimeMillis();
  102 + end = System.currentTimeMillis() + 5000;
  103 + Map<String, List<Map<String, Object>>> values = null;
  104 + while (start <= end) {
  105 + values = doGetAsyncTyped(getTelemetryValuesUrl, new TypeReference<>() {});
  106 + boolean valid = values.size() == expectedKeys.size();
  107 + if (valid) {
  108 + for (String key : expectedKeys) {
  109 + List<Map<String, Object>> tsValues = values.get(key);
  110 + if (tsValues != null && tsValues.size() > 0) {
  111 + Object ts = tsValues.get(0).get("ts");
  112 + if (ts == null) {
  113 + valid = false;
  114 + break;
  115 + }
  116 + } else {
  117 + valid = false;
  118 + break;
  119 + }
  120 + }
  121 + }
  122 + if (valid) {
  123 + break;
  124 + }
  125 + Thread.sleep(100);
  126 + start += 100;
  127 + }
  128 + assertNotNull(values);
  129 +
  130 + if (withTs) {
  131 + assertTs(values, expectedKeys, 10000, 0);
  132 + }
  133 + assertValues(values, 0);
  134 + }
  135 +
  136 + private void postTelemetry(CoapClient client, byte[] payload) throws IOException, ConnectorException {
  137 + if (payload == null) {
  138 + payload = PAYLOAD_VALUES_STR.getBytes();
  139 + }
  140 + CoapResponse coapResponse = client.setTimeout((long) 60000).post(payload, MediaTypeRegistry.APPLICATION_JSON);
  141 + assertEquals(CoAP.ResponseCode.CREATED, coapResponse.getCode());
  142 + }
  143 +
  144 + private void assertTs(Map<String, List<Map<String, Object>>> deviceValues, List<String> expectedKeys, int ts, int arrayIndex) {
  145 + assertEquals(ts, deviceValues.get(expectedKeys.get(0)).get(arrayIndex).get("ts"));
  146 + assertEquals(ts, deviceValues.get(expectedKeys.get(1)).get(arrayIndex).get("ts"));
  147 + assertEquals(ts, deviceValues.get(expectedKeys.get(2)).get(arrayIndex).get("ts"));
  148 + assertEquals(ts, deviceValues.get(expectedKeys.get(3)).get(arrayIndex).get("ts"));
  149 + assertEquals(ts, deviceValues.get(expectedKeys.get(4)).get(arrayIndex).get("ts"));
  150 + }
  151 +
  152 + private void assertValues(Map<String, List<Map<String, Object>>> deviceValues, int arrayIndex) {
  153 + for (Map.Entry<String, List<Map<String, Object>>> entry : deviceValues.entrySet()) {
  154 + String key = entry.getKey();
  155 + List<Map<String, Object>> tsKv = entry.getValue();
  156 + String value = (String) tsKv.get(arrayIndex).get("value");
  157 + switch (key) {
  158 + case "key1":
  159 + assertEquals("value1", value);
  160 + break;
  161 + case "key2":
  162 + assertEquals("true", value);
  163 + break;
  164 + case "key3":
  165 + assertEquals("3.0", value);
  166 + break;
  167 + case "key4":
  168 + assertEquals("4", value);
  169 + break;
  170 + case "key5":
  171 + assertEquals("{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}", value);
  172 + break;
  173 + }
  174 + }
  175 + }
  176 +
  177 +
  178 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.junit.After;
  20 +import org.junit.Before;
  21 +import org.junit.Test;
  22 +import org.thingsboard.server.common.data.CoapDeviceType;
  23 +import org.thingsboard.server.common.data.TransportPayloadType;
  24 +
  25 +@Slf4j
  26 +public abstract class AbstractCoapTimeseriesJsonIntegrationTest extends AbstractCoapTimeseriesIntegrationTest {
  27 +
  28 + @Before
  29 + public void beforeTest() throws Exception {
  30 + processBeforeTest("Test Post Telemetry device json payload", CoapDeviceType.DEFAULT, TransportPayloadType.JSON);
  31 + }
  32 +
  33 + @After
  34 + public void afterTest() throws Exception {
  35 + processAfterTest();
  36 + }
  37 +
  38 +
  39 + @Test
  40 + public void testPushTelemetry() throws Exception {
  41 + super.testPushTelemetry();
  42 + }
  43 +
  44 + @Test
  45 + public void testPushTelemetryWithTs() throws Exception {
  46 + super.testPushTelemetryWithTs();
  47 + }
  48 +
  49 +
  50 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries;
  17 +
  18 +import com.github.os72.protobuf.dynamic.DynamicSchema;
  19 +import com.google.protobuf.Descriptors;
  20 +import com.google.protobuf.DynamicMessage;
  21 +import com.squareup.wire.schema.internal.parser.ProtoFileElement;
  22 +import lombok.extern.slf4j.Slf4j;
  23 +import org.junit.After;
  24 +import org.junit.Test;
  25 +import org.thingsboard.server.common.data.CoapDeviceType;
  26 +import org.thingsboard.server.common.data.DeviceProfileProvisionType;
  27 +import org.thingsboard.server.common.data.TransportPayloadType;
  28 +import org.thingsboard.server.common.data.device.profile.CoapDeviceProfileTransportConfiguration;
  29 +import org.thingsboard.server.common.data.device.profile.CoapDeviceTypeConfiguration;
  30 +import org.thingsboard.server.common.data.device.profile.DefaultCoapDeviceTypeConfiguration;
  31 +import org.thingsboard.server.common.data.device.profile.DeviceProfileTransportConfiguration;
  32 +import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
  33 +import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
  34 +
  35 +import static org.junit.Assert.assertNotNull;
  36 +import static org.junit.Assert.assertTrue;
  37 +
  38 +@Slf4j
  39 +public abstract class AbstractCoapTimeseriesProtoIntegrationTest extends AbstractCoapTimeseriesIntegrationTest {
  40 +
  41 + @After
  42 + public void afterTest() throws Exception {
  43 + processAfterTest();
  44 + }
  45 +
  46 + @Test
  47 + public void testPushTelemetry() throws Exception {
  48 + super.processBeforeTest("Test Post Telemetry device proto payload", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF);
  49 + DeviceProfileTransportConfiguration transportConfiguration = deviceProfile.getProfileData().getTransportConfiguration();
  50 + assertTrue(transportConfiguration instanceof CoapDeviceProfileTransportConfiguration);
  51 + CoapDeviceProfileTransportConfiguration coapDeviceProfileTransportConfiguration = (CoapDeviceProfileTransportConfiguration) transportConfiguration;
  52 + CoapDeviceTypeConfiguration coapDeviceTypeConfiguration = coapDeviceProfileTransportConfiguration.getCoapDeviceTypeConfiguration();
  53 + assertTrue(coapDeviceTypeConfiguration instanceof DefaultCoapDeviceTypeConfiguration);
  54 + DefaultCoapDeviceTypeConfiguration defaultCoapDeviceTypeConfiguration = (DefaultCoapDeviceTypeConfiguration) coapDeviceTypeConfiguration;
  55 + TransportPayloadTypeConfiguration transportPayloadTypeConfiguration = defaultCoapDeviceTypeConfiguration.getTransportPayloadTypeConfiguration();
  56 + assertTrue(transportPayloadTypeConfiguration instanceof ProtoTransportPayloadConfiguration);
  57 + ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration;
  58 + ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(DEVICE_TELEMETRY_PROTO_SCHEMA);
  59 + DynamicSchema telemetrySchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, "telemetrySchema");
  60 +
  61 + DynamicMessage.Builder nestedJsonObjectBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.JsonObject.NestedJsonObject");
  62 + Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType();
  63 + assertNotNull(nestedJsonObjectBuilderDescriptor);
  64 + DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build();
  65 +
  66 + DynamicMessage.Builder jsonObjectBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.JsonObject");
  67 + Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType();
  68 + assertNotNull(jsonObjectBuilderDescriptor);
  69 + DynamicMessage jsonObject = jsonObjectBuilder
  70 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42)
  71 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1)
  72 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2)
  73 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3)
  74 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject)
  75 + .build();
  76 +
  77 + DynamicMessage.Builder postTelemetryBuilder = telemetrySchema.newMessageBuilder("PostTelemetry");
  78 + Descriptors.Descriptor postTelemetryMsgDescriptor = postTelemetryBuilder.getDescriptorForType();
  79 + assertNotNull(postTelemetryMsgDescriptor);
  80 + DynamicMessage postTelemetryMsg = postTelemetryBuilder
  81 + .setField(postTelemetryMsgDescriptor.findFieldByName("key1"), "value1")
  82 + .setField(postTelemetryMsgDescriptor.findFieldByName("key2"), true)
  83 + .setField(postTelemetryMsgDescriptor.findFieldByName("key3"), 3.0)
  84 + .setField(postTelemetryMsgDescriptor.findFieldByName("key4"), 4)
  85 + .setField(postTelemetryMsgDescriptor.findFieldByName("key5"), jsonObject)
  86 + .build();
  87 + processTestPostTelemetry(postTelemetryMsg.toByteArray(), false);
  88 + }
  89 +
  90 + @Test
  91 + public void testPushTelemetryWithTs() throws Exception {
  92 + String schemaStr = "syntax =\"proto3\";\n" +
  93 + "\n" +
  94 + "package test;\n" +
  95 + "\n" +
  96 + "message PostTelemetry {\n" +
  97 + " int64 ts = 1;\n" +
  98 + " Values values = 2;\n" +
  99 + " \n" +
  100 + " message Values {\n" +
  101 + " string key1 = 3;\n" +
  102 + " bool key2 = 4;\n" +
  103 + " double key3 = 5;\n" +
  104 + " int32 key4 = 6;\n" +
  105 + " JsonObject key5 = 7;\n" +
  106 + " }\n" +
  107 + " \n" +
  108 + " message JsonObject {\n" +
  109 + " int32 someNumber = 8;\n" +
  110 + " repeated int32 someArray = 9;\n" +
  111 + " NestedJsonObject someNestedObject = 10;\n" +
  112 + " message NestedJsonObject {\n" +
  113 + " string key = 11;\n" +
  114 + " }\n" +
  115 + " }\n" +
  116 + "}";
  117 + super.processBeforeTest("Test Post Telemetry device proto payload", CoapDeviceType.DEFAULT, TransportPayloadType.PROTOBUF, schemaStr, null, DeviceProfileProvisionType.DISABLED, null, null);
  118 + DeviceProfileTransportConfiguration transportConfiguration = deviceProfile.getProfileData().getTransportConfiguration();
  119 + assertTrue(transportConfiguration instanceof CoapDeviceProfileTransportConfiguration);
  120 + CoapDeviceProfileTransportConfiguration coapDeviceProfileTransportConfiguration = (CoapDeviceProfileTransportConfiguration) transportConfiguration;
  121 + CoapDeviceTypeConfiguration coapDeviceTypeConfiguration = coapDeviceProfileTransportConfiguration.getCoapDeviceTypeConfiguration();
  122 + assertTrue(coapDeviceTypeConfiguration instanceof DefaultCoapDeviceTypeConfiguration);
  123 + DefaultCoapDeviceTypeConfiguration defaultCoapDeviceTypeConfiguration = (DefaultCoapDeviceTypeConfiguration) coapDeviceTypeConfiguration;
  124 + TransportPayloadTypeConfiguration transportPayloadTypeConfiguration = defaultCoapDeviceTypeConfiguration.getTransportPayloadTypeConfiguration();
  125 + assertTrue(transportPayloadTypeConfiguration instanceof ProtoTransportPayloadConfiguration);
  126 + ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration;
  127 + ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(schemaStr);
  128 + DynamicSchema telemetrySchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, "telemetrySchema");
  129 +
  130 + DynamicMessage.Builder nestedJsonObjectBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.JsonObject.NestedJsonObject");
  131 + Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType();
  132 + assertNotNull(nestedJsonObjectBuilderDescriptor);
  133 + DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build();
  134 +
  135 + DynamicMessage.Builder jsonObjectBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.JsonObject");
  136 + Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType();
  137 + assertNotNull(jsonObjectBuilderDescriptor);
  138 + DynamicMessage jsonObject = jsonObjectBuilder
  139 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42)
  140 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1)
  141 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2)
  142 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3)
  143 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject)
  144 + .build();
  145 +
  146 +
  147 + DynamicMessage.Builder valuesBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.Values");
  148 + Descriptors.Descriptor valuesDescriptor = valuesBuilder.getDescriptorForType();
  149 + assertNotNull(valuesDescriptor);
  150 +
  151 + DynamicMessage valuesMsg = valuesBuilder
  152 + .setField(valuesDescriptor.findFieldByName("key1"), "value1")
  153 + .setField(valuesDescriptor.findFieldByName("key2"), true)
  154 + .setField(valuesDescriptor.findFieldByName("key3"), 3.0)
  155 + .setField(valuesDescriptor.findFieldByName("key4"), 4)
  156 + .setField(valuesDescriptor.findFieldByName("key5"), jsonObject)
  157 + .build();
  158 +
  159 + DynamicMessage.Builder postTelemetryBuilder = telemetrySchema.newMessageBuilder("PostTelemetry");
  160 + Descriptors.Descriptor postTelemetryMsgDescriptor = postTelemetryBuilder.getDescriptorForType();
  161 + assertNotNull(postTelemetryMsgDescriptor);
  162 + DynamicMessage postTelemetryMsg = postTelemetryBuilder
  163 + .setField(postTelemetryMsgDescriptor.findFieldByName("ts"), 10000L)
  164 + .setField(postTelemetryMsgDescriptor.findFieldByName("values"), valuesMsg)
  165 + .build();
  166 +
  167 + processTestPostTelemetry(postTelemetryMsg.toByteArray(), true);
  168 + }
  169 +
  170 +}
... ...
application/src/test/java/org/thingsboard/server/transport/coap/telemetry/timeseries/nosql/CoapTimeseriesNoSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/nosql/MqttAttributesNoSqlIntegrationTest.java
... ... @@ -13,11 +13,11 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes.nosql;
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries.nosql;
17 17
  18 +import org.thingsboard.server.transport.coap.telemetry.timeseries.AbstractCoapTimeseriesIntegrationTest;
18 19 import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.attributes.AbstractMqttAttributesIntegrationTest;
20 20
21 21 @DaoNoSqlTest
22   -public class MqttAttributesNoSqlIntegrationTest extends AbstractMqttAttributesIntegrationTest {
  22 +public class CoapTimeseriesNoSqlIntegrationTest extends AbstractCoapTimeseriesIntegrationTest {
23 23 }
... ...
application/src/test/java/org/thingsboard/server/transport/coap/telemetry/timeseries/nosql/CoapTimeseriesNoSqlJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/nosql/MqttAttributesNoSqlJsonIntegrationTest.java
... ... @@ -13,11 +13,11 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes.nosql;
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries.nosql;
17 17
  18 +import org.thingsboard.server.transport.coap.telemetry.timeseries.AbstractCoapTimeseriesJsonIntegrationTest;
18 19 import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.attributes.AbstractMqttAttributesJsonIntegrationTest;
20 20
21 21 @DaoNoSqlTest
22   -public class MqttAttributesNoSqlJsonIntegrationTest extends AbstractMqttAttributesJsonIntegrationTest {
  22 +public class CoapTimeseriesNoSqlJsonIntegrationTest extends AbstractCoapTimeseriesJsonIntegrationTest {
23 23 }
... ...
application/src/test/java/org/thingsboard/server/transport/coap/telemetry/timeseries/nosql/CoapTimeseriesNoSqlProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/claim/nosql/MqttClaimDeviceNoSqlTest.java
... ... @@ -13,12 +13,11 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.claim.nosql;
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries.nosql;
17 17
  18 +import org.thingsboard.server.transport.coap.telemetry.timeseries.AbstractCoapTimeseriesProtoIntegrationTest;
18 19 import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.claim.AbstractMqttClaimDeviceTest;
20   -
21 20
22 21 @DaoNoSqlTest
23   -public class MqttClaimDeviceNoSqlTest extends AbstractMqttClaimDeviceTest {
  22 +public class CoapTimeseriesNoSqlProtoIntegrationTest extends AbstractCoapTimeseriesProtoIntegrationTest {
24 23 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.telemetry.timeseries.AbstractCoapTimeseriesIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +/**
  22 + * Created by Valerii Sosliuk on 8/22/2017.
  23 + */
  24 +@DaoSqlTest
  25 +public class CoapTimeseriesSqlIntegrationTest extends AbstractCoapTimeseriesIntegrationTest {
  26 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.telemetry.timeseries.AbstractCoapTimeseriesJsonIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +/**
  22 + * Created by Valerii Sosliuk on 8/22/2017.
  23 + */
  24 +@DaoSqlTest
  25 +public class CoapTimeseriesSqlJsonIntegrationTest extends AbstractCoapTimeseriesJsonIntegrationTest {
  26 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.coap.telemetry.timeseries.sql;
  17 +
  18 +import org.thingsboard.server.transport.coap.telemetry.timeseries.AbstractCoapTimeseriesProtoIntegrationTest;
  19 +import org.thingsboard.server.dao.service.DaoSqlTest;
  20 +
  21 +/**
  22 + * Created by Valerii Sosliuk on 8/22/2017.
  23 + */
  24 +@DaoSqlTest
  25 +public class CoapTimeseriesSqlProtoIntegrationTest extends AbstractCoapTimeseriesProtoIntegrationTest {
  26 +}
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.mqtt;
  17 +
  18 +import com.fasterxml.jackson.databind.node.ObjectNode;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
  21 +import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
  22 +import org.eclipse.paho.client.mqttv3.MqttException;
  23 +import org.eclipse.paho.client.mqttv3.MqttMessage;
  24 +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
  25 +import org.junit.Assert;
  26 +import org.springframework.util.StringUtils;
  27 +import org.thingsboard.server.common.data.Device;
  28 +import org.thingsboard.server.common.data.DeviceProfile;
  29 +import org.thingsboard.server.common.data.DeviceProfileProvisionType;
  30 +import org.thingsboard.server.common.data.DeviceProfileType;
  31 +import org.thingsboard.server.common.data.DeviceTransportType;
  32 +import org.thingsboard.server.common.data.Tenant;
  33 +import org.thingsboard.server.common.data.TransportPayloadType;
  34 +import org.thingsboard.server.common.data.User;
  35 +import org.thingsboard.server.common.data.device.profile.AllowCreateNewDevicesDeviceProfileProvisionConfiguration;
  36 +import org.thingsboard.server.common.data.device.profile.CheckPreProvisionedDevicesDeviceProfileProvisionConfiguration;
  37 +import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileConfiguration;
  38 +import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
  39 +import org.thingsboard.server.common.data.device.profile.DeviceProfileProvisionConfiguration;
  40 +import org.thingsboard.server.common.data.device.profile.DisabledDeviceProfileProvisionConfiguration;
  41 +import org.thingsboard.server.common.data.device.profile.JsonTransportPayloadConfiguration;
  42 +import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration;
  43 +import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
  44 +import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
  45 +import org.thingsboard.server.common.data.security.Authority;
  46 +import org.thingsboard.server.common.data.security.DeviceCredentials;
  47 +import org.thingsboard.server.gen.transport.TransportProtos;
  48 +import org.thingsboard.server.transport.AbstractTransportIntegrationTest;
  49 +
  50 +import java.util.List;
  51 +
  52 +import static org.junit.Assert.assertEquals;
  53 +import static org.junit.Assert.assertNotNull;
  54 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  55 +
  56 +@Slf4j
  57 +public abstract class AbstractMqttIntegrationTest extends AbstractTransportIntegrationTest {
  58 +
  59 + protected Device savedGateway;
  60 + protected String gatewayAccessToken;
  61 +
  62 + protected DeviceProfile deviceProfile;
  63 +
  64 + protected void processBeforeTest (String deviceName, String gatewayName, TransportPayloadType payloadType, String telemetryTopic, String attributesTopic) throws Exception {
  65 + this.processBeforeTest(deviceName, gatewayName, payloadType, telemetryTopic, attributesTopic, null, null, DeviceProfileProvisionType.DISABLED, null, null);
  66 + }
  67 +
  68 + protected void processBeforeTest(String deviceName,
  69 + String gatewayName,
  70 + TransportPayloadType payloadType,
  71 + String telemetryTopic,
  72 + String attributesTopic,
  73 + String telemetryProtoSchema,
  74 + String attributesProtoSchema,
  75 + DeviceProfileProvisionType provisionType,
  76 + String provisionKey, String provisionSecret
  77 + ) throws Exception {
  78 + loginSysAdmin();
  79 +
  80 + Tenant tenant = new Tenant();
  81 + tenant.setTitle("My tenant");
  82 + savedTenant = doPost("/api/tenant", tenant, Tenant.class);
  83 + Assert.assertNotNull(savedTenant);
  84 +
  85 + tenantAdmin = new User();
  86 + tenantAdmin.setAuthority(Authority.TENANT_ADMIN);
  87 + tenantAdmin.setTenantId(savedTenant.getId());
  88 + tenantAdmin.setEmail("tenant" + atomicInteger.getAndIncrement() + "@thingsboard.org");
  89 + tenantAdmin.setFirstName("Joe");
  90 + tenantAdmin.setLastName("Downs");
  91 +
  92 + tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1");
  93 +
  94 + Device device = new Device();
  95 + device.setName(deviceName);
  96 + device.setType("default");
  97 +
  98 + Device gateway = new Device();
  99 + gateway.setName(gatewayName);
  100 + gateway.setType("default");
  101 + ObjectNode additionalInfo = mapper.createObjectNode();
  102 + additionalInfo.put("gateway", true);
  103 + gateway.setAdditionalInfo(additionalInfo);
  104 +
  105 + if (payloadType != null) {
  106 + DeviceProfile mqttDeviceProfile = createMqttDeviceProfile(payloadType, telemetryTopic, attributesTopic, telemetryProtoSchema, attributesProtoSchema, provisionType, provisionKey, provisionSecret);
  107 + deviceProfile = doPost("/api/deviceProfile", mqttDeviceProfile, DeviceProfile.class);
  108 + device.setType(deviceProfile.getName());
  109 + device.setDeviceProfileId(deviceProfile.getId());
  110 + gateway.setType(deviceProfile.getName());
  111 + gateway.setDeviceProfileId(deviceProfile.getId());
  112 + }
  113 +
  114 + savedDevice = doPost("/api/device", device, Device.class);
  115 +
  116 + DeviceCredentials deviceCredentials =
  117 + doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class);
  118 +
  119 + savedGateway = doPost("/api/device", gateway, Device.class);
  120 +
  121 + DeviceCredentials gatewayCredentials =
  122 + doGet("/api/device/" + savedGateway.getId().getId().toString() + "/credentials", DeviceCredentials.class);
  123 +
  124 + assertEquals(savedDevice.getId(), deviceCredentials.getDeviceId());
  125 + accessToken = deviceCredentials.getCredentialsId();
  126 + assertNotNull(accessToken);
  127 +
  128 + assertEquals(savedGateway.getId(), gatewayCredentials.getDeviceId());
  129 + gatewayAccessToken = gatewayCredentials.getCredentialsId();
  130 + assertNotNull(gatewayAccessToken);
  131 +
  132 + }
  133 +
  134 + protected void processAfterTest() throws Exception {
  135 + loginSysAdmin();
  136 + if (savedTenant != null) {
  137 + doDelete("/api/tenant/" + savedTenant.getId().getId().toString()).andExpect(status().isOk());
  138 + }
  139 + }
  140 +
  141 + protected MqttAsyncClient getMqttAsyncClient(String accessToken) throws MqttException {
  142 + String clientId = MqttAsyncClient.generateClientId();
  143 + MqttAsyncClient client = new MqttAsyncClient(MQTT_URL, clientId, new MemoryPersistence());
  144 +
  145 + MqttConnectOptions options = new MqttConnectOptions();
  146 + options.setUserName(accessToken);
  147 + client.connect(options).waitForCompletion();
  148 + return client;
  149 + }
  150 +
  151 + protected void publishMqttMsg(MqttAsyncClient client, byte[] payload, String topic) throws MqttException {
  152 + MqttMessage message = new MqttMessage();
  153 + message.setPayload(payload);
  154 + client.publish(topic, message);
  155 + }
  156 +
  157 + protected DeviceProfile createMqttDeviceProfile(TransportPayloadType transportPayloadType,
  158 + String telemetryTopic, String attributesTopic,
  159 + String telemetryProtoSchema, String attributesProtoSchema,
  160 + DeviceProfileProvisionType provisionType,
  161 + String provisionKey, String provisionSecret) {
  162 + DeviceProfile deviceProfile = new DeviceProfile();
  163 + deviceProfile.setName(transportPayloadType.name());
  164 + deviceProfile.setType(DeviceProfileType.DEFAULT);
  165 + deviceProfile.setTransportType(DeviceTransportType.MQTT);
  166 + deviceProfile.setProvisionType(provisionType);
  167 + deviceProfile.setProvisionDeviceKey(provisionKey);
  168 + deviceProfile.setDescription(transportPayloadType.name() + " Test");
  169 + DeviceProfileData deviceProfileData = new DeviceProfileData();
  170 + DefaultDeviceProfileConfiguration configuration = new DefaultDeviceProfileConfiguration();
  171 + MqttDeviceProfileTransportConfiguration mqttDeviceProfileTransportConfiguration = new MqttDeviceProfileTransportConfiguration();
  172 + if (!StringUtils.isEmpty(telemetryTopic)) {
  173 + mqttDeviceProfileTransportConfiguration.setDeviceTelemetryTopic(telemetryTopic);
  174 + }
  175 + if (!StringUtils.isEmpty(attributesTopic)) {
  176 + mqttDeviceProfileTransportConfiguration.setDeviceAttributesTopic(attributesTopic);
  177 + }
  178 + TransportPayloadTypeConfiguration transportPayloadTypeConfiguration;
  179 + if (TransportPayloadType.JSON.equals(transportPayloadType)) {
  180 + transportPayloadTypeConfiguration = new JsonTransportPayloadConfiguration();
  181 + } else {
  182 + ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = new ProtoTransportPayloadConfiguration();
  183 + if (StringUtils.isEmpty(telemetryProtoSchema)) {
  184 + telemetryProtoSchema = DEVICE_TELEMETRY_PROTO_SCHEMA;
  185 + }
  186 + if (StringUtils.isEmpty(attributesProtoSchema)) {
  187 + attributesProtoSchema = DEVICE_ATTRIBUTES_PROTO_SCHEMA;
  188 + }
  189 + protoTransportPayloadConfiguration.setDeviceTelemetryProtoSchema(telemetryProtoSchema);
  190 + protoTransportPayloadConfiguration.setDeviceAttributesProtoSchema(attributesProtoSchema);
  191 + transportPayloadTypeConfiguration = protoTransportPayloadConfiguration;
  192 + }
  193 + mqttDeviceProfileTransportConfiguration.setTransportPayloadTypeConfiguration(transportPayloadTypeConfiguration);
  194 + deviceProfileData.setTransportConfiguration(mqttDeviceProfileTransportConfiguration);
  195 + DeviceProfileProvisionConfiguration provisionConfiguration;
  196 + switch (provisionType) {
  197 + case ALLOW_CREATE_NEW_DEVICES:
  198 + provisionConfiguration = new AllowCreateNewDevicesDeviceProfileProvisionConfiguration(provisionSecret);
  199 + break;
  200 + case CHECK_PRE_PROVISIONED_DEVICES:
  201 + provisionConfiguration = new CheckPreProvisionedDevicesDeviceProfileProvisionConfiguration(provisionSecret);
  202 + break;
  203 + case DISABLED:
  204 + default:
  205 + provisionConfiguration = new DisabledDeviceProfileProvisionConfiguration(provisionSecret);
  206 + break;
  207 + }
  208 + deviceProfileData.setProvisionConfiguration(provisionConfiguration);
  209 + deviceProfileData.setConfiguration(configuration);
  210 + deviceProfile.setProfileData(deviceProfileData);
  211 + deviceProfile.setDefault(false);
  212 + deviceProfile.setDefaultRuleChainId(null);
  213 + return deviceProfile;
  214 + }
  215 +
  216 + protected TransportProtos.PostAttributeMsg getPostAttributeMsg(List<String> expectedKeys) {
  217 + List<TransportProtos.KeyValueProto> kvProtos = getKvProtos(expectedKeys);
  218 + TransportProtos.PostAttributeMsg.Builder builder = TransportProtos.PostAttributeMsg.newBuilder();
  219 + builder.addAllKv(kvProtos);
  220 + return builder.build();
  221 + }
  222 +}
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/AbstractMqttAttributesIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/AbstractMqttAttributesIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes;
  16 +package org.thingsboard.server.transport.mqtt.attributes;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
... ... @@ -21,7 +21,7 @@ import org.eclipse.paho.client.mqttv3.MqttCallback;
21 21 import org.eclipse.paho.client.mqttv3.MqttMessage;
22 22 import org.thingsboard.server.common.data.TransportPayloadType;
23 23 import org.thingsboard.server.gen.transport.TransportProtos;
24   -import org.thingsboard.server.mqtt.AbstractMqttIntegrationTest;
  24 +import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
25 25
26 26 import java.util.ArrayList;
27 27 import java.util.List;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/request/AbstractMqttAttributesRequestIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/request/AbstractMqttAttributesRequestIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.request;
  16 +package org.thingsboard.server.transport.mqtt.attributes.request;
17 17
18 18 import com.google.protobuf.InvalidProtocolBufferException;
19 19 import io.netty.handler.codec.mqtt.MqttQoS;
... ... @@ -27,7 +27,7 @@ import org.junit.Test;
27 27 import org.thingsboard.server.common.data.Device;
28 28 import org.thingsboard.server.common.data.device.profile.MqttTopics;
29 29 import org.thingsboard.server.dao.util.mapping.JacksonUtil;
30   -import org.thingsboard.server.mqtt.attributes.AbstractMqttAttributesIntegrationTest;
  30 +import org.thingsboard.server.transport.mqtt.attributes.AbstractMqttAttributesIntegrationTest;
31 31
32 32 import java.nio.charset.StandardCharsets;
33 33 import java.util.concurrent.CountDownLatch;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/request/AbstractMqttAttributesRequestJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/request/AbstractMqttAttributesRequestJsonIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.request;
  16 +package org.thingsboard.server.transport.mqtt.attributes.request;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.junit.After;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/request/AbstractMqttAttributesRequestProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/request/AbstractMqttAttributesRequestProtoIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.request;
  16 +package org.thingsboard.server.transport.mqtt.attributes.request;
17 17
18 18 import com.github.os72.protobuf.dynamic.DynamicSchema;
19 19 import com.google.protobuf.Descriptors;
... ... @@ -37,6 +37,7 @@ import org.thingsboard.server.common.data.device.profile.MqttTopics;
37 37 import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
38 38 import org.thingsboard.server.gen.transport.TransportApiProtos;
39 39 import org.thingsboard.server.gen.transport.TransportProtos;
  40 +import org.thingsboard.server.transport.mqtt.attributes.AbstractMqttAttributesIntegrationTest;
40 41
41 42 import java.util.ArrayList;
42 43 import java.util.Arrays;
... ... @@ -93,7 +94,7 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends
93 94 }
94 95
95 96 protected void postAttributesAndSubscribeToTopic(Device savedDevice, MqttAsyncClient client) throws Exception {
96   - doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", POST_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
  97 + doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", AbstractMqttAttributesIntegrationTest.POST_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
97 98 DeviceProfileTransportConfiguration transportConfiguration = deviceProfile.getProfileData().getTransportConfiguration();
98 99 assertTrue(transportConfiguration instanceof MqttDeviceProfileTransportConfiguration);
99 100 MqttDeviceProfileTransportConfiguration mqttTransportConfiguration = (MqttDeviceProfileTransportConfiguration) transportConfiguration;
... ... @@ -148,7 +149,7 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends
148 149 client.publish(MqttTopics.GATEWAY_ATTRIBUTES_TOPIC, new MqttMessage(bytes));
149 150 }
150 151
151   - protected void validateResponse(MqttAsyncClient client, CountDownLatch latch, TestMqttCallback callback) throws MqttException, InterruptedException, InvalidProtocolBufferException {
  152 + protected void validateResponse(MqttAsyncClient client, CountDownLatch latch, AbstractMqttAttributesIntegrationTest.TestMqttCallback callback) throws MqttException, InterruptedException, InvalidProtocolBufferException {
152 153 String keys = "attribute1,attribute2,attribute3,attribute4,attribute5";
153 154 TransportApiProtos.AttributesRequest.Builder attributesRequestBuilder = TransportApiProtos.AttributesRequest.newBuilder();
154 155 attributesRequestBuilder.setClientKeys(keys);
... ... @@ -170,7 +171,7 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends
170 171 assertTrue(actualSharedKeyValueProtos.containsAll(expectedSharedKeyValueProtos));
171 172 }
172 173
173   - protected void validateClientResponseGateway(MqttAsyncClient client, TestMqttCallback callback) throws MqttException, InterruptedException, InvalidProtocolBufferException {
  174 + protected void validateClientResponseGateway(MqttAsyncClient client, AbstractMqttAttributesIntegrationTest.TestMqttCallback callback) throws MqttException, InterruptedException, InvalidProtocolBufferException {
174 175 String keys = "attribute1,attribute2,attribute3,attribute4,attribute5";
175 176 TransportApiProtos.GatewayAttributesRequestMsg gatewayAttributesRequestMsg = getGatewayAttributesRequestMsg(keys, true);
176 177 client.publish(MqttTopics.GATEWAY_ATTRIBUTES_REQUEST_TOPIC, new MqttMessage(gatewayAttributesRequestMsg.toByteArray()));
... ... @@ -189,7 +190,7 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends
189 190 assertTrue(actualClientKeyValueProtos.containsAll(expectedClientKeyValueProtos));
190 191 }
191 192
192   - protected void validateSharedResponseGateway(MqttAsyncClient client, TestMqttCallback callback) throws MqttException, InterruptedException, InvalidProtocolBufferException {
  193 + protected void validateSharedResponseGateway(MqttAsyncClient client, AbstractMqttAttributesIntegrationTest.TestMqttCallback callback) throws MqttException, InterruptedException, InvalidProtocolBufferException {
193 194 String keys = "attribute1,attribute2,attribute3,attribute4,attribute5";
194 195 TransportApiProtos.GatewayAttributesRequestMsg gatewayAttributesRequestMsg = getGatewayAttributesRequestMsg(keys, false);
195 196 client.publish(MqttTopics.GATEWAY_ATTRIBUTES_REQUEST_TOPIC, new MqttMessage(gatewayAttributesRequestMsg.toByteArray()));
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/request/sql/MqttAttributesRequestJsonSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/request/sql/MqttAttributesRequestJsonSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.request.sql;
  16 +package org.thingsboard.server.transport.mqtt.attributes.request.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.attributes.request.AbstractMqttAttributesRequestJsonIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.attributes.request.AbstractMqttAttributesRequestJsonIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesRequestJsonSqlIntegrationTest extends AbstractMqttAttributesRequestJsonIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/request/sql/MqttAttributesRequestProtoSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/request/sql/MqttAttributesRequestProtoSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.request.sql;
  16 +package org.thingsboard.server.transport.mqtt.attributes.request.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.attributes.request.AbstractMqttAttributesRequestProtoIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.attributes.request.AbstractMqttAttributesRequestProtoIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesRequestProtoSqlIntegrationTest extends AbstractMqttAttributesRequestProtoIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/request/sql/MqttAttributesRequestSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/request/sql/MqttAttributesRequestSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.request.sql;
  16 +package org.thingsboard.server.transport.mqtt.attributes.request.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.attributes.request.AbstractMqttAttributesRequestIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.attributes.request.AbstractMqttAttributesRequestIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesRequestSqlIntegrationTest extends AbstractMqttAttributesRequestIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/updates/AbstractMqttAttributesUpdatesIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/updates/AbstractMqttAttributesUpdatesIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.updates;
  16 +package org.thingsboard.server.transport.mqtt.attributes.updates;
17 17
18 18 import com.google.protobuf.InvalidProtocolBufferException;
19 19 import io.netty.handler.codec.mqtt.MqttQoS;
... ... @@ -26,7 +26,7 @@ import org.thingsboard.server.common.data.Device;
26 26 import org.thingsboard.server.common.data.TransportPayloadType;
27 27 import org.thingsboard.server.common.data.device.profile.MqttTopics;
28 28 import org.thingsboard.server.dao.util.mapping.JacksonUtil;
29   -import org.thingsboard.server.mqtt.attributes.AbstractMqttAttributesIntegrationTest;
  29 +import org.thingsboard.server.transport.mqtt.attributes.AbstractMqttAttributesIntegrationTest;
30 30
31 31 import java.nio.charset.StandardCharsets;
32 32 import java.util.concurrent.TimeUnit;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/updates/AbstractMqttAttributesUpdatesJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/updates/AbstractMqttAttributesUpdatesJsonIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.updates;
  16 +package org.thingsboard.server.transport.mqtt.attributes.updates;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.junit.After;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/updates/AbstractMqttAttributesUpdatesProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/updates/AbstractMqttAttributesUpdatesProtoIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.updates;
  16 +package org.thingsboard.server.transport.mqtt.attributes.updates;
17 17
18 18 import com.google.protobuf.InvalidProtocolBufferException;
19 19 import lombok.extern.slf4j.Slf4j;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/updates/sql/MqttAttributesUpdatesSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/updates/sql/MqttAttributesUpdatesSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.updates.sql;
  16 +package org.thingsboard.server.transport.mqtt.attributes.updates.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.attributes.updates.AbstractMqttAttributesUpdatesIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.attributes.updates.AbstractMqttAttributesUpdatesIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesUpdatesSqlIntegrationTest extends AbstractMqttAttributesUpdatesIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/updates/sql/MqttAttributesUpdatesSqlJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/updates/sql/MqttAttributesUpdatesSqlJsonIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.updates.sql;
  16 +package org.thingsboard.server.transport.mqtt.attributes.updates.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.attributes.updates.AbstractMqttAttributesUpdatesJsonIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.attributes.updates.AbstractMqttAttributesUpdatesJsonIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesUpdatesSqlJsonIntegrationTest extends AbstractMqttAttributesUpdatesJsonIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/attributes/updates/sql/MqttAttributesUpdatesSqlProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/updates/sql/MqttAttributesUpdatesSqlProtoIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.updates.sql;
  16 +package org.thingsboard.server.transport.mqtt.attributes.updates.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.attributes.updates.AbstractMqttAttributesUpdatesProtoIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.attributes.updates.AbstractMqttAttributesUpdatesProtoIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesUpdatesSqlProtoIntegrationTest extends AbstractMqttAttributesUpdatesProtoIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/claim/AbstractMqttClaimDeviceTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/claim/AbstractMqttClaimDeviceTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.claim;
  16 +package org.thingsboard.server.transport.mqtt.claim;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
... ... @@ -29,7 +29,7 @@ import org.thingsboard.server.common.data.device.profile.MqttTopics;
29 29 import org.thingsboard.server.common.data.security.Authority;
30 30 import org.thingsboard.server.dao.device.claim.ClaimResponse;
31 31 import org.thingsboard.server.dao.device.claim.ClaimResult;
32   -import org.thingsboard.server.mqtt.AbstractMqttIntegrationTest;
  32 +import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
33 33
34 34 import static org.junit.Assert.assertEquals;
35 35 import static org.junit.Assert.assertNotNull;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/claim/AbstractMqttClaimJsonDeviceTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/claim/AbstractMqttClaimJsonDeviceTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.claim;
  16 +package org.thingsboard.server.transport.mqtt.claim;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.junit.After;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/claim/AbstractMqttClaimProtoDeviceTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/claim/AbstractMqttClaimProtoDeviceTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.claim;
  16 +package org.thingsboard.server.transport.mqtt.claim;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/claim/sql/MqttClaimDeviceJsonSqlTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/claim/sql/MqttClaimDeviceJsonSqlTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.claim.sql;
  16 +package org.thingsboard.server.transport.mqtt.claim.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.claim.AbstractMqttClaimJsonDeviceTest;
  19 +import org.thingsboard.server.transport.mqtt.claim.AbstractMqttClaimJsonDeviceTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttClaimDeviceJsonSqlTest extends AbstractMqttClaimJsonDeviceTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/claim/sql/MqttClaimDeviceProtoSqlTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/claim/sql/MqttClaimDeviceProtoSqlTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.claim.sql;
  16 +package org.thingsboard.server.transport.mqtt.claim.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.claim.AbstractMqttClaimProtoDeviceTest;
  19 +import org.thingsboard.server.transport.mqtt.claim.AbstractMqttClaimProtoDeviceTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttClaimDeviceProtoSqlTest extends AbstractMqttClaimProtoDeviceTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/claim/sql/MqttClaimDeviceSqlTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/claim/sql/MqttClaimDeviceSqlTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.claim.sql;
  16 +package org.thingsboard.server.transport.mqtt.claim.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.claim.AbstractMqttClaimDeviceTest;
  19 +import org.thingsboard.server.transport.mqtt.claim.AbstractMqttClaimDeviceTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttClaimDeviceSqlTest extends AbstractMqttClaimDeviceTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/provision/AbstractMqttProvisionJsonDeviceTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/provision/AbstractMqttProvisionJsonDeviceTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.provision;
  16 +package org.thingsboard.server.transport.mqtt.provision;
17 17
18 18 import com.google.gson.JsonObject;
19 19 import io.netty.handler.codec.mqtt.MqttQoS;
... ... @@ -38,7 +38,7 @@ import org.thingsboard.server.dao.device.DeviceCredentialsService;
38 38 import org.thingsboard.server.dao.device.DeviceService;
39 39 import org.thingsboard.server.dao.device.provision.ProvisionResponseStatus;
40 40 import org.thingsboard.server.dao.util.mapping.JacksonUtil;
41   -import org.thingsboard.server.mqtt.AbstractMqttIntegrationTest;
  41 +import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
42 42
43 43 import java.util.concurrent.CountDownLatch;
44 44 import java.util.concurrent.TimeUnit;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/provision/AbstractMqttProvisionProtoDeviceTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/provision/AbstractMqttProvisionProtoDeviceTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.provision;
  16 +package org.thingsboard.server.transport.mqtt.provision;
17 17
18 18 import io.netty.handler.codec.mqtt.MqttQoS;
19 19 import lombok.extern.slf4j.Slf4j;
... ... @@ -45,9 +45,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRespo
45 45 import org.thingsboard.server.gen.transport.TransportProtos.ValidateBasicMqttCredRequestMsg;
46 46 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg;
47 47 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceX509CertRequestMsg;
48   -import org.thingsboard.server.mqtt.AbstractMqttIntegrationTest;
  48 +import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
49 49
50   -import java.util.UUID;
51 50 import java.util.concurrent.CountDownLatch;
52 51 import java.util.concurrent.TimeUnit;
53 52
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/provision/sql/MqttProvisionDeviceJsonSqlTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/provision/sql/MqttProvisionDeviceJsonSqlTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.provision.sql;
  16 +package org.thingsboard.server.transport.mqtt.provision.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.provision.AbstractMqttProvisionJsonDeviceTest;
  19 +import org.thingsboard.server.transport.mqtt.provision.AbstractMqttProvisionJsonDeviceTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttProvisionDeviceJsonSqlTest extends AbstractMqttProvisionJsonDeviceTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/provision/sql/MqttProvisionDeviceProtoSqlTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/provision/sql/MqttProvisionDeviceProtoSqlTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.provision.sql;
  16 +package org.thingsboard.server.transport.mqtt.provision.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.provision.AbstractMqttProvisionProtoDeviceTest;
  19 +import org.thingsboard.server.transport.mqtt.provision.AbstractMqttProvisionProtoDeviceTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttProvisionDeviceProtoSqlTest extends AbstractMqttProvisionProtoDeviceTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/rpc/AbstractMqttServerSideRpcDefaultIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcDefaultIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.rpc;
  16 +package org.thingsboard.server.transport.mqtt.rpc;
17 17
18 18 import com.datastax.oss.driver.api.core.uuid.Uuids;
19 19 import lombok.extern.slf4j.Slf4j;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.rpc;
  16 +package org.thingsboard.server.transport.mqtt.rpc;
17 17
18 18 import com.fasterxml.jackson.databind.JsonNode;
19 19 import com.google.protobuf.InvalidProtocolBufferException;
... ... @@ -31,7 +31,7 @@ import org.thingsboard.server.common.data.Device;
31 31 import org.thingsboard.server.common.data.TransportPayloadType;
32 32 import org.thingsboard.server.common.data.device.profile.MqttTopics;
33 33 import org.thingsboard.server.dao.util.mapping.JacksonUtil;
34   -import org.thingsboard.server.mqtt.AbstractMqttIntegrationTest;
  34 +import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
35 35
36 36 import java.util.Arrays;
37 37 import java.util.concurrent.CountDownLatch;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/rpc/AbstractMqttServerSideRpcJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcJsonIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.rpc;
  16 +package org.thingsboard.server.transport.mqtt.rpc;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/rpc/AbstractMqttServerSideRpcProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcProtoIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.rpc;
  16 +package org.thingsboard.server.transport.mqtt.rpc;
17 17
18 18 import com.google.protobuf.InvalidProtocolBufferException;
19 19 import lombok.extern.slf4j.Slf4j;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/rpc/sql/MqttServerSideRpcJsonSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/rpc/sql/MqttServerSideRpcJsonSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.rpc.sql;
  16 +package org.thingsboard.server.transport.mqtt.rpc.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.rpc.AbstractMqttServerSideRpcJsonIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.rpc.AbstractMqttServerSideRpcJsonIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttServerSideRpcJsonSqlIntegrationTest extends AbstractMqttServerSideRpcJsonIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/rpc/sql/MqttServerSideRpcProtoSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/rpc/sql/MqttServerSideRpcProtoSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.rpc.sql;
  16 +package org.thingsboard.server.transport.mqtt.rpc.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.rpc.AbstractMqttServerSideRpcProtoIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.rpc.AbstractMqttServerSideRpcProtoIntegrationTest;
20 20
21 21
22 22 @DaoSqlTest
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/rpc/sql/MqttServerSideRpcSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/rpc/sql/MqttServerSideRpcSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.rpc.sql;
  16 +package org.thingsboard.server.transport.mqtt.rpc.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.rpc.AbstractMqttServerSideRpcDefaultIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.rpc.AbstractMqttServerSideRpcDefaultIntegrationTest;
20 20
21 21 /**
22 22 * Created by Valerii Sosliuk on 8/22/2017.
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/attributes/AbstractMqttAttributesIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/AbstractMqttAttributesIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.attributes;
17 17
18 18 import com.fasterxml.jackson.core.JsonProcessingException;
19 19 import com.fasterxml.jackson.core.type.TypeReference;
... ... @@ -25,7 +25,7 @@ import org.junit.Test;
25 25 import org.thingsboard.server.common.data.Device;
26 26 import org.thingsboard.server.common.data.device.profile.MqttTopics;
27 27 import org.thingsboard.server.common.data.id.DeviceId;
28   -import org.thingsboard.server.mqtt.AbstractMqttIntegrationTest;
  28 +import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
29 29
30 30 import java.util.Arrays;
31 31 import java.util.HashSet;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/attributes/AbstractMqttAttributesJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/AbstractMqttAttributesJsonIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.attributes;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.junit.After;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/attributes/AbstractMqttAttributesProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/AbstractMqttAttributesProtoIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.attributes;
17 17
18 18 import com.github.os72.protobuf.dynamic.DynamicSchema;
19 19 import com.google.protobuf.Descriptors;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/attributes/sql/MqttAttributesSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/sql/MqttAttributesSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes.sql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.attributes.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.attributes.AbstractMqttAttributesIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.attributes.AbstractMqttAttributesIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesSqlIntegrationTest extends AbstractMqttAttributesIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/attributes/sql/MqttAttributesSqlJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/sql/MqttAttributesSqlJsonIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes.sql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.attributes.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.attributes.AbstractMqttAttributesJsonIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.attributes.AbstractMqttAttributesJsonIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesSqlJsonIntegrationTest extends AbstractMqttAttributesJsonIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/attributes/sql/MqttAttributesSqlProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/attributes/sql/MqttAttributesSqlProtoIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.attributes.sql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.attributes.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.attributes.AbstractMqttAttributesProtoIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.attributes.AbstractMqttAttributesProtoIntegrationTest;
20 20
21 21 @DaoSqlTest
22 22 public class MqttAttributesSqlProtoIntegrationTest extends AbstractMqttAttributesProtoIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/AbstractMqttTimeseriesIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/AbstractMqttTimeseriesIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries;
17 17
18 18 import com.fasterxml.jackson.core.type.TypeReference;
19 19 import io.netty.handler.codec.mqtt.MqttQoS;
... ... @@ -26,12 +26,11 @@ import org.eclipse.paho.client.mqttv3.MqttMessage;
26 26 import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
27 27 import org.junit.After;
28 28 import org.junit.Before;
29   -import org.junit.Ignore;
30 29 import org.junit.Test;
31 30 import org.thingsboard.server.common.data.Device;
32 31 import org.thingsboard.server.common.data.device.profile.MqttTopics;
33 32 import org.thingsboard.server.common.data.id.DeviceId;
34   -import org.thingsboard.server.mqtt.AbstractMqttIntegrationTest;
  33 +import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
35 34
36 35 import java.util.Arrays;
37 36 import java.util.HashSet;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/AbstractMqttTimeseriesJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/AbstractMqttTimeseriesJsonIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/AbstractMqttTimeseriesProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/AbstractMqttTimeseriesProtoIntegrationTest.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries;
17 17
18 18 import com.github.os72.protobuf.dynamic.DynamicSchema;
19 19 import com.google.protobuf.Descriptors;
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/nosql/MqttTimeseriesNoSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/nosql/MqttTimeseriesNoSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries.nosql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries.nosql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.timeseries.AbstractMqttTimeseriesIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.timeseries.AbstractMqttTimeseriesIntegrationTest;
20 20
21 21 /**
22 22 * Created by Valerii Sosliuk on 8/22/2017.
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/nosql/MqttTimeseriesNoSqlJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/nosql/MqttTimeseriesNoSqlJsonIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries.nosql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries.nosql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.timeseries.AbstractMqttTimeseriesJsonIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.timeseries.AbstractMqttTimeseriesJsonIntegrationTest;
20 20
21 21 @DaoNoSqlTest
22 22 public class MqttTimeseriesNoSqlJsonIntegrationTest extends AbstractMqttTimeseriesJsonIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/nosql/MqttTimeseriesNoSqlProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/nosql/MqttTimeseriesNoSqlProtoIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries.nosql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries.nosql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.timeseries.AbstractMqttTimeseriesProtoIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.timeseries.AbstractMqttTimeseriesProtoIntegrationTest;
20 20
21 21 @DaoNoSqlTest
22 22 public class MqttTimeseriesNoSqlProtoIntegrationTest extends AbstractMqttTimeseriesProtoIntegrationTest {
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/sql/MqttTimeseriesSqlIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/sql/MqttTimeseriesSqlIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries.sql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.timeseries.AbstractMqttTimeseriesIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.timeseries.AbstractMqttTimeseriesIntegrationTest;
20 20
21 21 /**
22 22 * Created by Valerii Sosliuk on 8/22/2017.
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/sql/MqttTimeseriesSqlJsonIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/sql/MqttTimeseriesSqlJsonIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries.sql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.timeseries.AbstractMqttTimeseriesJsonIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.timeseries.AbstractMqttTimeseriesJsonIntegrationTest;
20 20
21 21 /**
22 22 * Created by Valerii Sosliuk on 8/22/2017.
... ...
application/src/test/java/org/thingsboard/server/transport/mqtt/telemetry/timeseries/sql/MqttTimeseriesSqlProtoIntegrationTest.java renamed from application/src/test/java/org/thingsboard/server/mqtt/telemetry/timeseries/sql/MqttTimeseriesSqlProtoIntegrationTest.java
... ... @@ -13,10 +13,10 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.telemetry.timeseries.sql;
  16 +package org.thingsboard.server.transport.mqtt.telemetry.timeseries.sql;
17 17
18 18 import org.thingsboard.server.dao.service.DaoSqlTest;
19   -import org.thingsboard.server.mqtt.telemetry.timeseries.AbstractMqttTimeseriesProtoIntegrationTest;
  19 +import org.thingsboard.server.transport.mqtt.telemetry.timeseries.AbstractMqttTimeseriesProtoIntegrationTest;
20 20
21 21 /**
22 22 * Created by Valerii Sosliuk on 8/22/2017.
... ...
common/data/src/main/java/org/thingsboard/server/common/data/CoapDeviceType.java renamed from application/src/test/java/org/thingsboard/server/mqtt/attributes/request/nosql/MqttAttributesRequestNoSqlIntegrationTest.java
... ... @@ -13,12 +13,9 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.mqtt.attributes.request.nosql;
  16 +package org.thingsboard.server.common.data;
17 17
18   -import org.thingsboard.server.dao.service.DaoNoSqlTest;
19   -import org.thingsboard.server.mqtt.attributes.request.AbstractMqttAttributesRequestIntegrationTest;
20   -
21   -
22   -@DaoNoSqlTest
23   -public class MqttAttributesRequestNoSqlIntegrationTest extends AbstractMqttAttributesRequestIntegrationTest {
  18 +public enum CoapDeviceType {
  19 + DEFAULT,
  20 + EFENTO
24 21 }
... ...
... ... @@ -18,5 +18,6 @@ package org.thingsboard.server.common.data;
18 18 public enum DeviceTransportType {
19 19 DEFAULT,
20 20 MQTT,
21   - LWM2M
  21 + LWM2M,
  22 + COAP
22 23 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.common.data.device.data;
  17 +
  18 +import com.fasterxml.jackson.annotation.JsonAnyGetter;
  19 +import com.fasterxml.jackson.annotation.JsonAnySetter;
  20 +import com.fasterxml.jackson.annotation.JsonIgnore;
  21 +import lombok.Data;
  22 +import org.thingsboard.server.common.data.DeviceTransportType;
  23 +
  24 +import java.util.HashMap;
  25 +import java.util.Map;
  26 +
  27 +@Data
  28 +public class CoapDeviceTransportConfiguration implements DeviceTransportConfiguration {
  29 +
  30 + @JsonIgnore
  31 + private Map<String, Object> properties = new HashMap<>();
  32 +
  33 + @JsonAnyGetter
  34 + public Map<String, Object> properties() {
  35 + return this.properties;
  36 + }
  37 +
  38 + @JsonAnySetter
  39 + public void put(String name, Object value) {
  40 + this.properties.put(name, value);
  41 + }
  42 +
  43 + @Override
  44 + public DeviceTransportType getType() {
  45 + return DeviceTransportType.COAP;
  46 + }
  47 +
  48 +}
... ...
... ... @@ -29,7 +29,8 @@ import org.thingsboard.server.common.data.DeviceTransportType;
29 29 @JsonSubTypes({
30 30 @JsonSubTypes.Type(value = DefaultDeviceTransportConfiguration.class, name = "DEFAULT"),
31 31 @JsonSubTypes.Type(value = MqttDeviceTransportConfiguration.class, name = "MQTT"),
32   - @JsonSubTypes.Type(value = Lwm2mDeviceTransportConfiguration.class, name = "LWM2M")})
  32 + @JsonSubTypes.Type(value = Lwm2mDeviceTransportConfiguration.class, name = "LWM2M"),
  33 + @JsonSubTypes.Type(value = CoapDeviceTransportConfiguration.class, name = "COAP")})
33 34 public interface DeviceTransportConfiguration {
34 35
35 36 @JsonIgnore
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.common.data.device.profile;
  17 +
  18 +import lombok.Data;
  19 +import org.thingsboard.server.common.data.DeviceTransportType;
  20 +
  21 +@Data
  22 +public class CoapDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
  23 +
  24 + private CoapDeviceTypeConfiguration coapDeviceTypeConfiguration;
  25 +
  26 + @Override
  27 + public DeviceTransportType getType() {
  28 + return DeviceTransportType.COAP;
  29 + }
  30 +
  31 + public CoapDeviceTypeConfiguration getCoapDeviceTypeConfiguration() {
  32 + if (coapDeviceTypeConfiguration != null) {
  33 + return coapDeviceTypeConfiguration;
  34 + } else {
  35 + return new DefaultCoapDeviceTypeConfiguration();
  36 + }
  37 + }
  38 +}
\ No newline at end of file
... ...