ConnectionIdGenerator that uses QUIC-LB or HASH_QUIC depending on config.

PiperOrigin-RevId: 473810279
diff --git a/quiche/quic/load_balancer/load_balancer_encoder.cc b/quiche/quic/load_balancer/load_balancer_encoder.cc
index 6cc8e0e..914b890 100644
--- a/quiche/quic/load_balancer/load_balancer_encoder.cc
+++ b/quiche/quic/load_balancer/load_balancer_encoder.cc
@@ -178,8 +178,9 @@
     const QuicConnectionId &original, const ParsedQuicVersion &version) {
   // Pre-IETF versions of QUIC can respond poorly to new connection IDs issued
   // during the handshake.
-  return (!version.HasIetfQuicFrames() &&
-          original.length() == CurrentConnectionIdLength())
+  uint8_t needed_length = config_.has_value() ? config_->total_len()
+                                              : unroutable_connection_id_len_;
+  return (!version.HasIetfQuicFrames() && original.length() == needed_length)
              ? absl::optional<QuicConnectionId>()
              : GenerateConnectionId();
 }
diff --git a/quiche/quic/load_balancer/load_balancer_encoder.h b/quiche/quic/load_balancer/load_balancer_encoder.h
index 589c347..7594262 100644
--- a/quiche/quic/load_balancer/load_balancer_encoder.h
+++ b/quiche/quic/load_balancer/load_balancer_encoder.h
@@ -84,12 +84,14 @@
   // the current config, or 0 if there is no current config.
   absl::uint128 num_nonces_left() const { return num_nonces_left_; }
 
+  // Functions below are declared virtual to enable mocking.
   // Returns true if there is an active configuration.
-  bool IsEncoding() const { return config_.has_value(); }
+  virtual bool IsEncoding() const { return config_.has_value(); }
   // Returns true if there is an active configuration that uses encryption.
-  bool IsEncrypted() const {
+  virtual bool IsEncrypted() const {
     return config_.has_value() && config_->IsEncrypted();
   }
+  virtual bool len_self_encoded() const { return len_self_encoded_; }
 
   // If there's an active config, generates a connection ID using it. If not,
   // generates an unroutable connection_id. If there's an error, returns a zero-
@@ -103,9 +105,7 @@
       const QuicConnectionId& original,
       const ParsedQuicVersion& version) override;
 
- private:
-  friend class test::LoadBalancerEncoderPeer;
-
+ protected:
   LoadBalancerEncoder(QuicRandom& random,
                       LoadBalancerEncoderVisitorInterface* const visitor,
                       const bool len_self_encoded,
@@ -115,11 +115,10 @@
         visitor_(visitor),
         unroutable_connection_id_len_(unroutable_connection_id_len) {}
 
-  QuicConnectionId MakeUnroutableConnectionId(uint8_t first_byte);
+ private:
+  friend class test::LoadBalancerEncoderPeer;
 
-  uint8_t CurrentConnectionIdLength() const {
-    return IsEncoding() ? config_->total_len() : unroutable_connection_id_len_;
-  }
+  QuicConnectionId MakeUnroutableConnectionId(uint8_t first_byte);
 
   QuicRandom& random_;
   const bool len_self_encoded_;