public void NoRetriesAtAllIfRetryQuotaIs0()
        {
            var config          = CreateConfig();
            var capacityManager = new CapacityManager(throttleRetryCount: 0, throttleRetryCost: 5, throttleCost: 1, timeoutRetryCost: 10);

            RunRetryTest((executionContext, retryPolicy) =>
            {
                Tester.Reset();
                Tester.Action = (int callCount) =>
                {
                    switch (callCount)
                    {
                    case 1:
                        throw new AmazonServiceException($"Mocked service error ({callCount})", new WebException(), HttpStatusCode.InternalServerError);

                    default:
                        throw new Exception($"Invalid number of calls ({callCount})");
                    }
                };

                var exception = Utils.AssertExceptionExpected <AmazonServiceException>(() =>
                {
                    RuntimePipeline.InvokeSync(executionContext);
                });

                Assert.AreEqual("Mocked service error (1)", exception.Message);

                var capacity = MockAdaptiveRetryPolicy.CurrentCapacityManagerInstance.GetRetryCapacity(config.ServiceURL);
                Assert.AreEqual(0, executionContext.RequestContext.Retries);
                Assert.AreEqual(1, Tester.CallCount);
                Assert.AreEqual(0, capacity.AvailableCapacity);
            }, config, capacityManager);
        }
        public void AcquireCapacityInvalidUnitTest()
        {
            int             throttleRetryCount      = 0;
            int             throttleRetryCost       = 5;
            int             throttleCost            = 1;
            CapacityManager capacityManagerInstance = new CapacityManager(throttleRetryCount, throttleRetryCost, throttleCost);

            retryCapacity = capacityManagerInstance.GetRetryCapacity("AcquireCapacityInvalidUnitTest");
            Assert.IsNotNull(retryCapacity);
            Assert.IsFalse(capacityManagerInstance.TryAcquireCapacity(retryCapacity));
            Assert.AreEqual(0, retryCapacity.AvailableCapacity);
            var consumedCapacity = retryCapacity.MaxCapacity - retryCapacity.AvailableCapacity;

            Assert.AreEqual(0, consumedCapacity);
        }
        public void ReleaseCapacityInvalidUnitTest()
        {
            int             throttleRetryCount      = 5;
            int             throttleRetryCost       = 5;
            int             throttleCost            = 1;
            CapacityManager capacityManagerInstance = new CapacityManager(throttleRetryCount, throttleRetryCost, throttleCost);

            retryCapacity = capacityManagerInstance.GetRetryCapacity("ReleaseCapacityInvalidUnitTest");
            Assert.IsNotNull(retryCapacity);

            capacityManagerInstance.TryReleaseCapacity(false, retryCapacity);
            Assert.AreEqual(throttleRetryCost * throttleRetryCount, retryCapacity.AvailableCapacity);
            var consumedCapacity = retryCapacity.MaxCapacity - retryCapacity.AvailableCapacity;

            Assert.AreEqual(0, consumedCapacity);
        }
        public void ReleaseCapacityUnitTest()
        {
            int             throttleRetryCount      = 5;
            int             throttleRetryCost       = 5;
            int             throttleCost            = 1;
            CapacityManager capacityManagerInstance = new CapacityManager(throttleRetryCount, throttleRetryCost, throttleCost);

            retryCapacity = capacityManagerInstance.GetRetryCapacity("ReleaseCapacityUnitTest");
            Assert.IsNotNull(retryCapacity);
            Assert.IsTrue(capacityManagerInstance.TryAcquireCapacity(retryCapacity));

            capacityManagerInstance.ReleaseCapacity(CapacityManager.CapacityType.Retry, retryCapacity);
            Assert.AreEqual(throttleRetryCost * throttleRetryCount, retryCapacity.AvailableCapacity);
            var consumedCapacity = retryCapacity.MaxCapacity - retryCapacity.AvailableCapacity;

            Assert.AreEqual(0, consumedCapacity);

            capacityManagerInstance.ReleaseCapacity(CapacityManager.CapacityType.Increment, retryCapacity);
            Assert.AreEqual(throttleRetryCost * throttleRetryCount, retryCapacity.AvailableCapacity);
            consumedCapacity = retryCapacity.MaxCapacity - retryCapacity.AvailableCapacity;
            Assert.AreEqual(0, consumedCapacity);
        }
        public void RunRetryTest(Action <IExecutionContext, MockStandardRetryPolicy> DoAction, AmazonS3Config config,
                                 CapacityManager capacityManager = null, double?exponentialPower = null, double?exponentialBase = null)
        {
            try
            {
                if (capacityManager != null)
                {
                    MockStandardRetryPolicy.SetCapacityManagerInstance(capacityManager);
                }

                var retryPolicy = new MockStandardRetryPolicy(config);
                retryPolicy.ExponentialBase  = exponentialBase ?? retryPolicy.ExponentialBase;
                retryPolicy.ExponentialPower = exponentialPower ?? retryPolicy.ExponentialPower;

                Handler = new RetryHandler(retryPolicy);
                if (RuntimePipeline.Handlers.Find(h => h is RetryHandler) != null)
                {
                    RuntimePipeline.ReplaceHandler <RetryHandler>(Handler);
                }
                else
                {
                    RuntimePipeline.AddHandler(Handler);
                }

                var executionContext = CreateTestContext(null, null, config);

                DoAction(executionContext, retryPolicy);
            }
            finally
            {
                if (capacityManager != null)
                {
                    MockStandardRetryPolicy.RestoreManagers();
                }
            }
        }
 public static void SetCapacityManagerInstance(CapacityManager capacityManager)
 {
     _originalCapacityManager = CapacityManagerInstance;
     CapacityManagerInstance  = capacityManager;
 }