浏览代码

Mark integration tests as such.

drieseng 9 年之前
父节点
当前提交
7d4d0aab33

+ 92 - 88
src/Renci.SshNet.Tests/Classes/SftpClientTest.DeleteDirectory.cs

@@ -1,89 +1,93 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Renci.SshNet.Common;
-using Renci.SshNet.Tests.Common;
-using Renci.SshNet.Tests.Properties;
-using System;
-
-namespace Renci.SshNet.Tests.Classes
-{
-    /// <summary>
-    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
-    /// </summary>
-    public partial class SftpClientTest : TestBase
-    {
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(SshConnectionException))]
-        public void Test_Sftp_DeleteDirectory_Without_Connecting()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.DeleteDirectory("test");
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(SftpPathNotFoundException))]
-        public void Test_Sftp_DeleteDirectory_Which_Doesnt_Exists()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                sftp.DeleteDirectory("abcdef");
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(SftpPermissionDeniedException))]
-        public void Test_Sftp_DeleteDirectory_Which_No_Permissions()
-        {
-            if (Resources.USERNAME == "root")
-                Assert.Fail("Must not run this test as root!");
-
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                sftp.DeleteDirectory("/usr");
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_DeleteDirectory()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                sftp.CreateDirectory("abcdef");
-                sftp.DeleteDirectory("abcdef");
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [Description("Test passing null to DeleteDirectory.")]
-        [ExpectedException(typeof(ArgumentException))]
-        public void Test_Sftp_DeleteDirectory_Null()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                sftp.DeleteDirectory(null);
-
-                sftp.Disconnect();
-            }
-        }
-    }
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Renci.SshNet.Common;
+using Renci.SshNet.Tests.Common;
+using Renci.SshNet.Tests.Properties;
+using System;
+
+namespace Renci.SshNet.Tests.Classes
+{
+    /// <summary>
+    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
+    /// </summary>
+    public partial class SftpClientTest : TestBase
+    {
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [ExpectedException(typeof(SshConnectionException))]
+        public void Test_Sftp_DeleteDirectory_Without_Connecting()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.DeleteDirectory("test");
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(SftpPathNotFoundException))]
+        public void Test_Sftp_DeleteDirectory_Which_Doesnt_Exists()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                sftp.DeleteDirectory("abcdef");
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(SftpPermissionDeniedException))]
+        public void Test_Sftp_DeleteDirectory_Which_No_Permissions()
+        {
+            if (Resources.USERNAME == "root")
+                Assert.Fail("Must not run this test as root!");
+
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                sftp.DeleteDirectory("/usr");
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_DeleteDirectory()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                sftp.CreateDirectory("abcdef");
+                sftp.DeleteDirectory("abcdef");
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to DeleteDirectory.")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void Test_Sftp_DeleteDirectory_Null()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                sftp.DeleteDirectory(null);
+
+                sftp.Disconnect();
+            }
+        }
+    }
 }

+ 121 - 115
src/Renci.SshNet.Tests/Classes/SftpClientTest.Download.cs

@@ -1,116 +1,122 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Renci.SshNet.Common;
-using Renci.SshNet.Tests.Common;
-using Renci.SshNet.Tests.Properties;
-using System;
-using System.IO;
-
-namespace Renci.SshNet.Tests.Classes
-{
-    /// <summary>
-    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
-    /// </summary>
-    public partial class SftpClientTest : TestBase
-    {
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(SftpPermissionDeniedException))]
-        public void Test_Sftp_Download_Forbidden()
-        {
-            if (Resources.USERNAME == "root")
-                Assert.Fail("Must not run this test as root!");
-
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                string remoteFileName = "/root/.profile";
-
-                using (var ms = new MemoryStream())
-                {
-                    sftp.DownloadFile(remoteFileName, ms);
-                }
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(SftpPathNotFoundException))]
-        public void Test_Sftp_Download_File_Not_Exists()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                string remoteFileName = "/xxx/eee/yyy";
-                using (var ms = new MemoryStream())
-                {
-                    sftp.DownloadFile(remoteFileName, ms);
-                }
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [Description("Test passing null to BeginDownloadFile")]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Test_Sftp_BeginDownloadFile_StreamIsNull()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-                sftp.BeginDownloadFile("aaaa", null, null, null);
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [Description("Test passing null to BeginDownloadFile")]
-        [ExpectedException(typeof(ArgumentException))]
-        public void Test_Sftp_BeginDownloadFile_FileNameIsWhiteSpace()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-                sftp.BeginDownloadFile("   ", new MemoryStream(), null, null);
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [Description("Test passing null to BeginDownloadFile")]
-        [ExpectedException(typeof(ArgumentException))]
-        public void Test_Sftp_BeginDownloadFile_FileNameIsNull()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-                sftp.BeginDownloadFile(null, new MemoryStream(), null, null);
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(ArgumentException))]
-        public void Test_Sftp_EndDownloadFile_Invalid_Async_Handle()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-                var filename = Path.GetTempFileName();
-                this.CreateTestFile(filename, 1);
-                sftp.UploadFile(File.OpenRead(filename), "test123");
-                var async1 = sftp.BeginListDirectory("/", null, null);
-                var async2 = sftp.BeginDownloadFile("test123", new MemoryStream(), null, null);
-                sftp.EndDownloadFile(async1);
-            }
-        }
-    }
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Renci.SshNet.Common;
+using Renci.SshNet.Tests.Common;
+using Renci.SshNet.Tests.Properties;
+using System;
+using System.IO;
+
+namespace Renci.SshNet.Tests.Classes
+{
+    /// <summary>
+    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
+    /// </summary>
+    public partial class SftpClientTest : TestBase
+    {
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(SftpPermissionDeniedException))]
+        public void Test_Sftp_Download_Forbidden()
+        {
+            if (Resources.USERNAME == "root")
+                Assert.Fail("Must not run this test as root!");
+
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                string remoteFileName = "/root/.profile";
+
+                using (var ms = new MemoryStream())
+                {
+                    sftp.DownloadFile(remoteFileName, ms);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(SftpPathNotFoundException))]
+        public void Test_Sftp_Download_File_Not_Exists()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                string remoteFileName = "/xxx/eee/yyy";
+                using (var ms = new MemoryStream())
+                {
+                    sftp.DownloadFile(remoteFileName, ms);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to BeginDownloadFile")]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Sftp_BeginDownloadFile_StreamIsNull()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                sftp.BeginDownloadFile("aaaa", null, null, null);
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to BeginDownloadFile")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void Test_Sftp_BeginDownloadFile_FileNameIsWhiteSpace()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                sftp.BeginDownloadFile("   ", new MemoryStream(), null, null);
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to BeginDownloadFile")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void Test_Sftp_BeginDownloadFile_FileNameIsNull()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                sftp.BeginDownloadFile(null, new MemoryStream(), null, null);
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void Test_Sftp_EndDownloadFile_Invalid_Async_Handle()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                var filename = Path.GetTempFileName();
+                this.CreateTestFile(filename, 1);
+                sftp.UploadFile(File.OpenRead(filename), "test123");
+                var async1 = sftp.BeginListDirectory("/", null, null);
+                var async2 = sftp.BeginDownloadFile("test123", new MemoryStream(), null, null);
+                sftp.EndDownloadFile(async1);
+            }
+        }
+    }
 }

+ 268 - 259
src/Renci.SshNet.Tests/Classes/SftpClientTest.ListDirectory.cs

@@ -1,260 +1,269 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Renci.SshNet.Common;
-using Renci.SshNet.Tests.Common;
-using Renci.SshNet.Tests.Properties;
-using System;
-using System.Diagnostics;
-using System.Linq;
-
-namespace Renci.SshNet.Tests.Classes
-{
-    /// <summary>
-    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
-    /// </summary>
-    public partial class SftpClientTest : TestBase
-    {
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(SshConnectionException))]
-        public void Test_Sftp_ListDirectory_Without_Connecting()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                var files = sftp.ListDirectory(".");
-                foreach (var file in files)
-                {
-                    Debug.WriteLine(file.FullName);
-                }
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(SftpPermissionDeniedException))]
-        public void Test_Sftp_ListDirectory_Permission_Denied()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                var files = sftp.ListDirectory("/root");
-                foreach (var file in files)
-                {
-                    Debug.WriteLine(file.FullName);
-                }
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [ExpectedException(typeof(SftpPathNotFoundException))]
-        public void Test_Sftp_ListDirectory_Not_Exists()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                var files = sftp.ListDirectory("/asdfgh");
-                foreach (var file in files)
-                {
-                    Debug.WriteLine(file.FullName);
-                }
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_ListDirectory_Current()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                var files = sftp.ListDirectory(".");
-
-                Assert.IsTrue(files.Count() > 0);
-
-                foreach (var file in files)
-                {
-                    Debug.WriteLine(file.FullName);
-                }
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_ListDirectory_Empty()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                var files = sftp.ListDirectory(string.Empty);
-
-                Assert.IsTrue(files.Count() > 0);
-
-                foreach (var file in files)
-                {
-                    Debug.WriteLine(file.FullName);
-                }
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [Description("Test passing null to ListDirectory.")]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Test_Sftp_ListDirectory_Null()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                var files = sftp.ListDirectory(null);
-
-                Assert.IsTrue(files.Count() > 0);
-
-                foreach (var file in files)
-                {
-                    Debug.WriteLine(file.FullName);
-                }
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_ListDirectory_HugeDirectory()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                //  Create 10000 directory items
-                for (int i = 0; i < 10000; i++)
-                {
-                    sftp.CreateDirectory(string.Format("test_{0}", i));
-                    Debug.WriteLine("Created " + i);
-                }
-
-                var files = sftp.ListDirectory(".");
-
-                //  Ensure that directory has at least 10000 items
-                Assert.IsTrue(files.Count() > 10000);
-
-                sftp.Disconnect();
-            }
-
-            RemoveAllFiles();
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_Change_Directory()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester");
-
-                sftp.CreateDirectory("test1");
-
-                sftp.ChangeDirectory("test1");
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1");
-
-                sftp.CreateDirectory("test1_1");
-                sftp.CreateDirectory("test1_2");
-                sftp.CreateDirectory("test1_3");
-
-                var files = sftp.ListDirectory(".");
-
-                Assert.IsTrue(files.First().FullName.StartsWith(string.Format("{0}", sftp.WorkingDirectory)));
-
-                sftp.ChangeDirectory("test1_1");
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_1");
-
-                sftp.ChangeDirectory("../test1_2");
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_2");
-
-                sftp.ChangeDirectory("..");
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1");
-
-                sftp.ChangeDirectory("..");
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester");
-
-                files = sftp.ListDirectory("test1/test1_1");
-
-                Assert.IsTrue(files.First().FullName.StartsWith(string.Format("{0}/test1/test1_1", sftp.WorkingDirectory)));
-
-                sftp.ChangeDirectory("test1/test1_1");
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_1");
-
-                sftp.ChangeDirectory("/home/tester/test1/test1_1");
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_1");
-
-                sftp.ChangeDirectory("/home/tester/test1/test1_1/../test1_2");
-
-                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_2");
-
-                sftp.ChangeDirectory("../../");
-
-                sftp.DeleteDirectory("test1/test1_1");
-                sftp.DeleteDirectory("test1/test1_2");
-                sftp.DeleteDirectory("test1/test1_3");
-                sftp.DeleteDirectory("test1");
-
-                sftp.Disconnect();
-            }
-
-            RemoveAllFiles();
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [Description("Test passing null to ChangeDirectory.")]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Test_Sftp_ChangeDirectory_Null()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                sftp.ChangeDirectory(null);
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [Description("Test calling EndListDirectory method more then once.")]
-        [ExpectedException(typeof(ArgumentException))]
-        public void Test_Sftp_Call_EndListDirectory_Twice()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-                var ar = sftp.BeginListDirectory("/", null, null);
-                var result = sftp.EndListDirectory(ar);
-                var result1 = sftp.EndListDirectory(ar);
-            }
-        }
-    }
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Renci.SshNet.Common;
+using Renci.SshNet.Tests.Common;
+using Renci.SshNet.Tests.Properties;
+using System;
+using System.Diagnostics;
+using System.Linq;
+
+namespace Renci.SshNet.Tests.Classes
+{
+    /// <summary>
+    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
+    /// </summary>
+    public partial class SftpClientTest : TestBase
+    {
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [ExpectedException(typeof(SshConnectionException))]
+        public void Test_Sftp_ListDirectory_Without_Connecting()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                var files = sftp.ListDirectory(".");
+                foreach (var file in files)
+                {
+                    Debug.WriteLine(file.FullName);
+                }
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(SftpPermissionDeniedException))]
+        public void Test_Sftp_ListDirectory_Permission_Denied()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                var files = sftp.ListDirectory("/root");
+                foreach (var file in files)
+                {
+                    Debug.WriteLine(file.FullName);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(SftpPathNotFoundException))]
+        public void Test_Sftp_ListDirectory_Not_Exists()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                var files = sftp.ListDirectory("/asdfgh");
+                foreach (var file in files)
+                {
+                    Debug.WriteLine(file.FullName);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_ListDirectory_Current()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                var files = sftp.ListDirectory(".");
+
+                Assert.IsTrue(files.Count() > 0);
+
+                foreach (var file in files)
+                {
+                    Debug.WriteLine(file.FullName);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_ListDirectory_Empty()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                var files = sftp.ListDirectory(string.Empty);
+
+                Assert.IsTrue(files.Count() > 0);
+
+                foreach (var file in files)
+                {
+                    Debug.WriteLine(file.FullName);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to ListDirectory.")]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Sftp_ListDirectory_Null()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                var files = sftp.ListDirectory(null);
+
+                Assert.IsTrue(files.Count() > 0);
+
+                foreach (var file in files)
+                {
+                    Debug.WriteLine(file.FullName);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_ListDirectory_HugeDirectory()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                //  Create 10000 directory items
+                for (int i = 0; i < 10000; i++)
+                {
+                    sftp.CreateDirectory(string.Format("test_{0}", i));
+                    Debug.WriteLine("Created " + i);
+                }
+
+                var files = sftp.ListDirectory(".");
+
+                //  Ensure that directory has at least 10000 items
+                Assert.IsTrue(files.Count() > 10000);
+
+                sftp.Disconnect();
+            }
+
+            RemoveAllFiles();
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_Change_Directory()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester");
+
+                sftp.CreateDirectory("test1");
+
+                sftp.ChangeDirectory("test1");
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1");
+
+                sftp.CreateDirectory("test1_1");
+                sftp.CreateDirectory("test1_2");
+                sftp.CreateDirectory("test1_3");
+
+                var files = sftp.ListDirectory(".");
+
+                Assert.IsTrue(files.First().FullName.StartsWith(string.Format("{0}", sftp.WorkingDirectory)));
+
+                sftp.ChangeDirectory("test1_1");
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_1");
+
+                sftp.ChangeDirectory("../test1_2");
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_2");
+
+                sftp.ChangeDirectory("..");
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1");
+
+                sftp.ChangeDirectory("..");
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester");
+
+                files = sftp.ListDirectory("test1/test1_1");
+
+                Assert.IsTrue(files.First().FullName.StartsWith(string.Format("{0}/test1/test1_1", sftp.WorkingDirectory)));
+
+                sftp.ChangeDirectory("test1/test1_1");
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_1");
+
+                sftp.ChangeDirectory("/home/tester/test1/test1_1");
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_1");
+
+                sftp.ChangeDirectory("/home/tester/test1/test1_1/../test1_2");
+
+                Assert.AreEqual(sftp.WorkingDirectory, "/home/tester/test1/test1_2");
+
+                sftp.ChangeDirectory("../../");
+
+                sftp.DeleteDirectory("test1/test1_1");
+                sftp.DeleteDirectory("test1/test1_2");
+                sftp.DeleteDirectory("test1/test1_3");
+                sftp.DeleteDirectory("test1");
+
+                sftp.Disconnect();
+            }
+
+            RemoveAllFiles();
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to ChangeDirectory.")]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Sftp_ChangeDirectory_Null()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                sftp.ChangeDirectory(null);
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test calling EndListDirectory method more then once.")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void Test_Sftp_Call_EndListDirectory_Twice()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                var ar = sftp.BeginListDirectory("/", null, null);
+                var result = sftp.EndListDirectory(ar);
+                var result1 = sftp.EndListDirectory(ar);
+            }
+        }
+    }
 }

+ 60 - 58
src/Renci.SshNet.Tests/Classes/SftpClientTest.RenameFile.cs

@@ -1,59 +1,61 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Renci.SshNet.Tests.Common;
-using Renci.SshNet.Tests.Properties;
-using System;
-using System.IO;
-
-namespace Renci.SshNet.Tests.Classes
-{
-    /// <summary>
-    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
-    /// </summary>
-    public partial class SftpClientTest : TestBase
-    {
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_Rename_File()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                string uploadedFileName = Path.GetTempFileName();
-                string remoteFileName1 = Path.GetRandomFileName();
-                string remoteFileName2 = Path.GetRandomFileName();
-
-                this.CreateTestFile(uploadedFileName, 1);
-
-                using (var file = File.OpenRead(uploadedFileName))
-                {
-                    sftp.UploadFile(file, remoteFileName1);
-                }
-
-                sftp.RenameFile(remoteFileName1, remoteFileName2);
-
-                File.Delete(uploadedFileName);
-
-                sftp.Disconnect();
-            }
-
-            RemoveAllFiles();
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        [Description("Test passing null to RenameFile.")]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Test_Sftp_RenameFile_Null()
-        {
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                sftp.RenameFile(null, null);
-
-                sftp.Disconnect();
-            }
-        }
-    }
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Renci.SshNet.Tests.Common;
+using Renci.SshNet.Tests.Properties;
+using System;
+using System.IO;
+
+namespace Renci.SshNet.Tests.Classes
+{
+    /// <summary>
+    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
+    /// </summary>
+    public partial class SftpClientTest : TestBase
+    {
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_Rename_File()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                string uploadedFileName = Path.GetTempFileName();
+                string remoteFileName1 = Path.GetRandomFileName();
+                string remoteFileName2 = Path.GetRandomFileName();
+
+                this.CreateTestFile(uploadedFileName, 1);
+
+                using (var file = File.OpenRead(uploadedFileName))
+                {
+                    sftp.UploadFile(file, remoteFileName1);
+                }
+
+                sftp.RenameFile(remoteFileName1, remoteFileName2);
+
+                File.Delete(uploadedFileName);
+
+                sftp.Disconnect();
+            }
+
+            RemoveAllFiles();
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to RenameFile.")]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Sftp_RenameFile_Null()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                sftp.RenameFile(null, null);
+
+                sftp.Disconnect();
+            }
+        }
+    }
 }

+ 86 - 84
src/Renci.SshNet.Tests/Classes/SftpClientTest.SynchronizeDirectories.cs

@@ -1,85 +1,87 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Renci.SshNet.Tests.Common;
-using Renci.SshNet.Tests.Properties;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-
-namespace Renci.SshNet.Tests.Classes
-{
-    /// <summary>
-    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
-    /// </summary>
-    public partial class SftpClientTest : TestBase
-    {
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_SynchronizeDirectories()
-        {
-            RemoveAllFiles();
-
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                string uploadedFileName = Path.GetTempFileName();
-
-                string sourceDir = Path.GetDirectoryName(uploadedFileName);
-                string destDir = "/";
-                string searchPattern = Path.GetFileName(uploadedFileName);
-                var upLoadedFiles = sftp.SynchronizeDirectories(sourceDir, destDir, searchPattern);
-
-                Assert.IsTrue(upLoadedFiles.Count() > 0);
-
-                foreach (var file in upLoadedFiles)
-                {
-                    Debug.WriteLine(file.FullName);
-                }
-
-                sftp.Disconnect();
-            }
-        }
-
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_BeginSynchronizeDirectories()
-        {
-            RemoveAllFiles();
-
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                string uploadedFileName = Path.GetTempFileName();
-
-                string sourceDir = Path.GetDirectoryName(uploadedFileName);
-                string destDir = "/";
-                string searchPattern = Path.GetFileName(uploadedFileName);
-
-                var asyncResult = sftp.BeginSynchronizeDirectories(sourceDir,
-                    destDir,
-                    searchPattern,
-                    null,
-                    null
-                );
-
-                // Wait for the WaitHandle to become signaled.
-                asyncResult.AsyncWaitHandle.WaitOne(1000);
-
-                var upLoadedFiles = sftp.EndSynchronizeDirectories(asyncResult);
-
-                Assert.IsTrue(upLoadedFiles.Count() > 0);
-
-                foreach (var file in upLoadedFiles)
-                {
-                    Debug.WriteLine(file.FullName);
-                }
-
-                // Close the wait handle.
-                asyncResult.AsyncWaitHandle.Close();
-
-                sftp.Disconnect();
-            }
-        }
-    }
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Renci.SshNet.Tests.Common;
+using Renci.SshNet.Tests.Properties;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+
+namespace Renci.SshNet.Tests.Classes
+{
+    /// <summary>
+    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
+    /// </summary>
+    public partial class SftpClientTest : TestBase
+    {
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_SynchronizeDirectories()
+        {
+            RemoveAllFiles();
+
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                string uploadedFileName = Path.GetTempFileName();
+
+                string sourceDir = Path.GetDirectoryName(uploadedFileName);
+                string destDir = "/";
+                string searchPattern = Path.GetFileName(uploadedFileName);
+                var upLoadedFiles = sftp.SynchronizeDirectories(sourceDir, destDir, searchPattern);
+
+                Assert.IsTrue(upLoadedFiles.Count() > 0);
+
+                foreach (var file in upLoadedFiles)
+                {
+                    Debug.WriteLine(file.FullName);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_BeginSynchronizeDirectories()
+        {
+            RemoveAllFiles();
+
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                string uploadedFileName = Path.GetTempFileName();
+
+                string sourceDir = Path.GetDirectoryName(uploadedFileName);
+                string destDir = "/";
+                string searchPattern = Path.GetFileName(uploadedFileName);
+
+                var asyncResult = sftp.BeginSynchronizeDirectories(sourceDir,
+                    destDir,
+                    searchPattern,
+                    null,
+                    null
+                );
+
+                // Wait for the WaitHandle to become signaled.
+                asyncResult.AsyncWaitHandle.WaitOne(1000);
+
+                var upLoadedFiles = sftp.EndSynchronizeDirectories(asyncResult);
+
+                Assert.IsTrue(upLoadedFiles.Count() > 0);
+
+                foreach (var file in upLoadedFiles)
+                {
+                    Debug.WriteLine(file.FullName);
+                }
+
+                // Close the wait handle.
+                asyncResult.AsyncWaitHandle.Close();
+
+                sftp.Disconnect();
+            }
+        }
+    }
 }

+ 381 - 373
src/Renci.SshNet.Tests/Classes/SftpClientTest.Upload.cs

@@ -1,374 +1,382 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Renci.SshNet.Common;
-using Renci.SshNet.Sftp;
-using Renci.SshNet.Tests.Common;
-using Renci.SshNet.Tests.Properties;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-
-namespace Renci.SshNet.Tests.Classes
-{
-    /// <summary>
-    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
-    /// </summary>
-    public partial class SftpClientTest : TestBase
-    {
-        [TestMethod]
-        [TestCategory("Sftp")]
-        public void Test_Sftp_Upload_And_Download_1MB_File()
-        {
-            RemoveAllFiles();
-
-            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                string uploadedFileName = Path.GetTempFileName();
-                string remoteFileName = Path.GetRandomFileName();
-
-                this.CreateTestFile(uploadedFileName, 1);
-
-                //  Calculate has value
-                var uploadedHash = CalculateMD5(uploadedFileName);
-
-                using (var file = File.OpenRead(uploadedFileName))
-                {
-                    sftp.UploadFile(file, remoteFileName);
-                }
-
-                string 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(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                string uploadedFileName = Path.GetTempFileName();
-                string remoteFileName = "/root/1";
-
-                this.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(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                var testInfoList = new Dictionary<string, TestInfo>();
-
-                for (int i = 0; i < maxFiles; i++)
-                {
-                    var testInfo = new TestInfo();
-                    testInfo.UploadedFileName = Path.GetTempFileName();
-                    testInfo.DownloadedFileName = Path.GetTempFileName();
-                    testInfo.RemoteFileName = Path.GetRandomFileName();
-
-                    this.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
-                bool 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
-                bool 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);
-
-                    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(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-
-                string remoteFileName = Path.GetRandomFileName();
-                string localFileName = Path.GetRandomFileName();
-                bool uploadDelegateCalled = false;
-                bool downloadDelegateCalled = false;
-                bool 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(Resources.HOST, Resources.USERNAME, Resources.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(Resources.HOST, Resources.USERNAME, Resources.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(Resources.HOST, Resources.USERNAME, Resources.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(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
-            {
-                sftp.Connect();
-                var async1 = sftp.BeginListDirectory("/", null, null);
-                var filename = Path.GetTempFileName();
-                this.CreateTestFile(filename, 100);
-                var async2 = sftp.BeginUploadFile(File.OpenRead(filename), "test", null, null);
-                sftp.EndUploadFile(async1);
-            }
-        }
-    }
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Renci.SshNet.Common;
+using Renci.SshNet.Sftp;
+using Renci.SshNet.Tests.Common;
+using Renci.SshNet.Tests.Properties;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+
+namespace Renci.SshNet.Tests.Classes
+{
+    /// <summary>
+    /// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
+    /// </summary>
+    public partial class SftpClientTest : TestBase
+    {
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_Upload_And_Download_1MB_File()
+        {
+            RemoveAllFiles();
+
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                string uploadedFileName = Path.GetTempFileName();
+                string remoteFileName = Path.GetRandomFileName();
+
+                this.CreateTestFile(uploadedFileName, 1);
+
+                //  Calculate has value
+                var uploadedHash = CalculateMD5(uploadedFileName);
+
+                using (var file = File.OpenRead(uploadedFileName))
+                {
+                    sftp.UploadFile(file, remoteFileName);
+                }
+
+                string 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")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(SftpPermissionDeniedException))]
+        public void Test_Sftp_Upload_Forbidden()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                string uploadedFileName = Path.GetTempFileName();
+                string remoteFileName = "/root/1";
+
+                this.CreateTestFile(uploadedFileName, 1);
+
+                using (var file = File.OpenRead(uploadedFileName))
+                {
+                    sftp.UploadFile(file, remoteFileName);
+                }
+
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        public void Test_Sftp_Multiple_Async_Upload_And_Download_10Files_5MB_Each()
+        {
+            var maxFiles = 10;
+            var maxSize = 5;
+
+            RemoveAllFiles();
+
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                var testInfoList = new Dictionary<string, TestInfo>();
+
+                for (int i = 0; i < maxFiles; i++)
+                {
+                    var testInfo = new TestInfo();
+                    testInfo.UploadedFileName = Path.GetTempFileName();
+                    testInfo.DownloadedFileName = Path.GetTempFileName();
+                    testInfo.RemoteFileName = Path.GetRandomFileName();
+
+                    this.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
+                bool 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
+                bool 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);
+
+                    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")]
+        [TestCategory("integration")]
+        [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(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+
+                string remoteFileName = Path.GetRandomFileName();
+                string localFileName = Path.GetRandomFileName();
+                bool uploadDelegateCalled = false;
+                bool downloadDelegateCalled = false;
+                bool 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")]
+        [TestCategory("integration")]
+        [Description("Test passing null to BeginUploadFile")]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Sftp_BeginUploadFile_StreamIsNull()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                sftp.BeginUploadFile(null, "aaaaa", null, null);
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to BeginUploadFile")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void Test_Sftp_BeginUploadFile_FileNameIsWhiteSpace()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                sftp.BeginUploadFile(new MemoryStream(), "   ", null, null);
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [Description("Test passing null to BeginUploadFile")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void Test_Sftp_BeginUploadFile_FileNameIsNull()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                sftp.BeginUploadFile(new MemoryStream(), null, null, null);
+                sftp.Disconnect();
+            }
+        }
+
+        [TestMethod]
+        [TestCategory("Sftp")]
+        [TestCategory("integration")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void Test_Sftp_EndUploadFile_Invalid_Async_Handle()
+        {
+            using (var sftp = new SftpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
+            {
+                sftp.Connect();
+                var async1 = sftp.BeginListDirectory("/", null, null);
+                var filename = Path.GetTempFileName();
+                this.CreateTestFile(filename, 100);
+                var async2 = sftp.BeginUploadFile(File.OpenRead(filename), "test", null, null);
+                sftp.EndUploadFile(async1);
+            }
+        }
+    }
 }