SessionTest_SocketConnected_BadPacketAndDispose.cs 4.4 KB

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