| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 | using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using Microsoft.VisualStudio.TestTools.UnitTesting;using Moq;using Renci.SshNet.Common;namespace Renci.SshNet.Tests.Classes{    [TestClass]    public class ScpClientTest_Upload_FileInfoAndPath_Success : ScpClientTestBase    {        private ConnectionInfo _connectionInfo;        private ScpClient _scpClient;        private FileInfo _fileInfo;        private string _remoteDirectory;        private string _remoteFile;        private string _remotePath;        private string _transformedPath;        private int _bufferSize;        private byte[] _fileContent;        private string _fileName;        private int _fileSize;        private IList<ScpUploadEventArgs> _uploadingRegister;        protected override void SetupData()        {            var random = new Random();            _bufferSize = random.Next(5, 15);            _fileSize = _bufferSize + 2; //force uploading 2 chunks            _fileContent = CreateContent(_fileSize);            _fileName = CreateTemporaryFile(_fileContent);            _connectionInfo = new ConnectionInfo("host", 22, "user", new PasswordAuthenticationMethod("user", "pwd"));            _fileInfo = new FileInfo(_fileName);            _remoteDirectory = "/home/sshnet";            _remoteFile = random.Next().ToString();            _remotePath = _remoteDirectory + "/" + _remoteFile;            _transformedPath = random.Next().ToString();            _uploadingRegister = new List<ScpUploadEventArgs>();        }        protected override void SetupMocks()        {            var sequence = new MockSequence();            _ = ServiceFactoryMock.InSequence(sequence)                                   .Setup(p => p.CreateRemotePathDoubleQuoteTransformation())                                   .Returns(_remotePathTransformationMock.Object);            _ = ServiceFactoryMock.InSequence(sequence)                                   .Setup(p => p.CreateSocketFactory())                                   .Returns(SocketFactoryMock.Object);            _ = ServiceFactoryMock.InSequence(sequence)                                   .Setup(p => p.CreateSession(_connectionInfo, SocketFactoryMock.Object))                                   .Returns(SessionMock.Object);            _ = SessionMock.InSequence(sequence)                            .Setup(p => p.Connect());            _ = ServiceFactoryMock.InSequence(sequence)                                   .Setup(p => p.CreatePipeStream())                                   .Returns(_pipeStreamMock.Object);            _ = SessionMock.InSequence(sequence)                            .Setup(p => p.CreateChannelSession())                            .Returns(_channelSessionMock.Object);            _ = _channelSessionMock.InSequence(sequence)                                   .Setup(p => p.Open());            _ = _remotePathTransformationMock.InSequence(sequence)                                             .Setup(p => p.Transform(_remoteDirectory))                                             .Returns(_transformedPath);            _ = _channelSessionMock.InSequence(sequence)                                   .Setup(p => p.SendExecRequest(string.Format("scp -t -d {0}", _transformedPath)))                                   .Returns(true);            _ = _pipeStreamMock.InSequence(sequence)                               .Setup(p => p.ReadByte())                               .Returns(0);            _ = _channelSessionMock.InSequence(sequence)                                   .Setup(p => p.SendData(It.IsAny<byte[]>()));            _ = _pipeStreamMock.InSequence(sequence)                               .Setup(p => p.ReadByte())                               .Returns(0);            _ = _channelSessionMock.InSequence(sequence)                                   .Setup(p => p.SendData(It.Is<byte[]>(b => b.SequenceEqual(CreateData(string.Format("C0644 {0} {1}\n", _fileInfo.Length, _remoteFile), _connectionInfo.Encoding)))));            _ = _pipeStreamMock.InSequence(sequence)                               .Setup(p => p.ReadByte())                               .Returns(0);            _ = _channelSessionMock.InSequence(sequence)                                   .Setup(p => p.SendData(It.Is<byte[]>(b => b.SequenceEqual(_fileContent.Take(_bufferSize))), 0, _bufferSize));            _ = _channelSessionMock.InSequence(sequence)                                   .Setup(p => p.SendData(It.Is<byte[]>(b => b.Take(0, _fileContent.Length - _bufferSize).SequenceEqual(_fileContent.Take(_bufferSize, _fileContent.Length - _bufferSize))), 0, _fileContent.Length - _bufferSize));            _ = _channelSessionMock.InSequence(sequence)                                   .Setup(p => p.SendData(It.Is<byte[]>(b => b.SequenceEqual(new byte[] { 0 }))));            _ = _pipeStreamMock.InSequence(sequence)                               .Setup(p => p.ReadByte())                               .Returns(0);            _ = _channelSessionMock.InSequence(sequence)                                   .Setup(p => p.Dispose());            _ = _pipeStreamMock.InSequence(sequence)                               .Setup(p => p.Close());        }        protected override void Arrange()        {            base.Arrange();            _scpClient = new ScpClient(_connectionInfo, false, ServiceFactoryMock.Object)            {                BufferSize = (uint)_bufferSize            };            _scpClient.Uploading += (sender, args) => _uploadingRegister.Add(args);            _scpClient.Connect();        }        protected override void TearDown()        {            base.TearDown();            if (_fileName != null)            {                File.Delete(_fileName);                _fileName = null;            }        }        protected override void Act()        {            _scpClient.Upload(_fileInfo, _remotePath);        }        [TestMethod]        public void SendExecRequestOnChannelSessionShouldBeInvokedOnce()        {            _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -t -d {0}", _transformedPath)), Times.Once);        }        [TestMethod]        public void DisposeOnChannelShouldBeInvokedOnce()        {            _channelSessionMock.Verify(p => p.Dispose(), Times.Once);        }        [TestMethod]        public void DisposeOnPipeStreamShouldBeInvokedOnce()        {            _pipeStreamMock.Verify(p => p.Close(), Times.Once);        }        [TestMethod]        public void UploadingShouldHaveFiredTwice()        {            Assert.AreEqual(2, _uploadingRegister.Count);            var uploading = _uploadingRegister[0];            Assert.IsNotNull(uploading);            Assert.AreSame(_fileInfo.Name, uploading.Filename);            Assert.AreEqual(_fileSize, uploading.Size);            Assert.AreEqual(_bufferSize, uploading.Uploaded);            uploading = _uploadingRegister[1];            Assert.IsNotNull(uploading);            Assert.AreSame(_fileInfo.Name, uploading.Filename);            Assert.AreEqual(_fileSize, uploading.Size);            Assert.AreEqual(_fileSize, uploading.Uploaded);        }        private static IEnumerable<byte> CreateData(string command, Encoding encoding)        {            return encoding.GetBytes(command);        }        private static byte[] CreateContent(int length)        {            var random = new Random();            var content = new byte[length];            for (var i = 0; i < length; i++)            {                content[i] = (byte)random.Next(byte.MinValue, byte.MaxValue);            }            return content;        }        private static string CreateTemporaryFile(byte[] content)        {            var tempFile = Path.GetTempFileName();            using (var fs = File.OpenWrite(tempFile))            {                fs.Write(content, 0, content.Length);            }            return tempFile;        }    }}
 |