Added TbSendRPCReplyNodeTest
This commit is contained in:
parent
15b26f4317
commit
d8a6093442
@ -511,6 +511,8 @@ abstract public class BaseDeviceEdgeTest extends AbstractEdgeTest {
|
||||
body.put("expirationTime", System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10));
|
||||
body.put("method", "test_method");
|
||||
body.put("params", "{\"param1\":\"value1\"}");
|
||||
body.put("persisted", true);
|
||||
body.put("retries", 2);
|
||||
|
||||
EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.RPC_CALL,
|
||||
device.getId().getId(), EdgeEventType.DEVICE, body);
|
||||
@ -523,6 +525,8 @@ abstract public class BaseDeviceEdgeTest extends AbstractEdgeTest {
|
||||
Assert.assertTrue(latestMessage instanceof DeviceRpcCallMsg);
|
||||
DeviceRpcCallMsg latestDeviceRpcCallMsg = (DeviceRpcCallMsg) latestMessage;
|
||||
Assert.assertEquals("test_method", latestDeviceRpcCallMsg.getRequestMsg().getMethod());
|
||||
Assert.assertTrue(latestDeviceRpcCallMsg.getPersisted());
|
||||
Assert.assertEquals(2, latestDeviceRpcCallMsg.getRetries());
|
||||
}
|
||||
|
||||
private void sendAttributesRequestAndVerify(Device device, String scope, String attributesDataStr, String expectedKey,
|
||||
|
||||
@ -87,13 +87,22 @@ public class TbSendRPCReplyNode implements TbNode {
|
||||
}
|
||||
|
||||
private void saveRpcResponseToEdgeQueue(TbContext ctx, TbMsg msg, String serviceIdStr, String sessionIdStr, String requestIdStr) {
|
||||
EdgeId edgeId;
|
||||
DeviceId deviceId;
|
||||
try {
|
||||
edgeId = new EdgeId(UUID.fromString(msg.getMetaData().getValue(DataConstants.EDGE_ID)));
|
||||
deviceId = new DeviceId(UUID.fromString(msg.getMetaData().getValue(DataConstants.DEVICE_ID)));
|
||||
} catch (Exception e) {
|
||||
String errMsg = String.format("[%s] Failed to parse edgeId or deviceId from metadata %s!", ctx.getTenantId(), msg.getMetaData());
|
||||
ctx.tellFailure(msg, new RuntimeException(errMsg));
|
||||
return;
|
||||
}
|
||||
|
||||
ObjectNode body = JacksonUtil.OBJECT_MAPPER.createObjectNode();
|
||||
body.put("serviceId", serviceIdStr);
|
||||
body.put("sessionId", sessionIdStr);
|
||||
body.put("requestId", requestIdStr);
|
||||
body.put("response", msg.getData());
|
||||
EdgeId edgeId = new EdgeId(UUID.fromString(msg.getMetaData().getValue(DataConstants.EDGE_ID)));
|
||||
DeviceId deviceId = new DeviceId(UUID.fromString(msg.getMetaData().getValue(DataConstants.DEVICE_ID)));
|
||||
EdgeEvent edgeEvent = EdgeUtils.constructEdgeEvent(ctx.getTenantId(), edgeId, EdgeEventType.DEVICE,
|
||||
EdgeEventActionType.RPC_CALL, deviceId, JacksonUtil.OBJECT_MAPPER.valueToTree(body));
|
||||
ListenableFuture<Void> future = ctx.getEdgeEventService().saveAsync(edgeEvent);
|
||||
|
||||
@ -0,0 +1,119 @@
|
||||
/**
|
||||
* Copyright © 2016-2022 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.rule.engine.rpc;
|
||||
|
||||
import com.google.common.util.concurrent.SettableFuture;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.thingsboard.common.util.JacksonUtil;
|
||||
import org.thingsboard.common.util.ListeningExecutor;
|
||||
import org.thingsboard.rule.engine.api.RuleEngineRpcService;
|
||||
import org.thingsboard.rule.engine.api.TbContext;
|
||||
import org.thingsboard.rule.engine.api.TbNodeConfiguration;
|
||||
import org.thingsboard.rule.engine.api.TbNodeException;
|
||||
import org.thingsboard.server.common.data.DataConstants;
|
||||
import org.thingsboard.server.common.data.id.DeviceId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.msg.TbMsg;
|
||||
import org.thingsboard.server.common.msg.TbMsgDataType;
|
||||
import org.thingsboard.server.common.msg.TbMsgMetaData;
|
||||
import org.thingsboard.server.common.msg.session.SessionMsgType;
|
||||
import org.thingsboard.server.dao.edge.EdgeEventService;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class TbSendRPCReplyNodeTest {
|
||||
|
||||
private static final String DUMMY_SERVICE_ID = "testServiceId";
|
||||
private static final int DUMMY_REQUEST_ID = 0;
|
||||
private static final UUID DUMMY_SESSION_ID = UUID.randomUUID();
|
||||
private static final String DUMMY_DATA = "{\"key\":\"value\"}";
|
||||
|
||||
TbSendRPCReplyNode node;
|
||||
|
||||
private final TenantId tenantId = TenantId.fromUUID(UUID.randomUUID());
|
||||
private final DeviceId deviceId = new DeviceId(UUID.randomUUID());
|
||||
|
||||
@Mock
|
||||
private TbContext ctx;
|
||||
|
||||
@Mock
|
||||
private RuleEngineRpcService rpcService;
|
||||
|
||||
@Mock
|
||||
private EdgeEventService edgeEventService;
|
||||
|
||||
@Mock
|
||||
private ListeningExecutor listeningExecutor;
|
||||
|
||||
@Before
|
||||
public void setUp() throws TbNodeException {
|
||||
node = new TbSendRPCReplyNode();
|
||||
TbSendRpcReplyNodeConfiguration config = new TbSendRpcReplyNodeConfiguration().defaultConfiguration();
|
||||
node.init(ctx, new TbNodeConfiguration(JacksonUtil.valueToTree(config)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sendReplyToTransport() {
|
||||
Mockito.when(ctx.getRpcService()).thenReturn(rpcService);
|
||||
|
||||
|
||||
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, getDefaultMetadata(),
|
||||
TbMsgDataType.JSON, DUMMY_DATA, null, null);
|
||||
|
||||
node.onMsg(ctx, msg);
|
||||
|
||||
verify(rpcService).sendRpcReplyToDevice(DUMMY_SERVICE_ID, DUMMY_SESSION_ID, DUMMY_REQUEST_ID, DUMMY_DATA);
|
||||
verify(edgeEventService, never()).saveAsync(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sendReplyToEdgeQueue() {
|
||||
Mockito.when(ctx.getTenantId()).thenReturn(tenantId);
|
||||
Mockito.when(ctx.getEdgeEventService()).thenReturn(edgeEventService);
|
||||
Mockito.when(edgeEventService.saveAsync(any())).thenReturn(SettableFuture.create());
|
||||
Mockito.when(ctx.getDbCallbackExecutor()).thenReturn(listeningExecutor);
|
||||
|
||||
TbMsgMetaData defaultMetadata = getDefaultMetadata();
|
||||
defaultMetadata.putValue(DataConstants.EDGE_ID, UUID.randomUUID().toString());
|
||||
defaultMetadata.putValue(DataConstants.DEVICE_ID, UUID.randomUUID().toString());
|
||||
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, defaultMetadata,
|
||||
TbMsgDataType.JSON, DUMMY_DATA, null, null);
|
||||
|
||||
node.onMsg(ctx, msg);
|
||||
|
||||
verify(edgeEventService).saveAsync(any());
|
||||
verify(rpcService, never()).sendRpcReplyToDevice(DUMMY_SERVICE_ID, DUMMY_SESSION_ID, DUMMY_REQUEST_ID, DUMMY_DATA);
|
||||
}
|
||||
|
||||
private TbMsgMetaData getDefaultMetadata() {
|
||||
TbSendRpcReplyNodeConfiguration config = new TbSendRpcReplyNodeConfiguration().defaultConfiguration();
|
||||
TbMsgMetaData metadata = new TbMsgMetaData();
|
||||
metadata.putValue(config.getServiceIdMetaDataAttribute(), DUMMY_SERVICE_ID);
|
||||
metadata.putValue(config.getSessionIdMetaDataAttribute(), DUMMY_SESSION_ID.toString());
|
||||
metadata.putValue(config.getRequestIdMetaDataAttribute(), Integer.toString(DUMMY_REQUEST_ID));
|
||||
return metadata;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user