Allow copy constructor of TransportParameters. gfe-relnote: unused code. not protected. PiperOrigin-RevId: 305522294 Change-Id: Ic954d44bf127b2aea85313a164f20d203693be44
diff --git a/quic/core/crypto/transport_parameters.cc b/quic/core/crypto/transport_parameters.cc index 4cefcdd..4a6a0c7 100644 --- a/quic/core/crypto/transport_parameters.cc +++ b/quic/core/crypto/transport_parameters.cc
@@ -7,9 +7,11 @@ #include <cstdint> #include <cstring> #include <forward_list> +#include <memory> #include <utility> #include "net/third_party/quiche/src/quic/core/crypto/crypto_framer.h" +#include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake_message.h" #include "net/third_party/quiche/src/quic/core/quic_connection_id.h" #include "net/third_party/quiche/src/quic/core/quic_data_reader.h" #include "net/third_party/quiche/src/quic/core/quic_data_writer.h" @@ -413,9 +415,42 @@ max_datagram_frame_size(kMaxDatagramFrameSize) // Important note: any new transport parameters must be added // to TransportParameters::AreValid, SerializeTransportParameters and -// ParseTransportParameters. +// ParseTransportParameters, TransportParameters's custom copy constructor, and +// TransportParametersTest.CopyConstructor. {} +TransportParameters::TransportParameters(const TransportParameters& other) + : perspective(other.perspective), + version(other.version), + supported_versions(other.supported_versions), + original_connection_id(other.original_connection_id), + idle_timeout_milliseconds(other.idle_timeout_milliseconds), + stateless_reset_token(other.stateless_reset_token), + max_packet_size(other.max_packet_size), + initial_max_data(other.initial_max_data), + initial_max_stream_data_bidi_local( + other.initial_max_stream_data_bidi_local), + initial_max_stream_data_bidi_remote( + other.initial_max_stream_data_bidi_remote), + initial_max_stream_data_uni(other.initial_max_stream_data_uni), + initial_max_streams_bidi(other.initial_max_streams_bidi), + initial_max_streams_uni(other.initial_max_streams_uni), + ack_delay_exponent(other.ack_delay_exponent), + max_ack_delay(other.max_ack_delay), + disable_migration(other.disable_migration), + active_connection_id_limit(other.active_connection_id_limit), + max_datagram_frame_size(other.max_datagram_frame_size), + custom_parameters(other.custom_parameters) { + if (other.preferred_address) { + preferred_address = std::make_unique<TransportParameters::PreferredAddress>( + *other.preferred_address); + } + if (other.google_quic_params) { + google_quic_params = + std::make_unique<CryptoHandshakeMessage>(*other.google_quic_params); + } +} + bool TransportParameters::AreValid(std::string* error_details) const { DCHECK(perspective == Perspective::IS_CLIENT || perspective == Perspective::IS_SERVER);
diff --git a/quic/core/crypto/transport_parameters.h b/quic/core/crypto/transport_parameters.h index 831caec..e4737c2 100644 --- a/quic/core/crypto/transport_parameters.h +++ b/quic/core/crypto/transport_parameters.h
@@ -35,7 +35,6 @@ public: // Forbid constructing and copying apart from TransportParameters. IntegerParameter() = delete; - IntegerParameter(const IntegerParameter&) = delete; IntegerParameter& operator=(const IntegerParameter&) = delete; // Sets the value of this transport parameter. void set_value(uint64_t value); @@ -67,6 +66,8 @@ uint64_t default_value, uint64_t min_value, uint64_t max_value); + IntegerParameter(const IntegerParameter& other) = default; + IntegerParameter(IntegerParameter&& other) = default; // Human-readable string representation. std::string ToString(bool for_use_in_list) const; @@ -88,6 +89,8 @@ // send to clients. struct QUIC_EXPORT_PRIVATE PreferredAddress { PreferredAddress(); + PreferredAddress(const PreferredAddress& other) = default; + PreferredAddress(PreferredAddress&& other) = default; ~PreferredAddress(); QuicSocketAddress ipv4_socket_address; @@ -103,6 +106,7 @@ }; TransportParameters(); + TransportParameters(const TransportParameters& other); ~TransportParameters(); // Represents the sender of the transport parameters. When |perspective| is
diff --git a/quic/core/crypto/transport_parameters_test.cc b/quic/core/crypto/transport_parameters_test.cc index bbcba74..51e5145 100644 --- a/quic/core/crypto/transport_parameters_test.cc +++ b/quic/core/crypto/transport_parameters_test.cc
@@ -125,6 +125,77 @@ ::testing::ValuesIn(AllSupportedTlsVersions()), ::testing::PrintToStringParamName()); +TEST_P(TransportParametersTest, CopyConstructor) { + TransportParameters orig_params; + orig_params.perspective = Perspective::IS_SERVER; + orig_params.version = kFakeVersionLabel; + orig_params.supported_versions.push_back(kFakeVersionLabel); + orig_params.supported_versions.push_back(kFakeVersionLabel2); + orig_params.original_connection_id = CreateFakeOriginalConnectionId(); + orig_params.idle_timeout_milliseconds.set_value(kFakeIdleTimeoutMilliseconds); + orig_params.stateless_reset_token = CreateFakeStatelessResetToken(); + orig_params.max_packet_size.set_value(kFakeMaxPacketSize); + orig_params.initial_max_data.set_value(kFakeInitialMaxData); + orig_params.initial_max_stream_data_bidi_local.set_value( + kFakeInitialMaxStreamDataBidiLocal); + orig_params.initial_max_stream_data_bidi_remote.set_value( + kFakeInitialMaxStreamDataBidiRemote); + orig_params.initial_max_stream_data_uni.set_value( + kFakeInitialMaxStreamDataUni); + orig_params.initial_max_streams_bidi.set_value(kFakeInitialMaxStreamsBidi); + orig_params.initial_max_streams_uni.set_value(kFakeInitialMaxStreamsUni); + orig_params.ack_delay_exponent.set_value(kFakeAckDelayExponent); + orig_params.max_ack_delay.set_value(kFakeMaxAckDelay); + orig_params.disable_migration = kFakeDisableMigration; + orig_params.preferred_address = CreateFakePreferredAddress(); + orig_params.active_connection_id_limit.set_value( + kFakeActiveConnectionIdLimit); + orig_params.custom_parameters[kCustomParameter1] = kCustomParameter1Value; + orig_params.custom_parameters[kCustomParameter2] = kCustomParameter2Value; + + TransportParameters new_params(orig_params); + EXPECT_EQ(Perspective::IS_SERVER, new_params.perspective); + EXPECT_EQ(kFakeVersionLabel, new_params.version); + EXPECT_EQ(2u, new_params.supported_versions.size()); + EXPECT_EQ(kFakeVersionLabel, new_params.supported_versions[0]); + EXPECT_EQ(kFakeVersionLabel2, new_params.supported_versions[1]); + EXPECT_EQ(CreateFakeOriginalConnectionId(), + new_params.original_connection_id); + EXPECT_EQ(kFakeIdleTimeoutMilliseconds, + new_params.idle_timeout_milliseconds.value()); + EXPECT_EQ(CreateFakeStatelessResetToken(), new_params.stateless_reset_token); + EXPECT_EQ(kFakeMaxPacketSize, new_params.max_packet_size.value()); + EXPECT_EQ(kFakeInitialMaxData, new_params.initial_max_data.value()); + EXPECT_EQ(kFakeInitialMaxStreamDataBidiLocal, + new_params.initial_max_stream_data_bidi_local.value()); + EXPECT_EQ(kFakeInitialMaxStreamDataBidiRemote, + new_params.initial_max_stream_data_bidi_remote.value()); + EXPECT_EQ(kFakeInitialMaxStreamDataUni, + new_params.initial_max_stream_data_uni.value()); + EXPECT_EQ(kFakeInitialMaxStreamsBidi, + new_params.initial_max_streams_bidi.value()); + EXPECT_EQ(kFakeInitialMaxStreamsUni, + new_params.initial_max_streams_uni.value()); + EXPECT_EQ(kFakeAckDelayExponent, new_params.ack_delay_exponent.value()); + EXPECT_EQ(kFakeMaxAckDelay, new_params.max_ack_delay.value()); + EXPECT_EQ(kFakeDisableMigration, new_params.disable_migration); + ASSERT_NE(nullptr, new_params.preferred_address.get()); + EXPECT_EQ(CreateFakeV4SocketAddress(), + new_params.preferred_address->ipv4_socket_address); + EXPECT_EQ(CreateFakeV6SocketAddress(), + new_params.preferred_address->ipv6_socket_address); + EXPECT_EQ(CreateFakePreferredConnectionId(), + new_params.preferred_address->connection_id); + EXPECT_EQ(CreateFakePreferredStatelessResetToken(), + new_params.preferred_address->stateless_reset_token); + EXPECT_EQ(kFakeActiveConnectionIdLimit, + new_params.active_connection_id_limit.value()); + EXPECT_THAT( + new_params.custom_parameters, + UnorderedElementsAre(Pair(kCustomParameter1, kCustomParameter1Value), + Pair(kCustomParameter2, kCustomParameter2Value))); +} + TEST_P(TransportParametersTest, RoundTripClient) { TransportParameters orig_params; orig_params.perspective = Perspective::IS_CLIENT;