SessionTest_Connected_ServerSendsDisconnectMessage.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using System.Diagnostics;
  2. using System.Globalization;
  3. using System.Net.Sockets;
  4. using System.Threading;
  5. using Microsoft.VisualStudio.TestTools.UnitTesting;
  6. using Renci.SshNet.Common;
  7. using Renci.SshNet.Messages.Transport;
  8. namespace Renci.SshNet.Tests.Classes
  9. {
  10. [TestClass]
  11. public class SessionTest_Connected_ServerSendsDisconnectMessage : SessionTest_ConnectedBase
  12. {
  13. private DisconnectMessage _disconnectMessage;
  14. protected override void Arrange()
  15. {
  16. _disconnectMessage = new DisconnectMessage(DisconnectReason.ServiceNotAvailable, "Not today!");
  17. base.Arrange();
  18. }
  19. protected override void Act()
  20. {
  21. var disconnect = _disconnectMessage.GetPacket(8, null);
  22. ServerSocket.Send(disconnect, 4, disconnect.Length - 4, SocketFlags.None);
  23. // give session some time to process DisconnectMessage
  24. Thread.Sleep(200);
  25. }
  26. [TestMethod]
  27. public void IsConnectedShouldReturnFalse()
  28. {
  29. Assert.IsFalse(Session.IsConnected);
  30. }
  31. [TestMethod]
  32. public void DisconnectShouldFinishImmediately()
  33. {
  34. var stopwatch = new Stopwatch();
  35. stopwatch.Start();
  36. Session.Disconnect();
  37. stopwatch.Stop();
  38. Assert.IsTrue(stopwatch.ElapsedMilliseconds < 500);
  39. }
  40. [TestMethod]
  41. public void DisconnectedIsRaisedOnce()
  42. {
  43. Assert.AreEqual(1, DisconnectedRegister.Count);
  44. }
  45. [TestMethod]
  46. public void DisconnectReceivedIsRaisedOnce()
  47. {
  48. Assert.AreEqual(1, DisconnectReceivedRegister.Count);
  49. var disconnectMessage = DisconnectReceivedRegister[0].Message;
  50. Assert.IsNotNull(disconnectMessage);
  51. Assert.AreEqual(_disconnectMessage.Description, disconnectMessage.Description);
  52. Assert.AreEqual("en", disconnectMessage.Language);
  53. Assert.AreEqual(_disconnectMessage.ReasonCode, disconnectMessage.ReasonCode);
  54. }
  55. [TestMethod]
  56. public void ErrorOccurredIsNeverRaised()
  57. {
  58. Assert.AreEqual(0, ErrorOccurredRegister.Count);
  59. }
  60. [TestMethod]
  61. public void DisposeShouldFinishImmediately()
  62. {
  63. var stopwatch = new Stopwatch();
  64. stopwatch.Start();
  65. Session.Dispose();
  66. stopwatch.Stop();
  67. Assert.IsTrue(stopwatch.ElapsedMilliseconds < 500);
  68. }
  69. [TestMethod]
  70. public void ReceiveOnServerSocketShouldReturnZero()
  71. {
  72. var buffer = new byte[1];
  73. var actual = ServerSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
  74. Assert.AreEqual(0, actual);
  75. }
  76. [TestMethod]
  77. public void SendMessageShouldThrowSshConnectionException()
  78. {
  79. try
  80. {
  81. Session.SendMessage(new IgnoreMessage());
  82. Assert.Fail();
  83. }
  84. catch (SshConnectionException ex)
  85. {
  86. Assert.AreEqual(DisconnectReason.None, ex.DisconnectReason);
  87. Assert.IsNull(ex.InnerException);
  88. Assert.AreEqual("Client not connected.", ex.Message);
  89. }
  90. }
  91. [TestMethod]
  92. public void ISession_MessageListenerCompletedShouldBeSignaled()
  93. {
  94. var session = (ISession)Session;
  95. Assert.IsNotNull(session.MessageListenerCompleted);
  96. Assert.IsTrue(session.MessageListenerCompleted.WaitOne());
  97. }
  98. [TestMethodAttribute]
  99. public void ISession_SendMessageShouldThrowSshConnectionException()
  100. {
  101. var session = (ISession) Session;
  102. try
  103. {
  104. session.SendMessage(new IgnoreMessage());
  105. Assert.Fail();
  106. }
  107. catch (SshConnectionException ex)
  108. {
  109. Assert.AreEqual(DisconnectReason.None, ex.DisconnectReason);
  110. Assert.IsNull(ex.InnerException);
  111. Assert.AreEqual("Client not connected.", ex.Message);
  112. }
  113. }
  114. [TestMethod]
  115. public void ISession_TrySendMessageShouldReturnFalse()
  116. {
  117. var session = (ISession) Session;
  118. var actual = session.TrySendMessage(new IgnoreMessage());
  119. Assert.IsFalse(actual);
  120. }
  121. [TestMethod]
  122. public void ISession_WaitOnHandleShouldThrowSshConnectionExceptionDetailingDisconnectReason()
  123. {
  124. var session = (ISession)Session;
  125. var waitHandle = new ManualResetEvent(false);
  126. try
  127. {
  128. session.WaitOnHandle(waitHandle);
  129. Assert.Fail();
  130. }
  131. catch (SshConnectionException ex)
  132. {
  133. Assert.AreEqual(DisconnectReason.ServiceNotAvailable, ex.DisconnectReason);
  134. Assert.IsNull(ex.InnerException);
  135. Assert.AreEqual(string.Format(CultureInfo.InvariantCulture, "The connection was closed by the server: {0} ({1}).", _disconnectMessage.Description, _disconnectMessage.ReasonCode), ex.Message);
  136. }
  137. }
  138. }
  139. }