| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | using System;using System.Globalization;using System.Net;using System.Net.Sockets;using System.Runtime;using System.Threading;using Microsoft.VisualStudio.TestTools.UnitTesting;using Moq;using Renci.SshNet.Channels;using Renci.SshNet.Messages;using Renci.SshNet.Messages.Connection;using Renci.SshNet.Tests.Common;namespace Renci.SshNet.Tests.Classes.Channels{    [TestClass]    public partial class ChannelDirectTcpipTestTest : TestBase    {        private Mock<ISession> _sessionMock;        private Mock<IForwardedPort> _forwardedPortMock;        private uint _localWindowSize;        private uint _localPacketSize;        private string _remoteHost;        private uint _port;        private Socket _socket;        private uint _localChannelNumber;        private uint _remoteWindowSize;        private uint _remotePacketSize;        private uint _remoteChannelNumber;        protected override void OnInit()        {            base.OnInit();            var random = new Random();            _localWindowSize = (uint) random.Next(0, int.MaxValue);            _localPacketSize = (uint) random.Next(0, int.MaxValue);            _remoteHost = random.Next().ToString(CultureInfo.InvariantCulture);            _port = (uint) random.Next(IPEndPoint.MinPort, IPEndPoint.MaxPort);            _localChannelNumber = (uint) random.Next(0, int.MaxValue);            _remoteWindowSize = (uint) random.Next(0, int.MaxValue);            _remotePacketSize = (uint)random.Next(100, 200);            _remoteChannelNumber = (uint)random.Next(0, int.MaxValue);            _sessionMock = new Mock<ISession>(MockBehavior.Strict);            _forwardedPortMock = new Mock<IForwardedPort>(MockBehavior.Strict);        }        [TestMethod]        public void SocketShouldBeClosedAndBindShouldEndWhenForwardedPortSignalsClosingEvent()        {            _sessionMock.Setup(p => p.NextChannelNumber).Returns(_localChannelNumber);            _sessionMock.Setup(p => p.IsConnected).Returns(true);            _sessionMock.Setup(p => p.SendMessage(It.IsAny<ChannelOpenMessage>()))                .Callback<Message>(m => _sessionMock.Raise(p => p.ChannelOpenConfirmationReceived += null,                    new MessageEventArgs<ChannelOpenConfirmationMessage>(                        new ChannelOpenConfirmationMessage(((ChannelOpenMessage)m).LocalChannelNumber, _remoteWindowSize, _remotePacketSize, _remoteChannelNumber))));            _sessionMock.Setup(p => p.WaitOnHandle(It.IsAny<EventWaitHandle>()))                .Callback<WaitHandle>(p => p.WaitOne(-1));            var localPortEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);            using (var localPortListener = new AsyncSocketListener(localPortEndPoint))            {                localPortListener.Start();                localPortListener.Connected += socket =>                    {                        var channel = new ChannelDirectTcpip();                        channel.Initialize(_sessionMock.Object, _localWindowSize, _localPacketSize);                        channel.Open(_remoteHost, _port, _forwardedPortMock.Object, socket);                        var closeForwardedPortThread =                            new Thread(() =>                                {                                    // sleep for a short period to allow channel to actually start receiving from socket                                    Thread.Sleep(1000);                                    // raise Closing event on forwarded port                                    _forwardedPortMock.Raise(p => p.Closing += null, EventArgs.Empty);                                });                        closeForwardedPortThread.Start();                        channel.Bind();                        closeForwardedPortThread.Join();                    };                var client = new Socket(localPortEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);                client.Connect(localPortEndPoint);                // attempt to receive from socket to verify it was shut down by forwarded port                var buffer = new byte[16];                var bytesReceived = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);                Assert.AreEqual(0, bytesReceived);            }        }    }}
 |