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.Net; using System.Threading; namespace Renci.SshNet.Tests.Classes { /// /// Provides functionality for local port forwarding /// [TestClass] public partial class ForwardedPortLocalTest : TestBase { [TestMethod] [WorkItem(713)] [Owner("Kenneth_aa")] [TestCategory("PortForwarding")] [Description("Test if calling Stop on ForwardedPortLocal instance causes wait.")] public void Test_PortForwarding_Local_Stop_Hangs_On_Wait() { using (var client = new SshClient(Resources.HOST, Int32.Parse(Resources.PORT), Resources.USERNAME, Resources.PASSWORD)) { client.Connect(); var port1 = new ForwardedPortLocal("localhost", 8084, "www.google.com", 80); client.AddForwardedPort(port1); port1.Exception += delegate(object sender, ExceptionEventArgs e) { Assert.Fail(e.Exception.ToString()); }; port1.Start(); bool hasTestedTunnel = false; System.Threading.ThreadPool.QueueUserWorkItem(delegate(object state) { try { var url = "http://www.google.com/"; Debug.WriteLine("Starting web request to \"" + url + "\""); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Assert.IsNotNull(response); Debug.WriteLine("Http Response status code: " + response.StatusCode.ToString()); response.Close(); hasTestedTunnel = true; } catch (Exception ex) { Assert.Fail(ex.ToString()); } }); // Wait for the web request to complete. while (!hasTestedTunnel) { System.Threading.Thread.Sleep(1000); } try { // Try stop the port forwarding, wait 3 seconds and fail if it is still started. System.Threading.ThreadPool.QueueUserWorkItem(delegate(object state) { Debug.WriteLine("Trying to stop port forward."); port1.Stop(); Debug.WriteLine("Port forwarding stopped."); }); System.Threading.Thread.Sleep(3000); if (port1.IsStarted) { Assert.Fail("Port forwarding not stopped."); } } catch (Exception ex) { Assert.Fail(ex.ToString()); } client.Disconnect(); Debug.WriteLine("Success."); } } [TestMethod] public void ConstructorShouldThrowArgumentNullExceptionWhenBoundHostIsNull() { try { new ForwardedPortLocal(null, 8080, Resources.HOST, 80); Assert.Fail(); } catch (ArgumentNullException ex) { Assert.IsNull(ex.InnerException); Assert.AreEqual("boundHost", ex.ParamName); } } [TestMethod] public void ConstructorShouldNotThrowExceptionWhenBoundHostIsEmpty() { var boundHost = string.Empty; var forwardedPort = new ForwardedPortLocal(boundHost, 8080, Resources.HOST, 80); Assert.AreSame(boundHost, forwardedPort.BoundHost); } [TestMethod] public void ConstructorShouldNotThrowExceptionWhenBoundHostIsInvalidDnsName() { const string boundHost = "in_valid_host."; var forwardedPort = new ForwardedPortLocal(boundHost, 8080, Resources.HOST, 80); Assert.AreSame(boundHost, forwardedPort.BoundHost); } [TestMethod] public void ConstructorShouldThrowArgumentNullExceptionWhenHostIsNull() { try { new ForwardedPortLocal(Resources.HOST, 8080, null, 80); Assert.Fail(); } catch (ArgumentNullException ex) { Assert.IsNull(ex.InnerException); Assert.AreEqual("host", ex.ParamName); } } [TestMethod] public void ConstructorShouldNotThrowExceptionWhenHostIsEmpty() { var host = string.Empty; var forwardedPort = new ForwardedPortLocal(Resources.HOST, 8080, string.Empty, 80); Assert.AreSame(host, forwardedPort.Host); } [TestMethod] public void ConstructorShouldNotThrowExceptionWhenHostIsInvalidDnsName() { const string host = "in_valid_host."; var forwardedPort = new ForwardedPortLocal(Resources.HOST, 8080, host, 80); Assert.AreSame(host, forwardedPort.Host); } /// ///A test for ForwardedPortRemote Constructor /// [TestMethod()] public void Test_ForwardedPortRemote() { using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) { #region Example SshClient AddForwardedPort Start Stop ForwardedPortLocal client.Connect(); var port = new ForwardedPortLocal(8082, "www.cnn.com", 80); client.AddForwardedPort(port); port.Exception += delegate(object sender, ExceptionEventArgs e) { Console.WriteLine(e.Exception.ToString()); }; port.Start(); Thread.Sleep(1000 * 60 * 20); // Wait 20 minutes for port to be forwarded port.Stop(); #endregion } Assert.Inconclusive("TODO: Implement code to verify target"); } } }