DirectConnectorTest_Connect_ConnectionSucceeded.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Diagnostics;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using Microsoft.VisualStudio.TestTools.UnitTesting;
  6. using Moq;
  7. using Renci.SshNet.Tests.Common;
  8. namespace Renci.SshNet.Tests.Classes.Connection
  9. {
  10. [TestClass]
  11. public class DirectConnectorTest_Connect_ConnectionSucceeded : DirectConnectorTestBase
  12. {
  13. private ConnectionInfo _connectionInfo;
  14. private AsyncSocketListener _server;
  15. private Socket _clientSocket;
  16. private Stopwatch _stopWatch;
  17. private bool _disconnected;
  18. private Socket _actual;
  19. protected override void SetupData()
  20. {
  21. base.SetupData();
  22. var random = new Random();
  23. _connectionInfo = CreateConnectionInfo(IPAddress.Loopback.ToString());
  24. _connectionInfo.Timeout = TimeSpan.FromMilliseconds(random.Next(50, 200));
  25. _stopWatch = new Stopwatch();
  26. _disconnected = false;
  27. _clientSocket = SocketFactory.Create(SocketType.Stream, ProtocolType.Tcp);
  28. _server = new AsyncSocketListener(new IPEndPoint(IPAddress.Loopback, _connectionInfo.Port));
  29. _server.Disconnected += (socket) => _disconnected = true;
  30. _server.Connected += (socket) => socket.Send(new byte[1] { 0x44 });
  31. _server.Start();
  32. }
  33. protected override void SetupMocks()
  34. {
  35. _ = SocketFactoryMock.Setup(p => p.Create(SocketType.Stream, ProtocolType.Tcp))
  36. .Returns(_clientSocket);
  37. }
  38. protected override void TearDown()
  39. {
  40. base.TearDown();
  41. _server?.Dispose();
  42. _clientSocket?.Dispose();
  43. }
  44. protected override void Act()
  45. {
  46. _stopWatch.Start();
  47. try
  48. {
  49. _actual = Connector.Connect(_connectionInfo);
  50. }
  51. finally
  52. {
  53. _stopWatch.Stop();
  54. }
  55. }
  56. [TestMethod]
  57. public void ConnectShouldHaveReturnedSocketCreatedUsingSocketFactory()
  58. {
  59. Assert.IsNotNull(_actual);
  60. Assert.AreSame(_clientSocket, _actual);
  61. }
  62. [TestMethod]
  63. public void ConnectShouldHaveRespectedTimeout()
  64. {
  65. var errorText = string.Format("Elapsed: {0}, Timeout: {1}",
  66. _stopWatch.ElapsedMilliseconds,
  67. _connectionInfo.Timeout.TotalMilliseconds);
  68. // Compare elapsed time with configured timeout, allowing for a margin of error
  69. Assert.IsTrue(_stopWatch.ElapsedMilliseconds < _connectionInfo.Timeout.TotalMilliseconds + 100, errorText);
  70. }
  71. [TestMethod]
  72. public void ClientSocketShouldBeConnected()
  73. {
  74. Assert.IsTrue(_clientSocket.Connected);
  75. Assert.IsFalse(_disconnected);
  76. }
  77. [TestMethod]
  78. public void NoBytesShouldHaveBeenReadFromSocket()
  79. {
  80. var buffer = new byte[1];
  81. var bytesRead = _clientSocket.Receive(buffer);
  82. Assert.AreEqual(1, bytesRead);
  83. Assert.AreEqual(0x44, buffer[0]);
  84. }
  85. [TestMethod]
  86. public void CreateOnSocketFactoryShouldHaveBeenInvokedOnce()
  87. {
  88. SocketFactoryMock.Verify(p => p.Create(SocketType.Stream, ProtocolType.Tcp),
  89. Times.Once());
  90. }
  91. }
  92. }