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
9 package org.opendaylight.controller.remote.rpc;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Matchers.eq;
15 import static org.mockito.Mockito.when;
17 import akka.actor.ActorRef;
18 import akka.actor.Status;
19 import akka.japi.Pair;
20 import akka.testkit.JavaTestKit;
21 import com.google.common.util.concurrent.CheckedFuture;
22 import com.google.common.util.concurrent.Futures;
23 import java.util.Arrays;
24 import java.util.Collections;
25 import java.util.concurrent.TimeUnit;
26 import org.junit.Ignore;
27 import org.junit.Test;
28 import org.mockito.ArgumentCaptor;
29 import org.opendaylight.controller.md.sal.dom.api.DOMRpcException;
30 import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementationNotAvailableException;
31 import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
32 import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult;
33 import org.opendaylight.controller.remote.rpc.registry.RpcRegistry;
34 import org.opendaylight.controller.remote.rpc.registry.RpcRegistry.Messages.FindRouters;
35 import org.opendaylight.controller.sal.connector.api.RpcRouter.RouteIdentifier;
36 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
37 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
40 * Unit tests for RemoteRpcImplementation.
42 * @author Thomas Pantelis
44 public class RemoteRpcImplementationTest extends AbstractRpcTest {
48 @Test(expected = DOMRpcImplementationNotAvailableException.class)
49 public void testInvokeRpcWithNoRemoteActor() throws Exception {
50 final ContainerNode input = makeRPCInput("foo");
51 final CheckedFuture<DOMRpcResult, DOMRpcException> failedFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, input);
52 rpcRegistry1Probe.expectMsgClass(JavaTestKit.duration("5 seconds"), RpcRegistry.Messages.FindRouters.class);
54 .reply(new RpcRegistry.Messages.FindRoutersReply(Collections.<Pair<ActorRef, Long>>emptyList()));
55 failedFuture.checkedGet(5, TimeUnit.SECONDS);
60 * This test method invokes and executes the remote rpc
63 public void testInvokeRpc() throws Exception {
64 final ContainerNode rpcOutput = makeRPCOutput("bar");
65 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
67 final NormalizedNode<?, ?> invokeRpcInput = makeRPCInput("foo");
68 @SuppressWarnings({"unchecked", "rawtypes"})
69 final ArgumentCaptor<NormalizedNode<?, ?>> inputCaptor =
70 (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class);
72 when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn(
73 Futures.<DOMRpcResult, DOMRpcException>immediateCheckedFuture(rpcResult));
75 final CheckedFuture<DOMRpcResult, DOMRpcException> frontEndFuture =
76 remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
77 assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture);
78 final FindRouters findRouters = rpcRegistry1Probe.expectMsgClass(RpcRegistry.Messages.FindRouters.class);
79 final RouteIdentifier<?, ?, ?> routeIdentifier = findRouters.getRouteIdentifier();
80 assertEquals("getType", TEST_RPC, routeIdentifier.getType());
81 assertEquals("getRoute", TEST_PATH, routeIdentifier.getRoute());
83 rpcRegistry1Probe.reply(new RpcRegistry.Messages.FindRoutersReply(Arrays.asList(new Pair<>(
86 final DOMRpcResult result = frontEndFuture.checkedGet(5, TimeUnit.SECONDS);
87 assertEquals(rpcOutput, result.getResult());
91 * This test method invokes and executes the remote rpc
94 public void testInvokeRpcWithNullInput() throws Exception {
95 final ContainerNode rpcOutput = makeRPCOutput("bar");
96 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
98 @SuppressWarnings({"unchecked", "rawtypes"})
99 final ArgumentCaptor<NormalizedNode<?, ?>> inputCaptor =
100 (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class);
102 when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn(
103 Futures.<DOMRpcResult, DOMRpcException>immediateCheckedFuture(rpcResult));
105 final CheckedFuture<DOMRpcResult, DOMRpcException> frontEndFuture =
106 remoteRpcImpl1.invokeRpc(TEST_RPC_ID, null);
107 assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture);
108 final FindRouters findRouters = rpcRegistry1Probe.expectMsgClass(RpcRegistry.Messages.FindRouters.class);
109 final RouteIdentifier<?, ?, ?> routeIdentifier = findRouters.getRouteIdentifier();
110 assertEquals("getType", TEST_RPC, routeIdentifier.getType());
111 assertEquals("getRoute", TEST_PATH, routeIdentifier.getRoute());
113 rpcRegistry1Probe.reply(new RpcRegistry.Messages.FindRoutersReply(Arrays.asList(new Pair<>(
114 rpcBroker2, 200L))));
116 final DOMRpcResult result = frontEndFuture.checkedGet(5, TimeUnit.SECONDS);
117 assertEquals(rpcOutput, result.getResult());
122 * This test method invokes and executes the remote rpc
125 public void testInvokeRpcWithNoOutput() throws Exception {
126 final ContainerNode rpcOutput = null;
127 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
129 final NormalizedNode<?, ?> invokeRpcInput = makeRPCInput("foo");
130 @SuppressWarnings({"unchecked", "rawtypes"})
131 final ArgumentCaptor<NormalizedNode<?, ?>> inputCaptor =
132 (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class);
134 when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn(
135 Futures.<DOMRpcResult, DOMRpcException>immediateCheckedFuture(rpcResult));
137 final CheckedFuture<DOMRpcResult, DOMRpcException> frontEndFuture =
138 remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
139 assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture);
140 final FindRouters findRouters = rpcRegistry1Probe.expectMsgClass(RpcRegistry.Messages.FindRouters.class);
141 final RouteIdentifier<?, ?, ?> routeIdentifier = findRouters.getRouteIdentifier();
142 assertEquals("getType", TEST_RPC, routeIdentifier.getType());
143 assertEquals("getRoute", TEST_PATH, routeIdentifier.getRoute());
145 rpcRegistry1Probe.reply(new RpcRegistry.Messages.FindRoutersReply(Arrays.asList(new Pair<>(
146 rpcBroker2, 200L))));
148 final DOMRpcResult result = frontEndFuture.checkedGet(5, TimeUnit.SECONDS);
149 assertNull(result.getResult());
154 * This test method invokes and executes the remote rpc
156 @Test(expected = DOMRpcException.class)
157 public void testInvokeRpcWithRemoteFailedFuture() throws Exception {
158 final ContainerNode rpcOutput = null;
159 final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput);
161 final NormalizedNode<?, ?> invokeRpcInput = makeRPCInput("foo");
162 @SuppressWarnings({"unchecked", "rawtypes"})
163 final ArgumentCaptor<NormalizedNode<?, ?>> inputCaptor =
164 (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class);
166 when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn(
167 Futures.<DOMRpcResult, DOMRpcException>immediateFailedCheckedFuture(new DOMRpcException(
168 "Test Exception") {}));
170 final CheckedFuture<DOMRpcResult, DOMRpcException> frontEndFuture =
171 remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
172 assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture);
173 final FindRouters findRouters = rpcRegistry1Probe.expectMsgClass(RpcRegistry.Messages.FindRouters.class);
174 final RouteIdentifier<?, ?, ?> routeIdentifier = findRouters.getRouteIdentifier();
175 assertEquals("getType", TEST_RPC, routeIdentifier.getType());
176 assertEquals("getRoute", TEST_PATH, routeIdentifier.getRoute());
178 rpcRegistry1Probe.reply(new RpcRegistry.Messages.FindRoutersReply(Arrays.asList(new Pair<>(
179 rpcBroker2, 200L))));
180 frontEndFuture.checkedGet(5, TimeUnit.SECONDS);
184 * This test method invokes and tests exceptions when akka timeout occured
186 * Currently ignored since this test with current config takes around 15 seconds
191 @Test(expected = RemoteDOMRpcException.class)
192 public void testInvokeRpcWithAkkaTimeoutException() throws Exception {
193 final NormalizedNode<?, ?> invokeRpcInput = makeRPCInput("foo");
194 @SuppressWarnings({"unchecked", "rawtypes"})
195 final ArgumentCaptor<NormalizedNode<?, ?>> inputCaptor =
196 (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class);
197 final CheckedFuture<DOMRpcResult, DOMRpcException> frontEndFuture =
198 remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
199 assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture);
200 final FindRouters findRouters = rpcRegistry1Probe.expectMsgClass(RpcRegistry.Messages.FindRouters.class);
201 final RouteIdentifier<?, ?, ?> routeIdentifier = findRouters.getRouteIdentifier();
202 assertEquals("getType", TEST_RPC, routeIdentifier.getType());
203 assertEquals("getRoute", TEST_PATH, routeIdentifier.getRoute());
205 frontEndFuture.checkedGet(20, TimeUnit.SECONDS);
209 * This test method invokes remote rpc and lookup failed
210 * with runtime exception.
212 @Test(expected = DOMRpcException.class)
213 public void testInvokeRpcWithLookupException() throws Exception {
214 final NormalizedNode<?, ?> invokeRpcInput = makeRPCInput("foo");
215 @SuppressWarnings({"unchecked", "rawtypes"})
216 final ArgumentCaptor<NormalizedNode<?, ?>> inputCaptor =
217 (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class);
218 final CheckedFuture<DOMRpcResult, DOMRpcException> frontEndFuture =
219 remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
220 assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture);
221 final FindRouters findRouters = rpcRegistry1Probe.expectMsgClass(RpcRegistry.Messages.FindRouters.class);
222 final RouteIdentifier<?, ?, ?> routeIdentifier = findRouters.getRouteIdentifier();
223 assertEquals("getType", TEST_RPC, routeIdentifier.getType());
224 assertEquals("getRoute", TEST_PATH, routeIdentifier.getRoute());
225 rpcRegistry1Probe.reply( new Status.Failure(new RuntimeException("test")));
226 frontEndFuture.checkedGet(5, TimeUnit.SECONDS);
230 * This test method invokes and executes the remote rpc
232 @Test(expected = DOMRpcImplementationNotAvailableException.class)
233 public void testInvokeRpcWithLoopException() throws Exception {
234 final NormalizedNode<?, ?> invokeRpcInput = RemoteRpcInput.from(makeRPCInput("foo"));
235 final CheckedFuture<DOMRpcResult, DOMRpcException> frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput);
237 frontEndFuture.checkedGet(5, TimeUnit.SECONDS);
241 private RemoteRpcProviderConfig getConfig() {
242 return new RemoteRpcProviderConfig.Builder("unit-test").build();