ProtocolVersionExchangeTest_ServerResponseValid_Comments.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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.Connection;
  10. using Renci.SshNet.Tests.Common;
  11. namespace Renci.SshNet.Tests.Classes.Connection
  12. {
  13. [TestClass]
  14. public class ProtocolVersionExchangeTest_ServerResponseValid_Comments
  15. {
  16. private AsyncSocketListener _server;
  17. private ProtocolVersionExchange _protocolVersionExchange;
  18. private string _clientVersion;
  19. private TimeSpan _timeout;
  20. private IPEndPoint _serverEndPoint;
  21. private List<byte> _dataReceivedByServer;
  22. private byte[] _serverIdentification;
  23. private bool _clientDisconnected;
  24. private Socket _client;
  25. private SshIdentification _actual;
  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.Shutdown(SocketShutdown.Both);
  43. _client.Close();
  44. _client = null;
  45. }
  46. }
  47. protected void Arrange()
  48. {
  49. _clientVersion = "SSH-2.0-Renci.SshNet.SshClient.0.0.1";
  50. _timeout = TimeSpan.FromSeconds(5);
  51. _serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
  52. _dataReceivedByServer = new List<byte>();
  53. _serverIdentification = Encoding.UTF8.GetBytes("\r\nWelcome stranger!\r\n\r\nSSH-ABC2.0-OurSSHAppliance-1.4.7 Use at own risk.\uD55C\r\n!");
  54. _server = new AsyncSocketListener(_serverEndPoint);
  55. _server.Start();
  56. _server.BytesReceived += (bytes, socket) =>
  57. {
  58. _dataReceivedByServer.AddRange(bytes);
  59. socket.Send(_serverIdentification);
  60. socket.Shutdown(SocketShutdown.Send);
  61. };
  62. _server.Disconnected += (socket) => _clientDisconnected = true;
  63. _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  64. _client.Connect(_serverEndPoint);
  65. _protocolVersionExchange = new ProtocolVersionExchange();
  66. }
  67. protected void Act()
  68. {
  69. _actual = _protocolVersionExchange.Start(_clientVersion, _client, _timeout);
  70. // Give some time to process all messages
  71. Thread.Sleep(200);
  72. }
  73. [TestMethod]
  74. public void StartShouldReturnIdentificationOfServer()
  75. {
  76. Assert.IsNotNull(_actual);
  77. Assert.AreEqual("ABC2.0", _actual.ProtocolVersion);
  78. Assert.AreEqual("OurSSHAppliance-1.4.7", _actual.SoftwareVersion);
  79. Assert.AreEqual("Use at own risk.\uD55C", _actual.Comments);
  80. }
  81. [TestMethod]
  82. public void ClientIdentificationWasSentToServer()
  83. {
  84. var expected = Encoding.UTF8.GetBytes(_clientVersion);
  85. Assert.AreEqual(expected.Length + 2, _dataReceivedByServer.Count);
  86. Assert.IsTrue(expected.SequenceEqual(_dataReceivedByServer.Take(expected.Length)));
  87. Assert.AreEqual(Session.CarriageReturn, _dataReceivedByServer[_dataReceivedByServer.Count - 2]);
  88. Assert.AreEqual(Session.LineFeed, _dataReceivedByServer[_dataReceivedByServer.Count - 1]);
  89. }
  90. [TestMethod]
  91. public void ClientRemainsConnected()
  92. {
  93. Assert.IsTrue(_client.Connected);
  94. Assert.IsFalse(_clientDisconnected);
  95. }
  96. [TestMethod]
  97. public void ClientDidNotReadPastIdentification()
  98. {
  99. var buffer = new byte[1];
  100. var bytesReceived = _client.Receive(buffer);
  101. Assert.AreEqual(1, bytesReceived);
  102. Assert.AreEqual(0x21, buffer[0]);
  103. }
  104. }
  105. }