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.Optional;
23 import java.util.concurrent.ExecutionException;
24 import java.util.concurrent.TimeUnit;
25 import org.junit.Ignore;
26 import org.junit.Test;
27 import org.mockito.ArgumentCaptor;
28 import org.opendaylight.mdsal.dom.api.DOMActionException;
29 import org.opendaylight.mdsal.dom.api.DOMActionResult;
30 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
31 import org.opendaylight.mdsal.dom.api.DOMRpcException;
32 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
33 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
34 import org.opendaylight.mdsal.dom.spi.SimpleDOMActionResult;
35 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
36 import org.opendaylight.yangtools.yang.common.QName;
37 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
38 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
39 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
42 * Unit tests for RemoteRpcImplementation.
44 * @author Thomas Pantelis
46 public class RemoteOpsImplementationTest extends AbstractOpsTest {
49 * This test method invokes and executes the remote rpc.
52 public void testInvokeRpc() throws Exception {
53 final ContainerNode rpcOutput = makeRPCOutput("bar");
54 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
56 final ContainerNode invokeRpcInput = makeRPCInput("foo");
57 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
59 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
60 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
62 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
63 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
65 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
66 assertEquals(rpcOutput, result.value());
70 * This test method invokes and executes the remote action.
73 public void testInvokeAction() throws Exception {
74 final ContainerNode actionOutput = makeRPCOutput("bar");
75 final DOMActionResult actionResult = new SimpleDOMActionResult(actionOutput, Collections.emptyList());
76 final NormalizedNode invokeActionInput = makeRPCInput("foo");
77 final ArgumentCaptor<ContainerNode> inputCaptor =
78 ArgumentCaptor.forClass(ContainerNode.class);
79 doReturn(FluentFutures.immediateFluentFuture(actionResult)).when(domActionService2).invokeAction(
80 eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
81 final ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
82 TEST_DATA_TREE_ID, (ContainerNode) invokeActionInput);
83 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
84 final DOMActionResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
85 assertEquals(Optional.of(actionOutput), result.getOutput());
89 * This test method invokes and executes the remote rpc.
92 public void testInvokeRpcWithNullInput() throws Exception {
93 final ContainerNode rpcOutput = makeRPCOutput("bar");
94 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
96 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
98 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
99 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
101 ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, null);
102 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
104 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
105 assertEquals(rpcOutput, result.value());
109 * This test method invokes and executes the remote action.
112 public void testInvokeActionWithNullInput() throws Exception {
113 final ContainerNode actionOutput = makeRPCOutput("bar");
114 final DOMActionResult actionResult = new SimpleDOMActionResult(actionOutput);
116 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
117 doReturn(FluentFutures.immediateFluentFuture(actionResult)).when(domActionService2).invokeAction(
118 eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
120 ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
121 TEST_DATA_TREE_ID, actionOutput);
122 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
124 final DOMActionResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
125 assertEquals(Optional.of(actionOutput), result.getOutput());
129 * This test method invokes and executes the remote rpc.
132 public void testInvokeRpcWithNoOutput() throws Exception {
133 final ContainerNode rpcOutput = null;
134 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
136 final ContainerNode invokeRpcInput = makeRPCInput("foo");
137 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
139 doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
140 .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
142 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
143 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
145 final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
146 assertNull(result.value());
150 * This test method invokes and executes the remote rpc.
153 public void testInvokeRpcWithRemoteFailedFuture() {
154 final ContainerNode invokeRpcInput = makeRPCInput("foo");
155 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
157 doReturn(FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null)))
158 .when(domRpcService2).invokeRpc(eq(TEST_RPC), inputCaptor.capture());
160 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
161 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
163 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
164 assertThat(ex, instanceOf(DOMRpcException.class));
168 * This test method invokes and executes the remote rpc.
171 public void testInvokeActionWithRemoteFailedFuture() {
172 final ContainerNode invokeActionInput = makeRPCInput("foo");
173 final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
175 doReturn(FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null)))
176 .when(domActionService2).invokeAction(eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
178 final ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
179 TEST_DATA_TREE_ID, invokeActionInput);
180 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
182 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
183 assertThat(ex, instanceOf(DOMActionException.class));
187 * This test method invokes and tests exceptions when akka timeout occured
188 * Currently ignored since this test with current config takes around 15 seconds to complete.
192 public void testInvokeRpcWithAkkaTimeoutException() {
193 final ContainerNode invokeRpcInput = makeRPCInput("foo");
194 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
195 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
197 assertThrows(RemoteDOMRpcException.class, () -> frontEndFuture.get(20, TimeUnit.SECONDS));
201 * This test method invokes remote rpc and lookup failed with runtime exception.
204 public void testInvokeRpcWithLookupException() {
205 final ContainerNode invokeRpcInput = makeRPCInput("foo");
207 doThrow(new RuntimeException("test")).when(domRpcService2).invokeRpc(any(QName.class),
208 any(ContainerNode.class));
210 final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
211 assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
213 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
214 assertThat(ex, instanceOf(DOMRpcException.class));
218 * This test method invokes remote rpc and lookup failed
219 * with runtime exception.
222 public void testInvokeActionWithLookupException() {
223 final ContainerNode invokeRpcInput = makeRPCInput("foo");
225 doThrow(new RuntimeException("test")).when(domActionService2).invokeAction(any(Absolute.class),
226 any(DOMDataTreeIdentifier.class), any(ContainerNode.class));
228 final ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
229 TEST_DATA_TREE_ID, invokeRpcInput);
230 assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
232 final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
233 assertThat(ex, instanceOf(DOMActionException.class));