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.DOMDataTreeIdentifier;
29 import org.opendaylight.mdsal.dom.api.DOMRpcException;
30 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
31 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
32 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
33 import org.opendaylight.yangtools.yang.common.QName;
34 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
36 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
39 * Unit tests for RemoteRpcImplementation.
41 * @author Thomas Pantelis
43 public class RemoteOpsImplementationTest extends AbstractOpsTest {
46 * This test method invokes and executes the remote rpc.
49 public void testInvokeRpc() throws Exception {
50 final ContainerNode rpcOutput = makeRPCOutput("bar");
51 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
53 final ContainerNode invokeRpcInput = makeRPCInput("foo");
54 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
56 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
57 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
59 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
60 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
62 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
63 assertEquals(rpcOutput, result.value());
67 * This test method invokes and executes the remote action.
70 public void testInvokeAction() throws Exception {
71 final ContainerNode actionOutput = makeRPCOutput("bar");
72 final DOMRpcResult actionResult = new DefaultDOMRpcResult(actionOutput, Collections.emptyList());
73 final NormalizedNode invokeActionInput = makeRPCInput("foo");
74 final ArgumentCaptor<ContainerNode> inputCaptor =
75 ArgumentCaptor.forClass(ContainerNode.class);
76 doReturn(FluentFutures.immediateFluentFuture(actionResult)).when(domActionService2).invokeAction(
77 eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
78 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
79 TEST_DATA_TREE_ID, (ContainerNode) invokeActionInput);
80 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
81 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
82 assertEquals(actionOutput, result.value());
86 * This test method invokes and executes the remote rpc.
89 public void testInvokeRpcWithNullInput() throws Exception {
90 final ContainerNode rpcOutput = makeRPCOutput("bar");
91 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
93 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
95 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
96 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
98 ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, null);
99 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
101 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
102 assertEquals(rpcOutput, result.value());
106 * This test method invokes and executes the remote action.
109 public void testInvokeActionWithNullInput() throws Exception {
110 final ContainerNode actionOutput = makeRPCOutput("bar");
111 final DOMRpcResult actionResult = new DefaultDOMRpcResult(actionOutput);
113 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
114 doReturn(FluentFutures.immediateFluentFuture(actionResult)).when(domActionService2).invokeAction(
115 eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
117 ListenableFuture<DOMRpcResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
118 TEST_DATA_TREE_ID, actionOutput);
119 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
121 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
122 assertEquals(actionOutput, result.value());
126 * This test method invokes and executes the remote rpc.
129 public void testInvokeRpcWithNoOutput() throws Exception {
130 final ContainerNode rpcOutput = null;
131 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
133 final ContainerNode invokeRpcInput = makeRPCInput("foo");
134 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
136 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
137 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
139 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
140 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
142 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
143 assertNull(result.value());
147 * This test method invokes and executes the remote rpc.
150 public void testInvokeRpcWithRemoteFailedFuture() {
151 final ContainerNode invokeRpcInput = makeRPCInput("foo");
152 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
154 doReturn(FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null)))
155 .when(domRpcService2).invokeRpc(eq(TEST_RPC), inputCaptor.capture());
157 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
158 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
160 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
161 assertThat(ex, instanceOf(DOMRpcException.class));
165 * This test method invokes and executes the remote rpc.
168 public void testInvokeActionWithRemoteFailedFuture() {
169 final ContainerNode invokeActionInput = makeRPCInput("foo");
170 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
172 doReturn(FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null)))
173 .when(domActionService2).invokeAction(eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
175 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
176 TEST_DATA_TREE_ID, invokeActionInput);
177 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
179 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
180 assertThat(ex, instanceOf(DOMActionException.class));
184 * This test method invokes and tests exceptions when akka timeout occured
185 * Currently ignored since this test with current config takes around 15 seconds to complete.
189 public void testInvokeRpcWithAkkaTimeoutException() {
190 final ContainerNode invokeRpcInput = makeRPCInput("foo");
191 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
192 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
194 assertThrows(RemoteDOMRpcException.class, () -> frontEndFuture.get(20, TimeUnit.SECONDS));
198 * This test method invokes remote rpc and lookup failed with runtime exception.
201 public void testInvokeRpcWithLookupException() {
202 final ContainerNode invokeRpcInput = makeRPCInput("foo");
204 doThrow(new RuntimeException("test")).when(domRpcService2).invokeRpc(any(QName.class),
205 any(ContainerNode.class));
207 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
208 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
210 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
211 assertThat(ex, instanceOf(DOMRpcException.class));
215 * This test method invokes remote rpc and lookup failed
216 * with runtime exception.
219 public void testInvokeActionWithLookupException() {
220 final ContainerNode invokeRpcInput = makeRPCInput("foo");
222 doThrow(new RuntimeException("test")).when(domActionService2).invokeAction(any(Absolute.class),
223 any(DOMDataTreeIdentifier.class), any(ContainerNode.class));
225 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
226 TEST_DATA_TREE_ID, invokeRpcInput);
227 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
229 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
230 assertThat(ex, instanceOf(DOMActionException.class));