2
0

ProtocolVersionExchangeTest_TimeoutReadingIdentificationString.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;
  8. using Microsoft.VisualStudio.TestTools.UnitTesting;
  9. using Renci.SshNet.Common;
  10. using Renci.SshNet.Connection;
  11. using Renci.SshNet.Tests.Common;
  12. namespace Renci.SshNet.Tests.Classes.Connection
  13. {
  14. [TestClass]
  15. public class ProtocolVersionExchangeTest_TimeoutReadingIdentificationString
  16. {
  17. private AsyncSocketListener _server;
  18. private ProtocolVersionExchange _protocolVersionExchange;
  19. private string _clientVersion;
  20. private TimeSpan _timeout;
  21. private IPEndPoint _serverEndPoint;
  22. private List<byte> _dataReceivedByServer;
  23. private bool _clientDisconnected;
  24. private Socket _client;
  25. private SshOperationTimeoutException _actualException;
  26. [TestInitialize]
  27. public void Setup()
  28. {
  29. Arrange();
  30. Act();
  31. }
  32. [TestCleanup]
  33. public void Cleanup()
  34. {
  35. if (_server != null)
  36. {
  37. _server.Dispose();
  38. _server = null;
  39. }
  40. if (_client != null)
  41. {
  42. _client.Close();
  43. _client = null;
  44. }
  45. }
  46. protected void Arrange()
  47. {
  48. _clientVersion = "SSH-2.0-Renci.SshNet.SshClient.0.0.1";
  49. _timeout = TimeSpan.FromMilliseconds(200);
  50. _serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
  51. _dataReceivedByServer = new List<byte>();
  52. _clientDisconnected = false;
  53. _server = new AsyncSocketListener(_serverEndPoint);
  54. _server.Start();
  55. _server.BytesReceived += (bytes, socket) =>
  56. {
  57. _dataReceivedByServer.AddRange(bytes);
  58. _ = socket.Send(Encoding.UTF8.GetBytes("Welcome!\r\n"));
  59. };
  60. _server.Disconnected += (socket) => _clientDisconnected = true;
  61. _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  62. _client.Connect(_serverEndPoint);
  63. _protocolVersionExchange = new ProtocolVersionExchange();
  64. }
  65. protected void Act()
  66. {
  67. try
  68. {
  69. _ = _protocolVersionExchange.Start(_clientVersion, _client, _timeout);
  70. Assert.Fail();
  71. }
  72. catch (SshOperationTimeoutException ex)
  73. {
  74. _actualException = ex;
  75. }
  76. // Give some time to process all messages
  77. Thread.Sleep(200);
  78. }
  79. [TestMethod]
  80. public void StartShouldHaveThrownSshOperationTimeoutException()
  81. {
  82. Assert.IsNotNull(_actualException);
  83. Assert.IsNull(_actualException.InnerException);
  84. Assert.AreEqual(string.Format("Socket read operation has timed out after {0} milliseconds.", _timeout.TotalMilliseconds), _actualException.Message);
  85. }
  86. [TestMethod]
  87. public void ClientIdentificationWasSentToServer()
  88. {
  89. var expected = Encoding.UTF8.GetBytes(_clientVersion);
  90. Assert.AreEqual(expected.Length + 2, _dataReceivedByServer.Count);
  91. Assert.IsTrue(expected.SequenceEqual(_dataReceivedByServer.Take(expected.Length)));
  92. Assert.AreEqual(Session.CarriageReturn, _dataReceivedByServer[_dataReceivedByServer.Count - 2]);
  93. Assert.AreEqual(Session.LineFeed, _dataReceivedByServer[_dataReceivedByServer.Count - 1]);
  94. }
  95. [TestMethod]
  96. public void ClientSocketShouldBeConnected()
  97. {
  98. Assert.IsTrue(_client.Connected);
  99. Assert.IsFalse(_clientDisconnected);
  100. }
  101. }
  102. }