ForwardedPortLocalTest.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. using System.Diagnostics;
  2. using Renci.SshNet.Common;
  3. namespace Renci.SshNet.IntegrationTests.OldIntegrationTests
  4. {
  5. /// <summary>
  6. /// Provides functionality for local port forwarding
  7. /// </summary>
  8. [TestClass]
  9. public class ForwardedPortLocalTest : IntegrationTestBase
  10. {
  11. [TestMethod]
  12. [WorkItem(713)]
  13. [Owner("Kenneth_aa")]
  14. [TestCategory("PortForwarding")]
  15. [Description("Test if calling Stop on ForwardedPortLocal instance causes wait.")]
  16. public void Test_PortForwarding_Local_Stop_Hangs_On_Wait()
  17. {
  18. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  19. {
  20. client.Connect();
  21. var port1 = new ForwardedPortLocal("localhost", 8084, "www.google.com", 80);
  22. client.AddForwardedPort(port1);
  23. port1.Exception += delegate (object sender, ExceptionEventArgs e)
  24. {
  25. Assert.Fail(e.Exception.ToString());
  26. };
  27. port1.Start();
  28. var hasTestedTunnel = false;
  29. _ = ThreadPool.QueueUserWorkItem(delegate (object state)
  30. {
  31. try
  32. {
  33. var url = "http://www.google.com/";
  34. Debug.WriteLine("Starting web request to \"" + url + "\"");
  35. #if NET6_0_OR_GREATER
  36. var httpClient = new HttpClient();
  37. var response = httpClient.GetAsync(url)
  38. .ConfigureAwait(false)
  39. .GetAwaiter()
  40. .GetResult();
  41. #else
  42. var request = (HttpWebRequest) WebRequest.Create(url);
  43. var response = (HttpWebResponse) request.GetResponse();
  44. #endif // NET6_0_OR_GREATER
  45. Assert.IsNotNull(response);
  46. Debug.WriteLine("Http Response status code: " + response.StatusCode.ToString());
  47. response.Dispose();
  48. hasTestedTunnel = true;
  49. }
  50. catch (Exception ex)
  51. {
  52. Assert.Fail(ex.ToString());
  53. }
  54. });
  55. // Wait for the web request to complete.
  56. while (!hasTestedTunnel)
  57. {
  58. Thread.Sleep(1000);
  59. }
  60. try
  61. {
  62. // Try stop the port forwarding, wait 3 seconds and fail if it is still started.
  63. _ = ThreadPool.QueueUserWorkItem(delegate (object state)
  64. {
  65. Debug.WriteLine("Trying to stop port forward.");
  66. port1.Stop();
  67. Debug.WriteLine("Port forwarding stopped.");
  68. });
  69. Thread.Sleep(3000);
  70. if (port1.IsStarted)
  71. {
  72. Assert.Fail("Port forwarding not stopped.");
  73. }
  74. }
  75. catch (Exception ex)
  76. {
  77. Assert.Fail(ex.ToString());
  78. }
  79. client.RemoveForwardedPort(port1);
  80. client.Disconnect();
  81. Debug.WriteLine("Success.");
  82. }
  83. }
  84. [TestMethod]
  85. [ExpectedException(typeof(SshConnectionException))]
  86. public void Test_PortForwarding_Local_Without_Connecting()
  87. {
  88. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  89. {
  90. var port1 = new ForwardedPortLocal("localhost", 8084, "www.renci.org", 80);
  91. client.AddForwardedPort(port1);
  92. port1.Exception += delegate (object sender, ExceptionEventArgs e)
  93. {
  94. Assert.Fail(e.Exception.ToString());
  95. };
  96. port1.Start();
  97. var test = Parallel.For(0,
  98. 100,
  99. counter =>
  100. {
  101. var start = DateTime.Now;
  102. #if NET6_0_OR_GREATER
  103. var httpClient = new HttpClient();
  104. using (var response = httpClient.GetAsync("http://localhost:8084").GetAwaiter().GetResult())
  105. {
  106. var data = ReadStream(response.Content.ReadAsStream());
  107. #else
  108. var request = (HttpWebRequest) WebRequest.Create("http://localhost:8084");
  109. using (var response = (HttpWebResponse) request.GetResponse())
  110. {
  111. var data = ReadStream(response.GetResponseStream());
  112. #endif // NET6_0_OR_GREATER
  113. var end = DateTime.Now;
  114. Debug.WriteLine(string.Format("Request# {2}: Lenght: {0} Time: {1}", data.Length, end - start, counter));
  115. }
  116. });
  117. }
  118. }
  119. private static byte[] ReadStream(Stream stream)
  120. {
  121. var buffer = new byte[1024];
  122. using (var ms = new MemoryStream())
  123. {
  124. while (true)
  125. {
  126. var read = stream.Read(buffer, 0, buffer.Length);
  127. if (read > 0)
  128. {
  129. ms.Write(buffer, 0, read);
  130. }
  131. else
  132. {
  133. return ms.ToArray();
  134. }
  135. }
  136. }
  137. }
  138. }
  139. }