test: stabilize load-sensitive release contracts

This commit is contained in:
Erik 2026-08-18 11:50:23 +02:00
parent c8c764a40e
commit dfc841b779
8 changed files with 199 additions and 43 deletions

View file

@ -759,7 +759,7 @@ public sealed class NakEmissionTests
/// retail-faithful steady state). The session survives the whole run.
/// </summary>
[Fact]
public void LossSoak_TwoPercentBidirectional_ZeroMessageLoss_LedgersConverge()
public async Task LossSoak_TwoPercentBidirectional_ZeroMessageLoss_LedgersConverge()
{
var transport = new FakeAceTransport();
var session = new WorldSession(
@ -808,7 +808,7 @@ public sealed class NakEmissionTests
session.Tick();
if ((i & 15) == 0)
Thread.Sleep(1);
await Task.Yield();
if (i % 500 == 0)
{
@ -837,16 +837,18 @@ public sealed class NakEmissionTests
// recoverable once further sequenced C2S traffic arrives. Real
// clients keep talking; the trickle models that.
int trickle = 0;
DateTime deadline = DateTime.UtcNow.AddSeconds(60);
while (DateTime.UtcNow < deadline
&& (s2cReceived != MessagesEachWay
|| c2sDispatched != MessagesEachWay))
const int MaxConvergenceSteps = 120; // 60 virtual seconds at 0.5 s/step
for (int step = 0;
step < MaxConvergenceSteps
&& (s2cReceived != MessagesEachWay
|| c2sDispatched != MessagesEachWay);
step++)
{
transport.Clock.Advance(TimeSpan.FromMilliseconds(500));
session.SendTalk($"trickle {trickle++}");
transport.PumpServer();
session.Tick();
Thread.Sleep(1);
await Task.Yield();
}
// Convergence phase 2: quiet drain. Acks keep flowing on the
@ -856,7 +858,7 @@ public sealed class NakEmissionTests
// traffic (two arrivals) before ACE's gap detection can fire —
// an occasional healer send, only while the cache is stuck.
int quietIterations = 0;
while (DateTime.UtcNow < deadline)
for (int step = 0; step < MaxConvergenceSteps; step++)
{
transport.Clock.Advance(TimeSpan.FromMilliseconds(500));
if (session.Transport!.Outbound.CacheDepth > 1
@ -867,7 +869,7 @@ public sealed class NakEmissionTests
transport.PumpServer();
session.Tick();
Thread.Sleep(1);
await Task.Yield();
if (s2cReceived == MessagesEachWay
&& c2sDispatched == MessagesEachWay