X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-remoterpc-connector%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fremote%2Frpc%2FRemoteRpcImplementationTest.java;h=5b3394eebd223dacf65df2616e65b8f98e9b5444;hp=2026d48a81d3a3a201f131d3c20e97f6562c363b;hb=a2b838f96589b502578fa4e15cef2769f886a378;hpb=919145b1bf7d68e436efa9b22c174965005a174a diff --git a/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementationTest.java b/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementationTest.java index 2026d48a81..5b3394eebd 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementationTest.java +++ b/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementationTest.java @@ -8,16 +8,160 @@ package org.opendaylight.controller.remote.rpc; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; -/*** +import com.google.common.util.concurrent.ListenableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import org.junit.Ignore; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.opendaylight.mdsal.dom.api.DOMRpcException; +import org.opendaylight.mdsal.dom.api.DOMRpcResult; +import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; +import org.opendaylight.yangtools.util.concurrent.FluentFutures; +import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; + +/** * Unit tests for RemoteRpcImplementation. * * @author Thomas Pantelis */ public class RemoteRpcImplementationTest extends AbstractRpcTest { + /** + * This test method invokes and executes the remote rpc. + */ + @Test + public void testInvokeRpc() throws Exception { + final ContainerNode rpcOutput = makeRPCOutput("bar"); + final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput); + + final NormalizedNode invokeRpcInput = makeRPCInput("foo"); + @SuppressWarnings({"unchecked", "rawtypes"}) + final ArgumentCaptor> inputCaptor = + (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class); + + when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn( + FluentFutures.immediateFluentFuture(rpcResult)); + + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); + + final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS); + assertEquals(rpcOutput, result.getResult()); + } + + /** + * This test method invokes and executes the remote rpc. + */ + @Test + public void testInvokeRpcWithNullInput() throws Exception { + final ContainerNode rpcOutput = makeRPCOutput("bar"); + final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput); + + @SuppressWarnings({"unchecked", "rawtypes"}) + final ArgumentCaptor> inputCaptor = + (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class); + + when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn( + FluentFutures.immediateFluentFuture(rpcResult)); + + ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, null); + assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); + + final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS); + assertEquals(rpcOutput, result.getResult()); + } + + /** + * This test method invokes and executes the remote rpc. + */ + @Test + public void testInvokeRpcWithNoOutput() throws Exception { + final ContainerNode rpcOutput = null; + final DOMRpcResult rpcResult = new DefaultDOMRpcResult(rpcOutput); + + final NormalizedNode invokeRpcInput = makeRPCInput("foo"); + @SuppressWarnings({"unchecked", "rawtypes"}) + final ArgumentCaptor> inputCaptor = + (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class); + + when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn( + FluentFutures.immediateFluentFuture(rpcResult)); + + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); + + final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS); + assertNull(result.getResult()); + } + + /** + * This test method invokes and executes the remote rpc. + */ + @SuppressWarnings({"checkstyle:AvoidHidingCauseException", "checkstyle:IllegalThrows"}) + @Test(expected = DOMRpcException.class) + public void testInvokeRpcWithRemoteFailedFuture() throws Throwable { + final NormalizedNode invokeRpcInput = makeRPCInput("foo"); + @SuppressWarnings({"unchecked", "rawtypes"}) + final ArgumentCaptor> inputCaptor = + (ArgumentCaptor) ArgumentCaptor.forClass(NormalizedNode.class); + + when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn( + FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null))); + + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); + + try { + frontEndFuture.get(5, TimeUnit.SECONDS); + } catch (ExecutionException e) { + throw e.getCause(); + } + } + + /** + * This test method invokes and tests exceptions when akka timeout occured + * Currently ignored since this test with current config takes around 15 seconds to complete. + */ + @Ignore + @Test(expected = RemoteDOMRpcException.class) + public void testInvokeRpcWithAkkaTimeoutException() throws Exception { + final NormalizedNode invokeRpcInput = makeRPCInput("foo"); + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); + + frontEndFuture.get(20, TimeUnit.SECONDS); + } + + /** + * This test method invokes remote rpc and lookup failed + * with runtime exception. + */ + @Test(expected = DOMRpcException.class) + @SuppressWarnings({"checkstyle:AvoidHidingCauseException", "checkstyle:IllegalThrows"}) + public void testInvokeRpcWithLookupException() throws Throwable { + final NormalizedNode invokeRpcInput = makeRPCInput("foo"); + + doThrow(new RuntimeException("test")).when(domRpcService2).invokeRpc(any(SchemaPath.class), + any(NormalizedNode.class)); + + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); - private RemoteRpcProviderConfig getConfig(){ - return new RemoteRpcProviderConfig.Builder("unit-test").build(); + try { + frontEndFuture.get(5, TimeUnit.SECONDS); + } catch (ExecutionException e) { + throw e.getCause(); + } } }