1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-24 04:01:07 +03:00

Give caller some control over if writeStreamFrameHeader should write length

Summary:
Becuase when we clone an existing packet, the logic inside the current
writetStreamFrameHeader is no longer correct.

Reviewed By: mjoras

Differential Revision: D21383828

fbshipit-source-id: 8e6bbb048eefd97ca7cf17b89edc2f395f274a73
This commit is contained in:
Yang Chi
2020-05-07 10:52:01 -07:00
committed by Facebook GitHub Bot
parent 4b6468a4a4
commit cd7339e454
10 changed files with 364 additions and 51 deletions

View File

@@ -133,8 +133,8 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameToEmptyPacket) {
StreamId streamId = 1;
uint64_t offset = 0;
bool fin = false;
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 10, 10, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 10, 10, fin, folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
ASSERT_EQ(*dataLen, 10);
writeStreamFrameData(pktBuilder, inputBuf->clone(), 10);
@@ -179,8 +179,8 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameToPartialPacket) {
// 4 bytes offset
// 1 byte for length
// => 8 bytes of header
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 20, 20, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 20, 20, fin, folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
EXPECT_EQ(*dataLen, 20);
writeStreamFrameData(pktBuilder, inputBuf->clone(), 20);
@@ -228,8 +228,14 @@ TEST_F(QuicWriteCodecTest, WriteTwoStreamFrames) {
uint64_t offset1 = 65535;
bool fin1 = false;
auto inputBuf = buildRandomInputData(30);
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId1, offset1, 30, 30, fin1);
auto dataLen = writeStreamFrameHeader(
pktBuilder,
streamId1,
offset1,
30,
30,
fin1,
folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
ASSERT_EQ(*dataLen, 30);
writeStreamFrameData(pktBuilder, inputBuf->clone(), 30);
@@ -250,7 +256,13 @@ TEST_F(QuicWriteCodecTest, WriteTwoStreamFrames) {
// 4 bytes for offset
// => 7 bytes
dataLen = writeStreamFrameHeader(
pktBuilder, streamId2, offset2, remainingSpace, remainingSpace, fin2);
pktBuilder,
streamId2,
offset2,
remainingSpace,
remainingSpace,
fin2,
folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
ASSERT_EQ(*dataLen, remainingSpace - 7);
writeStreamFrameData(pktBuilder, inputBuf2->clone(), remainingSpace - 7);
@@ -319,8 +331,8 @@ TEST_F(QuicWriteCodecTest, WriteStreamFramePartialData) {
// 2 bytes for stream id
// 4 bytes for offset
// => 7 bytes for header
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 50, 50, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 50, 50, fin, folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
ASSERT_EQ(*dataLen, 33);
writeStreamFrameData(pktBuilder, inputBuf->clone(), 33);
@@ -358,8 +370,8 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameTooSmallForStreamHeader) {
StreamId streamId = 1;
uint64_t offset = 65535;
bool fin = false;
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 1, 1, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 1, 1, fin, folly::none /* skipLenHint */);
EXPECT_FALSE(dataLen);
EXPECT_EQ(1, pktBuilder.remainingSpaceInPkt());
}
@@ -376,8 +388,8 @@ TEST_F(QuicWriteCodecTest, WriteStreamNoSpaceForData) {
// 1 byte for stream id
// 1 byte for offset
// => 3 bytes
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 10, 10, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 10, 10, fin, folly::none /* skipLenHint */);
EXPECT_FALSE(dataLen.has_value());
EXPECT_EQ(pktBuilder.remainingSpaceInPkt(), 3);
}
@@ -398,8 +410,14 @@ TEST_F(QuicWriteCodecTest, WriteStreamSpaceForOneByte) {
// 1 byte for stream id
// 1 byte for offet
// => 3 bytes
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 100, 100, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder,
streamId,
offset,
100,
100,
fin,
folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
ASSERT_EQ(*dataLen, 1);
writeStreamFrameData(pktBuilder, inputBuf->clone(), 1);
@@ -444,8 +462,8 @@ TEST_F(QuicWriteCodecTest, WriteFinToEmptyPacket) {
StreamId streamId = 1;
uint64_t offset = 0;
bool fin = true;
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 10, 10, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 10, 10, fin, folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
ASSERT_EQ(*dataLen, 10);
writeStreamFrameData(pktBuilder, inputBuf->clone(), 10);
@@ -496,7 +514,13 @@ TEST_F(QuicWriteCodecTest, TestWriteIncompleteDataAndFin) {
uint64_t offset = 0;
bool fin = true;
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, inDataSize, inDataSize, fin);
pktBuilder,
streamId,
offset,
inDataSize,
inDataSize,
fin,
folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
EXPECT_LT(*dataLen, inDataSize);
}
@@ -512,8 +536,8 @@ TEST_F(QuicWriteCodecTest, TestWriteNoDataAndFin) {
uint64_t offset = 0;
bool fin = true;
Buf empty;
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 0, 0, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 0, 0, fin, folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen);
EXPECT_EQ(*dataLen, 0);
}
@@ -526,7 +550,14 @@ TEST_F(QuicWriteCodecTest, TestWriteNoDataAndNoFin) {
bool fin = false;
Buf empty;
EXPECT_THROW(
writeStreamFrameHeader(pktBuilder, streamId, offset, 0, 0, fin),
writeStreamFrameHeader(
pktBuilder,
streamId,
offset,
0,
0,
fin,
folly::none /* skipLenHint */),
QuicInternalException);
}
@@ -543,8 +574,8 @@ TEST_F(QuicWriteCodecTest, PacketOnlyHasSpaceForStreamHeader) {
StreamId streamId = 1;
uint64_t offset = 0;
bool fin = true;
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 20, 20, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 20, 20, fin, folly::none /* skipLenHint */);
EXPECT_FALSE(dataLen.has_value());
EXPECT_EQ(pktBuilder.remainingSpaceInPkt(), 2);
}
@@ -560,8 +591,8 @@ TEST_F(QuicWriteCodecTest, PacketOnlyHasSpaceForStreamHeaderWithFin) {
StreamId streamId = 1;
uint64_t offset = 0;
bool fin = true;
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 0, 0, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 0, 0, fin, folly::none /* skipLenHint */);
ASSERT_TRUE(dataLen.has_value());
EXPECT_EQ(*dataLen, 0);
EXPECT_EQ(pktBuilder.remainingSpaceInPkt(), 0);
@@ -578,12 +609,112 @@ TEST_F(QuicWriteCodecTest, PacketNotEnoughSpaceForStreamHeaderWithFin) {
StreamId streamId = 1;
uint64_t offset = 0;
bool fin = true;
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 0, 0, fin);
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 0, 0, fin, folly::none /* skipLenHint */);
ASSERT_FALSE(dataLen.has_value());
EXPECT_EQ(pktBuilder.remainingSpaceInPkt(), 2);
}
TEST_F(QuicWriteCodecTest, WriteStreamFrameHeadeSkipLen) {
MockQuicPacketBuilder pktBuilder;
size_t packetLimit = 1200;
EXPECT_CALL(pktBuilder, appendFrame(_)).Times(1);
EXPECT_CALL(pktBuilder, remainingSpaceInPkt()).WillRepeatedly(Invoke([&]() {
return packetLimit;
}));
// initial byte:
EXPECT_CALL(pktBuilder, writeBEUint8(_)).WillOnce(Invoke([&](uint8_t) {
packetLimit--;
}));
// write twice: stream id and offste
EXPECT_CALL(pktBuilder, write(_))
.Times(2)
.WillRepeatedly(Invoke([&](const QuicInteger& quicInt) {
packetLimit -= quicInt.getSize();
}));
StreamId streamId = 0;
uint64_t offset = 10;
bool fin = false;
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 1200 * 2, 1200 * 2, fin, folly::none);
EXPECT_LT(*dataLen, 1200);
}
TEST_F(QuicWriteCodecTest, WriteStreamFrameHeadeNotSkipLen) {
MockQuicPacketBuilder pktBuilder;
size_t packetLimit = 1200;
EXPECT_CALL(pktBuilder, appendFrame(_)).Times(1);
EXPECT_CALL(pktBuilder, remainingSpaceInPkt()).WillRepeatedly(Invoke([&]() {
return packetLimit;
}));
// initial byte:
EXPECT_CALL(pktBuilder, writeBEUint8(_)).WillOnce(Invoke([&](uint8_t) {
packetLimit--;
}));
// write three times: stream id and offste and data len
EXPECT_CALL(pktBuilder, write(_))
.Times(3)
.WillRepeatedly(Invoke([&](const QuicInteger& quicInt) {
packetLimit -= quicInt.getSize();
}));
StreamId streamId = 0;
uint64_t offset = 10;
bool fin = false;
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 200, 200, fin, folly::none);
EXPECT_EQ(*dataLen, 200);
}
TEST_F(QuicWriteCodecTest, WriteStreamFrameHeadeLengthHintTrue) {
MockQuicPacketBuilder pktBuilder;
size_t packetLimit = 1200;
EXPECT_CALL(pktBuilder, appendFrame(_)).Times(1);
EXPECT_CALL(pktBuilder, remainingSpaceInPkt()).WillRepeatedly(Invoke([&]() {
return packetLimit;
}));
// initial byte:
EXPECT_CALL(pktBuilder, writeBEUint8(_)).WillOnce(Invoke([&](uint8_t) {
packetLimit--;
}));
// write twice: stream id and offste
EXPECT_CALL(pktBuilder, write(_))
.Times(2)
.WillRepeatedly(Invoke([&](const QuicInteger& quicInt) {
packetLimit -= quicInt.getSize();
}));
StreamId streamId = 0;
uint64_t offset = 10;
bool fin = false;
auto dataLen =
writeStreamFrameHeader(pktBuilder, streamId, offset, 200, 200, fin, true);
EXPECT_EQ(*dataLen, 200);
}
TEST_F(QuicWriteCodecTest, WriteStreamFrameHeadeLengthHintFalse) {
MockQuicPacketBuilder pktBuilder;
size_t packetLimit = 1200;
EXPECT_CALL(pktBuilder, appendFrame(_)).Times(1);
EXPECT_CALL(pktBuilder, remainingSpaceInPkt()).WillRepeatedly(Invoke([&]() {
return packetLimit;
}));
// initial byte:
EXPECT_CALL(pktBuilder, writeBEUint8(_)).WillOnce(Invoke([&](uint8_t) {
packetLimit--;
}));
// write three times: stream id and offste and data len
EXPECT_CALL(pktBuilder, write(_))
.Times(3)
.WillRepeatedly(Invoke([&](const QuicInteger& quicInt) {
packetLimit -= quicInt.getSize();
}));
StreamId streamId = 0;
uint64_t offset = 10;
bool fin = false;
auto dataLen = writeStreamFrameHeader(
pktBuilder, streamId, offset, 1200 * 2, 1200 * 2, fin, false);
EXPECT_LT(*dataLen, 1200);
}
TEST_F(QuicWriteCodecTest, AckFrameGapExceedsRepresentation) {
MockQuicPacketBuilder pktBuilder;
setupCommonExpects(pktBuilder);