Allow QuicClientBase to use a fixed server connection id. Remove similar functionality from quic::test::MockableQuicClient.
Add flag --server_connection_id to quic_client to use a fixed server connection id.
PiperOrigin-RevId: 483763340
diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc
index 3fc79a9..d9bed33 100644
--- a/quiche/quic/core/http/end_to_end_test.cc
+++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -266,8 +266,13 @@
if (!pre_shared_key_client_.empty()) {
client->client()->SetPreSharedKey(pre_shared_key_client_);
}
- client->UseConnectionIdLength(override_server_connection_id_length_);
- client->UseClientConnectionIdLength(override_client_connection_id_length_);
+ if (override_server_connection_id_length_ >= 0) {
+ client->UseConnectionIdLength(override_server_connection_id_length_);
+ }
+ if (override_client_connection_id_length_ >= 0) {
+ client->UseClientConnectionIdLength(
+ override_client_connection_id_length_);
+ }
client->client()->set_connection_debug_visitor(connection_debug_visitor_);
client->client()->set_enable_web_transport(enable_web_transport_);
client->Connect();
diff --git a/quiche/quic/test_tools/quic_test_client.cc b/quiche/quic/test_tools/quic_test_client.cc
index 2d6de0d..f711036 100644
--- a/quiche/quic/test_tools/quic_test_client.cc
+++ b/quiche/quic/test_tools/quic_test_client.cc
@@ -217,8 +217,6 @@
this),
std::make_unique<RecordingProofVerifier>(std::move(proof_verifier)),
std::move(session_cache)),
- override_server_connection_id_(EmptyQuicConnectionId()),
- server_connection_id_overridden_(false),
override_client_connection_id_(EmptyQuicConnectionId()),
client_connection_id_overridden_(false) {}
@@ -240,28 +238,6 @@
default_network_helper());
}
-QuicConnectionId MockableQuicClient::GenerateNewConnectionId() {
- if (server_connection_id_overridden_) {
- return override_server_connection_id_;
- }
- if (override_server_connection_id_length_ >= 0) {
- return QuicUtils::CreateRandomConnectionId(
- override_server_connection_id_length_);
- }
- return QuicDefaultClient::GenerateNewConnectionId();
-}
-
-void MockableQuicClient::UseConnectionId(
- QuicConnectionId server_connection_id) {
- server_connection_id_overridden_ = true;
- override_server_connection_id_ = server_connection_id;
-}
-
-void MockableQuicClient::UseConnectionIdLength(
- int server_connection_id_length) {
- override_server_connection_id_length_ = server_connection_id_length;
-}
-
QuicConnectionId MockableQuicClient::GetClientConnectionId() {
if (client_connection_id_overridden_) {
return override_client_connection_id_;
@@ -791,12 +767,13 @@
void QuicTestClient::UseConnectionId(QuicConnectionId server_connection_id) {
QUICHE_DCHECK(!connected());
- client_->UseConnectionId(server_connection_id);
+ client_->set_server_connection_id_override(server_connection_id);
}
-void QuicTestClient::UseConnectionIdLength(int server_connection_id_length) {
+void QuicTestClient::UseConnectionIdLength(
+ uint8_t server_connection_id_length) {
QUICHE_DCHECK(!connected());
- client_->UseConnectionIdLength(server_connection_id_length);
+ client_->set_server_connection_id_length(server_connection_id_length);
}
void QuicTestClient::UseClientConnectionId(
@@ -806,7 +783,7 @@
}
void QuicTestClient::UseClientConnectionIdLength(
- int client_connection_id_length) {
+ uint8_t client_connection_id_length) {
QUICHE_DCHECK(!connected());
client_->UseClientConnectionIdLength(client_connection_id_length);
}
diff --git a/quiche/quic/test_tools/quic_test_client.h b/quiche/quic/test_tools/quic_test_client.h
index a1f7b13..4756e99 100644
--- a/quiche/quic/test_tools/quic_test_client.h
+++ b/quiche/quic/test_tools/quic_test_client.h
@@ -59,9 +59,6 @@
~MockableQuicClient() override;
- QuicConnectionId GenerateNewConnectionId() override;
- void UseConnectionId(QuicConnectionId server_connection_id);
- void UseConnectionIdLength(int server_connection_id_length);
QuicConnectionId GetClientConnectionId() override;
void UseClientConnectionId(QuicConnectionId client_connection_id);
void UseClientConnectionIdLength(int client_connection_id_length);
@@ -78,11 +75,8 @@
const MockableQuicClientDefaultNetworkHelper* mockable_network_helper() const;
private:
- // Server connection ID to use, if server_connection_id_overridden_
- QuicConnectionId override_server_connection_id_;
- bool server_connection_id_overridden_;
- int override_server_connection_id_length_ = -1;
- // Client connection ID to use, if client_connection_id_overridden_
+ // Client connection ID to use, if client_connection_id_overridden_.
+ // TODO(wub): Move client_connection_id_(length_) overrides to QuicClientBase.
QuicConnectionId override_client_connection_id_;
bool client_connection_id_overridden_;
int override_client_connection_id_length_ = -1;
@@ -248,13 +242,13 @@
void UseConnectionId(QuicConnectionId server_connection_id);
// Configures client_ to use a specific server connection ID length instead
// of the default of kQuicDefaultConnectionIdLength.
- void UseConnectionIdLength(int server_connection_id_length);
+ void UseConnectionIdLength(uint8_t server_connection_id_length);
// Configures client_ to use a specific client connection ID instead of an
// empty one.
void UseClientConnectionId(QuicConnectionId client_connection_id);
// Configures client_ to use a specific client connection ID length instead
// of the default of zero.
- void UseClientConnectionIdLength(int client_connection_id_length);
+ void UseClientConnectionIdLength(uint8_t client_connection_id_length);
// Returns nullptr if the maximum number of streams have already been created.
QuicSpdyClientStream* GetOrCreateStream();
diff --git a/quiche/quic/tools/quic_client_base.cc b/quiche/quic/tools/quic_client_base.cc
index 9277913..948707a 100644
--- a/quiche/quic/tools/quic_client_base.cc
+++ b/quiche/quic/tools/quic_client_base.cc
@@ -410,6 +410,9 @@
}
QuicConnectionId QuicClientBase::GetNextConnectionId() {
+ if (server_connection_id_override_.has_value()) {
+ return *server_connection_id_override_;
+ }
return GenerateNewConnectionId();
}
diff --git a/quiche/quic/tools/quic_client_base.h b/quiche/quic/tools/quic_client_base.h
index d36eba6..ac29482 100644
--- a/quiche/quic/tools/quic_client_base.h
+++ b/quiche/quic/tools/quic_client_base.h
@@ -19,6 +19,7 @@
#include "quiche/quic/core/http/quic_spdy_client_session.h"
#include "quiche/quic/core/http/quic_spdy_client_stream.h"
#include "quiche/quic/core/quic_config.h"
+#include "quiche/quic/core/quic_connection_id.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
namespace quic {
@@ -278,6 +279,11 @@
std::string interface_name() { return interface_name_; }
+ void set_server_connection_id_override(
+ const QuicConnectionId& connection_id) {
+ server_connection_id_override_ = connection_id;
+ }
+
void set_server_connection_id_length(uint8_t server_connection_id_length) {
server_connection_id_length_ = server_connection_id_length;
}
@@ -424,6 +430,11 @@
// Not owned, must be valid for the lifetime of the QuicClientBase instance.
QuicConnectionDebugVisitor* connection_debug_visitor_;
+ // If set,
+ // - GetNextConnectionId will use this as the next server connection id.
+ // - GenerateNewConnectionId will not be called.
+ absl::optional<QuicConnectionId> server_connection_id_override_;
+
// GenerateNewConnectionId creates a random connection ID of this length.
// Defaults to 8.
uint8_t server_connection_id_length_;
diff --git a/quiche/quic/tools/quic_toy_client.cc b/quiche/quic/tools/quic_toy_client.cc
index 1c7cdaf..10ca52a 100644
--- a/quiche/quic/tools/quic_toy_client.cc
+++ b/quiche/quic/tools/quic_toy_client.cc
@@ -173,8 +173,16 @@
"If true, close the connection after each "
"request. This allows testing 0-RTT.");
-DEFINE_QUICHE_COMMAND_LINE_FLAG(int32_t, server_connection_id_length, -1,
- "Length of the server connection ID used.");
+DEFINE_QUICHE_COMMAND_LINE_FLAG(
+ std::string, server_connection_id, "",
+ "If non-empty, the client will use the given server connection id for all "
+ "connections. The flag value is the hex-string of the on-wire connection id"
+ " bytes, e.g. '--server_connection_id=0123456789abcdef'.");
+
+DEFINE_QUICHE_COMMAND_LINE_FLAG(
+ int32_t, server_connection_id_length, -1,
+ "Length of the server connection ID used. This flag has no effects if "
+ "--server_connection_id is non-empty.");
DEFINE_QUICHE_COMMAND_LINE_FLAG(int32_t, client_connection_id_length, -1,
"Length of the client connection ID used.");
@@ -355,6 +363,17 @@
initial_mtu != 0 ? initial_mtu : quic::kDefaultMaxPacketSize);
client->set_drop_response_body(
quiche::GetQuicheCommandLineFlag(FLAGS_drop_response_body));
+ const std::string server_connection_id_hex_string =
+ quiche::GetQuicheCommandLineFlag(FLAGS_server_connection_id);
+ QUICHE_CHECK(server_connection_id_hex_string.size() % 2 == 0)
+ << "The length of --server_connection_id must be even. It is "
+ << server_connection_id_hex_string.size() << "-byte long.";
+ if (!server_connection_id_hex_string.empty()) {
+ const std::string server_connection_id_bytes =
+ absl::HexStringToBytes(server_connection_id_hex_string);
+ client->set_server_connection_id_override(QuicConnectionId(
+ server_connection_id_bytes.data(), server_connection_id_bytes.size()));
+ }
const int32_t server_connection_id_length =
quiche::GetQuicheCommandLineFlag(FLAGS_server_connection_id_length);
if (server_connection_id_length >= 0) {