Add AsyncSshHandler.onConnectComplete()
[netconf.git] / netconf / netconf-netty-util / src / test / java / org / opendaylight / netconf / nettyutil / handler / ssh / client / AsyncSshHandlerTest.java
index ca6f35d3080a286003462049919cc09b56c751fa..0bb84e5a05cf989f1168964efde03934bab09dea 100644 (file)
@@ -9,8 +9,7 @@ package org.opendaylight.netconf.nettyutil.handler.ssh.client;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyObject;
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -19,14 +18,13 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.SettableFuture;
-import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelConfig;
@@ -34,7 +32,6 @@ import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelPromise;
 import io.netty.channel.DefaultChannelPromise;
-import io.netty.channel.EventLoop;
 import java.io.IOException;
 import java.net.SocketAddress;
 import java.util.concurrent.TimeUnit;
@@ -42,11 +39,10 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
-import org.opendaylight.netconf.shaded.sshd.client.SshClient;
-import org.opendaylight.netconf.shaded.sshd.client.channel.ChannelSubsystem;
 import org.opendaylight.netconf.shaded.sshd.client.channel.ClientChannel;
 import org.opendaylight.netconf.shaded.sshd.client.future.AuthFuture;
 import org.opendaylight.netconf.shaded.sshd.client.future.ConnectFuture;
@@ -63,10 +59,11 @@ import org.opendaylight.netconf.shaded.sshd.common.io.WritePendingException;
 import org.opendaylight.netconf.shaded.sshd.common.util.buffer.Buffer;
 import org.opendaylight.netconf.shaded.sshd.common.util.buffer.ByteArrayBuffer;
 
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class AsyncSshHandlerTest {
 
     @Mock
-    private SshClient sshClient;
+    private NetconfSshClient sshClient;
     @Mock
     private AuthenticationHandler authHandler;
     @Mock
@@ -78,8 +75,6 @@ public class AsyncSshHandlerTest {
     @Mock
     private SocketAddress localAddress;
     @Mock
-    private EventLoop eventLoop;
-    @Mock
     private ChannelConfig channelConfig;
 
     private AsyncSshHandler asyncSshHandler;
@@ -87,18 +82,14 @@ public class AsyncSshHandlerTest {
     private SshFutureListener<ConnectFuture> sshConnectListener;
     private SshFutureListener<AuthFuture> sshAuthListener;
     private SshFutureListener<OpenFuture> sshChannelOpenListener;
-
     private ChannelPromise promise;
 
     @Before
     public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
         stubAuth();
         stubSshClient();
         stubChannel();
-        stubEventLoop();
         stubCtx();
-        stubRemoteAddress();
 
         promise = getMockedPromise();
 
@@ -139,15 +130,10 @@ public class AsyncSshHandlerTest {
         return listenerSettableFuture;
     }
 
-    private void stubRemoteAddress() {
-        doReturn("remote").when(remoteAddress).toString();
-    }
-
     private void stubCtx() {
         doReturn(channel).when(ctx).channel();
         doReturn(ctx).when(ctx).fireChannelActive();
         doReturn(ctx).when(ctx).fireChannelInactive();
-        doReturn(ctx).when(ctx).fireChannelRead(anyObject());
         doReturn(mock(ChannelFuture.class)).when(ctx).disconnect(any(ChannelPromise.class));
         doReturn(getMockedPromise()).when(ctx).newPromise();
     }
@@ -156,13 +142,7 @@ public class AsyncSshHandlerTest {
         doReturn("channel").when(channel).toString();
     }
 
-    private void stubEventLoop() {
-        doReturn(eventLoop).when(channel).eventLoop();
-        doReturn(Boolean.TRUE).when(eventLoop).inEventLoop();
-    }
-
     private void stubSshClient() throws IOException {
-        doNothing().when(sshClient).start();
         final ConnectFuture connectFuture = mock(ConnectFuture.class);
         Futures.addCallback(stubAddListener(connectFuture), new SuccessFutureListener<ConnectFuture>() {
             @Override
@@ -182,7 +162,7 @@ public class AsyncSshHandlerTest {
 
         final IoInputStream asyncOut = getMockedIoInputStream();
         final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
+        final NettyAwareChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
         final ClientSession sshSession = getMockedSshSession(subsystemChannel);
         final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
 
@@ -194,80 +174,7 @@ public class AsyncSshHandlerTest {
 
         verify(promise).setSuccess();
         verify(ctx).fireChannelActive();
-    }
-
-    @Test
-    public void testRead() throws Exception {
-        asyncSshHandler.connect(ctx, remoteAddress, localAddress, promise);
-
-        final IoInputStream asyncOut = getMockedIoInputStream();
-        final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
-        final ClientSession sshSession = getMockedSshSession(subsystemChannel);
-        final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
-
-        sshConnectListener.operationComplete(connectFuture);
-        sshAuthListener.operationComplete(getSuccessAuthFuture());
-        sshChannelOpenListener.operationComplete(getSuccessOpenFuture());
-
-        verify(ctx).fireChannelRead(any(ByteBuf.class));
-    }
-
-    @Test
-    public void testReadClosed() throws Exception {
-        asyncSshHandler.connect(ctx, remoteAddress, localAddress, promise);
-
-        final IoInputStream asyncOut = getMockedIoInputStream();
-        final IoReadFuture mockedReadFuture = asyncOut.read(null);
-
-        Futures.addCallback(stubAddListener(mockedReadFuture), new SuccessFutureListener<IoReadFuture>() {
-            @Override
-            public void onSuccess(final SshFutureListener<IoReadFuture> result) {
-                doReturn(new IllegalStateException()).when(mockedReadFuture).getException();
-                doReturn(mockedReadFuture).when(mockedReadFuture).removeListener(any());
-                doReturn(true).when(asyncOut).isClosing();
-                doReturn(true).when(asyncOut).isClosed();
-                result.operationComplete(mockedReadFuture);
-            }
-        }, MoreExecutors.directExecutor());
-
-        final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
-        final ClientSession sshSession = getMockedSshSession(subsystemChannel);
-        final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
-
-        sshConnectListener.operationComplete(connectFuture);
-        sshAuthListener.operationComplete(getSuccessAuthFuture());
-        sshChannelOpenListener.operationComplete(getSuccessOpenFuture());
-
-        verify(ctx).fireChannelInactive();
-    }
-
-    @Test
-    public void testReadFail() throws Exception {
-        asyncSshHandler.connect(ctx, remoteAddress, localAddress, promise);
-
-        final IoInputStream asyncOut = getMockedIoInputStream();
-        final IoReadFuture mockedReadFuture = asyncOut.read(null);
-
-        Futures.addCallback(stubAddListener(mockedReadFuture), new SuccessFutureListener<IoReadFuture>() {
-            @Override
-            public void onSuccess(final SshFutureListener<IoReadFuture> result) {
-                doReturn(new IllegalStateException()).when(mockedReadFuture).getException();
-                doReturn(mockedReadFuture).when(mockedReadFuture).removeListener(any());
-                result.operationComplete(mockedReadFuture);
-            }
-        }, MoreExecutors.directExecutor());
-
-        final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
-        final ClientSession sshSession = getMockedSshSession(subsystemChannel);
-        final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
-
-        sshConnectListener.operationComplete(connectFuture);
-        sshAuthListener.operationComplete(getSuccessAuthFuture());
-        sshChannelOpenListener.operationComplete(getSuccessOpenFuture());
-
+        asyncSshHandler.close(ctx, getMockedPromise());
         verify(ctx).fireChannelInactive();
     }
 
@@ -277,7 +184,7 @@ public class AsyncSshHandlerTest {
 
         final IoInputStream asyncOut = getMockedIoInputStream();
         final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
+        final NettyAwareChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
         final ClientSession sshSession = getMockedSshSession(subsystemChannel);
         final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
 
@@ -298,20 +205,18 @@ public class AsyncSshHandlerTest {
         final IoInputStream asyncOut = getMockedIoInputStream();
         final IoOutputStream asyncIn = getMockedIoOutputStream();
 
-        final IoWriteFuture ioWriteFuture = asyncIn.writePacket(new ByteArrayBuffer());
+        final IoWriteFuture ioWriteFuture = asyncIn.writeBuffer(new ByteArrayBuffer());
 
         Futures.addCallback(stubAddListener(ioWriteFuture), new SuccessFutureListener<IoWriteFuture>() {
             @Override
             public void onSuccess(final SshFutureListener<IoWriteFuture> result) {
                 doReturn(false).when(ioWriteFuture).isWritten();
                 doReturn(new IllegalStateException()).when(ioWriteFuture).getException();
-                doReturn(true).when(asyncIn).isClosing();
-                doReturn(true).when(asyncIn).isClosed();
                 result.operationComplete(ioWriteFuture);
             }
         }, MoreExecutors.directExecutor());
 
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
+        final NettyAwareChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
         final ClientSession sshSession = getMockedSshSession(subsystemChannel);
         final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
 
@@ -331,9 +236,9 @@ public class AsyncSshHandlerTest {
 
         final IoInputStream asyncOut = getMockedIoInputStream();
         final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final IoWriteFuture ioWriteFuture = asyncIn.writePacket(new ByteArrayBuffer());
+        final IoWriteFuture ioWriteFuture = asyncIn.writeBuffer(new ByteArrayBuffer());
 
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
+        final NettyAwareChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
         final ClientSession sshSession = getMockedSshSession(subsystemChannel);
         final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
 
@@ -354,13 +259,11 @@ public class AsyncSshHandlerTest {
         final ListenableFuture<SshFutureListener<IoWriteFuture>> pendingListener = stubAddListener(ioWriteFuture);
 
         final ChannelPromise secondWritePromise = getMockedPromise();
-        // now make write throw pending exception
-        doThrow(WritePendingException.class).when(asyncIn).writePacket(any(Buffer.class));
         asyncSshHandler.write(ctx, Unpooled.copiedBuffer(new byte[]{0, 1, 2, 3, 4, 5}), secondWritePromise);
 
-        doReturn(ioWriteFuture).when(asyncIn).writePacket(any(Buffer.class));
+        doReturn(ioWriteFuture).when(asyncIn).writeBuffer(any(Buffer.class));
 
-        verifyZeroInteractions(firstWritePromise, secondWritePromise);
+        verifyNoMoreInteractions(firstWritePromise, secondWritePromise);
 
         // make first write stop pending
         firstWriteListener.operationComplete(ioWriteFuture);
@@ -380,9 +283,9 @@ public class AsyncSshHandlerTest {
 
         final IoInputStream asyncOut = getMockedIoInputStream();
         final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final IoWriteFuture ioWriteFuture = asyncIn.writePacket(new ByteArrayBuffer());
+        final IoWriteFuture ioWriteFuture = asyncIn.writeBuffer(new ByteArrayBuffer());
 
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
+        final NettyAwareChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
         final ClientSession sshSession = getMockedSshSession(subsystemChannel);
         final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
 
@@ -400,7 +303,7 @@ public class AsyncSshHandlerTest {
 
         final ChannelPromise secondWritePromise = getMockedPromise();
         // now make write throw pending exception
-        doThrow(WritePendingException.class).when(asyncIn).writePacket(any(Buffer.class));
+        doThrow(WritePendingException.class).when(asyncIn).writeBuffer(any(Buffer.class));
         for (int i = 0; i < 1001; i++) {
             asyncSshHandler.write(ctx, Unpooled.copiedBuffer(new byte[]{0, 1, 2, 3, 4, 5}), secondWritePromise);
         }
@@ -414,7 +317,7 @@ public class AsyncSshHandlerTest {
 
         final IoInputStream asyncOut = getMockedIoInputStream();
         final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
+        final NettyAwareChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
         final ClientSession sshSession = getMockedSshSession(subsystemChannel);
         final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
 
@@ -427,7 +330,7 @@ public class AsyncSshHandlerTest {
 
         verify(sshSession).close(anyBoolean());
         verify(disconnectPromise).setSuccess();
-        verify(ctx).fireChannelInactive();
+        //verify(ctx).fireChannelInactive();
     }
 
     private static OpenFuture getSuccessOpenFuture() {
@@ -444,16 +347,16 @@ public class AsyncSshHandlerTest {
 
     private static ConnectFuture getSuccessConnectFuture(final ClientSession sshSession) {
         final ConnectFuture connectFuture = mock(ConnectFuture.class);
-        doReturn(true).when(connectFuture).isConnected();
+        doReturn(null).when(connectFuture).getException();
 
         doReturn(sshSession).when(connectFuture).getSession();
         return connectFuture;
     }
 
-    private static ClientSession getMockedSshSession(final ChannelSubsystem subsystemChannel) throws IOException {
-        final ClientSession sshSession = mock(ClientSession.class);
+    private static NettyAwareClientSession getMockedSshSession(final NettyAwareChannelSubsystem subsystemChannel)
+            throws IOException {
+        final NettyAwareClientSession sshSession = mock(NettyAwareClientSession.class);
 
-        doReturn("sshSession").when(sshSession).toString();
         doReturn("serverVersion").when(sshSession).getServerVersion();
         doReturn(false).when(sshSession).isClosed();
         doReturn(false).when(sshSession).isClosing();
@@ -467,15 +370,14 @@ public class AsyncSshHandlerTest {
         }, MoreExecutors.directExecutor());
         doReturn(closeFuture).when(sshSession).close(false);
 
-        doReturn(subsystemChannel).when(sshSession).createSubsystemChannel(anyString());
+        doReturn(subsystemChannel).when(sshSession).createSubsystemChannel(eq("netconf"), any());
 
         return sshSession;
     }
 
-    private ChannelSubsystem getMockedSubsystemChannel(final IoInputStream asyncOut,
+    private NettyAwareChannelSubsystem getMockedSubsystemChannel(final IoInputStream asyncOut,
                                                        final IoOutputStream asyncIn) throws IOException {
-        final ChannelSubsystem subsystemChannel = mock(ChannelSubsystem.class);
-        doReturn("subsystemChannel").when(subsystemChannel).toString();
+        final NettyAwareChannelSubsystem subsystemChannel = mock(NettyAwareChannelSubsystem.class);
 
         doNothing().when(subsystemChannel).setStreaming(any(ClientChannel.Streaming.class));
         final OpenFuture openFuture = mock(OpenFuture.class);
@@ -487,17 +389,16 @@ public class AsyncSshHandlerTest {
             }
         }, MoreExecutors.directExecutor());
 
-        doReturn(asyncOut).when(subsystemChannel).getAsyncOut();
-
         doReturn(openFuture).when(subsystemChannel).open();
         doReturn(asyncIn).when(subsystemChannel).getAsyncIn();
+        doNothing().when(subsystemChannel).onClose(any());
+        doNothing().when(subsystemChannel).close();
         return subsystemChannel;
     }
 
     private static IoOutputStream getMockedIoOutputStream() throws IOException {
         final IoOutputStream mock = mock(IoOutputStream.class);
         final IoWriteFuture ioWriteFuture = mock(IoWriteFuture.class);
-        doReturn(ioWriteFuture).when(ioWriteFuture).addListener(any());
         doReturn(true).when(ioWriteFuture).isWritten();
 
         Futures.addCallback(stubAddListener(ioWriteFuture), new SuccessFutureListener<IoWriteFuture>() {
@@ -507,7 +408,7 @@ public class AsyncSshHandlerTest {
             }
         }, MoreExecutors.directExecutor());
 
-        doReturn(ioWriteFuture).when(mock).writePacket(any(Buffer.class));
+        doReturn(ioWriteFuture).when(mock).writeBuffer(any(Buffer.class));
         doReturn(false).when(mock).isClosed();
         doReturn(false).when(mock).isClosing();
         return mock;
@@ -516,13 +417,6 @@ public class AsyncSshHandlerTest {
     private static IoInputStream getMockedIoInputStream() {
         final IoInputStream mock = mock(IoInputStream.class);
         final IoReadFuture ioReadFuture = mock(IoReadFuture.class);
-        doReturn(null).when(ioReadFuture).getException();
-        doReturn(ioReadFuture).when(ioReadFuture).removeListener(any());
-        doReturn(ioReadFuture).when(mock).read(any());
-        doReturn(5).when(ioReadFuture).getRead();
-        doReturn(new ByteArrayBuffer(new byte[]{0, 1, 2, 3, 4})).when(ioReadFuture).getBuffer();
-        doReturn(ioReadFuture).when(ioReadFuture).addListener(any());
-
         // Always success for read
         Futures.addCallback(stubAddListener(ioReadFuture), new SuccessFutureListener<IoReadFuture>() {
             @Override
@@ -530,10 +424,6 @@ public class AsyncSshHandlerTest {
                 result.operationComplete(ioReadFuture);
             }
         }, MoreExecutors.directExecutor());
-
-        doReturn(ioReadFuture).when(mock).read(any(Buffer.class));
-        doReturn(false).when(mock).isClosed();
-        doReturn(false).when(mock).isClosing();
         return mock;
     }
 
@@ -543,7 +433,7 @@ public class AsyncSshHandlerTest {
 
         final IoInputStream asyncOut = getMockedIoInputStream();
         final IoOutputStream asyncIn = getMockedIoOutputStream();
-        final ChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
+        final NettyAwareChannelSubsystem subsystemChannel = getMockedSubsystemChannel(asyncOut, asyncIn);
         final ClientSession sshSession = getMockedSshSession(subsystemChannel);
         final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
 
@@ -561,7 +451,7 @@ public class AsyncSshHandlerTest {
     public void testConnectFailAuth() throws Exception {
         asyncSshHandler.connect(ctx, remoteAddress, localAddress, promise);
 
-        final ClientSession sshSession = mock(ClientSession.class);
+        final NettyAwareClientSession sshSession = mock(NettyAwareClientSession.class);
         doReturn(true).when(sshSession).isClosed();
         final ConnectFuture connectFuture = getSuccessConnectFuture(sshSession);
 
@@ -571,6 +461,8 @@ public class AsyncSshHandlerTest {
 
         sshAuthListener.operationComplete(authFuture);
         verify(promise).setFailure(any(Throwable.class));
+        asyncSshHandler.close(ctx, getMockedPromise());
+        verify(ctx, times(0)).fireChannelInactive();
     }
 
     private static AuthFuture getFailedAuthFuture() {
@@ -598,7 +490,6 @@ public class AsyncSshHandlerTest {
 
     private static ConnectFuture getFailedConnectFuture() {
         final ConnectFuture connectFuture = mock(ConnectFuture.class);
-        doReturn(false).when(connectFuture).isConnected();
         doReturn(new IllegalStateException()).when(connectFuture).getException();
         return connectFuture;
     }