示例#1
0
        public async Task ExecuteValidActionOneTime()
        {
            var action = new Mock <Func <Task <string> > >();

            var executer = new ExponentialRetryRequestExecuter(3, 2);
            var res      = await executer.ExecuteAsync(action.Object);

            res.Should().Be(null);
            action.Verify(a => a(), Times.Once);
        }
示例#2
0
        public void ShouldNotRetryAnyOtherExceptionAction()
        {
            var action = new Mock <Func <Task <string> > >();

            action.Setup(a => a()).Throws <Exception>();

            var executer = new ExponentialRetryRequestExecuter(3, 0);

            executer.Awaiting(e => e.ExecuteAsync(action.Object)).Should().Throw <Exception>();

            action.Verify(a => a(), Times.Exactly(1));
        }
示例#3
0
        public void ShouldInvokeCallbackAction()
        {
            var executer = new ExponentialRetryRequestExecuter(5, 0);

            var action = new Mock <Func <Task <string> > >();

            action.Setup(a => a()).Throws <TaskCanceledException>();

            var invokedTimes = 0;

            executer.Awaiting(e => e.ExecuteAsync(action.Object, (exp) => invokedTimes++)).Should().Throw <TaskCanceledException>();

            invokedTimes.Should().Be(4);
        }
示例#4
0
        public void ShouldUseThrottler()
        {
            var throttler = new Mock <IRequestExecutionThrottler>();

            var executer = new ExponentialRetryRequestExecuter(5, 0, throttler.Object);

            var action = new Mock <Func <Task <string> > >();

            action.Setup(a => a()).Throws <TaskCanceledException>();

            executer.Awaiting(e => e.ExecuteAsync(action.Object)).Should().Throw <Exception>();

            throttler.Verify(t => t.ReserveAsync(), Times.Exactly(5));
            throttler.Verify(t => t.Release(), Times.Exactly(5));
        }