test: observe monitor waits without delays

This commit is contained in:
Erik 2026-08-18 12:56:25 +02:00
parent ea17bc8624
commit fa4bdfe89f
4 changed files with 127 additions and 35 deletions

View file

@ -427,21 +427,38 @@ public sealed class LiveSessionCommandRouterTests
router.Publish(new SendServerCommandCmd("@active")));
Assert.True(sendEntered.Wait(TimeSpan.FromSeconds(5)));
using var disposeStarted = new ManualResetEventSlim();
Task dispose = Task.Run(() =>
Exception? disposeError = null;
var disposeThread = new Thread(() =>
{
disposeStarted.Set();
router.Dispose();
});
Assert.True(disposeStarted.Wait(TimeSpan.FromSeconds(5)));
Task firstCompletion = await Task.WhenAny(
dispose,
Task.Delay(TimeSpan.FromMilliseconds(100)));
Assert.NotSame(dispose, firstCompletion);
try
{
router.Dispose();
}
catch (Exception error)
{
disposeError = error;
}
})
{
IsBackground = true,
Name = "LiveSessionCommandRouter concurrent dispose contract",
};
disposeThread.Start();
bool disposeStartedInTime = disposeStarted.Wait(TimeSpan.FromSeconds(5));
bool disposeBlockedOnTransport = disposeStartedInTime && SpinWait.SpinUntil(
() => (disposeThread.ThreadState & ThreadState.WaitSleepJoin) != 0,
TimeSpan.FromSeconds(5));
releaseSend.Set();
await Task.WhenAll(publish, dispose);
await publish;
bool disposeJoined = disposeThread.Join(TimeSpan.FromSeconds(5));
router.Publish(new SendServerCommandCmd("@after"));
Assert.True(disposeStartedInTime, "the dedicated dispose thread did not start");
Assert.True(disposeBlockedOnTransport, "dispose never waited for the in-flight send");
Assert.True(disposeJoined, "dispose did not finish after the send returned");
Assert.Null(disposeError);
Assert.Equal(["@active"], sent);
Assert.False(router.IsActive);
}