|
|
|
@ -29,6 +29,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.OBJECT_INST |
|
|
|
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.RESOURCE_ID_2; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.RESOURCE_ID_3; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.RESOURCE_ID_4; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.RESOURCE_ID_5; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.RESOURCE_ID_8; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.RESOURCE_ID_9; |
|
|
|
|
|
|
|
@ -90,26 +91,101 @@ public class RpcLwm2mIntegrationExecuteTest extends AbstractRpcLwM2MIntegrationT |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* execute_resource_with_parameters (execute reboot after 60 seconds on device) |
|
|
|
* Execute {"id":"3/0/4","value":60} |
|
|
|
* execute_resource_with_parameters (execute reboot if digit = 5 on device) |
|
|
|
* Execute {"id":"3/0/4","value":5} |
|
|
|
* {"result":"CHANGED"} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteResourceWithParametersById_Result_CHANGED() throws Exception { |
|
|
|
public void testExecuteResourceWithParametersSingleDigitValueById_Result_Ok() throws Exception { |
|
|
|
String expectedPath = objectInstanceIdVer_3 + "/" + RESOURCE_ID_4; |
|
|
|
Object expectedValue = 60; |
|
|
|
Object expectedValue = 5; |
|
|
|
String actualResult = sendRPCExecuteWithValueById(expectedPath, expectedValue); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* execute_resource_with_parameters (execute Factory Reset if digit = 2 -> after 60 seconds on device) |
|
|
|
* Execute {"id":"3/0/5","value":"2='60'"} |
|
|
|
|
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteResourceWithParametersArgumentIdAndValueById_Result_Ok() throws Exception { |
|
|
|
String expectedPath = objectInstanceIdVer_3 + "/" + RESOURCE_ID_5; |
|
|
|
Object expectedValue = "2='60'"; |
|
|
|
String actualResult = sendRPCExecuteWithValueById(expectedPath, expectedValue); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* execute_resource_with_parameters (execute Factory Reset with two arguments: |
|
|
|
* digit 2 without a value and digit 0 with the link value on device) |
|
|
|
* Execute {"id":"3/0/5","value":"2,0='https://thingsboard.io/docs/reference/lwm2m-api/'"} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteResourceWithParametersMultipleArgumentsIncludingLinkById_Result_Ok() throws Exception { |
|
|
|
String expectedPath = objectInstanceIdVer_3 + "/" + RESOURCE_ID_5; |
|
|
|
Object expectedValue = "2,0='https://thingsboard.io/docs/reference/lwm2m-api/'"; |
|
|
|
String actualResult = sendRPCExecuteWithValueById(expectedPath, expectedValue); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* execute_resource_with_parameters (execute Factory Reset with multiple arguments without values) |
|
|
|
* According to the OMA LwM2M execute arguments format, this represents ten arguments (digits 0-9), all without values. |
|
|
|
* Execute {"id":"3/0/5","value":"0,1,2,3,4,5,6,7,8,9"} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteResourceWithParametersMultipleArgumentsById_Result_Ok() throws Exception { |
|
|
|
String expectedPath = objectInstanceIdVer_3 + "/" + RESOURCE_ID_5; |
|
|
|
Object expectedValue = "0,1,2,3,4,5,6,7,8,9"; |
|
|
|
String actualResult = sendRPCExecuteWithValueById(expectedPath, expectedValue); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
assertEquals(ResponseCode.CHANGED.getName(), rpcActualResult.get("result").asText()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* execute_resource_with_parameters (execute Factory Reset after 60 seconds on device) |
|
|
|
* Execute {"id":"3/0/5","value":"'60'"} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteResourceWithParametersSingleDigitValueInvalidById_Result_BAD_REQUEST_Error_IntegerBetween_0_And_9_Expected() throws Exception { |
|
|
|
String expectedPath = objectInstanceIdVer_3 + "/" + RESOURCE_ID_5; |
|
|
|
Object expectedValue = "'60'"; |
|
|
|
String actualResult = sendRPCExecuteWithValueById(expectedPath, expectedValue); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText()); |
|
|
|
String expected = "Unable to parse Arguments [" + expectedValue + "] : Invalid digit ['] (an integer between 0 and 9 is expected)"; |
|
|
|
String actual = rpcActualResult.get("error").asText(); |
|
|
|
assertTrue(actual.contains(expected)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* execute_resource_with_parameters (execute Bad with Unable to parse Arguments) |
|
|
|
* Execute {"id":"3/0/5","value":"0,1,2,3,4,5,6,7,8,9,60"} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteResourceWithParametersMultipleArgumentsById_Result_BAD_REQUEST_Error_UnableParseArguments() throws Exception { |
|
|
|
String expectedPath = objectInstanceIdVer_3 + "/" + RESOURCE_ID_5; |
|
|
|
Object expectedValue = "0,1,2,3,4,5,6,7,8,9,60"; |
|
|
|
String actualResult = sendRPCExecuteWithValueById(expectedPath, expectedValue);; |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText()); |
|
|
|
String expected = "Unable to parse Arguments [" + expectedValue + "] : [,] separator expected at index 21 after [0,1,2,3,4,5,6,7,8,9,6]"; |
|
|
|
String actual = rpcActualResult.get("error").asText(); |
|
|
|
assertTrue(actual.contains(expected)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Bootstrap-Request Trigger |
|
|
|
* Execute {"id":"1/0/9"} |
|
|
|
* {"result":"BAD_REQUEST","error":"probably no bootstrap server configured"} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteBootstrapRequestTriggerById_Result_BAD_REQUEST_Error_NoBootstrapServerConfigured() throws Exception { |
|
|
|
public void testExecuteBootstrapRequestTriggerById_Result_BAD_REQUEST_Error_NoBootstrapServer() throws Exception { |
|
|
|
String expectedPath = objectInstanceIdVer_1 + "/" + RESOURCE_ID_9; |
|
|
|
String actualResult = sendRPCExecuteById(expectedPath); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
@ -125,7 +201,7 @@ public class RpcLwm2mIntegrationExecuteTest extends AbstractRpcLwM2MIntegrationT |
|
|
|
* {"result":"BAD_REQUEST","error":"Resource with /5_1.0/0/3 is not executable."} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteResourceWithOperationNotExecuteById_Result_METHOD_NOT_ALLOWED() throws Exception { |
|
|
|
public void testExecuteResourceWithOperationNotExecuteById_Result_BAD_REQUEST_Error_Is_Not_Executable() throws Exception { |
|
|
|
String expectedPath = objectInstanceIdVer_5 + "/" + RESOURCE_ID_3; |
|
|
|
String actualResult = sendRPCExecuteById(expectedPath); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
@ -141,7 +217,7 @@ public class RpcLwm2mIntegrationExecuteTest extends AbstractRpcLwM2MIntegrationT |
|
|
|
* {"result":"BAD_REQUEST","error":"Specified object id 50 absent in the list supported objects of the client or is security object!"} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteNonExistingResourceOnNonExistingObjectById_Result_BAD_REQUEST() throws Exception { |
|
|
|
public void testExecuteNonExistingResourceOnNonExistingObjectById_Result_BAD_REQUEST_Error_Specified_Object_Absent_List_Supported() throws Exception { |
|
|
|
String expectedPath = OBJECT_ID_VER_50 + "/" + OBJECT_INSTANCE_ID_0 + "/" + RESOURCE_ID_3; |
|
|
|
String actualResult = sendRPCExecuteById(expectedPath); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
@ -159,7 +235,7 @@ public class RpcLwm2mIntegrationExecuteTest extends AbstractRpcLwM2MIntegrationT |
|
|
|
* {"result":"BAD_REQUEST","error":"Specified object id 0 absent in the list supported objects of the client or is security object!"} |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
public void testExecuteSecurityObjectById_Result_NOT_FOUND() throws Exception { |
|
|
|
public void testExecuteSecurityObjectById_Result_BAD_REQUEST_Error_SpecifiedObjectAbsent() throws Exception { |
|
|
|
String expectedPath = objectIdVer_0 + "/" + OBJECT_INSTANCE_ID_0 + "/" + RESOURCE_ID_3; |
|
|
|
String actualResult = sendRPCExecuteById(expectedPath); |
|
|
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); |
|
|
|
@ -178,8 +254,26 @@ public class RpcLwm2mIntegrationExecuteTest extends AbstractRpcLwM2MIntegrationT |
|
|
|
} |
|
|
|
|
|
|
|
private String sendRPCExecuteWithValueById(String path, Object value) throws Exception { |
|
|
|
String setRpcRequest = "{\"method\": \"Execute\", \"params\": {\"id\": \"" + path + "\", \"value\": " + value + " }}"; |
|
|
|
return doPostAsync("/api/plugins/rpc/twoway/" + lwM2MTestClient.getDeviceIdStr(), setRpcRequest, String.class, status().isOk()); |
|
|
|
ObjectNode params = JacksonUtil.newObjectNode(); |
|
|
|
params.put("id", path); |
|
|
|
|
|
|
|
// Jackson сам вирішить: ставити лапки (рядок) чи ні (число/boolean/null)
|
|
|
|
if (value instanceof String) { |
|
|
|
params.put("value", (String) value); |
|
|
|
} else if (value instanceof Integer) { |
|
|
|
params.put("value", (Integer) value); |
|
|
|
} else if (value instanceof Boolean) { |
|
|
|
params.put("value", (Boolean) value); |
|
|
|
} else { |
|
|
|
params.set("value", JacksonUtil.valueToTree(value)); |
|
|
|
} |
|
|
|
|
|
|
|
ObjectNode setRpcRequest = JacksonUtil.newObjectNode(); |
|
|
|
setRpcRequest.put("method", "Execute"); |
|
|
|
setRpcRequest.set("params", params); |
|
|
|
|
|
|
|
return doPostAsync("/api/plugins/rpc/twoway/" + lwM2MTestClient.getDeviceIdStr(), |
|
|
|
JacksonUtil.toString(setRpcRequest), String.class, status().isOk()); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|