X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fsal-netconf-connector%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Fconnect%2Fnetconf%2Fsal%2FKeepaliveSalFacadeTest.java;h=83cea06f68e535a5480f4231127543a1b30fdd51;hb=03bdca4492c8a84b864b6fd91b4c5bd466e348ff;hp=f0b791a3b3ef030c4bb8549305db912e550a9deb;hpb=655343960ef1849c9ce50c210a964cf3a211b97c;p=netconf.git diff --git a/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/sal/KeepaliveSalFacadeTest.java b/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/sal/KeepaliveSalFacadeTest.java index f0b791a3b3..83cea06f68 100644 --- a/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/sal/KeepaliveSalFacadeTest.java +++ b/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/sal/KeepaliveSalFacadeTest.java @@ -7,7 +7,8 @@ */ package org.opendaylight.netconf.sal.connect.netconf.sal; -import static org.mockito.Matchers.any; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; @@ -16,7 +17,6 @@ import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import com.google.common.util.concurrent.Futures; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -24,23 +24,23 @@ import java.util.concurrent.ScheduledFuture; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; -import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult; +import org.opendaylight.mdsal.dom.api.DOMRpcResult; +import org.opendaylight.mdsal.dom.api.DOMRpcService; +import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; import org.opendaylight.netconf.sal.connect.api.RemoteDeviceHandler; import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator; import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences; import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil; import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId; +import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext; +import org.opendaylight.yangtools.util.concurrent.FluentFutures; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaPath; public class KeepaliveSalFacadeTest { @@ -63,6 +63,8 @@ public class KeepaliveSalFacadeTest { @Mock private ScheduledFuture currentKeepalive; + private KeepaliveSalFacade keepaliveSalFacade; + @Before public void setUp() throws Exception { executorServiceSpy = Executors.newScheduledThreadPool(1); @@ -72,17 +74,22 @@ public class KeepaliveSalFacadeTest { doNothing().when(listener).disconnect(); doReturn("mockedRpc").when(deviceRpc).toString(); doNothing().when(underlyingSalFacade).onDeviceConnected( - any(SchemaContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class)); + any(MountPointContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class)); ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); executorServiceSpy = Mockito.spy(executorService); + doAnswer( invocationOnMock -> { invocationOnMock.callRealMethod(); return currentKeepalive; - }).when(executorServiceSpy).schedule(Mockito.any(), Mockito.anyLong(), Matchers.any()); + }).when(executorServiceSpy).schedule(Mockito.any(), Mockito.anyLong(), any()); Mockito.when(currentKeepalive.isDone()).thenReturn(true); + + keepaliveSalFacade = + new KeepaliveSalFacade(REMOTE_DEVICE_ID, underlyingSalFacade, executorServiceSpy, 1L, 1L); + keepaliveSalFacade.setListener(listener); } @After @@ -95,78 +102,51 @@ public class KeepaliveSalFacadeTest { final DOMRpcResult result = new DefaultDOMRpcResult(Builders.containerBuilder().withNodeIdentifier( new YangInstanceIdentifier.NodeIdentifier(NetconfMessageTransformUtil.NETCONF_RUNNING_QNAME)).build()); - doReturn(Futures.immediateCheckedFuture(result)) - .when(deviceRpc).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); + doReturn(FluentFutures.immediateFluentFuture(result)) + .when(deviceRpc).invokeRpc(any(SchemaPath.class), isNull()); - final KeepaliveSalFacade keepaliveSalFacade = - new KeepaliveSalFacade(REMOTE_DEVICE_ID, underlyingSalFacade, executorServiceSpy, 1L, 1L); - keepaliveSalFacade.setListener(listener); + doReturn(FluentFutures.immediateFluentFuture(result)) + .when(deviceRpc).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); keepaliveSalFacade.onDeviceConnected(null, null, deviceRpc); verify(underlyingSalFacade).onDeviceConnected( - any(SchemaContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class)); + isNull(), isNull(), any(DOMRpcService.class), isNull()); verify(deviceRpc, timeout(15000).times(5)).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); } @Test - public void testKeepaliveFail() throws Exception { - final DOMRpcResult result = new DefaultDOMRpcResult(Builders.containerBuilder().withNodeIdentifier( - new YangInstanceIdentifier.NodeIdentifier(NetconfMessageTransformUtil.NETCONF_RUNNING_QNAME)).build()); - - RpcError error = mock(RpcError.class); - doReturn("Failure").when(error).toString(); + public void testKeepaliveRpcFailure() { - final DOMRpcResult resultFailWithResultAndError = new DefaultDOMRpcResult(mock(NormalizedNode.class), error); - - doReturn(Futures.immediateCheckedFuture(result)) - .doReturn(Futures.immediateCheckedFuture(resultFailWithResultAndError)) - .doReturn(Futures.immediateFailedCheckedFuture(new IllegalStateException("illegal-state"))) + doReturn(FluentFutures.immediateFailedFluentFuture(new IllegalStateException("illegal-state"))) .when(deviceRpc).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); - final KeepaliveSalFacade keepaliveSalFacade = - new KeepaliveSalFacade(REMOTE_DEVICE_ID, underlyingSalFacade, executorServiceSpy, 1L, 1L); - keepaliveSalFacade.setListener(listener); - keepaliveSalFacade.onDeviceConnected(null, null, deviceRpc); - verify(underlyingSalFacade).onDeviceConnected( - any(SchemaContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class)); + verify(underlyingSalFacade).onDeviceConnected(isNull(), isNull(), any(DOMRpcService.class), isNull()); - // 1 failed that results in disconnect + // Should disconnect the session verify(listener, timeout(15000).times(1)).disconnect(); - // 3 attempts total - verify(deviceRpc, times(3)).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); - - // Reconnect with same keepalive responses - doReturn(Futures.immediateCheckedFuture(result)) - .doReturn(Futures.immediateCheckedFuture(resultFailWithResultAndError)) - .doReturn(Futures.immediateFailedCheckedFuture(new IllegalStateException("illegal-state"))) - .when(deviceRpc).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); - - keepaliveSalFacade.onDeviceConnected(null, null, deviceRpc); + verify(deviceRpc, times(1)).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); + } - // 1 failed that results in disconnect, 2 total with previous fail - verify(listener, timeout(15000).times(2)).disconnect(); - // 6 attempts now total - verify(deviceRpc, times(3 * 2)).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); + @Test + public void testKeepaliveSuccessWithRpcError() { - final DOMRpcResult resultFailwithError = new DefaultDOMRpcResult(error); + final DOMRpcResult rpcSuccessWithError = new DefaultDOMRpcResult(mock(RpcError.class)); - doReturn(Futures.immediateCheckedFuture(resultFailwithError)) + doReturn(FluentFutures.immediateFluentFuture(rpcSuccessWithError)) .when(deviceRpc).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); keepaliveSalFacade.onDeviceConnected(null, null, deviceRpc); - // 1 failed that results in disconnect, 3 total with previous fail - verify(listener, timeout(15000).times(3)).disconnect(); + verify(underlyingSalFacade).onDeviceConnected(isNull(), isNull(), any(DOMRpcService.class), isNull()); - Mockito.when(currentKeepalive.isDone()).thenReturn(false); - keepaliveSalFacade.onDeviceConnected(null, null, deviceRpc); - // 1 failed that results in disconnect, 4 total with previous fail - verify(listener, timeout(15000).times(4)).disconnect(); + // Shouldn't disconnect the session + verify(listener, times(0)).disconnect(); + verify(deviceRpc, timeout(15000).times(1)).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); } @Test @@ -175,13 +155,12 @@ public class KeepaliveSalFacadeTest { invocationOnMock -> { proxyRpc = (DOMRpcService) invocationOnMock.getArguments()[2]; return null; - }).when(underlyingSalFacade).onDeviceConnected( - any(SchemaContext.class), any(NetconfSessionPreferences.class), any(DOMRpcService.class)); + }).when(underlyingSalFacade).onDeviceConnected(isNull(), isNull(), any(DOMRpcService.class), isNull()); - doReturn(Futures.immediateFailedCheckedFuture(new IllegalStateException("illegal-state"))) + doReturn(FluentFutures.immediateFailedFluentFuture(new IllegalStateException("illegal-state"))) .when(deviceRpc).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); - final KeepaliveSalFacade keepaliveSalFacade = + keepaliveSalFacade = new KeepaliveSalFacade(REMOTE_DEVICE_ID, underlyingSalFacade, executorServiceSpy, 100L, 1L); keepaliveSalFacade.setListener(listener); @@ -191,4 +170,4 @@ public class KeepaliveSalFacadeTest { verify(listener, times(1)).disconnect(); } -} \ No newline at end of file +}