using System.Diagnostics; using System.Net.Sockets; using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; using Renci.SshNet.Common; using Renci.SshNet.Messages.Transport; using Renci.SshNet.Tests.Common; namespace Renci.SshNet.Tests.Classes { [TestClass] public class SessionTest_Connected_ServerSendsBadPacket : SessionTest_ConnectedBase { private byte[] _packet; protected override void SetupData() { base.SetupData(); _packet = new byte[] { 0x0a, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05 }; } protected override void Act() { _ = ServerSocket.Send(_packet, 0, _packet.Length, SocketFlags.None); // give session some time to process packet Thread.Sleep(200); } [TestMethod] public void IsConnectedShouldReturnFalse() { Assert.IsFalse(Session.IsConnected); } [TestMethod] public void DisconnectShouldFinishImmediately() { var stopwatch = new Stopwatch(); stopwatch.Start(); Session.Disconnect(); stopwatch.Stop(); Assert.IsTrue(stopwatch.ElapsedMilliseconds < 500); } [TestMethod] public void DisconnectedIsNeverRaised() { Assert.AreEqual(0, DisconnectedRegister.Count); } [TestMethod] public void DisconnectReceivedIsNeverRaised() { Assert.AreEqual(0, DisconnectReceivedRegister.Count); } [TestMethod] public void ErrorOccurredIsRaisedOnce() { Assert.AreEqual(1, ErrorOccurredRegister.Count, ErrorOccurredRegister.AsString()); var errorOccurred = ErrorOccurredRegister[0]; Assert.IsNotNull(errorOccurred); var exception = errorOccurred.Exception; Assert.IsNotNull(exception); Assert.AreEqual(typeof(SshConnectionException), exception.GetType()); var connectionException = (SshConnectionException)exception; Assert.AreEqual(DisconnectReason.ProtocolError, connectionException.DisconnectReason); Assert.IsNull(connectionException.InnerException); Assert.AreEqual("Bad packet length: 168101125.", connectionException.Message); } [TestMethod] public void DisposeShouldFinishImmediately() { var stopwatch = new Stopwatch(); stopwatch.Start(); Session.Dispose(); stopwatch.Stop(); Assert.IsTrue(stopwatch.ElapsedMilliseconds < 500); } [TestMethod] public void ReceiveOnServerSocketShouldReturnZero() { var buffer = new byte[1]; var actual = ServerSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None); Assert.AreEqual(0, actual); } [TestMethod] public void SendMessageShouldThrowSshConnectionException() { try { Session.SendMessage(new IgnoreMessage()); Assert.Fail(); } catch (SshConnectionException ex) { Assert.AreEqual(DisconnectReason.None, ex.DisconnectReason); Assert.IsNull(ex.InnerException); Assert.AreEqual("Client not connected.", ex.Message); } } [TestMethod] public void ISession_MessageListenerCompletedShouldBeSignaled() { var session = (ISession)Session; Assert.IsNotNull(session.MessageListenerCompleted); Assert.IsTrue(session.MessageListenerCompleted.WaitOne()); } [TestMethod] public void ISession_SendMessageShouldThrowSshConnectionException() { var session = (ISession)Session; try { session.SendMessage(new IgnoreMessage()); Assert.Fail(); } catch (SshConnectionException ex) { Assert.AreEqual(DisconnectReason.None, ex.DisconnectReason); Assert.IsNull(ex.InnerException); Assert.AreEqual("Client not connected.", ex.Message); } } [TestMethod] public void ISession_TrySendMessageShouldReturnFalse() { var session = (ISession)Session; var actual = session.TrySendMessage(new IgnoreMessage()); Assert.IsFalse(actual); } [TestMethod] public void ISession_WaitOnHandle_WaitHandle_ShouldThrowSshConnectionExceptionDetailingBadPacket() { var session = (ISession)Session; var waitHandle = new ManualResetEvent(false); try { session.WaitOnHandle(waitHandle); Assert.Fail(); } catch (SshConnectionException ex) { Assert.AreEqual(DisconnectReason.ProtocolError, ex.DisconnectReason); Assert.IsNull(ex.InnerException); Assert.AreEqual("Bad packet length: 168101125.", ex.Message); } } [TestMethod] public void ISession_WaitOnHandleAndTimeout_WaitHandle_ShouldThrowSshConnectionExceptionDetailingBadPacket() { var session = (ISession)Session; var waitHandle = new ManualResetEvent(false); try { session.WaitOnHandle(waitHandle, Timeout.InfiniteTimeSpan); Assert.Fail(); } catch (SshConnectionException ex) { Assert.AreEqual(DisconnectReason.ProtocolError, ex.DisconnectReason); Assert.IsNull(ex.InnerException); Assert.AreEqual("Bad packet length: 168101125.", ex.Message); } } [TestMethod] public void ISession_TryWait_WaitHandleAndTimeout_ShouldReturnDisconnected() { var session = (ISession)Session; var waitHandle = new ManualResetEvent(false); var result = session.TryWait(waitHandle, Timeout.InfiniteTimeSpan); Assert.AreEqual(WaitResult.Disconnected, result); } [TestMethod] public void ISession_TryWait_WaitHandleAndTimeoutAndException_ShouldReturnDisconnected() { var session = (ISession)Session; var waitHandle = new ManualResetEvent(false); var result = session.TryWait(waitHandle, Timeout.InfiniteTimeSpan, out var exception); Assert.AreEqual(WaitResult.Disconnected, result); Assert.IsNull(exception); } } }