feat(worker): event sink records OnWriteComplete rows into the completion cache
This commit is contained in:
@@ -110,6 +110,47 @@ public sealed class MxAccessBaseEventSinkTests
|
||||
Assert.Same(cache, sink.ValueCache);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that an OnWriteComplete COM callback records the completion into
|
||||
/// the per-session write-completion cache for the executor's bounded reply
|
||||
/// wait AND still enqueues the event unchanged for the outbound stream —
|
||||
/// correlation observes the event, it never consumes it. The cache update
|
||||
/// fires only after the event has cleared the queue (post-publish rule).
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void OnWriteComplete_ComCallback_RecordsCompletionAndStillEnqueuesEvent()
|
||||
{
|
||||
MxAccessEventQueue queue = new();
|
||||
MxAccessWriteCompletionCache completionCache = new();
|
||||
MxAccessBaseEventSink sink = new(queue, new MxAccessEventMapper(), new MxAccessValueCache(), completionCache);
|
||||
MXSTATUS_PROXY[] statuses = Array.Empty<MXSTATUS_PROXY>();
|
||||
|
||||
sink.OnWriteComplete(hLMXServerHandle: 7, phItemHandle: 21, ref statuses);
|
||||
|
||||
Assert.Equal(1, queue.Count);
|
||||
Assert.True(queue.TryDequeue(out WorkerEvent? workerEvent));
|
||||
MxEvent mxEvent = workerEvent!.Event;
|
||||
Assert.Equal(MxEventFamily.OnWriteComplete, mxEvent.Family);
|
||||
Assert.Equal(7, mxEvent.ServerHandle);
|
||||
Assert.Equal(21, mxEvent.ItemHandle);
|
||||
Assert.Equal(1UL, completionCache.CurrentVersion(7, 21));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that the sink-bound write-completion cache is exposed for sharing
|
||||
/// with the owning <see cref="MxAccessSession"/> so the sink's recordings and
|
||||
/// the write executor's waits see the same instance.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void WriteCompletionCache_ReturnsTheInstanceBoundAtConstruction()
|
||||
{
|
||||
MxAccessEventQueue queue = new();
|
||||
MxAccessWriteCompletionCache completionCache = new();
|
||||
MxAccessBaseEventSink sink = new(queue, new MxAccessEventMapper(), new MxAccessValueCache(), completionCache);
|
||||
|
||||
Assert.Same(completionCache, sink.WriteCompletionCache);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that consecutive OnDataChange callbacks land in the queue with monotonic sequences.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user