public async Task ShouldTickEvenAfterException() { var scheduler = new Scheduler(); var autoResetEvent = new AutoResetEvent(false); Task Throwing() => throw new InvalidOperationException("Boom"); IFailureContext actualFailureContext = null; var scheduledTask = scheduler.Schedule(TimeSpan.FromMilliseconds(50), ct => Throwing(), (failureContext, ct) => { actualFailureContext = failureContext; autoResetEvent.Set(); return(Task.CompletedTask); }); var intTimerCounter = 0; while (intTimerCounter < 5) { var signaled = autoResetEvent.WaitOne(100); signaled.Should().BeTrue(); actualFailureContext.Exception.Should().BeOfType <InvalidOperationException>(); intTimerCounter++; } await scheduledTask.Cancel(); }
public async Task ShouldBackoffAfterException() { var scheduler = new Scheduler(); Task Throwing() => throw new InvalidOperationException("Boom"); IFailureContext actualFailureContext = null; var scheduledTask = scheduler.Schedule(TimeSpan.FromMilliseconds(50), ct => Throwing(), (failureContext, ct) => { actualFailureContext = failureContext; return(Task.CompletedTask); }, TimeSpan.FromMilliseconds(1000)); await Task.Delay(50 + 50 + 100 + 200 + 400 + 800 + 1000 + 1000); await scheduledTask.Cancel(); // assert actualFailureContext.FailCount.Should().Be(7); actualFailureContext.Period.Should().Be(TimeSpan.FromMilliseconds(50)); actualFailureContext.MaxPeriod.Should().Be(TimeSpan.FromMilliseconds(1000)); actualFailureContext.CurrentPeriod.Should().Be(TimeSpan.FromMilliseconds(1000)); }
public async Task ShouldTickWithNormalPeriodAfterExceptionResolved() { var scheduler = new TestScheduler(); var shouldThrow = true; var counter = 0; Task Throwing() { if (shouldThrow) { throw new InvalidOperationException("Boom"); } counter++; return(Task.CompletedTask); } IFailureContext actualFailureContext = null; var scheduledTask = scheduler.Schedule(TimeSpan.FromSeconds(50), ct => Throwing(), (failureContext, ct) => { actualFailureContext = failureContext; return(Task.CompletedTask); }, TimeSpan.FromSeconds(180)); await scheduler.AdvanceBy(TimeSpan.FromSeconds(51)); await scheduler.AdvanceBy(TimeSpan.FromSeconds(51)); await scheduler.AdvanceBy(TimeSpan.FromSeconds(101)); await scheduler.AdvanceBy(TimeSpan.FromSeconds(181)); shouldThrow = false; await scheduler.AdvanceBy(TimeSpan.FromSeconds(181)); actualFailureContext.Exception.Should().BeNull(); actualFailureContext.FailCount.Should().Be(0); actualFailureContext.CurrentPeriod.Should().Be(TimeSpan.FromSeconds(50)); await scheduler.AdvanceBy(TimeSpan.FromSeconds(51)); counter.Should().Be(2); await scheduledTask.Cancel(); }
public async Task ShouldBackoffInCaseOfSeveralExceptions() { var testScheduler = new TestScheduler(); IFailureContext actualFailureContext = null; Task Throwing() => throw new InvalidOperationException("Boom"); var scheduledTask = testScheduler.Schedule(TimeSpan.FromSeconds(50), ct => Throwing(), (failureContext, ct) => { actualFailureContext = failureContext; return(Task.CompletedTask); }, TimeSpan.FromSeconds(180)); await testScheduler.AdvanceBy(TimeSpan.FromSeconds(51)); await testScheduler.AdvanceBy(TimeSpan.FromSeconds(51)); actualFailureContext.Should().NotBeNull(); actualFailureContext.Exception.Should().NotBeNull(); actualFailureContext.FailCount.Should().Be(2); actualFailureContext.CurrentPeriod.Should().Be(TimeSpan.FromSeconds(100)); await testScheduler.AdvanceBy(TimeSpan.FromSeconds(51)); actualFailureContext.FailCount.Should().Be(2); await testScheduler.AdvanceBy(TimeSpan.FromSeconds(50)); actualFailureContext.Exception.Should().NotBeNull(); actualFailureContext.FailCount.Should().Be(3); actualFailureContext.CurrentPeriod.Should().Be(TimeSpan.FromSeconds(180)); await scheduledTask.Cancel(); }
public async Task ShouldCallOnExceptionInCaseOfError() { var testScheduler = new TestScheduler(); IFailureContext actualFailureContext = null; Task Throwing() => throw new InvalidOperationException("Boom"); var scheduledTask = testScheduler.Schedule(TimeSpan.FromSeconds(50), ct => Throwing(), (failureContext, ct) => { actualFailureContext = failureContext; return(Task.CompletedTask); }); await testScheduler.AdvanceBy(TimeSpan.FromSeconds(51)); actualFailureContext.Should().NotBeNull(); actualFailureContext.Exception.Should().NotBeNull(); actualFailureContext.FailCount.Should().Be(1); await scheduledTask.Cancel(); }