| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- 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")]
- [ExpectedException(typeof(SftpPermissionDeniedException))]
- 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))
- {
- 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");
- if (!uploadDownloadSizeOk)
- {
- // TODO https://github.com/sshnet/SSH.NET/issues/1253
- Assert.Inconclusive("Uploaded and downloaded bytes should match, but test is not stable");
- }
- else
- {
- 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")]
- [ExpectedException(typeof(ArgumentNullException))]
- public void Test_Sftp_BeginUploadFile_StreamIsNull()
- {
- using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
- {
- sftp.Connect();
- _ = sftp.BeginUploadFile(null, "aaaaa", null, null);
- sftp.Disconnect();
- }
- }
- [TestMethod]
- [TestCategory("Sftp")]
- [Description("Test passing null to BeginUploadFile")]
- [ExpectedException(typeof(ArgumentException))]
- public void Test_Sftp_BeginUploadFile_FileNameIsWhiteSpace()
- {
- using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
- {
- sftp.Connect();
- _ = sftp.BeginUploadFile(new MemoryStream(), " ", null, null);
- sftp.Disconnect();
- }
- }
- [TestMethod]
- [TestCategory("Sftp")]
- [Description("Test passing null to BeginUploadFile")]
- [ExpectedException(typeof(ArgumentException))]
- public void Test_Sftp_BeginUploadFile_FileNameIsNull()
- {
- using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
- {
- sftp.Connect();
- _ = sftp.BeginUploadFile(new MemoryStream(), null, null, null);
- sftp.Disconnect();
- }
- }
- [TestMethod]
- [TestCategory("Sftp")]
- [ExpectedException(typeof(ArgumentException))]
- 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);
- var async2 = sftp.BeginUploadFile(File.OpenRead(filename), "test", null, null);
- sftp.EndUploadFile(async1);
- }
- }
- }
- }
|