public async Task CircuitBreakerTest_ExecutePolicyAsync_Success() { await RunWithTelemetryAsync( totalOfExecutions : 1, runInParallel : false, handler : async execution => { #region Arrange var result = false; var retryPolicy = new RetryPolicy( "default", new RetryPolicyParams( maxAttempts: 2, jitterStrategyType: JitterStrategyTypeEnum.Linear, timeSpanBase: TimeSpan.FromSeconds(1), customJitterTimeFunction: null ) ); var circuitBreakerPolicy = new CircuitBreakerPolicy( name: "default", windowSleepTime: TimeSpan.FromSeconds(2), retryPolicy ); var hasClosed = false; var hasOpened = false; var hasHalfOpened = false; circuitBreakerPolicy.CircuitStateChangedEvent += (sender, ea) => { switch (ea.CircuitStateEnum) { case CircuitBreaker.Models.Enums.CircuitStateEnum.Closed: hasClosed = true; break; case CircuitBreaker.Models.Enums.CircuitStateEnum.Opened: hasOpened = true; break; case CircuitBreaker.Models.Enums.CircuitStateEnum.HalfOpened: hasHalfOpened = true; break; } }; var maxWindowTimeAttempts = 3; var currentWindowsTimeAtttempts = 1; var totalOfRetryFunctionCaller = 0; #endregion #region Act var sw = Stopwatch.StartNew(); while (currentWindowsTimeAtttempts <= maxWindowTimeAttempts) { var circuitBreakerExecutionResult = await circuitBreakerPolicy.ExecutePolicyAsync(async(attempt) => { totalOfRetryFunctionCaller++; return(await Task.FromResult(currentWindowsTimeAtttempts == 2)); }); currentWindowsTimeAtttempts = circuitBreakerExecutionResult.attempt; if (circuitBreakerExecutionResult.success) { break; } } sw.Stop(); #endregion #region Assert result = totalOfRetryFunctionCaller == 5 && sw.ElapsedMilliseconds >= 10_000 && sw.ElapsedMilliseconds <= 11_000 && hasClosed && hasOpened && hasHalfOpened ; return(result); #endregion } ).ConfigureAwait(false); }