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.sal.binding.impl.connect.dom;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.eq;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.when;
18 import java.util.ArrayList;
19 import java.util.Collection;
20 import java.util.Date;
21 import java.util.concurrent.ExecutionException;
22 import java.util.concurrent.Future;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.Mock;
27 import org.mockito.MockitoAnnotations;
28 import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry;
29 import org.opendaylight.yangtools.yang.binding.DataObject;
30 import org.opendaylight.yangtools.yang.binding.RpcService;
31 import org.opendaylight.yangtools.yang.common.QName;
32 import org.opendaylight.yangtools.yang.common.RpcError;
33 import org.opendaylight.yangtools.yang.common.RpcResult;
34 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
35 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
36 import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
38 import com.google.common.util.concurrent.Futures;
39 import com.google.common.util.concurrent.ListenableFuture;
41 public class RpcInvocationStrategyTest {
44 private BindingIndependentMappingService mockMappingService;
46 private RpcProvisionRegistry mockbiRpcRegistry;
48 private RpcInvocationStrategy rpcInvocationStrategy;
49 private ListenableFuture<RpcResult<DataObject>> futureDataObj;
50 private ListenableFuture<RpcResult<CompositeNode>> futureCompNode;
51 private final RpcError rpcError = mock(RpcError.class);
52 private final Collection<RpcError> errors = new ArrayList<RpcError>();
54 private final CompositeNode inputInvokeOn = mock(CompositeNode.class);
55 private final CompositeNode outputInvokeOn = mock(CompositeNode.class);
57 private final DataObject toDataDomInput = mock(DataObject.class);
58 private final CompositeNode toDataDomReturn = mock(CompositeNode.class);
59 private final CompositeNode invokeRpcResult = mock(CompositeNode.class);
61 private final DataObject inputForward = mock(DataObject.class);
62 private final DataObject outputForward = mock(DataObject.class);
64 private QName mockQName;
67 private final MockRpcService mockRpcService = new MockRpcService();
69 public class MockRpcService implements RpcService {
71 public Future<?> rpcnameWithInputNoOutput(DataObject input) {
75 public Future<RpcResult<DataObject>> rpcnameWithInputWithOutput(DataObject input) {
79 public Future<RpcResult<DataObject>> rpcnameNoInputWithOutput() {
83 public Future<?> rpcnameNoInputNoOutput() {
88 public RpcInvocationStrategyTest() {
89 MockitoAnnotations.initMocks(this);
93 public void testInit() throws Exception {
94 urn = new URI(new String("urn:a:valid:urn"));
97 private void setupForForwardToDom(boolean hasOutput, boolean hasInput, int expectedErrorSize) {
99 if (expectedErrorSize > 0) {
100 errors.add(rpcError);
102 RpcResult<CompositeNode> result = RpcResultBuilder.<CompositeNode>success(invokeRpcResult)
103 .withRpcErrors( errors ).build();
104 futureCompNode = Futures.immediateFuture(result);
107 when(mockMappingService.toDataDom(inputForward)).thenReturn(toDataDomReturn);
109 when(mockbiRpcRegistry.invokeRpc(eq(mockQName), any(CompositeNode.class))).thenReturn(
113 mockMappingService.dataObjectFromDataDom(eq(rpcInvocationStrategy
114 .getOutputClass().get()), any(CompositeNode.class))).thenReturn(
120 private void validateForwardToDomBroker(ListenableFuture<RpcResult<?>> forwardToDomBroker,
121 boolean expectedSuccess, DataObject expectedResult, int expectedErrorSize)
122 throws InterruptedException, ExecutionException {
123 assertNotNull(forwardToDomBroker);
124 assertEquals(expectedSuccess, forwardToDomBroker.get().isSuccessful());
125 assertEquals(expectedResult, forwardToDomBroker.get().getResult());
126 assertEquals(expectedErrorSize, forwardToDomBroker.get().getErrors().size());
129 private void setupTestMethod(String rpcName, String testMethodName, boolean hasInput)
130 throws NoSuchMethodException {
131 mockQName = new QName(urn, new Date(0L), new String("prefix"), new String(rpcName));
132 java.lang.reflect.Method rpcMethod = hasInput ? MockRpcService.class.getMethod(rpcName,
133 DataObject.class) : MockRpcService.class.getMethod(rpcName);
134 rpcInvocationStrategy = new RpcInvocationStrategy(mockQName, rpcMethod, mockMappingService,
139 * forwardToDomBroker tests
142 public void testForwardToDomBroker_WithInputNoOutput() throws Exception {
143 setupTestMethod("rpcnameWithInputNoOutput", "testForwardToDomBroker_WithInputNoOutput",
145 setupForForwardToDom(false, true, 0);
146 ListenableFuture<RpcResult<?>> forwardToDomBroker = rpcInvocationStrategy
147 .forwardToDomBroker(inputForward);
149 validateForwardToDomBroker(forwardToDomBroker, true, null, 0);
153 public void testForwardToDomBroker_WithInputNoOutput_error() throws Exception {
154 setupTestMethod("rpcnameWithInputNoOutput",
155 "testForwardToDomBroker_WithInputNoOutput_error", true);
156 setupForForwardToDom(false, true, 1);
157 ListenableFuture<RpcResult<?>> forwardToDomBroker = rpcInvocationStrategy
158 .forwardToDomBroker(inputForward);
160 validateForwardToDomBroker(forwardToDomBroker, true, null, 1);
164 public void testForwardToDomBroker_WithInputWithOutput() throws Exception {
165 setupTestMethod("rpcnameWithInputWithOutput", "testForwardToDomBroker_WithInputWithOutput",
167 setupForForwardToDom(true, true, 0);
168 ListenableFuture<RpcResult<?>> forwardToDomBroker = rpcInvocationStrategy
169 .forwardToDomBroker(inputForward);
170 validateForwardToDomBroker(forwardToDomBroker, true, outputForward, 0);
174 public void testForwardToDomBroker_NoInputWithOutput() throws Exception {
175 setupTestMethod("rpcnameNoInputWithOutput", "testForwardToDomBroker_NoInputWithOutput",
177 setupForForwardToDom(true, false, 0);
178 ListenableFuture<RpcResult<?>> forwardToDomBroker = rpcInvocationStrategy
179 .forwardToDomBroker(null);
180 validateForwardToDomBroker(forwardToDomBroker, true, outputForward, 0);
184 public void testForwardToDomBroker_NoInputNoOutput() throws Exception {
185 setupTestMethod("rpcnameNoInputNoOutput", "testForwardToDomBroker_NoInputNoOutput", false);
186 setupForForwardToDom(false, false, 0);
187 ListenableFuture<RpcResult<?>> forwardToDomBroker = rpcInvocationStrategy
188 .forwardToDomBroker(null);
189 validateForwardToDomBroker(forwardToDomBroker, true, null, 0);
195 private void setupRpcResultsWithOutput(int expectedErrorSize) {
196 if (expectedErrorSize > 0) {
197 errors.add(rpcError);
199 RpcResult<CompositeNode> resultCompNode = RpcResultBuilder.<CompositeNode>success(inputInvokeOn)
200 .withRpcErrors(errors).build();
201 futureCompNode = Futures.immediateFuture(resultCompNode);
202 RpcResult<DataObject> resultDataObj = RpcResultBuilder.<DataObject>success(toDataDomInput)
203 .withRpcErrors(errors).build();
204 futureDataObj = Futures.immediateFuture(resultDataObj);
206 when(mockMappingService.toDataDom(toDataDomInput)).thenReturn(outputInvokeOn);
209 private void setupRpcResultsNoOutput(int expectedErrorSize) {
210 if (expectedErrorSize > 0) {
211 errors.add(rpcError);
213 RpcResult<CompositeNode> resultCompNode = RpcResultBuilder.<CompositeNode>success(inputInvokeOn)
214 .withRpcErrors(errors).build();
215 futureCompNode = Futures.immediateFuture(resultCompNode);
216 RpcResult<DataObject> resultDataObj = RpcResultBuilder.<DataObject>success()
217 .withRpcErrors(errors).build();
218 futureDataObj = Futures.immediateFuture(resultDataObj);
221 private void validateReturnedImmediateFuture(
222 ListenableFuture<RpcResult<CompositeNode>> immediateFuture, boolean expectedSuccess,
223 CompositeNode expectedReturn, int expectedErrorSize) throws InterruptedException,
225 assertNotNull(immediateFuture);
226 assertEquals(expectedSuccess, immediateFuture.get().isSuccessful());
227 assertEquals(expectedReturn, immediateFuture.get().getResult());
228 assertEquals(expectedErrorSize, immediateFuture.get().getErrors().size());
232 public void testInvokeOn_NoInputNoOutput() throws Exception {
233 setupTestMethod("rpcnameNoInputNoOutput", "testInvokeOn_NoInputNoOutput", false);
234 setupRpcResultsNoOutput(0);
235 ListenableFuture<RpcResult<CompositeNode>> immediateFuture = Futures
236 .immediateFuture(rpcInvocationStrategy.invokeOn(mockRpcService, inputInvokeOn));
237 validateReturnedImmediateFuture(immediateFuture, true, null, 0);
241 public void testInvokeOn_NoInputNoOutput_errors() throws Exception {
242 setupTestMethod("rpcnameNoInputNoOutput", "testInvokeOn_NoInputNoOutput", false);
243 setupRpcResultsNoOutput(1);
244 ListenableFuture<RpcResult<CompositeNode>> immediateFuture = Futures
245 .immediateFuture(rpcInvocationStrategy.invokeOn(mockRpcService, inputInvokeOn));
246 validateReturnedImmediateFuture(immediateFuture, true, null, 1);
250 public void testInvokeOn_WithInputNoOutput() throws Exception {
251 setupTestMethod("rpcnameWithInputNoOutput", "testInvokeOn_WithInputNoOutput", true);
252 setupRpcResultsNoOutput(0);
253 ListenableFuture<RpcResult<CompositeNode>> immediateFuture = Futures
254 .immediateFuture(rpcInvocationStrategy.invokeOn(mockRpcService, inputInvokeOn));
255 validateReturnedImmediateFuture(immediateFuture, true, null, 0);
259 public void testInvokeOn_WithInputWithOutput() throws Exception {
260 setupTestMethod("rpcnameWithInputWithOutput", "testInvokeOn_WithInputWithOutput", true);
261 setupRpcResultsWithOutput(0);
262 ListenableFuture<RpcResult<CompositeNode>> immediateFuture = Futures
263 .immediateFuture(rpcInvocationStrategy.invokeOn(mockRpcService, inputInvokeOn));
264 validateReturnedImmediateFuture(immediateFuture, true, outputInvokeOn, 0);
268 public void testInvokeOn_NoInputWithOutput() throws Exception {
269 setupTestMethod("rpcnameNoInputWithOutput", "testInvokeOn_NoInputWithOutput", false);
270 setupRpcResultsWithOutput(0);
271 ListenableFuture<RpcResult<CompositeNode>> immediateFuture = Futures
272 .immediateFuture(rpcInvocationStrategy.invokeOn(mockRpcService, inputInvokeOn));
273 validateReturnedImmediateFuture(immediateFuture, true, outputInvokeOn, 0);