SessionTest_SocketConnected_BadPacketAndDispose.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using Microsoft.Extensions.Logging.Abstractions;
  5. using Microsoft.VisualStudio.TestTools.UnitTesting;
  6. using Moq;
  7. using Renci.SshNet.Common;
  8. using Renci.SshNet.Connection;
  9. using Renci.SshNet.Messages.Transport;
  10. using Renci.SshNet.Tests.Common;
  11. namespace Renci.SshNet.Tests.Classes
  12. {
  13. [TestClass]
  14. public class SessionTest_SocketConnected_BadPacketAndDispose
  15. {
  16. private Mock<IServiceFactory> _serviceFactoryMock;
  17. private Mock<ISocketFactory> _socketFactoryMock;
  18. private Mock<IConnector> _connectorMock;
  19. private Mock<IProtocolVersionExchange> _protocolVersionExchangeMock;
  20. private ConnectionInfo _connectionInfo;
  21. private Session _session;
  22. private AsyncSocketListener _serverListener;
  23. private IPEndPoint _serverEndPoint;
  24. private Socket _serverSocket;
  25. private Socket _clientSocket;
  26. private SshConnectionException _actualException;
  27. private SocketFactory _socketFactory;
  28. [TestInitialize]
  29. public void Setup()
  30. {
  31. Arrange();
  32. Act();
  33. }
  34. [TestCleanup]
  35. public void TearDown()
  36. {
  37. _serverListener?.Dispose();
  38. }
  39. protected void CreateMocks()
  40. {
  41. _serviceFactoryMock = new Mock<IServiceFactory>(MockBehavior.Strict);
  42. _socketFactoryMock = new Mock<ISocketFactory>(MockBehavior.Strict);
  43. _connectorMock = new Mock<IConnector>(MockBehavior.Strict);
  44. _protocolVersionExchangeMock = new Mock<IProtocolVersionExchange>(MockBehavior.Strict);
  45. }
  46. protected void SetupData()
  47. {
  48. _serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
  49. _connectionInfo = new ConnectionInfo(_serverEndPoint.Address.ToString(), _serverEndPoint.Port, "user", new PasswordAuthenticationMethod("user", "password"))
  50. {
  51. Timeout = TimeSpan.FromMilliseconds(200)
  52. };
  53. _actualException = null;
  54. _socketFactory = new SocketFactory();
  55. _serverListener = new AsyncSocketListener(_serverEndPoint);
  56. _serverListener.Connected += (socket) =>
  57. {
  58. _serverSocket = socket;
  59. // Since we're mocking the protocol version exchange, we can immediately send the bad
  60. // packet upon establishing the connection
  61. var badPacket = new byte[] { 0x0a, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05 };
  62. _ = _serverSocket.Send(badPacket, 0, badPacket.Length, SocketFlags.None);
  63. _serverSocket.Shutdown(SocketShutdown.Send);
  64. };
  65. _serverListener.Start();
  66. _session = new Session(_connectionInfo, _serviceFactoryMock.Object, _socketFactoryMock.Object);
  67. _clientSocket = new DirectConnector(_socketFactory, NullLoggerFactory.Instance).Connect(_connectionInfo);
  68. }
  69. protected void SetupMocks()
  70. {
  71. _ = _serviceFactoryMock.Setup(p => p.CreateConnector(_connectionInfo, _socketFactoryMock.Object))
  72. .Returns(_connectorMock.Object);
  73. _ = _connectorMock.Setup(p => p.Connect(_connectionInfo))
  74. .Returns(_clientSocket);
  75. _ = _serviceFactoryMock.Setup(p => p.CreateProtocolVersionExchange())
  76. .Returns(_protocolVersionExchangeMock.Object);
  77. _ = _protocolVersionExchangeMock.Setup(p => p.Start(_session.ClientVersion, _clientSocket, _connectionInfo.Timeout))
  78. .Returns(new SshIdentification("2.0", "XXX"));
  79. }
  80. protected void Arrange()
  81. {
  82. CreateMocks();
  83. SetupData();
  84. SetupMocks();
  85. }
  86. protected virtual void Act()
  87. {
  88. try
  89. {
  90. _session.Connect();
  91. Assert.Fail();
  92. }
  93. catch (SshConnectionException ex)
  94. {
  95. _actualException = ex;
  96. }
  97. }
  98. [TestMethod]
  99. public void ConnectShouldThrowSshConnectionException()
  100. {
  101. Assert.IsNotNull(_actualException);
  102. Assert.IsNull(_actualException.InnerException);
  103. Assert.AreEqual(DisconnectReason.ProtocolError, _actualException.DisconnectReason);
  104. Assert.AreEqual("Bad packet length: 168101125.", _actualException.Message);
  105. }
  106. }
  107. }