@@ -477,4 +477,91 @@ public async Task WriteAsync_WhenStreamIsClosingOnProcessingWriteAckThenReconnec
477477 _mockStream . Verify ( stream => stream . MoveNextAsync ( ) , Times . Exactly ( 3 ) ) ;
478478 _mockStream . Verify ( stream => stream . Current , Times . Once ) ;
479479 }
480+
481+ [ Fact ]
482+ public async Task WriteAsync_WhenCancellationTokenIsClosed_ThrowCancellationException ( )
483+ {
484+ var cancellationTokenSource = new CancellationTokenSource ( ) ;
485+ var nextCompleted = new TaskCompletionSource < bool > ( ) ;
486+ _mockStream . Setup ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) )
487+ . Returns ( Task . CompletedTask ) ;
488+ _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
489+ . ReturnsAsync ( true )
490+ . Returns ( new ValueTask < bool > ( nextCompleted . Task ) ) ;
491+ _mockStream . SetupSequence ( stream => stream . Current )
492+ . Returns ( new StreamWriteMessage . Types . FromServer
493+ {
494+ InitResponse = new StreamWriteMessage . Types . InitResponse
495+ { LastSeqNo = 0 , PartitionId = 1 , SessionId = "SessionId" } ,
496+ Status = StatusIds . Types . StatusCode . Success
497+ } )
498+ . Returns ( new StreamWriteMessage . Types . FromServer
499+ {
500+ WriteResponse = new StreamWriteMessage . Types . WriteResponse
501+ {
502+ PartitionId = 1 ,
503+ Acks =
504+ {
505+ new StreamWriteMessage . Types . WriteResponse . Types . WriteAck
506+ {
507+ SeqNo = 1 ,
508+ Written = new StreamWriteMessage . Types . WriteResponse . Types . WriteAck . Types . Written
509+ { Offset = 0 }
510+ }
511+ }
512+ } ,
513+ Status = StatusIds . Types . StatusCode . Success
514+ } ) ;
515+ using var writer = new WriterBuilder < long > ( _mockIDriver . Object , "/topic" )
516+ { ProducerId = "producerId" } . Build ( ) ;
517+
518+ var task = writer . WriteAsync ( 123L , cancellationTokenSource . Token ) ;
519+ cancellationTokenSource . Cancel ( ) ;
520+ nextCompleted . SetResult ( true ) ;
521+
522+ await Assert . ThrowsAsync < TaskCanceledException > ( ( ) => task ) ;
523+ }
524+
525+ [ Fact ]
526+ public async Task WriteAsync_WhenTaskIsAcceptedBeforeCancel_ThrowCancellationException ( )
527+ {
528+ var cancellationTokenSource = new CancellationTokenSource ( ) ;
529+ var nextCompleted = new TaskCompletionSource < bool > ( ) ;
530+ _mockStream . Setup ( stream => stream . Write ( It . IsAny < FromClient > ( ) ) )
531+ . Returns ( Task . CompletedTask ) ;
532+ _mockStream . SetupSequence ( stream => stream . MoveNextAsync ( ) )
533+ . ReturnsAsync ( true )
534+ . Returns ( new ValueTask < bool > ( nextCompleted . Task ) ) ;
535+ _mockStream . SetupSequence ( stream => stream . Current )
536+ . Returns ( new StreamWriteMessage . Types . FromServer
537+ {
538+ InitResponse = new StreamWriteMessage . Types . InitResponse
539+ { LastSeqNo = 0 , PartitionId = 1 , SessionId = "SessionId" } ,
540+ Status = StatusIds . Types . StatusCode . Success
541+ } )
542+ . Returns ( new StreamWriteMessage . Types . FromServer
543+ {
544+ WriteResponse = new StreamWriteMessage . Types . WriteResponse
545+ {
546+ PartitionId = 1 ,
547+ Acks =
548+ {
549+ new StreamWriteMessage . Types . WriteResponse . Types . WriteAck
550+ {
551+ SeqNo = 1 ,
552+ Written = new StreamWriteMessage . Types . WriteResponse . Types . WriteAck . Types . Written
553+ { Offset = 0 }
554+ }
555+ }
556+ } ,
557+ Status = StatusIds . Types . StatusCode . Success
558+ } ) ;
559+ using var writer = new WriterBuilder < long > ( _mockIDriver . Object , "/topic" )
560+ { ProducerId = "producerId" } . Build ( ) ;
561+
562+ var task = writer . WriteAsync ( 123L , cancellationTokenSource . Token ) ;
563+ nextCompleted . SetResult ( true ) ;
564+ await Assert . ThrowsAsync < TaskCanceledException > ( ( ) => task ) ;
565+ cancellationTokenSource . Cancel ( ) ;
566+ }
480567}
0 commit comments