@@ -18,6 +18,7 @@ public class WriterUnitTests
1818{
1919 private readonly Mock < IDriver > _mockIDriver = new ( ) ;
2020 private readonly Mock < WriterStream > _mockStream = new ( ) ;
21+ private readonly ValueTask < bool > _lastMoveNext ;
2122
2223 public WriterUnitTests ( )
2324 {
@@ -27,6 +28,16 @@ public WriterUnitTests()
2728 ) . Returns ( _mockStream . Object ) ;
2829
2930 _mockIDriver . Setup ( driver => driver . LoggerFactory ) . Returns ( Utils . GetLoggerFactory ) ;
31+
32+ var tcsLastMoveNext = new TaskCompletionSource < bool > ( ) ;
33+
34+ _lastMoveNext = new ValueTask < bool > ( tcsLastMoveNext . Task ) ;
35+ _mockStream . Setup ( stream => stream . RequestStreamComplete ( ) ) . Returns ( ( ) =>
36+ {
37+ tcsLastMoveNext . TrySetResult ( false ) ;
38+
39+ return Task . CompletedTask ;
40+ } ) ;
3041 }
3142
3243 private class FailSerializer : ISerializer < int >
@@ -43,6 +54,12 @@ public async Task WriteAsync_WhenSerializeThrowException_ThrowWriterException()
4354 await using var writer = new WriterBuilder < int > ( _mockIDriver . Object , "/topic-1" )
4455 { ProducerId = "producerId" , Serializer = new FailSerializer ( ) } . Build ( ) ;
4556
57+ _mockStream . Setup ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) )
58+ . Returns ( Task . CompletedTask ) ;
59+ _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
60+ . ReturnsAsync ( true )
61+ . Returns ( _lastMoveNext ) ;
62+
4663 Assert . Equal ( "Error when serializing message data" ,
4764 ( await Assert . ThrowsAsync < WriterException > ( ( ) => writer . WriteAsync ( 123 ) ) ) . Message ) ;
4865 }
@@ -78,7 +95,7 @@ public async Task Initialize_WhenStreamClosedByServer_ShouldRetryInitializeAndRe
7895 . ReturnsAsync ( false )
7996 . ReturnsAsync ( true )
8097 . Returns ( ( ) => new ValueTask < bool > ( taskNextComplete . Task ) )
81- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
98+ . Returns ( _lastMoveNext ) ;
8299
83100 SetupReadOneWriteAckMessage ( ) ;
84101
@@ -122,7 +139,7 @@ public async Task Initialize_WhenFailWriteMessage_ShouldRetryInitializeAndReturn
122139 _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
123140 . ReturnsAsync ( true )
124141 . Returns ( ( ) => new ValueTask < bool > ( taskNextComplete . Task ) )
125- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
142+ . Returns ( _lastMoveNext ) ;
126143
127144 SetupReadOneWriteAckMessage ( ) ;
128145
@@ -170,7 +187,7 @@ public async Task Initialize_WhenFailMoveNextAsync_ShouldRetryInitializeAndRetur
170187 new RpcException ( new Grpc . Core . Status ( Grpc . Core . StatusCode . DeadlineExceeded , "Some message" ) ) ) )
171188 . ReturnsAsync ( true )
172189 . Returns ( ( ) => new ValueTask < bool > ( taskNextComplete . Task ) )
173- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
190+ . Returns ( _lastMoveNext ) ;
174191
175192 SetupReadOneWriteAckMessage ( ) ;
176193
@@ -218,8 +235,7 @@ public async Task Initialize_WhenInitResponseStatusIsRetryable_ShouldRetryInitia
218235 . ReturnsAsync ( true )
219236 . ReturnsAsync ( true )
220237 . Returns ( ( ) => new ValueTask < bool > ( taskNextComplete . Task ) )
221- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
222-
238+ . Returns ( _lastMoveNext ) ;
223239
224240 _mockStream . SetupSequence ( stream => stream . Current )
225241 . Returns ( new StreamWriteMessage . Types . FromServer
@@ -357,7 +373,7 @@ public async Task WriteAsync_WhenTransportExceptionOnWriteInWriterSession_Should
357373 . Returns ( new ValueTask < bool > ( moveTcs . Task ) )
358374 . ReturnsAsync ( true )
359375 . ReturnsAsync ( true )
360- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
376+ . Returns ( _lastMoveNext ) ;
361377 _mockStream . SetupSequence ( stream => stream . Current )
362378 . Returns ( new StreamWriteMessage . Types . FromServer
363379 {
@@ -431,7 +447,7 @@ public async Task WriteAsync_WhenTransportExceptionOnProcessingWriteAck_ShouldRe
431447 . ThrowsAsync ( new Driver . TransportException ( new RpcException ( Grpc . Core . Status . DefaultCancelled ) ) )
432448 . ReturnsAsync ( true )
433449 . Returns ( ( ) => new ValueTask < bool > ( moveTcs . Task ) ) // retry init writer session
434- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
450+ . Returns ( _lastMoveNext ) ;
435451 _mockStream . SetupSequence ( stream => stream . Current )
436452 . Returns ( new StreamWriteMessage . Types . FromServer
437453 {
@@ -506,7 +522,7 @@ public async Task WriteAsync_WhenStreamIsClosingOnProcessingWriteAck_ShouldRecon
506522 . ReturnsAsync ( false )
507523 . ReturnsAsync ( true )
508524 . Returns ( ( ) => new ValueTask < bool > ( moveTcs . Task ) ) // retry init writer session
509- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
525+ . Returns ( _lastMoveNext ) ;
510526 _mockStream . SetupSequence ( stream => stream . Current )
511527 . Returns ( new StreamWriteMessage . Types . FromServer
512528 {
@@ -558,7 +574,7 @@ public async Task WriteAsync_WhenCancellationTokenIsClosed_ThrowCancellationExce
558574 . Returns ( Task . CompletedTask ) ;
559575 _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
560576 . ReturnsAsync ( true )
561- . Returns ( new ValueTask < bool > ( nextCompleted . Task ) ) ;
577+ . Returns ( _lastMoveNext ) ;
562578 SetupReadOneWriteAckMessage ( ) ;
563579
564580 await using var writer = new WriterBuilder < long > ( _mockIDriver . Object , "/topic-11" )
@@ -581,7 +597,8 @@ public async Task WriteAsync_WhenTaskIsAcceptedBeforeCancel_ReturnWrittenStatus(
581597 . Returns ( Task . CompletedTask ) ;
582598 _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
583599 . ReturnsAsync ( true )
584- . Returns ( new ValueTask < bool > ( nextCompleted . Task ) ) ;
600+ . Returns ( new ValueTask < bool > ( nextCompleted . Task ) )
601+ . Returns ( _lastMoveNext ) ;
585602 SetupReadOneWriteAckMessage ( ) ;
586603
587604 await using var writer = new WriterBuilder < long > ( _mockIDriver . Object , "/topic-12" )
@@ -647,7 +664,7 @@ public async Task WriteAsync_WhenInFlightBufferSendInInitialize_ReturnCompletedT
647664 . Returns ( new ValueTask < bool > ( moveTcs . Task ) )
648665 . ReturnsAsync ( true )
649666 . ReturnsAsync ( true )
650- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
667+ . Returns ( _lastMoveNext ) ;
651668 _mockStream . SetupSequence ( stream => stream . Current )
652669 . Returns ( new StreamWriteMessage . Types . FromServer
653670 {
@@ -784,7 +801,7 @@ public async Task WriteAsync_WhenTokenIsUpdatedOneTime_SuccessUpdateToken()
784801 . Returns ( new ValueTask < bool > ( writeTcs1 . Task ) )
785802 . Returns ( new ValueTask < bool > ( writeTcs2 . Task ) )
786803 . Returns ( new ValueTask < bool > ( writeTcs3 . Task ) )
787- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
804+ . Returns ( _lastMoveNext ) ;
788805
789806 SetupReadOneWriteAckMessage ( )
790807 . Returns ( new StreamWriteMessage . Types . FromServer
@@ -861,7 +878,7 @@ public async Task DisposeAsync_WhenInFlightMessages_WaitingInFlightMessages()
861878 . Returns ( new ValueTask < bool > ( writeTcs1 . Task ) )
862879 . ReturnsAsync ( true )
863880 . ReturnsAsync ( true )
864- . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
881+ . Returns ( _lastMoveNext ) ;
865882
866883 _mockStream . SetupSequence ( stream => stream . Current )
867884 . Returns ( new StreamWriteMessage . Types . FromServer
0 commit comments