using System; using System.Diagnostics; using System.Net; using System.Net.Sockets; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Renci.SshNet.Tests.Common; namespace Renci.SshNet.Tests.Classes.Connection { [TestClass] public class DirectConnectorTest_Connect_ConnectionSucceeded : DirectConnectorTestBase { private ConnectionInfo _connectionInfo; private AsyncSocketListener _server; private Socket _clientSocket; private Stopwatch _stopWatch; private bool _disconnected; private Socket _actual; protected override void SetupData() { base.SetupData(); var random = new Random(); _connectionInfo = CreateConnectionInfo(IPAddress.Loopback.ToString()); _connectionInfo.Timeout = TimeSpan.FromMilliseconds(random.Next(50, 200)); _stopWatch = new Stopwatch(); _disconnected = false; _clientSocket = SocketFactory.Create(SocketType.Stream, ProtocolType.Tcp); _server = new AsyncSocketListener(new IPEndPoint(IPAddress.Loopback, _connectionInfo.Port)); _server.Disconnected += (socket) => _disconnected = true; _server.Connected += (socket) => socket.Send(new byte[1] { 0x44 }); _server.Start(); } protected override void SetupMocks() { _ = SocketFactoryMock.Setup(p => p.Create(SocketType.Stream, ProtocolType.Tcp)) .Returns(_clientSocket); } protected override void TearDown() { base.TearDown(); _server?.Dispose(); _clientSocket?.Dispose(); } protected override void Act() { _stopWatch.Start(); try { _actual = Connector.Connect(_connectionInfo); } finally { _stopWatch.Stop(); } } [TestMethod] public void ConnectShouldHaveReturnedSocketCreatedUsingSocketFactory() { Assert.IsNotNull(_actual); Assert.AreSame(_clientSocket, _actual); } [TestMethod] public void ConnectShouldHaveRespectedTimeout() { var errorText = string.Format("Elapsed: {0}, Timeout: {1}", _stopWatch.ElapsedMilliseconds, _connectionInfo.Timeout.TotalMilliseconds); // Compare elapsed time with configured timeout, allowing for a margin of error Assert.IsTrue(_stopWatch.ElapsedMilliseconds < _connectionInfo.Timeout.TotalMilliseconds + 100, errorText); } [TestMethod] public void ClientSocketShouldBeConnected() { Assert.IsTrue(_clientSocket.Connected); Assert.IsFalse(_disconnected); } [TestMethod] public void NoBytesShouldHaveBeenReadFromSocket() { var buffer = new byte[1]; var bytesRead = _clientSocket.Receive(buffer); Assert.AreEqual(1, bytesRead); Assert.AreEqual(0x44, buffer[0]); } [TestMethod] public void CreateOnSocketFactoryShouldHaveBeenInvokedOnce() { SocketFactoryMock.Verify(p => p.Create(SocketType.Stream, ProtocolType.Tcp), Times.Once()); } } }