@@ -704,6 +704,66 @@ TEST_P(WithMode, MultiWriteLarge)
704
704
ASSERT_FALSE (RecvBuf.HasUnreadData ());
705
705
}
706
706
707
+ TEST_P (WithMode, MultiWriteLargeWhileReadPending)
708
+ {
709
+ auto Mode = GetParam ();
710
+ RecvBuffer RecvBuf{};
711
+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.Initialize (Mode, false , DEF_TEST_BUFFER_LENGTH, LARGE_TEST_BUFFER_LENGTH));
712
+
713
+ //
714
+ // Write some data and read it so a read operation is pending
715
+ //
716
+ {
717
+ uint64_t InOutWriteLength = LARGE_TEST_BUFFER_LENGTH; // FC limit same as recv buffer size
718
+ BOOLEAN DataReady = FALSE ;
719
+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.Write (0 , 64 , &InOutWriteLength, &DataReady));
720
+
721
+ uint64_t ReadOffset{};
722
+ QUIC_BUFFER ReadBuffers[3 ]{};
723
+ uint32_t BufferCount = ARRAYSIZE (ReadBuffers);
724
+ RecvBuf.Read (&ReadOffset, &BufferCount, ReadBuffers);
725
+ ASSERT_FALSE (RecvBuf.HasUnreadData ());
726
+ ASSERT_EQ (1u , BufferCount);
727
+ ASSERT_EQ (64u , ReadBuffers[0 ].Length );
728
+ }
729
+
730
+ //
731
+ // Write more data while the read is pending, forcing buffer re-allocations
732
+ //
733
+ for (uint32_t i = 1 ; i < 4 ; ++i) {
734
+ uint64_t InOutWriteLength = LARGE_TEST_BUFFER_LENGTH; // FC limit same as recv buffer size
735
+ BOOLEAN DataReady = FALSE ;
736
+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.Write (i * 64 , 64 , &InOutWriteLength, &DataReady));
737
+ ASSERT_TRUE (DataReady);
738
+ ASSERT_TRUE (RecvBuf.HasUnreadData ());
739
+ ASSERT_EQ (64ull , InOutWriteLength);
740
+ ASSERT_EQ ((i + 1 ) * 64ull , RecvBuf.GetTotalLength ());
741
+ }
742
+
743
+ //
744
+ // Drain the data from the first read
745
+ //
746
+ ASSERT_FALSE (RecvBuf.Drain (64 ));
747
+
748
+ //
749
+ // Read all the remaining data
750
+ //
751
+ uint64_t ReadOffset{};
752
+ QUIC_BUFFER ReadBuffers[3 ]{};
753
+ uint32_t BufferCount = ARRAYSIZE (ReadBuffers);
754
+ RecvBuf.Read (&ReadOffset, &BufferCount, ReadBuffers);
755
+ ASSERT_FALSE (RecvBuf.HasUnreadData ());
756
+ ASSERT_EQ (64ull , ReadOffset);
757
+ ASSERT_EQ (1u , BufferCount);
758
+ ASSERT_EQ (192u , ReadBuffers[0 ].Length );
759
+
760
+ //
761
+ // Drain all the data.
762
+ //
763
+ ASSERT_TRUE (RecvBuf.Drain (192 ));
764
+ ASSERT_FALSE (RecvBuf.HasUnreadData ());
765
+ }
766
+
707
767
TEST_P (WithMode, ReadPartial)
708
768
{
709
769
RecvBuffer RecvBuf;
0 commit comments