Do not attempt to reuse active sockets after a socket pool flush (usually a network change).
Implements this functionality by adding an |id_| field to ClientSocketPoolBaseHelper that is incremented on each Flush().
BUG=45872

Review URL: http://codereview.chromium.org/2647003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49076 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index a694a6f..4b10cdba 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -310,8 +310,13 @@
 
   virtual void ReleaseSocket(
       const std::string& group_name,
-      ClientSocket* socket) {
-    base_.ReleaseSocket(group_name, socket);
+      ClientSocket* socket,
+      int id) {
+    base_.ReleaseSocket(group_name, socket, id);
+  }
+
+  virtual void Flush() {
+    base_.Flush();
   }
 
   virtual void CloseIdleSockets() {
@@ -1660,6 +1665,30 @@
   callback.WaitForResult();
 }
 
+TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
+  CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
+  connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
+
+  ClientSocketHandle handle;
+  TestCompletionCallback callback;
+  EXPECT_EQ(ERR_IO_PENDING,
+            InitHandle(&handle, "a", kDefaultPriority,
+                       &callback, pool_, BoundNetLog()));
+  EXPECT_EQ(OK, callback.WaitForResult());
+  EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
+
+  pool_->Flush();
+
+  handle.Reset();
+  MessageLoop::current()->RunAllPending();
+
+  EXPECT_EQ(ERR_IO_PENDING,
+            InitHandle(&handle, "a", kDefaultPriority,
+                       &callback, pool_, BoundNetLog()));
+  EXPECT_EQ(OK, callback.WaitForResult());
+  EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
+}
+
 }  // namespace
 
 }  // namespace net