BaseClientTest_Connected_KeepAlivesNotSentConcurrently.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Threading;
  3. using Microsoft.VisualStudio.TestTools.UnitTesting;
  4. using Moq;
  5. using Renci.SshNet.Messages.Transport;
  6. namespace Renci.SshNet.Tests.Classes
  7. {
  8. [TestClass]
  9. public class BaseClientTest_Connected_KeepAlivesNotSentConcurrently : BaseClientTestBase
  10. {
  11. private MockSequence _mockSequence;
  12. private BaseClient _client;
  13. private ConnectionInfo _connectionInfo;
  14. private ManualResetEvent _keepAliveSent;
  15. protected override void SetupData()
  16. {
  17. _connectionInfo = new ConnectionInfo("host", "user", new PasswordAuthenticationMethod("user", "pwd"));
  18. _keepAliveSent = new ManualResetEvent(false);
  19. }
  20. protected override void SetupMocks()
  21. {
  22. _mockSequence = new MockSequence();
  23. ServiceFactoryMock.InSequence(_mockSequence)
  24. .Setup(p => p.CreateSocketFactory())
  25. .Returns(SocketFactoryMock.Object);
  26. ServiceFactoryMock.InSequence(_mockSequence)
  27. .Setup(p => p.CreateSession(_connectionInfo, SocketFactoryMock.Object))
  28. .Returns(SessionMock.Object);
  29. SessionMock.InSequence(_mockSequence)
  30. .Setup(p => p.Connect());
  31. SessionMock.InSequence(_mockSequence)
  32. .Setup(p => p.TrySendMessage(It.IsAny<IgnoreMessage>()))
  33. .Returns(true)
  34. .Callback(() =>
  35. {
  36. Thread.Sleep(300);
  37. _keepAliveSent.Set();
  38. });
  39. }
  40. protected override void Arrange()
  41. {
  42. base.Arrange();
  43. _client = new MyClient(_connectionInfo, false, ServiceFactoryMock.Object)
  44. {
  45. KeepAliveInterval = TimeSpan.FromMilliseconds(50d)
  46. };
  47. _client.Connect();
  48. }
  49. protected override void TearDown()
  50. {
  51. if (_client != null)
  52. {
  53. SessionMock.InSequence(_mockSequence).Setup(p => p.OnDisconnecting());
  54. SessionMock.InSequence(_mockSequence).Setup(p => p.Dispose());
  55. _client.Dispose();
  56. }
  57. }
  58. protected override void Act()
  59. {
  60. // should keep-alive message be sent concurrently, then multiple keep-alive
  61. // message would be sent during this sleep period
  62. Thread.Sleep(200);
  63. // disable further keep-alives
  64. _client.KeepAliveInterval = Timeout.InfiniteTimeSpan;
  65. // wait until keep-alive has been sent at least once
  66. Assert.IsTrue(_keepAliveSent.WaitOne(500));
  67. }
  68. [TestMethod]
  69. public void SendMessageOnSessionShouldBeInvokedOnce()
  70. {
  71. SessionMock.Verify(p => p.TrySendMessage(It.IsAny<IgnoreMessage>()), Times.Once);
  72. }
  73. private class MyClient : BaseClient
  74. {
  75. public MyClient(ConnectionInfo connectionInfo, bool ownsConnectionInfo, IServiceFactory serviceFactory) : base(connectionInfo, ownsConnectionInfo, serviceFactory)
  76. {
  77. }
  78. }
  79. }
  80. }