2 * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.remote.rpc;
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertThrows;
15 import static org.mockito.ArgumentMatchers.any;
16 import static org.mockito.ArgumentMatchers.eq;
17 import static org.mockito.Mockito.doReturn;
18 import static org.mockito.Mockito.doThrow;
20 import com.google.common.util.concurrent.ListenableFuture;
21 import java.util.Collections;
22 import java.util.concurrent.ExecutionException;
23 import java.util.concurrent.TimeUnit;
24 import org.junit.Ignore;
25 import org.junit.Test;
26 import org.mockito.ArgumentCaptor;
27 import org.opendaylight.mdsal.dom.api.DOMActionException;
28 import org.opendaylight.mdsal.dom.api.DOMActionResult;
29 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
30 import org.opendaylight.mdsal.dom.api.DOMRpcException;
31 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
32 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
33 import org.opendaylight.mdsal.dom.spi.SimpleDOMActionResult;
34 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
35 import org.opendaylight.yangtools.yang.common.QName;
36 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
37 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
38 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
41 * Unit tests for RemoteRpcImplementation.
43 * @author Thomas Pantelis
45 public class RemoteOpsImplementationTest extends AbstractOpsTest {
48 * This test method invokes and executes the remote rpc.
51 public void testInvokeRpc() throws Exception {
52 final ContainerNode rpcOutput = makeRPCOutput("bar");
53 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
55 final ContainerNode invokeRpcInput = makeRPCInput("foo");
56 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
58 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
59 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
61 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
62 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
64 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
65 assertEquals(rpcOutput, result.value());
69 * This test method invokes and executes the remote action.
72 public void testInvokeAction() throws Exception {
73 final ContainerNode actionOutput = makeRPCOutput("bar");
74 final DOMActionResult actionResult = new SimpleDOMActionResult(actionOutput, Collections.emptyList());
75 final NormalizedNode invokeActionInput = makeRPCInput("foo");
76 final ArgumentCaptor<ContainerNode> inputCaptor =
77 ArgumentCaptor.forClass(ContainerNode.class);
78 doReturn(FluentFutures.immediateFluentFuture(actionResult)).when(domActionService2).invokeAction(
79 eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
80 final ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
81 TEST_DATA_TREE_ID, (ContainerNode) invokeActionInput);
82 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
83 final DOMActionResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
84 assertEquals(actionOutput, result.getOutput().get());
88 * This test method invokes and executes the remote rpc.
91 public void testInvokeRpcWithNullInput() throws Exception {
92 final ContainerNode rpcOutput = makeRPCOutput("bar");
93 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
95 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
97 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
98 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
100 ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, null);
101 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
103 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
104 assertEquals(rpcOutput, result.value());
108 * This test method invokes and executes the remote action.
111 public void testInvokeActionWithNullInput() throws Exception {
112 final ContainerNode actionOutput = makeRPCOutput("bar");
113 final DOMActionResult actionResult = new SimpleDOMActionResult(actionOutput);
115 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
116 doReturn(FluentFutures.immediateFluentFuture(actionResult)).when(domActionService2).invokeAction(
117 eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
119 ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
120 TEST_DATA_TREE_ID, actionOutput);
121 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
123 final DOMActionResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
124 assertEquals(actionOutput, result.getOutput().get());
128 * This test method invokes and executes the remote rpc.
131 public void testInvokeRpcWithNoOutput() throws Exception {
132 final ContainerNode rpcOutput = null;
133 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
135 final ContainerNode invokeRpcInput = makeRPCInput("foo");
136 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
138 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
139 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
141 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
142 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
144 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
145 assertNull(result.value());
149 * This test method invokes and executes the remote rpc.
152 public void testInvokeRpcWithRemoteFailedFuture() {
153 final ContainerNode invokeRpcInput = makeRPCInput("foo");
154 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
156 doReturn(FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null)))
157 .when(domRpcService2).invokeRpc(eq(TEST_RPC), inputCaptor.capture());
159 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
160 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
162 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
163 assertThat(ex, instanceOf(DOMRpcException.class));
167 * This test method invokes and executes the remote rpc.
170 public void testInvokeActionWithRemoteFailedFuture() {
171 final ContainerNode invokeActionInput = makeRPCInput("foo");
172 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
174 doReturn(FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null)))
175 .when(domActionService2).invokeAction(eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
177 final ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
178 TEST_DATA_TREE_ID, invokeActionInput);
179 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
181 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
182 assertThat(ex, instanceOf(DOMActionException.class));
186 * This test method invokes and tests exceptions when akka timeout occured
187 * Currently ignored since this test with current config takes around 15 seconds to complete.
191 public void testInvokeRpcWithAkkaTimeoutException() {
192 final ContainerNode invokeRpcInput = makeRPCInput("foo");
193 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
194 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
196 assertThrows(RemoteDOMRpcException.class, () -> frontEndFuture.get(20, TimeUnit.SECONDS));
200 * This test method invokes remote rpc and lookup failed with runtime exception.
203 public void testInvokeRpcWithLookupException() {
204 final ContainerNode invokeRpcInput = makeRPCInput("foo");
206 doThrow(new RuntimeException("test")).when(domRpcService2).invokeRpc(any(QName.class),
207 any(ContainerNode.class));
209 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
210 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
212 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
213 assertThat(ex, instanceOf(DOMRpcException.class));
217 * This test method invokes remote rpc and lookup failed
218 * with runtime exception.
221 public void testInvokeActionWithLookupException() {
222 final ContainerNode invokeRpcInput = makeRPCInput("foo");
224 doThrow(new RuntimeException("test")).when(domActionService2).invokeAction(any(Absolute.class),
225 any(DOMDataTreeIdentifier.class), any(ContainerNode.class));
227 final ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
228 TEST_DATA_TREE_ID, invokeRpcInput);
229 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
231 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
232 assertThat(ex, instanceOf(DOMActionException.class));