@@ -372,4 +372,57 @@ public async Task WriteAsync_WhenTransportExceptionOnWriteInWriterSessionThenRec
372372 _mockStream . Verify ( stream => stream . MoveNextAsync ( ) , Times . Exactly ( 5 ) ) ;
373373 _mockStream . Verify ( stream => stream . Current , Times . Exactly ( 3 ) ) ;
374374 }
375+
376+ /*
377+ * Performed invocations:
378+
379+ Mock<IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>:1> (stream):
380+
381+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.Write({ "initRequest": { "path": "/topic", "producerId": "producerId" } })
382+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.MoveNextAsync()
383+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.Current
384+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.MoveNextAsync()
385+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.Write({ "initRequest": { "path": "/topic", "producerId": "producerId" } })
386+ IBidirectionalStream<StreamWriteMessage.Types.FromClient, StreamWriteMessage.Types.FromServer>.MoveNextAsync()
387+ */
388+ [ Fact ]
389+ public async Task WriteAsync_WhenTransportExceptionOnProcessingWriteAckThenReconnectSession_ReturnWriterException ( )
390+ {
391+ var nextCompleted = new TaskCompletionSource ( ) ;
392+ _mockStream . Setup ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) )
393+ . Returns ( Task . CompletedTask ) ;
394+ _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
395+ . Returns ( new ValueTask < bool > ( true ) )
396+ . ThrowsAsync ( new Driver . TransportException ( new RpcException ( Grpc . Core . Status . DefaultCancelled ) ) )
397+ . Returns ( ( ) =>
398+ {
399+ nextCompleted . SetResult ( ) ;
400+ return new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ;
401+ } ) ; // retry init writer session
402+ _mockStream . SetupSequence ( stream => stream . Current )
403+ . Returns ( new StreamWriteMessage . Types . FromServer
404+ {
405+ InitResponse = new StreamWriteMessage . Types . InitResponse
406+ { LastSeqNo = 0 , PartitionId = 1 , SessionId = "SessionId" } ,
407+ Status = StatusIds . Types . StatusCode . Success
408+ } )
409+ . Returns ( new StreamWriteMessage . Types . FromServer
410+ {
411+ InitResponse = new StreamWriteMessage . Types . InitResponse
412+ { LastSeqNo = 0 , PartitionId = 1 , SessionId = "SessionId" } ,
413+ Status = StatusIds . Types . StatusCode . Success
414+ } ) ;
415+ using var writer = new WriterBuilder < long > ( _mockIDriver . Object , new WriterConfig ( "/topic" )
416+ { ProducerId = "producerId" } ) . Build ( ) ;
417+
418+ await nextCompleted . Task ;
419+ var writerExceptionAfterResetSession = await Assert . ThrowsAsync < WriterException > ( ( ) => writer . WriteAsync ( 100 ) ) ;
420+ Assert . Equal ( "Transport error in the WriterSession on processing writeAck" ,
421+ writerExceptionAfterResetSession . Message ) ;
422+ Assert . Equal ( StatusCode . Cancelled , writerExceptionAfterResetSession . Status . StatusCode ) ;
423+
424+ _mockStream . Verify ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) , Times . Exactly ( 2 ) ) ;
425+ _mockStream . Verify ( stream => stream . MoveNextAsync ( ) , Times . Exactly ( 3 ) ) ;
426+ _mockStream . Verify ( stream => stream . Current , Times . Once ) ;
427+ }
375428}
0 commit comments