private void Act()
 {
     if (_channel != null)
     {
         _channel.Close();
     }
 }
Пример #2
0
        public void SocketShouldBeClosedAndEofShouldBeSentToServerWhenClientShutsDownSocket()
        {
            _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));
            _sessionMock.Setup(p => p.TrySendMessage(It.IsAny <ChannelEofMessage>()))
            .Returns(true)
            .Callback <Message>(
                m => new Thread(() =>
            {
                Thread.Sleep(50);
                _sessionMock.Raise(s => s.ChannelEofReceived += null,
                                   new MessageEventArgs <ChannelEofMessage>(new ChannelEofMessage(_localChannelNumber)));
            }).Start());
            _sessionMock.Setup(p => p.TrySendMessage(It.IsAny <ChannelCloseMessage>()))
            .Returns(true)
            .Callback <Message>(
                m => new Thread(() =>
            {
                Thread.Sleep(50);
                _sessionMock.Raise(s => s.ChannelCloseReceived += null,
                                   new MessageEventArgs <ChannelCloseMessage>(new ChannelCloseMessage(_localChannelNumber)));
            }).Start());
            var                channelBindFinishedWaitHandle = new ManualResetEvent(false);
            Socket             handler = null;
            ChannelDirectTcpip channel = null;

            var localPortEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);

            using (var localPortListener = new AsyncSocketListener(localPortEndPoint))
            {
                localPortListener.Start();

                localPortListener.Connected += socket =>
                {
                    channel = new ChannelDirectTcpip(_sessionMock.Object, _localChannelNumber, _localWindowSize,
                                                     _localPacketSize);
                    channel.Open(_remoteHost, _port, _forwardedPortMock.Object, socket);
                    channel.Bind();
                    channel.Close();

                    handler = socket;

                    channelBindFinishedWaitHandle.Set();
                };

                var client = new Socket(localPortEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                client.Connect(localPortEndPoint);
                client.Shutdown(SocketShutdown.Send);
                Assert.IsFalse(client.Connected);

                channelBindFinishedWaitHandle.WaitOne();

                Assert.IsNotNull(handler);
                Assert.IsFalse(handler.Connected);

                _sessionMock.Verify(p => p.TrySendMessage(It.IsAny <ChannelEofMessage>()), Times.Once);
                _sessionMock.Verify(p => p.TrySendMessage(It.IsAny <ChannelCloseMessage>()), Times.Once);

                channel.Close();

                _sessionMock.Verify(p => p.TrySendMessage(It.IsAny <ChannelEofMessage>()), Times.Once);
                _sessionMock.Verify(p => p.TrySendMessage(It.IsAny <ChannelCloseMessage>()), Times.Once);
            }
        }