mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-06 22:22:38 +03:00
Send probes on all spaces take 2.
Summary: As before we will now aggressively send probes on all spaces with probes available when the PTO timer fires. This time with more unit tests and some bug fixes. Reviewed By: yangchi Differential Revision: D27338523 fbshipit-source-id: 8a9ccb90ed691e996fab4afa2f132c0f99044fbc
This commit is contained in:
committed by
Facebook GitHub Bot
parent
19157b3d1a
commit
55e0fa070e
@@ -648,7 +648,7 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionPureAckCounter) {
|
||||
conn->qLogger = std::make_shared<quic::FileQLogger>(VantagePoint::Client);
|
||||
auto stream = conn->streamManager->createNextBidirectionalStream().value();
|
||||
writeDataToQuicStream(*stream, nullptr, true);
|
||||
EXPECT_EQ(0, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
|
||||
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::Handshake);
|
||||
auto packetEncodedSize =
|
||||
@@ -762,8 +762,8 @@ TEST_F(QuicTransportFunctionsTest, TestImplicitAck) {
|
||||
getEncodedSize(packet),
|
||||
getEncodedBodySize(packet),
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_EQ(1, conn->outstandings.initialPacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(1, conn->outstandings.packetCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(1, conn->outstandings.packets.size());
|
||||
EXPECT_EQ(1, initialStream->retransmissionBuffer.size());
|
||||
|
||||
@@ -782,8 +782,8 @@ TEST_F(QuicTransportFunctionsTest, TestImplicitAck) {
|
||||
getEncodedSize(packet),
|
||||
getEncodedBodySize(packet),
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_EQ(2, conn->outstandings.initialPacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(2, conn->outstandings.packetCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(2, conn->outstandings.packets.size());
|
||||
EXPECT_EQ(3, initialStream->retransmissionBuffer.size());
|
||||
EXPECT_TRUE(initialStream->writeBuffer.empty());
|
||||
@@ -795,7 +795,7 @@ TEST_F(QuicTransportFunctionsTest, TestImplicitAck) {
|
||||
initialStream->retransmissionBuffer.erase(0);
|
||||
initialStream->lossBuffer.emplace_back(std::move(firstBuf), 0, false);
|
||||
conn->outstandings.packets.pop_front();
|
||||
conn->outstandings.initialPacketsCount--;
|
||||
conn->outstandings.packetCount[PacketNumberSpace::Initial]--;
|
||||
|
||||
auto handshakeStream =
|
||||
getCryptoStream(*conn->cryptoState, EncryptionLevel::Handshake);
|
||||
@@ -813,8 +813,8 @@ TEST_F(QuicTransportFunctionsTest, TestImplicitAck) {
|
||||
getEncodedSize(packet),
|
||||
getEncodedBodySize(packet),
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_EQ(1, conn->outstandings.initialPacketsCount);
|
||||
EXPECT_EQ(1, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(1, conn->outstandings.packetCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(1, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(2, conn->outstandings.packets.size());
|
||||
EXPECT_EQ(1, handshakeStream->retransmissionBuffer.size());
|
||||
|
||||
@@ -830,8 +830,8 @@ TEST_F(QuicTransportFunctionsTest, TestImplicitAck) {
|
||||
getEncodedSize(packet),
|
||||
getEncodedBodySize(packet),
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_EQ(1, conn->outstandings.initialPacketsCount);
|
||||
EXPECT_EQ(2, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(1, conn->outstandings.packetCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(2, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(3, conn->outstandings.packets.size());
|
||||
EXPECT_EQ(2, handshakeStream->retransmissionBuffer.size());
|
||||
EXPECT_TRUE(handshakeStream->writeBuffer.empty());
|
||||
@@ -847,19 +847,19 @@ TEST_F(QuicTransportFunctionsTest, TestImplicitAck) {
|
||||
auto frame = op.packet.frames[0].asWriteCryptoFrame();
|
||||
EXPECT_EQ(frame->offset, 0);
|
||||
conn->outstandings.packets.pop_front();
|
||||
conn->outstandings.handshakePacketsCount--;
|
||||
conn->outstandings.packetCount[PacketNumberSpace::Handshake]--;
|
||||
|
||||
implicitAckCryptoStream(*conn, EncryptionLevel::Initial);
|
||||
EXPECT_EQ(0, conn->outstandings.initialPacketsCount);
|
||||
EXPECT_EQ(1, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(1, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(1, conn->outstandings.packets.size());
|
||||
EXPECT_TRUE(initialStream->retransmissionBuffer.empty());
|
||||
EXPECT_TRUE(initialStream->writeBuffer.empty());
|
||||
EXPECT_TRUE(initialStream->lossBuffer.empty());
|
||||
|
||||
implicitAckCryptoStream(*conn, EncryptionLevel::Handshake);
|
||||
EXPECT_EQ(0, conn->outstandings.initialPacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_TRUE(conn->outstandings.packets.empty());
|
||||
EXPECT_TRUE(handshakeStream->retransmissionBuffer.empty());
|
||||
EXPECT_TRUE(handshakeStream->writeBuffer.empty());
|
||||
@@ -871,7 +871,7 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionHandshakeCounter) {
|
||||
conn->qLogger = std::make_shared<quic::FileQLogger>(VantagePoint::Client);
|
||||
auto stream = conn->streamManager->createNextBidirectionalStream().value();
|
||||
writeDataToQuicStream(*stream, nullptr, true);
|
||||
EXPECT_EQ(0, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
|
||||
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::Handshake);
|
||||
auto packetEncodedSize =
|
||||
@@ -887,7 +887,7 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionHandshakeCounter) {
|
||||
getEncodedSize(packet),
|
||||
getEncodedBodySize(packet),
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_EQ(1, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(1, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
|
||||
auto nonHandshake = buildEmptyPacket(*conn, PacketNumberSpace::AppData);
|
||||
packetEncodedSize =
|
||||
@@ -936,7 +936,8 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionHandshakeCounter) {
|
||||
EXPECT_EQ(gotFrame->offset, 0);
|
||||
EXPECT_EQ(gotFrame->len, 0);
|
||||
EXPECT_TRUE(gotFrame->fin);
|
||||
EXPECT_EQ(1, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(
|
||||
1, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -946,7 +947,7 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionForOneRttCryptoData) {
|
||||
conn->qLogger = std::make_shared<quic::FileQLogger>(VantagePoint::Client);
|
||||
auto stream = conn->streamManager->createNextBidirectionalStream().value();
|
||||
writeDataToQuicStream(*stream, nullptr, true);
|
||||
EXPECT_EQ(0, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
|
||||
// Packet with CryptoFrame in AppData pn space
|
||||
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::AppData, true);
|
||||
@@ -964,7 +965,7 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionForOneRttCryptoData) {
|
||||
getEncodedBodySize(packet),
|
||||
false /* isDSRPacket */);
|
||||
|
||||
EXPECT_EQ(0, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(1, conn->outstandings.packets.size());
|
||||
|
||||
auto nonHandshake = buildEmptyPacket(*conn, PacketNumberSpace::AppData);
|
||||
@@ -1017,7 +1018,7 @@ TEST_F(QuicTransportFunctionsTest, TestUpdateConnectionForOneRttCryptoData) {
|
||||
}
|
||||
}
|
||||
|
||||
EXPECT_EQ(0, conn->outstandings.handshakePacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.packetCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(2, conn->outstandings.packets.size());
|
||||
}
|
||||
|
||||
@@ -1405,20 +1406,22 @@ TEST_F(QuicTransportFunctionsTest, WriteQuicDataToSocketLimitTest) {
|
||||
EXPECT_CALL(*rawSocket, write(_, _)).Times(0);
|
||||
EXPECT_CALL(*rawCongestionController, onPacketSent(_)).Times(0);
|
||||
EXPECT_CALL(*transportInfoCb_, onWrite(_)).Times(0);
|
||||
EXPECT_EQ(
|
||||
0,
|
||||
writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit));
|
||||
auto res = writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
EXPECT_EQ(0, res.packetsWritten);
|
||||
EXPECT_EQ(0, res.probesWritten);
|
||||
|
||||
// Normal limit
|
||||
conn->pendingEvents.numProbePackets = 0;
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::Initial] = 0;
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::Handshake] = 0;
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::AppData] = 0;
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit =
|
||||
kDefaultWriteConnectionDataPacketLimit;
|
||||
EXPECT_CALL(*rawSocket, write(_, _))
|
||||
@@ -1430,20 +1433,22 @@ TEST_F(QuicTransportFunctionsTest, WriteQuicDataToSocketLimitTest) {
|
||||
}));
|
||||
EXPECT_CALL(*rawCongestionController, onPacketSent(_)).Times(1);
|
||||
EXPECT_CALL(*transportInfoCb_, onWrite(_)).Times(1);
|
||||
EXPECT_EQ(
|
||||
1,
|
||||
writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit));
|
||||
res = writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
|
||||
// Probing can be limited by packet limit too
|
||||
conn->pendingEvents.numProbePackets =
|
||||
EXPECT_EQ(1, res.packetsWritten);
|
||||
EXPECT_EQ(0, res.probesWritten);
|
||||
|
||||
// Probing can exceed packet limit. In practice we limit it to
|
||||
// kPacketToSendForPTO
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::AppData] =
|
||||
kDefaultWriteConnectionDataPacketLimit * 2;
|
||||
writeDataToQuicStream(*stream1, buf->clone(), true);
|
||||
writableBytes = 10000;
|
||||
@@ -1451,26 +1456,27 @@ TEST_F(QuicTransportFunctionsTest, WriteQuicDataToSocketLimitTest) {
|
||||
.WillRepeatedly(
|
||||
InvokeWithoutArgs([&writableBytes]() { return writableBytes; }));
|
||||
EXPECT_CALL(*rawSocket, write(_, _))
|
||||
.Times(kDefaultWriteConnectionDataPacketLimit)
|
||||
.Times(kDefaultWriteConnectionDataPacketLimit * 2)
|
||||
.WillRepeatedly(Invoke([&](const SocketAddress&,
|
||||
const std::unique_ptr<folly::IOBuf>& iobuf) {
|
||||
return iobuf->computeChainDataLength();
|
||||
}));
|
||||
EXPECT_CALL(*rawCongestionController, onPacketSent(_))
|
||||
.Times(kDefaultWriteConnectionDataPacketLimit);
|
||||
.Times(kDefaultWriteConnectionDataPacketLimit * 2);
|
||||
EXPECT_CALL(*transportInfoCb_, onWrite(_))
|
||||
.Times(kDefaultWriteConnectionDataPacketLimit);
|
||||
EXPECT_EQ(
|
||||
kDefaultWriteConnectionDataPacketLimit,
|
||||
writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit));
|
||||
.Times(kDefaultWriteConnectionDataPacketLimit * 2);
|
||||
res = writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
|
||||
EXPECT_EQ(0, res.packetsWritten);
|
||||
EXPECT_EQ(kDefaultWriteConnectionDataPacketLimit * 2, res.probesWritten);
|
||||
}
|
||||
|
||||
TEST_F(
|
||||
@@ -1607,17 +1613,17 @@ TEST_F(QuicTransportFunctionsTest, NothingWritten) {
|
||||
conn->ackStates.initialAckState, 1500, 2000);
|
||||
addAckStatesWithCurrentTimestamps(
|
||||
conn->ackStates.initialAckState, 2500, 3000);
|
||||
EXPECT_EQ(
|
||||
writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit),
|
||||
0);
|
||||
auto res = writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
EXPECT_EQ(0, res.packetsWritten);
|
||||
EXPECT_EQ(0, res.probesWritten);
|
||||
}
|
||||
|
||||
const QuicWriteFrame& getFirstFrameInOutstandingPackets(
|
||||
@@ -1874,18 +1880,19 @@ TEST_F(QuicTransportFunctionsTest, TestCryptoWritingIsHandshakeInOutstanding) {
|
||||
auto socket =
|
||||
std::make_unique<NiceMock<folly::test::MockAsyncUDPSocket>>(&evb);
|
||||
auto rawSocket = socket.get();
|
||||
EXPECT_EQ(
|
||||
1,
|
||||
writeCryptoAndAckDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
LongHeader::Types::Initial,
|
||||
*conn->initialWriteCipher,
|
||||
*conn->initialHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit));
|
||||
auto res = writeCryptoAndAckDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
LongHeader::Types::Initial,
|
||||
*conn->initialWriteCipher,
|
||||
*conn->initialHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
|
||||
EXPECT_EQ(1, res.packetsWritten);
|
||||
EXPECT_EQ(0, res.probesWritten);
|
||||
ASSERT_EQ(1, conn->outstandings.packets.size());
|
||||
EXPECT_TRUE(getFirstOutstandingPacket(*conn, PacketNumberSpace::Initial)
|
||||
->metadata.isHandshake);
|
||||
@@ -1900,37 +1907,91 @@ TEST_F(QuicTransportFunctionsTest, NoCryptoProbeWriteIfNoProbeCredit) {
|
||||
auto socket =
|
||||
std::make_unique<NiceMock<folly::test::MockAsyncUDPSocket>>(&evb);
|
||||
auto rawSocket = socket.get();
|
||||
EXPECT_EQ(
|
||||
1,
|
||||
writeCryptoAndAckDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
LongHeader::Types::Initial,
|
||||
*conn->initialWriteCipher,
|
||||
*conn->initialHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit));
|
||||
auto res = writeCryptoAndAckDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
LongHeader::Types::Initial,
|
||||
*conn->initialWriteCipher,
|
||||
*conn->initialHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
|
||||
EXPECT_EQ(1, res.packetsWritten);
|
||||
EXPECT_EQ(0, res.probesWritten);
|
||||
ASSERT_EQ(1, conn->outstandings.packets.size());
|
||||
EXPECT_TRUE(getFirstOutstandingPacket(*conn, PacketNumberSpace::Initial)
|
||||
->metadata.isHandshake);
|
||||
ASSERT_EQ(1, cryptoStream->retransmissionBuffer.size());
|
||||
ASSERT_TRUE(cryptoStream->writeBuffer.empty());
|
||||
|
||||
conn->pendingEvents.numProbePackets = 0;
|
||||
EXPECT_EQ(
|
||||
0,
|
||||
writeCryptoAndAckDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
LongHeader::Types::Initial,
|
||||
*conn->initialWriteCipher,
|
||||
*conn->initialHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit));
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::Initial] = 0;
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::Handshake] = 0;
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::AppData] = 0;
|
||||
res = writeCryptoAndAckDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
LongHeader::Types::Initial,
|
||||
*conn->initialWriteCipher,
|
||||
*conn->initialHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
|
||||
EXPECT_EQ(0, res.packetsWritten);
|
||||
EXPECT_EQ(0, res.probesWritten);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, ResetNumProbePackets) {
|
||||
auto conn = createConn();
|
||||
EventBase evb;
|
||||
auto socket =
|
||||
std::make_unique<NiceMock<folly::test::MockAsyncUDPSocket>>(&evb);
|
||||
auto rawSocket = socket.get();
|
||||
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::Initial] = 2;
|
||||
writeCryptoAndAckDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
LongHeader::Types::Initial,
|
||||
*conn->initialWriteCipher,
|
||||
*conn->initialHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
EXPECT_FALSE(conn->pendingEvents.anyProbePackets());
|
||||
|
||||
conn->handshakeWriteCipher = createNoOpAead();
|
||||
conn->handshakeWriteHeaderCipher = createNoOpHeaderCipher();
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::Handshake] = 2;
|
||||
writeCryptoAndAckDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
LongHeader::Types::Handshake,
|
||||
*conn->handshakeWriteCipher,
|
||||
*conn->handshakeWriteHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
EXPECT_FALSE(conn->pendingEvents.anyProbePackets());
|
||||
|
||||
conn->oneRttWriteCipher = createNoOpAead();
|
||||
conn->oneRttWriteHeaderCipher = createNoOpHeaderCipher();
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::AppData] = 2;
|
||||
writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*conn->oneRttWriteCipher,
|
||||
*conn->oneRttWriteHeaderCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
EXPECT_FALSE(conn->pendingEvents.anyProbePackets());
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, WritePureAckWhenNoWritableBytes) {
|
||||
@@ -1963,17 +2024,16 @@ TEST_F(QuicTransportFunctionsTest, WritePureAckWhenNoWritableBytes) {
|
||||
return iobuf->computeChainDataLength();
|
||||
}));
|
||||
EXPECT_CALL(*rawCongestionController, onPacketSent(_)).Times(0);
|
||||
EXPECT_GT(
|
||||
writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit),
|
||||
0);
|
||||
auto res = writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
EXPECT_GT(res.packetsWritten, 0);
|
||||
EXPECT_EQ(0, conn->outstandings.packets.size());
|
||||
}
|
||||
|
||||
@@ -2223,9 +2283,10 @@ TEST_F(QuicTransportFunctionsTest, HasAppDataToWrite) {
|
||||
EXPECT_EQ(WriteDataReason::STREAM, hasNonAckDataToWrite(*conn));
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, UpdateConnectionCloneCounter) {
|
||||
TEST_F(QuicTransportFunctionsTest, UpdateConnectionCloneCounterAppData) {
|
||||
auto conn = createConn();
|
||||
ASSERT_EQ(0, conn->outstandings.clonedPacketsCount);
|
||||
ASSERT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::AppData]);
|
||||
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::AppData);
|
||||
auto connWindowUpdate =
|
||||
MaxDataFrame(conn->flowControlState.advertisedMaxOffset);
|
||||
@@ -2241,7 +2302,66 @@ TEST_F(QuicTransportFunctionsTest, UpdateConnectionCloneCounter) {
|
||||
123,
|
||||
100,
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_EQ(1, conn->outstandings.clonedPacketsCount);
|
||||
EXPECT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(
|
||||
1, conn->outstandings.clonedPacketCount[PacketNumberSpace::AppData]);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, UpdateConnectionCloneCounterHandshake) {
|
||||
auto conn = createConn();
|
||||
ASSERT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::Handshake]);
|
||||
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::Handshake);
|
||||
auto connWindowUpdate =
|
||||
MaxDataFrame(conn->flowControlState.advertisedMaxOffset);
|
||||
conn->pendingEvents.connWindowUpdate = true;
|
||||
packet.packet.frames.emplace_back(connWindowUpdate);
|
||||
PacketEvent packetEvent(PacketNumberSpace::AppData, 100);
|
||||
conn->outstandings.packetEvents.insert(packetEvent);
|
||||
updateConnection(
|
||||
*conn,
|
||||
packetEvent,
|
||||
packet.packet,
|
||||
TimePoint(),
|
||||
123,
|
||||
123,
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(
|
||||
1, conn->outstandings.clonedPacketCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::AppData]);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, UpdateConnectionCloneCounterInitial) {
|
||||
auto conn = createConn();
|
||||
ASSERT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::Initial]);
|
||||
auto packet = buildEmptyPacket(*conn, PacketNumberSpace::Initial);
|
||||
auto connWindowUpdate =
|
||||
MaxDataFrame(conn->flowControlState.advertisedMaxOffset);
|
||||
conn->pendingEvents.connWindowUpdate = true;
|
||||
packet.packet.frames.emplace_back(connWindowUpdate);
|
||||
PacketEvent packetEvent(PacketNumberSpace::AppData, 100);
|
||||
conn->outstandings.packetEvents.insert(packetEvent);
|
||||
updateConnection(
|
||||
*conn,
|
||||
packetEvent,
|
||||
packet.packet,
|
||||
TimePoint(),
|
||||
123,
|
||||
123,
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_EQ(
|
||||
1, conn->outstandings.clonedPacketCount[PacketNumberSpace::Initial]);
|
||||
EXPECT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::Handshake]);
|
||||
EXPECT_EQ(
|
||||
0, conn->outstandings.clonedPacketCount[PacketNumberSpace::AppData]);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, ClearBlockedFromPendingEvents) {
|
||||
@@ -2261,7 +2381,7 @@ TEST_F(QuicTransportFunctionsTest, ClearBlockedFromPendingEvents) {
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_FALSE(conn->streamManager->hasBlocked());
|
||||
EXPECT_FALSE(conn->outstandings.packets.empty());
|
||||
EXPECT_EQ(0, conn->outstandings.clonedPacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.numClonedPackets());
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, ClonedBlocked) {
|
||||
@@ -2284,7 +2404,8 @@ TEST_F(QuicTransportFunctionsTest, ClonedBlocked) {
|
||||
getEncodedBodySize(packet),
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_FALSE(conn->outstandings.packets.empty());
|
||||
EXPECT_EQ(1, conn->outstandings.clonedPacketsCount);
|
||||
EXPECT_EQ(
|
||||
1, conn->outstandings.clonedPacketCount[PacketNumberSpace::AppData]);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, TwoConnWindowUpdateWillCrash) {
|
||||
@@ -2344,7 +2465,7 @@ TEST_F(QuicTransportFunctionsTest, ClearRstFromPendingEvents) {
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_TRUE(conn->pendingEvents.resets.empty());
|
||||
EXPECT_FALSE(conn->outstandings.packets.empty());
|
||||
EXPECT_EQ(0, conn->outstandings.clonedPacketsCount);
|
||||
EXPECT_EQ(0, conn->outstandings.numClonedPackets());
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, ClonedRst) {
|
||||
@@ -2368,7 +2489,7 @@ TEST_F(QuicTransportFunctionsTest, ClonedRst) {
|
||||
getEncodedBodySize(packet),
|
||||
false /* isDSRPacket */);
|
||||
EXPECT_FALSE(conn->outstandings.packets.empty());
|
||||
EXPECT_EQ(1, conn->outstandings.clonedPacketsCount);
|
||||
EXPECT_EQ(1, conn->outstandings.numClonedPackets());
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, TotalBytesSentUpdate) {
|
||||
@@ -2427,7 +2548,7 @@ TEST_F(QuicTransportFunctionsTest, TimeoutBasedRetxCountUpdate) {
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, WriteLimitBytRttFraction) {
|
||||
auto conn = createConn();
|
||||
conn->lossState.srtt = 50ms;
|
||||
conn->lossState.srtt = 150ms;
|
||||
auto mockCongestionController =
|
||||
std::make_unique<NiceMock<MockCongestionController>>();
|
||||
auto rawCongestionController = mockCongestionController.get();
|
||||
@@ -2445,17 +2566,18 @@ TEST_F(QuicTransportFunctionsTest, WriteLimitBytRttFraction) {
|
||||
EXPECT_CALL(*rawSocket, write(_, _)).WillRepeatedly(Return(1));
|
||||
EXPECT_CALL(*rawCongestionController, getWritableBytes())
|
||||
.WillRepeatedly(Return(50));
|
||||
EXPECT_GT(
|
||||
500,
|
||||
writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
500 /* packetLimit */));
|
||||
auto res = writeQuicDataToSocket(
|
||||
*rawSocket,
|
||||
*conn,
|
||||
*conn->clientConnectionId,
|
||||
*conn->serverConnectionId,
|
||||
*aead,
|
||||
*headerCipher,
|
||||
getVersion(*conn),
|
||||
500 /* packetLimit */);
|
||||
|
||||
EXPECT_GT(500, res.packetsWritten);
|
||||
EXPECT_EQ(res.probesWritten, 0);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportFunctionsTest, CongestionControlWritableBytesRoundUp) {
|
||||
@@ -2578,7 +2700,7 @@ TEST_F(QuicTransportFunctionsTest, ProbeWriteNewFunctionalFrames) {
|
||||
conn->transportSettings.writeConnectionDataPacketsLimit);
|
||||
ASSERT_EQ(1, stream->retransmissionBuffer.size());
|
||||
|
||||
conn->pendingEvents.numProbePackets = 1;
|
||||
conn->pendingEvents.numProbePackets[PacketNumberSpace::AppData] = 1;
|
||||
conn->flowControlState.windowSize *= 2;
|
||||
conn->flowControlState.timeOfLastFlowControlUpdate = Clock::now() - 20s;
|
||||
maybeSendConnWindowUpdate(*conn, Clock::now());
|
||||
|
Reference in New Issue
Block a user