using System; using System.Collections.Generic; using System.Text; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Renci.SshNet.Channels; using Renci.SshNet.Common; namespace Renci.SshNet.Tests.Classes { [TestClass] public class ServiceFactoryTest_CreateShellStream_SendShellRequestThrowsException { private Mock _sessionMock; private Mock _connectionInfoMock; private Mock _channelSessionMock; private ServiceFactory _serviceFactory; private string _terminalName; private uint _columns; private uint _rows; private uint _width; private uint _height; private IDictionary _terminalModeValues; private int _bufferSize; private int _expectSize; private SshException _sendShellRequestException; private SshException _actualException; private void SetupData() { var random = new Random(); _terminalName = random.Next().ToString(); _columns = (uint) random.Next(); _rows = (uint) random.Next(); _width = (uint) random.Next(); _height = (uint) random.Next(); _terminalModeValues = new Dictionary(); _bufferSize = random.Next(); _expectSize = _bufferSize; _sendShellRequestException = new SshException(); _actualException = null; } private void CreateMocks() { _sessionMock = new Mock(MockBehavior.Strict); _connectionInfoMock = new Mock(MockBehavior.Strict); _channelSessionMock = new Mock(MockBehavior.Strict); } private void SetupMocks() { var sequence = new MockSequence(); _sessionMock.InSequence(sequence) .Setup(p => p.ConnectionInfo) .Returns(_connectionInfoMock.Object); _connectionInfoMock.InSequence(sequence) .Setup(p => p.Encoding) .Returns(new UTF8Encoding()); _sessionMock.InSequence(sequence) .Setup(p => p.CreateChannelSession()) .Returns(_channelSessionMock.Object); _channelSessionMock.InSequence(sequence) .Setup(p => p.Open()); _channelSessionMock.InSequence(sequence) .Setup(p => p.SendPseudoTerminalRequest(_terminalName, _columns, _rows, _width, _height, _terminalModeValues)) .Returns(true); _channelSessionMock.InSequence(sequence) .Setup(p => p.SendShellRequest()) .Throws(_sendShellRequestException); _channelSessionMock.InSequence(sequence) .Setup(p => p.Dispose()); } private void Arrange() { SetupData(); CreateMocks(); SetupMocks(); _serviceFactory = new ServiceFactory(); } [TestInitialize] public void Initialize() { Arrange(); Act(); } private void Act() { try { _serviceFactory.CreateShellStream(_sessionMock.Object, _terminalName, _columns, _rows, _width, _height, _terminalModeValues, _bufferSize, _expectSize); Assert.Fail(); } catch (SshException ex) { _actualException = ex; } } [TestMethod] public void CreateShellStreamShouldRethrowExceptionThrownBySendShellRequestOnChannelSession() { Assert.IsNotNull(_actualException); Assert.AreSame(_sendShellRequestException, _actualException); } [TestMethod] public void DisposeOnChannelSessionShouldHaveBeenInvokedOnce() { _channelSessionMock.Verify(p => p.Dispose(), Times.Once); } } }