|
|
@@ -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<ChannelEventArgs> _channelClosedRegister;
|
|
|
+ private List<ChannelEventArgs> _channelEndOfDataRegister;
|
|
|
private IList<ExceptionEventArgs> _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<ChannelEventArgs>();
|
|
|
+ _channelEndOfDataRegister = new List<ChannelEventArgs>();
|
|
|
+ _channelExceptionRegister = new List<ExceptionEventArgs>();
|
|
|
+ _channelClosedReceived = new ManualResetEvent(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void CreateMocks()
|
|
|
+ {
|
|
|
+ _sessionMock = new Mock<ISession>(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<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true);
|
|
|
+ _sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny<EventWaitHandle>()))
|
|
|
+ .Callback<WaitHandle>(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<ChannelCloseMessage>(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<ChannelEventArgs>();
|
|
|
- _channelExceptionRegister = new List<ExceptionEventArgs>();
|
|
|
- _channelClosedReceived = new ManualResetEvent(false);
|
|
|
-
|
|
|
- _sessionMock = new Mock<ISession>(MockBehavior.Strict);
|
|
|
-
|
|
|
- var sequence = new MockSequence();
|
|
|
- _sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true);
|
|
|
- _sessionMock.InSequence(sequence).Setup(p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true);
|
|
|
- _sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny<EventWaitHandle>()))
|
|
|
- .Callback<WaitHandle>(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<ChannelCloseMessage>(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()
|
|
|
{
|