| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 | using Renci.SshNet.Common;using Renci.SshNet.Sftp;namespace Renci.SshNet.IntegrationTests.OldIntegrationTests{    /// <summary>    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.    /// </summary>    public partial class SftpClientTest : IntegrationTestBase    {        [TestMethod]        [TestCategory("Sftp")]        public void Test_Sftp_Upload_And_Download_1MB_File()        {            RemoveAllFiles();            using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))            {                sftp.Connect();                var uploadedFileName = Path.GetTempFileName();                var remoteFileName = Path.GetRandomFileName();                CreateTestFile(uploadedFileName, 1);                //  Calculate has value                var uploadedHash = CalculateMD5(uploadedFileName);                using (var file = File.OpenRead(uploadedFileName))                {                    sftp.UploadFile(file, remoteFileName);                }                var downloadedFileName = Path.GetTempFileName();                using (var file = File.OpenWrite(downloadedFileName))                {                    sftp.DownloadFile(remoteFileName, file);                }                var downloadedHash = CalculateMD5(downloadedFileName);                sftp.DeleteFile(remoteFileName);                File.Delete(uploadedFileName);                File.Delete(downloadedFileName);                sftp.Disconnect();                Assert.AreEqual(uploadedHash, downloadedHash);            }        }        [TestMethod]        [TestCategory("Sftp")]        public void Test_Sftp_Upload_Forbidden()        {            using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))            {                sftp.Connect();                var uploadedFileName = Path.GetTempFileName();                var remoteFileName = "/root/1";                CreateTestFile(uploadedFileName, 1);                using (var file = File.OpenRead(uploadedFileName))                {                    Assert.ThrowsException<SftpPermissionDeniedException>(() => sftp.UploadFile(file, remoteFileName));                }                sftp.Disconnect();            }        }        [TestMethod]        [TestCategory("Sftp")]        public void Test_Sftp_Multiple_Async_Upload_And_Download_10Files_5MB_Each()        {            var maxFiles = 10;            var maxSize = 5;            RemoveAllFiles();            using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))            {                sftp.OperationTimeout = TimeSpan.FromMinutes(1);                sftp.Connect();                var testInfoList = new Dictionary<string, TestInfo>();                for (var i = 0; i < maxFiles; i++)                {                    var testInfo = new TestInfo                    {                        UploadedFileName = Path.GetTempFileName(),                        DownloadedFileName = Path.GetTempFileName(),                        RemoteFileName = Path.GetRandomFileName()                    };                    CreateTestFile(testInfo.UploadedFileName, maxSize);                    //  Calculate hash value                    testInfo.UploadedHash = CalculateMD5(testInfo.UploadedFileName);                    testInfoList.Add(testInfo.RemoteFileName, testInfo);                }                var uploadWaitHandles = new List<WaitHandle>();                //  Start file uploads                foreach (var remoteFile in testInfoList.Keys)                {                    var testInfo = testInfoList[remoteFile];                    testInfo.UploadedFile = File.OpenRead(testInfo.UploadedFileName);                    testInfo.UploadResult = sftp.BeginUploadFile(testInfo.UploadedFile,                        remoteFile,                        null,                        null) as SftpUploadAsyncResult;                    uploadWaitHandles.Add(testInfo.UploadResult.AsyncWaitHandle);                }                //  Wait for upload to finish                var uploadCompleted = false;                while (!uploadCompleted)                {                    //  Assume upload completed                    uploadCompleted = true;                    foreach (var testInfo in testInfoList.Values)                    {                        var sftpResult = testInfo.UploadResult;                        if (!testInfo.UploadResult.IsCompleted)                        {                            uploadCompleted = false;                        }                    }                    Thread.Sleep(500);                }                //  End file uploads                foreach (var remoteFile in testInfoList.Keys)                {                    var testInfo = testInfoList[remoteFile];                    sftp.EndUploadFile(testInfo.UploadResult);                    testInfo.UploadedFile.Dispose();                }                //  Start file downloads                var downloadWaitHandles = new List<WaitHandle>();                foreach (var remoteFile in testInfoList.Keys)                {                    var testInfo = testInfoList[remoteFile];                    testInfo.DownloadedFile = File.OpenWrite(testInfo.DownloadedFileName);                    testInfo.DownloadResult = sftp.BeginDownloadFile(remoteFile,                        testInfo.DownloadedFile,                        null,                        null) as SftpDownloadAsyncResult;                    downloadWaitHandles.Add(testInfo.DownloadResult.AsyncWaitHandle);                }                //  Wait for download to finish                var downloadCompleted = false;                while (!downloadCompleted)                {                    //  Assume download completed                    downloadCompleted = true;                    foreach (var testInfo in testInfoList.Values)                    {                        var sftpResult = testInfo.DownloadResult;                        if (!testInfo.DownloadResult.IsCompleted)                        {                            downloadCompleted = false;                        }                    }                    Thread.Sleep(500);                }                var hashMatches = true;                var uploadDownloadSizeOk = true;                //  End file downloads                foreach (var remoteFile in testInfoList.Keys)                {                    var testInfo = testInfoList[remoteFile];                    sftp.EndDownloadFile(testInfo.DownloadResult);                    testInfo.DownloadedFile.Dispose();                    testInfo.DownloadedHash = CalculateMD5(testInfo.DownloadedFileName);                    Console.WriteLine(remoteFile);                    Console.WriteLine("UploadedBytes: " + testInfo.UploadResult.UploadedBytes);                    Console.WriteLine("DownloadedBytes: " + testInfo.DownloadResult.DownloadedBytes);                    Console.WriteLine("UploadedHash: " + testInfo.UploadedHash);                    Console.WriteLine("DownloadedHash: " + testInfo.DownloadedHash);                    if (!(testInfo.UploadResult.UploadedBytes > 0 && testInfo.DownloadResult.DownloadedBytes > 0 && testInfo.DownloadResult.DownloadedBytes == testInfo.UploadResult.UploadedBytes))                    {                        uploadDownloadSizeOk = false;                    }                    if (!testInfo.DownloadedHash.Equals(testInfo.UploadedHash))                    {                        hashMatches = false;                    }                }                //  Clean up after test                foreach (var remoteFile in testInfoList.Keys)                {                    var testInfo = testInfoList[remoteFile];                    sftp.DeleteFile(remoteFile);                    File.Delete(testInfo.UploadedFileName);                    File.Delete(testInfo.DownloadedFileName);                }                sftp.Disconnect();                Assert.IsTrue(hashMatches, "Hash does not match");                Assert.IsTrue(uploadDownloadSizeOk, "Uploaded and downloaded bytes does not match");            }        }        //  TODO:   Split this test into multiple tests        [TestMethod]        [TestCategory("Sftp")]        [Description("Test that delegates passed to BeginUploadFile, BeginDownloadFile and BeginListDirectory are actually called.")]        public void Test_Sftp_Ensure_Async_Delegates_Called_For_BeginFileUpload_BeginFileDownload_BeginListDirectory()        {            RemoveAllFiles();            using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))            {                sftp.Connect();                var remoteFileName = Path.GetRandomFileName();                var localFileName = Path.GetRandomFileName();                var uploadDelegateCalled = false;                var downloadDelegateCalled = false;                var listDirectoryDelegateCalled = false;                IAsyncResult asyncResult;                // Test for BeginUploadFile.                CreateTestFile(localFileName, 1);                using (var fileStream = File.OpenRead(localFileName))                {                    asyncResult = sftp.BeginUploadFile(fileStream,                                                       remoteFileName,                                                       delegate (IAsyncResult ar)                                                           {                                                               sftp.EndUploadFile(ar);                                                               uploadDelegateCalled = true;                                                           },                                                       null);                    while (!asyncResult.IsCompleted)                    {                        Thread.Sleep(500);                    }                }                File.Delete(localFileName);                Assert.IsTrue(uploadDelegateCalled, "BeginUploadFile");                // Test for BeginDownloadFile.                asyncResult = null;                using (var fileStream = File.OpenWrite(localFileName))                {                    asyncResult = sftp.BeginDownloadFile(remoteFileName,                                                         fileStream,                                                         delegate (IAsyncResult ar)                                                            {                                                                sftp.EndDownloadFile(ar);                                                                downloadDelegateCalled = true;                                                            },                                                         null);                    while (!asyncResult.IsCompleted)                    {                        Thread.Sleep(500);                    }                }                File.Delete(localFileName);                Assert.IsTrue(downloadDelegateCalled, "BeginDownloadFile");                // Test for BeginListDirectory.                asyncResult = null;                asyncResult = sftp.BeginListDirectory(sftp.WorkingDirectory,                                                      delegate (IAsyncResult ar)                                                        {                                                            _ = sftp.EndListDirectory(ar);                                                            listDirectoryDelegateCalled = true;                                                        },                                                      null);                while (!asyncResult.IsCompleted)                {                    Thread.Sleep(500);                }                Assert.IsTrue(listDirectoryDelegateCalled, "BeginListDirectory");            }        }        [TestMethod]        [TestCategory("Sftp")]        [Description("Test passing null to BeginUploadFile")]        public void Test_Sftp_BeginUploadFile_StreamIsNull()        {            using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))            {                sftp.Connect();                Assert.ThrowsException<ArgumentNullException>(() => sftp.BeginUploadFile(null, "aaaaa", null, null));            }        }        [TestMethod]        [TestCategory("Sftp")]        [Description("Test passing null to BeginUploadFile")]        public void Test_Sftp_BeginUploadFile_FileNameIsWhiteSpace()        {            using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))            {                sftp.Connect();                Assert.ThrowsException<ArgumentException>(() => sftp.BeginUploadFile(new MemoryStream(), "   ", null, null));            }        }        [TestMethod]        [TestCategory("Sftp")]        [Description("Test passing null to BeginUploadFile")]        public void Test_Sftp_BeginUploadFile_FileNameIsNull()        {            using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))            {                sftp.Connect();                Assert.ThrowsException<ArgumentNullException>(() => sftp.BeginUploadFile(new MemoryStream(), null, null, null));            }        }        [TestMethod]        [TestCategory("Sftp")]        public void Test_Sftp_EndUploadFile_Invalid_Async_Handle()        {            using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))            {                sftp.Connect();                var async1 = sftp.BeginListDirectory("/", null, null);                var filename = Path.GetTempFileName();                CreateTestFile(filename, 100);                using var fileStream = File.OpenRead(filename);                var async2 = sftp.BeginUploadFile(fileStream, "test", null, null);                Assert.ThrowsException<ArgumentException>(() => sftp.EndUploadFile(async1));            }        }    }}
 |