1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-06 22:22:38 +03:00

Throw if start offset of written frame > stream.currentWriteOffset

Summary: As titled. Simple logic to prevent confusion when writing tests.

Reviewed By: jbeshay

Differential Revision: D31916968

fbshipit-source-id: 6f4fb84402b6fe2f5f9af9f57ff8a1d2f1838464
This commit is contained in:
Brandon Schlinker
2021-12-11 22:39:07 -08:00
committed by Facebook GitHub Bot
parent f19b20b107
commit bdd073a7fd
2 changed files with 129 additions and 0 deletions

View File

@@ -3665,5 +3665,126 @@ TEST_F(QuicTransportFunctionsTest, UpdateConnectionWithBufferMeta) {
EXPECT_TRUE(conn->outstandings.packets.back().isDSRPacket);
}
TEST_F(QuicTransportFunctionsTest, MissingStreamFrameBytes) {
auto conn = createConn();
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::AppData);
auto stream = conn->streamManager->createNextBidirectionalStream().value();
writeDataToQuicStream(*stream, folly::IOBuf::copyBuffer("abcdefghij"), true);
// write frame with bytes 0 -> 3 (start at offset 0, write 4 bytes)
{
WriteStreamFrame writeStreamFrame(
stream->id, 0 /* offset */, 4 /* len */, false /* fin */);
packet.packet.frames.push_back(writeStreamFrame);
updateConnection(
*conn,
folly::none,
packet.packet,
TimePoint(),
getEncodedSize(packet),
getEncodedBodySize(packet),
false /* isDSRPacket */);
}
// write frame with bytes 5 -> 6 (start at offset 5, write 2 bytes)
// should throw since we never wrote byte offset 4
{
WriteStreamFrame writeStreamFrame(
stream->id, 5 /* offset */, 2 /* len */, false /* fin */);
packet.packet.frames.push_back(writeStreamFrame);
EXPECT_ANY_THROW(updateConnection(
*conn,
folly::none,
packet.packet,
TimePoint(),
getEncodedSize(packet),
getEncodedBodySize(packet),
false /* isDSRPacket */));
}
}
TEST_F(QuicTransportFunctionsTest, MissingStreamFrameBytesEof) {
auto conn = createConn();
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::AppData);
auto stream = conn->streamManager->createNextBidirectionalStream().value();
const std::string str = "abcdefg";
writeDataToQuicStream(*stream, folly::IOBuf::copyBuffer(str), true);
// write frame with bytes 0 -> 3 (start at offset 0, write 4 bytes)
{
WriteStreamFrame writeStreamFrame(
stream->id, 0 /* offset */, 4 /* len */, false /* fin */);
packet.packet.frames.push_back(writeStreamFrame);
updateConnection(
*conn,
folly::none,
packet.packet,
TimePoint(),
getEncodedSize(packet),
getEncodedBodySize(packet),
false /* isDSRPacket */);
}
// write frame with bytes 5 -> 6 (start at offset 5, write 2 bytes)
// offset 6 should be last byte in original stream, so we'll mark fin
//
// should throw since we never wrote byte offset 4
{
const auto offset = 5;
const auto len = 2;
EXPECT_EQ(str.length(), offset + len); // should be end of string
WriteStreamFrame writeStreamFrame(
stream->id, offset /* offset */, len /* len */, true /* fin */);
packet.packet.frames.push_back(writeStreamFrame);
EXPECT_ANY_THROW(updateConnection(
*conn,
folly::none,
packet.packet,
TimePoint(),
getEncodedSize(packet),
getEncodedBodySize(packet),
false /* isDSRPacket */));
}
}
TEST_F(QuicTransportFunctionsTest, MissingStreamFrameBytesSingleByteWrite) {
auto conn = createConn();
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::AppData);
auto stream = conn->streamManager->createNextBidirectionalStream().value();
const std::string str = "abcdefg";
writeDataToQuicStream(*stream, folly::IOBuf::copyBuffer(str), true);
// write frame with bytes 0 -> 3 (start at offset 0, write 4 bytes)
{
WriteStreamFrame writeStreamFrame(
stream->id, 0 /* offset */, 4 /* len */, false /* fin */);
packet.packet.frames.push_back(writeStreamFrame);
updateConnection(
*conn,
folly::none,
packet.packet,
TimePoint(),
getEncodedSize(packet),
getEncodedBodySize(packet),
false /* isDSRPacket */);
}
// write frame with bytes 5 -> 5 (start at offset 5, write 1 byte)
// should throw since we never wrote byte offset 4
{
WriteStreamFrame writeStreamFrame(
stream->id, 5 /* offset */, 1 /* len */, false /* fin */);
packet.packet.frames.push_back(writeStreamFrame);
EXPECT_ANY_THROW(updateConnection(
*conn,
folly::none,
packet.packet,
TimePoint(),
getEncodedSize(packet),
getEncodedBodySize(packet),
false /* isDSRPacket */));
}
}
} // namespace test
} // namespace quic