public void Should_report_cancellation_during_faulting_last_retry_execution_when_user_delegate_does_observe_cancellationtoken() { var policy = Policy .Handle <DivideByZeroException>() .Retry(3); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = 1 + 3, ActionObservesCancellation = true }; policy.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(1 + 3); }
public void Should_report_cancellation_during_otherwise_non_faulting_action_execution_when_user_delegate_observes_cancellationtoken() { 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 = 1, ActionObservesCancellation = true }; breaker.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(1); }
public void Should_report_cancellation_after_faulting_action_execution_and_cancel_further_retries_if_onRetry_invokes_cancellation() { CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; var policy = Policy .Handle <DivideByZeroException>() .WaitAndRetry(new[] { 1.Seconds(), 2.Seconds(), 3.Seconds() }, (_, __) => { cancellationTokenSource.Cancel(); }); int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = null, // Cancellation during onRetry instead - see above. ActionObservesCancellation = false }; policy.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(1); }
public void Should_honour_and_report_cancellation_during_func_execution() { var policy = Policy .Handle <DivideByZeroException>() .WaitAndRetry(new[] { 1.Seconds(), 2.Seconds(), 3.Seconds() }); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; bool?result = null; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 0, AttemptDuringWhichToCancel = 1, ActionObservesCancellation = true }; policy.Invoking(x => result = x.RaiseExceptionAndOrCancellation <DivideByZeroException, bool>(scenario, cancellationTokenSource, onExecute, true)) .ShouldThrow <OperationCanceledException>().And.CancellationToken.Should().Be(cancellationToken); result.Should().Be(null); attemptsInvoked.Should().Be(1); }
public void Should_execute_func_returning_value_when_cancellationtoken_not_cancelled() { var policy = Policy .Handle <DivideByZeroException>() .WaitAndRetry(new[] { 1.Seconds(), 2.Seconds(), 3.Seconds() }); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; bool?result = null; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 0, AttemptDuringWhichToCancel = null }; policy.Invoking(x => result = x.RaiseExceptionAndOrCancellation <DivideByZeroException, bool>(scenario, cancellationTokenSource, onExecute, true)) .ShouldNotThrow(); result.Should().BeTrue(); attemptsInvoked.Should().Be(1); }
public void Should_not_execute_action_when_cancellationtoken_cancelled_before_execute() { var policy = Policy .Handle <DivideByZeroException>() .WaitAndRetry(new[] { 1.Seconds(), 2.Seconds(), 3.Seconds() }); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = null, // Cancellation token cancelled manually below - before any scenario execution. }; cancellationTokenSource.Cancel(); policy.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(0); }
public void Should_report_cancellation_during_faulting_retried_action_execution_and_cancel_further_retries_when_user_delegate_does_not_observe_cancellationtoken() { var policy = Policy .Handle <DivideByZeroException>() .WaitAndRetry(new[] { 1.Seconds(), 2.Seconds(), 3.Seconds() }); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = 2, ActionObservesCancellation = false }; policy.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(2); }
public void Should_execute_func_returning_value_when_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++; bool?result = null; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 0, AttemptDuringWhichToCancel = null, }; breaker.Invoking(x => result = x.RaiseExceptionAndOrCancellation <DivideByZeroException, bool>(scenario, cancellationTokenSource, onExecute, true)) .ShouldNotThrow(); result.Should().BeTrue(); attemptsInvoked.Should().Be(1); }
public void Should_not_execute_action_when_cancellationtoken_cancelled_before_execute() { 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, // Cancellation token cancelled manually below - before any scenario execution. }; cancellationTokenSource.Cancel(); breaker.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(0); }
public void Should_honour_and_report_cancellation_during_func_execution() { CircuitBreakerPolicy breaker = Policy .Handle <DivideByZeroException>() .CircuitBreaker(2, TimeSpan.FromMinutes(1)); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; bool?result = null; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 0, AttemptDuringWhichToCancel = 1, ActionObservesCancellation = true }; breaker.Invoking(x => result = x.RaiseExceptionAndOrCancellation <DivideByZeroException, bool>(scenario, cancellationTokenSource, onExecute, true)) .ShouldThrow <OperationCanceledException>().And.CancellationToken.Should().Be(cancellationToken); result.Should().Be(null); attemptsInvoked.Should().Be(1); }
public void Should_honour_cancellation_immediately_during_wait_phase_of_waitandretry() { CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; SystemClock.Sleep = (timeSpan, ct) => Task.Delay(timeSpan, ct).Wait(ct); TimeSpan shimTimeSpan = TimeSpan.FromSeconds(1); // Consider increasing shimTimeSpan if test fails transiently in different environments. TimeSpan retryDelay = shimTimeSpan + shimTimeSpan + shimTimeSpan; var policy = Policy .Handle <DivideByZeroException>() .WaitAndRetry(new[] { retryDelay }); int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; Stopwatch watch = new Stopwatch(); watch.Start(); PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 1, AttemptDuringWhichToCancel = null, // Cancellation invoked after delay - see below. ActionObservesCancellation = false }; cancellationTokenSource.CancelAfter(shimTimeSpan); policy.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); watch.Stop(); attemptsInvoked.Should().Be(1); watch.Elapsed.Should().BeLessThan(retryDelay); watch.Elapsed.Should().BeCloseTo(shimTimeSpan, precision: (int)(shimTimeSpan.TotalMilliseconds) / 2); // Consider increasing shimTimeSpan, or loosening precision, if test fails transiently in different environments. }
public void Should_execute_all_tries_when_faulting_and_cancellationtoken_not_cancelled() { var policy = Policy .Handle <DivideByZeroException>() .Retry(3); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = null, }; policy.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <DivideByZeroException>(); attemptsInvoked.Should().Be(1 + 3); }
public void Should_report_cancellation_when_both_open_circuit_and_cancellation() { CircuitBreakerPolicy breaker = Policy .Handle <DivideByZeroException>() .CircuitBreaker(1, TimeSpan.FromMinutes(1)); breaker.Invoking(x => x.RaiseException <DivideByZeroException>()) .ShouldThrow <DivideByZeroException>(); breaker.Invoking(x => x.RaiseException <DivideByZeroException>()) .ShouldThrow <BrokenCircuitException>() .WithMessage("The circuit is now open and is not allowing calls.") .WithInnerException <DivideByZeroException>(); // Circuit is now broken. CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; cancellationTokenSource.Cancel(); PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1, AttemptDuringWhichToCancel = null, // Cancelled manually instead - see above. ActionObservesCancellation = false }; breaker.Invoking(x => x.RaiseExceptionAndOrCancellation <DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow <OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(0); }
public void Should_report_cancellation_when_both_open_circuit_and_cancellation() { CircuitBreakerPolicy breaker = Policy .Handle<DivideByZeroException>() .CircuitBreaker(1, TimeSpan.FromMinutes(1)); breaker.Invoking(x => x.RaiseException<DivideByZeroException>()) .ShouldThrow<DivideByZeroException>(); breaker.Invoking(x => x.RaiseException<DivideByZeroException>()) .ShouldThrow<BrokenCircuitException>() .WithMessage("The circuit is now open and is not allowing calls.") .WithInnerException<DivideByZeroException>(); // Circuit is now broken. CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; cancellationTokenSource.Cancel(); PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1, AttemptDuringWhichToCancel = null, // Cancelled manually instead - see above. ActionObservesCancellation = false }; breaker.Invoking(x => x.RaiseExceptionAndOrCancellation<DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow<OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(0); }
public void Should_execute_all_tries_when_faulting_and_cancellationtoken_not_cancelled() { var policy = Policy .Handle<DivideByZeroException>() .Retry(3); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = null, }; policy.Invoking(x => x.RaiseExceptionAndOrCancellation<DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow<DivideByZeroException>(); attemptsInvoked.Should().Be(1 + 3); }
public void Should_not_execute_action_when_cancellationtoken_cancelled_before_execute() { var policy = Policy .Handle<DivideByZeroException>() .Retry(3); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = null, // Cancellation token cancelled manually below - before any scenario execution. }; cancellationTokenSource.Cancel(); policy.Invoking(x => x.RaiseExceptionAndOrCancellation<DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow<OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(0); }
public void Should_report_cancellation_during_faulting_retried_action_execution_and_cancel_further_retries_when_user_delegate_observes_cancellationtoken() { var policy = Policy .Handle<DivideByZeroException>() .Retry(3); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = 2, ActionObservesCancellation = true }; policy.Invoking(x => x.RaiseExceptionAndOrCancellation<DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow<OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(2); }
public void Should_report_faulting_from_faulting_last_retry_execution_when_user_delegate_does_not_observe_cancellation_raised_during_last_retry() { var policy = Policy .Handle<DivideByZeroException>() .Retry(3); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = 1 + 3, ActionObservesCancellation = false }; policy.Invoking(x => x.RaiseExceptionAndOrCancellation<DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow<DivideByZeroException>(); attemptsInvoked.Should().Be(1 + 3); }
public void Should_report_cancellation_after_faulting_action_execution_and_cancel_further_retries_if_onRetry_invokes_cancellation() { CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; var policy = Policy .Handle<DivideByZeroException>() .Retry(3, (_, __) => { cancellationTokenSource.Cancel(); }); int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 3, AttemptDuringWhichToCancel = null, // Cancellation during onRetry instead - see above. ActionObservesCancellation = false }; policy.Invoking(x => x.RaiseExceptionAndOrCancellation<DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow<OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(1); }
public void Should_execute_func_returning_value_when_cancellationtoken_not_cancelled() { var policy = Policy .Handle<DivideByZeroException>() .Retry(3); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; bool? result = null; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 0, AttemptDuringWhichToCancel = null, }; policy.Invoking(x => result = x.RaiseExceptionAndOrCancellation<DivideByZeroException, bool>(scenario, cancellationTokenSource, onExecute, true)) .ShouldNotThrow(); result.Should().BeTrue(); attemptsInvoked.Should().Be(1); }
public void Should_report_cancellation_during_faulting_action_execution_when_user_delegate_observes_cancellationtoken() { 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 = 1, AttemptDuringWhichToCancel = 1, ActionObservesCancellation = true }; breaker.Invoking(x => x.RaiseExceptionAndOrCancellation<DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow<OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); attemptsInvoked.Should().Be(1); }
public void Should_honour_and_report_cancellation_during_func_execution() { var policy = Policy .Handle<DivideByZeroException>() .Retry(3); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; bool? result = null; PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 0, AttemptDuringWhichToCancel = 1, ActionObservesCancellation = true }; policy.Invoking(x => result = x.RaiseExceptionAndOrCancellation<DivideByZeroException, bool>(scenario, cancellationTokenSource, onExecute, true)) .ShouldThrow<OperationCanceledException>().And.CancellationToken.Should().Be(cancellationToken); result.Should().Be(null); attemptsInvoked.Should().Be(1); }
public void Should_honour_cancellation_immediately_during_wait_phase_of_waitandretry() { CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; SystemClock.Sleep = (timeSpan, ct) => Task.Delay(timeSpan, ct).Wait(ct); TimeSpan shimTimeSpan = TimeSpan.FromSeconds(1); // Consider increasing shimTimeSpan if test fails transiently in different environments. TimeSpan retryDelay = shimTimeSpan + shimTimeSpan + shimTimeSpan; var policy = Policy .Handle<DivideByZeroException>() .WaitAndRetry(new[] { retryDelay }); int attemptsInvoked = 0; Action onExecute = () => attemptsInvoked++; Stopwatch watch = new Stopwatch(); watch.Start(); PolicyExtensions.ExceptionAndOrCancellationScenario scenario = new PolicyExtensions.ExceptionAndOrCancellationScenario { NumberOfTimesToRaiseException = 1 + 1, AttemptDuringWhichToCancel = null, // Cancellation invoked after delay - see below. ActionObservesCancellation = false }; cancellationTokenSource.CancelAfter(shimTimeSpan); policy.Invoking(x => x.RaiseExceptionAndOrCancellation<DivideByZeroException>(scenario, cancellationTokenSource, onExecute)) .ShouldThrow<OperationCanceledException>() .And.CancellationToken.Should().Be(cancellationToken); watch.Stop(); attemptsInvoked.Should().Be(1); watch.Elapsed.Should().BeLessThan(retryDelay); watch.Elapsed.Should().BeCloseTo(shimTimeSpan, precision: (int)(shimTimeSpan.TotalMilliseconds) / 2); // Consider increasing shimTimeSpan, or loosening precision, if test fails transiently in different environments. }
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); }