Ejemplo n.º 1
0
        public async void RetryConfiguration_FiveRetries_RetriesExactlyFiveTimes()
        {
            var adapterSchedule = new TransientAdapterResponseType[6]
            {
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.ServerOk
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);

            int lastNumRetry = -1;

            RetryListener retryListener = (int numRetry, Retry retry) => { lastNumRetry = numRetry; };

            var config = new RetryConfiguration(baseDelayMs: 1, maxRetries: 5, retryListener);

            client.GlobalRetryConfiguration = config;

            Task <ISession> sessionTask = client.AuthenticateCustomAsync("test_id");

            ISession session = await sessionTask;

            Assert.NotNull(session);
            Assert.Equal(5, lastNumRetry);
        }
Ejemplo n.º 2
0
        public async void RetryConfiguration_PastMaxRetries_ThrowsTaskCancelledException()
        {
            var adapterSchedule = new TransientAdapterResponseType[4]
            {
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);

            int lastNumRetry = 3;

            RetryListener retryListener = (int numRetry, Retry retry) => { lastNumRetry = numRetry; };

            var config = new RetryConfiguration(baseDelayMs: 500, maxRetries: 3, retryListener);

            client.GlobalRetryConfiguration = config;

            Task <ISession> sessionTask = client.AuthenticateCustomAsync("test_id");

            await Assert.ThrowsAsync <TaskCanceledException>(async() => await sessionTask);

            Assert.Equal(3, lastNumRetry);
        }
Ejemplo n.º 3
0
        public async void RetryConfiguration_NoRetries_ThrowsBaseApiResponseException()
        {
            var adapterSchedule = new TransientAdapterResponseType[3]
            {
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);

            client.GlobalRetryConfiguration = new RetryConfiguration(baseDelayMs: 1, maxRetries: 0);

            try
            {
                await client.AuthenticateCustomAsync("test_id");

                throw new Exception("Test failed due to not throwing an exception");
            }
            catch (TaskCanceledException e)
            {
                Assert.True(e.GetBaseException() != null && e.GetBaseException() is ApiResponseException);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
Ejemplo n.º 4
0
        public async void RetryConfiguration_Delay_ExpectedExponentialTimes()
        {
            var adapterSchedule = new TransientAdapterResponseType[4]
            {
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.ServerOk
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);


            var retries = new List <Retry>();

            RetryListener retryListener = (int numRetry, Retry retry) => { retries.Add(retry); };

            var config = new RetryConfiguration(baseDelayMs: 10, maxRetries: 3, retryListener);

            client.GlobalRetryConfiguration = config;

            Task <ISession> sessionTask = client.AuthenticateCustomAsync("test_id");

            ISession session = await sessionTask;

            Assert.NotNull(session);

            Assert.Equal(10, retries[0].ExponentialBackoff);
            Assert.Equal(20, retries[1].ExponentialBackoff);
            Assert.Equal(40, retries[2].ExponentialBackoff);
        }
Ejemplo n.º 5
0
        public async void RetryConfiguration_OverrideSet_OverridesGlobal()
        {
            var adapterSchedule = new TransientAdapterResponseType[4]
            {
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.ServerOk
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);

            int lastNumRetry = -1;

            RetryListener retryListener = (int numRetry, Retry retry) => { lastNumRetry = numRetry; };

            var globalConfig = new RetryConfiguration(baseDelayMs: 10, maxRetries: 1, retryListener);

            client.GlobalRetryConfiguration = globalConfig;

            var localConfig = new RetryConfiguration(baseDelayMs: 10, maxRetries: 3, retryListener);
            var session     = await client.AuthenticateCustomAsync("test_id", null, true, null, localConfig);

            Assert.NotNull(session);
            Assert.Equal(3, lastNumRetry);
        }
Ejemplo n.º 6
0
        public async void TransientHttpAdapter_ServerDefault_CreatesSession()
        {
            var adapterSchedule = new TransientAdapterResponseType[1] {
                TransientAdapterResponseType.ServerOk
            };

            var      adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var      client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);
            ISession session = await client.AuthenticateCustomAsync("test_id");

            Assert.NotNull(session);
        }
Ejemplo n.º 7
0
        public async void RetryConfiguration_NonTransientError_Throws()
        {
            var adapterSchedule = new TransientAdapterResponseType[1]
            {
                TransientAdapterResponseType.NonTransientError,
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);

            client.GlobalRetryConfiguration = new RetryConfiguration(baseDelayMs: 1, maxRetries: 3);

            ApiResponseException e =
                await Assert.ThrowsAsync <ApiResponseException>(async() =>
                                                                await client.AuthenticateCustomAsync("test_id"));
        }
Ejemplo n.º 8
0
        public async void RetryConfiguration_NullConfiguration_DoesNotThrowNullRef()
        {
            var adapterSchedule = new TransientAdapterResponseType[3]
            {
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);

            client.GlobalRetryConfiguration = null;

            await Assert.ThrowsAsync <ApiResponseException>(async() => await client.AuthenticateCustomAsync("test_id"));
        }
Ejemplo n.º 9
0
        public async void TestCancelDuringBackoff()
        {
            var adapterSchedule = new TransientAdapterResponseType[3] {
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);

            var client = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);

            var canceller = new CancellationTokenSource();

            RetryListener retryListener = (int numRetry, Retry retry) => {
                canceller.Cancel();
            };


            Task <ISession> authTask = client.AuthenticateCustomAsync("test_id", null, true, null, new RetryConfiguration(100, 2, retryListener), canceller.Token);
            await Assert.ThrowsAsync <TaskCanceledException>(async() => await authTask);
        }
Ejemplo n.º 10
0
        Task <string> IHttpAdapter.SendAsync(string method, Uri uri, IDictionary <string, string> headers, byte[] body, int timeoutSec, CancellationToken?userCancelToken)
        {
            if (_sendAttempts > _sendSchedule.Length - 1)
            {
                throw new IndexOutOfRangeException("The number of send attempts has exceeded the length of the send schedule.");
            }

            TransientAdapterResponseType responseType = _sendSchedule[_sendAttempts];

            _sendAttempts++;

            switch (responseType)
            {
            case TransientAdapterResponseType.TransientError:
                throw new ApiResponseException(500, "This exception represents a transient error.", -1);

            case TransientAdapterResponseType.NonTransientError:
                throw new ApiResponseException(401, "This exception represents a non-transient error.", -1);

            default:
                return(_httpRequestAdapter.SendAsync(method, uri, headers, body, timeoutSec));
            }
        }
Ejemplo n.º 11
0
        public async void RetryConfiguration_Delay_ExpectedDelays()
        {
            var adapterSchedule = new TransientAdapterResponseType[3]
            {
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
                TransientAdapterResponseType.TransientError,
            };

            var adapter = new TransientExceptionHttpAdapter(adapterSchedule);
            var client  = TestsUtil.FromSettingsFile(TestsUtil.DefaultSettingsPath, adapter);
            var retries = new List <Retry>();

            RetryListener retryListener = (int numRetry, Retry retry) => { retries.Add(retry); };

            var config = new RetryConfiguration(baseDelayMs: 10, maxRetries: 3, retryListener);

            client.GlobalRetryConfiguration = config;

            DateTime timeBeforeRequest = DateTime.Now;
            DateTime timeAfterRequest  = default(DateTime);

            try
            {
                await client.AuthenticateCustomAsync("test_id");
            }
            catch
            {
                timeAfterRequest = DateTime.Now;
            }

            int expectedElapsedTime = retries.Sum(retry => retry.JitterBackoff);
            int actualElapsedTime   = (int)(timeAfterRequest - timeBeforeRequest).TotalMilliseconds;

            // actual will be slightly higher due to cpu elapsed time
            Assert.True(expectedElapsedTime < actualElapsedTime);
        }