Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

87 lines
4.3 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.Infrastructure
{
using System.Collections.Generic;
using Xunit;
public class ExponentialRetryDelayStrategyTests
{
[Fact]
public void Constructor_throws_on_invalid_parameters()
{
Assert.Equal(
"maxRetryCount",
Assert.Throws<ArgumentOutOfRangeException>(
() =>
new ExponentialRetryDelayStrategy(
maxRetryCount: -1, minDelay: TimeSpan.FromTicks(0), maxDelay: TimeSpan.FromTicks(0), maxRandomFactor: 1,
exponentialBase: 1, coefficient: TimeSpan.FromTicks(0))).ParamName);
Assert.Equal(
"minDelay",
Assert.Throws<ArgumentOutOfRangeException>(
() =>
new ExponentialRetryDelayStrategy(
maxRetryCount: 0, minDelay: TimeSpan.FromTicks(-1), maxDelay: TimeSpan.FromTicks(0), maxRandomFactor: 1,
exponentialBase: 1, coefficient: TimeSpan.FromTicks(0))).ParamName);
var maxDelayException = Assert.Throws<ArgumentOutOfRangeException>(
() =>
new ExponentialRetryDelayStrategy(
maxRetryCount: 0, minDelay: TimeSpan.FromTicks(0), maxDelay: TimeSpan.FromTicks(-1), maxRandomFactor: 1,
exponentialBase: 1, coefficient: TimeSpan.FromTicks(0)));
maxDelayException.ValidateMessage("ExecutionStrategy_MinimumMustBeLessThanMaximum", "maxDelay");
Assert.Equal(
"maxRandomFactor",
Assert.Throws<ArgumentOutOfRangeException>(
() =>
new ExponentialRetryDelayStrategy(
maxRetryCount: 0, minDelay: TimeSpan.FromTicks(0), maxDelay: TimeSpan.FromTicks(0), maxRandomFactor: 0,
exponentialBase: 1, coefficient: TimeSpan.FromTicks(0))).ParamName);
Assert.Equal(
"exponentialBase",
Assert.Throws<ArgumentOutOfRangeException>(
() =>
new ExponentialRetryDelayStrategy(
maxRetryCount: 0, minDelay: TimeSpan.FromTicks(0), maxDelay: TimeSpan.FromTicks(0), maxRandomFactor: 1,
exponentialBase: 0, coefficient: TimeSpan.FromTicks(0))).ParamName);
Assert.Equal(
"coefficient",
Assert.Throws<ArgumentOutOfRangeException>(
() =>
new ExponentialRetryDelayStrategy(
maxRetryCount: 0, minDelay: TimeSpan.FromTicks(0), maxDelay: TimeSpan.FromTicks(0), maxRandomFactor: 1,
exponentialBase: 1, coefficient: TimeSpan.FromTicks(-1))).ParamName);
}
[Fact]
public void GetNextDelay_returns_the_expected_default_sequence()
{
var strategy = new ExponentialRetryDelayStrategy();
var delays = new List<TimeSpan>();
TimeSpan? nextDelay;
while ((nextDelay = strategy.GetNextDelay(null)) != null)
{
delays.Add(nextDelay.Value);
}
var expectedDelays = new List<TimeSpan>
{
TimeSpan.FromSeconds(0),
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(3),
TimeSpan.FromSeconds(7),
TimeSpan.FromSeconds(15)
};
Assert.Equal(expectedDelays.Count, delays.Count);
for (var i = 0; i < expectedDelays.Count; i++)
{
Assert.True(
(delays[i] - expectedDelays[i]).TotalMilliseconds <=
expectedDelays[i].TotalMilliseconds * (ExponentialRetryDelayStrategy.DefaultRandomFactor - 1.0) + 1,
string.Format("Expected: {0}; Actual: {1}", expectedDelays[i], delays[i]));
}
}
}
}