Add Quantum-readiness test to quic_client_interop_test Test-only PiperOrigin-RevId: 315754566 Change-Id: Idf8af53a16023ae9c54cfe13cab1f5e06e587f46
diff --git a/quic/tools/quic_client_interop_test_bin.cc b/quic/tools/quic_client_interop_test_bin.cc index aadf459..e6b9e73 100644 --- a/quic/tools/quic_client_interop_test_bin.cc +++ b/quic/tools/quic_client_interop_test_bin.cc
@@ -45,6 +45,9 @@ kZeroRtt, // A RETRY packet was successfully processed. kRetry, + // A handshake using a ClientHello that spans multiple packets completed + // successfully. + kQuantum, // Second row of features (anything else protocol-related) // We switched to a different port and the server migrated to it. @@ -74,6 +77,8 @@ return 'Z'; case Feature::kRetry: return 'S'; + case Feature::kQuantum: + return 'Q'; case Feature::kRebinding: return 'B'; case Feature::kHttp3: @@ -101,7 +106,8 @@ QuicServerId server_id, ParsedQuicVersion version, bool test_version_negotiation, - bool attempt_rebind); + bool attempt_rebind, + bool attempt_multi_packet_chlo); // Constructs a SpdyHeaderBlock containing the pseudo-headers needed to make a // GET request to "/" on the hostname |authority|. @@ -184,7 +190,8 @@ QuicServerId server_id, ParsedQuicVersion version, bool test_version_negotiation, - bool attempt_rebind) { + bool attempt_rebind, + bool attempt_multi_packet_chlo) { ParsedQuicVersionVector versions = {version}; if (test_version_negotiation) { versions.insert(versions.begin(), QuicVersionReservedForNegotiation()); @@ -197,6 +204,15 @@ QuicConfig config; QuicTime::Delta timeout = QuicTime::Delta::FromSeconds(20); config.SetIdleNetworkTimeout(timeout); + if (attempt_multi_packet_chlo) { + // Make the ClientHello span multiple packets by adding a custom transport + // parameter. + constexpr auto kCustomParameter = + static_cast<TransportParameters::TransportParameterId>(0x173E); + std::string custom_value(2000, '?'); + config.custom_transport_parameters_to_send()[kCustomParameter] = + custom_value; + } auto client = std::make_unique<QuicClient>( addr, server_id, versions, config, &epoll_server, std::move(proof_verifier), std::move(session_cache)); @@ -221,13 +237,24 @@ if (test_version_negotiation && !connect_result) { // Failed to negotiate version, retry without version negotiation. AttemptRequest(addr, authority, server_id, version, - /*test_version_negotiation=*/false, attempt_rebind); + /*test_version_negotiation=*/false, attempt_rebind, + attempt_multi_packet_chlo); return; } if (!client->session()->OneRttKeysAvailable()) { + if (attempt_multi_packet_chlo) { + // Failed to handshake with multi-packet client hello, retry without it. + AttemptRequest(addr, authority, server_id, version, + test_version_negotiation, attempt_rebind, + /*attempt_multi_packet_chlo=*/false); + return; + } return; } InsertFeature(Feature::kHandshake); + if (attempt_multi_packet_chlo) { + InsertFeature(Feature::kQuantum); + } spdy::SpdyHeaderBlock header_block = ConstructHeaderBlock(authority); SendRequest(client.get(), header_block); @@ -250,7 +277,8 @@ if (!client->connected()) { // Rebinding does not work, retry without attempting it. AttemptRequest(addr, authority, server_id, version, - test_version_negotiation, /*attempt_rebind=*/false); + test_version_negotiation, /*attempt_rebind=*/false, + attempt_multi_packet_chlo); return; } InsertFeature(Feature::kRebinding); @@ -339,7 +367,8 @@ runner.AttemptRequest(addr, authority, server_id, version, /*test_version_negotiation=*/true, - /*attempt_rebind=*/true); + /*attempt_rebind=*/true, + /*attempt_multi_packet_chlo=*/true); return runner.features(); }