Socks4ConnectorTest_Connect_ConnectionSucceeded.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using Microsoft.VisualStudio.TestTools.UnitTesting;
  8. using Moq;
  9. using Renci.SshNet.Common;
  10. using Renci.SshNet.Tests.Common;
  11. namespace Renci.SshNet.Tests.Classes.Connection
  12. {
  13. [TestClass]
  14. public class Socks4ConnectorTest_Connect_ConnectionSucceeded : Socks4ConnectorTestBase
  15. {
  16. private ConnectionInfo _connectionInfo;
  17. private Socket _clientSocket;
  18. private AsyncSocketListener _proxyServer;
  19. private List<byte> _bytesReceivedByProxy;
  20. private bool _disconnected;
  21. private Socket _actual;
  22. protected override void SetupData()
  23. {
  24. base.SetupData();
  25. var random = new Random();
  26. _connectionInfo = CreateConnectionInfo("proxyUser", "proxyPwd");
  27. _connectionInfo.Timeout = TimeSpan.FromMilliseconds(random.Next(50, 200));
  28. _bytesReceivedByProxy = new List<byte>();
  29. _clientSocket = SocketFactory.Create(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  30. _actual = null;
  31. _proxyServer = new AsyncSocketListener(new IPEndPoint(IPAddress.Loopback, _connectionInfo.ProxyPort));
  32. _proxyServer.Disconnected += socket => _disconnected = true;
  33. _proxyServer.BytesReceived += (bytesReceived, socket) =>
  34. {
  35. _bytesReceivedByProxy.AddRange(bytesReceived);
  36. if (_bytesReceivedByProxy.Count == bytesReceived.Length)
  37. {
  38. // Send SOCKS response
  39. _ = socket.Send(new byte[]
  40. {
  41. // Reply version (null byte)
  42. 0x00,
  43. // Request granted
  44. 0x5a,
  45. // Destination address port
  46. 0x01,
  47. 0xf0,
  48. // Destination address IP
  49. 0x01,
  50. 0x02,
  51. 0x03,
  52. 0x04
  53. });
  54. // Send extra byte to allow us to verify that connector did not consume too much
  55. _ = socket.Send(new byte[]
  56. {
  57. 0xfe
  58. });
  59. }
  60. };
  61. _proxyServer.Start();
  62. }
  63. protected override void SetupMocks()
  64. {
  65. _ = SocketFactoryMock.Setup(p => p.Create(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
  66. .Returns(_clientSocket);
  67. }
  68. protected override void TearDown()
  69. {
  70. base.TearDown();
  71. _proxyServer?.Dispose();
  72. _clientSocket?.Dispose();
  73. }
  74. protected override void Act()
  75. {
  76. _actual = Connector.Connect(_connectionInfo);
  77. // Give some time to process all messages
  78. Thread.Sleep(200);
  79. }
  80. [TestMethod]
  81. public void ProxyShouldHaveReceivedExpectedSocksRequest()
  82. {
  83. var expectedSocksRequest = new byte[]
  84. {
  85. // SOCKS version
  86. 0x04,
  87. // CONNECT request
  88. 0x01,
  89. // Destination port
  90. 0x04,
  91. 0x06,
  92. // Destination address (IPv4)
  93. 0x7f,
  94. 0x00,
  95. 0x00,
  96. 0x01,
  97. // Proxy user
  98. 0x70,
  99. 0x72,
  100. 0x6f,
  101. 0x78,
  102. 0x79,
  103. 0x55,
  104. 0x73,
  105. 0x65,
  106. 0x72,
  107. // Null terminator
  108. 0x00
  109. };
  110. var errorText = string.Format("Expected:{0}{1}{0}but was:{0}{2}",
  111. Environment.NewLine,
  112. PacketDump.Create(expectedSocksRequest, 2),
  113. PacketDump.Create(_bytesReceivedByProxy, 2));
  114. Assert.IsTrue(expectedSocksRequest.SequenceEqual(_bytesReceivedByProxy), errorText);
  115. }
  116. [TestMethod]
  117. public void ConnectShouldReturnSocketCreatedUsingSocketFactory()
  118. {
  119. Assert.IsNotNull(_actual);
  120. Assert.AreSame(_clientSocket, _actual);
  121. }
  122. [TestMethod]
  123. public void OnlySocksResponseShouldHaveBeenConsumed()
  124. {
  125. var buffer = new byte[2];
  126. Assert.AreEqual(1, _actual.Receive(buffer));
  127. Assert.AreEqual(0xfe, buffer[0]);
  128. }
  129. [TestMethod]
  130. public void ClientSocketShouldBeConnected()
  131. {
  132. Assert.IsFalse(_disconnected);
  133. Assert.IsTrue(_actual.Connected);
  134. }
  135. [TestMethod]
  136. public void CreateOnSocketFactoryShouldHaveBeenInvokedOnce()
  137. {
  138. SocketFactoryMock.Verify(p => p.Create(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp),
  139. Times.Once());
  140. }
  141. }
  142. }