Skip to content

Commit d8545d0

Browse files
committed
[WIP] Chasing test suite issues
1 parent 81598b4 commit d8545d0

File tree

2 files changed

+70
-21
lines changed

2 files changed

+70
-21
lines changed

src/core/Akka.TestKit/TestKitBase_AwaitConditions.cs

+62-13
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void AwaitCondition(Func<bool> conditionIsFulfilled, CancellationToken ca
3838
AwaitConditionAsync(async () => conditionIsFulfilled(), cancellationToken)
3939
.WaitAndUnwrapException();
4040
}
41-
41+
4242
public async Task AwaitConditionAsync(Func<Task<bool>> conditionIsFulfilled, CancellationToken cancellationToken = default)
4343
{
4444
var maxDur = RemainingOrDefault;
@@ -71,15 +71,15 @@ public void AwaitCondition(Func<bool> conditionIsFulfilled, TimeSpan? max, Cance
7171
AwaitConditionAsync(async () => conditionIsFulfilled(), max, cancellationToken)
7272
.WaitAndUnwrapException(cancellationToken);
7373
}
74-
74+
7575
public async Task AwaitConditionAsync(Func<Task<bool>> conditionIsFulfilled, TimeSpan? max, CancellationToken cancellationToken = default)
7676
{
7777
var maxDur = RemainingOrDilated(max);
7878
var interval = new TimeSpan(maxDur.Ticks / 10);
7979
var logger = _testState.TestKitSettings.LogTestKitCalls ? _testState.Log : null;
8080
await InternalAwaitConditionAsync(conditionIsFulfilled, maxDur, interval, (format, args) => _assertions.Fail(format, args), logger, cancellationToken);
8181
}
82-
82+
8383
/// <summary>
8484
/// <para>Await until the given condition evaluates to <c>true</c> or the timeout
8585
/// expires, whichever comes first.</para>
@@ -105,7 +105,7 @@ public void AwaitCondition(Func<bool> conditionIsFulfilled, TimeSpan? max, strin
105105
AwaitConditionAsync(async () => conditionIsFulfilled(), max, message, cancellationToken)
106106
.WaitAndUnwrapException();
107107
}
108-
108+
109109
public async Task AwaitConditionAsync(Func<Task<bool>> conditionIsFulfilled, TimeSpan? max, string message, CancellationToken cancellationToken = default)
110110
{
111111
var maxDur = RemainingOrDilated(max);
@@ -143,16 +143,16 @@ public async Task AwaitConditionAsync(Func<Task<bool>> conditionIsFulfilled, Tim
143143
/// <param name="message">The message used if the timeout expires.</param>
144144
/// <param name="cancellationToken"></param>
145145
public void AwaitCondition(Func<bool> conditionIsFulfilled, TimeSpan? max, TimeSpan? interval, string message = null, CancellationToken cancellationToken = default)
146-
{
146+
{
147147
AwaitConditionAsync(async () => conditionIsFulfilled(), max, interval, message, cancellationToken)
148148
.WaitAndUnwrapException(cancellationToken);
149149
}
150-
150+
151151
public async Task AwaitConditionAsync(Func<Task<bool>> conditionIsFulfilled, TimeSpan? max, TimeSpan? interval, string message = null, CancellationToken cancellationToken = default)
152152
{
153153
var maxDur = RemainingOrDilated(max);
154154
var logger = _testState.TestKitSettings.LogTestKitCalls ? _testState.Log : null;
155-
await InternalAwaitConditionAsync(conditionIsFulfilled, maxDur, interval,
155+
await InternalAwaitConditionAsync(conditionIsFulfilled, maxDur, interval,
156156
(format, args) => AssertionsFail(format, args, message), logger, cancellationToken);
157157
}
158158

@@ -179,7 +179,7 @@ public bool AwaitConditionNoThrow(Func<bool> conditionIsFulfilled, TimeSpan max,
179179
return AwaitConditionNoThrowAsync(async () => conditionIsFulfilled(), max, interval, cancellationToken)
180180
.WaitAndUnwrapException(cancellationToken);
181181
}
182-
182+
183183
public Task<bool> AwaitConditionNoThrowAsync(Func<Task<bool>> conditionIsFulfilled, TimeSpan max, TimeSpan? interval = null, CancellationToken cancellationToken = default)
184184
{
185185
var intervalDur = interval.GetValueOrDefault(TimeSpan.FromMilliseconds(100));
@@ -218,7 +218,7 @@ protected static bool InternalAwaitCondition(Func<bool> conditionIsFulfilled, Ti
218218
{
219219
return InternalAwaitCondition(conditionIsFulfilled, max, interval, fail, null, cancellationToken);
220220
}
221-
221+
222222
protected static Task<bool> InternalAwaitConditionAsync(Func<Task<bool>> conditionIsFulfilled, TimeSpan max, TimeSpan? interval, Action<string, object[]> fail
223223
, CancellationToken cancellationToken = default)
224224
{
@@ -258,7 +258,7 @@ protected static bool InternalAwaitCondition(Func<bool> conditionIsFulfilled, Ti
258258
{
259259
return InternalAwaitConditionAsync(async () => conditionIsFulfilled(), max, interval, fail, logger, cancellationToken)
260260
.WaitAndUnwrapException(cancellationToken);
261-
261+
262262
}
263263

264264
protected static async Task<bool> InternalAwaitConditionAsync(Func<Task<bool>> conditionIsFulfilled, TimeSpan max, TimeSpan? interval, Action<string, object[]> fail, ILoggingAdapter logger, CancellationToken cancellationToken = default)
@@ -293,10 +293,59 @@ protected static async Task<bool> InternalAwaitConditionAsync(Func<Task<bool>> c
293293
return true;
294294
}
295295

296-
private static void ConditionalLog(ILoggingAdapter logger, string format, params object[] args)
296+
protected void AwaitCond(Func<bool> p, TimeSpan? max = null, TimeSpan? interval = null, string message = "")
297297
{
298-
if (logger != null)
299-
logger.Debug(format, args);
298+
if (interval == null) interval = TimeSpan.FromMilliseconds(100);
299+
300+
var dilatedMax = RemainingOrDilated(max);
301+
var stop = Now + dilatedMax;
302+
303+
void Poll(TimeSpan t)
304+
{
305+
if (!p())
306+
{
307+
_assertions.AssertTrue(Now < stop, $"timeout {dilatedMax} expired: {message}");
308+
Thread.Sleep(t);
309+
Poll((stop - Now).Min(interval.Value));
310+
}
311+
}
312+
313+
Poll(dilatedMax.Min(interval.Value));
300314
}
315+
316+
protected void Within(TimeSpan max, Action f) =>
317+
Within(TimeSpan.Zero, max, f);
318+
319+
protected void Within(TimeSpan min, TimeSpan max, Action f)
320+
{
321+
var dilatedMax = Dilated(max);
322+
var start = Now;
323+
var rem = _testState.End.HasValue ? _testState.End.Value - start : Timeout.InfiniteTimeSpan;
324+
_assertions.AssertTrue(rem.IsInfiniteTimeout() || rem >= min, "Required min time {0} not possible, only {1} left.", min, rem);
325+
326+
_testState.LastWasNoMsg = false;
327+
328+
var maxDiff = dilatedMax.Min(rem);
329+
var prevEnd = _testState.End;
330+
_testState.End = start + maxDiff;
331+
332+
try
333+
{
334+
f();
335+
}
336+
finally
337+
{
338+
_testState.End = prevEnd;
339+
}
340+
341+
var diff = Now - start;
342+
_assertions.AssertTrue(min <= diff, $"block took {diff}, should at least have been {min}");
343+
if (!_testState.LastWasNoMsg)
344+
{
345+
_assertions.AssertTrue(diff <= maxDiff, $"block took {diff}, exceeding {maxDiff}");
346+
}
347+
}
348+
349+
private static void ConditionalLog(ILoggingAdapter logger, string format, params object[] args) => logger?.Info(format, args);
301350
}
302351
}

src/core/Akka.Tests/Pattern/CircuitBreakerSpec.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ public void Must_increment_failure_count_on_callTimeout_before_call_finishes()
8383
{
8484
var breaker = ShortCallTimeoutCb();
8585
Task.Run(() => breaker.Instance.WithSyncCircuitBreaker(() => Thread.Sleep(Dilated(TimeSpan.FromSeconds(1)))));
86-
Within(TimeSpan.FromMilliseconds(900),
87-
() => AwaitCondition(() => breaker.Instance.CurrentFailureCount == 1, Dilated(TimeSpan.FromMilliseconds(100))));
86+
Within(TimeSpan.FromMilliseconds(900),
87+
() => AwaitCond(() => breaker.Instance.CurrentFailureCount == 1, Dilated(TimeSpan.FromMilliseconds(100))));
8888
}
8989
}
9090

@@ -323,7 +323,7 @@ public async Task Must_increase_reset_timeout_after_it_transits_to_open_again()
323323
_ = breaker.Instance.WithCircuitBreaker(() => Task.Run(ThrowException));
324324
Assert.True(CheckLatch(breaker.OpenLatch));
325325

326-
var e1 = await InterceptException<OpenCircuitException>(
326+
var e1 = await InterceptException<OpenCircuitException>(
327327
() => breaker.Instance.WithCircuitBreaker(() => Task.Run(ThrowException)));
328328
var shortRemainingDuration = e1.RemainingDuration;
329329

@@ -379,23 +379,23 @@ protected static async Task<T> InterceptException<T>(Func<Task> actionThatThrows
379379
throw new ThrowsException(typeof(T));
380380
}
381381

382-
public TestBreaker ShortCallTimeoutCb() =>
382+
public TestBreaker ShortCallTimeoutCb() =>
383383
new TestBreaker(new CircuitBreaker(Sys.Scheduler, 1, Dilated(TimeSpan.FromMilliseconds(50)), Dilated(TimeSpan.FromMilliseconds(500))));
384384

385-
public TestBreaker ShortResetTimeoutCb() =>
385+
public TestBreaker ShortResetTimeoutCb() =>
386386
new TestBreaker(new CircuitBreaker(Sys.Scheduler, 1, Dilated(TimeSpan.FromMilliseconds(1000)), Dilated(TimeSpan.FromMilliseconds(50))));
387387

388-
public TestBreaker LongCallTimeoutCb() =>
388+
public TestBreaker LongCallTimeoutCb() =>
389389
new TestBreaker(new CircuitBreaker(Sys.Scheduler, 1, TimeSpan.FromSeconds(5), Dilated(TimeSpan.FromMilliseconds(500))));
390390

391391
public TimeSpan LongResetTimeout = TimeSpan.FromSeconds(5);
392392
public TestBreaker LongResetTimeoutCb() =>
393393
new TestBreaker(new CircuitBreaker(Sys.Scheduler, 1, Dilated(TimeSpan.FromMilliseconds(100)), Dilated(LongResetTimeout)));
394394

395-
public TestBreaker MultiFailureCb() =>
395+
public TestBreaker MultiFailureCb() =>
396396
new TestBreaker(new CircuitBreaker(Sys.Scheduler, 5, Dilated(TimeSpan.FromMilliseconds(200)), Dilated(TimeSpan.FromMilliseconds(500))));
397397

398-
public TestBreaker NonOneFactorCb() =>
398+
public TestBreaker NonOneFactorCb() =>
399399
new TestBreaker(new CircuitBreaker(Sys.Scheduler, 1, Dilated(TimeSpan.FromMilliseconds(2000)), Dilated(TimeSpan.FromMilliseconds(1000)), Dilated(TimeSpan.FromDays(1)), 5, 0));
400400
}
401401

0 commit comments

Comments
 (0)