Add QuicFramerTest.CoalescedPacketWithZeroesRoundTrip
gfe-relnote: n/a, test-only
PiperOrigin-RevId: 249615801
Change-Id: Id5efb658b11c249e85415ca97b06a015fd1b87ad
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc
index 85af7ea..65022e2 100644
--- a/quic/core/quic_framer_test.cc
+++ b/quic/core/quic_framer_test.cc
@@ -13142,6 +13142,60 @@
ASSERT_EQ(visitor_.coalesced_packets_.size(), 0u);
}
+// Some IETF implementations send an initial followed by zeroes instead of
+// padding inside the initial. We need to make sure that we still process
+// the initial correctly and ignore the zeroes.
+TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
+ if (!QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
+ return;
+ }
+ ASSERT_TRUE(framer_.version().KnowsWhichDecrypterToUse());
+ QuicConnectionId connection_id = FramerTestConnectionId();
+ QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
+
+ CrypterPair client_crypters;
+ CryptoUtils::CreateTlsInitialCrypters(Perspective::IS_CLIENT,
+ framer_.transport_version(),
+ connection_id, &client_crypters);
+ framer_.SetEncrypter(ENCRYPTION_INITIAL,
+ std::move(client_crypters.encrypter));
+
+ QuicPacketHeader header;
+ header.destination_connection_id = connection_id;
+ header.version_flag = true;
+ header.packet_number = kPacketNumber;
+ header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
+ header.long_packet_type = INITIAL;
+ header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ QuicFrames frames = {QuicFrame(QuicPingFrame())};
+
+ std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
+ ASSERT_NE(nullptr, data);
+
+ // Add zeroes after the valid initial packet.
+ unsigned char packet[kMaxOutgoingPacketSize] = {};
+ size_t encrypted_length =
+ framer_.EncryptPayload(ENCRYPTION_INITIAL, header.packet_number, *data,
+ AsChars(packet), QUIC_ARRAYSIZE(packet));
+ ASSERT_NE(0u, encrypted_length);
+
+ QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
+ CrypterPair server_crypters;
+ CryptoUtils::CreateTlsInitialCrypters(Perspective::IS_SERVER,
+ framer_.transport_version(),
+ connection_id, &server_crypters);
+ framer_.InstallDecrypter(ENCRYPTION_INITIAL,
+ std::move(server_crypters.decrypter));
+
+ // Make sure the first long header initial packet parses correctly.
+ QuicEncryptedPacket encrypted(AsChars(packet), QUIC_ARRAYSIZE(packet), false);
+
+ // Make sure we discard the subsequent zeroes.
+ EXPECT_QUIC_PEER_BUG(EXPECT_TRUE(framer_.ProcessPacket(encrypted)),
+ "Server: Received mismatched coalesced header.*");
+}
+
TEST_P(QuicFramerTest, ClientReceivesInvalidVersion) {
if (framer_.transport_version() < QUIC_VERSION_44) {
return;