public async Task Should_NotInvokeAnyEventHandlers_When_AGlobalRefreshIsScheduled() { _target = new ProtocolEventDebouncer(new TaskBasedTimerFactory(), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20)); var callbacks = new List <Task> { _target.HandleEventAsync(CreateProtocolEvent("ks", true), false), _target.HandleEventAsync(CreateProtocolEvent("ks2", true), false), _target.HandleEventAsync(CreateProtocolEvent("ks", false), false), _target.HandleEventAsync(CreateProtocolEvent("ks2", false), false), _target.HandleEventAsync(CreateProtocolEvent(), false), _target.HandleEventAsync(CreateProtocolEvent(), true), }; var tasks = _tasks.ToArray(); var handlerTask1 = tasks[0]; var handlerTask2 = tasks[1]; var handlerTask3 = tasks[2]; var handlerTask4 = tasks[3]; var handlerTask5 = tasks[4]; var handlerTask6 = tasks[5]; await Task.WhenAll(callbacks).ConfigureAwait(false); Assert.IsFalse(handlerTask1.IsCompleted); Assert.IsFalse(handlerTask2.IsCompleted); Assert.IsFalse(handlerTask3.IsCompleted); Assert.IsFalse(handlerTask4.IsCompleted); // last global event wins Assert.IsFalse(handlerTask5.IsCompleted); Assert.IsTrue(handlerTask6.IsCompleted); }
public async Task Should_OnlyCreateOneTimerAndNotInvokeChange_When_OneKeyspaceEventIsScheduled(bool refreshEvent) { var mockResult = MockTimerFactory(10, 10000); _target = mockResult.Debouncer; await _target.ScheduleEventAsync(CreateProtocolEvent("ks", refreshEvent), false).ConfigureAwait(false); TestHelper.RetryAssert(() => { VerifyTimerChange(mockResult.Timers.Single(), 10, Times.Once()); }); await Task.Delay(100).ConfigureAwait(false); // assert that no more timers are invoked VerifyTimerChange(mockResult.Timers.Single(), 10, Times.Once()); }
private TimerMockResult MockTimerFactory(long delayMs, long maxDelayMs) { var mockResult = new TimerMockResult(); var timerFactory = Mock.Of <ITimerFactory>(); Mock.Get(timerFactory) .Setup(t => t.Create(It.IsAny <TaskScheduler>())) .Returns(() => { var timer = Mock.Of <ITimer>(); mockResult.Timers.Enqueue(timer); return(timer); }); var target = new ProtocolEventDebouncer(timerFactory, TimeSpan.FromMilliseconds(delayMs), TimeSpan.FromMilliseconds(maxDelayMs)); mockResult.Debouncer = target; mockResult.TimerFactory = timerFactory; return(mockResult); }
public async Task Should_CreateTwoTimersAndDisposeFirstOne_When_TwoGlobalEventsAreScheduled() { var mockResult = MockTimerFactory(10, 10000); _target = mockResult.Debouncer; await _target.ScheduleEventAsync(CreateProtocolEvent(), false).ConfigureAwait(false); await _target.ScheduleEventAsync(CreateProtocolEvent(), false).ConfigureAwait(false); TestHelper.RetryAssert(() => { var timers = mockResult.Timers.ToArray(); Assert.AreEqual(1, timers.Length); VerifyTimerChange(timers[0], 10, Times.Exactly(2)); }); await Task.Delay(100).ConfigureAwait(false); VerifyTimerChange(mockResult.Timers.Single(), 10, Times.Exactly(2)); }
public async Task Should_DelayButNotAddKeyspaceEvent_When_AGlobalEventIsScheduled() { var mockResult = MockTimerFactory(10, 10000); _target = mockResult.Debouncer; await _target.ScheduleEventAsync(CreateProtocolEvent(), false).ConfigureAwait(false); await _target.ScheduleEventAsync(CreateProtocolEvent("ks", true), false).ConfigureAwait(false); await _target.ScheduleEventAsync(CreateProtocolEvent("ks2", false), false).ConfigureAwait(false); TestHelper.RetryAssert(() => { var timers = mockResult.Timers.ToArray(); Assert.AreEqual(1, timers.Length); VerifyTimerChange(timers[0], 10, Times.Exactly(3)); }); await Task.Delay(100).ConfigureAwait(false); VerifyTimerChange(mockResult.Timers.Single(), 10, Times.Exactly(3)); Assert.AreEqual(0, _target.GetQueue().Keyspaces.Count); }