|
|
|
@ -17,19 +17,23 @@ package org.thingsboard.server.transport.coap.attributes.updates; |
|
|
|
|
|
|
|
import com.google.protobuf.InvalidProtocolBufferException; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.eclipse.californium.core.CoapClient; |
|
|
|
import org.awaitility.Awaitility; |
|
|
|
import org.eclipse.californium.core.CoapHandler; |
|
|
|
import org.eclipse.californium.core.CoapObserveRelation; |
|
|
|
import org.eclipse.californium.core.CoapResponse; |
|
|
|
import org.eclipse.californium.core.coap.CoAP; |
|
|
|
import org.eclipse.californium.core.coap.Request; |
|
|
|
import org.eclipse.californium.core.server.resources.Resource; |
|
|
|
import org.junit.After; |
|
|
|
import org.junit.Before; |
|
|
|
import org.junit.Test; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.thingsboard.common.util.JacksonUtil; |
|
|
|
import org.thingsboard.server.coapserver.DefaultCoapServerService; |
|
|
|
import org.thingsboard.server.common.transport.service.DefaultTransportService; |
|
|
|
import org.thingsboard.server.transport.coap.CoapTransportResource; |
|
|
|
import org.thingsboard.server.transport.coap.attributes.AbstractCoapAttributesIntegrationTest; |
|
|
|
import org.thingsboard.server.common.msg.session.FeatureType; |
|
|
|
|
|
|
|
import java.nio.charset.StandardCharsets; |
|
|
|
import java.util.concurrent.CountDownLatch; |
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
@ -37,6 +41,7 @@ import java.util.concurrent.TimeUnit; |
|
|
|
import static org.junit.Assert.assertEquals; |
|
|
|
import static org.junit.Assert.assertNotNull; |
|
|
|
import static org.junit.Assert.assertTrue; |
|
|
|
import static org.mockito.Mockito.spy; |
|
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
|
|
|
|
|
|
|
@Slf4j |
|
|
|
@ -47,8 +52,20 @@ public abstract class AbstractCoapAttributesUpdatesIntegrationTest extends Abstr |
|
|
|
protected static final String POST_ATTRIBUTES_PAYLOAD_ON_CURRENT_STATE_NOTIFICATION = "{\"attribute1\":\"value\",\"attribute2\":false,\"attribute3\":41.0,\"attribute4\":72," + |
|
|
|
"\"attribute5\":{\"someNumber\":41,\"someArray\":[],\"someNestedObject\":{\"key\":\"value\"}}}"; |
|
|
|
|
|
|
|
CoapTransportResource coapTransportResource; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
DefaultCoapServerService defaultCoapServerService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
DefaultTransportService defaultTransportService; |
|
|
|
|
|
|
|
@Before |
|
|
|
public void beforeTest() throws Exception { |
|
|
|
Resource api = defaultCoapServerService.getCoapServer().getRoot().getChild("api"); |
|
|
|
coapTransportResource = spy( (CoapTransportResource) api.getChild("v1") ); |
|
|
|
api.delete(api.getChild("v1") ); |
|
|
|
api.add(coapTransportResource); |
|
|
|
processBeforeTest("Test Subscribe to attribute updates", null, null); |
|
|
|
} |
|
|
|
|
|
|
|
@ -89,21 +106,23 @@ public abstract class AbstractCoapAttributesUpdatesIntegrationTest extends Abstr |
|
|
|
} |
|
|
|
|
|
|
|
latch = new CountDownLatch(1); |
|
|
|
|
|
|
|
int expectedObserveCnt = callback.getObserve().intValue() + 1; |
|
|
|
doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", POST_ATTRIBUTES_PAYLOAD, String.class, status().isOk()); |
|
|
|
latch.await(3, TimeUnit.SECONDS); |
|
|
|
|
|
|
|
validateUpdateAttributesResponse(callback); |
|
|
|
validateUpdateAttributesResponse(callback, expectedObserveCnt); |
|
|
|
|
|
|
|
latch = new CountDownLatch(1); |
|
|
|
|
|
|
|
latch = new CountDownLatch(1); |
|
|
|
int expectedObserveBeforeDeleteCnt = callback.getObserve().intValue() + 1; |
|
|
|
doDelete("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/SHARED_SCOPE?keys=attribute5", String.class); |
|
|
|
latch.await(3, TimeUnit.SECONDS); |
|
|
|
|
|
|
|
validateDeleteAttributesResponse(callback); |
|
|
|
|
|
|
|
validateDeleteAttributesResponse(callback, expectedObserveBeforeDeleteCnt); |
|
|
|
observeRelation.proactiveCancel(); |
|
|
|
assertTrue(observeRelation.isCanceled()); |
|
|
|
|
|
|
|
awaitClientAfterCancelObserve(); |
|
|
|
} |
|
|
|
|
|
|
|
protected void validateCurrentStateAttributesResponse(TestCoapCallback callback) throws InvalidProtocolBufferException { |
|
|
|
@ -124,20 +143,20 @@ public abstract class AbstractCoapAttributesUpdatesIntegrationTest extends Abstr |
|
|
|
assertEquals("{}", response); |
|
|
|
} |
|
|
|
|
|
|
|
protected void validateUpdateAttributesResponse(TestCoapCallback callback) throws InvalidProtocolBufferException { |
|
|
|
protected void validateUpdateAttributesResponse(TestCoapCallback callback, int expectedObserveCnt) throws InvalidProtocolBufferException { |
|
|
|
assertNotNull(callback.getPayloadBytes()); |
|
|
|
assertNotNull(callback.getObserve()); |
|
|
|
assertEquals(CoAP.ResponseCode.CONTENT, callback.getResponseCode()); |
|
|
|
assertEquals(1, callback.getObserve().intValue()); |
|
|
|
assertEquals(expectedObserveCnt, callback.getObserve().intValue()); |
|
|
|
String response = new String(callback.getPayloadBytes(), StandardCharsets.UTF_8); |
|
|
|
assertEquals(JacksonUtil.toJsonNode(POST_ATTRIBUTES_PAYLOAD), JacksonUtil.toJsonNode(response)); |
|
|
|
} |
|
|
|
|
|
|
|
protected void validateDeleteAttributesResponse(TestCoapCallback callback) throws InvalidProtocolBufferException { |
|
|
|
protected void validateDeleteAttributesResponse(TestCoapCallback callback, int expectedObserveCnt) throws InvalidProtocolBufferException { |
|
|
|
assertNotNull(callback.getPayloadBytes()); |
|
|
|
assertNotNull(callback.getObserve()); |
|
|
|
assertEquals(CoAP.ResponseCode.CONTENT, callback.getResponseCode()); |
|
|
|
assertEquals(2, callback.getObserve().intValue()); |
|
|
|
assertEquals(expectedObserveCnt, callback.getObserve().intValue()); |
|
|
|
String response = new String(callback.getPayloadBytes(), StandardCharsets.UTF_8); |
|
|
|
assertEquals(JacksonUtil.toJsonNode(RESPONSE_ATTRIBUTES_PAYLOAD_DELETED), JacksonUtil.toJsonNode(response)); |
|
|
|
} |
|
|
|
@ -180,4 +199,13 @@ public abstract class AbstractCoapAttributesUpdatesIntegrationTest extends Abstr |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private void awaitClientAfterCancelObserve() { |
|
|
|
Awaitility.await("awaitClientAfterCancelObserve") |
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
.atMost(5, TimeUnit.SECONDS) |
|
|
|
.until(()->{ |
|
|
|
log.error("awaiting defaultTransportService.sessions is empty"); |
|
|
|
return defaultTransportService.sessions.isEmpty();}); |
|
|
|
} |
|
|
|
} |
|
|
|
|