SocketPools: group_name to GroupId conversion part 4 (last part).

Make ClientSocketPool methods take GroupIds instead of string group
names, and remove implicit conversion from GroupId to std::string.

This is part of an effort to merge ClientSocketPool::SocketParams and
group names / GroupIds.

Bug: 533571
Change-Id: I8a4548b1ed55070fe55449e8eac36be9768481f6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1525991
Commit-Queue: Matt Menke <[email protected]>
Reviewed-by: David Benjamin <[email protected]>
Cr-Commit-Position: refs/heads/master@{#642042}
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index 0b175dc..6cb8fbdf 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -606,7 +606,7 @@
 
   ~TestClientSocketPool() override = default;
 
-  int RequestSocket(const std::string& group_name,
+  int RequestSocket(const GroupId& group_id,
                     const void* params,
                     RequestPriority priority,
                     const SocketTag& socket_tag,
@@ -618,35 +618,35 @@
     const scoped_refptr<TestSocketParams>* casted_socket_params =
         static_cast<const scoped_refptr<TestSocketParams>*>(params);
     return base_.RequestSocket(
-        group_name, *casted_socket_params, priority, socket_tag, respect_limits,
+        group_id, *casted_socket_params, priority, socket_tag, respect_limits,
         handle, std::move(callback), proxy_auth_callback, net_log);
   }
 
-  void RequestSockets(const std::string& group_name,
+  void RequestSockets(const GroupId& group_id,
                       const void* params,
                       int num_sockets,
                       const NetLogWithSource& net_log) override {
     const scoped_refptr<TestSocketParams>* casted_params =
         static_cast<const scoped_refptr<TestSocketParams>*>(params);
 
-    base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
+    base_.RequestSockets(group_id, *casted_params, num_sockets, net_log);
   }
 
-  void SetPriority(const std::string& group_name,
+  void SetPriority(const GroupId& group_id,
                    ClientSocketHandle* handle,
                    RequestPriority priority) override {
-    base_.SetPriority(group_name, handle, priority);
+    base_.SetPriority(group_id, handle, priority);
   }
 
-  void CancelRequest(const std::string& group_name,
+  void CancelRequest(const GroupId& group_id,
                      ClientSocketHandle* handle) override {
-    base_.CancelRequest(group_name, handle);
+    base_.CancelRequest(group_id, handle);
   }
 
-  void ReleaseSocket(const std::string& group_name,
+  void ReleaseSocket(const GroupId& group_id,
                      std::unique_ptr<StreamSocket> socket,
                      int id) override {
-    base_.ReleaseSocket(group_name, std::move(socket), id);
+    base_.ReleaseSocket(group_id, std::move(socket), id);
   }
 
   void FlushWithError(int error) override { base_.FlushWithError(error); }
@@ -655,19 +655,19 @@
 
   void CloseIdleSockets() override { base_.CloseIdleSockets(); }
 
-  void CloseIdleSocketsInGroup(const std::string& group_name) override {
-    base_.CloseIdleSocketsInGroup(group_name);
+  void CloseIdleSocketsInGroup(const GroupId& group_id) override {
+    base_.CloseIdleSocketsInGroup(group_id);
   }
 
   int IdleSocketCount() const override { return base_.idle_socket_count(); }
 
-  size_t IdleSocketCountInGroup(const std::string& group_name) const override {
-    return base_.IdleSocketCountInGroup(group_name);
+  size_t IdleSocketCountInGroup(const GroupId& group_id) const override {
+    return base_.IdleSocketCountInGroup(group_id);
   }
 
-  LoadState GetLoadState(const std::string& group_name,
+  LoadState GetLoadState(const GroupId& group_id,
                          const ClientSocketHandle* handle) const override {
-    return base_.GetLoadState(group_name, handle);
+    return base_.GetLoadState(group_id, handle);
   }
 
   void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
@@ -686,31 +686,30 @@
 
   const TestClientSocketPoolBase* base() const { return &base_; }
 
-  size_t NumNeverAssignedConnectJobsInGroup(
-      const std::string& group_name) const {
-    return base_.NumNeverAssignedConnectJobsInGroup(group_name);
+  size_t NumNeverAssignedConnectJobsInGroup(const GroupId& group_id) const {
+    return base_.NumNeverAssignedConnectJobsInGroup(group_id);
   }
 
-  size_t NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
-    return base_.NumUnassignedConnectJobsInGroup(group_name);
+  size_t NumUnassignedConnectJobsInGroup(const GroupId& group_id) const {
+    return base_.NumUnassignedConnectJobsInGroup(group_id);
   }
 
-  size_t NumConnectJobsInGroup(const std::string& group_name) const {
-    return base_.NumConnectJobsInGroup(group_name);
+  size_t NumConnectJobsInGroup(const GroupId& group_id) const {
+    return base_.NumConnectJobsInGroup(group_id);
   }
 
-  int NumActiveSocketsInGroup(const std::string& group_name) const {
-    return base_.NumActiveSocketsInGroup(group_name);
+  int NumActiveSocketsInGroup(const GroupId& group_id) const {
+    return base_.NumActiveSocketsInGroup(group_id);
   }
 
   bool RequestInGroupWithHandleHasJobForTesting(
-      const std::string& group_name,
+      const GroupId& group_id,
       const ClientSocketHandle* handle) const {
-    return base_.RequestInGroupWithHandleHasJobForTesting(group_name, handle);
+    return base_.RequestInGroupWithHandleHasJobForTesting(group_id, handle);
   }
 
-  bool HasGroup(const std::string& group_name) const {
-    return base_.HasGroup(group_name);
+  bool HasGroup(const GroupId& group_id) const {
+    return base_.HasGroup(group_id);
   }
 
   void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
@@ -900,6 +899,89 @@
   EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
 }
 
+// Make sure different groups do not share sockets.
+TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
+  CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
+
+  const HostPortPair kHostPortPairs[] = {
+      {"a", 80},
+      {"a", 443},
+      {"b", 80},
+  };
+
+  const ClientSocketPool::SocketType kSocketTypes[] = {
+      ClientSocketPool::SocketType::kHttp,
+      ClientSocketPool::SocketType::kSsl,
+      ClientSocketPool::SocketType::kSslVersionInterferenceProbe,
+      ClientSocketPool::SocketType::kFtp,
+  };
+
+  const bool kPrivacyModes[] = {false, true};
+
+  int total_idle_sockets = 0;
+
+  // Walk through each GroupId, making sure that requesting a socket for one
+  // group does not return a previously connected socket for another group.
+  for (const auto& host_port_pair : kHostPortPairs) {
+    SCOPED_TRACE(host_port_pair.ToString());
+    for (const auto& socket_type : kSocketTypes) {
+      SCOPED_TRACE(static_cast<int>(socket_type));
+      for (const auto& privacy_mode : kPrivacyModes) {
+        SCOPED_TRACE(privacy_mode);
+
+        connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
+
+        ClientSocketPool::GroupId group_id(host_port_pair, socket_type,
+                                           privacy_mode);
+
+        EXPECT_FALSE(pool_->HasGroup(group_id));
+
+        TestCompletionCallback callback;
+        ClientSocketHandle handle;
+
+        // Since the group is empty, requesting a socket should not complete
+        // synchronously.
+        EXPECT_THAT(
+            handle.Init(group_id, params_, DEFAULT_PRIORITY, SocketTag(),
+                        ClientSocketPool::RespectLimits::ENABLED,
+                        callback.callback(),
+                        ClientSocketPool::ProxyAuthCallback(), pool_.get(),
+                        NetLogWithSource()),
+            IsError(ERR_IO_PENDING));
+        EXPECT_TRUE(pool_->HasGroup(group_id));
+        EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
+
+        EXPECT_THAT(callback.WaitForResult(), IsOk());
+        EXPECT_TRUE(handle.socket());
+        EXPECT_TRUE(pool_->HasGroup(group_id));
+        EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
+
+        // Return socket to pool.
+        handle.Reset();
+        EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
+
+        // Requesting a socket again should return the same socket as before, so
+        // should complete synchronously.
+        EXPECT_THAT(
+            handle.Init(group_id, params_, DEFAULT_PRIORITY, SocketTag(),
+                        ClientSocketPool::RespectLimits::ENABLED,
+                        callback.callback(),
+                        ClientSocketPool::ProxyAuthCallback(), pool_.get(),
+                        NetLogWithSource()),
+            IsOk());
+        EXPECT_TRUE(handle.socket());
+        EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
+
+        // Return socket to pool again.
+        handle.Reset();
+        EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
+
+        ++total_idle_sockets;
+      }
+    }
+  }
+}
+
 TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
   CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
 
@@ -3780,7 +3862,7 @@
   CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
   connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
 
-  // Note that group name ordering matters here.  "a" comes before "b", so
+  // Note that group id ordering matters here.  "a" comes before "b", so
   // CloseOneIdleSocket() will try to close "a"'s idle socket.
 
   // Set up one idle socket in "a".