SftpClientTest.Upload.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. using Renci.SshNet.Common;
  2. using Renci.SshNet.Sftp;
  3. namespace Renci.SshNet.IntegrationTests.OldIntegrationTests
  4. {
  5. /// <summary>
  6. /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
  7. /// </summary>
  8. public partial class SftpClientTest : IntegrationTestBase
  9. {
  10. [TestMethod]
  11. [TestCategory("Sftp")]
  12. public void Test_Sftp_Upload_And_Download_1MB_File()
  13. {
  14. RemoveAllFiles();
  15. using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  16. {
  17. sftp.Connect();
  18. var uploadedFileName = Path.GetTempFileName();
  19. var remoteFileName = Path.GetRandomFileName();
  20. CreateTestFile(uploadedFileName, 1);
  21. // Calculate has value
  22. var uploadedHash = CalculateMD5(uploadedFileName);
  23. using (var file = File.OpenRead(uploadedFileName))
  24. {
  25. sftp.UploadFile(file, remoteFileName);
  26. }
  27. var downloadedFileName = Path.GetTempFileName();
  28. using (var file = File.OpenWrite(downloadedFileName))
  29. {
  30. sftp.DownloadFile(remoteFileName, file);
  31. }
  32. var downloadedHash = CalculateMD5(downloadedFileName);
  33. sftp.DeleteFile(remoteFileName);
  34. File.Delete(uploadedFileName);
  35. File.Delete(downloadedFileName);
  36. sftp.Disconnect();
  37. Assert.AreEqual(uploadedHash, downloadedHash);
  38. }
  39. }
  40. [TestMethod]
  41. [TestCategory("Sftp")]
  42. public void Test_Sftp_Upload_Forbidden()
  43. {
  44. using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  45. {
  46. sftp.Connect();
  47. var uploadedFileName = Path.GetTempFileName();
  48. var remoteFileName = "/root/1";
  49. CreateTestFile(uploadedFileName, 1);
  50. using (var file = File.OpenRead(uploadedFileName))
  51. {
  52. Assert.ThrowsException<SftpPermissionDeniedException>(() => sftp.UploadFile(file, remoteFileName));
  53. }
  54. sftp.Disconnect();
  55. }
  56. }
  57. [TestMethod]
  58. [TestCategory("Sftp")]
  59. public void Test_Sftp_Multiple_Async_Upload_And_Download_10Files_5MB_Each()
  60. {
  61. var maxFiles = 10;
  62. var maxSize = 5;
  63. RemoveAllFiles();
  64. using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  65. {
  66. sftp.OperationTimeout = TimeSpan.FromMinutes(1);
  67. sftp.Connect();
  68. var testInfoList = new Dictionary<string, TestInfo>();
  69. for (var i = 0; i < maxFiles; i++)
  70. {
  71. var testInfo = new TestInfo
  72. {
  73. UploadedFileName = Path.GetTempFileName(),
  74. DownloadedFileName = Path.GetTempFileName(),
  75. RemoteFileName = Path.GetRandomFileName()
  76. };
  77. CreateTestFile(testInfo.UploadedFileName, maxSize);
  78. // Calculate hash value
  79. testInfo.UploadedHash = CalculateMD5(testInfo.UploadedFileName);
  80. testInfoList.Add(testInfo.RemoteFileName, testInfo);
  81. }
  82. var uploadWaitHandles = new List<WaitHandle>();
  83. // Start file uploads
  84. foreach (var remoteFile in testInfoList.Keys)
  85. {
  86. var testInfo = testInfoList[remoteFile];
  87. testInfo.UploadedFile = File.OpenRead(testInfo.UploadedFileName);
  88. testInfo.UploadResult = sftp.BeginUploadFile(testInfo.UploadedFile,
  89. remoteFile,
  90. null,
  91. null) as SftpUploadAsyncResult;
  92. uploadWaitHandles.Add(testInfo.UploadResult.AsyncWaitHandle);
  93. }
  94. // Wait for upload to finish
  95. var uploadCompleted = false;
  96. while (!uploadCompleted)
  97. {
  98. // Assume upload completed
  99. uploadCompleted = true;
  100. foreach (var testInfo in testInfoList.Values)
  101. {
  102. var sftpResult = testInfo.UploadResult;
  103. if (!testInfo.UploadResult.IsCompleted)
  104. {
  105. uploadCompleted = false;
  106. }
  107. }
  108. Thread.Sleep(500);
  109. }
  110. // End file uploads
  111. foreach (var remoteFile in testInfoList.Keys)
  112. {
  113. var testInfo = testInfoList[remoteFile];
  114. sftp.EndUploadFile(testInfo.UploadResult);
  115. testInfo.UploadedFile.Dispose();
  116. }
  117. // Start file downloads
  118. var downloadWaitHandles = new List<WaitHandle>();
  119. foreach (var remoteFile in testInfoList.Keys)
  120. {
  121. var testInfo = testInfoList[remoteFile];
  122. testInfo.DownloadedFile = File.OpenWrite(testInfo.DownloadedFileName);
  123. testInfo.DownloadResult = sftp.BeginDownloadFile(remoteFile,
  124. testInfo.DownloadedFile,
  125. null,
  126. null) as SftpDownloadAsyncResult;
  127. downloadWaitHandles.Add(testInfo.DownloadResult.AsyncWaitHandle);
  128. }
  129. // Wait for download to finish
  130. var downloadCompleted = false;
  131. while (!downloadCompleted)
  132. {
  133. // Assume download completed
  134. downloadCompleted = true;
  135. foreach (var testInfo in testInfoList.Values)
  136. {
  137. var sftpResult = testInfo.DownloadResult;
  138. if (!testInfo.DownloadResult.IsCompleted)
  139. {
  140. downloadCompleted = false;
  141. }
  142. }
  143. Thread.Sleep(500);
  144. }
  145. var hashMatches = true;
  146. var uploadDownloadSizeOk = true;
  147. // End file downloads
  148. foreach (var remoteFile in testInfoList.Keys)
  149. {
  150. var testInfo = testInfoList[remoteFile];
  151. sftp.EndDownloadFile(testInfo.DownloadResult);
  152. testInfo.DownloadedFile.Dispose();
  153. testInfo.DownloadedHash = CalculateMD5(testInfo.DownloadedFileName);
  154. Console.WriteLine(remoteFile);
  155. Console.WriteLine("UploadedBytes: " + testInfo.UploadResult.UploadedBytes);
  156. Console.WriteLine("DownloadedBytes: " + testInfo.DownloadResult.DownloadedBytes);
  157. Console.WriteLine("UploadedHash: " + testInfo.UploadedHash);
  158. Console.WriteLine("DownloadedHash: " + testInfo.DownloadedHash);
  159. if (!(testInfo.UploadResult.UploadedBytes > 0 && testInfo.DownloadResult.DownloadedBytes > 0 && testInfo.DownloadResult.DownloadedBytes == testInfo.UploadResult.UploadedBytes))
  160. {
  161. uploadDownloadSizeOk = false;
  162. }
  163. if (!testInfo.DownloadedHash.Equals(testInfo.UploadedHash))
  164. {
  165. hashMatches = false;
  166. }
  167. }
  168. // Clean up after test
  169. foreach (var remoteFile in testInfoList.Keys)
  170. {
  171. var testInfo = testInfoList[remoteFile];
  172. sftp.DeleteFile(remoteFile);
  173. File.Delete(testInfo.UploadedFileName);
  174. File.Delete(testInfo.DownloadedFileName);
  175. }
  176. sftp.Disconnect();
  177. Assert.IsTrue(hashMatches, "Hash does not match");
  178. Assert.IsTrue(uploadDownloadSizeOk, "Uploaded and downloaded bytes does not match");
  179. }
  180. }
  181. // TODO: Split this test into multiple tests
  182. [TestMethod]
  183. [TestCategory("Sftp")]
  184. [Description("Test that delegates passed to BeginUploadFile, BeginDownloadFile and BeginListDirectory are actually called.")]
  185. public void Test_Sftp_Ensure_Async_Delegates_Called_For_BeginFileUpload_BeginFileDownload_BeginListDirectory()
  186. {
  187. RemoveAllFiles();
  188. using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  189. {
  190. sftp.Connect();
  191. var remoteFileName = Path.GetRandomFileName();
  192. var localFileName = Path.GetRandomFileName();
  193. var uploadDelegateCalled = false;
  194. var downloadDelegateCalled = false;
  195. var listDirectoryDelegateCalled = false;
  196. IAsyncResult asyncResult;
  197. // Test for BeginUploadFile.
  198. CreateTestFile(localFileName, 1);
  199. using (var fileStream = File.OpenRead(localFileName))
  200. {
  201. asyncResult = sftp.BeginUploadFile(fileStream,
  202. remoteFileName,
  203. delegate (IAsyncResult ar)
  204. {
  205. sftp.EndUploadFile(ar);
  206. uploadDelegateCalled = true;
  207. },
  208. null);
  209. while (!asyncResult.IsCompleted)
  210. {
  211. Thread.Sleep(500);
  212. }
  213. }
  214. File.Delete(localFileName);
  215. Assert.IsTrue(uploadDelegateCalled, "BeginUploadFile");
  216. // Test for BeginDownloadFile.
  217. asyncResult = null;
  218. using (var fileStream = File.OpenWrite(localFileName))
  219. {
  220. asyncResult = sftp.BeginDownloadFile(remoteFileName,
  221. fileStream,
  222. delegate (IAsyncResult ar)
  223. {
  224. sftp.EndDownloadFile(ar);
  225. downloadDelegateCalled = true;
  226. },
  227. null);
  228. while (!asyncResult.IsCompleted)
  229. {
  230. Thread.Sleep(500);
  231. }
  232. }
  233. File.Delete(localFileName);
  234. Assert.IsTrue(downloadDelegateCalled, "BeginDownloadFile");
  235. // Test for BeginListDirectory.
  236. asyncResult = null;
  237. asyncResult = sftp.BeginListDirectory(sftp.WorkingDirectory,
  238. delegate (IAsyncResult ar)
  239. {
  240. _ = sftp.EndListDirectory(ar);
  241. listDirectoryDelegateCalled = true;
  242. },
  243. null);
  244. while (!asyncResult.IsCompleted)
  245. {
  246. Thread.Sleep(500);
  247. }
  248. Assert.IsTrue(listDirectoryDelegateCalled, "BeginListDirectory");
  249. }
  250. }
  251. [TestMethod]
  252. [TestCategory("Sftp")]
  253. [Description("Test passing null to BeginUploadFile")]
  254. public void Test_Sftp_BeginUploadFile_StreamIsNull()
  255. {
  256. using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  257. {
  258. sftp.Connect();
  259. Assert.ThrowsException<ArgumentNullException>(() => sftp.BeginUploadFile(null, "aaaaa", null, null));
  260. }
  261. }
  262. [TestMethod]
  263. [TestCategory("Sftp")]
  264. [Description("Test passing null to BeginUploadFile")]
  265. public void Test_Sftp_BeginUploadFile_FileNameIsWhiteSpace()
  266. {
  267. using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  268. {
  269. sftp.Connect();
  270. Assert.ThrowsException<ArgumentException>(() => sftp.BeginUploadFile(new MemoryStream(), " ", null, null));
  271. }
  272. }
  273. [TestMethod]
  274. [TestCategory("Sftp")]
  275. [Description("Test passing null to BeginUploadFile")]
  276. public void Test_Sftp_BeginUploadFile_FileNameIsNull()
  277. {
  278. using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  279. {
  280. sftp.Connect();
  281. Assert.ThrowsException<ArgumentNullException>(() => sftp.BeginUploadFile(new MemoryStream(), null, null, null));
  282. }
  283. }
  284. [TestMethod]
  285. [TestCategory("Sftp")]
  286. public void Test_Sftp_EndUploadFile_Invalid_Async_Handle()
  287. {
  288. using (var sftp = new SftpClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  289. {
  290. sftp.Connect();
  291. var async1 = sftp.BeginListDirectory("/", null, null);
  292. var filename = Path.GetTempFileName();
  293. CreateTestFile(filename, 100);
  294. using var fileStream = File.OpenRead(filename);
  295. var async2 = sftp.BeginUploadFile(fileStream, "test", null, null);
  296. Assert.ThrowsException<ArgumentException>(() => sftp.EndUploadFile(async1));
  297. }
  298. }
  299. }
  300. }