Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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();
        }