public void Should_open_circuit_and_block_calls_if_manual_override_open()
        {
            var time = 1.January(2000);

            SystemClock.UtcNow = () => time;

            var durationOfBreak = TimeSpan.FromMinutes(1);

            CircuitBreakerPolicy breaker = Policy
                                           .Handle <DivideByZeroException>()
                                           .CircuitBreaker(2, durationOfBreak);

            breaker.CircuitState.Should().Be(CircuitState.Closed);

            // manually break circuit
            breaker.Isolate();
            breaker.CircuitState.Should().Be(CircuitState.Isolated);

            // circuit manually broken: execution should be blocked; even non-exception-throwing executions should not reset circuit
            breaker.Invoking(x => x.Execute(() => { }))
            .ShouldThrow <IsolatedCircuitException>();
            breaker.CircuitState.Should().Be(CircuitState.Isolated);
        }
Exemple #2
0
        public void Should_set_LastHandledResult_and_LastException_to_default_on_circuit_reset()
        {
            CircuitBreakerPolicy <ResultPrimitive> breaker = Policy
                                                             .Handle <DivideByZeroException>()
                                                             .OrResult(ResultPrimitive.Fault)
                                                             .CircuitBreaker(2, TimeSpan.FromMinutes(1));

            breaker.Invoking(b => b.RaiseResultAndOrExceptionSequence(new DivideByZeroException()))
            .ShouldThrow <DivideByZeroException>();

            breaker.RaiseResultSequence(ResultPrimitive.Fault)
            .Should().Be(ResultPrimitive.Fault);

            breaker.CircuitState.Should().Be(CircuitState.Open);

            breaker.LastHandledResult.Should().Be(ResultPrimitive.Fault);
            breaker.LastException.Should().BeNull();

            breaker.Reset();

            breaker.LastHandledResult.Should().Be(default(ResultPrimitive));
            breaker.LastException.Should().BeNull();
        }
Exemple #3
0
        public void Should_call_onbreak_with_the_last_raised_exception()
        {
            Exception lastException = null;

            Action <DelegateResult <ResultPrimitive>, TimeSpan, Context> onBreak = (outcome, _, __) => { lastException = outcome.Exception; };
            Action <Context> onReset = _ => { };

            TimeSpan durationOfBreak = TimeSpan.FromMinutes(1);

            CircuitBreakerPolicy <ResultPrimitive> breaker = Policy
                                                             .Handle <DivideByZeroException>()
                                                             .OrResult(ResultPrimitive.Fault)
                                                             .CircuitBreaker(2, durationOfBreak, onBreak, onReset);

            breaker.RaiseResultSequence(ResultPrimitive.Fault)
            .Should().Be(ResultPrimitive.Fault);

            breaker.Invoking(b => b.RaiseResultAndOrExceptionSequence(new DivideByZeroException()))
            .ShouldThrow <DivideByZeroException>();

            breaker.CircuitState.Should().Be(CircuitState.Open);

            lastException.Should().BeOfType <DivideByZeroException>();
        }
Exemple #4
0
        public void Should_execute_action_when_non_faulting_and_cancellationtoken_not_cancelled()
        {
            var durationOfBreak          = TimeSpan.FromMinutes(1);
            CircuitBreakerPolicy breaker = Policy
                                           .Handle <DivideByZeroException>()
                                           .CircuitBreaker(2, durationOfBreak);

            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
            CancellationToken       cancellationToken       = cancellationTokenSource.Token;

            int    attemptsInvoked = 0;
            Action onExecute       = () => attemptsInvoked++;

            PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario
            {
                NumberOfTimesToRaiseException = 0,
                AttemptDuringWhichToCancel    = null,
            };

            breaker.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute))
            .ShouldNotThrow();

            attemptsInvoked.Should().Be(1);
        }