Index: net/quic/core/quic_framer_test.cc |
diff --git a/net/quic/core/quic_framer_test.cc b/net/quic/core/quic_framer_test.cc |
index cf757fa6d2af4ef41ec0a8ce7ec2b852bbc03cbe..62769b6b7e6fe4138238bc965f06420b21c8be68 100644 |
--- a/net/quic/core/quic_framer_test.cc |
+++ b/net/quic/core/quic_framer_test.cc |
@@ -1075,6 +1075,8 @@ TEST_P(QuicFramerTest, PacketWithDiversificationNonce) { |
for (char i = 0; i < 32; ++i) { |
EXPECT_EQ(i, (*visitor_.public_header_->nonce)[static_cast<size_t>(i)]); |
} |
+ EXPECT_EQ(1u, visitor_.padding_frames_.size()); |
+ EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes); |
}; |
TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { |
@@ -1127,6 +1129,8 @@ TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { |
ASSERT_TRUE(visitor_.header_.get()); |
EXPECT_EQ(0, visitor_.frame_count_); |
EXPECT_EQ(1, visitor_.version_mismatch_); |
+ EXPECT_EQ(1u, visitor_.padding_frames_.size()); |
+ EXPECT_EQ(5, visitor_.padding_frames_[0]->num_padding_bytes); |
}; |
TEST_P(QuicFramerTest, PaddingFrame) { |
@@ -1187,6 +1191,10 @@ TEST_P(QuicFramerTest, PaddingFrame) { |
}; |
// clang-format on |
+ if (framer_.version() > QUIC_VERSION_37) { |
+ return; |
+ } |
+ |
QuicEncryptedPacket encrypted( |
AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id |
? packet_cid_be |
@@ -1203,6 +1211,8 @@ TEST_P(QuicFramerTest, PaddingFrame) { |
ASSERT_EQ(0u, visitor_.stream_frames_.size()); |
EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
+ EXPECT_EQ(1u, visitor_.padding_frames_.size()); |
+ EXPECT_EQ(28, visitor_.padding_frames_[0]->num_padding_bytes); |
// A packet with no frames is not acceptable. |
CheckProcessingFails( |
FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be |
@@ -1213,6 +1223,95 @@ TEST_P(QuicFramerTest, PaddingFrame) { |
"Packet has no frames.", QUIC_MISSING_PAYLOAD); |
} |
+TEST_P(QuicFramerTest, NewPaddingFrame) { |
+ // clang-format off |
+ unsigned char packet[] = { |
+ // public flags (8 byte connection_id) |
+ 0x38, |
+ // connection_id |
+ 0x10, 0x32, 0x54, 0x76, |
+ 0x98, 0xBA, 0xDC, 0xFE, |
+ // packet number |
+ 0xBC, 0x9A, 0x78, 0x56, |
+ 0x34, 0x12, |
+ |
+ // paddings |
+ 0x00, 0x00, |
+ // frame type (stream frame with fin) |
+ 0xFF, |
+ // stream id |
+ 0x04, 0x03, 0x02, 0x01, |
+ // offset |
+ 0x54, 0x76, 0x10, 0x32, |
+ 0xDC, 0xFE, 0x98, 0xBA, |
+ // data length |
+ 0x0c, 0x00, |
+ // data |
+ 'h', 'e', 'l', 'l', |
+ 'o', ' ', 'w', 'o', |
+ 'r', 'l', 'd', '!', |
+ // paddings |
+ 0x00, 0x00, |
+ }; |
+ |
+ unsigned char packet_cid_be[] = { |
+ // public flags (8 byte connection_id) |
+ 0x38, |
+ // connection_id |
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, |
+ // packet number |
+ 0xBC, 0x9A, 0x78, 0x56, |
+ 0x34, 0x12, |
+ |
+ // paddings |
+ 0x00, 0x00, |
+ // frame type (stream frame with fin) |
+ 0xFF, |
+ // stream id |
+ 0x04, 0x03, 0x02, 0x01, |
+ // offset |
+ 0x54, 0x76, 0x10, 0x32, |
+ 0xDC, 0xFE, 0x98, 0xBA, |
+ // data length |
+ 0x0c, 0x00, |
+ // data |
+ 'h', 'e', 'l', 'l', |
+ 'o', ' ', 'w', 'o', |
+ 'r', 'l', 'd', '!', |
+ // paddings |
+ 0x00, 0x00, |
+ }; |
+ // clang-format on |
+ |
+ if (framer_.version() <= QUIC_VERSION_37) { |
+ return; |
+ } |
+ |
+ QuicEncryptedPacket encrypted( |
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id |
+ ? packet_cid_be |
+ : packet), |
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id |
+ ? arraysize(packet_cid_be) |
+ : arraysize(packet), |
+ false); |
+ EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
+ EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
+ ASSERT_TRUE(visitor_.header_.get()); |
+ EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, |
+ !kIncludeDiversificationNonce)); |
+ |
+ ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
+ EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
+ EXPECT_EQ(2u, visitor_.padding_frames_.size()); |
+ EXPECT_EQ(2, visitor_.padding_frames_[0]->num_padding_bytes); |
+ EXPECT_EQ(2, visitor_.padding_frames_[1]->num_padding_bytes); |
+ EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id); |
+ EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
+ EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); |
+ CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); |
+} |
+ |
TEST_P(QuicFramerTest, StreamFrame) { |
// clang-format off |
unsigned char packet[] = { |
@@ -3250,6 +3349,94 @@ TEST_P(QuicFramerTest, BuildPaddingFramePacket) { |
: arraysize(packet)); |
} |
+TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) { |
+ if (framer_.version() <= QUIC_VERSION_37) { |
+ return; |
+ } |
+ QuicPacketHeader header; |
+ header.public_header.connection_id = kConnectionId; |
+ header.public_header.reset_flag = false; |
+ header.public_header.version_flag = false; |
+ header.packet_number = kPacketNumber; |
+ |
+ QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, |
+ QuicStringPiece("hello world!")); |
+ QuicPaddingFrame padding_frame(2); |
+ QuicFrames frames = {QuicFrame(padding_frame), QuicFrame(&stream_frame), |
+ QuicFrame(padding_frame)}; |
+ |
+ // clang-format off |
+ unsigned char packet[] = { |
+ // public flags (8 byte connection_id) |
+ 0x38, |
+ // connection_id |
+ 0x10, 0x32, 0x54, 0x76, |
+ 0x98, 0xBA, 0xDC, 0xFE, |
+ // packet number |
+ 0xBC, 0x9A, 0x78, 0x56, |
+ 0x34, 0x12, |
+ |
+ // paddings |
+ 0x00, 0x00, |
+ // frame type (stream frame with fin) |
+ 0xFF, |
+ // stream id |
+ 0x04, 0x03, 0x02, 0x01, |
+ // offset |
+ 0x54, 0x76, 0x10, 0x32, |
+ 0xDC, 0xFE, 0x98, 0xBA, |
+ // data length |
+ 0x0c, 0x00, |
+ // data |
+ 'h', 'e', 'l', 'l', |
+ 'o', ' ', 'w', 'o', |
+ 'r', 'l', 'd', '!', |
+ // paddings |
+ 0x00, 0x00, |
+ }; |
+ |
+ unsigned char packet_cid_be[] = { |
+ // public flags (8 byte connection_id) |
+ 0x38, |
+ // connection_id |
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, |
+ // packet number |
+ 0xBC, 0x9A, 0x78, 0x56, |
+ 0x34, 0x12, |
+ |
+ // paddings |
+ 0x00, 0x00, |
+ // frame type (stream frame with fin) |
+ 0xFF, |
+ // stream id |
+ 0x04, 0x03, 0x02, 0x01, |
+ // offset |
+ 0x54, 0x76, 0x10, 0x32, |
+ 0xDC, 0xFE, 0x98, 0xBA, |
+ // data length |
+ 0x0c, 0x00, |
+ // data |
+ 'h', 'e', 'l', 'l', |
+ 'o', ' ', 'w', 'o', |
+ 'r', 'l', 'd', '!', |
+ // paddings |
+ 0x00, 0x00, |
+ }; |
+ // clang-format on |
+ |
+ std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
+ ASSERT_TRUE(data != nullptr); |
+ |
+ test::CompareCharArraysWithHexError( |
+ "constructed packet", data->data(), data->length(), |
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id |
+ ? packet_cid_be |
+ : packet), |
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id |
+ ? arraysize(packet_cid_be) |
+ : arraysize(packet)); |
+} |
+ |
TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { |
QuicPacketHeader header; |
header.public_header.connection_id = kConnectionId; |