Skip to content

Commit cbf137d

Browse files
test(recv_buffer): add three-range overlap and contiguous non-overlap tests
1 parent d104bd3 commit cbf137d

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

src/core/unittest/RecvBufferTest.cpp

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)