|  | @@ -1,147 +1,167 @@
 | 
	
		
			
				|  |  | -using System;
 | 
	
		
			
				|  |  | -using System.Collections.Generic;
 | 
	
		
			
				|  |  | -using System.Net;
 | 
	
		
			
				|  |  | -using System.Net.Sockets;
 | 
	
		
			
				|  |  | -using System.Text;
 | 
	
		
			
				|  |  | -using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
	
		
			
				|  |  | -using Moq;
 | 
	
		
			
				|  |  | -using Renci.SshNet.Channels;
 | 
	
		
			
				|  |  | -using Renci.SshNet.Common;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -namespace Renci.SshNet.Tests.Classes
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    [TestClass]
 | 
	
		
			
				|  |  | -    public class ForwardedPortDynamicTest_Started_SocketVersionNotSupported
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        private Mock<ISession> _sessionMock;
 | 
	
		
			
				|  |  | -        private Mock<IChannelDirectTcpip> _channelMock;
 | 
	
		
			
				|  |  | -        private Mock<IConnectionInfo> _connectionInfoMock;
 | 
	
		
			
				|  |  | -        private ForwardedPortDynamic _forwardedPort;
 | 
	
		
			
				|  |  | -        private Socket _client;
 | 
	
		
			
				|  |  | -        private IList<EventArgs> _closingRegister;
 | 
	
		
			
				|  |  | -        private IList<ExceptionEventArgs> _exceptionRegister;
 | 
	
		
			
				|  |  | -        private int _bytesReceived;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestInitialize]
 | 
	
		
			
				|  |  | -        public void Initialize()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            Arrange();
 | 
	
		
			
				|  |  | -            Act();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestCleanup]
 | 
	
		
			
				|  |  | -        public void Cleanup()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            if (_forwardedPort != null && _forwardedPort.IsStarted)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                _sessionMock.Setup(p => p.ConnectionInfo).Returns(_connectionInfoMock.Object);
 | 
	
		
			
				|  |  | -                _connectionInfoMock.Setup(p => p.Timeout).Returns(TimeSpan.FromSeconds(5));
 | 
	
		
			
				|  |  | -                _forwardedPort.Stop();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (_client != null)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                if (_client.Connected)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    _client.Shutdown(SocketShutdown.Both);
 | 
	
		
			
				|  |  | -                    _client.Close();
 | 
	
		
			
				|  |  | -                    _client = null;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private void Arrange()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            _closingRegister = new List<EventArgs>();
 | 
	
		
			
				|  |  | -            _exceptionRegister = new List<ExceptionEventArgs>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            _sessionMock = new Mock<ISession>(MockBehavior.Strict);
 | 
	
		
			
				|  |  | -            _channelMock = new Mock<IChannelDirectTcpip>(MockBehavior.Strict);
 | 
	
		
			
				|  |  | -            _connectionInfoMock = new Mock<IConnectionInfo>(MockBehavior.Strict);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            _sessionMock.Setup(p => p.IsConnected).Returns(true);
 | 
	
		
			
				|  |  | -            _sessionMock.Setup(p => p.CreateChannelDirectTcpip()).Returns(_channelMock.Object);
 | 
	
		
			
				|  |  | -            _channelMock.Setup(p => p.Close());
 | 
	
		
			
				|  |  | -            _channelMock.Setup(p => p.Dispose());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            _forwardedPort = new ForwardedPortDynamic(8122);
 | 
	
		
			
				|  |  | -            _forwardedPort.Closing += (sender, args) => _closingRegister.Add(args);
 | 
	
		
			
				|  |  | -            _forwardedPort.Exception += (sender, args) => _exceptionRegister.Add(args);
 | 
	
		
			
				|  |  | -            _forwardedPort.Session = _sessionMock.Object;
 | 
	
		
			
				|  |  | -            _forwardedPort.Start();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            var endPoint = new IPEndPoint(IPAddress.Loopback, 8122);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            _client = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
 | 
	
		
			
				|  |  | -            _client.Connect(endPoint);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private void Act()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var buffer = new byte[] {0x07};
 | 
	
		
			
				|  |  | -            _client.Send(buffer, 0, buffer.Length, SocketFlags.None);
 | 
	
		
			
				|  |  | -            _bytesReceived = _client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestMethod]
 | 
	
		
			
				|  |  | -        public void SocketShouldBeConnected()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            Assert.IsTrue(_client.Connected);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestMethod]
 | 
	
		
			
				|  |  | -        public void ForwardedPortShouldShutdownSendOnSocket()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            Assert.AreEqual(0, _bytesReceived);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestMethod]
 | 
	
		
			
				|  |  | -        public void ClosingShouldNotHaveFired()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            Assert.AreEqual(0, _closingRegister.Count);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestMethod]
 | 
	
		
			
				|  |  | -        public void ExceptionShouldHaveFiredOnce()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            Assert.AreEqual(1, _exceptionRegister.Count, GetExceptions());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            var exception = _exceptionRegister[0].Exception;
 | 
	
		
			
				|  |  | -            Assert.IsNotNull(exception);
 | 
	
		
			
				|  |  | -            var notSupportedException = exception as NotSupportedException;
 | 
	
		
			
				|  |  | -            Assert.IsNotNull(notSupportedException, exception.ToString());
 | 
	
		
			
				|  |  | -            Assert.AreEqual("SOCKS version 7 is not supported.", notSupportedException.Message);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestMethod]
 | 
	
		
			
				|  |  | -        public void CreateChannelDirectTcpipOnSessionShouldBeInvokedOnce()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            _sessionMock.Verify(p => p.CreateChannelDirectTcpip(), Times.Once);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestMethod]
 | 
	
		
			
				|  |  | -        public void CloseOnChannelShouldBeInvokedOnce()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            _channelMock.Verify(p => p.Close(), Times.Once);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        [TestMethod]
 | 
	
		
			
				|  |  | -        public void DisposeOnChannelShouldBeInvokedOnce()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            _channelMock.Verify(p => p.Dispose(), Times.Once);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private string GetExceptions()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var sb = new StringBuilder();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            foreach (var exceptionEventArgs in _exceptionRegister)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                if (sb.Length > 0)
 | 
	
		
			
				|  |  | -                    sb.AppendLine();
 | 
	
		
			
				|  |  | -                sb.Append(exceptionEventArgs.Exception);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            return sb.ToString();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +using System;
 | 
	
		
			
				|  |  | +using System.Collections.Generic;
 | 
	
		
			
				|  |  | +using System.Net;
 | 
	
		
			
				|  |  | +using System.Net.Sockets;
 | 
	
		
			
				|  |  | +using System.Text;
 | 
	
		
			
				|  |  | +using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
	
		
			
				|  |  | +using Moq;
 | 
	
		
			
				|  |  | +using Renci.SshNet.Channels;
 | 
	
		
			
				|  |  | +using Renci.SshNet.Common;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +namespace Renci.SshNet.Tests.Classes
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    [TestClass]
 | 
	
		
			
				|  |  | +    public class ForwardedPortDynamicTest_Started_SocketVersionNotSupported
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        private Mock<ISession> _sessionMock;
 | 
	
		
			
				|  |  | +        private Mock<IChannelDirectTcpip> _channelMock;
 | 
	
		
			
				|  |  | +        private Mock<IConnectionInfo> _connectionInfoMock;
 | 
	
		
			
				|  |  | +        private ForwardedPortDynamic _forwardedPort;
 | 
	
		
			
				|  |  | +        private Socket _client;
 | 
	
		
			
				|  |  | +        private IList<EventArgs> _closingRegister;
 | 
	
		
			
				|  |  | +        private IList<ExceptionEventArgs> _exceptionRegister;
 | 
	
		
			
				|  |  | +        private TimeSpan _connectionTimeout;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestInitialize]
 | 
	
		
			
				|  |  | +        public void Initialize()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Arrange();
 | 
	
		
			
				|  |  | +            Act();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestCleanup]
 | 
	
		
			
				|  |  | +        public void Cleanup()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (_forwardedPort != null && _forwardedPort.IsStarted)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _sessionMock.Setup(p => p.ConnectionInfo).Returns(_connectionInfoMock.Object);
 | 
	
		
			
				|  |  | +                _connectionInfoMock.Setup(p => p.Timeout).Returns(TimeSpan.FromSeconds(5));
 | 
	
		
			
				|  |  | +                _forwardedPort.Stop();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (_client != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (_client.Connected)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _client.Shutdown(SocketShutdown.Both);
 | 
	
		
			
				|  |  | +                    _client.Close();
 | 
	
		
			
				|  |  | +                    _client = null;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void SetupData()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _closingRegister = new List<EventArgs>();
 | 
	
		
			
				|  |  | +            _exceptionRegister = new List<ExceptionEventArgs>();
 | 
	
		
			
				|  |  | +            _connectionTimeout = TimeSpan.FromSeconds(5);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void CreateMocks()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _sessionMock = new Mock<ISession>(MockBehavior.Strict);
 | 
	
		
			
				|  |  | +            _channelMock = new Mock<IChannelDirectTcpip>(MockBehavior.Strict);
 | 
	
		
			
				|  |  | +            _connectionInfoMock = new Mock<IConnectionInfo>(MockBehavior.Strict);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void SetupMocks()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var seq = new MockSequence();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            _sessionMock.InSequence(seq).Setup(p => p.IsConnected).Returns(true);
 | 
	
		
			
				|  |  | +            _sessionMock.InSequence(seq).Setup(p => p.CreateChannelDirectTcpip()).Returns(_channelMock.Object);
 | 
	
		
			
				|  |  | +            _sessionMock.InSequence(seq).Setup(p => p.ConnectionInfo).Returns(_connectionInfoMock.Object);
 | 
	
		
			
				|  |  | +            _connectionInfoMock.InSequence(seq).Setup(p => p.Timeout).Returns(_connectionTimeout);
 | 
	
		
			
				|  |  | +            _channelMock.InSequence(seq).Setup(p => p.Close());
 | 
	
		
			
				|  |  | +            _channelMock.InSequence(seq).Setup(p => p.Dispose());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        private void Arrange()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            SetupData();
 | 
	
		
			
				|  |  | +            CreateMocks();
 | 
	
		
			
				|  |  | +            SetupMocks();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            _forwardedPort = new ForwardedPortDynamic(8122);
 | 
	
		
			
				|  |  | +            _forwardedPort.Closing += (sender, args) => _closingRegister.Add(args);
 | 
	
		
			
				|  |  | +            _forwardedPort.Exception += (sender, args) => _exceptionRegister.Add(args);
 | 
	
		
			
				|  |  | +            _forwardedPort.Session = _sessionMock.Object;
 | 
	
		
			
				|  |  | +            _forwardedPort.Start();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var endPoint = new IPEndPoint(IPAddress.Loopback, 8122);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            _client = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
 | 
	
		
			
				|  |  | +            _client.Connect(endPoint);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void Act()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var buffer = new byte[] {0x07};
 | 
	
		
			
				|  |  | +            _client.Send(buffer, 0, buffer.Length, SocketFlags.None);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void SocketShouldBeConnected()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Assert.IsTrue(_client.Connected);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ForwardedPortShouldShutdownSendOnSocket()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var buffer = new byte[1];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var bytesReceived = _client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.AreEqual(0, bytesReceived);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ClosingShouldNotHaveFired()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Assert.AreEqual(0, _closingRegister.Count);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ExceptionShouldHaveFiredOnce()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Assert.AreEqual(1, _exceptionRegister.Count, GetExceptions());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var exception = _exceptionRegister[0].Exception;
 | 
	
		
			
				|  |  | +            Assert.IsNotNull(exception);
 | 
	
		
			
				|  |  | +            var notSupportedException = exception as NotSupportedException;
 | 
	
		
			
				|  |  | +            Assert.IsNotNull(notSupportedException, exception.ToString());
 | 
	
		
			
				|  |  | +            Assert.AreEqual("SOCKS version 7 is not supported.", notSupportedException.Message);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void CreateChannelDirectTcpipOnSessionShouldBeInvokedOnce()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _sessionMock.Verify(p => p.CreateChannelDirectTcpip(), Times.Once);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void CloseOnChannelShouldBeInvokedOnce()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _channelMock.Verify(p => p.Close(), Times.Once);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void DisposeOnChannelShouldBeInvokedOnce()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _channelMock.Verify(p => p.Dispose(), Times.Once);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private string GetExceptions()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var sb = new StringBuilder();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            foreach (var exceptionEventArgs in _exceptionRegister)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (sb.Length > 0)
 | 
	
		
			
				|  |  | +                    sb.AppendLine();
 | 
	
		
			
				|  |  | +                sb.Append(exceptionEventArgs.Exception);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return sb.ToString();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |