@@ -841,6 +841,82 @@ public async Task WriteAsync_WhenTokenIsUpdatedOneTime_SuccessUpdateToken()
841841 msg . UpdateTokenRequest . Token == "Token2" ) ) ) ;
842842 }
843843
844+ [ Fact ]
845+ public async Task DisposeAsync_WhenInFlightMessages_WaitingInFlightMessages ( )
846+ {
847+ var tcsDetectedWrite = new TaskCompletionSource ( ) ;
848+ var writeTcs1 = new TaskCompletionSource < bool > ( ) ;
849+
850+ _mockStream . SetupSequence ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) )
851+ . Returns ( Task . CompletedTask )
852+ . Returns ( ( ) =>
853+ {
854+ tcsDetectedWrite . TrySetResult ( ) ;
855+ return Task . CompletedTask ;
856+ } )
857+ . Returns ( Task . CompletedTask )
858+ . Returns ( Task . CompletedTask ) ;
859+ _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
860+ . ReturnsAsync ( true )
861+ . Returns ( new ValueTask < bool > ( writeTcs1 . Task ) )
862+ . ReturnsAsync ( true )
863+ . ReturnsAsync ( true )
864+ . Returns ( new ValueTask < bool > ( new TaskCompletionSource < bool > ( ) . Task ) ) ;
865+
866+ _mockStream . SetupSequence ( stream => stream . Current )
867+ . Returns ( new StreamWriteMessage . Types . FromServer
868+ {
869+ InitResponse = new StreamWriteMessage . Types . InitResponse
870+ { LastSeqNo = 0 , PartitionId = 1 , SessionId = "SessionId" } ,
871+ Status = StatusIds . Types . StatusCode . Success
872+ } )
873+ . Returns ( new StreamWriteMessage . Types . FromServer
874+ {
875+ InitResponse = new StreamWriteMessage . Types . InitResponse
876+ { LastSeqNo = 0 , PartitionId = 1 , SessionId = "SessionId" } ,
877+ Status = StatusIds . Types . StatusCode . Success
878+ } )
879+ . Returns ( new StreamWriteMessage . Types . FromServer
880+ {
881+ WriteResponse = new StreamWriteMessage . Types . WriteResponse
882+ {
883+ PartitionId = 1 ,
884+ Acks =
885+ {
886+ new StreamWriteMessage . Types . WriteResponse . Types . WriteAck
887+ {
888+ SeqNo = 1 ,
889+ Written = new StreamWriteMessage . Types . WriteResponse . Types . WriteAck . Types . Written
890+ { Offset = 0 }
891+ }
892+ }
893+ } ,
894+ Status = StatusIds . Types . StatusCode . Success
895+ } ) ;
896+
897+ var writer = new WriterBuilder < long > ( _mockIDriver . Object , "/topic-16" )
898+ { ProducerId = "producerId" } . Build ( ) ;
899+
900+ var writeTask1 = writer . WriteAsync ( 100L ) ;
901+
902+ await tcsDetectedWrite . Task ;
903+ var disposedTask = writer . DisposeAsync ( ) ;
904+
905+ Assert . False ( writeTask1 . IsCompleted ) ;
906+ Assert . False ( disposedTask . IsCompleted ) ;
907+ writeTcs1 . TrySetException ( new Driver . TransportException (
908+ new RpcException ( new Grpc . Core . Status ( Grpc . Core . StatusCode . DeadlineExceeded , "Some message" ) ) ) ) ;
909+ Assert . Equal ( "Writer[TopicPath: /topic-16, ProducerId: producerId, Codec: Raw] is disposed" ,
910+ ( await Assert . ThrowsAsync < WriterException > ( ( ) => writer . WriteAsync ( 12 ) ) ) . Message ) ;
911+
912+ Assert . Equal ( PersistenceStatus . Written , ( await writeTask1 ) . Status ) ;
913+
914+ Assert . Equal ( "Writer[TopicPath: /topic-16, ProducerId: producerId, Codec: Raw] is disposed" ,
915+ ( await Assert . ThrowsAsync < WriterException > ( ( ) => writer . WriteAsync ( 12 ) ) ) . Message ) ;
916+
917+ await disposedTask ;
918+ }
919+
844920 private ISetupSequentialResult < StreamWriteMessage . Types . FromServer > SetupReadOneWriteAckMessage ( )
845921 {
846922 return _mockStream . SetupSequence ( stream => stream . Current )
0 commit comments