+
+ //real jUnits
+ @Test(expected = IOException.class)
+ public void connect_shouldThrowIOException_whenJSchFails() throws Exception {
+ //given
+ given(jSchMock.getSession(anyString(), anyString(), anyInt())).willThrow(new JSchException());
+
+ //when
+ cut.connect(HOST, USER, PASS);
+
+ //then
+ fail("IOException should be thrown");
+ }
+
+ @Test
+ public void connect_shouldSetVariables() throws Exception {
+ //when
+ cut.connect(HOST, USER, PASS);
+
+ //then
+ assertEquals(HOST, cut.getHostName());
+ assertEquals(HOST, cut.getRouterName());
+ assertEquals(USER, cut.getUserName());
+ assertEquals(PASS, cut.getPassWord());
+ }
+
+ @Test
+ public void connect_shouldSetUpSessionWithProperInvocationOrder() throws Exception {
+ //given
+ InOrder inOrder = inOrder(session, channelShell);
+
+ //when
+ cut.connect(HOST, USER, PASS);
+
+ //then
+ verifySessionConfigurationOrderForChannelShellOpenning(
+ inOrder, USER, HOST, PASS, SshJcraftWrapper.DEFAULT_PORT, SESSION_TIMEOUT);
+ }
+
+ @Test
+ public void connect_shouldFinishSuccessfully_whenExceptionThrownDuringReceivingPhase() throws Exception {
+ //given
+ doThrow(new JSchException()).when(session).setTimeout(anyInt());
+
+ //when
+ cut.connect(HOST, USER, PASS);
+
+ //then
+ verify(session).setTimeout(anyInt());
+ }
+
+ @Test(expected = IOException.class)
+ public void connect_withSubsystem_shouldThrowIOException_whenJSchFails() throws Exception {
+ //given
+ given(jSchMock.getSession(anyString(), anyString(), anyInt())).willThrow(new JSchException());
+
+ //when
+ cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM);
+
+ //then
+ fail("IOException should be thrown");
+ }
+
+ @Test
+ public void connect_withSubsystem_shouldSetRouterName() throws Exception {
+ //when
+ cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM);
+
+ //then
+ assertEquals(HOST, cut.getRouterName());
+ }
+
+ @Test
+ public void connect_withSubsystem_shouldSetUpSessionWithProperInvocationOrder() throws Exception {
+ //given
+ InOrder inOrder = inOrder(session, channelSubsystem);
+
+ //when
+ cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM);
+
+ //then
+ verify(jSchMock).getSession(USER, HOST, PORT_NUM);
+ inOrder.verify(session).setPassword(PASS);
+ inOrder.verify(session).setUserInfo(any(UserInfo.class));
+ inOrder.verify(session).setConfig(SshJcraftWrapper.STRICT_HOST_CHECK_KEY, SshJcraftWrapper.STRICT_HOST_CHECK_VALUE);
+ inOrder.verify(session).connect(SESSION_TIMEOUT);
+ inOrder.verify(session).setServerAliveCountMax(0);
+ inOrder.verify(session).openChannel(SshJcraftWrapper.CHANNEL_SUBSYSTEM_TYPE);
+ inOrder.verify(channelSubsystem).getInputStream();
+ inOrder.verify(channelSubsystem).connect(anyInt());
+ inOrder.verifyNoMoreInteractions();
+ verifyNoMoreInteractions(jSchMock);
+ }
+
+ @Test(expected = IOException.class)
+ public void connect_withPrompt_shouldThrowIOException_whenJSchFails() throws Exception {
+ //given
+ given(jSchMock.getSession(anyString(), anyString(), anyInt())).willThrow(new JSchException());
+
+ //when
+ cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT);
+
+ //then
+ fail("IOException should be thrown");
+ }
+
+ @Test
+ public void connect_withPrompt_shouldSetVariables() throws Exception {
+ //when
+ cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT);
+
+ //then
+ assertEquals(HOST, cut.getHostName());
+ assertEquals(HOST, cut.getRouterName());
+ assertEquals(USER, cut.getUserName());
+ assertEquals(PASS, cut.getPassWord());
+ }
+
+ @Test
+ public void connect_withPrompt_shouldFinishSuccessfully_whenExceptionThrownDuringReceivingPhase() throws Exception {
+ //given
+ doThrow(new JSchException()).when(session).setTimeout(anyInt());
+
+ //when
+ cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT);
+
+ //then
+ verify(session).setTimeout(anyInt());
+ }
+
+ @Test
+ public void connect_withPrompt_shouldSetUpSessionWithProperInvocationOrder() throws Exception {
+ //given
+ InOrder inOrder = inOrder(session, channelShell);
+
+ //when
+ cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT);
+
+ //then
+ verifySessionConfigurationOrderForChannelShellOpenning(
+ inOrder, USER, HOST, PASS, SshJcraftWrapper.DEFAULT_PORT, SESSION_TIMEOUT);
+ }
+
+ @Test(expected = IOException.class)
+ public void connect_withPort_shouldThrowIOException_whenJSchFails() throws Exception {
+ //given
+ given(jSchMock.getSession(anyString(), anyString(), anyInt())).willThrow(new JSchException());
+
+ //when
+ cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT, PORT_NUM);
+
+ //then
+ fail("IOException should be thrown");
+ }
+
+ @Test
+ public void connect_withPort_shouldSetVariables() throws Exception {
+ //when
+ cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT, PORT_NUM);
+
+ //then
+ assertEquals(HOST, cut.getHostName());
+ assertEquals(HOST, cut.getRouterName());
+ assertEquals(USER, cut.getUserName());
+ assertEquals(PASS, cut.getPassWord());
+ }
+
+ @Test
+ public void connect_withPort_shouldFinishSuccessfully_whenExceptionThrownDuringReceivingPhase() throws Exception {
+ //given
+ doThrow(new JSchException()).when(session).setTimeout(anyInt());
+
+ //when
+ cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT, PORT_NUM);
+
+ //then
+ verify(session).setTimeout(anyInt());
+ }
+
+ @Test
+ public void connect_withPort_shouldSetUpSessionWithProperInvocationOrder() throws Exception {
+ //given
+ InOrder inOrder = inOrder(session, channelShell);
+
+ //when
+ cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT, PORT_NUM);
+
+ //then
+ verifySessionConfigurationOrderForChannelShellOpenning(inOrder, USER, HOST, PASS, PORT_NUM, SESSION_TIMEOUT);
+ }
+
+ private void verifySessionConfigurationOrderForChannelShellOpenning(InOrder inOrder, String user, String host, String pass, int port, int sessionTimeout) throws Exception {
+ verify(jSchMock).getSession(user, host, port);
+ inOrder.verify(session).setPassword(pass);
+ inOrder.verify(session).setUserInfo(any(UserInfo.class));
+ inOrder.verify(session).setConfig(SshJcraftWrapper.STRICT_HOST_CHECK_KEY, SshJcraftWrapper.STRICT_HOST_CHECK_VALUE);
+ inOrder.verify(session).connect(sessionTimeout);
+ inOrder.verify(session).setServerAliveCountMax(0);
+ inOrder.verify(session).openChannel(SshJcraftWrapper.CHANNEL_SHELL_TYPE);
+ inOrder.verify(channelShell).getInputStream();
+ inOrder.verify(channelShell).connect();
+ inOrder.verify(session).setTimeout(anyInt());
+ inOrder.verifyNoMoreInteractions();
+ verifyNoMoreInteractions(jSchMock);
+ }
+
+ @Test
+ public void closeConnection_shouldCloseReaderChannelAndSession_inAGivenOrder() throws Exception {
+ //given
+ provideConnectedSubsystemInstance();
+ InOrder inOrder = inOrder(channelIs, channelSubsystem, session);
+
+ //when
+ cut.closeConnection();
+
+ //then
+ inOrder.verify(channelIs).close();
+ inOrder.verify(channelSubsystem).disconnect();
+ inOrder.verify(session).disconnect();
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ @Test
+ public void closeConnection_shouldCloseChannelAndSession_whenClosingReaderFails() throws Exception {
+ //given
+ doThrow(new IOException("failed to close reader")).when(channelIs).close();
+ provideConnectedSubsystemInstance();
+
+ //when
+ cut.closeConnection();
+
+ //then
+ verify(channelIs).close();
+ verify(channelSubsystem).disconnect();
+ verify(session).disconnect();
+ }
+
+ @Test
+ public void closeConnection_shouldBeIdempotent_whenRunOnNewInstance() throws Exception {
+ //given
+ assertFalse(cut.isConnected());
+
+ //when
+ cut.closeConnection();
+
+ //then
+ assertFalse(cut.isConnected());
+ }
+
+ @Test
+ public void closeConnection_shouldBeIdempotent_whenRunTwiceOnConnectedInstance() throws Exception {
+ //given
+ provideConnectedSubsystemInstance();
+
+ //when
+ cut.closeConnection();
+ cut.closeConnection();
+
+ //then
+ assertFalse(cut.isConnected());
+ }
+
+ @Test
+ public void closeConnection_shouldCloseResourcesOnce_whenRunTwiceOnConnectedInstance() throws Exception {
+ //given
+ provideConnectedSubsystemInstance();
+
+ //when
+ cut.closeConnection();
+ cut.closeConnection();
+
+ //then
+ verify(channelIs, times(1)).close();
+ verify(channelSubsystem, times(1)).disconnect();
+ verify(session, times(1)).disconnect();
+ }
+
+ private void provideConnectedSubsystemInstance() throws Exception {
+ given(channelSubsystem.getInputStream()).willReturn(channelIs);
+ cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM);
+ assertTrue(cut.isConnected());
+ }
+