Automated g4 rollback of changelist 471573005. *** Reason for rollback *** After trying out a few approaches, I think it's better for the QUIC-LB connection ID generator to be just a direct addition to LoadBalancerEncoder. Thus, there is no need for mocking, and consequently, this change. *** Original change description *** Change LoadBalancerEncoder::Create to return unique_ptr. More convenient in light of changes to who owns instances of LoadBalancerEncoder *** PiperOrigin-RevId: 472454846
diff --git a/quiche/quic/load_balancer/load_balancer_encoder.cc b/quiche/quic/load_balancer/load_balancer_encoder.cc index 5b0a613..bb9608b 100644 --- a/quiche/quic/load_balancer/load_balancer_encoder.cc +++ b/quiche/quic/load_balancer/load_balancer_encoder.cc
@@ -47,7 +47,7 @@ constexpr uint8_t kLoadBalancerLengthMask = 0x3f; constexpr uint8_t kLoadBalancerUnroutableConfigId = 0xc0; -std::unique_ptr<LoadBalancerEncoder> LoadBalancerEncoder::Create( +absl::optional<LoadBalancerEncoder> LoadBalancerEncoder::Create( QuicRandom &random, LoadBalancerEncoderVisitorInterface *const visitor, const bool len_self_encoded, const uint8_t unroutable_connection_id_len) { if (unroutable_connection_id_len == 0 || @@ -56,10 +56,10 @@ QUIC_BUG(quic_bug_435375038_01) << "Invalid unroutable_connection_id_len = " << static_cast<int>(unroutable_connection_id_len); - return nullptr; + return absl::optional<LoadBalancerEncoder>(); } - return absl::WrapUnique(new LoadBalancerEncoder( - random, visitor, len_self_encoded, unroutable_connection_id_len)); + return LoadBalancerEncoder(random, visitor, len_self_encoded, + unroutable_connection_id_len); } bool LoadBalancerEncoder::UpdateConfig(const LoadBalancerConfig &config,
diff --git a/quiche/quic/load_balancer/load_balancer_encoder.h b/quiche/quic/load_balancer/load_balancer_encoder.h index 1405d62..b48bb19 100644 --- a/quiche/quic/load_balancer/load_balancer_encoder.h +++ b/quiche/quic/load_balancer/load_balancer_encoder.h
@@ -60,7 +60,7 @@ // random. |unroutable_connection_id_length| specifies the length of // connection IDs to be generated when there is no active config. It must not // be 0 and must not be larger than the RFC9000 maximum of 20. - static std::unique_ptr<LoadBalancerEncoder> Create( + static absl::optional<LoadBalancerEncoder> Create( QuicRandom& random, LoadBalancerEncoderVisitorInterface* const visitor, const bool len_self_encoded, const uint8_t unroutable_connection_id_len = kLoadBalancerUnroutableLen);
diff --git a/quiche/quic/load_balancer/load_balancer_encoder_test.cc b/quiche/quic/load_balancer/load_balancer_encoder_test.cc index 0ea7aa0..f1df860 100644 --- a/quiche/quic/load_balancer/load_balancer_encoder_test.cc +++ b/quiche/quic/load_balancer/load_balancer_encoder_test.cc
@@ -119,18 +119,18 @@ TEST_F(LoadBalancerEncoderTest, BadUnroutableLength) { EXPECT_QUIC_BUG( - EXPECT_EQ(LoadBalancerEncoder::Create(random_, nullptr, false, 0), - nullptr), + EXPECT_FALSE( + LoadBalancerEncoder::Create(random_, nullptr, false, 0).has_value()), "Invalid unroutable_connection_id_len = 0"); EXPECT_QUIC_BUG( - EXPECT_EQ(LoadBalancerEncoder::Create(random_, nullptr, false, 21), - nullptr), + EXPECT_FALSE( + LoadBalancerEncoder::Create(random_, nullptr, false, 21).has_value()), "Invalid unroutable_connection_id_len = 21"); } TEST_F(LoadBalancerEncoderTest, BadServerIdLength) { auto encoder = LoadBalancerEncoder::Create(random_, nullptr, true); - EXPECT_NE(encoder, nullptr); + EXPECT_TRUE(encoder.has_value()); // Expects a 3 byte server ID and got 4. auto config = LoadBalancerConfig::CreateUnencrypted(1, 3, 4); EXPECT_TRUE(config.has_value()); @@ -143,7 +143,8 @@ TEST_F(LoadBalancerEncoderTest, FailToUpdateConfigWithSameId) { TestLoadBalancerEncoderVisitor visitor; auto encoder = LoadBalancerEncoder::Create(random_, &visitor, true); - EXPECT_NE(encoder, nullptr); + EXPECT_TRUE(encoder.has_value()); + EXPECT_TRUE(encoder.has_value()); auto config = LoadBalancerConfig::CreateUnencrypted(1, 3, 4); EXPECT_TRUE(config.has_value()); EXPECT_TRUE(encoder->UpdateConfig(*config, MakeServerId(kServerId, 3))); @@ -198,7 +199,7 @@ }; random_.AddNextValues(0, 0x75c2699c); auto encoder = LoadBalancerEncoder::Create(random_, nullptr, true, 8); - EXPECT_NE(encoder, nullptr); + EXPECT_TRUE(encoder.has_value()); auto config = LoadBalancerConfig::Create(config_id, server_id_len, nonce_len, absl::string_view(raw_key)); EXPECT_TRUE(config.has_value()); @@ -247,7 +248,7 @@ }; for (const auto &test : test_vectors) { auto encoder = LoadBalancerEncoder::Create(random_, nullptr, true, 8); - EXPECT_NE(encoder, nullptr); + EXPECT_TRUE(encoder.has_value()); random_.AddNextValues(kNonceHigh, kNonceLow); EXPECT_TRUE(encoder->UpdateConfig(test.config, test.server_id)); EXPECT_EQ(encoder->GenerateConnectionId(), test.connection_id); @@ -258,7 +259,7 @@ const uint8_t server_id_len = 3; TestLoadBalancerEncoderVisitor visitor; auto encoder = LoadBalancerEncoder::Create(random_, &visitor, true, 8); - EXPECT_NE(encoder, nullptr); + EXPECT_TRUE(encoder.has_value()); auto config = LoadBalancerConfig::Create(0, server_id_len, 4, kKey); EXPECT_TRUE(config.has_value()); EXPECT_TRUE( @@ -278,7 +279,7 @@ TEST_F(LoadBalancerEncoderTest, UnroutableConnectionId) { random_.AddNextValues(0x83, kNonceHigh); auto encoder = LoadBalancerEncoder::Create(random_, nullptr, false); - EXPECT_NE(encoder, nullptr); + EXPECT_TRUE(encoder.has_value()); EXPECT_EQ(encoder->num_nonces_left(), 0); auto connection_id = encoder->GenerateConnectionId(); // The first byte is the config_id (0xc0) xored with (0x83 & 0x3f). @@ -289,7 +290,7 @@ TEST_F(LoadBalancerEncoderTest, NonDefaultUnroutableConnectionIdLength) { auto encoder = LoadBalancerEncoder::Create(random_, nullptr, true, 9); - EXPECT_NE(encoder, nullptr); + EXPECT_TRUE(encoder.has_value()); QuicConnectionId connection_id = encoder->GenerateConnectionId(); EXPECT_EQ(connection_id.length(), 9); } @@ -297,7 +298,7 @@ TEST_F(LoadBalancerEncoderTest, DeleteConfigWhenNoConfigExists) { TestLoadBalancerEncoderVisitor visitor; auto encoder = LoadBalancerEncoder::Create(random_, &visitor, true); - EXPECT_NE(encoder, nullptr); + EXPECT_TRUE(encoder.has_value()); encoder->DeleteConfig(); EXPECT_EQ(visitor.num_deletes(), 0u); }