Bump upstreams
[controller.git] / opendaylight / md-sal / sal-remoterpc-connector / src / test / java / org / opendaylight / controller / remote / rpc / RemoteOpsImplementationTest.java
1 /*
2  * Copyright (c) 2014 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.remote.rpc;
9
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;
19
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;
39
40 /**
41  * Unit tests for RemoteRpcImplementation.
42  *
43  * @author Thomas Pantelis
44  */
45 public class RemoteOpsImplementationTest extends AbstractOpsTest {
46
47     /**
48      * This test method invokes and executes the remote rpc.
49      */
50     @Test
51     public void testInvokeRpc() throws Exception {
52         final ContainerNode rpcOutput = makeRPCOutput("bar");
53         final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
54
55         final ContainerNode invokeRpcInput = makeRPCInput("foo");
56         final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
57
58         doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
59             .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
60
61         final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
62         assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
63
64         final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
65         assertEquals(rpcOutput, result.value());
66     }
67
68     /**
69      * This test method invokes and executes the remote action.
70      */
71     @Test
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());
85     }
86
87     /**
88      * This test method invokes and executes the remote rpc.
89      */
90     @Test
91     public void testInvokeRpcWithNullInput() throws Exception {
92         final ContainerNode rpcOutput = makeRPCOutput("bar");
93         final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
94
95         final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
96
97         doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
98             .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
99
100         ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, null);
101         assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
102
103         final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
104         assertEquals(rpcOutput, result.value());
105     }
106
107     /**
108      * This test method invokes and executes the remote action.
109      */
110     @Test
111     public void testInvokeActionWithNullInput() throws Exception {
112         final ContainerNode actionOutput = makeRPCOutput("bar");
113         final DOMActionResult actionResult = new SimpleDOMActionResult(actionOutput);
114
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());
118
119         ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
120                 TEST_DATA_TREE_ID, actionOutput);
121         assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
122
123         final DOMActionResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
124         assertEquals(actionOutput, result.getOutput().get());
125     }
126
127     /**
128      * This test method invokes and executes the remote rpc.
129      */
130     @Test
131     public void testInvokeRpcWithNoOutput() throws Exception {
132         final ContainerNode rpcOutput = null;
133         final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
134
135         final ContainerNode invokeRpcInput = makeRPCInput("foo");
136         final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
137
138         doReturn(FluentFutures.immediateFluentFuture(rpcResult)).when(domRpcService2)
139             .invokeRpc(eq(TEST_RPC), inputCaptor.capture());
140
141         final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
142         assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
143
144         final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS);
145         assertNull(result.value());
146     }
147
148     /**
149      * This test method invokes and executes the remote rpc.
150      */
151     @Test
152     public void testInvokeRpcWithRemoteFailedFuture() {
153         final ContainerNode invokeRpcInput = makeRPCInput("foo");
154         final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
155
156         doReturn(FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null)))
157             .when(domRpcService2).invokeRpc(eq(TEST_RPC), inputCaptor.capture());
158
159         final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
160         assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
161
162         final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
163         assertThat(ex, instanceOf(DOMRpcException.class));
164     }
165
166     /**
167      * This test method invokes and executes the remote rpc.
168      */
169     @Test
170     public void testInvokeActionWithRemoteFailedFuture() {
171         final ContainerNode invokeActionInput = makeRPCInput("foo");
172         final ArgumentCaptor<ContainerNode> inputCaptor = ArgumentCaptor.forClass(ContainerNode.class);
173
174         doReturn(FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null)))
175             .when(domActionService2).invokeAction(eq(TEST_RPC_TYPE), eq(TEST_DATA_TREE_ID), inputCaptor.capture());
176
177         final ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
178                 TEST_DATA_TREE_ID, invokeActionInput);
179         assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
180
181         final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
182         assertThat(ex, instanceOf(DOMActionException.class));
183     }
184
185     /**
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.
188      */
189     @Ignore
190     @Test
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));
195
196         assertThrows(RemoteDOMRpcException.class, () -> frontEndFuture.get(20, TimeUnit.SECONDS));
197     }
198
199     /**
200      * This test method invokes remote rpc and lookup failed with runtime exception.
201      */
202     @Test
203     public void testInvokeRpcWithLookupException() {
204         final ContainerNode invokeRpcInput = makeRPCInput("foo");
205
206         doThrow(new RuntimeException("test")).when(domRpcService2).invokeRpc(any(QName.class),
207             any(ContainerNode.class));
208
209         final ListenableFuture<DOMRpcResult> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
210         assertThat(frontEndFuture, instanceOf(RemoteDOMRpcFuture.class));
211
212         final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
213         assertThat(ex, instanceOf(DOMRpcException.class));
214     }
215
216     /**
217      * This test method invokes remote rpc and lookup failed
218      * with runtime exception.
219      */
220     @Test
221     public void testInvokeActionWithLookupException() {
222         final ContainerNode invokeRpcInput = makeRPCInput("foo");
223
224         doThrow(new RuntimeException("test")).when(domActionService2).invokeAction(any(Absolute.class),
225                 any(DOMDataTreeIdentifier.class), any(ContainerNode.class));
226
227         final ListenableFuture<DOMActionResult> frontEndFuture = remoteActionImpl1.invokeAction(TEST_RPC_TYPE,
228                 TEST_DATA_TREE_ID, invokeRpcInput);
229         assertThat(frontEndFuture, instanceOf(RemoteDOMActionFuture.class));
230
231         final var ex = assertThrows(ExecutionException.class, () -> frontEndFuture.get(5, TimeUnit.SECONDS)).getCause();
232         assertThat(ex, instanceOf(DOMActionException.class));
233     }
234 }