using System; using System.Collections.Generic; using System.Globalization; using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Renci.SshNet.Channels; using Renci.SshNet.Common; using Renci.SshNet.Messages.Connection; namespace Renci.SshNet.Tests.Classes.Channels { [TestClass] public class ChannelSessionTest_Open_OnOpenFailureReceived_NoRetriesAvailable : ChannelSessionTestBase { private ChannelSession _channel; private uint _localChannelNumber; private uint _localWindowSize; private uint _localPacketSize; private IList _channelClosedRegister; private List _channelExceptionRegister; private SemaphoreSlim _sessionSemaphore; private int _initialSessionSemaphoreCount; private uint _failureReasonCode; private string _failureDescription; private string _failureLanguage; private SshException _actualException; protected override void SetupData() { var random = new Random(); _localChannelNumber = (uint)random.Next(0, int.MaxValue); _localWindowSize = (uint)random.Next(2000, 3000); _localPacketSize = (uint)random.Next(1000, 2000); _initialSessionSemaphoreCount = random.Next(10, 20); _sessionSemaphore = new SemaphoreSlim(_initialSessionSemaphoreCount); _channelClosedRegister = new List(); _channelExceptionRegister = new List(); _actualException = null; _failureReasonCode = (uint)random.Next(0, int.MaxValue); _failureDescription = random.Next().ToString(CultureInfo.InvariantCulture); _failureLanguage = random.Next().ToString(CultureInfo.InvariantCulture); } protected override void SetupMocks() { var sequence = new MockSequence(); SessionMock.InSequence(sequence).Setup(p => p.ConnectionInfo).Returns(ConnectionInfoMock.Object); ConnectionInfoMock.InSequence(sequence).Setup(p => p.RetryAttempts).Returns(1); SessionMock.Setup(p => p.SessionSemaphore).Returns(_sessionSemaphore); SessionMock.InSequence(sequence) .Setup( p => p.SendMessage( It.Is( m => m.LocalChannelNumber == _localChannelNumber && m.InitialWindowSize == _localWindowSize && m.MaximumPacketSize == _localPacketSize && m.Info is SessionChannelOpenInfo))); SessionMock.InSequence(sequence) .Setup(p => p.WaitOnHandle(It.IsNotNull())) .Callback( w => { SessionMock.Raise( s => s.ChannelOpenFailureReceived += null, new MessageEventArgs( new ChannelOpenFailureMessage( _localChannelNumber, _failureDescription, _failureReasonCode, _failureLanguage ))); w.WaitOne(); }); SessionMock.InSequence(sequence).Setup(p => p.ConnectionInfo).Returns(ConnectionInfoMock.Object); ConnectionInfoMock.InSequence(sequence).Setup(p => p.RetryAttempts).Returns(1); } protected override void Arrange() { base.Arrange(); _channel = new ChannelSession(SessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize); _channel.Closed += (sender, args) => _channelClosedRegister.Add(args); _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); } protected override void Act() { try { _channel.Open(); } catch (SshException ex) { _actualException = ex; } } [TestMethod] public void OpenShouldHaveThrownSshException() { Assert.IsNotNull(_actualException); Assert.AreEqual(typeof(SshException), _actualException.GetType()); Assert.IsNull(_actualException.InnerException); Assert.AreEqual("Failed to open a channel after 1 attempts.", _actualException.Message); } [TestMethod] public void CurrentCountOfSessionSemaphoreShouldBeEqualToInitialCount() { Assert.AreEqual(_initialSessionSemaphoreCount, _sessionSemaphore.CurrentCount); } [TestMethod] public void ExceptionShouldNeverHaveFired() { Assert.AreEqual(0, _channelExceptionRegister.Count); } [TestMethod] public void ClosedEventShouldNeverHaveFired() { Assert.AreEqual(0, _channelClosedRegister.Count); } [TestMethod] public void IsOpenShouldReturnFalse() { Assert.IsFalse(_channel.IsOpen); } } }