DeadPeerDetectorEntryTests.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using System.Threading;
  2. using System.Threading.Tasks;
  3. using Abc.Zebus.Directory.Configuration;
  4. using Abc.Zebus.Directory.DeadPeerDetection;
  5. using Abc.Zebus.Testing;
  6. using Abc.Zebus.Testing.Extensions;
  7. using Abc.Zebus.Util;
  8. using Moq;
  9. using NUnit.Framework;
  10. namespace Abc.Zebus.Directory.Tests.DeadPeerDetection
  11. {
  12. [TestFixture]
  13. public class DeadPeerDetectorEntryTests
  14. {
  15. private DeadPeerDetectorEntry _entry;
  16. private Mock<IDirectoryConfiguration> _configurationMock;
  17. private TestBus _bus;
  18. [SetUp]
  19. public void Setup()
  20. {
  21. _configurationMock = new Mock<IDirectoryConfiguration>();
  22. _bus = new TestBus();
  23. var peer = new Peer(new PeerId("Abc.Testing.0"), "tcp://abctest:12300");
  24. var peerDescriptor = peer.ToPeerDescriptor(true);
  25. _entry = new DeadPeerDetectorEntry(peerDescriptor, _configurationMock.Object, _bus, new CurrentThreadTaskScheduler());
  26. }
  27. [Test]
  28. public void should_use_debug_timeout()
  29. {
  30. _configurationMock.SetupGet(x => x.PersistentPeerPingTimeout).Returns(5.Seconds());
  31. _configurationMock.SetupGet(x => x.DebugPeerPingTimeout).Returns(500.Seconds());
  32. _bus.HandlerExecutor = new TestBus.DoNotReplyHandlerExecutor();
  33. _entry.Descriptor.HasDebuggerAttached = true;
  34. var pingTimestamp = SystemDateTime.UtcNow;
  35. _entry.Ping(pingTimestamp);
  36. using (SystemDateTime.PauseTime(pingTimestamp.AddSeconds(15)))
  37. {
  38. _entry.HasReachedTimeout().ShouldBeFalse();
  39. }
  40. using (SystemDateTime.PauseTime(pingTimestamp.AddSeconds(501)))
  41. {
  42. _entry.HasReachedTimeout().ShouldBeTrue();
  43. }
  44. }
  45. [Test]
  46. public void should_use_persistent_timeout()
  47. {
  48. _configurationMock.SetupGet(x => x.TransientPeerPingTimeout).Returns(5.Seconds());
  49. _configurationMock.SetupGet(x => x.PersistentPeerPingTimeout).Returns(500.Seconds());
  50. _bus.HandlerExecutor = new TestBus.DoNotReplyHandlerExecutor();
  51. _entry.Descriptor.IsPersistent = true;
  52. var pingTimestamp = SystemDateTime.UtcNow;
  53. _entry.Ping(pingTimestamp);
  54. using (SystemDateTime.PauseTime(pingTimestamp.AddSeconds(15)))
  55. {
  56. _entry.HasReachedTimeout().ShouldBeFalse();
  57. }
  58. using (SystemDateTime.PauseTime(pingTimestamp.AddSeconds(501)))
  59. {
  60. _entry.HasReachedTimeout().ShouldBeTrue();
  61. }
  62. }
  63. [Test]
  64. public void should_use_transcient_timeout()
  65. {
  66. _configurationMock.SetupGet(x => x.TransientPeerPingTimeout).Returns(5.Seconds());
  67. _bus.HandlerExecutor = new TestBus.DoNotReplyHandlerExecutor();
  68. _entry.Descriptor.IsPersistent = false;
  69. var pingTimestamp = SystemDateTime.UtcNow;
  70. _entry.Ping(pingTimestamp);
  71. using (SystemDateTime.PauseTime(pingTimestamp.AddSeconds(4)))
  72. {
  73. _entry.HasReachedTimeout().ShouldBeFalse();
  74. }
  75. using (SystemDateTime.PauseTime(pingTimestamp.AddSeconds(6)))
  76. {
  77. _entry.HasReachedTimeout().ShouldBeTrue();
  78. }
  79. }
  80. [Test]
  81. public void should_not_detect_responding_peer_twice()
  82. {
  83. var pingTimestampUtc = SystemDateTime.UtcNow;
  84. _entry.Descriptor.Peer.IsResponding = false;
  85. var manualResetEvent = new ManualResetEventSlim();
  86. var peerRespondingCount = 0;
  87. _entry.PeerRespondingDetected += (e, o) =>
  88. {
  89. manualResetEvent.Wait();
  90. peerRespondingCount++;
  91. };
  92. var ackTask1 = Task.Run(() => _entry.OnPingCommandAck(Task.FromResult(new CommandResult(0, string.Empty, null)), pingTimestampUtc));
  93. var ackTask2 = Task.Run(() => _entry.OnPingCommandAck(Task.FromResult(new CommandResult(0, string.Empty, null)), pingTimestampUtc));
  94. Thread.Sleep(10);
  95. manualResetEvent.Set();
  96. Task.WaitAll(ackTask1, ackTask2);
  97. peerRespondingCount.ShouldEqual(1);
  98. }
  99. }
  100. }