5 changed files with 907 additions and 5 deletions
@ -0,0 +1,156 @@ |
|||
/** |
|||
* Copyright © 2016-2021 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.transport.lwm2m.rpc.sql; |
|||
|
|||
import com.fasterxml.jackson.databind.JsonNode; |
|||
import com.fasterxml.jackson.databind.node.ObjectNode; |
|||
import org.eclipse.leshan.core.ResponseCode; |
|||
import org.eclipse.leshan.core.node.LwM2mPath; |
|||
import org.junit.Test; |
|||
import org.thingsboard.common.util.JacksonUtil; |
|||
import org.thingsboard.server.transport.lwm2m.rpc.AbstractRpcLwM2MIntegrationTest; |
|||
|
|||
import java.util.Arrays; |
|||
import java.util.Set; |
|||
import java.util.concurrent.ConcurrentHashMap; |
|||
import java.util.stream.Collectors; |
|||
|
|||
import static org.junit.Assert.assertEquals; |
|||
import static org.junit.Assert.assertTrue; |
|||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInstanceId_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_2; |
|||
|
|||
|
|||
public class RpcLwm2mIntegrationDiscoverTest extends AbstractRpcLwM2MIntegrationTest { |
|||
|
|||
/** |
|||
* DiscoverAll |
|||
* |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testDiscoverAll_Return_CONTENT_LinksAllObjectsAllInstancesOfClient() throws Exception { |
|||
String setRpcRequest = "{\"method\":\"DiscoverAll\"}"; |
|||
String actualResult = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
JsonNode rpcActualValue = JacksonUtil.toJsonNode(rpcActualResult.get("value").asText()); |
|||
Set actualObjects = ConcurrentHashMap.newKeySet(); |
|||
Set actualInstances = ConcurrentHashMap.newKeySet(); |
|||
rpcActualValue.forEach(node -> { |
|||
if (!node.get("url").asText().equals("/")) { |
|||
LwM2mPath path = new LwM2mPath(node.get("url").asText()); |
|||
actualObjects.add("/" + path.getObjectId()); |
|||
if (path.isObjectInstance()) { |
|||
actualInstances.add("/" + path.getObjectId() + "/" + path.getObjectInstanceId()); |
|||
} |
|||
} |
|||
}); |
|||
assertEquals(expectedInstances, actualInstances); |
|||
assertEquals(expectedObjects, actualObjects); |
|||
} |
|||
|
|||
/** |
|||
* Discover {"id":"/3"} |
|||
* |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testDiscoverObject_Return_CONTENT_LinksInstancesAndResourcesOnLyExpectedObject() { |
|||
expectedObjectIdVers.forEach(expected -> { |
|||
try { |
|||
String actualResult = sendDiscover((String) expected); |
|||
String expectedObjectId = objectIdVerToObjectId ((String) expected); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String[] actualValues = rpcActualResult.get("value").asText().split(","); |
|||
assertTrue(actualValues.length > 0); |
|||
assertEquals(0, Arrays.stream(actualValues).filter(path -> !path.contains(expectedObjectId)).collect(Collectors.toList()).size()); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Discover {"id":"3/0"} |
|||
* |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testDiscoverInstance_Return_CONTENT_LinksResourcesOnLyExpectedInstance() throws Exception { |
|||
String expected = (String) expectedObjectIdVerInstances.stream().findAny().get(); |
|||
String actualResult = sendDiscover(expected); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String expectedObjectInstanceId = objectInstanceIdVerToObjectInstanceId (expected); |
|||
String[] actualValues = rpcActualResult.get("value").asText().split(","); |
|||
assertTrue(actualValues.length > 0); |
|||
assertEquals(0, Arrays.stream(actualValues).filter(path -> !path.contains(expectedObjectInstanceId)).collect(Collectors.toList()).size()); |
|||
} |
|||
|
|||
/** |
|||
* Discover {"id":"3/0/14"} |
|||
* |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testDiscoverResource_Return_CONTENT_LinksResourceOnLyExpectedResource() throws Exception { |
|||
String expectedInstance = (String) expectedInstances.stream().findFirst().get(); |
|||
String expectedObjectInstanceId = objectInstanceIdVerToObjectInstanceId (expectedInstance); |
|||
LwM2mPath expectedPath = new LwM2mPath(expectedObjectInstanceId); |
|||
int expectedResource = client.getClient().getObjectTree().getObjectEnablers().get(expectedPath.getObjectId()).getObjectModel().resources.entrySet().stream().findAny().get().getKey(); |
|||
String expected = expectedInstance + "/" + expectedResource; |
|||
String actualResult = sendDiscover(expected); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String expectedResourceId = "<" + expectedObjectInstanceId + "/" + expectedResource + ">"; |
|||
String actualValue = rpcActualResult.get("value").asText(); |
|||
assertEquals(expectedResourceId, actualValue ); |
|||
|
|||
} |
|||
|
|||
/** |
|||
* Discover {"id":"2/0/2"} |
|||
* |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testDiscoverInstanceAbsentInObject_Return_NOT_FOUND() throws Exception { |
|||
String expected = objectIdVer_2 + "/" + objectInstanceId_0; |
|||
String actualResult = sendDiscover(expected); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.NOT_FOUND.getName(), rpcActualResult.get("result").asText()); |
|||
} |
|||
/** |
|||
* Discover {"id":"2/0/2"} |
|||
* |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testDiscoverResourceAbsentInObject_Return_NOT_FOUND() throws Exception { |
|||
String expected = objectIdVer_2 + "/" + objectInstanceId_0 + "/" + resourceId_2; |
|||
String actualResult = sendDiscover(expected); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.NOT_FOUND.getName(), rpcActualResult.get("result").asText()); |
|||
} |
|||
|
|||
private String sendDiscover(String path) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"Discover\", \"params\": {\"id\": \"" + path + "\"}}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
} |
|||
@ -0,0 +1,190 @@ |
|||
/** |
|||
* Copyright © 2016-2021 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.transport.lwm2m.rpc.sql; |
|||
|
|||
import com.fasterxml.jackson.databind.node.ObjectNode; |
|||
import org.eclipse.leshan.core.ResponseCode; |
|||
import org.eclipse.leshan.core.node.LwM2mPath; |
|||
import org.junit.Test; |
|||
import org.thingsboard.common.util.JacksonUtil; |
|||
import org.thingsboard.server.transport.lwm2m.rpc.AbstractRpcLwM2MIntegrationTest; |
|||
|
|||
import static org.eclipse.leshan.core.LwM2mId.ACCESS_CONTROL; |
|||
import static org.junit.Assert.assertEquals; |
|||
import static org.junit.Assert.assertTrue; |
|||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.BINARY_APP_DATA_CONTAINER; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInstanceId_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_3; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; |
|||
|
|||
public class RpcLwm2mIntegrationObserveTest extends AbstractRpcLwM2MIntegrationTest { |
|||
|
|||
/** |
|||
* ObserveReadAll |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testObserveReadAllNothingObservation_Result_CONTENT_Value_Count_0() throws Exception { |
|||
String actualResult = sendObserve("ObserveCancelAll", null); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
actualResult = sendObserve("ObserveReadAll", null); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
assertEquals("[]", rpcActualResult.get("value").asText()); |
|||
} |
|||
|
|||
/** |
|||
* Observe {"id":"/3/0/9"} |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testObserveSingleResource_Result_CONTENT_Value_SingleResource() throws Exception { |
|||
String expectedIdVer = objectInstanceIdVer_3 + "/" + resourceId_9; |
|||
String actualResult = sendObserve("Observe", expectedIdVer); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
assertTrue(rpcActualResult.get("value").asText().contains("LwM2mSingleResource")); |
|||
} |
|||
|
|||
/** |
|||
* Observe {"id":"/3_1.1/0/13"} |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testObserveWithBadVersion_Result_BadRequest_ErrorMsg_BadVersionMustBe1_0() throws Exception { |
|||
String expectedInstance = (String) expectedInstances.stream().filter(path -> !((String)path).contains("_")).findFirst().get(); |
|||
LwM2mPath expectedPath = new LwM2mPath(expectedInstance); |
|||
int expectedResource = client.getClient().getObjectTree().getObjectEnablers().get(expectedPath.getObjectId()).getObjectModel().resources.entrySet().stream().findAny().get().getKey(); |
|||
String expectedId = "/" + expectedPath.getObjectId() + "_1.2" + "/" + expectedPath.getObjectInstanceId() + "/" + expectedResource; |
|||
String actualResult = sendObserve("Observe", expectedId); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText()); |
|||
String expected = "Specified resource id " + expectedId +" is not valid version! Must be version: 1.0"; |
|||
assertEquals(expected, rpcActualResult.get("error").asText()); |
|||
} |
|||
|
|||
/** |
|||
* Not implemented Instance |
|||
* Observe {"id":"/2/0"} |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testObserveNoImplementedInstanceOnDevice_Result_NotFound() throws Exception { |
|||
String objectInstanceIdVer = (String) expectedObjectIdVers.stream().filter(path -> ((String)path).contains("/" + ACCESS_CONTROL)).findFirst().get(); |
|||
String expected = objectInstanceIdVer + "/" + objectInstanceId_0; |
|||
String actualResult = sendObserve("Observe", expected); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.NOT_FOUND.getName(), rpcActualResult.get("result").asText()); |
|||
} |
|||
|
|||
/** |
|||
* Not implemented Resource |
|||
* Observe {"id":"/19_1.1/0/0"} |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testObserveNoImplementedResourceOnDeviceValueNull_Result_BadRequest() throws Exception { |
|||
String objectIdVer = (String) expectedObjectIdVers.stream().filter(path -> ((String)path).contains("/" + BINARY_APP_DATA_CONTAINER)).findFirst().get(); |
|||
String expected = objectIdVer + "/" + objectInstanceId_0 + "/" + resourceId_0; |
|||
String actualResult = sendObserve("Observe", expected); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
String expectedValue = "values MUST NOT be null"; |
|||
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText()); |
|||
assertEquals(expectedValue, rpcActualResult.get("error").asText()); |
|||
} |
|||
|
|||
/** |
|||
* Repeated request on Observe |
|||
* Observe {"id":"/5/0/0"} |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testObserveRSourceNotRead_Result_METHOD_NOT_ALLOWED() throws Exception { |
|||
String expectedId = objectInstanceIdVer_5 + "/" + resourceId_0; |
|||
sendObserve("Observe", expectedId); |
|||
String actualResult = sendObserve("Observe", expectedId); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.METHOD_NOT_ALLOWED.getName(), rpcActualResult.get("result").asText()); |
|||
} |
|||
|
|||
/** |
|||
* Repeated request on Observe |
|||
* Observe {"id":"/3/0/0"} |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testObserveRepeatedRequestObserveOnDevice_Result_BAD_REQUEST_ErrorMsg_AlreadyRegistered() throws Exception { |
|||
String expectedId = objectInstanceIdVer_3 + "/" + resourceId_0; |
|||
sendObserve("Observe", expectedId); |
|||
String actualResult = sendObserve("Observe", expectedId); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText()); |
|||
String expected = "Observation is already registered!"; |
|||
assertEquals(expected, rpcActualResult.get("error").asText()); |
|||
} |
|||
|
|||
/** |
|||
* ObserveReadAll |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testObserveReadAll_Result_CONTENT_Value_Contains_Paths_Count_ObserveAll() throws Exception { |
|||
sendObserve("ObserveCancelAll", null); |
|||
String expectedId_0 = objectInstanceIdVer_3 + "/" + resourceId_0; |
|||
String expectedId_9 = objectInstanceIdVer_3 + "/" + resourceId_9; |
|||
sendObserve("Observe", expectedId_0); |
|||
sendObserve("Observe", expectedId_9); |
|||
String actualResult = sendObserve("ObserveReadAll", null); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
assertTrue(actualValues.contains(expectedId_0)); |
|||
assertTrue(actualValues.contains(expectedId_9)); |
|||
assertEquals(2, actualValues.split(",").length); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* ObserveCancel {"id":"/3/0/3"} |
|||
* ObserveCancel {"id":"/5/0/3"} |
|||
*/ |
|||
@Test |
|||
public void testObserveCancelOneResource_Result_CONTENT_Value_Count_1() throws Exception { |
|||
sendObserve("ObserveCancelAll", null); |
|||
String expectedId_0 = objectInstanceIdVer_3 + "/" + resourceId_0; |
|||
String expectedId_3 = objectInstanceIdVer_5 + "/" + resourceId_3; |
|||
sendObserve("Observe", expectedId_0); |
|||
sendObserve("Observe", expectedId_3); |
|||
String actualResult = sendObserve("ObserveCancel", expectedId_0); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
assertEquals("1", rpcActualResult.get("value").asText()); |
|||
} |
|||
|
|||
private String sendObserve(String method, String params) throws Exception { |
|||
String sendRpcRequest; |
|||
if (params == null) { |
|||
sendRpcRequest = "{\"method\": \"" + method + "\"}"; |
|||
} |
|||
else { |
|||
sendRpcRequest = "{\"method\": \"" + method + "\", \"params\": {\"id\": \"" + params + "\"}}"; |
|||
} |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, sendRpcRequest, String.class, status().isOk()); |
|||
} |
|||
} |
|||
@ -0,0 +1,226 @@ |
|||
/** |
|||
* Copyright © 2016-2021 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.transport.lwm2m.rpc.sql; |
|||
|
|||
import com.fasterxml.jackson.databind.node.ObjectNode; |
|||
import org.eclipse.leshan.core.ResponseCode; |
|||
import org.eclipse.leshan.core.node.LwM2mPath; |
|||
import org.junit.Test; |
|||
import org.thingsboard.common.util.JacksonUtil; |
|||
import org.thingsboard.server.transport.lwm2m.rpc.AbstractRpcLwM2MIntegrationTest; |
|||
|
|||
import static org.eclipse.leshan.core.LwM2mId.SERVER; |
|||
import static org.junit.Assert.assertEquals; |
|||
import static org.junit.Assert.assertTrue; |
|||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.BINARY_APP_DATA_CONTAINER; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInstanceId_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInstanceId_1; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceIdName_19_0_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceIdName_19_1_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceIdName_3_14; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceIdName_3_9; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_1; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_11; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_14; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_2; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; |
|||
|
|||
|
|||
public class RpcLwm2mIntegrationReadTest extends AbstractRpcLwM2MIntegrationTest { |
|||
|
|||
/** |
|||
* Read {"id":"/3"} |
|||
* Read {"id":"/6"}... |
|||
*/ |
|||
@Test |
|||
public void testReadAllObjectsInClientById_Result_CONTENT_Value_IsLwM2mObject_IsInstances() throws Exception { |
|||
expectedObjectIdVers.forEach(expected -> { |
|||
try { |
|||
String actualResult = sendRPCById((String) expected); |
|||
String expectedObjectId = objectIdVerToObjectId ((String) expected); |
|||
LwM2mPath expectedPath = new LwM2mPath(expectedObjectId); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String expectedObjectInstances = "LwM2mObject [id=" + expectedPath.getObjectId() + ", instances={0=LwM2mObjectInstance [id=0, resources="; |
|||
if (expectedPath.getObjectId() == 2) { |
|||
expectedObjectInstances = "LwM2mObject [id=2, instances={}]"; |
|||
} |
|||
assertTrue(rpcActualResult.get("value").asText().contains(expectedObjectInstances)); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Read {"id":"/5/0"} |
|||
* |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testReadAllInstancesInClientById_Result_CONTENT_Value_IsInstances_IsResources() throws Exception{ |
|||
expectedObjectIdVerInstances.forEach(expected -> { |
|||
try { |
|||
String actualResult = sendRPCById((String) expected); |
|||
String expectedObjectId = objectInstanceIdVerToObjectInstanceId ((String) expected); |
|||
LwM2mPath expectedPath = new LwM2mPath(expectedObjectId); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String expectedObjectInstances = "LwM2mObjectInstance [id=" + expectedPath.getObjectInstanceId() + ", resources={"; |
|||
assertTrue(rpcActualResult.get("value").asText().contains(expectedObjectInstances)); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Read {"id":"/19/1/0"} |
|||
* |
|||
* @throws Exception |
|||
*/ |
|||
@Test |
|||
public void testReadMultipleResourceById_Result_CONTENT_Value_IsLwM2mMultipleResource() throws Exception { |
|||
String expectedIdVer = objectInstanceIdVer_3 +"/" + resourceId_11 ; |
|||
String actualResult = sendRPCById(expectedIdVer); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String expected = "LwM2mMultipleResource [id=" + resourceId_11 + ", values={"; |
|||
assertTrue(rpcActualResult.get("value").asText().contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* Read {"id":"/3/0/14"} |
|||
*/ |
|||
@Test |
|||
public void testReadSingleResourceById_Result_CONTENT_Value_IsLwM2mSingleResource() throws Exception { |
|||
String expectedIdVer = objectInstanceIdVer_3 +"/" + resourceId_14 ; |
|||
String actualResult = sendRPCById(expectedIdVer); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String expected = "LwM2mSingleResource [id=" + resourceId_14 + ", value="; |
|||
assertTrue(rpcActualResult.get("value").asText().contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* Read {"key":"UtfOffset"} |
|||
*/ |
|||
@Test |
|||
public void testReadSingleResourceByKey_Result_CONTENT_Value_IsLwM2mSingleResource() throws Exception { |
|||
String expectedKey = resourceIdName_3_14 ; |
|||
String actualResult = sendRPCByKey(expectedKey); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String expected = "LwM2mSingleResource [id=" + resourceId_14 + ", value="; |
|||
assertTrue(rpcActualResult.get("value").asText().contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* ReadComposite {"ids":["/1_1.2", "/3_1.0/0/1", "/3_1.0/0/11"]} |
|||
*/ |
|||
@Test |
|||
public void testReadCompositeSingleResourceByIds_Result_CONTENT_Value_IsObjectIsLwM2mSingleResourceIsLwM2mMultipleResource() throws Exception { |
|||
String expectedIdVer_1 = (String) expectedObjectIdVers.stream().filter(path -> (!((String)path).contains("/" + BINARY_APP_DATA_CONTAINER) && ((String)path).contains("/" + SERVER))).findFirst().get(); |
|||
String objectId_1 = objectIdVerToObjectId(expectedIdVer_1); |
|||
String expectedIdVer3_0_1 = objectInstanceIdVer_3 + "/" + resourceId_1; |
|||
String expectedIdVer3_0_11 = objectInstanceIdVer_3 + "/" + resourceId_11; |
|||
String objectInstanceId_3 = objectIdVerToObjectId(objectInstanceIdVer_3); |
|||
String expectedIds = "[\"" + expectedIdVer_1 + "\", \"" + expectedIdVer3_0_1 + "\", \"" + expectedIdVer3_0_11 + "\"]"; |
|||
String actualResult = sendCompositeRPCByIds(expectedIds); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String expected1 = objectId_1 + "=LwM2mObject [id=" + new LwM2mPath(objectId_1).getObjectId() + ", instances={"; |
|||
String expected3_0_1 = objectInstanceId_3 + "/" + resourceId_1 + "=LwM2mSingleResource [id=" + resourceId_1 + ", value="; |
|||
String expected3_0_11 = objectInstanceId_3 + "/" + resourceId_11 + "=LwM2mMultipleResource [id=" + resourceId_11 + ", values={"; |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
assertTrue(actualValues.contains(expected1)); |
|||
assertTrue(actualValues.contains(expected3_0_1)); |
|||
assertTrue(actualValues.contains(expected3_0_11)); |
|||
} |
|||
|
|||
/** |
|||
* ReadComposite {"ids":["/1_1.2/0/1", "/1_1.2/0/2", "/3_1.0/0"]} |
|||
*/ |
|||
@Test |
|||
public void testReadCompositeSingleResourceByIds_Result_CONTENT_Value_IsObjectInstanceIsLwM2mSingleResource() throws Exception { |
|||
String expectedIdVer3_0 = objectInstanceIdVer_3; |
|||
String expectedIdVer1_0_1 = objectInstanceIdVer_1 + "/" + resourceId_1; |
|||
String expectedIdVer1_0_2 = objectInstanceIdVer_1 + "/" + resourceId_2; |
|||
String expectedIds = "[\"" + expectedIdVer1_0_1 + "\", \"" + expectedIdVer1_0_2 + "\", \"" + expectedIdVer3_0 + "\"]"; |
|||
String actualResult = sendCompositeRPCByIds(expectedIds); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String objectInstanceId_3 = objectInstanceIdVerToObjectInstanceId(objectInstanceIdVer_3); |
|||
LwM2mPath path = new LwM2mPath(objectInstanceId_3); |
|||
String expected3_0 = objectInstanceId_3 + "=LwM2mObjectInstance [id=" + path.getObjectInstanceId() + ", resources={"; |
|||
String objectInstanceId_1 = objectInstanceIdVerToObjectInstanceId(objectInstanceIdVer_1); |
|||
String expected1_0_1 = objectInstanceId_1 + "/" + resourceId_1 + "=LwM2mSingleResource [id=" + resourceId_1 + ", value="; |
|||
String expected1_0_2 = objectInstanceId_1 + "/" + resourceId_2 + "=null"; |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
assertTrue(actualValues.contains(expected3_0)); |
|||
assertTrue(actualValues.contains(expected1_0_1)); |
|||
assertTrue(actualValues.contains(expected1_0_2)); |
|||
} |
|||
|
|||
/** |
|||
* ReadComposite {"keys":["batteryLevel", "UtfOffset", "dataRead", "dataWrite"]} |
|||
*/ |
|||
@Test |
|||
public void testReadCompositeSingleResourceByKeys_Result_CONTENT_Value_3_0_IsLwM2mSingleResource_19_0_0_AND_19_0_1_Null() throws Exception { |
|||
String expectedKey3_0_9 = resourceIdName_3_9; |
|||
String expectedKey3_0_14 = resourceIdName_3_14; |
|||
String expectedKey19_0_0 = resourceIdName_19_0_0; |
|||
String expectedKey19_1_0 = resourceIdName_19_1_0; |
|||
String expectedKeys = "[\"" + expectedKey3_0_9 + "\", \"" + expectedKey3_0_14 + "\", \"" + expectedKey19_0_0 + "\", \"" + expectedKey19_1_0 + "\"]"; |
|||
String actualResult = sendCompositeRPCByKeys(expectedKeys); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); |
|||
String objectInstanceId_3 = objectInstanceIdVerToObjectInstanceId(objectInstanceIdVer_3); |
|||
String objectId_19 = objectIdVerToObjectId(objectIdVer_19); |
|||
String expected3_0_9 = objectInstanceId_3 + "/" + resourceId_9 + "=LwM2mSingleResource [id=" + resourceId_9 + ", value="; |
|||
String expected3_0_14 = objectInstanceId_3 + "/" + resourceId_14 + "=LwM2mSingleResource [id=" + resourceId_14 + ", value="; |
|||
String expected19_0_0 = objectId_19 + "/" + objectInstanceId_0 + "/" + resourceId_0 + "=null"; |
|||
String expected19_1_0 = objectId_19 + "/" + objectInstanceId_1 + "/" + resourceId_0 + "=null"; |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
assertTrue(actualValues.contains(expected3_0_9)); |
|||
assertTrue(actualValues.contains(expected3_0_14)); |
|||
assertTrue(actualValues.contains(expected19_0_0)); |
|||
assertTrue(actualValues.contains(expected19_1_0)); |
|||
} |
|||
|
|||
|
|||
private String sendRPCById(String path) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"Read\", \"params\": {\"id\": \"" + path + "\"}}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
|
|||
private String sendRPCByKey(String key) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"Read\", \"params\": {\"key\": \"" + key + "\"}}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
|
|||
private String sendCompositeRPCByIds(String paths) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"ReadComposite\", \"params\": {\"ids\":" + paths + "}}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
|
|||
private String sendCompositeRPCByKeys(String keys) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"ReadComposite\", \"params\": {\"keys\":" + keys + "}}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
} |
|||
@ -0,0 +1,330 @@ |
|||
/** |
|||
* Copyright © 2016-2021 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.transport.lwm2m.rpc.sql; |
|||
|
|||
import com.fasterxml.jackson.databind.node.ObjectNode; |
|||
import org.eclipse.leshan.core.ResponseCode; |
|||
import org.junit.Test; |
|||
import org.thingsboard.common.util.JacksonUtil; |
|||
import org.thingsboard.server.transport.lwm2m.rpc.AbstractRpcLwM2MIntegrationTest; |
|||
|
|||
import static org.junit.Assert.assertEquals; |
|||
import static org.junit.Assert.assertTrue; |
|||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.BINARY_APP_DATA_CONTAINER; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInstanceId_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInstanceId_1; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceIdName_3_14; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_0; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_14; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_15; |
|||
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; |
|||
|
|||
public class RpcLwm2mIntegrationWriteTest extends AbstractRpcLwM2MIntegrationTest { |
|||
|
|||
|
|||
/** |
|||
* id |
|||
* WriteReplace {"id":"3/0/14","value":"+12"} |
|||
*/ |
|||
@Test |
|||
public void testWriteReplaceValueSingleResourceById_Result_CHANGED() throws Exception { |
|||
String expectedPath = objectInstanceIdVer_3 + "/" + resourceId_14; |
|||
String expectedValue = "+12"; |
|||
String actualResult = sendRPCWriteStringById("WriteReplace", expectedPath, expectedValue); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|||
actualResult = sendRPCReadById(expectedPath); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
String expected = "LwM2mSingleResource [id=" + resourceId_14 + ", value=" + expectedValue + ", type=STRING]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* key |
|||
* WriteReplace {"key":"timezone","value":"+10"} |
|||
*/ |
|||
@Test |
|||
public void testWriteReplaceValueSingleResourceByKey_Result_CHANGED() throws Exception { |
|||
String expectedKey = resourceIdName_3_14; |
|||
String expectedValue = "+09"; |
|||
String actualResult = sendRPCWriteByKey("WriteReplace", expectedKey, expectedValue); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|||
actualResult = sendRPCReadByKey(expectedKey); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
String expected = "LwM2mSingleResource [id=" + resourceId_14 + ", value=" + expectedValue + ", type=STRING]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* id |
|||
* WriteReplace {"id": "/19_1.1/0/0","value": {"0":"0000ad45675600", "15":"1525ad45675600cdef"}} |
|||
*/ |
|||
@Test |
|||
public void testWriteReplaceValueMultipleResource_Result_CHANGED_Value_Multi_Instance_Resource_must_in_Json_format() throws Exception { |
|||
String expectedPath = objectIdVer_19 + "/" + objectInstanceId_0 + "/" + resourceId_0; |
|||
int resourceInstanceId0 = 0; |
|||
int resourceInstanceId15 = 15; |
|||
String expectedValue0 = "0000ad45675600"; |
|||
String expectedValue15 = "1525ad45675600cdef"; |
|||
String expectedValue = "{\"" + resourceInstanceId0 + "\":\"" + expectedValue0 + "\", \"" + resourceInstanceId15 + "\":\"" + expectedValue15 + "\"}"; |
|||
String actualResult = sendRPCWriteObjectById("WriteReplace", expectedPath, expectedValue); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|||
String expectedPath0 = expectedPath + "/" + resourceInstanceId0; |
|||
String expectedPath15 = expectedPath + "/" + resourceInstanceId15; |
|||
actualResult = sendRPCReadById(expectedPath0); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
String expected = "LwM2mResourceInstance [id=" + resourceInstanceId0 + ", value=" + expectedValue0.length()/2 + "Bytes, type=OPAQUE]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
actualResult = sendRPCReadById(expectedPath15); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
actualValues = rpcActualResult.get("value").asText(); |
|||
expected = "LwM2mResourceInstance [id=" + resourceInstanceId15 + ", value=" + expectedValue15.length()/2 + "Bytes, type=OPAQUE]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* id |
|||
* WriteReplace {"id":"/19/0/0","value":"0081"}.. |
|||
*/ |
|||
@Test |
|||
public void testWriteReplaceValueMultipleResourceAsSingleResource_Result_BAD_REQUEST_Value_Multi_Instance_Resource_must_be_in_Json_format() throws Exception { |
|||
String objectInstanceIdVer_19 = (String) expectedObjectIdVerInstances.stream().filter(path -> ((String) path).contains("/" + BINARY_APP_DATA_CONTAINER)).findFirst().get(); |
|||
String expectedPath = objectInstanceIdVer_19 + "/" + resourceId_0; |
|||
String expectedValue = "0081"; |
|||
String actualResult = sendRPCWriteStringById("WriteReplace", expectedPath, expectedValue); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText()); |
|||
String actualValues = rpcActualResult.get("error").asText(); |
|||
String expected = "Resource value is: String. Value of Multi-Instance Resource must be in Json format!"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* bad - only read |
|||
* WriteReplace {"id":"/3/0/9","value":90} |
|||
* {"result":"METHOD_NOT_ALLOWED"} |
|||
*/ |
|||
@Test |
|||
public void testWriteReplaceValueSingleResourceR_ById_Result_CHANGED() throws Exception { |
|||
String expectedPath = objectInstanceIdVer_3 + "/" + resourceId_9; |
|||
Integer expectedValue = 90; |
|||
String actualResult = sendRPCWriteObjectById("WriteReplace", expectedPath, expectedValue); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.METHOD_NOT_ALLOWED.getName(), rpcActualResult.get("result").asText()); |
|||
} |
|||
|
|||
/** |
|||
* ids |
|||
* WriteUpdate {"id":"/3/0","value":{"14":"+5","15":"Kiyv/Europe"}} |
|||
* |
|||
*/ |
|||
@Test |
|||
public void testWriteUpdateValueSingleResourceById_Result_CHANGED() throws Exception { |
|||
String expectedPath = objectInstanceIdVer_3; |
|||
String expectedValue14 = "+5"; |
|||
String expectedValue15 = "Kiyv/Europe"; |
|||
String expectedValue = "{\"" + resourceId_14 + "\":\"" + expectedValue14 + "\",\"" + resourceId_15 + "\":\"" + expectedValue15 + "\"}"; |
|||
String actualResult = sendRPCWriteObjectById("WriteUpdate", expectedPath, expectedValue); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|||
String expectedPath14 = objectInstanceIdVer_3 + "/" + resourceId_14; |
|||
String expectedPath15 = objectInstanceIdVer_3 + "/" + resourceId_15; |
|||
actualResult = sendRPCReadById(expectedPath14); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
String expected = "LwM2mSingleResource [id=" + resourceId_14 + ", value=" + expectedValue14 + ", type=STRING]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
actualResult = sendRPCReadById(expectedPath15); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
actualValues = rpcActualResult.get("value").asText(); |
|||
expected = "LwM2mSingleResource [id=" + resourceId_15 + ", value=" + expectedValue15 + ", type=STRING]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* id |
|||
* WriteUpdate {"id": "/19_1.1/0","value": {"0":{"0":"00ad456756", "25":"25ad456756"}}} |
|||
*/ |
|||
@Test |
|||
public void testWriteUpdateValueMultipleResourceById_Result_CHANGED() throws Exception { |
|||
String expectedPath = objectIdVer_19 + "/" + objectInstanceId_0; |
|||
int resourceInstanceId0 = 0; |
|||
int resourceInstanceId25 = 25; |
|||
String expectedValue0 = "00ad45675600"; |
|||
String expectedValue25 = "25ad45675600cdef"; |
|||
String expectedValue = "{\"" + resourceId_0 + "\":{\"" + resourceInstanceId0 + "\":\"" + expectedValue0 + "\", \"" + resourceInstanceId25 + "\":\"" + expectedValue25 + "\"}}"; |
|||
String actualResult = sendRPCWriteObjectById("WriteUpdate", expectedPath, expectedValue); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|||
String expectedPath0 = expectedPath + "/" + resourceId_0 + "/" + resourceInstanceId0; |
|||
String expectedPath25 =expectedPath + "/" + resourceId_0 + "/" + resourceInstanceId25; |
|||
actualResult = sendRPCReadById(expectedPath0); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
String expected = "LwM2mResourceInstance [id=" + resourceInstanceId0 + ", value=" + expectedValue0.length()/2 + "Bytes, type=OPAQUE]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
actualResult = sendRPCReadById(expectedPath25); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
actualValues = rpcActualResult.get("value").asText(); |
|||
expected = "LwM2mResourceInstance [id=" + resourceInstanceId25 + ", value=" + expectedValue25.length()/2 + "Bytes, type=OPAQUE]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* ResourceInstance + KeySingleResource + IdSingleResource |
|||
* WriteComposite {"nodes":{"/19/1/0/2":"00001234", "UtfOffset":"+04", "/3/0/15":"Kiyv/Europe"}} |
|||
*/ |
|||
@Test |
|||
public void testWriteCompositeValueSingleResourceResourceInstanceByIdKey_Result_CHANGED() throws Exception { |
|||
int resourceInstanceId2 = 2; |
|||
String expectedPath19_1_0_2 = objectIdVer_19 + "/" + objectInstanceId_1 + "/" + resourceId_0 + "/" + resourceInstanceId2; |
|||
String expectedValue19_1_0_2 = "00001234"; |
|||
String expectedKey3_0_14 = resourceIdName_3_14; |
|||
String expectedValue3_0_14 = "+04"; |
|||
String expectedPath3_0_15 = objectInstanceIdVer_3 + "/" + resourceId_15; |
|||
String expectedValue3_0_15 = "Kiyv/Europe"; |
|||
String nodes = "{\"" + expectedPath19_1_0_2 + "\":\"" + expectedValue19_1_0_2 + "\", \"" + expectedKey3_0_14 + |
|||
"\":\"" + expectedValue3_0_14 + "\", \"" + expectedPath3_0_15 + "\":\"" + expectedValue3_0_15 + "\"}"; |
|||
String actualResult = sendCompositeRPC(nodes); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|||
actualResult = sendRPCReadById(expectedPath19_1_0_2); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
String expected = "LwM2mResourceInstance [id=" + resourceInstanceId2 + ", value=" + expectedValue19_1_0_2.length()/2 + "Bytes, type=OPAQUE]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
actualResult = sendRPCReadByKey(expectedKey3_0_14); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
actualValues = rpcActualResult.get("value").asText(); |
|||
expected = "LwM2mSingleResource [id=" + resourceId_14 + ", value=" + expectedValue3_0_14 + ", type=STRING]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
actualResult = sendRPCReadById(expectedPath3_0_15); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
actualValues = rpcActualResult.get("value").asText(); |
|||
expected = "LwM2mSingleResource [id=" + resourceId_15 + ", value=" + expectedValue3_0_15 + ", type=STRING]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* multipleResource == error |
|||
* bad - cannot be used for value Json, only primitive: SingleResource, ResourceInstance (for Json: WriteUpdate, WriteReplace) |
|||
* WriteComposite {"nodes":{"/19/0/0":{"0":"abcd5678", "10":"abcd5678"}}} |
|||
*/ |
|||
@Test |
|||
public void testWriteCompositeValueSingleMultipleResourceByIdKey_Result_BAD_REQUEST_WriteComposite_operation_for_SingleResources_or_and_ResourceInstance() throws Exception { |
|||
String nodes = "{\"/19/0/0\":{\"0\":\"abcd5678\", \"10\":\"abcd5678\"}}"; |
|||
String actualResult = sendCompositeRPC(nodes); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText()); |
|||
String actualValues = rpcActualResult.get("error").asText(); |
|||
String expectedNodes = nodes.replaceAll("\"", "").replaceAll(":", "="); |
|||
String expected = String.format("nodes: %s is not validate value. " + |
|||
"The WriteComposite operation is only used for SingleResources or/and ResourceInstance.", expectedNodes); |
|||
assertEquals(expected, actualValues); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* create_2_instances_in_object |
|||
* new ObjectInstance if Object is Multiple & Resource Single |
|||
* Create {"id":"/19/2","value":{"1":2}} |
|||
* Create {"id":"/19/3","value":{"0":{"0":"00AC", "1":"ddff12"}}} |
|||
*/ |
|||
@Test |
|||
public void testCreateObjectInstanceSingleByIdKey_Result_CHANGED() throws Exception { |
|||
int resourceInstanceId2 = 2; |
|||
String expectedPath19_1_0_2 = objectIdVer_19 + "/" + objectInstanceId_1 + "/" + resourceId_0 + "/" + resourceInstanceId2; |
|||
String expectedValue19_1_0_2 = "00001234"; |
|||
String expectedKey3_0_14 = resourceIdName_3_14; |
|||
String expectedValue3_0_14 = "+04"; |
|||
String expectedPath3_0_15 = objectInstanceIdVer_3 + "/" + resourceId_15; |
|||
String expectedValue3_0_15 = "Kiyv/Europe"; |
|||
String nodes = "{\"" + expectedPath19_1_0_2 + "\":\"" + expectedValue19_1_0_2 + "\", \"" + expectedKey3_0_14 + |
|||
"\":\"" + expectedValue3_0_14 + "\", \"" + expectedPath3_0_15 + "\":\"" + expectedValue3_0_15 + "\"}"; |
|||
String actualResult = sendCompositeRPC(nodes); |
|||
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|||
actualResult = sendRPCReadById(expectedPath19_1_0_2); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
String actualValues = rpcActualResult.get("value").asText(); |
|||
String expected = "LwM2mResourceInstance [id=" + resourceInstanceId2 + ", value=" + expectedValue19_1_0_2.length()/2 + "Bytes, type=OPAQUE]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
actualResult = sendRPCReadByKey(expectedKey3_0_14); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
actualValues = rpcActualResult.get("value").asText(); |
|||
expected = "LwM2mSingleResource [id=" + resourceId_14 + ", value=" + expectedValue3_0_14 + ", type=STRING]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
actualResult = sendRPCReadById(expectedPath3_0_15); |
|||
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|||
actualValues = rpcActualResult.get("value").asText(); |
|||
expected = "LwM2mSingleResource [id=" + resourceId_15 + ", value=" + expectedValue3_0_15 + ", type=STRING]"; |
|||
assertTrue(actualValues.contains(expected)); |
|||
} |
|||
|
|||
/** |
|||
* failed: cannot_create_mandatory_single_object |
|||
* Create {"id":"/3/2","value":{"0":"00AC"}} |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* failed: cannot_create_instance_of_security_object |
|||
* Create {"id":"/0/2","value":{"0":"00AC"}} |
|||
*/ |
|||
|
|||
/** |
|||
* failed: cannot_create_instance_of_absent_object |
|||
* Create {"id":"/50/2","value":{"0":"00AC"}} |
|||
*/ |
|||
|
|||
private String sendRPCWriteStringById(String method, String path, String value) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"" + method + "\", \"params\": {\"id\": \"" + path + "\", \"value\": \"" + value + "\" }}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
|
|||
private String sendRPCWriteObjectById(String method, String path, Object value) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"" + method + "\", \"params\": {\"id\": \"" + path + "\", \"value\": " + value + " }}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
|
|||
private String sendRPCReadById(String id) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"Read\", \"params\": {\"id\": \"" + id + "\"}}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
|
|||
private String sendRPCWriteByKey(String method, String key, String value) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"" + method + "\", \"params\": {\"key\": \"" + key + "\", \"value\": \"" + value + "\" }}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
|
|||
private String sendRPCReadByKey(String key) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"Read\", \"params\": {\"key\": \"" + key + "\"}}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
|
|||
private String sendCompositeRPC(String nodes) throws Exception { |
|||
String setRpcRequest = "{\"method\": \"WriteComposite\", \"params\": {\"nodes\":" + nodes + "}}"; |
|||
return doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setRpcRequest, String.class, status().isOk()); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue