@@ -318,7 +318,7 @@ public async Task WriteAsync_WhenTransportExceptionOnWriteInWriterSessionThenRec
318318 return Task . CompletedTask ;
319319 } ) ;
320320 _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
321- . Returns ( new ValueTask < bool > ( true ) )
321+ . ReturnsAsync ( true )
322322 . Returns ( new ValueTask < bool > ( moveFirstNextSource . Task ) )
323323 . Returns ( new ValueTask < bool > ( moveSecondNextSource . Task ) )
324324 . Returns ( new ValueTask < bool > ( moveThirdNextSource . Task ) )
@@ -392,7 +392,7 @@ public async Task WriteAsync_WhenTransportExceptionOnProcessingWriteAckThenRecon
392392 _mockStream . Setup ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) )
393393 . Returns ( Task . CompletedTask ) ;
394394 _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
395- . Returns ( new ValueTask < bool > ( true ) )
395+ . ReturnsAsync ( true )
396396 . ThrowsAsync ( new Driver . TransportException ( new RpcException ( Grpc . Core . Status . DefaultCancelled ) ) )
397397 . Returns ( ( ) =>
398398 {
@@ -425,4 +425,56 @@ public async Task WriteAsync_WhenTransportExceptionOnProcessingWriteAckThenRecon
425425 _mockStream . Verify ( stream => stream . MoveNextAsync ( ) , Times . Exactly ( 3 ) ) ;
426426 _mockStream . Verify ( stream => stream . Current , Times . Once ) ;
427427 }
428+
429+ /*
430+ * Performed invocations:
431+
432+ Mock<IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>:1> (stream):
433+
434+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.Write({ "initRequest": { "path": "/topic", "producerId": "producerId" } })
435+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.MoveNextAsync()
436+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.Current
437+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.MoveNextAsync()
438+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.Write({ "initRequest": { "path": "/topic", "producerId": "producerId" } })
439+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.MoveNextAsync()
440+ */
441+ [ Fact ]
442+ public async Task WriteAsync_WhenStreamIsClosingOnProcessingWriteAckThenReconnectSession_ReturnWriterException ( )
443+ {
444+ var nextCompleted = new TaskCompletionSource ( ) ;
445+ _mockStream . Setup ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) )
446+ . Returns ( Task . CompletedTask ) ;
447+ _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
448+ . ReturnsAsync ( true )
449+ . ReturnsAsync ( false )
450+ . Returns ( ( ) =>
451+ {
452+ nextCompleted . SetResult ( ) ;
453+ return new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ;
454+ } ) ; // retry init writer session
455+ _mockStream . SetupSequence ( stream => stream . Current )
456+ . Returns ( new StreamWriteMessage . Types . FromServer
457+ {
458+ InitResponse = new StreamWriteMessage . Types . InitResponse
459+ { LastSeqNo = 0 , PartitionId = 1 , SessionId = "SessionId" } ,
460+ Status = StatusIds . Types . StatusCode . Success
461+ } )
462+ . Returns ( new StreamWriteMessage . Types . FromServer
463+ {
464+ InitResponse = new StreamWriteMessage . Types . InitResponse
465+ { LastSeqNo = 0 , PartitionId = 1 , SessionId = "SessionId" } ,
466+ Status = StatusIds . Types . StatusCode . Success
467+ } ) ;
468+ using var writer = new WriterBuilder < long > ( _mockIDriver . Object , new WriterConfig ( "/topic" )
469+ { ProducerId = "producerId" } ) . Build ( ) ;
470+
471+ await nextCompleted . Task ;
472+ var writerExceptionAfterResetSession = await Assert . ThrowsAsync < WriterException > ( ( ) => writer . WriteAsync ( 100 ) ) ;
473+ Assert . Equal ( "WriterStream is closed" , writerExceptionAfterResetSession . Message ) ;
474+ Assert . Equal ( StatusCode . Unspecified , writerExceptionAfterResetSession . Status . StatusCode ) ;
475+
476+ _mockStream . Verify ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) , Times . Exactly ( 2 ) ) ;
477+ _mockStream . Verify ( stream => stream . MoveNextAsync ( ) , Times . Exactly ( 3 ) ) ;
478+ _mockStream . Verify ( stream => stream . Current , Times . Once ) ;
479+ }
428480}
0 commit comments