@@ -2440,6 +2440,111 @@ TEST_P(WithMode, OverlapWriteMultipleGaps)
24402440 }
24412441 }
24422442
2443+ uint64_t ReadOffset;
2444+ QUIC_BUFFER ReadBuffers[3 ];
2445+ uint32_t BufferCount = ARRAYSIZE (ReadBuffers);
2446+ QuicRecvBufferRead (&RecvBuf.RecvBuf , &ReadOffset, &BufferCount, ReadBuffers);
2447+ ASSERT_EQ (0ull , ReadOffset);
2448+ uint32_t TotalRead = 0 ;
2449+ for (uint32_t b = 0 ; b < BufferCount; ++b) {
2450+ ASSERT_EQ (0 , memcmp (ReadBuffers[b].Buffer , Expected + TotalRead, ReadBuffers[b].Length ));
2451+ TotalRead += ReadBuffers[b].Length ;
2452+ }
2453+ ASSERT_EQ (30u , TotalRead);
2454+ RecvBuf.Drain (30 );
2455+ }
2456+ TEST_P (WithMode, OverlapWriteThreeRangesTwoOverlaps)
2457+ {
2458+ //
2459+ // Write [0, 15), then [10, 25) overlapping [10, 15), then [20, 30) overlapping [20, 25).
2460+ // Sentinel values (0xff) cover both overlap regions to verify existing data is preserved.
2461+ //
2462+ RecvBuffer RecvBuf;
2463+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.Initialize (GetParam ()));
2464+
2465+ uint64_t InOutWriteLength = LARGE_TEST_BUFFER_LENGTH;
2466+ BOOLEAN NewDataReady = FALSE ;
2467+
2468+ // Write [0, 15) with pattern: byte[i] = (uint8_t)i
2469+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.Write (0 , 15 , &InOutWriteLength, &NewDataReady));
2470+ ASSERT_TRUE (NewDataReady);
2471+
2472+ // Write [10, 25): 0xff sentinel in overlap [10, 15), valid data in [15, 25)
2473+ uint8_t SecondWrite[15 ];
2474+ for (uint16_t i = 0 ; i < 5 ; ++i) SecondWrite[i] = 0xff ;
2475+ for (uint16_t i = 5 ; i < 15 ; ++i) SecondWrite[i] = (uint8_t )(10 + i);
2476+ InOutWriteLength = LARGE_TEST_BUFFER_LENGTH;
2477+ NewDataReady = FALSE ;
2478+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.WriteCustom (10 , 15 , SecondWrite, &InOutWriteLength, &NewDataReady));
2479+ ASSERT_TRUE (NewDataReady);
2480+
2481+ // Write [20, 30): 0xff sentinel in overlap [20, 25), valid data in [25, 30)
2482+ uint8_t ThirdWrite[10 ];
2483+ for (uint16_t i = 0 ; i < 5 ; ++i) ThirdWrite[i] = 0xff ;
2484+ for (uint16_t i = 5 ; i < 10 ; ++i) ThirdWrite[i] = (uint8_t )(20 + i);
2485+ InOutWriteLength = LARGE_TEST_BUFFER_LENGTH;
2486+ NewDataReady = FALSE ;
2487+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.WriteCustom (20 , 10 , ThirdWrite, &InOutWriteLength, &NewDataReady));
2488+ ASSERT_TRUE (NewDataReady);
2489+ ASSERT_EQ (30ull , RecvBuf.GetTotalLength ());
2490+
2491+ // Expected: [0,15) from first write, [15,25) from SecondWrite[5..14], [25,30) from ThirdWrite[5..9]
2492+ uint8_t Expected[30 ];
2493+ for (uint32_t i = 0 ; i < 15 ; ++i) Expected[i] = (uint8_t )i;
2494+ for (uint32_t i = 15 ; i < 25 ; ++i) Expected[i] = (uint8_t )(10 + (i - 10 ));
2495+ for (uint32_t i = 25 ; i < 30 ; ++i) Expected[i] = (uint8_t )(20 + (i - 20 ));
2496+
2497+ uint64_t ReadOffset;
2498+ QUIC_BUFFER ReadBuffers[3 ];
2499+ uint32_t BufferCount = ARRAYSIZE (ReadBuffers);
2500+ QuicRecvBufferRead (&RecvBuf.RecvBuf , &ReadOffset, &BufferCount, ReadBuffers);
2501+ ASSERT_EQ (0ull , ReadOffset);
2502+ uint32_t TotalRead = 0 ;
2503+ for (uint32_t b = 0 ; b < BufferCount; ++b) {
2504+ ASSERT_EQ (0 , memcmp (ReadBuffers[b].Buffer , Expected + TotalRead, ReadBuffers[b].Length ));
2505+ TotalRead += ReadBuffers[b].Length ;
2506+ }
2507+ ASSERT_EQ (30u , TotalRead);
2508+ RecvBuf.Drain (30 );
2509+ }
2510+
2511+ TEST_P (WithMode, OverlapWriteThreeContiguousNonOverlapping)
2512+ {
2513+ //
2514+ // Write three non-overlapping contiguous ranges: [0,10), [10,20), [20,30).
2515+ // Ranges touch but do not overlap. All data should land correctly without corruption.
2516+ //
2517+ RecvBuffer RecvBuf;
2518+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.Initialize (GetParam ()));
2519+
2520+ uint64_t InOutWriteLength = LARGE_TEST_BUFFER_LENGTH;
2521+ BOOLEAN NewDataReady = FALSE ;
2522+
2523+ // Write [0, 10) with pattern: byte[i] = (uint8_t)i
2524+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.Write (0 , 10 , &InOutWriteLength, &NewDataReady));
2525+ ASSERT_TRUE (NewDataReady);
2526+
2527+ // Write [10, 20) — contiguous, no overlap
2528+ uint8_t SecondWrite[10 ];
2529+ for (uint16_t i = 0 ; i < 10 ; ++i) SecondWrite[i] = (uint8_t )(10 + i);
2530+ InOutWriteLength = LARGE_TEST_BUFFER_LENGTH;
2531+ NewDataReady = FALSE ;
2532+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.WriteCustom (10 , 10 , SecondWrite, &InOutWriteLength, &NewDataReady));
2533+ ASSERT_TRUE (NewDataReady);
2534+
2535+ // Write [20, 30) — contiguous, no overlap
2536+ uint8_t ThirdWrite[10 ];
2537+ for (uint16_t i = 0 ; i < 10 ; ++i) ThirdWrite[i] = (uint8_t )(20 + i);
2538+ InOutWriteLength = LARGE_TEST_BUFFER_LENGTH;
2539+ NewDataReady = FALSE ;
2540+ ASSERT_EQ (QUIC_STATUS_SUCCESS, RecvBuf.WriteCustom (20 , 10 , ThirdWrite, &InOutWriteLength, &NewDataReady));
2541+ ASSERT_TRUE (NewDataReady);
2542+ ASSERT_EQ (30ull , RecvBuf.GetTotalLength ());
2543+
2544+ // Expected: byte[i] = (uint8_t)i across all 30 bytes
2545+ uint8_t Expected[30 ];
2546+ for (uint32_t i = 0 ; i < 30 ; ++i) Expected[i] = (uint8_t )i;
2547+
24432548 uint64_t ReadOffset;
24442549 QUIC_BUFFER ReadBuffers[3 ];
24452550 uint32_t BufferCount = ARRAYSIZE (ReadBuffers);
0 commit comments