Refactor QuicDispatcher tests
The dispatcher tests were incorrectly using
QUIC_CRYPTO CHLOs with TLS versions. This CL
updates them to use real packets from
GetFirstFlightOfPackets().
gfe-relnote: n/a, test-only
PiperOrigin-RevId: 307802112
Change-Id: I0c5af0a273f74036da72587da3838a489064acaf
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc
index d52651a..cc98335 100644
--- a/quic/core/quic_dispatcher_test.cc
+++ b/quic/core/quic_dispatcher_test.cc
@@ -27,6 +27,7 @@
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
#include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h"
#include "net/third_party/quiche/src/quic/test_tools/fake_proof_source.h"
+#include "net/third_party/quiche/src/quic/test_tools/first_flight.h"
#include "net/third_party/quiche/src/quic/test_tools/mock_quic_time_wait_list_manager.h"
#include "net/third_party/quiche/src/quic/test_tools/quic_buffered_packet_store_peer.h"
#include "net/third_party/quiche/src/quic/test_tools/quic_crypto_server_config_peer.h"
@@ -294,17 +295,25 @@
client_connection_id_included, packet_number_length, &versions));
std::unique_ptr<QuicReceivedPacket> received_packet(
ConstructReceivedPacket(*packet, mock_helper_.GetClock()->Now()));
+ ProcessReceivedPacket(std::move(received_packet), peer_address, version,
+ server_connection_id);
+ }
- if (ChloExtractor::Extract(*packet, version, {}, nullptr,
+ void ProcessReceivedPacket(
+ std::unique_ptr<QuicReceivedPacket> received_packet,
+ const QuicSocketAddress& peer_address,
+ const ParsedQuicVersion& version,
+ const QuicConnectionId& server_connection_id) {
+ if (ChloExtractor::Extract(*received_packet, version, {}, nullptr,
server_connection_id.length())) {
// Add CHLO packet to the beginning to be verified first, because it is
// also processed first by new session.
data_connection_map_[server_connection_id].push_front(
- std::string(packet->data(), packet->length()));
+ std::string(received_packet->data(), received_packet->length()));
} else {
// For non-CHLO, always append to last.
data_connection_map_[server_connection_id].push_back(
- std::string(packet->data(), packet->length()));
+ std::string(received_packet->data(), received_packet->length()));
}
dispatcher_->ProcessPacket(server_address_, peer_address, *received_packet);
}
@@ -353,16 +362,41 @@
std::string SerializeCHLO() {
CryptoHandshakeMessage client_hello;
client_hello.set_tag(kCHLO);
- client_hello.SetStringPiece(kALPN, "hq");
+ client_hello.SetStringPiece(kALPN, ExpectedAlpn());
return std::string(client_hello.GetSerialized().AsStringPiece());
}
+ void ProcessFirstFlight(const QuicSocketAddress& peer_address,
+ const QuicConnectionId& server_connection_id) {
+ ProcessFirstFlight(version_, peer_address, server_connection_id);
+ }
+
+ void ProcessFirstFlight(const ParsedQuicVersion& version,
+ const QuicSocketAddress& peer_address,
+ const QuicConnectionId& server_connection_id) {
+ ProcessFirstFlight(version, peer_address, server_connection_id,
+ EmptyQuicConnectionId());
+ }
+
+ void ProcessFirstFlight(const ParsedQuicVersion& version,
+ const QuicSocketAddress& peer_address,
+ const QuicConnectionId& server_connection_id,
+ const QuicConnectionId& client_connection_id) {
+ std::vector<std::unique_ptr<QuicReceivedPacket>> packets =
+ GetFirstFlightOfPackets(version, server_connection_id,
+ client_connection_id);
+ for (auto&& packet : packets) {
+ ProcessReceivedPacket(std::move(packet), peer_address, version,
+ server_connection_id);
+ }
+ }
+
std::string ExpectedAlpnForVersion(ParsedQuicVersion version) {
if (version.handshake_protocol == PROTOCOL_TLS1_3) {
// TODO(b/149597791) Remove this once we can parse ALPN with TLS.
return "";
}
- return "hq";
+ return AlpnForVersion(version);
}
std::string ExpectedAlpn() { return ExpectedAlpnForVersion(version_); }
@@ -388,8 +422,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(connection_id)));
- ProcessPacket(client_address, connection_id, true, version, SerializeCHLO(),
- true, CONNECTION_ID_PRESENT, PACKET_4BYTE_PACKET_NUMBER, 1);
+ ProcessFirstFlight(version, client_address, connection_id);
}
void VerifyVersionNotSupported(ParsedQuicVersion version) {
@@ -398,8 +431,7 @@
EXPECT_CALL(*dispatcher_,
CreateQuicSession(connection_id, client_address, _, _))
.Times(0);
- ProcessPacket(client_address, connection_id, true, version, SerializeCHLO(),
- true, CONNECTION_ID_PRESENT, PACKET_4BYTE_PACKET_NUMBER, 1);
+ ProcessFirstFlight(version, client_address, connection_id);
}
ParsedQuicVersion version_;
@@ -452,9 +484,8 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
- ProcessPacket(client_address, TestConnectionId(1), true, version_,
- SerializeCHLO(), true, CONNECTION_ID_PRESENT,
- PACKET_4BYTE_PACKET_NUMBER, 1);
+
+ ProcessFirstFlight(client_address, TestConnectionId(1));
}
TEST_P(QuicDispatcherTestAllVersions, ProcessPackets) {
@@ -475,7 +506,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
- ProcessPacket(client_address, TestConnectionId(1), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(1));
EXPECT_CALL(*dispatcher_,
CreateQuicSession(TestConnectionId(2), client_address,
@@ -492,7 +523,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(2))));
- ProcessPacket(client_address, TestConnectionId(2), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(2));
EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
ProcessUdpPacket(_, _, _))
@@ -525,9 +556,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
- ProcessPacket(client_address, TestConnectionId(1), true, version_,
- SerializeCHLO(), true, CONNECTION_ID_PRESENT,
- PACKET_4BYTE_PACKET_NUMBER, 1);
+ ProcessFirstFlight(client_address, TestConnectionId(1));
// Packet number 256 with packet number length 1 would be considered as 0 in
// dispatcher.
ProcessPacket(client_address, TestConnectionId(1), false, version_, "", true,
@@ -543,13 +572,8 @@
*time_wait_list_manager_,
SendVersionNegotiationPacket(TestConnectionId(1), _, _, _, _, _, _, _))
.Times(1);
- // Pad the CHLO message with enough data to make the packet large enough
- // to trigger version negotiation.
- std::string chlo = SerializeCHLO() + std::string(1200, 'a');
- DCHECK_LE(1200u, chlo.length());
- ProcessPacket(client_address, TestConnectionId(1), true,
- QuicVersionReservedForNegotiation(), chlo, true,
- CONNECTION_ID_PRESENT, PACKET_4BYTE_PACKET_NUMBER, 1);
+ ProcessFirstFlight(QuicVersionReservedForNegotiation(), client_address,
+ TestConnectionId(1));
}
TEST_P(QuicDispatcherTestOneVersion,
@@ -562,13 +586,8 @@
EXPECT_CALL(*time_wait_list_manager_,
SendVersionNegotiationPacket(connection_id, _, _, _, _, _, _, _))
.Times(1);
- // Pad the CHLO message with enough data to make the packet large enough
- // to trigger version negotiation.
- std::string chlo = SerializeCHLO() + std::string(1200, 'a');
- DCHECK_LE(1200u, chlo.length());
- ProcessPacket(client_address, connection_id, true,
- QuicVersionReservedForNegotiation(), chlo, true,
- CONNECTION_ID_PRESENT, PACKET_4BYTE_PACKET_NUMBER, 1);
+ ProcessFirstFlight(QuicVersionReservedForNegotiation(), client_address,
+ connection_id);
}
TEST_P(QuicDispatcherTestOneVersion,
@@ -581,14 +600,8 @@
SendVersionNegotiationPacket(
TestConnectionId(1), TestConnectionId(2), _, _, _, _, _, _))
.Times(1);
- // Pad the CHLO message with enough data to make the packet large enough
- // to trigger version negotiation.
- std::string chlo = SerializeCHLO() + std::string(1200, 'a');
- DCHECK_LE(1200u, chlo.length());
- ProcessPacket(client_address, TestConnectionId(1), TestConnectionId(2), true,
- QuicVersionReservedForNegotiation(), chlo, true,
- CONNECTION_ID_PRESENT, CONNECTION_ID_PRESENT,
- PACKET_4BYTE_PACKET_NUMBER, 1);
+ ProcessFirstFlight(QuicVersionReservedForNegotiation(), client_address,
+ TestConnectionId(1), TestConnectionId(2));
}
TEST_P(QuicDispatcherTestOneVersion, NoVersionNegotiationWithSmallPacket) {
@@ -652,7 +665,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
- ProcessPacket(client_address, TestConnectionId(1), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(1));
EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
CloseConnection(QUIC_PEER_GOING_AWAY, _, _));
@@ -681,7 +694,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
- ProcessPacket(client_address, connection_id, true, SerializeCHLO());
+ ProcessFirstFlight(client_address, connection_id);
// Now close the connection, which should add it to the time wait list.
session1_->connection()->CloseConnection(
@@ -717,7 +730,8 @@
.Times(0);
EXPECT_CALL(*time_wait_list_manager_, SendPublicReset(_, _, _, _, _))
.Times(1);
- ProcessPacket(client_address, connection_id, false, SerializeCHLO());
+ ProcessPacket(client_address, connection_id, /*has_version_flag=*/false,
+ "data");
}
TEST_P(QuicDispatcherTestAllVersions,
@@ -772,7 +786,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(bad_connection_id)));
- ProcessPacket(client_address, bad_connection_id, true, SerializeCHLO());
+ ProcessFirstFlight(client_address, bad_connection_id);
}
// Makes sure zero-byte connection IDs are replaced by 8-byte ones.
@@ -809,7 +823,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(bad_connection_id)));
- ProcessPacket(client_address, bad_connection_id, true, SerializeCHLO());
+ ProcessFirstFlight(client_address, bad_connection_id);
}
// Makes sure TestConnectionId(1) creates a new connection and
@@ -839,7 +853,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
- ProcessPacket(client_address, TestConnectionId(1), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(1));
EXPECT_CALL(*dispatcher_,
CreateQuicSession(fixed_connection_id, client_address,
@@ -857,7 +871,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(bad_connection_id)));
- ProcessPacket(client_address, bad_connection_id, true, SerializeCHLO());
+ ProcessFirstFlight(client_address, bad_connection_id);
EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
ProcessUdpPacket(_, _, _))
@@ -881,7 +895,8 @@
EXPECT_CALL(*time_wait_list_manager_,
AddConnectionIdToTimeWait(_, _, _, _, _))
.Times(0);
- ProcessPacket(client_address, TestConnectionId(1), true, SerializeCHLO());
+ ProcessPacket(client_address, TestConnectionId(1), /*has_version_flag=*/true,
+ "data");
}
TEST_P(QuicDispatcherTestAllVersions,
@@ -900,10 +915,14 @@
EXPECT_CALL(*time_wait_list_manager_,
AddConnectionIdToTimeWait(_, _, _, _, _))
.Times(0);
- ProcessPacket(client_address, EmptyQuicConnectionId(), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, EmptyQuicConnectionId());
}
TEST_P(QuicDispatcherTestAllVersions, OKSeqNoPacketProcessed) {
+ if (version_.handshake_protocol == PROTOCOL_TLS1_3) {
+ // QUIC+TLS allows clients to start with any packet number.
+ return;
+ }
QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
QuicConnectionId connection_id = TestConnectionId(1);
@@ -1342,7 +1361,7 @@
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(1), packet);
})));
- ProcessPacket(client_address, TestConnectionId(1), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(1));
dispatcher_->StopAcceptingNewConnections();
EXPECT_FALSE(dispatcher_->accept_new_connections());
@@ -1352,7 +1371,7 @@
CreateQuicSession(TestConnectionId(2), client_address,
Eq(ExpectedAlpn()), _))
.Times(0u);
- ProcessPacket(client_address, TestConnectionId(2), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(2));
// Existing connections should be able to continue.
EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
@@ -1373,7 +1392,7 @@
CreateQuicSession(TestConnectionId(2), client_address,
Eq(ExpectedAlpn()), _))
.Times(0u);
- ProcessPacket(client_address, TestConnectionId(2), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(2));
dispatcher_->StartAcceptingNewConnections();
EXPECT_TRUE(dispatcher_->accept_new_connections());
@@ -1390,7 +1409,7 @@
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(1), packet);
})));
- ProcessPacket(client_address, TestConnectionId(1), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(1));
}
// Verify the stopgap test: Packets with truncated connection IDs should be
@@ -1465,7 +1484,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
- ProcessPacket(client_address, TestConnectionId(1), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(1));
EXPECT_CALL(*dispatcher_,
CreateQuicSession(_, client_address, Eq(ExpectedAlpn()), _))
@@ -1481,7 +1500,7 @@
EXPECT_CALL(*dispatcher_,
ShouldCreateOrBufferPacketForConnection(
ReceivedPacketInfoConnectionIdEquals(TestConnectionId(2))));
- ProcessPacket(client_address, TestConnectionId(2), true, SerializeCHLO());
+ ProcessFirstFlight(client_address, TestConnectionId(2));
blocked_list_ = QuicDispatcherPeer::GetWriteBlockedList(dispatcher_.get());
}