Improve QuicFramer testing of retry
This CL cleans up the server-side retry test to ensure it uses the correct packet for the version under test, and verifies that OnRetryPacket is appropriately called or not.
gfe-relnote: n/a, test-only
PiperOrigin-RevId: 292155834
Change-Id: I705f3ceb4336dfcdaaa795a0f69fc4114c74a321
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc
index c24520c..8e272ce 100644
--- a/quic/core/quic_framer_test.cc
+++ b/quic/core/quic_framer_test.cc
@@ -228,6 +228,7 @@
quiche::QuicheStringPiece retry_token,
quiche::QuicheStringPiece retry_integrity_tag,
quiche::QuicheStringPiece retry_without_tag) override {
+ on_retry_packet_called_ = true;
retry_original_connection_id_ =
std::make_unique<QuicConnectionId>(original_connection_id);
retry_new_connection_id_ =
@@ -563,6 +564,7 @@
std::unique_ptr<std::string> retry_token_;
std::unique_ptr<std::string> retry_token_integrity_tag_;
std::unique_ptr<std::string> retry_without_tag_;
+ bool on_retry_packet_called_ = false;
std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_;
@@ -5777,6 +5779,7 @@
EXPECT_THAT(framer_.error(), IsQuicNoError());
ASSERT_TRUE(visitor_.header_.get());
+ ASSERT_TRUE(visitor_.on_retry_packet_called_);
ASSERT_TRUE(visitor_.retry_new_connection_id_.get());
ASSERT_TRUE(visitor_.retry_token_.get());
@@ -5805,38 +5808,28 @@
EXPECT_EQ(FramerTestConnectionIdPlusOne(),
*visitor_.retry_new_connection_id_.get());
EXPECT_EQ("Hello this is RETRY!", *visitor_.retry_token_.get());
-}
-TEST_P(QuicFramerTest, RejectIetfRetryPacketAsServer) {
- if (!framer_.version().SupportsRetry()) {
- return;
- }
- // IETF RETRY is only sent from client to server.
+ // IETF RETRY is only sent from client to server, the rest of this test
+ // ensures that the server correctly drops them without acting on them.
QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER);
- // clang-format off
- unsigned char packet[] = {
- // public flags (long header with packet type RETRY and ODCIL=8)
- 0xF5,
- // version
- QUIC_VERSION_BYTES,
- // connection ID lengths
- 0x00, 0x08,
- // source connection ID
- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x11,
- // original destination connection ID
- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
- // retry token
- 'H', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'i', 's',
- ' ', 'i', 's', ' ', 'R', 'E', 'T', 'R', 'Y', '!',
- };
- // clang-format on
+ // Reset our visitor state to default settings.
+ visitor_.retry_original_connection_id_.reset();
+ visitor_.retry_new_connection_id_.reset();
+ visitor_.retry_token_.reset();
+ visitor_.retry_token_integrity_tag_.reset();
+ visitor_.retry_without_tag_.reset();
+ visitor_.on_retry_packet_called_ = false;
- QuicEncryptedPacket encrypted(AsChars(packet), QUICHE_ARRAYSIZE(packet),
- false);
EXPECT_FALSE(framer_.ProcessPacket(encrypted));
EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_PACKET_HEADER));
EXPECT_EQ("Client-initiated RETRY is invalid.", framer_.detailed_error());
+
+ EXPECT_FALSE(visitor_.on_retry_packet_called_);
+ EXPECT_FALSE(visitor_.retry_new_connection_id_.get());
+ EXPECT_FALSE(visitor_.retry_token_.get());
+ EXPECT_FALSE(visitor_.retry_token_integrity_tag_.get());
+ EXPECT_FALSE(visitor_.retry_without_tag_.get());
}
TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
@@ -8693,7 +8686,6 @@
QUICHE_ARRAYSIZE(packet46));
}
-
// Test that the MTU discovery packet is serialized correctly as a PING packet.
TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) {
QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);