Unit tests for QuicBufferedPacketStore::IngestPacketForTlsChloExtraction
Currently, it only checks basic usage of the function:
- Trying to ingest a non-CHLO packet returns false.
- Ingest a multi-packet CHLO returns true.
Does not cover:
- The different logic branches from QUICHE_DCHECK macros
- Logic branches related to QUIC bug 10838
- Validation of `out_alpns`, `out_sni`, `out_resumption_attempted` and `out_early_data_attempted`
PiperOrigin-RevId: 433343211
diff --git a/quic/core/quic_buffered_packet_store_test.cc b/quic/core/quic_buffered_packet_store_test.cc
index 7e51751..8886d6d 100644
--- a/quic/core/quic_buffered_packet_store_test.cc
+++ b/quic/core/quic_buffered_packet_store_test.cc
@@ -10,6 +10,7 @@
#include "quic/core/quic_versions.h"
#include "quic/platform/api/quic_flags.h"
#include "quic/platform/api/quic_test.h"
+#include "quic/test_tools/first_flight.h"
#include "quic/test_tools/mock_clock.h"
#include "quic/test_tools/quic_buffered_packet_store_peer.h"
#include "quic/test_tools/quic_test_utils.h"
@@ -447,6 +448,55 @@
EXPECT_FALSE(store_.HasChlosBuffered());
}
+TEST_F(QuicBufferedPacketStoreTest, IngestPacketForTlsChloExtraction) {
+ QuicConnectionId connection_id = TestConnectionId(1);
+ std::vector<std::string> alpns;
+ std::string sni;
+ bool resumption_attempted = false;
+ bool early_data_attempted = false;
+ QuicConfig config;
+
+ EXPECT_FALSE(store_.HasBufferedPackets(connection_id));
+ store_.EnqueuePacket(connection_id, false, packet_, self_address_,
+ peer_address_, valid_version_, kNoParsedChlo);
+ EXPECT_TRUE(store_.HasBufferedPackets(connection_id));
+
+ // The packet in 'packet_' is not a TLS CHLO packet.
+ EXPECT_FALSE(store_.IngestPacketForTlsChloExtraction(
+ connection_id, valid_version_, packet_, &alpns, &sni,
+ &resumption_attempted, &early_data_attempted));
+
+ store_.DiscardPackets(connection_id);
+
+ // Force the TLS CHLO to span multiple packets.
+ constexpr auto kCustomParameterId =
+ static_cast<TransportParameters::TransportParameterId>(0xff33);
+ std::string kCustomParameterValue(2000, '-');
+ config.custom_transport_parameters_to_send()[kCustomParameterId] =
+ kCustomParameterValue;
+ auto packets = GetFirstFlightOfPackets(valid_version_, config);
+ ASSERT_EQ(packets.size(), 2u);
+
+ store_.EnqueuePacket(connection_id, false, *packets[0], self_address_,
+ peer_address_, valid_version_, kNoParsedChlo);
+ store_.EnqueuePacket(connection_id, false, *packets[1], self_address_,
+ peer_address_, valid_version_, kNoParsedChlo);
+
+ EXPECT_TRUE(store_.HasBufferedPackets(connection_id));
+ EXPECT_FALSE(store_.IngestPacketForTlsChloExtraction(
+ connection_id, valid_version_, *packets[0], &alpns, &sni,
+ &resumption_attempted, &early_data_attempted));
+ EXPECT_TRUE(store_.IngestPacketForTlsChloExtraction(
+ connection_id, valid_version_, *packets[1], &alpns, &sni,
+ &resumption_attempted, &early_data_attempted));
+
+ ASSERT_EQ(alpns.size(), 1u);
+ EXPECT_EQ(alpns[0], AlpnForVersion(valid_version_));
+ EXPECT_EQ(sni, TestHostname());
+
+ EXPECT_FALSE(resumption_attempted);
+ EXPECT_FALSE(early_data_attempted);
+}
} // namespace
} // namespace test
} // namespace quic