|
|
@@ -0,0 +1,123 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Net;
|
|
|
+using System.Net.Sockets;
|
|
|
+using System.Text;
|
|
|
+using System.Threading;
|
|
|
+
|
|
|
+using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
|
+
|
|
|
+using Renci.SshNet.Common;
|
|
|
+using Renci.SshNet.Connection;
|
|
|
+using Renci.SshNet.Tests.Common;
|
|
|
+
|
|
|
+namespace Renci.SshNet.Tests.Classes.Connection
|
|
|
+{
|
|
|
+ [TestClass]
|
|
|
+ public class ProtocolVersionExchangeTest_ServerResponseValid_EmptySoftwareVersion
|
|
|
+ {
|
|
|
+ private AsyncSocketListener _server;
|
|
|
+ private ProtocolVersionExchange _protocolVersionExchange;
|
|
|
+ private string _clientVersion;
|
|
|
+ private TimeSpan _timeout;
|
|
|
+ private IPEndPoint _serverEndPoint;
|
|
|
+ private List<byte> _dataReceivedByServer;
|
|
|
+ private byte[] _serverIdentification;
|
|
|
+ private bool _clientDisconnected;
|
|
|
+ private Socket _client;
|
|
|
+ private SshIdentification _actual;
|
|
|
+
|
|
|
+ [TestInitialize]
|
|
|
+ public void Setup()
|
|
|
+ {
|
|
|
+ Arrange();
|
|
|
+ Act();
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestCleanup]
|
|
|
+ public void Cleanup()
|
|
|
+ {
|
|
|
+ if (_server != null)
|
|
|
+ {
|
|
|
+ _server.Dispose();
|
|
|
+ _server = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_client != null)
|
|
|
+ {
|
|
|
+ _client.Shutdown(SocketShutdown.Both);
|
|
|
+ _client.Close();
|
|
|
+ _client = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ protected void Arrange()
|
|
|
+ {
|
|
|
+ _clientVersion = "SSH-2.0-Renci.SshNet.SshClient.0.0.1";
|
|
|
+ _timeout = TimeSpan.FromSeconds(5);
|
|
|
+ _serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
|
|
|
+ _dataReceivedByServer = new List<byte>();
|
|
|
+ _serverIdentification = Encoding.UTF8.GetBytes("SSH-78.5-\r\n");
|
|
|
+
|
|
|
+ _server = new AsyncSocketListener(_serverEndPoint);
|
|
|
+ _server.Start();
|
|
|
+ _server.BytesReceived += (bytes, socket) =>
|
|
|
+ {
|
|
|
+ _dataReceivedByServer.AddRange(bytes);
|
|
|
+
|
|
|
+ _ = socket.Send(_serverIdentification);
|
|
|
+
|
|
|
+ socket.Shutdown(SocketShutdown.Send);
|
|
|
+ };
|
|
|
+ _server.Disconnected += (socket) => _clientDisconnected = true;
|
|
|
+
|
|
|
+ _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
|
|
+ _client.Connect(_serverEndPoint);
|
|
|
+
|
|
|
+ _protocolVersionExchange = new ProtocolVersionExchange();
|
|
|
+ }
|
|
|
+
|
|
|
+ protected void Act()
|
|
|
+ {
|
|
|
+ _actual = _protocolVersionExchange.Start(_clientVersion, _client, _timeout);
|
|
|
+
|
|
|
+ // Give some time to process all messages
|
|
|
+ Thread.Sleep(200);
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void StartShouldReturnIdentificationOfServer()
|
|
|
+ {
|
|
|
+ Assert.IsNotNull(_actual);
|
|
|
+ Assert.AreEqual("78.5", _actual.ProtocolVersion);
|
|
|
+ Assert.AreEqual(string.Empty, _actual.SoftwareVersion);
|
|
|
+ Assert.IsNull(_actual.Comments);
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void ClientIdentificationWasSentToServer()
|
|
|
+ {
|
|
|
+ var expected = Encoding.UTF8.GetBytes(_clientVersion);
|
|
|
+
|
|
|
+ Assert.AreEqual(expected.Length + 2, _dataReceivedByServer.Count);
|
|
|
+
|
|
|
+ Assert.IsTrue(expected.SequenceEqual(_dataReceivedByServer.Take(expected.Length)));
|
|
|
+ Assert.AreEqual(Session.CarriageReturn, _dataReceivedByServer[_dataReceivedByServer.Count - 2]);
|
|
|
+ Assert.AreEqual(Session.LineFeed, _dataReceivedByServer[_dataReceivedByServer.Count - 1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void ConnectionIsClosedByServer()
|
|
|
+ {
|
|
|
+ Assert.IsTrue(_client.Connected);
|
|
|
+ Assert.IsFalse(_clientDisconnected);
|
|
|
+
|
|
|
+ var bytesReceived = _client.Receive(new byte[1]);
|
|
|
+ Assert.AreEqual(0, bytesReceived);
|
|
|
+
|
|
|
+ Assert.IsTrue(_client.Connected);
|
|
|
+ Assert.IsFalse(_clientDisconnected);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|