public async Task DpsPollyRetryExecuteAsyncTest(Type actualEx, HttpStatusCode?code) { // Delay時間の指定は、テスト時間を縮めるため DpsPolly target = CreateTestTarget(1, 2); var startAt = DateTime.UtcNow; int execCount = 0; try { await target.ExecuteAsync(() => { execCount++; throw CreateException(actualEx, code); }); } catch (Exception) { // リトライ1回なので、2回実行 Assert.AreEqual(2, execCount); // 2秒(1 * 2)以上経過しているはず。 var elapsedTime = DateTime.UtcNow - startAt; // 本来なら期待結果を2にしたいが、微妙な揺らぎで1.999xになることがあるため、1.9とする。 Assert.AreEqual(-1, TimeSpan.FromSeconds(1.9).CompareTo(elapsedTime), $"経過時間:{elapsedTime}"); return; } Assert.Fail(); }
public async Task DpsPollyExecuteAsyncDefaultTest() { // アプリケーション設定がない場合デフォルト設定(3回、3秒)で動作する DpsPolly target = CreateTestTarget(); var startAt = DateTime.UtcNow; int execCount = 0; try { // 引数を付けているのはUnauthorizedExceptionは引数つきコンストラクタしかないため。 await target.ExecuteAsync(() => { execCount++; throw CreateDpsException(HttpStatusCode.Forbidden); }); } catch (Exception) { // 初回 + リトライ回数を期待する Assert.AreEqual(4, execCount); // 18秒(0 + 3 + 6 + 9)以上経過しているはず。 var elapsedTime = DateTime.UtcNow - startAt; Assert.AreEqual(-1, TimeSpan.FromSeconds(18).CompareTo(elapsedTime), $"経過時間:{elapsedTime}"); return; } Assert.Fail(); }
public async Task DpsPollyNoRetryExecuteAsyncTest(Type actualEx, HttpStatusCode?code) { DpsPolly target = CreateTestTarget(); int execCount = 0; try { await target.ExecuteAsync(() => { execCount++; throw CreateException(actualEx, code); }); } catch (Exception) { Assert.AreEqual(1, execCount); return; } Assert.Fail(); }
public async Task DpsPollyNoRetryExecuteAsyncWithInnerExTest(HttpStatusCode statusCode) { DpsPolly target = CreateTestTarget(); var executedCount = 0; try { #pragma warning disable 1998 await target.ExecuteAsync(async() => { executedCount++; throw CreateInnerDpsException(statusCode); }); #pragma warning restore 1998 } catch (Exception) { Assert.AreEqual(1, executedCount); return; } Assert.Fail(); }