diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs index 214123fd..0de05a59 100644 --- a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -21,9 +20,59 @@ namespace Renci.SshNet.Tests.Classes.Channels private uint _remotePacketSize; private ChannelStub _channel; private List _channelClosedRegister; + private List _channelEndOfDataRegister; private IList _channelExceptionRegister; private ManualResetEvent _channelClosedReceived; + private void SetupData() + { + var random = new Random(); + + _localChannelNumber = (uint) random.Next(0, int.MaxValue); + _localWindowSize = (uint) random.Next(0, int.MaxValue); + _localPacketSize = (uint) random.Next(0, int.MaxValue); + _remoteChannelNumber = (uint) random.Next(0, int.MaxValue); + _remoteWindowSize = (uint) random.Next(0, int.MaxValue); + _remotePacketSize = (uint) random.Next(0, int.MaxValue); + _channelClosedRegister = new List(); + _channelEndOfDataRegister = new List(); + _channelExceptionRegister = new List(); + _channelClosedReceived = new ManualResetEvent(false); + } + + private void CreateMocks() + { + _sessionMock = new Mock(MockBehavior.Strict); + } + + private void SetupMocks() + { + var sequence = new MockSequence(); + + _sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true); + _sessionMock.InSequence(sequence).Setup(p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true); + _sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny())) + .Callback(w => + { + new Thread(() => + { + Thread.Sleep(100); + // raise ChannelCloseReceived event to set waithandle for receiving + // SSH_MSG_CHANNEL_CLOSE message from server which is waited on after + // sending the SSH_MSG_CHANNEL_CLOSE message to the server + // + // we're mocking the wait on the ChannelCloseMessage, but we still want + // to get the channel in the state that it would have after actually receiving + // the ChannelCloseMessage + _sessionMock.Raise(s => s.ChannelCloseReceived += null, new MessageEventArgs(new ChannelCloseMessage(_localChannelNumber))); + // signal that the ChannelCloseMessage was received; we use this to verify whether we've actually + // waited on the EventWaitHandle to be set + _channelClosedReceived.Set(); + }).Start(); + w.WaitOne(); + }); + } + [TestInitialize] public void Initialize() { @@ -43,45 +92,13 @@ namespace Renci.SshNet.Tests.Classes.Channels private void Arrange() { - var random = new Random(); - _localChannelNumber = (uint)random.Next(0, int.MaxValue); - _localWindowSize = (uint)random.Next(0, int.MaxValue); - _localPacketSize = (uint)random.Next(0, int.MaxValue); - _remoteChannelNumber = (uint)random.Next(0, int.MaxValue); - _remoteWindowSize = (uint)random.Next(0, int.MaxValue); - _remotePacketSize = (uint)random.Next(0, int.MaxValue); - _channelClosedRegister = new List(); - _channelExceptionRegister = new List(); - _channelClosedReceived = new ManualResetEvent(false); - - _sessionMock = new Mock(MockBehavior.Strict); - - var sequence = new MockSequence(); - _sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true); - _sessionMock.InSequence(sequence).Setup(p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true); - _sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny())) - .Callback(w => - { - new Thread(() => - { - Thread.Sleep(100); - // signal that the ChannelCloseMessage was received; we use this to verify whether we've actually - // waited on the EventWaitHandle to be set - _channelClosedReceived.Set(); - // raise ChannelCloseReceived event to set waithandle for receiving - // SSH_MSG_CHANNEL_CLOSE message from server which is waited on after - // sending the SSH_MSG_CHANNEL_CLOSE message to the server - // - // we're mocking the wait on the ChannelCloseMessage, but we still want - // to get the channel in the state that it would have after actually receiving - // the ChannelCloseMessage - _sessionMock.Raise(s => s.ChannelCloseReceived += null, new MessageEventArgs(new ChannelCloseMessage(_localChannelNumber))); - }).Start(); - w.WaitOne(); - }); + SetupData(); + CreateMocks(); + SetupMocks(); _channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize); _channel.Closed += (sender, args) => _channelClosedRegister.Add(args); + _channel.EndOfData += (sender, args) => _channelEndOfDataRegister.Add(args); _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); _channel.SetIsOpen(true); @@ -137,6 +154,13 @@ namespace Renci.SshNet.Tests.Classes.Channels Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber); } + [TestMethod] + public void EndOfDataEventShouldHaveFiredOnce() + { + Assert.AreEqual(1, _channelEndOfDataRegister.Count); + Assert.AreEqual(_localChannelNumber, _channelEndOfDataRegister[0].ChannelNumber); + } + [TestMethod] public void ExceptionShouldNeverHaveFired() {