From 660b075c79fb39da3f0022d9ee44e7a19006f3ba Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sun, 22 Jul 2018 21:12:32 +0200 Subject: [PATCH] Added more tests for issue #338. --- ...st_Connect_NetConfSessionConnectFailure.cs | 140 +++++++++++++++++ ...tTest_Connect_SftpSessionConnectFailure.cs | 145 ++++++++++++++++++ 2 files changed, 285 insertions(+) create mode 100644 src/Renci.SshNet.Tests/Classes/NetConfClientTest_Connect_NetConfSessionConnectFailure.cs create mode 100644 src/Renci.SshNet.Tests/Classes/SftpClientTest_Connect_SftpSessionConnectFailure.cs diff --git a/src/Renci.SshNet.Tests/Classes/NetConfClientTest_Connect_NetConfSessionConnectFailure.cs b/src/Renci.SshNet.Tests/Classes/NetConfClientTest_Connect_NetConfSessionConnectFailure.cs new file mode 100644 index 00000000..64ffb6ce --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/NetConfClientTest_Connect_NetConfSessionConnectFailure.cs @@ -0,0 +1,140 @@ +using System; +using System.Reflection; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using Renci.SshNet.Common; +using Renci.SshNet.NetConf; +using Renci.SshNet.Security; + +namespace Renci.SshNet.Tests.Classes +{ + [TestClass] + public class NetConfClientTest_Connect_NetConfSessionConnectFailure + { + private Mock _serviceFactoryMock; + private Mock _sessionMock; + private Mock _netConfSessionMock; + private ConnectionInfo _connectionInfo; + private ApplicationException _netConfSessionConnectionException; + private NetConfClient _netConfClient; + private ApplicationException _actualException; + + [TestInitialize] + public void Setup() + { + Arrange(); + Act(); + } + + private void Arrange() + { + SetupData(); + CreateMocks(); + SetupMocks(); + + _netConfClient = new NetConfClient(_connectionInfo, false, _serviceFactoryMock.Object); + } + + private void SetupData() + { + _connectionInfo = new ConnectionInfo("host", "user", new NoneAuthenticationMethod("userauth")); + _netConfSessionConnectionException = new ApplicationException(); + } + + private void CreateMocks() + { + _serviceFactoryMock = new Mock(MockBehavior.Strict); + _sessionMock = new Mock(MockBehavior.Strict); + _netConfSessionMock = new Mock(MockBehavior.Strict); + } + + private void SetupMocks() + { + var sequence = new MockSequence(); + + _serviceFactoryMock.InSequence(sequence) + .Setup(p => p.CreateSession(_connectionInfo)) + .Returns(_sessionMock.Object); + _sessionMock.InSequence(sequence) + .Setup(p => p.Connect()); + _serviceFactoryMock.InSequence(sequence) + .Setup(p => p.CreateNetConfSession(_sessionMock.Object, -1)) + .Returns(_netConfSessionMock.Object); + _netConfSessionMock.InSequence(sequence) + .Setup(p => p.Connect()) + .Throws(_netConfSessionConnectionException); + _netConfSessionMock.InSequence(sequence) + .Setup(p => p.Dispose()); + _sessionMock.InSequence(sequence) + .Setup(p => p.Dispose()); + } + + private void Act() + { + try + { + _netConfClient.Connect(); + Assert.Fail(); + } + catch (ApplicationException ex) + { + _actualException = ex; + } + } + + [TestMethod] + public void ConnectShouldHaveThrownApplicationException() + { + Assert.IsNotNull(_actualException); + Assert.AreSame(_netConfSessionConnectionException, _actualException); + } + + [TestMethod] + public void SessionShouldBeNull() + { + Assert.IsNull(_netConfClient.Session); + } + + [TestMethod] + public void NetConfSessionShouldBeNull() + { + Assert.IsNull(_netConfClient.NetConfSession); + } + + [TestMethod] + public void ErrorOccuredOnSessionShouldNoLongerBeSignaledViaErrorOccurredOnNetConfClient() + { + var errorOccurredSignalCount = 0; + + _netConfClient.ErrorOccurred += (sender, args) => Interlocked.Increment(ref errorOccurredSignalCount); + + _sessionMock.Raise(p => p.ErrorOccured += null, new ExceptionEventArgs(new Exception())); + + Assert.AreEqual(0, errorOccurredSignalCount); + } + + [TestMethod] + public void HostKeyReceivedOnSessionShouldNoLongerBeSignaledViaHostKeyReceivedOnSftpClient() + { + var hostKeyReceivedSignalCount = 0; + + _netConfClient.HostKeyReceived += (sender, args) => Interlocked.Increment(ref hostKeyReceivedSignalCount); + + _sessionMock.Raise(p => p.HostKeyReceived += null, new HostKeyEventArgs(GetKeyHostAlgorithm())); + + Assert.AreEqual(0, hostKeyReceivedSignalCount); + } + + private static KeyHostAlgorithm GetKeyHostAlgorithm() + { + var executingAssembly = Assembly.GetExecutingAssembly(); + + using (var s = executingAssembly.GetManifestResourceStream(string.Format("Renci.SshNet.Tests.Data.{0}", "Key.RSA.txt"))) + { + var privateKey = new PrivateKeyFile(s); + return (KeyHostAlgorithm)privateKey.HostKey; + } + } + } +} diff --git a/src/Renci.SshNet.Tests/Classes/SftpClientTest_Connect_SftpSessionConnectFailure.cs b/src/Renci.SshNet.Tests/Classes/SftpClientTest_Connect_SftpSessionConnectFailure.cs new file mode 100644 index 00000000..afbc247b --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/SftpClientTest_Connect_SftpSessionConnectFailure.cs @@ -0,0 +1,145 @@ +using System; +using System.Reflection; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using Renci.SshNet.Common; +using Renci.SshNet.Security; +using Renci.SshNet.Sftp; + +namespace Renci.SshNet.Tests.Classes +{ + [TestClass] + public class SftpClientTest_Connect_SftpSessionConnectFailure + { + private Mock _serviceFactoryMock; + private Mock _sessionMock; + private Mock _sftpResponseFactoryMock; + private Mock _sftpSessionMock; + private ConnectionInfo _connectionInfo; + private ApplicationException _sftpSessionConnectionException; + private SftpClient _sftpClient; + private ApplicationException _actualException; + + [TestInitialize] + public void Setup() + { + Arrange(); + Act(); + } + + private void Arrange() + { + SetupData(); + CreateMocks(); + SetupMocks(); + + _sftpClient = new SftpClient(_connectionInfo, false, _serviceFactoryMock.Object); + } + + private void SetupData() + { + _connectionInfo = new ConnectionInfo("host", "user", new NoneAuthenticationMethod("userauth")); + _sftpSessionConnectionException = new ApplicationException(); + } + + private void CreateMocks() + { + _serviceFactoryMock = new Mock(MockBehavior.Strict); + _sessionMock = new Mock(MockBehavior.Strict); + _sftpResponseFactoryMock = new Mock(MockBehavior.Strict); + _sftpSessionMock = new Mock(MockBehavior.Strict); + } + + private void SetupMocks() + { + var sequence = new MockSequence(); + + _serviceFactoryMock.InSequence(sequence) + .Setup(p => p.CreateSession(_connectionInfo)) + .Returns(_sessionMock.Object); + _sessionMock.InSequence(sequence) + .Setup(p => p.Connect()); + _serviceFactoryMock.InSequence(sequence) + .Setup(p => p.CreateSftpResponseFactory()) + .Returns(_sftpResponseFactoryMock.Object); + _serviceFactoryMock.InSequence(sequence) + .Setup(p => p.CreateSftpSession(_sessionMock.Object, -1, _connectionInfo.Encoding, _sftpResponseFactoryMock.Object)) + .Returns(_sftpSessionMock.Object); + _sftpSessionMock.InSequence(sequence) + .Setup(p => p.Connect()) + .Throws(_sftpSessionConnectionException); + _sftpSessionMock.InSequence(sequence) + .Setup(p => p.Dispose()); + _sessionMock.InSequence(sequence) + .Setup(p => p.Dispose()); + } + + private void Act() + { + try + { + _sftpClient.Connect(); + Assert.Fail(); + } + catch (ApplicationException ex) + { + _actualException = ex; + } + } + + [TestMethod] + public void ConnectShouldHaveThrownApplicationException() + { + Assert.IsNotNull(_actualException); + Assert.AreSame(_sftpSessionConnectionException, _actualException); + } + + [TestMethod] + public void SessionShouldBeNull() + { + Assert.IsNull(_sftpClient.Session); + } + + [TestMethod] + public void SftpSessionShouldBeNull() + { + Assert.IsNull(_sftpClient.SftpSession); + } + + [TestMethod] + public void ErrorOccuredOnSessionShouldNoLongerBeSignaledViaErrorOccurredOnSftpClient() + { + var errorOccurredSignalCount = 0; + + _sftpClient.ErrorOccurred += (sender, args) => Interlocked.Increment(ref errorOccurredSignalCount); + + _sessionMock.Raise(p => p.ErrorOccured += null, new ExceptionEventArgs(new Exception())); + + Assert.AreEqual(0, errorOccurredSignalCount); + } + + [TestMethod] + public void HostKeyReceivedOnSessionShouldNoLongerBeSignaledViaHostKeyReceivedOnSftpClient() + { + var hostKeyReceivedSignalCount = 0; + + _sftpClient.HostKeyReceived += (sender, args) => Interlocked.Increment(ref hostKeyReceivedSignalCount); + + _sessionMock.Raise(p => p.HostKeyReceived += null, new HostKeyEventArgs(GetKeyHostAlgorithm())); + + Assert.AreEqual(0, hostKeyReceivedSignalCount); + } + + private static KeyHostAlgorithm GetKeyHostAlgorithm() + { + var executingAssembly = Assembly.GetExecutingAssembly(); + + using (var s = executingAssembly.GetManifestResourceStream(string.Format("Renci.SshNet.Tests.Data.{0}", "Key.RSA.txt"))) + { + var privateKey = new PrivateKeyFile(s); + return (KeyHostAlgorithm)privateKey.HostKey; + } + } + } +}