Пример #1
0
        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);
        }