Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(455)

Unified Diff: net/quic/core/quic_packet_creator_test.cc

Issue 2828543002: Let QUIC be able to add random padding of [1,256] bytes after fin is consumed for a stream. Random … (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/core/quic_packet_creator.cc ('k') | net/quic/core/quic_packet_generator.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/core/quic_packet_creator_test.cc
diff --git a/net/quic/core/quic_packet_creator_test.cc b/net/quic/core/quic_packet_creator_test.cc
index 69cf24d467f7f4ae5c72a85cecd97c3033de2d1c..41a159379d2e203ffa5f21b761d1e9a347d5bf7f 100644
--- a/net/quic/core/quic_packet_creator_test.cc
+++ b/net/quic/core/quic_packet_creator_test.cc
@@ -359,7 +359,7 @@ TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPadding) {
delete frame.stream_frame;
}
-TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSpecifiedPadding) {
+TEST_P(QuicPacketCreatorTest, DoNotRetransmitPendingPadding) {
QuicFrame frame;
QuicIOVector io_vector(MakeIOVectorFromStringPiece("fake message data"));
QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId,
@@ -381,6 +381,20 @@ TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSpecifiedPadding) {
packet_size = serialized_packet_.encrypted_length;
}
+ {
+ InSequence s;
+ EXPECT_CALL(framer_visitor_, OnPacket());
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
+ EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
+ EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
+ EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
+ // Pending paddings are not retransmitted.
+ EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
+ EXPECT_CALL(framer_visitor_, OnPacketComplete());
+ }
+ ProcessPacket(serialized_packet_);
+
const int kNumPaddingBytes2 = 44;
QuicFrames frames;
frames.push_back(frame);
@@ -393,8 +407,7 @@ TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSpecifiedPadding) {
.WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
- EXPECT_EQ(packet_size + kNumPaddingBytes2 - kNumPaddingBytes1,
- serialized_packet_.encrypted_length);
+ EXPECT_EQ(packet_size, serialized_packet_.encrypted_length);
delete frame.stream_frame;
}
@@ -853,6 +866,169 @@ TEST_P(QuicPacketCreatorTest, ChloTooLarge) {
"Client hello won't fit in a single packet.");
}
+TEST_P(QuicPacketCreatorTest, PendingPadding) {
+ EXPECT_EQ(0u, creator_.pending_padding_bytes());
+ creator_.AddPendingPadding(kMaxNumRandomPaddingBytes * 10);
+ EXPECT_EQ(kMaxNumRandomPaddingBytes * 10, creator_.pending_padding_bytes());
+
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillRepeatedly(
+ Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+ // Flush all paddings.
+ while (creator_.pending_padding_bytes() > 0) {
+ creator_.Flush();
+ {
+ InSequence s;
+ EXPECT_CALL(framer_visitor_, OnPacket());
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
+ EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
+ EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
+ EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
+ EXPECT_CALL(framer_visitor_, OnPacketComplete());
+ }
+ // Packet only contains padding.
+ ProcessPacket(serialized_packet_);
+ }
+ EXPECT_EQ(0u, creator_.pending_padding_bytes());
+}
+
+TEST_P(QuicPacketCreatorTest, FullPaddingDoesNotConsumePendingPadding) {
+ creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
+ QuicFrame frame;
+ QuicIOVector io_vector(MakeIOVectorFromStringPiece("test"));
+ ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false,
+ /*needs_full_padding=*/true, &frame));
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+ creator_.Flush();
+ EXPECT_EQ(kMaxNumRandomPaddingBytes, creator_.pending_padding_bytes());
+}
+
+TEST_P(QuicPacketCreatorTest, SendPendingPaddingInRetransmission) {
+ QuicStreamFrame* stream_frame = new QuicStreamFrame(
+ kCryptoStreamId, /*fin=*/false, 0u, QuicStringPiece());
+ QuicFrames frames;
+ frames.push_back(QuicFrame(stream_frame));
+ char buffer[kMaxPacketSize];
+ QuicPendingRetransmission retransmission(
+ CreateRetransmission(frames, true, /*num_padding_bytes=*/0,
+ ENCRYPTION_NONE, PACKET_1BYTE_PACKET_NUMBER));
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+ creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
+ creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
+ EXPECT_EQ(0u, creator_.pending_padding_bytes());
+ {
+ InSequence s;
+ EXPECT_CALL(framer_visitor_, OnPacket());
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
+ EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
+ EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
+ EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
+ EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
+ EXPECT_CALL(framer_visitor_, OnPacketComplete());
+ }
+ ProcessPacket(serialized_packet_);
+ delete stream_frame;
+}
+
+TEST_P(QuicPacketCreatorTest, SendPacketAfterFullPaddingRetransmission) {
+ // Making sure needs_full_padding gets reset after a full padding
+ // retransmission.
+ EXPECT_EQ(0u, creator_.pending_padding_bytes());
+ QuicFrame frame;
+ QuicIOVector io_vector(
+ MakeIOVectorFromStringPiece("fake handshake message data"));
+ QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId,
+ io_vector, 0u, 0u, false, &frame);
+ QuicFrames frames;
+ frames.push_back(frame);
+ char buffer[kMaxPacketSize];
+ QuicPendingRetransmission retransmission(CreateRetransmission(
+ frames, true, /*num_padding_bytes=*/-1, ENCRYPTION_NONE,
+ QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)));
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillRepeatedly(
+ Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+ creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize);
+ EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length);
+ {
+ InSequence s;
+ EXPECT_CALL(framer_visitor_, OnPacket());
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
+ EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
+ EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
+ EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
+ // Full padding.
+ EXPECT_CALL(framer_visitor_, OnPaddingFrame(_));
+ EXPECT_CALL(framer_visitor_, OnPacketComplete());
+ }
+ ProcessPacket(serialized_packet_);
+ delete frame.stream_frame;
+
+ creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, false,
+ &frame);
+ creator_.Flush();
+ {
+ InSequence s;
+ EXPECT_CALL(framer_visitor_, OnPacket());
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
+ EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
+ EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
+ EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
+ EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
+ // needs_full_padding gets reset.
+ EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(0);
+ EXPECT_CALL(framer_visitor_, OnPacketComplete());
+ }
+ ProcessPacket(serialized_packet_);
+}
+
+TEST_P(QuicPacketCreatorTest, ConsumeDataAndRandomPadding) {
+ const QuicByteCount kStreamFramePayloadSize = 100u;
+ // Set the packet size be enough for one stream frame with 0 stream offset +
+ // 1.
+ size_t length = GetPacketHeaderOverhead(client_framer_.version()) +
+ GetEncryptionOverhead() +
+ QuicFramer::GetMinStreamFrameSize(
+ kCryptoStreamId, 0, /*last_frame_in_packet=*/false) +
+ kStreamFramePayloadSize + 1;
+ creator_.SetMaxPacketLength(length);
+ creator_.AddPendingPadding(kMaxNumRandomPaddingBytes);
+ QuicByteCount pending_padding_bytes = creator_.pending_padding_bytes();
+ QuicFrame frame;
+ char buf[kStreamFramePayloadSize + 1] = {};
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillRepeatedly(
+ Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+ // Send stream frame of size kStreamFramePayloadSize.
+ creator_.ConsumeData(kCryptoStreamId,
+ MakeIOVectorFromStringPiece(
+ QuicStringPiece(buf, kStreamFramePayloadSize)),
+ 0u, 0u, false, false, &frame);
+ creator_.Flush();
+ delete frame.stream_frame;
+ // 1 byte padding is sent.
+ EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
+ // Send stream frame of size kStreamFramePayloadSize + 1.
+ creator_.ConsumeData(kCryptoStreamId,
+ MakeIOVectorFromStringPiece(
+ QuicStringPiece(buf, kStreamFramePayloadSize + 1)),
+ 0u, 0u, false, false, &frame);
+ // No padding is sent.
+ creator_.Flush();
+ delete frame.stream_frame;
+ EXPECT_EQ(pending_padding_bytes - 1, creator_.pending_padding_bytes());
+ // Flush all paddings.
+ while (creator_.pending_padding_bytes() > 0) {
+ creator_.Flush();
+ }
+ EXPECT_EQ(0u, creator_.pending_padding_bytes());
+}
+
} // namespace
} // namespace test
} // namespace net
« no previous file with comments | « net/quic/core/quic_packet_creator.cc ('k') | net/quic/core/quic_packet_generator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698